PageSourceSearch

https://iap2p.vercel.app/

html iap2p.vercel.app collected 2026-10-03 07:05:55 UTC 4,000,000 bytes, 2,903 lines download raw bytes

1
2<!doctype html>
3<!-- The following comment is called a MOTW comment and is necessary for the TiddlyIE Internet Explorer extension -->
4<!-- saved from url=(0021)https://tiddlywiki.com -->
5<html lang="fr-FR">
6<head>
7<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
8<!--~~ Raw markup for the top of the head section ~~-->
9
10<meta http-equiv="X-UA-Compatible" content="IE=Edge"/>
11<meta name="application-name" content="TiddlyWiki" />
12<meta name="generator" content="TiddlyWiki" />
13<meta name="tiddlywiki-version" content="5.3.1" />
14<meta name="viewport" content="width=device-width, initial-scale=1.0" />
15<meta name="apple-mobile-web-app-capable" content="yes" />
16<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
17<meta name="mobile-web-app-capable" content="yes"/>
18<meta name="format-detection" content="telephone=no" />
19<meta name="copyright" content="TiddlyWiki created by Jeremy Ruston, (jeremy [at] jermolene [dot] com)
20
21Copyright (c) 2004-2007, Jeremy Ruston
22Copyright (c) 2007-2023, UnaMesa Association
23All rights reserved.
24
25Redistribution and use in source and binary forms, with or without
26modification, are permitted provided that the following conditions are met:
27
28* Redistributions of source code must retain the above copyright notice, this
29  list of conditions and the following disclaimer.
30
31* Redistributions in binary form must reproduce the above copyright notice,
32  this list of conditions and the following disclaimer in the documentation
33  and/or other materials provided with the distribution.
34
35* Neither the name of the copyright holder nor the names of its
36  contributors may be used to endorse or promote products derived from
37  this software without specific prior written permission.
38
39THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'
40AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
41IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
42DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
43FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
44DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
45SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
46CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
47OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
48OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." />
49<link id="faviconLink" rel="shortcut icon" href="favicon.ico">
50<title>  Partageons l'IA   — Glossaire - Base de connaissances sur l'IA pour le dialogue social</title>
51<!--~~ This is a Tiddlywiki file. The points of interest in the file are marked with this pattern ~~-->
52
53<!--~~ Raw markup ~~-->
54
55<meta name="description" content="Base de connaissance sur l'intelligence  artificielle pour le dialogue social">
56
57<meta charset="UTF-8">
58<link rel="schema.DC" href="http://purl.org/dc/elements/1.1/">
59<meta name="DC.description" content="Base de connaissance sur l'intelligence artficielle pour le dialogue social">
60<meta name="DC.title" content="DIALIA">
61<meta property="og:url" content="https://iap2p.vercel.app/">
62<meta property="og:title" content="DIALIA">
63
64</head>
65<body class="tc-body">
66<!--~~ Raw markup for the top of the body section ~~-->
67<div class="tc-remove-when-wiki-loaded">
68<style scoped>.tc-splash-title,
69.tc-splash-subtitle,
70.tc-splash-text {
71    font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
72    font-size: 16px;
73    text-rendering: optimizeLegibility;
74    -webkit-font-smoothing: antialiased;
75    margin: 20px auto 0;
76    text-align: center;
77    padding: 4px 2px;
78    color: #3F3B3B;
79    fill: #3F3B3B;
80}.tc-splash-title {
81    font-size: 38px;
82    margin: 20px auto 0;
83    border-bottom: 1px solid #dddddd;
84}.tc-splash-subtitle {
85    font-size: 18px;
86    margin: 5px auto 0;
87}.tc-splash-text {
88    width: 200px;
89}.tc-splash-text img {
90    width: 150px;
91    
92  -webkit-box-shadow: 2px 2px 10px rgba(0, 0, 0, 0.5);
93     -moz-box-shadow: 2px 2px 10px rgba(0, 0, 0, 0.5);
94          box-shadow: 2px 2px 10px rgba(0, 0, 0, 0.5);
95
96}html body.tc-body {
97    background: #d7d8d6;
98}.line-wrapper {
99    width: 100%;
100    height: 35vh;
101    display: flex;
102    flex-direction: column;
103    justifyfont-smoothing: antialiased;
104    margin: 20px auto 0;
105    text-align: center;
106    color: #0075c6;
107    fill-content: center;
108    align-items: center;
109}/* sk-circle */.sk-circle {
110  margin: 25px auto;
111  width: 40px;
112  height: 40px;
113  position: relative;
114}.sk-circle-dot {
115  width: 100%;
116  height: 100%;
117  position: absolute;
118  left: 0;
119  top: 0;
120}.sk-circle-dot:before {
121  content: '';
122  display: block;
123  margin: 0 auto;
124  width: 15%;
125  height: 15%;
126  background-color: #0075c6;
127  border-radius: 100%;
128  animation: sk-circle 1.2s infinite ease-in-out both; 
129}.sk-circle-dot:nth-child(1) { transform: rotate(30deg); }
130.sk-circle-dot:nth-child(2) { transform: rotate(60deg); }
131.sk-circle-dot:nth-child(3) { transform: rotate(90deg); }
132.sk-circle-dot:nth-child(4) { transform: rotate(120deg); }
133.sk-circle-dot:nth-child(5) { transform: rotate(150deg); }
134.sk-circle-dot:nth-child(6) { transform: rotate(180deg); }
135.sk-circle-dot:nth-child(7) { transform: rotate(210deg); }
136.sk-circle-dot:nth-child(8) { transform: rotate(240deg); }
137.sk-circle-dot:nth-child(9) { transform: rotate(270deg); }
138.sk-circle-dot:nth-child(10) { transform: rotate(300deg); }
139.sk-circle-dot:nth-child(11) { transform: rotate(330deg); }
140.sk-circle-dot:nth-child(1):before { animation-delay: -1.1s; }
141.sk-circle-dot:nth-child(2):before { animation-delay: -1s; }
142.sk-circle-dot:nth-child(3):before { animation-delay: -0.9s; }
143.sk-circle-dot:nth-child(4):before { animation-delay: -0.8s; }
144.sk-circle-dot:nth-child(5):before { animation-delay: -0.7s; }
145.sk-circle-dot:nth-child(6):before { animation-delay: -0.6s; }
146.sk-circle-dot:nth-child(7):before { animation-delay: -0.5s; }
147.sk-circle-dot:nth-child(8):before { animation-delay: -0.4s; }
148.sk-circle-dot:nth-child(9):before { animation-delay: -0.3s; }
149.sk-circle-dot:nth-child(10):before { animation-delay: -0.2s; }
150.sk-circle-dot:nth-child(11):before { animation-delay: -0.1s; }@keyframes sk-circle {
151  0%, 80%, 100% {
152    transform: scale(0); }
153  40% {
154    transform: scale(1); 
155  } 
156}
157</style><div class="line-wrapper">
158  <div class="tc-splash-title"></div>
159  <div class="tc-splash-title">  Partageons l'IA  </div>
160  <div class="tc-splash-subtitle">Glossaire - Base de connaissances sur l'IA pour le dialogue social</div>
161  <div class="sk-circle">
162    <div class="sk-circle-dot"></div>
163    <div class="sk-circle-dot"></div>
164    <div class="sk-circle-dot"></div>
165    <div class="sk-circle-dot"></div>
166    <div class="sk-circle-dot"></div>
167    <div class="sk-circle-dot"></div>
168    <div class="sk-circle-dot"></div>
169    <div class="sk-circle-dot"></div>
170    <div class="sk-circle-dot"></div>
171    <div class="sk-circle-dot"></div>
172    <div class="sk-circle-dot"></div>
173    <div class="sk-circle-dot"></div>
174  </div>
175</div></div>
176<!--~~ Static styles ~~-->
177<div id="styleArea">
178<style data-tiddler-title="$:/boot/boot.css" data-tiddler-type="text/css" type="text/css">/*
179Basic styles used before we boot up the parsing engine
180*/
181
182/*
183Error message and password prompt
184*/
185
186.tc-error-form {
187	font-family: sans-serif;
188	color: #fff;
189	z-index: 20000;
190	position: fixed;
191	background-color: rgb(255, 75, 75);
192	border: 8px solid rgb(255, 0, 0);
193	border-radius: 8px;
194	width: 50%;
195	margin-left: 25%;
196	margin-top: 4em;
197	padding: 0 2em 1em 2em;
198}
199
200.tc-error-form h1 {
201	text-align: center;
202}
203
204.tc-error-prompt {
205	text-align: center;
206	color: #000;
207}
208
209.tc-error-message {
210	overflow: auto;
211	max-height: 40em;
212	padding-right: 1em;
213	margin: 1em 0;
214	white-space: pre-line;
215}
216
217.tc-password-wrapper {
218    font-family: sans-serif;
219	z-index: 20000;
220	position: fixed;
221	text-align: center;
222	width: 200px;
223	top: 4em;
224	left: 50%;
225	margin-left: -144px; /* - width/2 - paddingHorz/2 - border */
226	padding: 16px 16px 16px 16px;
227	border-radius: 8px;
228}
229
230.tc-password-wrapper {
231	color: #000;
232	text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
233	background-color: rgb(197, 235, 183);
234	border: 8px solid rgb(164, 197, 152);
235}
236
237.tc-password-wrapper form {
238	text-align: left;
239}
240
241.tc-password-wrapper h1 {
242	font-size: 16px;
243	line-height: 20px;
244	padding-bottom: 16px;
245}
246
247.tc-password-wrapper input {
248	width: 100%;
249}
250</style>
251</div>
252<!--~~ Static content for Google and browsers without JavaScript ~~-->
253<noscript>
254<div id="splashArea">
255
256
257<p>This <a class="tc-tiddlylink-external" href="https://tiddlywiki.com" rel="noopener noreferrer" target="_blank">TiddlyWiki</a> contains the following tiddlers:</p><p><ul>
258
259<li>__A__ comme Apprentissage</li>
260
261<li>__Apprentissage__</li>
262
263<li>__B__ comme Big Data</li>
264
265<li>__Bigdata__</li>
266
267<li>__C__ comme Confiance en l'IA</li>
268
269<li>__Classification__</li>
270
271<li>__D__ comme Données personnelles (RGPD)</li>
272
273<li>__E__ comme enjeux Environnementaux de l'IA</li>
274
275<li>__G__ comme  GAFAM</li>
276
277<li>__I__ comme Intelligence Artificielle (IA)</li>
278
279<li>__Intelligence Artificielle__</li>
280
281<li>__J__ comme qualification Juridique</li>
282
283<li>__K__ comme Indicateurs de la performance (KPI)</li>
284
285<li>__L__ comme Llama : l'IA Générative</li>
286
287<li>__M__ comme Métiers de la conception des SI</li>
288
289<li>__N__ comme Numérique et inclusion</li>
290
291<li>__O__ comme Open Source</li>
292
293<li>__Open Source__</li>
294
295<li>__P__ comme Projet de Système d'Intelligence Artificielle (SIA)</li>
296
297<li>__Q__ comme Qualité de vie au travail (QVT)</li>
298
299<li>__S__ comme enjeux de Sécurité et de responsabilité</li>
300
301<li>__T__ comme Transparence</li>
302
303<li>
303__Transparence__</li>
304
305<li>__V__ comme Valeur ajoutée de l'IA</li>
306
307<li>__W__ comme Web</li>
308
309<li>__Z__ comme Zapping</li>
310
311<li>$:/.local/metadata</li>
312
313<li>$:/.tb/macros/script</li>
314
315<li>$:/AdvancedSearch</li>
316
317<li>$:/Cas pratique</li>
318
319<li>$:/code/apache2</li>
320
321<li>$:/code/boucle_ForEach</li>
322
323<li>$:/code/boucle_While</li>
324
325<li>$:/code/css</li>
326
327<li>$:/code/css/::before/::after</li>
328
329<li>$:/code/css/::marker</li>
330
331<li>$:/code/css/:focus</li>
332
333<li>$:/code/css/@media</li>
334
335<li>$:/code/css/after</li>
336
337<li>$:/code/css/background</li>
338
339<li>$:/code/css/border</li>
340
341<li>$:/code/css/display/flex</li>
342
343<li>$:/code/css/overflow</li>
344
345<li>$:/code/css/reset.css</li>
346
347<li>$:/code/css/scss/index.scss</li>
348
349<li>$:/code/css/spinner</li>
350
351<li>$:/code/css/sr-only</li>
352
353<li>$:/code/css/sr-only-focusable</li>
354
355<li>$:/code/css/transform</li>
356
357<li>$:/code/css/variables</li>
358
359<li>$:/code/css/visibility:hidden</li>
360
361<li>$:/code/docker</li>
362
363<li>$:/code/docker/compose</li>
364
365<li>$:/code/docker/compose/wordpress</li>
366
367<li>$:/code/docker/dockerfile</li>
368
369<li>$:/code/expression régulère</li>
370
371<li>$:/code/fonctions/anonymes</li>
372
373<li>$:/code/fonctions/callback</li>
374
375<li>$:/code/fonctions/methode</li>
376
377<li>$:/code/fonctions/pures</li>
378
379<li>$:/code/git</li>
380
381<li>$:/code/git/actions</li>
382
383<li>$:/code/git/script/SSH_Key</li>
384
385<li>$:/code/html</li>
386
387<li>$:/code/html/&lt;a&gt;</li>
388
389<li>$:/code/html/&lt;button&gt;</li>
390
391<li>$:/code/html/&lt;button&gt;/menu-burger</li>
392
393<li>$:/code/html/&lt;button&gt;/svg</li>
394
395<li>$:/code/html/&lt;dialog&gt;</li>
396
397<li>$:/code/html/&lt;div&gt;</li>
398
399<li>$:/code/html/&lt;form&gt;</li>
400
401<li>$:/code/html/&lt;img&gt;</li>
402
403<li>$:/code/html/balise/&lt;ul&gt;</li>
404
405<li>$:/code/html/balises_aria</li>
406
407<li>$:/code/html/blockquote</li>
408
409<li>$:/code/html/cite</li>
410
411<li>$:/code/html/font</li>
412
413<li>$:/code/html/font/googlefonts</li>
414
415<li>$:/code/html/form/&lt;input&gt;</li>
416
417<li>$:/code/html/form/&lt;select&gt;</li>
418
419<li>$:/code/html/form/input/radio</li>
420
421<li>$:/code/html/head/&lt;title&gt;</li>
422
423<li>$:/code/html/header</li>
424
425<li>$:/code/html/img/canvas</li>
426
427<li>$:/code/html/img/font-icon</li>
428
429<li>$:/code/html/img/svg</li>
430
431<li>$:/code/html/main/&lt;hx&gt;</li>
432
433<li>$:/code/html/main/&lt;li&gt;</li>
434
435<li>$:/code/html/media</li>
436
437<li>$:/code/html/nav</li>
438
439<li>$:/code/html/table</li>
440
441<li>$:/code/instructions_conditionnelles_itératives</li>
442
443<li>$:/code/js</li>
444
445<li>$:/code/js/array</li>
446
447<li>$:/code/js/array/filter</li>
448
449<li>$:/code/js/array/findIndex</li>
450
451<li>$:/code/js/array/indexOf</li>
452
453<li>$:/code/js/array/map</li>
454
455<li>$:/code/js/array/reduce</li>
456
457<li>$:/code/js/array/reduce/exo1</li>
458
459<li>$:/code/js/array/sort</li>
460
461<li>$:/code/js/BodyParser/HTTP</li>
462
463<li>$:/code/js/boucle_For</li>
464
465<li>$:/code/js/boucles</li>
466
467<li>$:/code/js/class</li>
468
469<li>$:/code/js/concat</li>
470
471<li>$:/code/js/conditions</li>
472
473<li>$:/code/js/conditions/ternaire</li>
474
475<li>$:/code/js/console</li>
476
477<li>$:/code/js/date</li>
478
479<li>$:/code/js/date/moment.js</li>
480
481<li>$:/code/js/defer</li>
482
483<li>$:/code/js/DOM</li>
484
485<li>$:/code/js/DOM/createElement</li>
486
487<li>$:/code/js/DOM/dataset</li>
488
489<li>$:/code/js/DOM/Event</li>
490
491<li>$:/code/js/DOM/express/window</li>
492
493<li>$:/code/js/DOM/getElementById</li>
494
495<li>$:/code/js/DOM/queryselector</li>
496
497<li>$:/code/js/DOM/queryselectorAll</li>
498
499<li>$:/code/js/DOM/window/innerWidth-innerHeight</li>
500
501<li>$:/code/js/DOM/window/localStorage</li>
502
503<li>$:/code/js/DOM/windows/location</li>
504
505<li>$:/code/js/DOMPurify.sanitize()</li>
506
507<li>$:/code/js/express/ejs/app/controller.js</li>
508
509<li>$:/code/js/express/ejs/app/router.js</li>
510
511<li>$:/code/js/express/methodes/HTTP</li>
512
513<li>$:/code/js/express/module/cors</li>
514
515<li>$:/code/js/express/query-string</li>
516
517<li>$:/code/js/express/template/ejs/index.js</li>
518
519<li>$:/code/js/fetch</li>
520
521<li>$:/code/js/fetch/AJAX</li>
522
523<li>$:/code/js/fonctions</li>
524
525<li>$:/code/js/Hashing</li>
526
527<li>$:/code/js/json</li>
528
529<li>$:/code/js/listes</li>
530
531<li>$:/code/js/module/@tensorflow/tfjs</li>
532
533<li>$:/code/js/module/axios</li>
534
535<li>$:/code/js/module/bcrypt</li>
536
537<li>$:/code/js/module/clsx/css</li>
538
539<li>$:/code/js/module/dotenv</li>
540
541<li>$:/code/js/module/ejs/express/template</li>
542
543<li>$:/code/js/module/express/express-session</li>
544
545<li>$:/code/js/module/express/template/ejs/app/views/view.ejs</li>
546
547<li>$:/code/js/module/express/template/handlebars</li>
548
549<li>$:/code/js/module/feather-icons</li>
550
551<li>$:/code/js/module/fs</li>
552
553<li>$:/code/js/module/http</li>
554
555<li>$:/code/js/module/import-export</li>
556
557<li>$:/code/js/module/jimp</li>
558
559<li>$:/code/js/module/json-server</li>
560
561<li>$:/code/js/module/jwt-decode</li>
562
563<li>$:/code/js/module/leaflet</li>
564
565<li>$:/code/js/module/ORM/mongoose</li>
566
567<li>$:/code/js/module/ORM/Sequelize</li>
568
569<li>$:/code/js/module/pg</li>
570
571<li>$:/code/js/module/react/JWT</li>
572
573<li>$:/code/js/module/slugify</li>
574
575<li>$:/code/js/module/storyBook</li>
576
577<li>
577$:/code/js/module/testing/jest</li>
578
579<li>$:/code/js/module/validator.js</li>
580
581<li>$:/code/js/module/zod</li>
582
583<li>$:/code/js/number</li>
584
585<li>$:/code/js/operateurs</li>
586
587<li>$:/code/js/payload</li>
588
589<li>$:/code/js/pg</li>
590
591<li>$:/code/js/pg/active_record</li>
592
593<li>$:/code/js/pug</li>
594
595<li>$:/code/js/pug/storyBook</li>
596
597<li>$:/code/js/react</li>
598
599<li>$:/code/js/react/A11y</li>
600
601<li>$:/code/js/react/components</li>
602
603<li>$:/code/js/react/components/exemples</li>
604
605<li>$:/code/js/react/components/JSX/exemple/map</li>
606
607<li>$:/code/js/react/components/JSX/expression</li>
608
609<li>$:/code/js/react/components/prop-types</li>
610
611<li>$:/code/js/react/exemple/src/components/App.js</li>
612
613<li>$:/code/js/react/exemple/src/components/main.js</li>
614
615<li>$:/code/js/react/exemple/src/index.js</li>
616
617<li>$:/code/js/react/hook/useEffect</li>
618
619<li>$:/code/js/react/hook/useRef</li>
620
621<li>$:/code/js/react/hook/useState</li>
622
623<li>$:/code/js/react/hook/useState/exemples</li>
624
625<li>$:/code/js/react/state</li>
626
627<li>$:/code/js/react/zustand</li>
628
629<li>$:/code/js/set</li>
630
631<li>$:/code/js/spread_operator</li>
632
633<li>$:/code/js/string</li>
634
635<li>$:/code/js/string/charAt</li>
636
637<li>$:/code/js/testing/vitest</li>
638
639<li>$:/code/js/variables</li>
640
641<li>$:/code/MCD</li>
642
643<li>$:/code/MCD/Cardinalités</li>
644
645<li>$:/code/MongoDB</li>
646
647<li>$:/code/mongodb/queries</li>
648
649<li>$:/code/node.js/mongodb/db.js</li>
650
651<li>$:/code/node.js/package.json</li>
652
653<li>$:/code/operateurs</li>
654
655<li>$:/code/php</li>
656
657<li>$:/code/php/boucles</li>
658
659<li>$:/code/php/classes</li>
660
661<li>$:/code/php/conditions</li>
662
663<li>$:/code/php/exception</li>
664
665<li>$:/code/php/fonctions</li>
666
667<li>$:/code/php/operations</li>
668
669<li>$:/code/php/string</li>
670
671<li>$:/code/php/tableaux</li>
672
673<li>$:/code/php/variables</li>
674
675<li>$:/code/php/wordpress/templates</li>
676
677<li>$:/code/postgreSQL</li>
678
679<li>$:/code/postgreSQL/administration</li>
680
681<li>$:/code/postgreSQL/DELETE</li>
682
683<li>$:/code/postgreSQL/INSERT INTO</li>
684
685<li>$:/code/postgreSQL/SELECT</li>
686
687<li>$:/code/postgreSQL/sql/CRUD</li>
688
689<li>$:/code/postgreSQL/sql/géolocalisation</li>
690
691<li>$:/code/postgreSQL/UPDATE</li>
692
693<li>$:/code/referencement/sitemap.xml</li>
694
695<li>$:/code/reveal/md</li>
696
697<li>$:/code/system/bash</li>
698
699<li>$:/code/system/bash/apt</li>
700
701<li>$:/code/system/bash/scp</li>
702
703<li>$:/code/system/bash/sftp</li>
704
705<li>$:/code/system/ssh</li>
706
707<li>$:/code/system/ssh/scp</li>
708
709<li>$:/code/system/windows</li>
710
711<li>$:/code/tw</li>
712
713<li>$:/code/tw/enable-js</li>
714
715<li>$:/code/tw/variable</li>
716
717<li>$:/code/VirtualHost</li>
718
719<li>$:/code/vscode/emmet</li>
720
721<li>$:/config/codemirror-6/autocompleteIcons</li>
722
723<li>$:/config/EditorTypeMappings/text/markdown</li>
724
725<li>$:/config/EditorTypeMappings/text/vnd.tiddlywiki</li>
726
727<li>$:/config/FieldEditorFilters/default</li>
728
729<li>$:/config/Manager/Filter</li>
730
731<li>$:/config/Manager/Show</li>
732
733<li>$:/config/Manager/Sort</li>
734
735<li>$:/config/Navigation/UpdateAddressBar</li>
736
737<li>$:/config/NewJournal/Title</li>
738
739<li>$:/config/NewTiddlerTemplate</li>
740
741<li>$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/home</li>
742
743<li>$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/more-page-actions</li>
744
745<li>$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-tiddler</li>
746
747<li>$:/config/PageControlButtons/Visibility/$:/plugins/Gk0Wk/drawio/new-drawio-diagram</li>
748
749<li>$:/config/PageControlButtons/Visibility/$:/plugins/kookma/shiraz/ui/Buttons/SwitchPalette</li>
750
751<li>$:/config/PageControlButtons/Visibility/$:/plugins/tiddlywiki/markdown/new-markdown-button</li>
752
753<li>$:/config/PageControlButtons/Visibility/$:/themes/nico/notebook/ui/Buttons/SwitchPalette</li>
754
755<li>$:/config/Plugins/Disabled/$:/plugins/tiddlywiki/xlsx-utils</li>
756
757<li>$:/config/RelinkOnRename</li>
758
759<li>$:/config/TextEditor/EditorHeight/Mode</li>
760
761<li>$:/config/TiddlyTools/TagCloud</li>
762
763<li>$:/config/TiddlyWiki-CPL/GitHub</li>
764
765<li>$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-bar</li>
766
767<li>$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/info</li>
768
769<li>$:/config/ViewToolbarButtons/Visibility/$:/plugins/Gk0Wk/drawio/new-drawio-diagram</li>
770
771<li>$:/ControlPanel</li>
772
773<li>$:/core</li>
774
775<li>$:/core/images/github</li>
776
777<li>$:/core/ui/Buttons/home</li>
778
779<li>$:/core/ui/DownloadFullWiki</li>
780
781<li>$:/core/ui/EditTemplate/fieldEditor/default</li>
782
783<li>$:/core/ui/PageTemplate/alerts</li>
784
785<li>$:/dates</li>
786
787<li>$:/DefaultTiddlers</li>
788
789<li>
789$:/dev/api/graphQL</li>
790
791<li>$:/dev/glossaire/cahier-des-charges</li>
792
793<li>$:/dev/glossaire/DCG</li>
794
795<li>$:/dev/glossaire/dialia/etat des lieux</li>
796
797<li>$:/dev/glossaire/evolutions</li>
798
799<li>$:/dev/glossaire/MVP</li>
800
801<li>$:/dev/glossaire/technologies</li>
802
803<li>$:/dev/glossaire/userStories</li>
804
805<li>$:/dev/site</li>
806
807<li>$:/dev/site/structure</li>
808
809<li>$:/diagram/API</li>
810
811<li>$:/diagram/balises_html</li>
812
813<li>$:/diagram/condition_imbriquee</li>
814
815<li>$:/diagram/css</li>
816
817<li>$:/diagram/glossaire/bandeau</li>
818
819<li>$:/diagram/glossaire/plan_du_site</li>
820
821<li>$:/diagram/glossaire/wireframe/accueil</li>
822
823<li>$:/diagram/glossaire/wireframe/definition</li>
824
825<li>$:/diagram/glossaire/zoning</li>
826
827<li>$:/diagram/js</li>
828
829<li>$:/diagram/js/API_web</li>
830
831<li>$:/diagram/js/react</li>
832
833<li>$:/diagram/MCD/exemple</li>
834
835<li>$:/diagram/MLD/exemple</li>
836
837<li>$:/diagram/MPD/exemple</li>
838
839<li>$:/diagram/referencement</li>
840
841<li>$:/diagram/site/wireframe</li>
842
843<li>$:/diagram/site/zoning</li>
844
845<li>$:/diagram/site2/plan_du_site</li>
846
847<li>$:/diagram/zoning</li>
848
849<li>$:/diagrammes/apprentissage</li>
850
851<li>$:/diagrammes/apprentissage_automatique</li>
852
853<li>$:/diagrammes/apprentissage_non_supervise</li>
854
855<li>$:/diagrammes/apprentissage_profond</li>
856
857<li>$:/diagrammes/apprentissage_renforcement_fig1</li>
858
859<li>$:/diagrammes/apprentissage_supervise</li>
860
861<li>$:/diagrammes/arbres_decision/fig1</li>
862
863<li>$:/diagrammes/arbres_decision/fig2</li>
864
865<li>$:/diagrammes/arbres_decision/fig3</li>
866
867<li>$:/diagrammes/arbres/fig1</li>
868
869<li>$:/diagrammes/intelligence_artificielle</li>
870
871<li>$:/diagrammes/reseau_neuronaux_artificiel_fig1</li>
872
873<li>$:/doc/Accessibilité</li>
874
875<li>$:/doc/ACSII</li>
876
877<li>$:/doc/algorithme</li>
878
879<li>$:/doc/apache2</li>
880
881<li>$:/doc/API/REST</li>
882
883<li>$:/doc/API/REST/Clients_API</li>
884
885<li>$:/doc/API/REST/CORS</li>
886
887<li>$:/doc/API/REST/CORS/Same-Origine Policy</li>
888
889<li>$:/doc/API/REST/services_gratuits</li>
890
891<li>$:/doc/bundler</li>
892
893<li>$:/doc/bundler/parcel</li>
894
895<li>$:/doc/bundler/parcel/plugins</li>
896
897<li>$:/doc/bundler/vite</li>
898
899<li>$:/doc/cdn</li>
900
901<li>$:/doc/CertBot</li>
902
903<li>$:/doc/collaborative_tools</li>
904
905<li>$:/doc/css/framework_CSS</li>
906
907<li>$:/doc/css/scss/sass</li>
908
909<li>$:/doc/design_patern/active_record</li>
910
911<li>$:/doc/design_pattern</li>
912
913<li>$:/doc/design_system</li>
914
915<li>$:/doc/developpement/lower_snake_case</li>
916
917<li>$:/doc/developpement/paradigme_de_programmation</li>
918
919<li>$:/doc/discord</li>
920
921<li>$:/doc/docBlock</li>
922
923<li>$:/doc/docker</li>
924
925<li>$:/doc/émoticônes</li>
926
927<li>$:/doc/express</li>
928
929<li>$:/doc/express-jsdoc-swagger</li>
930
931<li>$:/doc/Fcoder</li>
932
933<li>$:/doc/font</li>
934
935<li>$:/doc/Gdorks</li>
936
937<li>$:/doc/git</li>
938
939<li>$:/doc/google_search_console</li>
940
941<li>$:/doc/graph/arbre</li>
942
943<li>$:/doc/hebergement/alwaysdata</li>
944
945<li>$:/doc/hebergement/netify</li>
946
947<li>$:/doc/hebergement/vercel</li>
948
949<li>$:/doc/html/validité</li>
950
951<li>$:/doc/HTTP</li>
952
953<li>$:/doc/HTTP/AJAX</li>
954
955<li>$:/doc/HTTP/codes_erreurs</li>
956
957<li>$:/doc/icone</li>
958
959<li>$:/doc/img</li>
960
961<li>$:/doc/inkscape</li>
962
963<li>$:/doc/js/algorithmes</li>
964
965<li>$:/doc/js/algorithmes/string</li>
966
967<li>$:/doc/js/destructuring</li>
968
969<li>$:/doc/js/javascript</li>
970
971<li>$:/doc/js/module/zod</li>
972
973<li>$:/doc/json</li>
974
975<li>$:/doc/json/module/JWT</li>
976
977<li>$:/doc/logiciel/licence/ISC</li>
978
979<li>$:/doc/MCD</li>
980
981<li>$:/doc/MLD</li>
982
983<li>$:/doc/mocks</li>
984
985<li>$:/doc/module/animation/gsap</li>
986
987<li>$:/doc/module/jsdom</li>
988
989<li>$:/doc/module/pg-hstore</li>
990
991<li>$:/doc/MongoDB</li>
992
993<li>$:/doc/MongoDB/installation&amp;restoration</li>
994
995<li>$:/doc/MPD</li>
996
997<li>$:/doc/node.js</li>
998
999<li>$:/doc/node.js/NPM</li>
1000
1001<li>$:/doc/node.js/NVM</li>
1002
1003<li>$:/doc/node/pnpm</li>
1004
1005<li>$:/doc/node/yarn</li>
1006
1007<li>$:/doc/NVDA</li>
1008
1009<li>$:/doc/ocr/tesseract</li>
1010
1011<li>$:/doc/open data</li>
1012
1013<li>$:/doc/ORM</li>
1014
1015<li>$:/doc/OS</li>
1016
1017<li>$:/doc/PHP</li>
1018
1019<li>$:/doc/ports</li>
1020
1021<li>$:/doc/postgreSQL</li>
1022
1023<li>$:/doc/process/automatisation/pipedream</li>
1024
1025<li>$:/doc/prototypage/mockup</li>
1026
1027<li>$:/doc/prototypage/wireframe</li>
1028
1029<li>$:/doc/prototypage/zoning</li>
1030
1031<li>$:/doc/python/pip</li>
1032
1033<li>$:/doc/python/virtualenv</li>
1034
1035<li>$:/doc/react</li>
1036
1037<li>$:/doc/react/components</li>
1038
1039<li>$:/doc/react/framer-motion</li>
1040
1041<li>$:/doc/react/preact</li>
1042
1043<li>$:/doc/react/react-desktop</li>
1044
1045<li>$:/doc/react/react-dom</li>
1046
1047<li>$:/doc/react/react-helmet</li>
1048
1049<li>$:/doc/react/react-native</li>
1050
1051<li>$:/doc/react/rooter/react-router-dom</li>
1052
1053<li>$:/doc/Scala</li>
1054
1055<li>$:/doc/serveur_web/authentification</li>
1056
1057<li>$:/doc/serveur_web/session</li>
1058
1059<li>$:/doc/serveurs</li>
1060
1061<li>$:/doc/sql</li>
1062
1063<li>$:/doc/system/chocaletly</li>
1064
1065<li>$:/doc/system/curl</li>
1066
1067<li>$:/doc/system/linux</li>
1068
1069<li>$:/doc/system/powershell</li>
1070
1071<li>$:/doc/template/twig</li>
1072
1073<li>$:/doc/testing</li>
1074
1075<li>$:/doc/testing/AB testing</li>
1076
1077<li>$:/doc/testing/framework</li>
1078
1079<li>$:/doc/testing/Monkey Testing</li>
1080
1081<li>$:/doc/testing/TDD</li>
1082
1083<li>$:/doc/three.js</li>
1084
1085<li>$:/doc/tiddlywiki</li>
1086
1087<li>$:/doc/TRE</li>
1088
1089<li>$:/doc/VirtualHost</li>
1090
1091<li>$:/doc/vscode</li>
1092
1093<li>
1093$:/doc/web/faille/Ddos</li>
1094
1095<li>$:/doc/web/faille/SQL</li>
1096
1097<li>$:/doc/web/faille/XSS</li>
1098
1099<li>$:/doc/web/faille/XSS/BeEF</li>
1100
1101<li>$:/doc/wordpress</li>
1102
1103<li>$:/doc/WSL2</li>
1104
1105<li>$:/images/dahlia.svg</li>
1106
1107<li>$:/img/cese.png</li>
1108
1109<li>$:/img/ico/css-3.ico</li>
1110
1111<li>$:/img/ico/docker.svg</li>
1112
1113<li>$:/img/ico/font-awesome/icone</li>
1114
1115<li>$:/img/ico/git.svg</li>
1116
1117<li>$:/img/ico/html-5.ico</li>
1118
1119<li>$:/img/ico/IconTemplate</li>
1120
1121<li>$:/img/ico/js.ico</li>
1122
1123<li>$:/img/ico/php.svg</li>
1124
1125<li>$:/img/ico/PostgreSQL.svg</li>
1126
1127<li>$:/img/ico/python.svg</li>
1128
1129<li>$:/img/ico/react.svg</li>
1130
1131<li>$:/img/ico/tiddlyWiki.png</li>
1132
1133<li>$:/img/ico/vite.js.svg</li>
1134
1135<li>$:/img/ico/wordpress.svg</li>
1136
1137<li>$:/img/testing.png</li>
1138
1139<li>$:/Import</li>
1140
1141<li>$:/info/url/port</li>
1142
1143<li>$:/isEncrypted</li>
1144
1145<li>$:/language</li>
1146
1147<li>$:/language/Buttons/Home/Caption</li>
1148
1149<li>$:/language/Manager/Item/Icon</li>
1150
1151<li>$:/languages/fr-FR</li>
1152
1153<li>$:/layout</li>
1154
1155<li>$:/mindmad/html</li>
1156
1157<li>$:/Niveau Avancée</li>
1158
1159<li>$:/osint/Holehe</li>
1160
1161<li>$:/palette</li>
1162
1163<li>$:/plugins/ajh/tiddlyviewer</li>
1164
1165<li>$:/plugins/benwebber/semantic</li>
1166
1167<li>$:/plugins/benwebber/semantic/config/Tags/DublinCore</li>
1168
1169<li>$:/plugins/benwebber/semantic/metadata</li>
1170
1171<li>$:/plugins/cdaven/markdown-export</li>
1172
1173<li>$:/plugins/cdr/markdown-more</li>
1174
1175<li>$:/plugins/chanilino/viz</li>
1176
1177<li>$:/plugins/felixhayashi/topstoryview</li>
1178
1179<li>$:/plugins/flibbles/relink</li>
1180
1181<li>$:/plugins/Gk0Wk/CPL-Repo</li>
1182
1183<li>$:/plugins/Gk0Wk/CPL-Repo/config/popup-readme-at-startup</li>
1184
1185<li>$:/plugins/Gk0Wk/drawio</li>
1186
1187<li>$:/plugins/Gk0Wk/echarts</li>
1188
1189<li>$:/plugins/Gk0Wk/echarts/addons/TagCloud.js</li>
1190
1191<li>$:/plugins/Gk0Wk/echarts/addons/TagCloudTagView</li>
1192
1193<li>$:/plugins/Gk0Wk/echarts/Snippets/TheBrain</li>
1194
1195<li>$:/plugins/ihm/tidgraph</li>
1196
1197<li>$:/plugins/kixam/datepicker</li>
1198
1199<li>$:/plugins/kixam/moment</li>
1200
1201<li>$:/plugins/kookma/shiraz</li>
1202
1203<li>$:/plugins/kookma/timelines</li>
1204
1205<li>$:/plugins/nico/notebook-mobile</li>
1206
1207<li>$:/plugins/oeyoews/tiddlywiki-codemirror-6</li>
1208
1209<li>$:/plugins/TheDiveO/FontAwesome</li>
1210
1211<li>$:/plugins/tiddlywiki/hammerjs</li>
1212
1213<li>$:/plugins/tiddlywiki/highlight</li>
1214
1215<li>$:/plugins/tiddlywiki/jszip</li>
1216
1217<li>$:/plugins/tiddlywiki/markdown</li>
1218
1219<li>$:/plugins/wikilabs/bundler</li>
1220
1221<li>$:/plugins/xp/splashscreen</li>
1222
1223<li>$:/scripts</li>
1224
1225<li>$:/scripts/rename_tag</li>
1226
1227<li>$:/sigle</li>
1228
1229<li>$:/sigle/DWWM</li>
1230
1231<li>$:/sigle/REAC</li>
1232
1233<li>$:/SiteSubtitle</li>
1234
1235<li>$:/SiteTitle</li>
1236
1237<li>$:/SplashScreen</li>
1238
1239<li>$:/state-tl/ilam--677280054</li>
1240
1241<li>$:/state/add-plugin-info/$:/temp/ServerConnection/https://tiddly-gittly.github.io/TiddlyWiki-CPL/library/index.html/$:/temp/RemoteAssetInfo/https://tiddly-gittly.github.io/TiddlyWiki-CPL/library/index.html/$:/plugins/felixhayashi/tiddlymap</li>
1242
1243<li>$:/state/add-plugin-info/$:/temp/ServerConnection/https://tiddly-gittly.github.io/TiddlyWiki-CPL/library/index.html/$:/temp/RemoteAssetInfo/https://tiddly-gittly.github.io/TiddlyWiki-CPL/library/index.html/$:/plugins/kookma/timelines</li>
1244
1245<li>$:/state/add-plugin-info/$:/temp/ServerConnection/https://tiddly-gittly.github.io/TiddlyWiki-CPL/library/index.html/$:/temp/RemoteAssetInfo/https://tiddly-gittly.github.io/TiddlyWiki-CPL/library/index.html/$:/plugins/mabuqian/time-for-task</li>
1246
1247<li>$:/state/add-plugin-info/$:/temp/ServerConnection/https://tiddly-gittly.github.io/TiddlyWiki-CPL/library/index.html/$:/temp/RemoteAssetInfo/https://tiddly-gittly.github.io/TiddlyWiki-CPL/library/index.html/$:/plugins/mabuqian/time-prints</li>
1248
1249<li>$:/state/add-plugin-info/$:/temp/ServerConnection/https://tiddly-gittly.github.io/TiddlyWiki-CPL/library/index.html/$:/temp/RemoteAssetInfo/https://tiddly-gittly.github.io/TiddlyWiki-CPL/library/index.html/$:/plugins/malgam/version-control</li>
1250
1251<li>$:/state/add-plugin-info/$:/temp/ServerConnection/https://tiddly-gittly.github.io/TiddlyWiki-CPL/library/index.html/$:/temp/RemoteAssetInfo/https://tiddly-gittly.github.io/TiddlyWiki-CPL/library/index.html/$:/plugins/oeyoews/twm</li>
1252
1253<li>$:/state/add-plugin-info/$:/temp/ServerConnection/https://tiddly-gittly.github.io/TiddlyWiki-CPL/library/index.html/$:/temp/RemoteAssetInfo/https://tiddly-gittly.github.io/TiddlyWiki-CPL/library/index.html/$:/plugins/sukima/reveal-js</li>
1254
1255<li>$:/state/add-plugin-info/$:/temp/ServerConnection/https://tiddly-gittly.github.io/TiddlyWiki-CPL/library/index.html/$:/temp/RemoteAssetInfo/https://tiddly-gittly.github.io/TiddlyWiki-CPL/library/index.html/$:/plugins/xp/aggregation-gtd</li>
1256
1257<li>$:/state/add-plugin-info/$:/temp/ServerConnection/https://tiddlywiki.com/library/v5.3.1/index.html/$:/temp/RemoteAssetInfo/https://tiddlywiki.com/library/v5.3.1/index.html/$:/plugins/tiddlywiki/dynannotate</li>
1258
1259<li>$:/state/add-plugin-info/$:/temp/ServerConnection/https://tiddlywiki.com/library/v5.3.1/index.html/$:/temp/RemoteAssetInfo/https://tiddlywiki.com/library/v5.3.1/index.html/$:/plugins/tiddlywiki/highlight</li>
1260
1261<li>$:/state/add-plugin-info/$:/temp/ServerConnection/https://tiddlywiki.com/library/v5.3.1/index.html/$:/temp/RemoteAssetInfo/https://tiddlywiki.com/library/v5.3.1/index.html/$:/plugins/tiddlywiki/highlight-legacy</li>
1262
1263<li>$:/state/addplugins/tab-1342078386</li>
1264
1265<li>$:/state/advancedsearch/currentTab</li>
1266
1267<li>$:/state/codemirror-6/fullscreen/Draft of 'Développeur full stack'</li>
1268
1269<li>$:/state/codemirror-6/fullscreen/Draft of 'Edito'</li>
1270
1271<li>$:/state/dropdown/keyboardshortcut/new-tiddler--502179266</li>
1272
1273<li>$:/state/edit/references--37106624</li>
1274
1275<li>$:/state/edit/references--376102094</li>
1276
1277<li>$:/state/edit/references-657391766</li>
1278
1279<li>$:/state/editpreviewtype</li>
1280
1281<li>$:/state/folded/__A__ comme Apprentissage</li>
1282
1283<li>$:/state/folded/__D__ comme Données personnelles (RGPD)</li>
1284
1285<li>$:/state/folded/__I__ comme Intelligence Artificielle (IA)</li>
1286
1287<li>$:/state/folded/$:/AdvancedSearch</li>
1288
1289<li>$:/state/folded/$:/code/boucle_ForEach</li>
1290
1291<li>$:/state/folded/$:/code/js/module/express</li>
1292
1293<li>$:/state/folded/$:/diagram/glossaire/zoning</li>
1294
1295<li>$:/state/folded/$:/TagManager</li>
1296
1297<li>$:/state/folded/1950 - Test de Turing</li>
1298
1299<li>$:/state/folded/Accessibilité</li>
1300
1301<li>$:/state/folded/Apprentissage automatique</li>
1302
1303<li>$:/state/folded/Data Analyst</li>
1304
1305<li>$:/state/folded/Data Governance Act (DGA)</li>
1306
1307<li>$:/state/folded/date clés</li>
1308
1309<li>$:/state/folded/dates clés</li>
1310
1311<li>$:/state/folded/Enjeux Juridiques</li>
1312
1313<li>$:/state/folded/Fichiers logs</li>
1314
1315<li>$:/state/folded/Formation numérique</li>
1316
1317<li>$:/state/folded/Gestion Algorithmique</li>
1318
1319<li>$:/state/folded/Glossaire DIAL-IA</li>
1320
1321<li>$:/state/folded/Glossaire DIALIA</li>
1322
1323<li>$:/state/folded/L'intelligence artificielle</li>
1324
1325<li>$:/state/folded/MCO</li>
1326
1327<li>$:/state/folded/Méthodes statistiques et modélisation des données</li>
1328
1329<li>$:/state/folded/Modèle</li>
1330
1331<li>$:/state/folded/Nouveau tiddler 1</li>
1332
1333<li>$:/state/folded/Recommandation sur l'IA par le conseil de l'OCDE</li>
1334
1335<li>$:/state/GroupContactListTemplateAll</li>
1336
1337<li>$:/state/http-requests</li>
1338
1339<li>$:/state/notebook-sidebar</li>
1340
1341<li>$:/state/notebook-sidebar-section</li>
1342
1343<li>$:/state/oeyoews/codemirror6/status/save</li>
1344
1345<li>$:/state/plugin-info--1250684264-$:/plugins/tiddlywiki/hammerjs--1593871727</li>
1346
1347<li>$:/state/plugin-info--1417739048-$:/plugins/kookma/shiraz---468111051</li>
1348
1349<li>$:/state/plugin-info--617414312-$:/plugins/chanilino/viz---1660239600</li>
1350
1351<li>$:/state/plugin-info-1349755994-$:/plugins/ihm/tidgraph--1648264703</li>
1352
1353<li>$:/state/plugin-info-1755751706-$:/themes/nico/notebook---424238002</li>
1354
1355<li>$:/state/plugin-info-1867135918-$:/plugins/benwebber/semantic</li>
1356
1357<li>$:/state/plugin-info-1867135918-$:/plugins/benwebber/semantic---1703254022</li>
1358
1359<li>$:/state/plugin-info-1867135918-$:/plugins/felixhayashi/topstoryview</li>
1360
1361<li>$:/state/plugin-info-1867135918-$:/plugins/felixhayashi/topstoryview--166194246</li>
1362
1363<li>$:/state/plugin-info-1867135918-$:/plugins/Gk0Wk/mindmap-elixir</li>
1364
1365<li>$:/state/plugin-info-1867135918-$:/plugins/Gk0Wk/mindmap-elixir--855268280</li>
1366
1367<li>$:/state/plugin-info-1867135918-$:/plugins/kookma/shiraz</li>
1368
1369<li>$:/state/plugin-info-1867135918-$:/plugins/kookma/shiraz---1161869967</li>
1370
1371<li>$:/state/plugin-info-1867135918-$:/plugins/kookma/timelines</li>
1372
1373<li>$:/state/plugin-info-1867135918-$:/plugins/oeyoews/tiddlywiki-codemirror-6</li>
1374
1375<li>$:/state/plugin-info-1867135918-$:/plugins/oeyoews/tiddlywiki-codemirror-6---1407821459</li>
1376
1377<li>$:/state/plugin-info-1867135918-$:/plugins/tiddlywiki/highlight</li>
1378
1379<li>$:/state/plugin-info-1867135918-$:/plugins/tiddlywiki/highlight---1467839150</li>
1380
1381<li>$:/state/plugin-info-1867135918-$:/plugins/tiddlywiki/jszip</li>
1382
1383<li>$:/state/plugin-info-1867135918-$:/plugins/tiddlywiki/jszip--1164837710</li>
1384
1385<li>$:/state/plugin-info-1867135918-$:/plugins/tiddlywiki/xlsx-utils</li>
1386
1387<li>$:/state/plugin-info-1945200858-$:/plugins/ajh/tiddlyviewer--1358331235</li>
1388
1389<li>$:/state/plugin-info-2030122776-$:/plugins/oeyoews/tiddlywiki-codemirror-6---1853744903</li>
1390
1391<li>$:/state/plugin-info-27244570-$:/plugins/TheDiveO/FontAwesome--741492686</li>
1392
1393<li>$:/state/plugin-info-815981336-$:/plugins/xp/splashscreen--434491245</li>
1394
1395<li>$:/state/plugin-info-897282520-$:/plugins/cdr/markdown-more--1971290424</li>
1396
1397<li>$:/state/plugin-info-989607512-$:/plugins/Gk0Wk/echarts---1009179474</li>
1398
1399<li>$:/state/showeditpreview</li>
1400
1401<li>$:/state/ShowPaletteEditor</li>
1402
1403<li>$:/state/sidebar</li>
1404
1405<li>$:/state/tab--1024668742</li>
1406
1407<li>$:/state/tab--1042034806</li>
1408
1409<li>$:/state/tab--1305764582</li>
1410
1411<li>$:/state/tab--1334608938</li>
1412
1413<li>$:/state/tab--1498284803</li>
1414
1415<li>$:/state/tab--1545258252</li>
1416
1417<li>$:/state/tab--1854829616</li>
1418
1419<li>$:/state/tab--1963855381</li>
1420
1421<li>$:/state/tab--2070222136</li>
1422
1423<li>$:/state/tab--2112689675</li>
1424
1425<li>$:/state/tab--2122345342</li>
1426
1427<li>$:/state/tab--363310492</li>
1428
1429<li>$:/state/tab--639260661</li>
1430
1431<li>$:/state/tab--7999726</li>
1432
1433<li>$:/state/tab--86143343</li>
1434
1435<li>$:/state/tab--959111941</li>
1436
1437<li>$:/state/tab-1512082644</li>
1438
1439<li>$:/state/tab-1688658110</li>
1440
1441<li>$:/state/tab-1749438307</li>
1442
1443<li>$:/state/tab-1890499906</li>
1444
1445<li>$:/state/tab-2019562874</li>
1446
1447<li>$:/state/tab-2032880670</li>
1448
1449<li>$:/state/tab-453520357</li>
1450
1451<li>$:/state/tab/moresidebar-1850697562</li>
1452
1453<li>$:/state/tab/sidebar--595412856</li>
1454
1455<li>$:/state/tabs/controlpanel/toolbars-1345989671</li>
1456
1457<li>$:/state/tag-manager/Glossaire</li>
1458
1459<li>$:/state/tag-manager/Métier</li>
1460
1461<li>$:/state/toc/Apprentissage-Apprentissage automatique--1941749630</li>
1462
1463<li>$:/state/toc/Apprentissage-Apprentissage fédéré--1941749630</li>
1464
1465<li>$:/state/toc/Apprentissage-Apprentissage non supervisé--1941749630</li>
1466
1467<li>$:/state/toc/Apprentissage-Apprentissage profond--1941749630</li>
1468
1469<li>$:/state/toc/Inclusion Numérique-Accessibilité--858711838</li>
1470
1471<li>$:/state/toc/Inclusion Numérique-Open Source--858711838</li>
1472
1473<li>$:/state/toc/Intelligence Artificielle-Algorithme-898957974</li>
1474
1475<li>$:/state/toc/Métier-Acteur IA--118915650</li>
1476
1477<li>$:/state/toc/Métier-Administrateur/Intégrateur Big Data--118915650</li>
1478
1479<li>$:/state/toc/Métier-Administration des systemes et réseau--118915650</li>
1480
1481<li>$:/state/toc/Règlementation Nationale-QVT--1205831128</li>
1482
1483<li>$:/state/toc/RGPD-Transparence--1100461074</li>
1484
1485<li>$:/state/toc/RGPD-Transparence-962812666</li>
1486
1487<li>$:/state/toc/Web-Référencement--1052695270</li>
1488
1489<li>$:/state/tree/$:/dev/</li>
1490
1491<li>$:/state/tree/$:/dev/glossaire/</li>
1492
1493<li>$:/state/tree/$:/dev/glossaire/dialia/</li>
1494
1495<li>$:/status/RequireReloadDueToPluginChange</li>
1496
1497<li>$:/StoryList</li>
1498
1499<li>$:/styles/css/dialia</li>
1500
1501<li>$:/styles/ExternalCSS</li>
1502
1503<li>$:/styles/font/mublack.woff</li>
1504
1505<li>$:/styles/font/noto</li>
1506
1507<li>$:/table/type_apprentissage_non_supervise</li>
1508
1509<li>$:/table/type_apprentissage_renforcement</li>
1510
1511<li>$:/table/type_apprentissage_supervise</li>
1512
1513<li>$:/table/type_apprentissage_transfert</li>
1514
1515<li>$:/TagManager</li>
1516
1517<li>$:/tags/RawMarkup</li>
1518
1519<li>$:/template/list-search/link-and-tags</li>
1520
1521<li>$:/theme</li>
1522
1523<li>$:/themes/nico/notebook</li>
1524
1525<li>$:/themes/nico/notebook/palettes/palette-beige</li>
1526
1527<li>$:/themes/nico/notebook/palettes/palette-beige 1</li>
1528
1529<li>$:/themes/nico/notebook/settings/codefontfamily</li>
1530
1531<li>$:/themes/nico/notebook/settings/fontfamily</li>
1532
1533<li>$:/themes/nico/notebook/ui/Buttons/menu</li>
1534
1535<li>$:/themes/tiddlywiki/readonly</li>
1536
1537<li>$:/themes/tiddlywiki/snowwhite</li>
1538
1539<li>$:/themes/tiddlywiki/vanilla</li>
1540
1541<li>1940 - Architecture de Von Neumann</li>
1542
1543<li>1950 - Test de Turing</li>
1544
1545<li>1956 - Appartition du terme "Intelligence Artificielle"</li>
1546
1547<li>1957 - Premier programme d'apprentissage</li>
1548
1549<li>1958 - Perceptron</li>
1550
1551<li>1961 - Connexion à un ordinateur central en temps partagé (timesharing).</li>
1552
1553<li>1965 - Création d'un chatbot</li>
1554
1555<li>1968 - Diffusion de l'IA dans la culture populaire</li>
1556
1557<li>1969 - ARPANET</li>
1558
1559<li>1973 - Hiver de l'IA</li>
1560
1561<li>1974 - Création de la CNIL</li>
1562
1563<li>1974 - Publication des spécifications du protocole TCP</li>
1564
1565<li>1977  - Star Wars et la popularisation de l'IA</li>
1566
1567<li>1979 - Apparition de USENET</li>
1568
1569<li>1980 - Les sytèmes experts</li>
1570
1571<li>1984 - Conception de l'architecture de DNS</li>
1572
1573<li>
15731984 - Création de la Free Software Fondation</li>
1574
1575<li>1988 - Z39.50 devient la norme internationale</li>
1576
1577<li>1989 - Création de la licence GNU GPL</li>
1578
1579<li>1991 - Linus Torvals (Linux kernel)</li>
1580
1581<li>1991 - Linux Kernel</li>
1582
1583<li>1992 - Présentation du protocole MIME</li>
1584
1585<li>1997 - Victoire de "Deep blue" sur Kasparov</li>
1586
1587<li>1998 - Création de l'ICANN</li>
1588
1589<li>1999 - Lancement de HTTP 1.1 et du bluetooth</li>
1590
1591<li>2003 - Déploiement du Wifi</li>
1592
1593<li>AAP</li>
1594
1595<li>ABC</li>
1596
1597<li>Accessibilité</li>
1598
1599<li>Accord-cadre des partenaires sociaux européens sur le numérique</li>
1600
1601<li>ACL</li>
1602
1603<li>Acteur IA</li>
1604
1605<li>Acteurs de l IA</li>
1606
1607<li>Acteurs de transition et de formation professionnelle</li>
1608
1609<li>Administrateur/Intégrateur Big Data</li>
1610
1611<li>Administration des systemes et réseau</li>
1612
1613<li>Agile</li>
1614
1615<li>AI Impact Assessment</li>
1616
1617<li>AIA</li>
1618
1619<li>AIPD</li>
1620
1621<li>Algorithme</li>
1622
1623<li>Algorithme de descente de gradient</li>
1624
1625<li>Algorithmie - Structures algorithmiques</li>
1626
1627<li>Alignement (IA)</li>
1628
1629<li>ANACT</li>
1630
1631<li>Analyse d’impact relative à la protection des données (AIPD)</li>
1632
1633<li>ANSSI - Agence nationale de la sécurité des systèmes d'information</li>
1634
1635<li>API</li>
1636
1637<li>Apprentissage</li>
1638
1639<li>Apprentissage auto-supervisé</li>
1640
1641<li>Apprentissage automatique</li>
1642
1643<li>Apprentissage continu</li>
1644
1645<li>Apprentissage fédéré</li>
1646
1647<li>Apprentissage non supervisé</li>
1648
1649<li>Apprentissage par renforcement</li>
1650
1651<li>Apprentissage par transfert</li>
1652
1653<li>Apprentissage profond</li>
1654
1655<li>Apprentissage supervisé</li>
1656
1657<li>Arbres de décision</li>
1658
1659<li>Arbres et forêt</li>
1660
1661<li>ARCEP - Autorité de régulation des communications électroniques et des postes</li>
1662
1663<li>Architecte Big Data</li>
1664
1665<li>Arrêté du Ministre de l’Industrie du 22 décembre 1981 relatif à l’enrichissement du vocabulaire de l’informatique</li>
1666
1667<li>Artificiel</li>
1668
1669<li>Auditabilité des applications informatiques</li>
1670
1671<li>Auditeur accessibilité numérique - ergonomie</li>
1672
1673<li>Authentification</li>
1674
1675<li>Autonomie au travail</li>
1676
1677<li>Base de données</li>
1678
1679<li>BATX</li>
1680
1681<li>Biais algorithmiques</li>
1682
1683<li>Bibliothèques logicielles</li>
1684
1685<li>Big Picture IA</li>
1686
1687<li>Bigdata</li>
1688
1689<li>Bloctel</li>
1690
1691<li>Boosting</li>
1692
1693<li>Bug Bounty</li>
1694
1695<li>Business Analyst</li>
1696
1697<li>CAAS</li>
1698
1699<li>Cadre de confiance</li>
1700
1701<li>CAI - Comité sur l'intelligence artificielle</li>
1702
1703<li>CERT-FR</li>
1704
1705<li>CESE</li>
1706
1707<li>Charte Ethique du CEPEJ d'utilisation de l'IA - 2018</li>
1708
1709<li>Chatbot</li>
1710
1711<li>Chef de projet / chef de projet IA</li>
1712
1713<li>CI/CD</li>
1714
1715<li>Circulaire Balladur du 14 février 1994</li>
1716
1717<li>Classification</li>
1718
1719<li>Cloud computing</li>
1720
1721<li>Clustering</li>
1722
1723<li>CMS</li>
1724
1725<li>CNIL</li>
1726
1727<li>CNN</li>
1728
1729<li>Cohorte</li>
1730
1731<li>Commande systeme</li>
1732
1733<li>Commission de l’intelligence artificielle</li>
1734
1735<li>Common Crawl</li>
1736
1737<li>Confiance numérique</li>
1738
1739<li>Connaissances en matière d IA</li>
1740
1741<li>Conseil Economique Social et Environnemental (CESE)</li>
1742
1743<li>Consentement</li>
1744
1745<li>Consultant SEO - Rédacteur web SEO</li>
1746
1747<li>Convention cadre sur l intelligence artificielle</li>
1748
1749<li>Cookies et autres traceurs</li>
1750
1751<li>CPU</li>
1752
1753<li>CPU (Unité centrale de traitement)</li>
1754
1755<li>Crawling</li>
1756
1757<li>CRUD</li>
1758
1759<li>Cryptographie</li>
1760
1761<li>Crystal clear</li>
1762
1763<li>CSS</li>
1764
1765<li>CTA</li>
1766
1767<li>Cycle de vie d’un système d IA</li>
1768
1769<li>Data Act (DA)</li>
1770
1771<li>Data Analyst</li>
1772
1773<li>Data Augmentation</li>
1774
1775<li>Data Engineer / Ingénieur IA</li>
1776
1777<li>Data Governance Act (DGA)</li>
1778
1779<li>Data Management</li>
1780
1781<li>Data Scientist</li>
1782
1783<li>Datamining</li>
1784
1785<li>DCP</li>
1786
1787<li>Décret n° 2017-638 du 27 avril 2017</li>
1788
1789<li>Déduction</li>
1790
1791<li>Definition</li>
1792
1793<li>Délégué à la protection des données (DPO)</li>
1794
1795<li>Demandes abusives</li>
1796
1797<li>Dépots Git</li>
1798
1799<li>Déroulement d'une etude de datamining</li>
1800
1801<li>Désapprentissage machine</li>
1802
1803<li>Design pattern</li>
1804
1805<li>Développeur Big Data</li>
1806
1807<li>Développeur full stack</li>
1808
1809<li>DevOps - Consultant BigData</li>
1810
1811<li>Diagram</li>
1812
1813<li>DIALIA</li>
1814
1815<li>Didacticiels d'initiation à la programmation et à l'IA</li>
1816
1817<li>Digitalisation</li>
1818
1819<li>Direction interministérielle du numérique (DINUM)</li>
1820
1821<li>Directive Network and Information Security (NIS)</li>
1822
1823<li>Disqualification sociale des exclus du numérique</li>
1824
1825<li>DMA</li>
1826
1827<li>DOM</li>
1828
1829<li>Données</li>
1830
1831<li>Données de connexion et adresse IP</li>
1832
1833<li>Données personnelles (DCP)</li>
1834
1835<li>Données sensibles</li>
1836
1837<li>DPO</li>
1838
1839<li>Droit à l effacement</li>
1840
1841<li>Droit à la déconnexion</li>
1842
1843<li>Droit à la limitation du traitement</li>
1844
1845<li>Droit à la portabilité</li>
1846
1847<li>Droit au déréférencement</li>
1848
1849<li>Droit d accès</li>
1850
1851<li>Droit d information</li>
1852
1853<li>
1853Droit d opposition</li>
1854
1855<li>Droit d opposition à une décision individuelle automatisée</li>
1856
1857<li>Droit de rectification</li>
1858
1859<li>DSA</li>
1860
1861<li>E-réputation</li>
1862
1863<li>EAL</li>
1864
1865<li>Ecoconception</li>
1866
1867<li>EdB</li>
1868
1869<li>Edito</li>
1870
1871<li>Education au numérique et à l'IA</li>
1872
1873<li>Emploi automatisable</li>
1874
1875<li>Enjeux d'acceptation sociale de l'IA</li>
1876
1877<li>Enjeux Environnementaux</li>
1878
1879<li>Enjeux Ethiques</li>
1880
1881<li>Enjeux Ethiques de l'IA</li>
1882
1883<li>Enjeux Juridiques</li>
1884
1885<li>Epoch</li>
1886
1887<li>Equipe de développeurs</li>
1888
1889<li>ETUI - European Trade Union Institute</li>
1890
1891<li>Europe</li>
1892
1893<li>European Data Protection Board (EDPH)</li>
1894
1895<li>Evaluation Assurance Level (EAL)</li>
1896
1897<li>Évaluation des alternatives</li>
1898
1899<li>Evaluation des compétences dans le numérique</li>
1900
1901<li>Evaluer ses connaissances du RGPD</li>
1902
1903<li>Expert métier</li>
1904
1905<li>Explicabilité</li>
1906
1907<li>Extraction de caractéristiques (feature extraction)</li>
1908
1909<li>Extreme programming (XP)</li>
1910
1911<li>FAAS</li>
1912
1913<li>Fichier</li>
1914
1915<li>Fichiers logs</li>
1916
1917<li>Fine-tuning</li>
1918
1919<li>Fonction Lambda</li>
1920
1921<li>Fonctionnement d'un modèle d'apprentissage automatique supervisé</li>
1922
1923<li>Forêts d'arbres de décision</li>
1924
1925<li>Formation numérique</li>
1926
1927<li>Formulation du besoin</li>
1928
1929<li>Frameworks</li>
1930
1931<li>France</li>
1932
1933<li>France compétences</li>
1934
1935<li>GAFAM</li>
1936
1937<li>GAN</li>
1938
1939<li>Géolocalisation</li>
1940
1941<li>Gestion algorithmique</li>
1942
1943<li>Gestionnaire de contenu (CMS)</li>
1944
1945<li>Global Product Owner</li>
1946
1947<li>Glossaire</li>
1948
1949<li>Glossaire DIAL-IA</li>
1950
1951<li>GNU</li>
1952
1953<li>GPO</li>
1954
1955<li>GPU</li>
1956
1957<li>GPU (Unité de traitement graphique)</li>
1958
1959<li>Gradient</li>
1960
1961<li>Hallucination (IA)</li>
1962
1963<li>Hook</li>
1964
1965<li>HTML</li>
1966
1967<li>HTTP</li>
1968
1969<li>HTTPS</li>
1970
1971<li>https://dial-ia.fr</li>
1972
1973<li>IA faible</li>
1974
1975<li>IA forte</li>
1976
1977<li>IA générative</li>
1978
1979<li>IA mixte</li>
1980
1981<li>IA neuronale</li>
1982
1983<li>IA symbolique</li>
1984
1985<li>IaaS</li>
1986
1987<li>IaaS (infrastructure as a service)</li>
1988
1989<li>IAG</li>
1990
1991<li>Identité numérique</li>
1992
1993<li>IHM</li>
1994
1995<li>Impacts de l’intelligence artificielle sur le travail</li>
1996
1997<li>import.bundle</li>
1998
1999<li>Inclusion Numérique</li>
2000
2001<li>Indexation (Référencement web)</li>
2002
2003<li>Induction</li>
2004
2005<li>Information et données</li>
2006
2007<li>Infrastructure as Code (IaC)</li>
2008
2009<li>Ingénieur de test</li>
2010
2011<li>INTEFP</li>
2012
2013<li>Intégration Continue - Déploiement Continue</li>
2014
2015<li>Intégrité de l'information</li>
2016
2017<li>Intelligence</li>
2018
2019<li>Intelligence Artificielle</li>
2020
2021<li>Intelligence artificielle général (AGI)</li>
2022
2023<li>Intelligence artificielle générative (GenAI)</li>
2024
2025<li>Intelligence économique</li>
2026
2027<li>Interaction Homme-Machine</li>
2028
2029<li>Interface de programmation d’application (API)</li>
2030
2031<li>Interface utilisateur (UI)</li>
2032
2033<li>Internet corporation for assigned names and numbers (ICANN)</li>
2034
2035<li>Interpréter</li>
2036
2037<li>JAMstack</li>
2038
2039<li>JSDoc</li>
2040
2041<li>JSON vs XML</li>
2042
2043<li>Key Performance Indicateur (KPI ou ICP)</li>
2044
2045<li>KPI</li>
2046
2047<li>L'Atelier 5j5IA</li>
2048
2049<li>LDA</li>
2050
2051<li>Le serment d'Hippocrate du Datascientist</li>
2052
2053<li>Les communs numériques</li>
2054
2055<li>Les dates clés en matière d'informatique avancée</li>
2056
2057<li>Les définitions du glossaire</li>
2058
2059<li>Les enjeux de sécurité</li>
2060
2061<li>Les fonctions opérationnelles et les responsables métiers</li>
2062
2063<li>Les fournisseurs d’accès et d’hébergement web</li>
2064
2065<li>Les grandes plateformes numériques</li>
2066
2067<li>Les systemes experts</li>
2068
2069<li>Licéité</li>
2070
2071<li>Licence libre</li>
2072
2073<li>Licence ouverte</li>
2074
2075<li>Licences Creative Commons (CC)</li>
2076
2077<li>Linting</li>
2078
2079<li>Liste des définitions du glossaire DIAL-IA</li>
2080
2081<li>Liste des entrée thématique du glossaire DIAL-IA</li>
2082
2083<li>Liste des sigles et des abrévations</li>
2084
2085<li>LLM</li>
2086
2087<li>LOG</li>
2088
2089<li>Logiciel et application</li>
2090
2091<li>Logiciel Libre</li>
2092
2093<li>LOGS</li>
2094
2095<li>Loi Godfrain</li>
2096
2097<li>Loi Handicap</li>
2098
2099<li>Loi Informatique et Libertés (LIL)</li>
2100
2101<li>Loi pour la confiance dans l'économie numérique (LCEN)</li>
2102
2103<li>Loi pour une République numérique (2016)</li>
2104
2105<li>Maintien en condition opérationnelle (MCO)</li>
2106
2107<li>Maitrise des Risques</li>
2108
2109<li>Manifeste DIAL IA</li>
2110
2111<li>Manipulation de l'information et IA</li>
2112
2113<li>Mapping Objet-Relationnel (ORM)</li>
2114
2115<li>Massification des données disponibles sur la justice en Belgique</li>
2116
2117<li>MCO</li>
2118
2119<li>Mention légale sur un site web</li>
2120
2121<li>Métadonnées</li>
2122
2123<li>Méthodes agiles</li>
2124
2125<li>Méthodes statistiques et modélisation des données</li>
2126
2127<li>Méthodologie de conduite de projet IA</li>
2128
2129<li>Métier</li>
2130
2131<li>Microtravail</li>
2132
2133<li>Minimisation</li>
2134
2135<li>ML</li>
2136
2137<li>Modalité d'automatisation des processus robotiques</li>
2138
2139<li>Modèle</li>
2140
2141<li>Modèle de langage</li>
2142
2143<li>Modèle-Vue-Contrôleur (MVC)</li>
2144
2145<li>Modèles de régression</li>
2146
2147<li>Modérateur de contenu</li>
2148
2149<li>MOOC</li>
2150
2151<li>Moteur de recherche</li>
2152
2153<li>Moteur de recherche de personnes</li>
2154
2155<li>MVC</li>
2156
2157<li>MVMM</li>
2158
2159<li>MVP</li>
2160
2161<li>MVP ou Produit minimum viable</li>
2162
2163<li>New Diagram</li>
2164
2165<li>NLP</li>
2166
2167<li>NoSQL</li>
2168
2169<li>Nouveau tiddler</li>
2170
2171<li>Nouveau tiddler 1</li>
2172
2173<li>Observatoire de l'emploi et la formation au numérique en France</li>
2174
2175<li>OIV</li>
2176
2177<li>Open Data</li>
2178
2179<li>Open Source</li>
2180
2181<li>Open Source Initiative (OSI)</li>
2182
2183<li>Open Source Intelligence (OSINT)</li>
2184
2185<li>Open Worldwide Application Security Project (OWASP)</li>
2186
2187<li>OSI</li>
2188
2189<li>OSINT</li>
2190
2191<li>Outil de DIAG Matrice</li>
2192
2193<li>PaaS</li>
2194
2195<li>PaaS (platform as a service)</li>
2196
2197<li>PABX</li>
2198
2199<li>Page Rank</li>
2200
2201<li>Page ranking</li>
2202
2203<li>Paradigmes de la programmation informatique</li>
2204
2205<li>Parties prenantes</li>
2206
2207<li>Personne Physique</li>
2208
2209<li>Pile logicielle</li>
2210
2211<li>Pile matérielle</li>
2212
2213<li>Plan du site</li>
2214
2215<li>PO</li>
2216
2217<li>POC</li>
2218
2219<li>Pollution numérique</li>
2220
2221<li>POO</li>
2222
2223<li>Portails Open Data</li>
2224
2225<li>Précaution</li>
2226
2227<li>Presentation</li>
2228
2229<li>Process Mining</li>
2230
2231<li>Product Owner</li>
2232
2233<li>Profilage</li>
2234
2235<li>Projet SI</li>
2236
2237<li>Prompt</li>
2238
2239<li>Prompt engenieering</li>
2240
2241<li>Protocole de communication</li>
2242
2243<li>Prototypage</li>
2244
2245<li>Prototype</li>
2246
2247<li>Pseudo-code</li>
2248
2249<li>Pseudonymisation</li>
2250
2251<li>Qualité des données</li>
2252
2253<li>QVT</li>
2254
2255<li>RAG</li>
2256
2257<li>Rapport de référencement d'un site web</li>
2258
2259<li>Recettes logicielles</li>
2260
2261<li>Recherche sur Internet de Fuites d’Informations (RIFI)</li>
2262
2263<li>Recommandation de l UNESCO sur l Ethique de l IA</li>
2264
2265<li>Recommandation sur l'IA par le conseil de l'OCDE</li>
2266
2267<li>Recommandation sur la gouvernance de l’identité numérique</li>
2268
2269<li>Reconnaissance au travail</li>
2270
2271<li>Réduction de dimension</li>
2272
2273<li>Référencement</li>
2274
2275<li>Référencement SEO</li>
2276
2277<li>Référentiel de compétences dans le numérique</li>
2278
2279<li>Référentiel Général d'Amélioration de l'Accessibilité (RGAA)</li>
2280
2281<li>Référentiel général d'écoconception des services numériques (RGESN)</li>
2282
2283<li>Référentiel général de sécurité (RGS)</li>
2284
2285<li>
2285Registre d'impacts des outils d’IA</li>
2286
2287<li>Règlement "eIDAS"</li>
2288
2289<li>Règlement ePrivacy</li>
2290
2291<li>Règlement européen sur les services numériques (DSA)</li>
2292
2293<li>Règlement général sur la protection des données (RGPD)</li>
2294
2295<li>Règlement sur l’Intelligence Artificielle de l'UE - AI Act (AIA)</li>
2296
2297<li>Règlement sur les marchés numériques (DMA)</li>
2298
2299<li>Règlementation Européennes</li>
2300
2301<li>Réglementation Internationale</li>
2302
2303<li>Règlementation Nationale</li>
2304
2305<li>Règles pour l'accessibilité des contenus web (WCAG)</li>
2306
2307<li>Régression</li>
2308
2309<li>Regroupement</li>
2310
2311<li>Répertoire de gestion des carrières uniques (RGCU)</li>
2312
2313<li>Réseau d'ingénierie de la confidentialité sur Internet (IPEN)</li>
2314
2315<li>Réseau de neurones artificiels</li>
2316
2317<li>Responsable de la sécurité numérique (RSSI)</li>
2318
2319<li>Responsable de traitement</li>
2320
2321<li>Responsive Web Design</li>
2322
2323<li>REST</li>
2324
2325<li>RGAA</li>
2326
2327<li>RGESN</li>
2328
2329<li>RGPD</li>
2330
2331<li>RGS</li>
2332
2333<li>Richard Stallman</li>
2334
2335<li>Robotique intelligente</li>
2336
2337<li>Robustesse</li>
2338
2339<li>RSSI</li>
2340
2341<li>RWD</li>
2342
2343<li>SaaS</li>
2344
2345<li>SaaS (software as a service)</li>
2346
2347<li>Savoir-Faire</li>
2348
2349<li>Scalabilité</li>
2350
2351<li>Science des données</li>
2352
2353<li>SCRUM</li>
2354
2355<li>Scrum Master</li>
2356
2357<li>SEA</li>
2358
2359<li>SecNumacadémie</li>
2360
2361<li>Sécuriser et réguler l’espace numérique (SREN)</li>
2362
2363<li>Sécurité</li>
2364
2365<li>Sécurité des systèmes d’IA</li>
2366
2367<li>Sécurité des systèmes d’information</li>
2368
2369<li>SEO</li>
2370
2371<li>Services d'intermédiation de la donnée</li>
2372
2373<li>SGBD</li>
2374
2375<li>SIA</li>
2376
2377<li>SIS II (Système d’information Schengen II)</li>
2378
2379<li>Sous-traitant</li>
2380
2381<li>SPA</li>
2382
2383<li>SSR</li>
2384
2385<li>Stuxnet</li>
2386
2387<li>styles/font/mublack.woff</li>
2388
2389<li>Suite cryptographique</li>
2390
2391<li>Supercalculateur</li>
2392
2393<li>Surapprentissage</li>
2394
2395<li>Système d IA (SIA)</li>
2396
2397<li>Système d'exploitation</li>
2398
2399<li>Système de traitement automatisé de données (STAD).</li>
2400
2401<li>Systeme Expert</li>
2402
2403<li>Systeme temps réel</li>
2404
2405<li>Tâche automatisable</li>
2406
2407<li>TagCloud</li>
2408
2409<li>Tech Lead Big Data</li>
2410
2411<li>Techniques de référencement</li>
2412
2413<li>Terminaux (console)</li>
2414
2415<li>Tests de sécurité</li>
2416
2417<li>Théorie des graphes</li>
2418
2419<li>Training set (Ensemble d'entrainement)</li>
2420
2421<li>Traitement du langage naturel</li>
2422
2423<li>Transition Pro</li>
2424
2425<li>Transparence</li>
2426
2427<li>Types de données</li>
2428
2429<li>UCD</li>
2430
2431<li>UI</li>
2432
2433<li>UI Design</li>
2434
2435<li>USA PATRIOT Act</li>
2436
2437<li>Utilisabilité</li>
2438
2439<li>Utiliser une API</li>
2440
2441<li>UX</li>
2442
2443<li>UX - UI Designer</li>
2444
2445<li>Violation de sécurité</li>
2446
2447<li>VPS</li>
2448
2449<li>Web</li>
2450
2451<li>Web design</li>
2452
2453<li>Web Designer</li>
2454
2455<li>Wordpress</li>
2456
2457<li>X comme interdit</li>
2458
2459<li>XNU</li>
2460
2461</ul>
2462</p>
2463
2464
2465
2466<style>
2467.tc-remove-when-wiki-loaded {display: none;}
2468</style>
2469
2470</div>
2471</noscript>
2472<!--~~ Ordinary tiddlers ~~-->
2473<script class="tiddlywiki-tiddler-store" type="application/json">[
2474{"created":"20240319110729755","text":"Les définitions pour cette entrée thématique renvoient aux \u003Cb>théories de l'apprentissage \u003C/b> et au \u003Cb> machine learning \u003C/b> (ML) :\n\n\u003Cu>\u003Ch3> L'apprentissage automatique, qu'est-ce que c'est ? \u003C/h3> \u003C/u>\n\n\n\n\u003Cfieldset style=\"font-family: 'MuBlack', serif; \">\n\n> \u003Cdiv class=\"tc-table-of-contents\"> \u003C\u003Ctoc \"Apprentissage\" \"sort[title]\" exclude=\"has[tag[Modèle]]has[tag[$:/dates]]\" >> \u003C/div>\n\n\u003C/fieldset>\n\n{{__Apprentissage__}}\n\n---\n\n{{Algorithme}}\n\n---\n\n{{Big Picture IA}}\n\n\nAdapté d'une présentation de [[Benoît DAL FERRO|https://www.semanticscholar.org/author/Beno%C3%AEt-Dal-Ferro/101553845]] pour DIAL-IA\n\n\u003Cfieldset style=\"font-family: 'MuBlack', serif; \">\n\n\u003C$tidgraph start=\"Apprentissage\" nodetemplate=\"IconTemplate\"/>\n\n\u003C/fieldset>","tags":"Glossaire","title":"__A__ comme Apprentissage","modified":"20241108173331511"},
2475{"created":"20240313160900306","text":"\n{{Apprentissage}} \n\n\u003Cbr>\n\u003C!--\n_header: \"Glossaire  - Atelier Partageons l'IA\"\n-->\n\n{{Apprentissage automatique}} \n\n\n\u003Cbr>\n\u003C!--\n_header: \"Glossaire  - Atelier Partageons l'IA\"\n-->\n\n{{Apprentissage supervisé}} \n\n\u003Cbr>\n\u003C!--\n_header: \"Glossaire  - Atelier Partageons l'IA\"\n-->\n\n{{Apprentissage non supervisé}} \n\n\u003Cbr>\n\u003C!--\n_header: \"Glossaire  - Atelier Partageons l'IA\"\n-->\n\n\n{{Apprentissage par renforcement}} \n\n\u003Cbr>\n\u003C!--\n_header: \"Glossaire  - Atelier Partageons l'IA\"\n-->","type":"text/markdown","title":"__Apprentissage__","tags":"$:/Introduction","modified":"20241014153900325"},
2476{"created":"20240325152554482","text":"\n  Les définitions pour cette entrée thématique renvoient :\n   - aux phénomènes de __massification des processus de collectes des données__ \n - aux enjeux techniques associés: le __Datamining__ et la fouille des données\n\n\n\u003Cu>\u003Ch3> Le Big Data, qu'est-ce que c'est ? \u003C/h3> \u003C/u>\n\n\u003Cfieldset  style=\"font-family: 'MuBlack', serif; \">\n\n \u003Cdiv class=\"tc-table-of-contents\"> \u003C\u003Ctoc-selective-expandable \"Bigdata\" \"sort[title]\" exlcude=\"has[tag[Métier]]has[tag[$:/dates]]\">> \u003C/div>\n\n\u003C/fieldset>\n\n{{__Bigdata__}}\n\n* Pour aller plus loin :\n\n\u003Cfieldset  style=\"font-family: 'MuBlack', serif; \">\n\t\n\u003C$tidgraph start=\"Bigdata\" />\n\n\u003C/fieldset> ","tags":"Glossaire","title":"__B__ comme Big Data","modified":"20241108173127529","type":"text/markdown"},
2477{"created":"20240325153450298","text":"\n{{Bigdata}}","tags":"[[Enjeux Environnementaux]]","title":"__Bigdata__","modified":"20240519163336140"},
2478{"created":"20240325165252189","text":"\u003Cu> \u003Ch3> Quelles sont les __précautions pour une IA de confiance__  ?\u003C/h3> \u003C/u>  \n\nLes définitions pour cette entrée du glossaire renvoient :\n\n*  aux critères  d'__[[acceptabilité de l'IA|Enjeux d'acceptation sociale de l'IA]]__ \n\n*  aux conditions d'une __IA de confiance__  et aux [[enjeux éthiques|Enjeux Ethiques de l'IA]]\n*  aux __[[biais algorithmiques|Biais algorithmiques]]__ \n\n---\n\n\u003Cfieldset >\n\nLes applications de l'IA mettent en jeu \u003Cb>une grande quantité de données et de connaissances \u003C/b> : \n*  soit exploitées directement, \n* soit \u003Cb>codées sous différentes\u003C/b> formes (distribution de probabilités, poids synaptiques, etc.). \n\u003C/fieldset>\n\t\nLes applications IA peuvent utiliser différentes __types de précautions__ dans cette exploitation  et dans l'utilisation des données :\n\n\n{{Précaution}}\n\n---\n\n\n{{Enjeux d'acceptation sociale de l'IA}}\n \n---\n\n__Conditions d'une IA digne de confiance__ : selon l'OCDE, il existe 5  principes pour une approche responsable en appui d’une [[IA digne de confiance|Recommandation sur l'IA par le conseil de l'OCDE]].\n\n---\n\n{{Enjeux Ethiques de l'IA}}\n\n---\n\n{{Biais algorithmiques}}\n\n\n--- \n\n\n* Pour aller plus loin :\n  - Veille sur l'actualité des enjeux éthique de l'IA : [[https://www.actuia.com/thematique/ethique/]]\n\n\u003Cfieldset style=\"font-family: 'MuBlack', serif; \">\n\u003C$tidgraph start=\"Enjeux Ethiques de l'IA\" />\n\u003C/fieldset>\n","tags":"Glossaire","title":"__C__ comme Confiance en l'IA","modified":"20241108172815763","type":"text/markdown","source":"Technologie de l'information | Technologie logicielles - Architecture des systèmes - Jean Paul Haton "},
2479{"created":"20240514204325004","text":"{{Classification}}","type":"text/markdown","title":"__Classification__","tags":"","modified":"20240522095953140"},
2480{"created":"20240325155711041","text":"Les définitions pour cette entrée thématique renvoient \u003Cb> aux [[enjeux juridiques|Enjeux Ethiques]], [[éthiques|Enjeux Ethiques]] et démocratiques\u003C/b> de l'utilisation des \u003Cstrong>données personnelles\u003C/strong>
2480, en particulier dans des applications de l'IA en entreprise :\n\n---\n\n\n\u003Cu>\u003Ch3> A-t- on le droit d'utiliser des données personnelles et si oui, pour quels usages ? \u003C/h3> \u003C/u>\n\n\n\n*  Les données personnelles sont régies par  le __[[Règlement général sur la protection des données (RGPD)]]__  \n\n\u003Cfieldset style=\"font-family: 'MuBlack', serif; \">\n\t\n\u003Cdiv class=\"tc-table-of-contents\"> \u003C\u003Ctoc-selective-expandable \"RGPD\" \"sort[title]\" exclude=\"has[tag[Enjeux Juridiques]]has[tag[dates]]has[title[Enjeux Juridiques]]\" >> \u003C/div>\n\t\n\u003C/fieldset>\n\t\n* Les acteurs du contrôle : la __CNIL__ et les AIPD \n\n> \u003Cdiv class=\"tc-table-of-contents\"> \u003C\u003Ctoc \"CNIL\" \"sort[title]\" exclude=\"[title[Enjeux Juridiques]]has[tag[dates]]has[title[Systeme Expert]]has[title[Evaluer ses connaissances du RGPD]]\">> \u003C/div>\n\n\u003Cu> \u003Ch3> Quels sont les données dont la collecte est surveillée ?\u003C/h3> \u003C/u>\n\n\u003Cfieldest>\n   \n* Les données personnelles : \n    *  [[Identité numérique]] \n    * [[Moteur de recherche de personnes]]\n\n* Les données relatives au secret des affaires \n  *  [[Intelligence économique]]\n* Les données relative à la protection de la propriété intellectuelle\n\n  -   [[Droits d'auteur et droits de propriétés|Mention légale sur un site web]]\n        \n     - Protection du [[savoir-faire|Savoir-Faire]] (voir [[Licence libre]])\n  \n  - Droit d'usage : Les conflits de compatibilité entre les différentes composantes d’un même logiciel\n\n\u003C/fieldest>\n\n\u003Cu> \u003Ch3>Quels sont les impacts des applications de l'IA sur le projet démocratique \u003C/h3> ? \u003C/u>\n\n* Les textes protecteurs de la vie privée  :\n  * Le droit des électeurs\n\n- [ ] _Une liste plus exhaustive est à constituer_\n\n\u003Cfielset style=\"font-family: 'MuBlack', serif; \">\n\n\u003C$tidgraph start=\"CNIL\" />\n\n\u003C/fielset> \n\t\n* Tester ces connaissances sur le RGPD :\n  * https://www.cnil.fr/fr/comprendre-le-rgpd/le-mooc-de-la-cnil-est-de-retour-dans-une-nouvelle-version-enrichie","tags":"Glossaire","title":"__D__ comme Données personnelles (RGPD)","modified":"20241108190212660","type":"text/markdown"},
2481{"created":"20240330221400524","text":"\n{{Enjeux Environnementaux}}\n\n---\n\n{{Pollution numérique}}\n\n---\n\n{{Ecoconception}}\n\n---\n{{Référentiel général d'écoconception des services numériques (RGESN)}}\n\n\u003Cfieldset style=\"font-family: 'MuBlack', serif; \">\n\t\n\u003C$tidgraph start=\"Enjeux Environnementaux\" />\n\n\u003C/fieldset>","type":"text/markdown","title":"__E__ comme enjeux Environnementaux de l'IA","tags":"Glossaire","modified":"20241108190340152"},
2482{"created":"20240325152035332","text":" Cette entrée du glossaire rassemble les \u003Cb>enjeux des rapports de forces sociaux économiques\u003C/b>, en particulier au regard des géants du web.\n\n\n\u003Cfieldset style=\"font-family: 'MuBlack', serif; \"> \n\t\u003Cdiv class=\"tc-table-of-contents\"> \u003C\u003Ctoc \"GAFAM\" \"sort[title]\">>\u003C/div>\n\n\u003C/fieldset>\n\n\nCette partie tente d'aborder présente également  les __grands domaines d'application__ et les __enjeux éthiques sous-jacents__.\n\n>L'intelligence artificielle s'attache à résoudre des problèmes d'___activités humaines___ de nature variée :\n>* Perception\n>* Prise de décision\n>* Planification\n>* Diagnostic\n>* Interprétation des données\n>* Compréhension du langage\n>* Conception \n>* ...\n\nPour ces __applications__, l'IA mets en jeu une grande quantité de données et de connaissances, soit exploitées directement, soit codées sous différentes formes (distribution de probabilités, poids synaptiques, etc.). \n\n\n---\n\n{{GAFAM}}\n\n\n---\n\n\u003Cu>\u003Ch3> Quels sont les usages de l'IA par les employeurs ? \u003C/h3>\u003C/u>\n\nAu regard de l'enquête de France Travail, les principaux usages de l'IA déployés actuellement en France concernent :\n>* les outils de diagnostic d'[[aide à la décision|Arbres de décision]]\n>* Le [[traitement du langage naturel|Traitement du langage naturel]]\n>* la [[robotique|Robotique intelligente]]\n\n\n* Source : [[Enquête de France Travail en 2023 «Les employeurs face à l’Intelligence Artificielle »|https://www.francetravail.org/files/live/sites/peorg/files/documents/Statistiques-et-analyses/_Documentation/Divers/P%c3%b4le%20emploi_Pr%c3%a9sentation_Enquete%20Intelligence%20Artificielle_2023.pdf]]\n\n* Pour aller plus loin :\n\n\u003Cfieldset style=\"font-family: 'MuBlack', serif; \">\n\t\n\u003C$tidgraph start=\"GAFAM\" />\n\n\u003C/fieldset>","type":"text/markdown","title":"__G__ comme  GAFAM","tags":"Glossaire","modified":"20241108191458712"},
2483{"created":"20240325091240945","text":"\u003Cu>\u003Ch3> L'IA c'est quoi ? :  \u003C/h3> \u003C/u>\n\n\n* L'enjeu de la définition selon l'article [[L'IA, c'est quoi ? (source)|https://oecd.ai/en/wonk/definition]] est introduit ainsi: \n\n  _Si le terme d’« intelligence artificielle » (IA) est entré dans le langage commun et son utilisation devenue banale dans les médias, il n’en existe pas réellement de définition partagée._ \n\n\n  Cette entrée du glossaire rassemble  les \u003Cb> définitions et les concepts clés principaux \u003C/b> au sujet de l'\u003Cb> intelligence artificielle \u003C/b>   :\n\n\u003Cfieldset style=\"font-family: 'MuBlack', serif; \">\n\n> \u003Cdiv class=\"tc-table-of-contents\">\n>\u003C\u003Ctoc-selective-expandable \"Intelligence Artificielle\" \"sort[title]\" exclude=\"has[tag[Modèle]]has[tag[$:/dates]]\">>\n>\u003C/div>\n\n\u003C/fieldset>\n\n\n{{__Intelligence Artificielle__}}\n\n\u003C!--\n---\n\n\u003C$tidgraph start=\"Intelligence Artificielle\" />\n\n---\n-->
2483","type":"text/markdown","title":"__I__ comme Intelligence Artificielle (IA)","tags":"Glossaire","modified":"20241108191637011","source":"Sylvain DELAITRE"},
2484{"created":"20240325121954435","text":"\u003Ccenter>\n{{$:/diagrammes/intelligence_artificielle}}\n\u003C/center>\n\n\n\n---\n\n{{Intelligence}}\n\n---\n\n{{Artificiel}}\n\n---\n\n\n\n{{Intelligence Artificielle}}\n\n\n\n---\n\n{{Algorithme}}\n\n\n{{Gestion algorithmique}}\n---\n\n{{Modèle}}","tags":"","title":"__Intelligence Artificielle__","modified":"20241108191747893"},
2485{"created":"20240325161905004","text":"\n\n\u003Cu>\u003Ch3> Quels sont les enjeux juridiques en matières de données et de finalité de traitement ? :  \u003C/h3> \u003C/u>\n\n---\n\n\u003Cstrong> Les textes juridiques par catégories\u003C/strong>\n\n---\n\n\u003Cbr>\n\n\u003Cfieldset  style=\"font-family: 'MuBlack', serif; \">\n\n* La [[Réglementation Internationale]]\n* La [[Règlementation Européennes]]\n* La [[Règlementation Nationale]]\n\n\u003C/fieldset>\n\u003Ccenter>\n\n\u003Cbr>\n\n---\n\n\n\u003Cstrong> Les textes juridiques de référence en matière de traitement de données\u003C/strong>\n\u003C/center>\n\n---\n\nCette entrée du glossaire rassemble, \u003Cu>par ordre chronologique\u003C/u>,  les  textes  de référence autour des \u003Cb>[[enjeux juridiques|Enjeux Juridiques]]  des traitements de données\u003C/b>, dont ceux relatifs à l'usage de l'[[IA|__I__ comme Intelligence Artificielle (IA)]] .\n\n\u003Cfieldset>\n\n\u003C\u003Ctabs tabsList:\"[tag[Enjeux Juridiques]sort[year]] -[title[Les enjeux de sécurité]] -[title[Confiance numérique]] -[title[Droit d information]] -[title[RGPD]] -[title[Réglementation Internationale]]  -[title[Règlementation Nationale]]  -[title[Règlementation Européennes]] \n-[title[Personne Physique]] \n-[title[Licence libre]] \n-[title[__Open Source__]] \n-[title[Sécurité]] \n-[title[Accessibilité]] \n\" default:\"Tutorial Alerts\" class:\"tc-vertical\" >>\n\n\u003C/fieldset>\n\n\u003C!--\n\u003Cdiv class=\"tc-table-of-contents\"> \u003C\u003Ctoc \"Enjeux Juridiques\" \"sort[year]\"  >> \u003C/div>\n-->\n","tags":"Glossaire","title":"__J__ comme qualification Juridique","modified":"20241108192402207"},
2486{"created":"20240325162120537","text":"Cette entrée thématique rassemble des définitions sur  \u003Cb> les modalités d'évaluation et les mesures de la performance\u003C/b> (Key Performance Indicators [[KPI]])  dans un projet informatique, en particulier un projet de [[SIA]].\n\n\u003Cfieldset  style=\"font-family: 'MuBlack', serif; \">\n\n \u003Cdiv class=\"tc-table-of-contents\"> \u003C\u003Ctoc \"Evaluation\" \"sort[title]\" >> \u003C/div>\n\n\u003C/fieldset>","tags":"Glossaire","title":"__K__ comme Indicateurs de la performance (KPI)","modified":"20241108192438699"},
2487{"created":"20240325164501345","text":"Cette entrée thématique rassemble des éléments relatif à l' \u003Cb>IA générative \u003C/b> :\n\n\n{{Modèle de langage}}\n\n\n{{Chatbot}}\n\n...\n\n\n## Des exemples d'application d'agent conversationnel (chat) avec de l'IA:\n\n\u003Cfieldset>\n\t\n### Dans le domaine du tourisme, à l'instar des agence de voyages\n  \n* [[https://tripplanner.ai/new-trip]]\n* [[https://layla.ai/fr]]\n\n### Dans le domaine du graphisme et du design\n\n* [[https://openart.ai/]]\n* [[https://www.canva.com/fr_fr/pro/]]\n\n### Dans le domaine des services clients (ouvert 24h/24)\n\n* [[https://www.voiceflow.com/]]\n* [[https://probot.io/fr]] (avec discord)\n* [[https://www.chatdb.ai]] (pour la construction de dashboard à partir de base de données)\n\n### Redaction de contenu\n\n* [[https://writesonic.com/]]\n* [[https://www.hyperwriteai.com/]]\n* [[https://www.sourcely.net]]/ (source academic)\n* [[https://quillbot.com/flow]]\n* [[https://www.jasper.ai/chat]]\n\n\n### Assistance juridique \n\n* [[https://juribot.fr/]] (droit français)\n* [[https://aidejuridique.ai/]]\n* [[https://www.lexisnexis.com/fr-fr/produits/lexis-plus-ai]]\n* [[https://blog.rossintelligence.com/]] (cible les avocats)\n* [[https://kirasystems.com/]]\n\n### Comptabilité - gestion\n\nL’automatisation des tâches répétitives est indéniablement l’un des avantages majeurs de l’intelligence artificielle dans le secteur. Des processus comme la saisie comptable, la tenue comptable et les factures électroniques se trouvent révolutionnés. \n\nSource : [[https://certif-ia.fr/ia-comptabilite/]]\n\n* [[https://www.xero.com/]]\n* [[https://quickbooks.intuit.com/contact/]]\n\n### Ophtamologie\n\n* [[https://www.altris.ai/ai-oct-for-ophthalmologists/]]\n\n\u003C/fieldset>\n\n---\n\n{{Tâche automatisable}}\n","tags":"Glossaire","title":"__L__ comme Llama : l'IA Générative","modified":"20241016234314666","type":"text/markdown"},
2488{"created":"20240331144354339","text":"\n\u003Cfieldset  style=\"font-family: 'MuBlack', serif; \">\n\n> \u003Cdiv class=\"tc-table-of-contents\"> \u003C\u003Ctoc-selective-expandable  \"Métier\" \"sort[title]\" >> \u003C/div>\n\n\u003C/fieldset>\n\n{{Acteurs de l IA}}\n\n\u003C!---\n\u003C$tidgraph start=\"Métier\" nocollapse />\n\nou {{Métier}}\n--->
2488\n","tags":"Glossaire","title":"__M__ comme Métiers de la conception des SI","modified":"20241108192959074"},
2489{"created":"20240325163010670","text":"Dans cette partie, il s'agit de traiter des __enjeux en matière d'inclusion__ relatifs aux systèmes automatisées et à l'IA.\n\n\u003Cfieldset>\nLes outils numériques sont complexes et _devraient être compréhensibles par l'ensemble des citoyens et des citoyennes_ pour qu'ils puissent en maitriser l'usage. \n\n\u003C/fieldset>\n\t\nLes définitions pour cette entrée thématique portent sur :\n    \n  * l'\u003Cb>inclusion numérique et la [[formation  dans ce domaine|Formation numérique]]\u003C/b> \n  *  les [[référentiels de compétences numériques|Référentiel de compétences dans le numérique]] existants\n * les moyens de veille éthique sur la __non discrimination des individus par l'IA__\n\n\u003Cfieldset style=\"font-family: 'MuBlack', serif; \" >\n\n> \u003Cdiv class=\"tc-table-of-contents\"> \u003C\u003Ctoc-selective-expandable \"Inclusion Numérique\" \"sort[title]\" >> \u003C/div>\n\n\u003C/fieldset>\n\n{{Inclusion Numérique}}\n\n---\n\n{{Accessibilité}}\n\n\n\n\u003Cfieldset style=\"font-family: 'MuBlack', serif; \">\n\n\n\u003C$tidgraph start=\"Inclusion Numérique\" />\n\n\u003C/fieldset>\n","tags":"Glossaire","title":"__N__ comme Numérique et inclusion","modified":"20241108193046166","type":"text/markdown"},
2490{"created":"20240325163833535","text":"Les définitions pour cette entrée thématique du glossaire portent sur __les communs numériques, les logiciels libres et les contenus \"ouverts\"__.\n\n\n\u003Cfieldset style=\"font-family: 'MuBlack', serif; \">\n\n\n\n> \u003Cdiv class=\"tc-table-of-contents\"> \u003C\u003Ctoc \"Open Source\" \"sort[title]\" >> \u003C/div>\n\u003C/fieldset>\n\n\n{{Les communs numériques}}\n\n---\n\n{{__Open Source__}}\n\n{{OSI}}\n\n---\n\n{{Open Data}}\n\n---\n\n\u003Cmark>\n\u003Cstrong> Les modèles d'intelligence artificielle Open source \u003C/strong>\n\u003C/mark>\n\n>Mistral AI est une entreprise spécialisée dans le développement de modèles de langage avancés. Elle propose certains de ses modèles en open source. \n\n[[https://chat.mistral.ai/chat]]\n[[https://mistral.ai/fr/news/codestral/]]\n\nIl existe de nombreux modèles open-source, voir notamment :\n\n>Hugging face\n>Bloom\n>Falcon\n>LLaMA\n> ...","tags":"Glossaire","title":"__O__ comme Open Source","modified":"20241108193125294","type":"text/markdown"},
2491{"created":"20240526144809949","text":"{{Open Source}}\n---\n\n{{Logiciel Libre}}\n\n---\n{{Licence libre}}","tags":"Transparence","title":"__Open Source__","modified":"20240528115434896"},
2492{"created":"20240331144806048","text":"\nLes définitions pour cette entrée thématique du glossaire portent sur __la conception et la gestion de projet SI__, dont les projets de [[système d'IA|Système d IA (SIA)]] :\n\n\u003Cfieldset style=\"font-family: 'MuBlack', serif; \">\n\n {{Projet SI}}\n\n\u003C/fieldset>\n\n{{Système d IA (SIA)}}\n\n\n---\n\n\u003Cdetails> \n\u003Csummary>\n\u003Cstrong> Cartographie des définitions du glossaire autour des projets des SIA\t\u003C/strong>\n\u003C/summary>\n\t\n\u003Cfieldset style=\"font-family: 'MuBlack', serif; \">\n\n\u003C$tidgraph start=\"Projet SI\" />\n\n\u003C/fieldset>\n\n\u003C/details>","tags":"Glossaire","title":"__P__ comme Projet de Système d'Intelligence Artificielle (SIA)","modified":"20241110121147849","type":"text/markdown"},
2493{"created":"20240325164917942","text":"Cette entrée du glossaire rassemble des définitions autour :\n\n  * des SIA et de  la  \u003Cb> [[QVCT|QVT]] \u003C/b> \n   * Impact de l'IA sur le travail, par exemple l'intensification du travail et l'ingérence de l'IA dans l'activité ( Management algorithmique)\n\n{{QVT}}\n\n---","type":"","title":"__Q__ comme Qualité de vie au travail (QVT)","tags":"Glossaire","modified":"20241108193251318"},
2494{"created":"20240402205627392","text":"\u003Cu>\u003Ch3> Quelles responsabilité juridique en matière de  sécurité de l'IA ?\u003C/h3> \u003C/u>\n\n\u003Cfieldset>\n\t\nLe cadre réglementaire de la sécurité du numérique distingue : \n* La [[Sécurité des systèmes d’information]],\n* la [[Confiance numérique]] (voir partie dédiée en tant que thématique de ce glossaire)\n\n\u003C/fieldset>\n\nLes définitions de cette entrée thématique relève donc du périmètre de la :\n\n * __Responsabilité et  contrôle de l'IA__ en cas de dommages causes par 'une IA ou du fait de l'usage d'une IA.\n\n   * Source : [[CESE]] _Novembre 2023 - L'intelligence artificielle (IA) - risques et opportunités : des enjeux à débattre_  \n\n\n* __\u003Cmark>Sécurité de l’IA\u003C/mark>__ : Domaine interdisciplinaire (recherche et ingénierie) qui s’intéresse aux impacts de l'IA, visant à garantir que l’intelligence artificielle soit développée et utilisée de manière sûre et responsable.\n\n\n  * Source :  [[  DIAG -Diagnostique l'automatisation potentielle de ses tâches professionnelles par des systèmes d'IA (SIA) et sensibilise aux critères de responsabilité de l'IA au travail|https://sites.google.com/matrice.io/dispositif-diag/glossaire-de-lia]]\n\n\n\n\u003Cfieldset style=\"font-family: 'MuBlack', serif; \">\n\t\n >\u003Cdiv class=\"tc-table-of-contents\">\u003C\u003Ctoc \"Sécurité\" \"sort[title]\" >>\u003C/div>\n\n\u003C/fieldset>\n---","tags":"Glossaire","title":"__S__ comme enjeux de Sécurité et de responsabilité","modified":"20241108193358644","type":"text/markdown"},
2495{"created":"20240325161315834","text":"Cette entrée du glossaire rassemble des définitions autour  de la \u003Cb> transparence appliquée \u003C/b> au SIA :\n\n\u003Cfieldset style=\"font-family: 'MuBlack', serif; \">\n\n>\u003Cdiv class=\"tc-table-of-contents\"> \u003C\u003Ctoc \"Transparence\" \"sort[title]\" >> \u003C/div>\n\n\u003C/fieldset>\n\n\u003Cu>\u003Ch3> Quelles sont les obligations de transparence en matière de [[données|Données personnelles (DCP)]] et d'[[IA|__I__ c
2495omme Intelligence Artificielle (IA)]] ? \u003C/h3> \u003C/u>\n\n\n{{__Transparence__}}","type":"text/markdown","title":"__T__ comme Transparence","tags":"Glossaire","modified":"20241108193429775"},
2496{"created":"20240325161501496","text":"{{Transparence}}\n\n\u003Cdetails>\n\u003Csummary>\nTexte juridique de référence\n\u003C/summary>\n\t{{Règlement européen sur les services numériques (DSA)}}\n\u003C/details>\n\u003Cdetails>\n\u003Csummary>\nPour aller plus loin\n\u003C/summary>\n\n  * [ Un espace web dédié à l'exploration des données de transparence www.peren.gouv.fr](https://www.peren.gouv.fr/transparence/)\n   \u003C/details>\n\t \n\n__Les éléments auditables en matière de transparence__ : \n\n  En IA, il s'agit donc de pouvoir expliquer les \n  critères de décisions d'un algorithme d'entreprise, \n  au sens d'__auditabilité__. \n\nLa notion de transparence peut renvoyer également à plusieurs autres questions :\n  * Le code est il disponible ?\n  * S'agit'il de l'effort de tranparence de l'entreprise ?\n\n---\n\n## Les types d'audit possibles  de la transparence\n\n\u003Cdetails>\n\u003Csummary>\n \u003Cb>Audit du code\u003C/b>\n\u003C/summary>\n\n|Avantages|Inconvénients|\n|----|----|\n| • Pratique | • Rarement disponible  | \n|   • Permet de voir les efforts réels, les sécurités...|  • Parfois ou exploitable ou lisible (code \"Spaghetti\")|\n|  |• en ML, ne donne ni le modèle, ni les données|\n||   • en ML, Parfois besoin d'infrastru
2496cture pour reproduire |\n\n\u003C/details>\n\n\u003Cdetails>\n\u003Csummary>\n \u003Cb>Audit par interceptions\u003C/b>\n\u003C/summary>\n\n\n|Avantages|Inconvénients|\n|----|----|\n|• Permet de mesurer l'activité réelle|• Possibilité d'obfusquer les données|\n|• Standard de preuve assez elevé|• Peut demander un temps d'analyse et un outillage conséquent|\n|• Pratique pour les analyses RGPD|• Toutes les infos ne sont pas forcement interprétables|\n\n\u003C/details>\n\n\u003Cdetails>\n\u003Csummary>\n \u003Cstrong>Audit par tests\u003C/strong>\n\u003C/summary>\n\n\n|Avantages|Inconvénients|\n|----|----|\n|• Dispense du code source|• Entreprises frileuses|\n|• Permet d'établir des suspicions de causalités |• Scrapping (attention au cadre légal) |\n|• Analyse les effets de l'algorithme|• Effet \"wolksvagen\"|\n\n\u003C/details>\n\n---\n\n\u003C!--\n_header: \"Glossaire  - Atelier Partageons l'IA\"\n-->\n","tags":"[[Maitrise des Risques]]","title":"__Transparence__","modified":"20241108213730719","type":"text/markdown"},
2497{"created":"20240325165429666","text":"__Marché de l'IA et intelligence artificielle__\n\nBien que l’intelligence artificielle soit un sujet de recherche fondamentale relativement ancien, les performances atteintes au cours de ces dernières années permettent l’éclosion d’un marché reposant sur une multitude d’applications arrivées à une certaine maturité. Le marché de l’intelligence artificielle sort de sa niche pour devenir l’un des piliers de l’économie de nombreux pays. \n\n\u003Ca href=\"https://dialia.alwaysdata.net\" target=\"_blank\" >Lien vers le Manifeste Dialia\u003C/a>","tags":"","title":"__V__ comme Valeur ajoutée de l'IA","modified":"20241015154138697","type":"text/markdown"},
2498{"created":"20240325165527426","text":"Cette entrée du glossaire rassemble des __notions de bases sur le  web__ \n     et  les réseaux, en particulier la question du __[[référencement|Référencement]]__ des sites du réseaux internet  et plus globalement __celle du référencement des [[données personnelles|__D__ comme Données personnelles (RGPD)]]__ sur la toile.\n\n\u003Cfieldset style=\"font-family: 'MuBlack', serif; \">\n\n> \u003Cdiv class=\"tc-table-of-contents\"> \u003C\u003Ctoc-selective-expandable \"Web\" \"sort[title]\" exclude=\"has[tag[$:/dates]]has[tag[Métier]]\">> \u003C/div>\n\n\u003C/fieldset>","tags":"Glossaire","title":"__W__ comme Web","modified":"20241108193555521","type":"text/markdown"},
2499{"created":"20240325165651262","text":" Cette entrée du glossaire est relative __aux mécanismes connus d'emprise__  :\n\n  * du numérique et des écrans\n  * de l'[[IA|Intelligence Artificielle]] et des \u003Cb>stratégies de l'attention\u003C/b>, \n  \nC'est aussi la voie d'accès au  [[zapping de Partageons l'IA|X comme interdit]]....\n\n---\n\n\u003Ccenter>\n\u003Cu> \u003Ch3> Quelques chiffres clés sur l'emprise du numérique sur l'attention : \u003C/h3> \u003C/u>\n\u003C/center>\n\n---\n\n * Fin 2020, on compte __92% de foyers connectés en France__, 53 millions d’internautes mensuels  et 8 Français sur 10 qui se connectent chaque jour sur les réseaux sociaux et les messageries instantanées..\n\n\n* A 15 ans 5% des garçons et 11% des filles ont un __usage problématique des réseaux sociaux__.\n\n\n* 78% des cadres consultent leurs __communications professionnelles pendant les vacances et les week-ends__.\n\nSource : [[https://www.drogues.gouv.fr/lessentiel-sur-les-usages-problematiques-decrans]]\n\n\n\u003Cfieldset>\n\t\n* 37% des actifs __utilisent les outils numériques professionnels hors temps de travail__ selon une étude Eléas (septembre 2016)\n* 62% des actifs __réclament une régulation des outils numériques professionnels__.\n\nSource : [[https://travail-emploi.gouv.fr/archives/archives-courantes/loi-travail-2016/les-principales-mesures-de-la-loi-travail/article/droit-a-la-deconnexion]]\n\n\u003C/fieldset>","tags":"Glossaire","title":"__Z__ comme Zapping","modified":"20241017001840861","type":"text/markdown"},
2500{"created":"20240607143947193","text":"Base de connaissance sur l'intelligence artficielle pour le dialogue social","tags":"$:/plugins/benwebber/semantic/tags/DublinCore $:/plugins/benwebber/semantic/tags/Ope
2500nGraph","title":"$:/.local/metadata","modified":"20240610101651551","type":"","dc.description":"{{$:/.local/metadata}}","og.title":"DIALIA","og:url":"https://iap2p.vercel.app/","dc.title":"DIALIA","description":"{{$:/.local/metadata}}"},
2501{"created":"20150129001857442","text":"(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nenables js via \u003C\u003Cscript>> and disables with \u003C\u003Cscript 0>>\n*/\n\nexports.name = \"script\";\n\nexports.params = [\n\t{name: \"run\"},\n];\n\n/*\nRun the macro\n*/\nexports.run = function(run) {\n        var off = run ? run.toLowerCase() : false;\n\tif(off && [\"0\",\"no\",\"off\",\"false\"].indexOf(off) > -1) {\n\t\t$tw.config.htmlUnsafeElements = [\"script\"];\n\t} else {\n\t\t$tw.config.htmlUnsafeElements = [];\n\t}\nreturn \"\";\n};\n})();","type":"text/plain","title":"$:/.tb/macros/script","tags":"","module-type":"macro","modifier":"Tobias Beer","modified":"20240921213505546","creator":"Tobias Beer"},
2502{"created":"20240921205723920","text":"\\whitespace trim\n\u003Cdiv class=\"tc-advanced-search\">\n\u003C$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/AdvancedSearch]!has[draft.of]]\" default=\"$:/core/ui/AdvancedSearch/System\" actions=\"\"\"\u003C$action-setfield $tiddler=\"$:/state/advancedsearch/currentTab\" text=\u003C\u003CcurrentTab>>/>\"\"\" explicitState=\"$:/state/tab--1498284803\"/>\n\u003C/div>\n","title":"$:/AdvancedSearch","icon":"$:/core/images/advanced-search-button","color":"#bbb","modified":"20240925195533821"},
2503{"created":"20240914125234727","text":"\u003C\u003Clist-links \"[all[current]tagging[]]\">>","title":"$:/Cas pratique","modified":"20240914125628331","tags":""},
2504{"created":"20241008095327377","text":"Les logiciels nécessaires :\n- Apache, le serveur web, pour servir les fichiers statiques\n- Git, pour cloner le dépôt\n\nPour se connecter au serveur en SSH, on a besoin de deux choses (ces informations sont fournies par l'hébergeur) :\n\n- L'adresse IP du serveur (ou son nom de domaine, s'il en a un)\n- Un utilisateur et un mot de passe\n\n```bash\nssh nom_utilisateur@ip_ou_nom_de_domaine²\n```\n\nInstallation \n---\n\n```\nsudo apt install -y apache2\n```\n💡 L'argument `-y` permet d'éviter de demander une confirmation à l'utilisateur.\n\nUne fois ce paquet installé, on peut ouvrir un navigateur et se rendre à l'adresse du serveur pour vérfier l'affichage de la page web par defaut.\n\nUne fois ce paquet installé, on peut ouvrir un navigateur et se rendre à l'adresse de notre serveur. Nous devrions voir la page par défaut d'Apache.\n\n## Le dossier `/var/www/html`\n\nLe dossier `/var/www/html` est le dossier racine du serveur web Apache. C'est dans ce dossier que l'on va en général déployer nos sites statiques  Avant de passer au déploiement, deux dernières petites choses à faire sur ce dossier.\n\n### Permissions & propriétaire\n\nPour pouvoir déployer une application sans avoir à utiliser `sudo` pour chaque commande, on va devoir modifier les permissions du dossier `/var/www/html` pour que l' utilisateur puisse y écrire.\n\nPour visualiser les permissions du dossier `/var/www/html`, on peut utiliser la commande `ls -l` :\n\n```bash\nls -alh /var/www/html\n```\n\n`-l` est l'argument qui permet de visualiser les permissions, mais il est utile de le joindre aux arguments `-a` et `-h`, permettant respectivement de lister tous les fichiers & dossiers (y compris les fichiers cachés) et d'afficher les tailles des fichiers en octets, kilo-octets, etc. (plutôt qu'en nombre de blocs).\n\nOn doit pouvoir voir quelque chose comme ça :\n\n```bash\nusertest@PSEUDOGH-server:/var/www/html$ ls -alh\ntotal 20K\ndrwxr-xr-x 3 root root 4.0K Oct  6 09:55 .\ndrwxr-xr-x 3 root root 4.0K Oct  5 15:15 ..\n-rw-r--r-- 1 root root  11K Oct  5 15:15 index.html\n```\n\nLe dossier `/var/www/html` (`.`) appartient à l'utilisateur `root` et au groupe `root`. Les permissions sont `rwxr-xr-x`, ce qui signifie que l'utilisateur `root` a tous les droits (`rwx`), mais que les autres utilisateurs n'ont que les droits de lecture et d'exécution (`r-x`).\n\nOn peu changer le propriétaire du dossier par celui de l'utilisateur, mais aussi par exemple, pour le groupe `www-data`. L'utilisateur du même nom, `www-data`, est utilisé pour l'exécution du serveur web Apache : il doit donc avoir les droits d'écriture sur le dossier `/var/www/html` pour que nos applications web puissent y écrire si nécessaire.\n\n```bash\nsudo chown -R student:www-data /var/www/html\n```\n\nL'utilisateur est maintenant propriétaire, et il a les droits d'écriture. Mais le groupe `www-data` n'a toujours que les droits de lecture ! On peut donc remédier à cela avec :\n\n```bash\nsudo chmod -R g+w /var/www/html\n```\n\n💡 Rappel : `g+w` signifie \"ajouter (+) les droits d'écriture (w) au groupe (g)\". On aurait également pu utiliser la notation octale :\n\n`sudo chmod -R 775 /var/www/html`\n\n💡 Rappel : `775` correspond aux droits de lecture, écriture et exécution (4+2+1) pour l'utilisateur propriétaire & le groupe propriétaire, et seulement les droits de lecture et d'exécution (4+1) pour les autres utilisateurs.\n\nOn peut relancer la commande `ls -alh` pour vérifier que les permissions ont bien été modifiées :\n\n```bash\nls -alh /var/www/html\n```\n\n\n### Suppression du fichier `index.html`\n\nPar défaut, Apache2 affiche le fichier `index.html` lorsqu'on se rend à l'adresse du serveur. On doit supprimer ce fichiercar ce fichier divulgue des informations potentiellement sensibles sur le serveur, comme par exemple la version d'Apache2 ou le système d'exploitation utilisé. Il est donc préférable de le supprimer pour des raisons de sécurité.\n\n```bash\nrm /var/www/html/index.html\n```\n### désintallation et réinstallation d'apache\n\n```\napt-get remove --purge apache2-*\ndpkg --purge apache2 #si tu avais deja desinstalle apache\napt-get update\napt-get dist-upgrade\napt-get install apache2\n```\n\n#### lancer ou redemarrer apache\n\n```\nsudo systemctl start apache2\nsudo systemctl reload apache2\n\n```\n\nVerifier le statu du service :\n\n```\nsudo systemctl status apache2.service\n````","tags":"","title":"$:/code/apache2","modified":"20241015104454128","type":"text/markdown"},
2505{"created":"20240530120912077","text":"","tags":"","title":"$:/code/boucle_ForEach","modified":"20240530120929319"},
2506{"created":"20240530120946408","text":"```js\n// Exemple de compteur  compteur en Javascript\nlet counter = 0;\n\nwhile (counter \u003C 12) {\n    console.log(counter);\n    counter++;\n}\n```\n\n* Tirage aleatoire  qui ne génére qu'une fois le même nombre\n```js\n\n\nfunction getRandomInt(min, max) {\n    return Math.floor(Math.random() * (max - min)) + min;\n}\n\n    let resultats = [];\n\n    while (resultats.length \u003C 6) {\n        const resultat = getRandomInt(1, 49);\n        if (!resultats.includes(resultat)) {\n            resultats.push(resultat);\n        }\n    }\n\n```","tags":"","title":"$:/code/boucle_While","modified":"20240618111011990"},
2507{"created":"20240617135615068","text":"* ''Gestion des conflits de styles'' : [[ Article dédié documentation MDM |https://developer.mozilla.org/fr/docs/Learn/CSS/Building_blocks/Cascade_and_inheritance#r%C3%A8gles_conflictuelles]]\n\n    # Une règle avec la mention \u003Ccode>  !important \u003C/code>  a une priorité de 10000.\n  # Une règle écrite dans l'attribut style  d'une balise HTML a une priorité de 1000.\n # Une règle avec un sélecteur sur un identifiant ( \u003Ccode># \u003C/code> ) a une priorité de 100.\n #  Une règle avec un sélecteur sur une classe ( . ) ou des pseudo-class ( : ) a une priorité de 10.\n #  Une règle avec un sélecteur sur un type d'élément (\u003Ccode> p\u003C/code> ) ou des pseudo-elements ( :: ) a une priorité de 1.\n# Le sélecteur étoile ( \u003Ccode>* \u003C/code>) a une priorité de 0.\n\n* Quelques règles d'or pour bien démarrer :\n\n```css\nimg {\n   max-width: 100%;\n}\n\n  body {\n    line-height: 1.4;\n    //font-family: 'Raleway', sans-serif;\n   // font-family: 'Poppins', sans-serif;\n  }\n\n  a {\n    text-decoration: none;\n  }\n```\n\n* Attacher une image à une balise ou à une classe de style en css\n\n```css\n.page {\n    display: flex;\n    background-image: url(\"../../../docs/background.jpg\");\n    }\n\n\n```\n* intégration d'une feuille de style dans le html\n\n```html\n\u003Clink rel=\"stylesheet\" href=\"/css/reset.css\">\n```\nPour aller plus loin :\n\n * [[jeux sur le CSS : https://flukeout.github.io |https://flukeout.github.io/]]\n\n*remarque*\nThe vh unit stands for viewport height, and is equal to 1% of the height of the viewport\n\n```css\nbody {\n  width: 100%;\n  height: 100vh;\n  margin: 0;\n  background-color:#1b1b32;\n  color:#f5f6f7;\n}\n\n```","tags":"","title":"$:/code/css","modified":"20240913092953003","icon":"$:/img/ico/css-3.ico"},
2508{"created":"20240925103847378","text":"pour éviter d’avoir à ajouter des  `\u003Cdiv>`  supplémentaires, que l'on aurait dû ajouter à chaque fois dans le HTML, on peut utiliser le pseudoélément  `::before`  ou  `::after`  ;\n\npour créer un pseudoélément, ajoutez le nom du pseudoélément à un sélecteur, en utilisant le préfixe double deux-points :  `.selector::after{...}`\n\nles pseudo-éléments  `::before`  et  `::after`  créent un élément qui est respectivement le premier ou le dernier enfant de l’élément sélectionné ; ","tags":"","title":"$:/code/css/::before/::after","modified":"20240925104038034"},
2509{"created":"20240830065839655","text":"[[https://web.dev/articles/css-marker-pseudo-element?hl=fr]]\n\n> **::marker**  permet de modifier la couleur, la taille et l'espacement des repères en vous permettant de cibler les pseudo-éléments de repère individuellement ou globalement dans votre CSS:\n\n```css\nli::marker {\n  color: hotpink;\n}\n\nli:first-child::marker {\n  font-size: 5rem;\n}\n\n// ou\n\nli::marker {\n  content: counter(list-item) \"› \";\n  color: hotpink;\n}\n```\n\n* Autres modalités\n\n```css\nli::before {\n  content: \"::before\";\n  background: lightgray;\n  border-radius: 1ch;\n  padding-inline: 1ch;\n  margin-inline-end: 1ch;\n}\n```","tags":"","title":"$:/code/css/::marker","modified":"20240830070552903","type":"text/markdown"},
2510{"created":"20240830075123237","text":"## Pseudo classe `:focus`","tags":"","title":"$:/code/css/:focus","modified":"20240830075216582","type":"text/markdown"},
2511{"created":"20240617151447721","text":"__Responsive Web Design__ (RWD)\n\n[[https://www.w3schools.com/html/html_responsive.asp]]\n\n## Media Queries \n\n### @media queries et le Mobile first\n\nLa plupart des media queries vont concerner la largeur de l'écran. \nil est possible de prévoir quelques **points de rupture** typiques correspondant aux différentes largeurs de supports courants, on parle au
2511ssi de **breakpoints**. \n\nPar exemple, voici un ensemble de breakpoints : 640px, 768px, 1024px, 1280px. \n\nIl est souvent préférable d'utiliser une unité relative pour ses breakpoints comme le `rem`, \nainsi si l'utilisateur change ses préférences en terme de taille de texte, il aura une mise en page adaptée.\n\n\nPour passer des pixels, l'unité px à l'unité rem, il faut diviser par la taiolle de la pplice, soit généralement 16px, ce qui fait approximativement des break-points de respectivement, 40 rem, 48rem, 64 rem et enfin 80rem. \n\n### Syntaxe d'une media query\n```css\n@media media-type and (spécifications du média) {\n      /* modifications des propriétés CSS */\n    }\n ```   \n\n*   media-type : `all`, `print`, `screen`, `speech`\n\nExemple de media query pour impression, qui rend le fond blanc et la couleur du texte noir.\n```css\n@media print {\n        * {\n            color: #000;    \n            background-color: #fff;\n        }\n    }\n ```   \n\nExemple qui permet de modifier la largeur de la balise article dans le cas d'un affichage de type écran et si la largeur maximum de celui-ci est 600px.\n\n```css\narticle {\n        width: 50%;\n   }\n    \n@media screen and (max-width: 600px) {\n        article {\n            width: 100%;\n        }\n    }\n ```   \n\n🚀 [Listes des spécifications de média MDN](https://developer.mozilla.org/fr/docs/Web/CSS/Media_Queries/Using_media_queries#caract%C3%A9ristiques_m%C3%A9dia_media_features) \n\nLes deux exemples suivants auront un effet différent, _\"and\"_ cumule les conditions.\n```css\narticle {\n        width: 50%;\n    }\n    \n// and : écran ET largeur max de 600px ET orientation paysage\n\n@media screen and (max-width: 600px) and (orientation: landscape){\n        article {\n            width: 100%;\n        }\n    }\n```\n\nLa virgule aura un effet de \"ou logique\".\n\n```css\narticle {\n        width: 50%;\n    }\n    \n// une virgule : (écran ET largeur max de 600px) OU (écran ET orientation paysage)\n\n@media screen and (max-width: 600px), screen and (orientation: landscape){\n        article {\n            width: 100%;\n        }\n    }\n ```   \n\nIl est bon de savoir que les media queries n'affectent en rien les spécificités des sélecteurs : c'est donc le sélecteur le plus spécifique qui surcharge l'autre, ou celui écrit en dernier dans le cas d'une spécificité égale.\n\n(module3, e15)\n\n- Exemple pour retraiter les images si on a de la place :\n```css\n@media screen and (max-width:600px) {\n  img {  max-width: 100%;\n  }\n}\n\n\n@media screen and (min-width:600px) {\n  .container { display: flex;\n    flex-wrap: wrap;\n\n  }\n\n```\n\n## @media dans du SCSS\n\nDans du SCSS on peut écrire des media queries directement dans un sélecteur, \nainsi la media query va s'appliquer au sélecteur qui la contient uniquement.\n```scss\n.element {\n      width: 100%;\n    \n\t\t @media screen and (min-width: 50rem) {\n        width: 50%;\n      }\n    }\n```    \n\n### Mixin pour les media queries\n\nPuisqu'on peut éparpiller nos media queries plutôt que de tout regrouper dans un gros bloc dur à lire et à maintenir, \non risque de se répéter dans l'écriture de ces multiples media queries. \n\nIl est donc intéressant de prévoir des mixins pour éviter les répétitions. \n\nOn peut utiliser le mot clé `@content` dans un mixin pour indiquer qu'on précisera le contenu au moment de l'utilisation. \n\nDéfinition de mixins : \n```scss\n@mixin small {\n      @media screen and (min-width: 50rem) {\n        @content;\n      }\n    }\n    \n@mixin medium {\n      @media screen and (min-width: 60rem) {\n        @content;\n      }\n    }\n    \n@mixin big {\n      @media screen and (min-width: 90rem) {\n        @content;\n      }\n    }\n```    \n\nUtilisation de ces mixins : \n```scss\n@use './chemin/vers/mixin';\n    \n    .element {\n      width: 100%;\n    \n      @include mixin.small {\n        width: calc(50% - 1rem);\n      }\n    \n      @include mixin.medium {\n        width: calc(25% - 0.5rem);\n      }\n    }
2511\n```\n\nEn Scss : \n\n\nDéfinition de mixins : \n```scss\n    @mixin small {\n      @media screen and (min-width: 50rem) {\n        @content;\n      }\n    }\n    \n    @mixin medium {\n      @media screen and (min-width: 60rem) {\n        @content;\n      }\n    }\n    \n    @mixin big {\n      @media screen and (min-width: 90rem) {\n        @content;\n      }\n    }\n```    \n\nUtilisation de ces mixins : \n```scss\n    @use './chemin/vers/mixin';\n    \n    .element {\n      width: 100%;\n    \n      @include mixin.small {\n        width: calc(50% - 1rem);\n      }\n    \n      @include mixin.medium {\n        width: calc(25% - 0.5rem);\n      }\n    }\n```\n","tags":"$:/code/css","title":"$:/code/css/@media","modified":"20241018180947169","type":"text/markdown","origine":"Session 3 - E16"},
2512{"created":"20240828134016977","text":"[[https://developer.mozilla.org/fr/docs/Web/CSS/::after]]","tags":"","title":"$:/code/css/after","modified":"20240828134124295"},
2513{"created":"20240617161850082","text":"* Gestion de la transparence\n```css\n\u003C!-- // parent alpha = 0.5 -->\n  background-color: \nrgba(0, 0, 255, 0.5);\n\n```\n\n* Gestion des dégradés\n\n\n```css\n\n\u003C!-- //  background-color: #3d2075; -->\n        background: linear-gradient(to bottom right, #b968c9, 5%, #48217A, #0F1A63);\n\n\n```","tags":"","title":"$:/code/css/background","modified":"20240618070926128"},
2514{"created":"20240617180101012","text":"```css\n\nborder-bottom: 1px solid white;\n\n```","tags":"","title":"$:/code/css/border","modified":"20240617180141245"},
2515{"created":"20240618071050053","text":"\n**Flexbox** permet de positionner simplement les éléments de manière linéaire, soit horizontalement, soit verticalement. Il est très utile pour positionner des éléments dans une barre de navigation, ou pour aligner des éléments dans un formulaire.\n\nMais lorsqu'on cherche à positionner plusieurs éléments de manière plus fine, il est préférable d'utiliser **Grid**.\n\n\n\n**Grid** est une propriété CSS qui permet de positionner les éléments de manière plus fine que **Flexbox**. Il permet de positionner les éléments de manière bidimensionnelle, c'est-à-dire à la fois horizontalement et verticalement.\n\n\n\n\n[[flexbox|https://developer.mozilla.org/fr/docs/Web/CSS/CSS_flexible_box_layout/Typical_use_cases_of_flexbox]]","tags":"","title":"$:/code/css/display/flex","modified":"20241018180840197","type":"text/markdown"},
2516{"created":"20240918074141484","text":"__overflow__\n\nLa propriété CSS `overflow` est une propriété raccourcie qui définit comment gérer le dépassement du contenu d'un élément dans son bloc. Elle définit les valeurs des propriétés overflow-x et overflow-y.\n\nElle permet de supprimer les ascenseurs, avec la propriete: `hidden`.\n\n```css\noverflow: hidden;\n```\n\nvoir aussi **box-sizing**\n\n__box-sizing__\nThe box-sizing CSS property sets how the total width and height of an element is calculated.\n\nOn peut également supprimer les asensceurs avec :\n\n```css\n box-sizing: border-box;\n```","tags":"","title":"$:/code/css/overflow","modified":"20240918075240482","type":"text/markdown"},
2517{"created":"20240617151330529","text":"* [[https://vwkd.github.io/reset.css/]]\n* [[https://meyerweb.com/eric/tools/css/reset/reset200802.css]]","tags":"$:/code/css","title":"$:/code/css/reset.css","modified":"20240913100541835"},
2518{"created":"20240617140139524","text":"\n* Exemple de fichier index.scss\n\n```css\n\n@use 'reset-css';\n@use 'global.scss';\n\n@use 'global.scss';\n@use 'var'; \n@use './components/_page.scss';\n\n\n```\n\n\n* Exemple de fichier  _vars.scss \n\n```css\n\n$color--gradient: linear-gradient(to right bottom, #48217A, #0F1A63);\n$color-text: rgba(255, 255, 255, .8);\n$color-quote: white;\n$color-action: #c96894; \n\n$color--article : #007bff;\n$color--article--hover : #0056b3;\n$color--article-boder : #eaeaea;\n$color--background : #f9f9f9 ;\n$color--category--work : #0766f0;\n$color--category--team : #dc5E53;\n$color--category--news : #98dc62;\n\n@use 'sass:color';\n$color: #005c56;\n$color--survol: color.scale($color, $lightness: 25%,  $saturation: 25%) ;
2518\n$color--sature: color.scale($color, $saturation: 25%) ;\n\n$--color-background:  #3d2075;\n//    pour une exploitation du type :\n///  background-color: vars(--color-background);\n\n```\n\n* Exemple de composant .scss sur mesure (code complet des balises semantiques)\n\n\n```css\n// fichier _page.scss\n\n```\n\n\n* exemple de fichier scss qui fonctionne avec parcel transformer-sass  et react (dominante de vert)\n\n```css\n@import url('https://fonts.googleapis.com/css2?family=Ysabeau:ital,wght@0,100;0,400;0,500;0,700;1,100;1,400;1,500;1,700&display=swap');\n\nbody {\n    background-color: #367875;\n    color: #000000;\n    margin-top: 2em;\n    font-family: 'Ysabeau', cursive;\n    color: #00423d;\n}\n\n.container {\n    background-color: #6ac8c381;\n    width: 75%;\n    padding: 1em;\n    margin: auto;\n    border-radius: 10px;\n    box-shadow: 0px 0px 10px 0px #000000;\n}\n\nh1 {\n    font-weight: bold;\n    padding-bottom: 0.5em;\n    text-align: center;\n    border-bottom: 1px solid #00544e48;\n    margin: 0;\n    font-size: 2.5rem;\n}\n\np{\n    font-size: 1.6rem;\n    font-weight: 500;\n}\n\n```","tags":"","title":"$:/code/css/scss/index.scss","modified":"20240914133518507"},
2519{"created":"20240919195945153","text":"__Spinner__\n\n* [[spin.js|https://github.com/fgnass/spin.js/tree/master]]\n* [[Spinkit|https://github.com/tobiasahlin/SpinKit]] - utiliser dans le plugin [[splashscreen|$:/plugins/xp/splashscreen]] de tiddlywiki.js\n\n\n__autres spinner__\n\n[[https://codepen.io/vinztt/pen/XjEyvZ]]\n\n```css\n*\n{\n    -webkit-box-sizing: border-box;\n       -moz-box-sizing: border-box;\n            box-sizing: border-box;\n}\n\nbody{\n  background-color: #192935;\n}\n\n.wrapper\n{\n    position: absolute;\n    top: 50%;\n    left: 50%;\n\n   transform: translate(-50%, -50%);\n\n}\n\n.pokeball {\n  width: 60px;\n  height: 60px;\n  background-color: #fff;\n  border-radius: 50% ;\n  position: relative;\n  overflow: hidden;\n  border: 3px solid;\n  animation: frames .8s  linear 0s infinite;\n}\n\n.pokeball:after{\n  content: '';\n  position: absolute;\n  width: 60px;\n  height: 30px;\n  background-color: red;\n  border-bottom: 4px solid;\n  top: -4px\n}\n\n.pokeball:before{\n  content: '';\n  position: absolute;\n  background-color: #fff;\n  width: 10px;\n  height:10px;\n  border: 4px solid;\n  border-radius: 50%;\n  bottom: 18px;\n  right: 18px;\n  z-index: 1;\n}\n\n/* AnimationFrames */\n@keyframes frames{\n  0% {\n    transform: rotate(0deg);\n  }\n  100%{\n    transform: rotate(360deg);\n  }\n}\n```\n\n\n\n\n```html\n\u003Cdiv class=\"wrapper\">\n  \u003Cdiv class=\"pokeball\">\n  \u003C/div>\n\u003C/div>\n\n```\n\npour nodes\n```js\nimport './style.scss';\n\nconst Spinner = () =>  {\n    return (   \n    \u003Cdiv className=\"wrapper\">\n        \u003Cdiv className=\"pokeball\">\n        \u003C/div>\n    \u003C/div>\n\n    );\n}\n\nexport default Spinner;\n```\npour implementer avec react\n\n```js\nimport Spinner from '../Spinner';\n\nconst App = () =>  {\n\n    const [isLoading, setIsLoading] = useState(false)\n\n\t//....\n\n\t  return (    \n        \u003C>\n\n\t\t\t\n            \u003CSortFields setPokemons={setPokemons} setIsLoading={setIsLoading} />\n\n\t\t\t//\n  { isLoading && \u003CSpinner /> }\n  { !isLoading && \n                \u003Cdiv className=\"cards-list\">\n                      \u003C/div>\n            }\n        \u003C/>\n\n```\n\n[[https://codepen.io/th3s4mur41/pen/poXLvPR]]\n\n```html\n\u003Cdiv class=\"loading\">\u003C/div>\n```\n\n```css\n/* Configuration */\n\n:root {\n\t--spinner-size: 150px;\n\t--spinner-ring-size: 10px;\n\t--spinner-speed: 1.5;\n\t--accent-color: #3498db;\n}\n\n/* Styles */\n\n@property --spinner-start-angle {\n\tsyntax: '\u003Cangle>';\n\tinherits: false;\n\tinitial-value: 0deg;\n}\n@property --spinner-end-angle {\n\tsyntax: '\u003Cangle>';\n\tinherits: false;\n\tinitial-value: 360deg;\n}\n\n/* Thanks to @bramus for helping fix the deprecated fallback: https://x.com/bramus/status/1826608392821244227 */\n@property --property-zero {\n\tsyntax: '\u003Cnumber>';\n\tinherits: false;\n\tinitial-value: 0;\n}\n\n\n.loading {\n\t--_size: var(--spinner-size, 2em);
2519\n\t--_ring-size: var(--spinner-ring-size, calc(var(--_size) / 10));\n\t--_duration: calc(2s / var(--spinner-speed, 1));\n\tbox-sizing: border-box;\n\t\n  width: var(--_size);\n  height: var(--_size);\n\tmargin-inline: 1em;\n  border-radius: 100vmax;\n\tbackground: \n\t\t  conic-gradient(transparent 0deg, transparent var(--spinner-start-angle), var(--accent-color) var(--spinner-start-angle), var(--accent-color) var(--spinner-end-angle), transparent var(--spinner-end-angle));\t\t\n\tmask-image: radial-gradient(transparent calc(var(--_size) / 2 - var(--_ring-size) - 1px), black calc(var(--_size) / 2 - var(--_ring-size)));\n\tanimation: spinner calc(var(--_duration) / 0.6) ease-in-out infinite, spin var(--_duration) linear infinite;\n\t\n\t/* remove border if @property is supported */\n\tborder: var(--property-zero, var(--_ring-size)) solid color-mix(in hsl, currentcolor 10%, transparent);\n  border-top: var(--property-zero, var(--_ring-size)) solid var(--accent-color);\n\t\n\t\n}\n\n@keyframes spin {\n  0% { transform: rotate(0deg); }\n  100% { transform: rotate(360deg); }\n}\n\n@keyframes spinner {\n  0% {\n    --spinner-start-angle: 0deg;\n    --spinner-end-angle: 10deg;\n  }\n  50% {\n    --spinner-start-angle: 35deg;\n    --spinner-end-angle: 315deg;\n  }\n  100% {\n    --spinner-start-angle: 350deg;\n    --spinner-end-angle: 360deg;\n  }\n}\n\n/* Global */\nbody {\n\tbackground-color: white;\n\t\n\t\n\t@media (prefers-color-scheme: dark) {\n\t\tbackground-color: #222;\n\t}\n}\n\nvoir egalement \navec pug : [[https://pugjs.org/api/getting-started.html]]\n\n[[https://codepen.io/jkantner/pen/abgXPWG]]","tags":"$:/code/html $:/doc/react $:/code/js","title":"$:/code/css/spinner","modified":"20240926140915438","type":"text/markdown"},
2520{"created":"20240829091238553","text":"```css\n.sr-only {\n\tborder: 0 !important;\n\tclip: rect(1px, 1px, 1px, 1px) !important; \n\t-webkit-clip-path: inset(50%) !important;\n\tclip-path: inset(50%) !important;  \n\theight: 1px !important;\n\tmargin: -1px !important;\n\toverflow: hidden !important;\n\tpadding: 0 !important;\n\tposition: absolute !important;\n\twidth: 1px !important;\n\twhite-space: nowrap !important;    \n\n}\n\n```\nsource: [[https://gist.github.com/ffoodd/000b59f431e3e64e4ce1a24d5bb36034]]\n\nCette classe peut avoir plusieurs noms selon les contextes :\n\n* sr-only (boostrap)\n* element-invisible (drupal)\n* screen-reader-text (wordpress)\n\nvoir aussi : [[$:/code/css/sr-only-focusable]]\n\n* visually-hidden\n* mask ...\n\n\n```css\n.sr-only {\n    position: absolute;\n    width: 1px;\n    height: 1px;\n    padding: 0;\n    margin: -1px;\n    overflow: hidden;\n    clip: rect(0,0,0,0);\n    border: 0;\n}\n```","tags":"","title":"$:/code/css/sr-only","modified":"20240902123613047"},
2521{"created":"20240829091449336","text":"source: [[https://gist.github.com/ffoodd/000b59f431e3e64e4ce1a24d5bb36034]]\n```css\n.sr-only-focusable:focus,\n.sr-only-focusable:active {\n\tclip: auto !important;\n\t-webkit-clip-path: none !important;\n\t\tclip-path: none !important;\n\theight: auto !important;\n\tmargin: auto !important;\n\toverflow: visible !important;\n\twidth: auto !important;\n\twhite-space: normal !important;\n\n}\n```","tags":"","title":"$:/code/css/sr-only-focusable","modified":"20240911210038090","type":"text/markdown"},
2522{"created":"20240912075925400","text":"\n```js\n.repo:hover {\n    box-shadow: 0 15px 10px rgba(0, 0, 0, 0.384);\n    transform: translateY(-5px);\n    transition: all 0.3s ease-in-out;\n    -webkit-transform:;\n    -moz-transform:;\n    -ms-transform:;\n    -o-transform:;\n}\n```","tags":"","title":"$:/code/css/transform","modified":"20240912080026735"},
2523{"created":"20240829155851745","text":"```css\n:root {\n  --blue: #1e90ff;\n  --white: #ffffff;\n}\n\nbody { background-color: var(--blue); }\n\nh2 { border-bottom: 2px solid var(--blue); }\n\n.container {\n  color: var(--blue);\n  background-color: var(--white);\n  padding: 15px;\n}\n\nbutton {\n  background-color: var(--white);\n  color: var(--blue);\n  border: 1px solid var(--blue);\n  padding: 5px;\n}\n\n```\n\nPour créer une variable CSS avec un périmètre global, il faut la déclarier à l'intérieur d'un selecteur `:root`\n\nPour créer une variable avec un périmètre locla, il faut la déclarer à l'intéreur du selecteur qui va être utilisé.","title":"$:/code/css/variables","modified":"20240913100601252","tags":"$:/code/css"},
2524{"created":"20240905072708803","text":"La technique qui permet de masquer un élément à tout le monde (y compris le clavier et les technologies d'assistance) est une technique css avec l'attribut `visibilty:hidden`.\n\nIl ne faut pas confondre avec :\n* `Display: none;`\n* `Aria-hidden=\"true\"`\n* `Tabindex=\"-1\"`\n\n\n`display: none;
2524` est une propriété CSS qui :\n  * Cache complètement l'élément de la page\n* Supprime l'élément du flux du document\n* L'élément n'occupe plus d'espace dans la mise en page\n* L'élément et son contenu ne sont pas accessibles aux technologies d'assistance.\n\n*Utilisations courantes* :\n* Masquer temporairement du contenu\n* Créer des interfaces dynamiques\nImplémenter des systèmes d'onglets ou d'accordéons\n\n`aria-hidden=\"true\"`\nCet attribut ARIA :\n* Indique aux technologies d'assistance d'ignorer l'élément\n* N'affecte pas l'affichage visuel de l'élément\n\nil est utile pour les éléments décoratifs ou redondants\n\n*Utilisations courantes* :\n* Masquer des icônes décoratives aux lecteurs d'écran\n* Cacher du contenu dupliqué pour l'accessibilité.\n\n`tabindex=\"-1\"`\nCet attribut HTML :\n* Retire l'élément de l'ordre de navigation par tabulation\nL'élément reste focusable par JavaScript ou par clic\n* N'affecte pas l'affichage visuel\n\n*Utilisations courantes :*\n* Contrôler l'ordre de navigation au clavier\n* Rendre des éléments non-interactifs focusables programmatiquement\n\nEn combinant ces attributs, on peut créer des interfaces complexes tout en maintenant une bonne accessibilité. Par exemple :\n\n```html\n\u003Cdiv aria-hidden=\"true\" tabindex=\"-1\" style=\"display: none;\">\n  Contenu caché visuellement et pour l'accessibilité\n\u003C/div>\n\n```\n---\n\nLa propriété CSS `outline: none` est utilisée pour supprimer le contour visuel qui apparaît généralement autour des éléments lorsqu'ils reçoivent le focus.","tags":"","title":"$:/code/css/visibility:hidden","modified":"20240925093847213","type":"text/markdown"},
2525{"created":"20241011130643722","text":"\n\u003Cdetails> \n\u003Csummary>\nInstallation de Docker\n\u003C/summary>\n\n### Installation logicielle de Docker et Docker compose\n\nPour savoir comment installer Docker sur la VM Ubuntu, rien de mieux que d'aller lire la documentation officielle.\n\n➡️ \u003Chttps://docs.docker.com/engine/install/ubuntu/>\n\n[[https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository]]\n\nVoici ici les commandes regroupées : \n\n```bash\n# Add Docker's official GPG key:\nsudo apt-get update\nsudo apt-get install ca-certificates curl gnupg\nsudo install -m 0755 -d /etc/apt/keyrings\ncurl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg\nsudo chmod a+r /etc/apt/keyrings/docker.gpg\n\n# Add the repository to Apt sources:\necho \\\n  \"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \\\n  $(. /etc/os-release && echo \"$VERSION_CODENAME\") stable\" | \\\n  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null\n\nsudo apt-get update\n\nsudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin\n```\nExeemple :\ndocker run hello_world : Crée et exécute un conteneur avec l'image hello_world.\n\ndocker run --name hello_docker hello_world : Crée et exécute un conteneur avec l'image hello_world, tout en nommant le conteneur hello_docker.\n\nLes autres commandes ne sont pas valides :\n\ndocker run --rm hello_world : La commande est valide pour créer un conteneur, mais ici, l'option --rm indique de supprimer le conteneur une fois qu'il s'arrête.\n\n\n### Utilisation de Docker sans sudo\n\nSi nous voulons pouvoir utiliser Docker dans le terminal, sans devoir à chaque fois préfixer nos lignes avec `sudo`, voici les commandes à exécuter : \n\n```sh\n# Utilisation de docker sans sudo\nsudo groupadd docker\nsudo usermod -aG docker $USER\n```\n\n➡️ Source : \u003Chttps://docs.docker.com/engine/install/linux-postinstall/#manage-docker-as-a-non-root-user>\n\n⚠️ *Ne pas oublier de reboot la VM Ubuntu !*\n\n### Test de fonctionnement\n\nLançons une commande pour vérifier que Docker fonctionne : `docker run hello-world`\n\nCette commande lance la génération d'une image de conteneur, intitulée *hello-world*.\n\n### Désinstallation de Docker et Docker Compose\n\n➡️ [dockers docs - uninstall docker engine](https://docs.docker.com/engine/install/ubuntu/#uninstall-docker-engine)\n\n\u003C/details>\n\n## Les commandes de Docker\n\n### Gérer les conteneurs : \n\n#### __Générer un conteneur à partir d'une image__ :\n\n-   `docker run nom_image` : génère un conteneur à partir d'une image nommée *nom-image* puis l'éteint une fois l'exécution terminée\n-   `docker run --rm nom_image` : génère un conteneur à partir d'une image nommée *nom-image*, l'éteint une fois l'exécution terminée puis le supprime\n-   `docker run --name hello_docker nom_image` : l'option --name permet de donner un nom à notre c
2525onteneur\n\n```\ndocker run --rm ubuntu:latest cat /etc/os-release\n\n// -d en tache de fond\ndocker run --rm -d ubuntu:latest cat /etc/os-release\n\n```\n\n```\n// -di lancement durable en tache de fond\ndocker run --rm -di ubuntu:latest /bin/bash\n\n// lancement de commande avec une image d'ubuntu du nom de jolly_goodal \ndocker exec -it jolly_goodall bash\n```\n\n```\n// avec -ti , le contenur est de suite dans le terminal, pas besoin d'exec mais des qu'on en sort, il est supprimé\ndocker run --rm -ti ubuntu:latest /bin/bash\n```\n\n[Documentation Docker - run](https://docs.docker.com/engine/reference/commandline/run/)\n\n#### __Lister les conteneurs__\n\n-   `docker ps` : visualise les conteneurs actifs sur notre système\n-   `docker ps -a` : visualise les conteneurs actifs et inactifs sur notre système\n-   `docker ps -aq` :  permet de récupérer les ids des conteneurs existants (actifs ou non)\n\n[Documentation Docker - ps](https://docs.docker.com/engine/reference/commandline/ps/)\n\n#### __Eteindre un conteneur__\n\n-   `docker stop id-conteneur` ou `docker stop non-conteneur` : stoppe l'exécution du conteneur actif pointé\n\n[Documentation Docker - stop](https://docs.docker.com/engine/reference/commandline/stop/)\n\n#### __Activer un conteneur__\n\n-   `docker start id-conteneur` ou `docker start non-conteneur` : active l'exécution du conteneur inactif pointé\n\n[Documentation Docker - start](https://docs.docker.com/engine/reference/commandline/start/)\n\n#### __Supprimer un conteneur__\n\n-   `docker rm id-conteneur` ou `docker rm nom-conteneur` : supprime le conteneur pointé\n-   `docker rm -f $(docker ps -aq)` :  supprime tous les conteneurs actifs ET inactifs\n\n'''\ndocker run --rm ubuntu:latest cat /etc/os-release\n// stock les infos du conteneur dans un fichier\n'''\n[Documentation Docker - rm](https://docs.docker.com/engine/reference/commandline/rm/)\n\n#### __Lorsqu'on veut faire le gros ménage__\n\n- `docker system prune` : pour effacer tout ce qui sert à rien (ça fait un reset)\n- `docker system prune -a` :  pour tout effacer\n\n### Gérer les images\n\n#### Construire une image\n\nDocker est capable de construire une image à partir d'un script. Ce script peut être contenu dans un fichier stocké localement, dans le cas où nous voulons créer nos propres images.\nUne fois le Dockerfile créé et pour en faire une image prête à l'emploi, il faut taper la commande suivante : \n-   `docker build .`\n  avec les options -t nom_image, pour lui attribuer un nom\n\n```\ndocker build . --no-cache -t testing-docker\n```\n\nPuis on tape cette commande \n\n```\ndocker run --rm -p 3001:3000 testing-docker\n```\n 3001 correspond au port de notre système, le second est celui de docker.\n\nEnfin, on tape cette commande ```\ndocker run --rm -p 3002:3000 testing-docker alt.json\n```\nCela génère un n
2525ouveau conteneur, avec une API qui a une autre source de données.\n\n#### Lister les images disponibles\n\nPour savoir quelles sont les images disponibles localement, il suffit de taper la commande : \n-   `docker image list` ou `docker image ls`\n\n#### Supprimer une image\n\n-  `docker image rm nom_image` ou `docker rmi nom_image`\n\n#### Configurer docker pour  qu'il démarre automtiquement \n\n```\nsudo systemctl start docker et sudo systemctl enable docker\n```\nDémarre Docker et le configure pour qu’il démarre automatiquement au démarrage du système.\n\nInstaller une image de lynk, récuperer le résultat de la consultation d'un site et l'afficher :\n\n```\ndocker run --rm alpine/lynx lynx -dump \"http://www.google.com\"\n```\n\ndocker run --rm -di alpine/lynx /bin/bash\n\n\n### Pour aller plus loin : [documentation Docker - commandes cli](https://docs.docker.com/engine/reference/commandline/cli/)\n\n","tags":"$:/code/docker","title":"$:/code/docker","modified":"20241018081732815","type":"text/markdown","icon":"$:/img/ico/docker.svg"},
2526{"created":"20241014095633331","text":"## Créer des environnements complets avec Docker Compose\n\n\nLa mise en place de l'environnement de développement ne devrait pas être long à mettre en place pour un nouvel arrivant dans l'équipe. \nEt pourtant, la disparité des environnements a fait que souvent, on perdait du temps rien qu'à installer un projet sur une nouvelle machine.\n\nC'est pour cela qu'on a défini quelques règles. L'environnement devrait être : \n\n- **Indépendant** de l'hôte, car un dev ne choisit pas toujours la machine sur laquelle il travaille ni son O.S.\n- **Isolé**, pour pouvoir travailler avec plusieurs outils et différentes versions sur différents projets.\n- **Reproduisible**, pour que tous les membres de l'équipe aient le même.\n- **Souple** mais **fiable** et **performant**, pour coller aux besoins du travail quotidien sans être une contrainte.\n\n➡️ Pour répondre à chacune de ces règles on utilise docker et Docker compose\n## Docker compose\n\n\nDocker-compose est une **architecture** multi services transformée en fichiers, chargée et manipulée à l'aide d'une super commande `docker compose`.\n\nLes fichiers décrivant l'architecture sont ajoutés directement dans le projet. Le tout peut se lancer facilement sur tous les postes de l'équipe, quel que soit l'hôte.\n\n▶️ **Indépendance** et **Reproductibilité**\n\nLes dépendances / versions des outils sont liés aux projets directement donc on peut rajouter très simplement, sans impact sur l'hôte, un nouvel outil ou changer même de version.\n\n▶️ **Isolation**\n\n### Vocabulaire\n\nLa séance précédente, nous avons vu ce que sont : \n- une **image** : Une structure qui décrit un service et son environnement (O.S., dossiers, configuration...).\n- un **conteneur** : Un programme (par ex. PostgreSQL) qui tourne dans un environnement contrôlé. Le tout créé à partir d'une image.\n\nAvec Docker-compose, nous allons découvrir ce qu'est un **service** : une instance d'un \"programme outil\" (PHP, Nginx, PostgreSQL, Node, Crossbar...).\n\nEn résumé :\n\n> Un **service** est décrit par une **image**, et pour utiliser le **service** on crée un **conteneur** à partir de l'**image**.\n\n> Les **images** persistent tandis que les conteneurs peuvent être remplacés / redémarrés au besoin.\n\n### docker-compose.yml\n\n\u003Cfieldset>\nUn fichier Docker Compose est écrit en format YAML (YAML Ain't Markup Language). C'est un format lisible par l'homme, qui permet de définir des services, réseaux et volumes pour les applications Docker.\n\u003C/fieldset>\n\nC'est dans ce fichier que l'on déclare la liste des services, leurs paramétrages et leurs interdépendances.\n\nVoici un exemple de `docker-compose.yml` : \n```yaml\nversion: \"3.8\" # \u003C- Ligne optionnelle (le numéro de version pourra évoluer)\nservices: # \u003C- on va décrire la liste des services\n    bdd: # \u003C- Je déclare un service \"bdd\" pour... ma base de données #michelisable\n        # Ce qui suit est la \"configuration\" de ce service\n        image: \"postgres:12-alpine\"\n        ports:\n            - \"5432:5432\"\n        environment:\n            POSTGRES_PASSWORD: \"postgres\"\n            POSTGRES_USER: \"postgres\"\n    nodejs: # \u003C- Je déclare autre un service \"nodejs\"\n        build: ./docker/node\n        volumes:\n            - \".:/var/app\"\n        ports:\n            - \"3000:3000\"\n```\n\nTest de la BDD\n\n```\n//lancer le service bdd : \n    docker 
2526compose up bdd\n```\n\nDans une autre invit de commande :\n\n```    \n//entrer dans le terminal du conteneur/service \"bdd\" : \n    docker compose exec bdd sh\n    \n//lancer le CLI de postgresql\npsql -U pilori \n```\n\n```\ndocker compose down\n// Pour prendre en compte un script d'environnement, il faut prévilégier cette commande\n// sinon, attention docker compose stop arrête les contenuer mais ne les supprime pas\n\n```\n\n```\n// pour lancer un service\ndocker compose exec -it nodejs sh\n```\n\nLa commande `docker compose run` permet principalement de lancer des services et leurs réseaux\n\n \n#### __Les services__\n\nIl décrit deux services : `nodejs` et `bdd`.\n\nLe nom est libre, il sert de référence pour la commande `docker compose` et de **nom machine** pour les communications réseaux entre les différents services.\n\n*Donc si mon code dans mon service `nodejs` a besoin de se connecter au service `bdd`, la chaine de connexion ressemblera à `postgres://user@bdd/nomDeBase`\n\n\nLa commande `docker compose exec bdd sh` est utilisée pour se connecter au terminal du service `bdd`.\n\n#### __Les images__\n\nPour décrire un **service**, je dois utiliser une **image Docker** :\n\n```yaml\n...\nbdd: # \u003C- Je déclare un service \"bdd\" pour... ma base de données\n    image: \"postgres:12-alpine\" # \u003C- l'image à utiliser pour mon service\n    environment:\n        POSTGRES_PASSWORD: \"postgres\"\n        POSTGRES_USER: \"postgres\"\n```\n\nNous avons vu lors de la séance précédente que la communauté ou l'éditeur de chaque outil (NodeJS, PostGres, NGINX, Crossbar, Sentry)\nfournit une image officielle à utiliser. \n\nPar défaut, les **images** sont récupérées sur [Dockerhub](https://hub.docker.com). Leur documentation s'y trouve aussi. Mais les **images** peuvent aussi venir d'un **dockerfile** que nous aurons nous-même écrit.\n\nSur DockerHub, les **images** sont sous la forme `service:tag-option`, par ex : `postgres:12-alpine`.\n\n- **service** : Le nom du service en question (postgres dans l'exemple)\n- **tag** : Généralement la version du service (ici la v12)\n- **option** : Sert souvent à définir quel est le \"système de base\" de l'image. `alpine` fait référence à une distribution Linux ultra light (~5 Mo).\n\nLa liste des `tag-option` pour un service est disponible dans la documentation de l'image.\n\n#### __Le réseau__\n\nChaque service peut voir et communiquer avec les conteneurs correspondants aux autres services\n(si ils n'ont pas été isolés via l'option `networks`).\n\nOn peut aussi NAT (faire correspondre) un port d'un container avec un port de la machine hôte via l'option `ports`.\n\nExemple : \n\n```yaml\n...\nnodejs:\n    build: ./docker/node\n    ...\n    ports: # \u003C- Le routing des ports\n        - \"80:3000\"\n```\n\n*Dans cet exemple, les requêtes pour localhost:80 sont transférées sur le port 3000 du conteneur et les réponses iront du port 3000 du conteneur vers le port 80 de la machine hôte.*\n\n#### La configuration\n\nComment faire coller cette architecture à mes besoins ?\n\nDeux options s'offrent à moi.\n\n**1. Via les variables d'environnements** :\n\n```yaml\n...\n    bdd:\n        image: \"postgres:12-alpine\"\n        environment: # \u003C- section des variables d'environnements\n            POSTGRES_PASSWORD: \"0\"\n            POSTGRES_USER: \"postgres\"\n```\n\n*Ici on définit le superuser du service PostGres et son mot de passe*\n\nOn pourrait aussi utiliser l'option `env_file` et spécifier un fichier.\nC'est particulièrement utile lorsqu'on veut que plusieurs services partagent des variables d'environnements.\n\n**2. Via le partage de fichier** :\n\nDocker permet très facilement de partager un dossier (et ses fichiers) entre l'hôte et un conteneur.\n\nOn parle de \"monter\" (dans le sens de la commande `mount` Unix) des **volumes**.\n\nOn pourra ainsi :\n- Utiliser notre IDE pour écrire notre code dans la machine hôte et partager les fichiers avec un conteneur qui fait tourner Node\n- Enregistrer des fichiers de configuration (le fameux `pg_hba.conf` par exemple) dans notre projet et les charger directement\n- Sauvegarder l'état d'une base de données indépendamment de la vie du conteneur\n\nUn exemple : \n\n```yaml\n...\nnodejs:\n    build: ./docker/node\n    volumes:\n        - \".:/var/app\"\n```\n\n*On monte le dossier courant (.) de la machine hôte dans le dossier /var/app du conteneur*\n\n#### Pour en savoir plus : [La documentation](https://docs.docker.com/compose/compose-file/)\n\n### Utilisation de Docker 
2526compose en LDC\n\nIl y a **1** commande avec des sous commandes simples (comme pour `git`) :\n\nLes commandes `docker compose` sont à exécuter dans le dossier du fichier `docker-compose.yml`.\n\n```bash\ndocker compose up # Lance toute l'architecture (tous les services (créé et lance les containers)), interruptible avec Ctrl-c\ndocker compose up --build # Idem en forçant le rebuild des images locale\ndocker compose up --detach # Détache l'éxécution de la console courante\ndocker compose up nodejs # Ne lance que le service nodejs\n```\n```bash\ndocker compose down # Coupe tous les services et supprime les containers\n```\n```bash\ndocker compose exec nomservice sh # Ouvre un terminal dans le service\ndocker compose exec nodejs sh # Lance un term. dans le container nodejs\n```\n```bash\ndocker compose logs nomservice # Affiche les logs du service\ndocker compose logs -f nodejs # Affiche la sortie du container nodejs\n```\n\n### Se connecter à un service\n\n#### Via le réseau\n\nSi je dispose de `psql` sur mon hôte ou d'un connecteur adapté, je peux utiliser le routage NAT :\n\n```bash\npsql -h localhost -p 5432 -U postgres\n```\n\n#### Connexion directe au conteneur\n\nOn peut se connecter à l'environnement d'un conteneur via la commande :\n\n```bash\ndocker compose exec bdd sh\n# On lance un shell (commande sh) dans le service \"bdd\"\n```\n\nUne fois \"connecté\" dans l'environnement on peut utiliser tous les outils en place.\n\nPar exemple : \n\n```bash\npsql -U postgres\n```\n\n##  Images personnalisées pour Docker Compose\n\nEn général les services applicatifs (ceux qui contiendront notre code) ont besoin d'un peu plus de personnalisation.\nPour ça, on peut créer nos propres images, comme nous l'avons vu lors de la séance précédente.\n\n*Rappel : Une image c'est un fichier `Dockerfile` qui a été **build**.*\n\nPour utiliser une image personnalisée dans une architecture, on dispose de deux possibilités : \n\n- Soit on la **build** et on la met à disposition sur un \"registry\" comme [hub.docker.com](https://hub.docker.com).\nC'est comme ça que l'on fonctionnera en production.\n- Soit on indique le chemin vers le fichier `Dockerfile` (ou son dossier parent) dans notre `docker-compose.yml`. Ce que nous ferons en développement.\n\nDans le second cas, on va utiliser l'instruction `build` dans le docker-compose.yml pour indiquer **le dossier contenant** le `Dockerfile`.\n\n```yaml\n...\nnodejs:\n    build: ./.compose/node # \u003C- Au lieu de donner le nom d'une image, j'indique le chemin du Dockerfile à build\n    volumes:\n        - \".:/var/app\"\n    ports:\n        - \"80:3000\"\n```\n\n### Exemple de Dockerfile pour une app générique de dev Node : \n\n`./.compose/node`\n```docker\nFROM node:lts-alpine\n\nRUN mkdir -p /var/app &&\\\n    npm install -g nodemon\n\nVOLUME /var/app\nEXPOSE 3000\n\nWORKDIR /var/app\nCMD npm run dev\n```\nRappels : \n> - On part **toujours** d'une image pré existante avec `FROM`.\n> - On éxécute une série de commande avec des `RUN` pour installer des dépendances globales, créer des fichiers / dossiers...\n> - On définit les points de montage avec `VOLUME` et les ports qui seront accessibles avec `EXPOSE`.\n> - On définit la commande qui sera éxécutée par le container avec `CMD` et le dossier d'éxécution avec `WORKDIR`. \n>\n> *Ces deux commandes peuvent être surchargées avec `command` et `working_dir`, directement\ndans le docker-compose.yml.*\n\n### L'astuce `sleep inf`\n\nSouvent, pour les conteneurs applicatifs, on ne veut pas que le conteneur lance une commande en permanence.\n\nOn préfère se connecter et lancer les commandes qui nous intéressent (`npm install`, `node --inspect main.js`) en fonction de notre besoin.\n\nPour ça, on donnera comme programme de lancement `sleep inf` qui fera... rien, pendant... longtemps.\n\n```dockerfile\n...\nRUN mkdir -p /var/app &&\\\n    npm install -g nodemon\n\nVOLUME /var/app\nEXPOSE 3000\n\nWORKDIR /var/app\nCMD sleep inf\n```\n\n## Docker Compose en production\n\n> Docker est de moins en moins utilisé en prod... mais de plus en plus en dev...\n\nEn fait, sous le terme \"Docker\", se cache plusieurs outils :\n\n- docker-compose\n- Un builder d'image\n- Un gestionnaire réseaux\n- Un système de partage de dossiers\n- Un système de création / lancement de conteneurs\n- ...\n\nEn production, on a surtout besoin de faire tourner des conteneurs et de gérer le réseau. Le reste est superflu...\n\nCependant les images \"build\" par Docker suivent une norme générique et peuvent être utilisées avec d'autres\nsystèmes de conteneurs !\n\nPour la production, on créera donc des images spécifiques, qui seront éxécutées sous la forme de conteneurs par nos serveurs de production et gérées par un orchestrateur, aussi en charge de la sécurité.\n\nEt comme Docker peut faire tourner ces images, on peut, depuis notre machine, tester notre c
2526ode, dans les conditions exactes de la production.\n\n[[https://mindsers.blog/fr/post/deployer-simplement-conteneur-docker-production/]]\n\n#### __Bonus : ajouter adminer__\n\n```\n    # BONUS : Service \"adminer\"\n    # Adminer est une application web faite pour visualiser graphiquement nos bases de données, et d'interagir avec elles\n    adminer:\n      image: adminer # on ira chercher l'image directement sur docker hub\n      ports:\n        - 8081:8080 # le port 8080 de la vm ubuntu est déjà pris par le service nodejs, donc on map le port du container adminer sur le port 8081\n      environment:\n        # connexion au service \"bdd\"\n        ADMINER_DEFAULT_SERVER: bdd\n      depends_on:\n        - bdd\n\n```\n\n#### __Autres exemples de docker compose__\n\n[[https://github.com/docker/awesome-compose/tree/master]]","tags":"$:/code/docker","title":"$:/code/docker/compose","modified":"20241018084312830","type":"text/markdown","icon":"$:/img/ico/docker.svg"},
2527{"created":"20241016111110406","text":"* exemple de fichier compose.yaml pour wordpress\n\nDans l'image Wordpress, on peut en déduire qu'il y aura une debian, apache2 et wordpress\n\n```json\n  wordpress:\n    image: wordpress\n    restart: always\n    ports:\n      - 8082:80\n    environment:\n      WORDPRESS_DB_HOST: mysql\n      WORDPRESS_DB_USER: wp_bd\n      WORDPRESS_DB_PASSWORD: wp_bd\n      WORDPRESS_DB_NAME: wp_bd\n    volumes:\n      - ./wp-sources:/var/www/html\n\n  mysql:\n    image: mysql:8.0\n    restart: always\n    environment:\n      MYSQL_DATABASE: wp_bd\n      MYSQL_USER: wp_bd\n      MYSQL_PASSWORD: wp_bd\n      MYSQL_RANDOM_ROOT_PASSWORD: '1'\n    volumes:\n      - ./mysql-datas:/var/lib/mysql\n\n  adminer:\n    image: adminer\n    restart: always\n    ports:\n      - 8081:8080\n````","tags":"$:/doc/wordpress","title":"$:/code/docker/compose/wordpress","modified":"20241017115733810"},
2528{"created":"20241018080752432","text":"\nUn Dockerfile sert principalement à créer une image. Voici un aperçu des options :\n\n\n* Créer une image :un Dockerfile est un script contenant une série d'instructions pour assembler une image Docker. Cette image peut ensuite être déployée comme un conteneur.\n\n\nUn Dockerfile ne crée pas directement un conteneur, mais il décrit comment créer une image Docker, et cette image peut ensuite être utilisée pour lancer des conteneurs.\n\n\n\n un Dockerfile ne crée pas de machines virtuelles. Docker utilise des conteneurs, qui sont plus légers et plus rapides que les machines virtuelles.\n\n\nSur Dockerhub, on peux trouver des images Docker. \n\nDockerhub est un registre où les développeurs peuvent partager et accéder à des images Docker prêtes à l'emploi. ","tags":"$:/code/docker","title":"$:/code/docker/dockerfile","modified":"20241018081313717"},
2529{"created":"20241014141947041","text":"remove all extra spaces with : `%s/\\s\\+$//e`\n","tags":"","title":"$:/code/expression régulère","modified":"20241014142032135"},
2530{"created":"20240530084722365","text":"\nExemple en __Javascript__ :\n\n```js\n\nconst increment = x => x++ ;\n\nconst increment = (x, 1) => x + 1 ;\n\nconst increment = (x, 1) => { \n    return x + 1 ;\n};\n\nconst increment = function(x, 1) => { \n    return x + 1 ;\n};\n\n//Tirage (preque) aléatoire d'entiers compris entre deux nombres \n\nconst getRandomInt = (min, max) {\n        return Math.floor(Math.random() * (max - min)) + min;\n      }\n```\n\nExemple en __Python__:\n\n```python\nincrement = lambda x: x + 1\n\n```\n\nExemple en __Vbscript__:\n\n```vb\nDim increment = Function(x) x + 1\n```\n","tags":"","title":"$:/code/fonctions/anonymes","modified":"20240618110058936"},
2531{"created":"20240530122513196","text":">  Un __''Callback''__ est une fonction qui devient elle-même argument d'une autre fonction\n\nLes callback sont très utilisés en __Javascript__ :\n\n```js\nsetInterval(arg1,arg2,arg3);\nsetTimeout(arg1, arg2,arg3);\n\n```","tags":"","title":"$:/code/fonctions/callback","modified":"20240530123812815"},
2532{"created":"20240530125453590","text":"> Une __''méthode''__ est une propriété d'un objet/prototype qui contient une fonction.\nIl existe des méthodes __statiques__ et des méthodes d'__instance__ (le passage d'arguments ne fonctionne pas pareil entre ces méthodes).\n\n''__Paramètres de fonction__''\nLes paramètres sont les variables listées entre parenthèses dans la définition de la fonction. Ils agissent comme des placeholders pour les valeurs qui seront passées à la fonction lors de son a
2532ppel. \nExemple:\njs\n\n```js\nfunction saluer(nom) { // 'nom' est un paramètre\n  console.log(`Bonjour ${nom}!`);\n}\n\n```\n\nLes paramètres permettent d'écrire des fonctions réutilisables et modulaires en acceptant des valeurs différentes à chaque appel.\n\n__''Arguments de fonction''__\n\nLes arguments sont les valeurs réelles passées à la fonction lors de son appel, et qui sont assignées aux paramètres correspondants. \nExemple:\n\n\n```js\nsaluer('Alice'); // 'Alice' est l'argument passé au paramètre 'nom'\n```\n\n\nIl est possible de passer plus d'arguments que de paramètres déclarés. Les arguments supplémentaires sont accessibles via l'objet arguments à l'intérieur de la fonction. \nIl est également possible de ne pas passer d'argument pour certains paramètres. Dans ce cas, le paramètre aura la valeur undefined à moins qu'une valeur par défaut ne soit spécifiée. \nEn résumé, les paramètres définissent les variables qui recevront les valeurs lors de l'appel de la fonction, tandis que les arguments sont les valeurs réelles passées à ces paramètres. Les paramètres agissent comme des placeholders dans la définition de la fonction, et les arguments sont les données concrètes fournies lors de l'exécution.","tags":"","title":"$:/code/fonctions/methode","modified":"20240618111414937"},
2533{"created":"20240530090244307","text":"Ce qu'on appelle __fonction pure__, c'est une fonction qui n'altère pas de données stockées dans les variables déclarées à l'extérieur (de la fonction). Si nécessaire, la fonction réassigne les données dans de nouvelles variables internes.\n\nOn fait une copie et pas une référence (voir le spread opérateur). On parle d'immutabilité\n\nExemple en __Javascript__ :\n\n```js\n// fonction en javscript avec un paramètre\nfunction FonctionAnonyme(param) {\n   console.log(param)\n};\n\n\n\n// Fonction avec une expression calculée avec deux paramètres  ayant un type string en sortie\nfunction GenererPseudo(FirstName, NumDistrict) {\n    return `${FirstName}-du-${NumDistrict}`\n}\n\n\n\n```\n\n\u003Cu> \u003Ch3> A quoi peut servir des fonctions ? \u003C/h3> \u003C/u>\n\n\n```js\n\n/**\n   * Give current hour\n   * @returns {number} The current hour\n*/\n\n  getHour: function() {\n    const date = new Date();\n    return date.getHours();\n  },\n\n\n/**\n * Met une classe sur le body si on est en mode dark, sinon la retire\n * @param {bool} isDark \n */\n function setDarkMode(isDark) {\n  if (isDark) {\n    document.body.classList.add('dark');\n  }\n  else {\n    document.body.classList.remove('dark');\n  }\n}\n\n\n/**\n * Cache le bouton de retour\n */\nfunction hideBtn() {\n  document.getElementById('back').remove();\n}\n\n\nfunction BonneLongueur(entree, longueur) {\n    if (entree.length > longueur) {\n           return true;  \n        }\n    return false ; \n}\n```","tags":"","title":"$:/code/fonctions/pures","modified":"20240910072347089","type":"text/markdown"},
2534{"created":"20240617123003685","text":"Créer une branche\n---\n\n```sh\ngit checkout -b implementation\n\n```\n\nMise à jour du dépot \n---\n\n```ksh\n\ngit add .\ngit commit -m \" Mise à jour du dépot\"\ngit push\n```\n\n* Pour annuler un git add\n\n```\ngit reset\n```\n\n* Mise en place d'un submodule\n\n```ksh\n\ngit submodule add https://github.com/O-clock-Ra/inte-pilori\n\n```\n* mise à jour du dépot submodule par exemple\n\n```ksh\n//git reset --hard\ngit pull origin master\n```\n```ksh\nvoir aussi git slash\n```\n\n\n* Gestion d'erreur sur l'index \n\n  * en cas d'erreur du type :\n\n```\nerror: bad signature 0x00000000\nfatal: index file corrupt\n```\n\nOn peut avoir plus d'info avec :\n\n```\ngit fsck --full\n\n```\n\n\nInstanciation d'un depot local \n---\n\n```\ngit init\n```\n\n\nContenu habituel du fichier `.gitignore` \n---\n\n```ksh\n.env\nnode_modules/\ndist\n.parcel-cache\n```\n\n* [[https://git-scm.com/docs/gitignore]]\n\n`.gitignore` : permet de lister des fichiers qui doivent être ignorés lors du add\n\n`.keep` : est un fichier qui peut être placé à la racine d’un répertoire vide afin que git prenne ce dossier en compte même s’il ne contient pas de fichier\n\n\nPousser un dépot existant sur git\n---\n\n```\ngit remote add origin https://github.com/\u003Creposexistant>.git\ngit branch -M main\ngit push -u origin main\n```\n\n\nCloner une branche spécifique d'un projet \n---\n\n```js\ngit clone \u003Curl.git> --branch \u003Cnon branch>\n\n```\n\n\n\nAccès Key SSH\n---\n\n- Lien vers le répertoire personnel de GIT montrant les clés déja existantes : https://github.com/settings/keys\n\n__Creation de la clé SSH__\n\n* [[Documentation git|https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent]]\n  \n* Création de la clé\n\n```\n# Attention à bien remplacer l'email par le votre ;)\nssh-keygen -t ed25519 -C \"[email protected]\"\n```\nRemarque : Il vous sera demandé d’inventer une passphrase, c’est-à-dire un mot de passe un peu costaud (qui peut carrément être une phrase, avec des espaces, des accents et tout). Cette passphrase n’est pas strictement obligatoire, elle peut être vide… mais il est fortement recommandé d’en choisir une. Par contre, il faut la retenir par cœur, si elle est perdue, la clé SSH est bonne à jeter !\n\nUne clé SSH se compose de deux parties, donc la commande ci dessus vous donnera :\n\nune clé privée dans /home/student/.ssh/id_ed25519 — pour protégér du contenu, à garder pour soi !\nune clé publique dans /home/student/.ssh/id_ed25519.pub — elle est capable de lire du contenu protégé par la clé privé\n\n* Aller chercher la clé public\n\n```\ncat ~/.ssh/id_ed25519.pub\n````\n\n* Copier la clé et aller dans github : Settings > SSH and GPG keys > New SSH key > Coller le contenu de la clé et valider\n\n\n\n* Activation de la clé SSH en local\n\nPour que la clé SSH soit utilisable, et aussi pour éviter d’avoir à donner sa passphrase à chaque utilisation, il faut ajouter la clé privée à un « trousseau de clé » (programme ssh-agent):\n\n  Donc sur la machine distante :\n```\neval \"$(ssh-agent -s)\"\n// Ajout de la clé publique\nssh-add ~/.ssh/id_ed25519\n````\nSi cette étape est oubliée, cela génère une erreurs du type « Permission denied (publickey) » lors de l’utilisation de Git & GitHub.\n\n* Vérifier la connexion\n\nconnexion SSH à github.com, en saisissant dans le terminal :\n\n```\nssh -T [email protected]\n```\nle terminal doit répondre avec le pseudo GitHub de l'utilisateur\n\nConfiguration local de Git :\n---\n\nPour modifier le nom affiché dans les commits :\n\n```\ngit config --global user.n
2534ame \"Bozo Le Clown\"\n```\n\nPour modifier l'email associé au commit (conseil : le même que celui du compte GitHub) :\n\n```\ngit config --global user.email \"[email protected]\"\n```\nChoix de l’éditeur de texte utilisé pour écrire les messages de commit :\n```\ngit config --global core.editor code # ou nano etc...\n```\nActivation des couleurs dans le résultat des commandes Git :\n\n```\ngit config --global color.ui true\n```\n\nPour vérifier le tout : \n```\ngit config -l\n```\nCette commande va afficher tous les réglages actifs de git.\n\nConsulter l’historique du repo local\n---\n\n* git log : voir l’historique de tous les commits de la branche actuelle\n* git log --oneline : idem en version synthétique\n* git log --graph : idem en version branches\n\n* Consulter ou se déplacer dans les commits\n  * git show hashDuCommit : montre les modifs dans un commit précis – hashDuCommit est les 7 premiers caractères de son identifiant (ex : 1fd88ar)\n  * git checkout hashDuCommit : permet de consulter la version hashDuCommit du projet /!\\ si on fait des modifs en version antérieure, elles seront perdues !\n  * git checkout master : revient sur la dernière version en date du projet sur cette branche !\nmaster = bout de la branche (le + récent) /!\\ avant un pull, l’origin/master n’est pas le même que notre master local si d’autres contributeurs ont ajouté des commits depuis notre dernier pull !\n  * git checkout HEAD nomDuFichier : annule localement tous les changements sur le fichier depuis le dernier commit\nHEAD = pointeur dans la branche (commit qu’on est en train de consulter : identique ou antérieur à master)\n  * Annuler un add + commit non pushé : git reset HEAD^\n  * Supprimer un commit ⚠ cela va supprimer vos modifications en local également:\n  * Revenir en local sur le dernier commit correcte : git reset --hard hashDuCommit\n  * Forcer cette version comme étant la dernière : git push -f\n\n* Branches\n  * git branch nomDeLaBranche : crée une nouvelle branche (nouvelle version du projet) identique à la version HEAD – permet de tester des développements (réparer un bug, expérimenter une nouvelle fonctionnalité…) et commiter sans affecter la branche principale\n  * git checkout nomDeLaBranche : bascule sur la branche nomDeLaBranche\n💡 git checkout -b nomDeLaBranche : permet de réaliser les deux opérations du dessus (création de la branche & migration sur celle-ci)\ngit merge nomDeLaBranche : rapatrie les commits de la branche ciblée sur ma branche actuelle ==> nécessite de résoudre les conflits !\n\nGestion de fichier\n---\n\n* git add [filename] : ajoute les modifications faites dans le fichier à l’index\n* git add ., alias, technique du bourrin : ajoute les modifs de tous les fichiers dans le dossier\n/!\\ à n’utiliser si on est sûr de n’avoir fait QUE des modifs liées au commit en cours !\n* git reset HEAD : annule les add déjà faits\n* git reset HEAD --hard : annule les modifications non commitées et revient au dernier commit – non réversible !\n* git commit [-m \"message de commit\"] : enregistre les modifs indexées dans le commit\n* git push : envoie tous les commits locaux sur le repo\n  \u003Cbr>`git push origin \u003Cyour_branch_name> --force`\n* git pull : récupère en local un projet depuis le repo, pour un projet déjà en cours (au contraire de clone qu’on utiliser uniquement pour un nouveau projet)\n* git restore . : permet d’annuler toutes les modifications effectuées sur les fichiers locaux\n* git rm --cached \u003Cfile(s)> : supprimer des fichiers suivis du repo qui auraient été ajoutés par erreur OU ajoutés dans le .gitignore par la suite (ne supprime pas le fichier lui-même en local, bien entendu, uniquement dans le dépôt).\n\n* En cas de suppression de votre dossier .git (cloné depuis github)\n\n```\ngit init\ngit remote add origin ssh@le/lien/vers/ton/repo.git\ngit add .\ngit commit -m \"on envoiiiie\"\ngit push origin --force master\n```\n\nEn cas de dépôt local corrompu\n---\n\nSi vous avez des messages du type : error: object file .git/objects/31/65329bb680e30595f242b7c4d8406ca63eeab0 is empty ou fatal: loose object 3165329bb680e30595f242b7c4d8406ca63eeab0 (stored 
2534in .git/objects/31/65329bb680e30595f242b7c4d8406ca63eeab0) is corrupt. C’est que votre dépôt local est corrompu. Voici la manoeuvre pour réparer :\n\n```\nfind .git/objects/ -type f -empty | xargs rm\ngit fetch -p\ngit fsck --full\n```\nSi cela ne suffit pas, faites :\n\n```\n git reflog\n```\n\nSi vous avez ce message fatal: bad object HEAD, faites :\n\n```\ntail -n 2 .git/logs/refs/heads/master\n```\nCela vous permet de récupérer l’id du dernier commit. Vous pouvez placer le HEAD dessus maintenant :\n```\ngit update-ref HEAD [à remplacer par l'id du dernier commit effectué]\n```\n\n* En cas de bêtise…\n Pour revenir sur nos commits une fois créés.\n\nVoici donc 2 ressources qui expliquent bien ces commandes, et dans quel cas les utiliser. \n\n* https://ohshitgit.com/fr (version originale)\n* https://dangitgit.com/fr (version + « élégante »)\n\n\n\n\nExploiter l'API git GitHub\n---\n\n* [[https://api.github.com/]]\n\n\n* projet à suivre :\n  * hugging face : \n[[https://github.com/huggingface/huggingface.js]]\n\n* Git Hub Action","tags":"","title":"$:/code/git","modified":"20241021114257301","type":"text/markdown","icon":"$:/img/ico/git.svg"},
2535{"created":"20241010095220958","text":"\n  \n__Gestion de workflows__\n\n[[Documentation|https://docs.github.com/fr/actions/about-github-actions/understanding-github-actions]]\n\n\u003Cbr>\n\n🎯 Notre but ?\n\n\nNous cherchons à faire en sorte qu'à chaque fois que nous pushons notre code de notre dépôt local vers Github, cela déclenche un pull des modifications sur le dépot qui est en production, donc sur notre vm cloud.\n\n\u003Cbr>\n\n🛒 De quoi avons-nous besoin ?\n\n* un script à placer dans notre dépôt sur Github, dans le dossier .github/workflows/. Il sera formaté en YAML, et contiendra les instructions que Github Actions devra exécuter au moment où un push sera fait sur ce dépot.\n* de secrets. Les secrets, ce sont des constantes qu'on stocke au niveau des paramètres du dépôt sur Github. Ces constantes contiendront des valeurs qu'on veut absolument garder secrètes et dont on aura besoin pendant l'exécution du script. Dans ces secrets, nous placerons l'adresse de connexion SSH, l'utilisateur pour une connexion SSH, le port de connexion SSH et la clé publique pour se connecter en SSH.\n* la clé publique qu'on a créée quand on a voulu faire en sorte de pouvoir utiliser Git sur notre VM Cloud. Cette clé est contenue dans le fichier ~/.ssh/ssh-ed25519.pub. La clé publique sera stockée dans les secrets\n* l'adresse de connexion SSH ainsi que l'**utilisateur** de connexion. Nous avons tout cela sur la page Kourou \"administration de ta machine virtuelle\". Nous placerons aussi ces informations dans les secrets du dépôt.\n\n\u003Cbr>\n\n👓 Regardons de plus près ce script\n\n```\n# Simple libellé donné au workflow \nname: Deploy on prod\n\n# Détermine quand le script doit être exécuté\non:\n  push:\n    branches:\n    - master\n\n  workflow_dispatch:\n\n# Décrit ce qui doit être fait :\njobs:\n  deploy-pull-prod:\n    runs-on: ubuntu-latest\n    steps:\n      - name: create config\n        run: |\n          mkdir -p ~/.ssh/\n          echo \"$SSH_KEY\" > ~/.ssh/ssh-ed25519\n          chmod 600 ~/.ssh/ssh-ed25519\n          cat >>~/.ssh/config \u003C\u003CEND\n          Host prod\n            HostName $SSH_HOST\n            User $SSH_USER\n            Port $SSH_PORT\n            IdentityFile ~/.ssh/ssh-ed25519\n            StrictHostKeyChecking no\n          END\n        env:\n          SSH_USER: ${{ secrets.SSH_USER }}\n          SSH_KEY: ${{ secrets.SSH_KEY }}\n          SSH_HOST: ${{ secrets.SSH_ADDRESS }}\n          SSH_PORT: ${{ secrets.SSH_PORT }}\n      - name: connexion and pull\n        run: | \n          ssh prod 'cd /var/www/html/ofig && git pull origin master && exit'\n      \n```\n* Le nom qu'on donne à notre \"workflow\" sera Deploy on prod. Lui donner un nom nous permettra de le retrouver dans l'onglet Actions du dépôt, surtout si il y a plusieurs script\n* Le script se déclanchera quand :\n\nun push sera fait sur la branche master,\non le demandera manuellement, via l'interface de l'onglet Actions du dépôt\n* Le nom du premier job sera deploy-on-prod\n\n\n👣 Le Pas-à-Pas\n\nle workflow de Github Actions va devoir se connecter en SSH sur notre VM de production, notamment sur le port 22... Mais problème, notre VM de production n'a pas le port 22 ouvert, même lorsqu'elle est publique. Elle n'a que les ports 80, 443, 8443, 8080 d'ouverts. Que faire ? Nous pouvons déjà nous rendre dans notre terminal de VM de production, et modifier le fichier de configuration SSH.\n\nModifier le fichier de configuration SSH de notre VM de production\n---\n\n[[fr.linux-console.net - comment changer de port SSH sous linux|https://fr.linux-console.net/?p=392#gsc.tab=0]]\n\n* ouvrir le fichier /etc/ssh/sshd_config avec sudo et VScode\n\n* ajouter la ligne suivante : Port 8080 sous la ligne #Port 22\n\n* redémarrer la VM de production\n\nA ce stade, il faut changer les paramètre du client de connexion à la VM afin de pouvoir se connecter à nouveau à la VM de production.\n\n
2535Il faut modifier le fichier de paramétrage de ssh. en ajoutant le port adequate, ici 8080 :\n\n```\nHost \u003Cnom_host>\n   HostName \u003Cnom_host>\n   User \u003Cnom_du_user\n   Port 8080\n```\n\nCréation des secrets\n---\n\nLe script git aura besoin de données sensibles afin de pouvoir se connecter en SSH sur la VM de production. Ces données seront noramlement dans les secrets du dépôt GIT.\n\nour trouver où on gère les secrets, il faut aller dans l'onglet Settings du dépôt O'fig, puis dans le menu de gauche, cliquer sur Secrets and variables > Actions. Une fois rendu sur l'inteface, il faut cliquer sur le bouton vert new repository secret.\n\nLà, vous aurez deux champs, un pour le nom du secret, un autre pour la valeur à stocker.\n\nNous allons créer 4 secrets :\n\n* SSH_ADDRESS : contiendra l'adresse ssh de votre VM, par exemple : marion-oclock-server.eddi.cloud\n* SSH_USER : contiendra votre nom d'utilisateur, donc : student\n* SSH_PORT : contiendra le port de connexion ssh. Nous venons de le changer, ce n'est plus 22 mais 8080.\n* SSH_KEY : contiendra la clé privée que vous avez créé quand vous avez configuré Github pour votre VM de production. Elle se trouve dans un fichier qui devrait s'appeler : ~/.ssh/id_ed25519. Pour pouvoir visualiser dans le terminal la clé contenue à l'intérieur, tapez la commande suivante : cat ~/.ssh/id_ed25519 puis copier ce qui s'affiche afin de le coller dans le champ du secret SSH_KEY.\n\n* Ajout du script\nNous allons pouvoir enfin ajouter notre workflow, c'est à dire notre script qui va automatiser la mise à jour de notre site en production à chaque push.\n\nse rendre dans l'onglet Actions du dépôt sur Github\ncliquer sur le lien set up a workflow yourself. En effet, sur cette page, on vous propose des scripts tous faits, appelés aussi actions. Github propose même un markerplace pour trouver des actions scriptés par d'autres, et réutilisables. Ce n'est pas ce que nous avons prévu de faire car ils font bien plus que ce dont nous avons besoin et pas forcément comme nous en avons besoin.\n\nLe script final :\n\n```\nname: Deploy on prod\n\non:\n  push:\n    branches:\n    - master\n\n  workflow_dispatch:\n\njobs:\n  deploy-pull-prod:\n    runs-on: ubuntu-latest\n    steps:\n      - name: create config\n        run: |\n          mkdir -p ~/.ssh/\n          echo \"$SSH_KEY\" > ~/.ssh/ssh-ed25519\n          chmod 600 ~/.ssh/ssh-ed25519\n          cat >>~/.ssh/config \u003C\u003CEND\n          Host prod\n            HostName $SSH_HOST\n            User $SSH_USER\n            Port $SSH_PORT\n            IdentityFile ~/.ssh/ssh-ed25519\n            StrictHostKeyChecking no\n          END\n        env:\n          SSH_USER: ${{ secrets.SSH_USER }}\n          SSH_KEY: ${{ secrets.SSH_KEY }}\n          SSH_HOST: ${{ secrets.SSH_ADDRESS }}\n          SSH_PORT: ${{ secrets.SSH_PORT }}\n      \n      - name: connexion and pull\n        run: | \n          ssh prod 'cd /var/www/html/ofig && git pull origin master && exit'\n\n```\n\n⚠️ Attention aux espaces et aux retours à la ligne, le format YAML y est très sensible !\n\nenregistrer. Vous devriez avoir maintenant dans votre dépôt un nouveau fichier .github/workflows/main.yml\ndu coté de VScode, vous pouvez git pull cette mise à jour sur votre VM Windows\n\n* Tester le script\nOn peut tester le script pour vérifier si il plante, avant même de tenter de push des modifications sur notre site.\n\n1. se rendre dans l'onglet Actions du dépôt\n2. sélectionner dans la barre de gauche le workflow Deploy on prod\n3. cliquer sur le menu de droite Run workflow, puis sur le bouton vert Run workflow\n4. attendre.... jusqu'à ce que l'icone passe au rouge ou au vert !\n5. \n* Deploiement automatique\nMaintenant que nous avons fait toutes les manipulations, nous allons enfin pouvoir modifier notre site sur notre VM Windows, pusher vers Github, et voir automatiquement le code de notre site en production se mettre à jour !\n\n* Déploiement continu pour notre application\n\n [[documentation à propos du script 'ssh-deploy'|https://github.com/marketplace/actions/ssh-deploy]]","tags":"","title":"$:/code/git/actions","modified":"20241011071332943","type":"text/markdown","icon":"$:/img/ico/git.svg"},
2536{"created":"20241009064908294","text":"```\n#!/bin/bash\n#\n# Ce script BASH a pour but : \n#   - de générer une clé SSH pouvant servir par exemple d'identifiant de connexion pour utiliser Github (clone d'un dépôt, push d'un commit...)\n#   - de réaliser le paramètrage Git local (notamment pour que vos commits soient associés à votre compte Github)\n#\n# Pour créer votre clé SSH et configurer Git sur votre machine : \n# - créer un fichier generate-ssh-key-and-git-conf.bash sur le bureau du téléporteur\n# - y copier tout ce script et enregistrer le fichier\n# - lancer un terminal et accéder au bureau :\n#       cd ~/Bureau\n# - exécuter le script :\n#       bash generate-ssh-key-and-git-conf.bash\n#   /!\\ Ne pas utiliser \"sh generate-ssh-key-and-git-conf.bash\" car la syntaxe utilisée n'est pas compatible avec \"sh\"\n# - et suivre les instructions\n#\n\necho\necho \"Bienvenue sur ce script de configuration de Git & GitHub \u003C3\"\necho\necho \"Pour générer la clé SSH, tu as besoin de ton pseudo et email Github.\"\n\n# Récupération pseudo Github\npseudo=\"\"\nwhile [ -z $pseudo ]\ndo \n    echo\n    read -p \"  1. Quel est ton pseudo sur GitHub : \" pseudo\n    if [ -z  \"$pseudo\" ]\n    then\n        echo\n        echo \"Le pseudo doit être renseigné\"\n    fi\ndone\n\n# Récupération email Github\nemail=\"\"\nwhile [ -z $email ]\ndo \n    echo\n    read -p \"  2. Quel est l'email que tu as renseigné dans ton compte GitHub : \" email\n    if [ -z \"$email\" ]\n    then\n        echo\n        echo \"L'email doit être renseigné\"\n    fi\ndone\n\n# Vérification des informations saisies\necho\necho \"    Pseudo : $pseudo\"\necho \"    Email : $email\"\n\necho\nread -p \"  3. Ces informations sont-elles exactes ? (y/n) : \" confirm\n\nif [ \"$confirm\" != \"y\" ]\nthen\n    echo\n    echo \"    La clé n'a pas pu être générée. Veuillez relancer le script pour réessayer.\"\n    exit 0;\nelse\n    # Git config\n    echo\n    echo \"  4. Paramétrage Git\"\n    echo\n    git config --global user.name \"$pseudo\"\n    git config --global user.email \"$email\"\n    git config --global core.editor nano\n    git config --global color.ui true\n    git config -l\n\n    # Création de la clé SSH\n    echo\n    echo \"  5. Génération de la clé SSH\"\n    echo\n    ssh-keygen -t ed25519 -N '' -C \"$email\" -f ~/.ssh/id_ed25519 \u003C\u003C\u003C y\nfi\n\n# Vérification que le fichier 
2536contenant la clé existe bien\nif [ -f ~/.ssh/id_ed25519.pub ]\nthen\n    echo \n    echo \" 6. Voici votre clé publique :\" echo echo \" -> copier TOUTE la ligne commençant par ssh-ed25519...\"\n    echo\n    echo \"    -> coller la dans l'interface GitHub (Settings > SSH & GPG Keys > New SSH key, dans le champ \\\"Key\\\")\"\n    echo \n    echo \"==========================\"\n    cat ~/.ssh/id_ed25519.pub\n    echo \"==========================\"\nfi\n```","tags":"","title":"$:/code/git/script/SSH_Key","modified":"20241009065020791"},
2537{"created":"20240913092626037","text":"","tags":"","title":"$:/code/html","modified":"20240913093041949","icon":"$:/img/ico/html-5.ico"},
2538{"created":"20240829095432975","text":"```css\n// supprimer le soulignement et le texte bleu sur un lien \na {\n    color: black;\n    text-decoration: none;\n  }\n  \n```\n\n\n### 1. la balise `\u003Ca href=”#”>`\n\t\n\t`\u003Ca href=\"\">` = La balise dédiée à la navigation\n\t\n\texemple d'équivalent aria :\n\t\n\t```html\n\t\u003Cdiv role=\"link\" tabindex=\"0\" onclick=\"location.href='https://example.com';\">\n\t  Aller à l'exemple\n\t\u003C/div>\n\t``` \n\n\n### 2. Les destinations des liens\n\n#### - vers une autre page web \n\n```html\n\u003C!-- Lien a avec attribut href  -->\n\u003Ca href=\"index.html\">Accueil\u003C/a>\n```\n\n#### - à l'intérieur d'une page : ancre nommée\n\n```html\n\u003C!-- La valeur de l’attribut href commence par # de la valeur d'un attribut id placé sur l’élément vers lequel on se dirige -->\n\u003Ca href=\"#id-1\">Actualités\u003C/a>\n[....]\n\u003Cdiv id=\"id-1\">[....]\u003C/div>\n```\n\n#### - vers une nouvelle fenêtre ou un nouvel onglet\n\n```html\n\u003C!-- Attribut target=”_blank” -->\n\u003Ca href=\"http://www.google.com\" target=\"_blank\">Actualités\u003C/a>\n```\n\n#### - vers un document\n\n```html\n\u003C!-- Attribut download -->\n\u003Ca href=\"nom-fichier.pdf\" download>Télécharger le compte rendu (PDF - 45Ko)\u003C/a>\n\u003Ca href=\"nom-fichier.xsl\" download>Tableau de gestion (.XSL 50ko)\u003C/a>\n```\n\n#### - Vers un numéro de téléphone\n\n```html\n\u003C!-- Lien téléphone-->\n\u003Ca href=\"tel:+49.157.0156\">+49 157 0156\u003C/a>\n\u003Ca href=\"tel:+1(555)5309\">(555) 5309\u003C/a>\n```\n\n#### - vers une adresse mail\n\n```html\n\u003C!-- Lien mail -->\n\u003Ca href=\"mailto:[email protected]\">Envoyer Email\u003C/a>\n\u003Ca href=\"mailto:[email protected], [email protected]\">Envoyer Email à deux destinataires\u003C/a>\n\u003Ca href=\"mailto:[email protected][email protected]\">Envoyer Email avec copie à un autre\u003C/a>\n\u003Ca href=\"mailto:[email protected]?subject=Mail de notre site Web \">Envoyer Email avec un sujet prédéfini\u003C/a>\n\u003Ca href=\"mailto:[email protected]?body=Texte du message prédéfini\">Envoyer Email avec un corps de message prédéfini\u003C/a>\n```\n\n### 3. Un lien ne doit jamais être vide\n\nIl existe plusieurs façons pour un lien d’être affiché :\n- Lien textuel\n- Lien image\n- Lien composite : image + texte\n- etc...\n\nLa balise ```\u003Ca>``` doit toujours avoir un contenu !\n\n⚠️ Attention à la navigation des composants d'interface qui contiennent des images ou stylisés en css sans alternative textuelle (comme pour la navigation d'un carrousel, un bouton retour...)\n\n### 4. Lien textuel uniquement \n\n#### - à éviter : les tout petits mots\n\nMettre un contenu trop petit ou trop court pose des problèmes : \n- quand on navigue à la souris : zone de clic réduite\n- quand on navigue avec un lecteur d’écran : un mot hors contexte n'est pas pertinent pour comprendre la fonction du lien\n\nExemple de texte trop court et sans contexte :\n```html\nPour consulter votre commande cliquez \u003Ca href=\"#\">ici\u003C/a>\n```\n\nPréférer un texte complet :\n- plus clair pour les lecteurs d'écran, surtout quand on passe par la liste des liens d'une page\n- pour agrandir la zone de clic et faciliter la navigation à la souris\n\nExemple de texte assez long et avec contexte\n```html\n\u003Ca href=\"#\">Pour consulter votre commande cliquez ici\u003C/a>\n```\n\nToujours privilégier la simplicité et le texte à l'intérieur de la balise, exemple : \n```html\nConsulter les \u003Ca href=\"#\">Conditions générales de vente\u003C/a>\n```\n\n#### - liens dans des blocs de texte\n\nQuand ils sont intégrés dans un texte, les liens doivent pouvoir être distingués autrement que par la couleur.\n\nLaisser le soulignement des liens qui se trouvent au milieu de texte, pour qu'ils soient bien identifiables :\n```html\nSi vous désirez plus d'informations, vous pouvez consulter \u003Ca href=\"#\">Le site officiel de recherche d'emploi\u003C/a>\n```\n\n### 4. Lien image uniquement\n\nLorsque c'est une image qui est contenue dans une balise `\u003Ca>`, c'est l'alternative textuelle de l'image qui sera prise en compte par les lecteurs d’écrans.\nElle doit être explicite pour **permettre de comprendre la direction du lien**.\n\n### 5. Lien avec un contenu mixte : image 
2538+ texte\n\nC'est la combinaison de l'alternative textuelle de l'image et du texte qui sera prise en compte.\n\nExemple avec une image `\u003Cimg>` qui a du sens : \n```html\n\u003Ca href=\"#\">\n\t\u003Cimg src=\"\" alt=\"Voir\">\n\tle détail de l'article\n\u003C/a>\n```\nsera vocalisé : \"Voir le détail de l'article\"\n\n### 6. Ajouter des informations complémentaires\n\nIl peut être nécessaire d'ajouter un complément d’information pour les intitulés de liens qui ne sont pas explicites (ex : \"Lire la suite\", etc.) afin qu'ils restent pertinents quand on navigue avec un lecteur d'écran.\n\nQuelles solutions possibles sans modifier le rendu graphique ?\n\n#### - aria-labelledby\n\nOn peut utiliser l'attribut `aria-labelledby` qui contiendra l'identifiant d'un élément apportant du contexte au lien.\n\nExemple d'utilisation de l'attribut `aria-labelledby` sur un lien textuel : \n```html\n\u003Ch3 id=\"montres-numeriques\">Montres numériques\u003C/h3>\n\u003Ca href=\"#\" aria-labelledby=\"montres-numeriques\">En savoir plus\u003C/a>\n\u003Ch3 id=\"montres-gousset\">Montres à gousset\u003C/h3>\n\u003Ca href=\"#\" aria-labelledby=\"montres-gousset\">En savoir plus\u003C/a>\n```\n\n#### - aria-label\n\nOn peut utiliser l'attribut `aria-label`.\n\n⚠️**Le contenu doit au minimum reprendre le texte du lien.**\n\nExemple d'utilisation de l'attribut `aria-label` sur un lien textuel : \n```html\nMontres numériques\n\u003Ca href=\"#\" aria-label=\"En savoir plus sur nos montres numériques\">En savoir plus\u003C/a>\nMontres à gousset\n\u003Ca href=\"#\" aria-label=\"En savoir plus sur nos montres gousset\">En savoir plus\u003C/a>\n```\nParticularités : \n- Lu en priorité par les lecteurs d’écrans\n- Non visible\n\n#### - title \n\nl'attribut `title` ne doit être utilisé que pour apporter des informations complémentaires au lien textuel.\n⚠️**Le contenu doit au minimum reprendre le texte du lien.**\n\nExemple d'utilisation de l'attribut `title` sur un lien textuel : \n```html\nMontres numériques\n\u003Ca href=\"#\" title=\"En savoir plus sur nos montres numériques\">En savoir plus\u003C/a>\nMontres à gousset\n\u003Ca href=\"#\" title=\"En savoir plus sur nos montres gousset\">En savoir plus\u003C/a>\n```\n\nParticularités : \n- Pas toujours lu par les lecteurs d’écran\n- Visible uniquement au survol de la souris\n\n### 7. Nom accessible d'un lien\n\nLe **nom accessible** d'un lien est composé : \n- de son intitulé composé du texte et/ou de l'alternative textuelle de l'image.\n- du contexte ajouté par le biais des attributs `aria-labelledby`, `aria-label`, `title`.\n\nIl est utile de connaitre le nom accessible de chaque lien car c'est avec ce nom que les liens seront vocalisés ou qu'ils seront sélectionnables en cas d'utilisation de commandes vocales.\n\nIl est nécessaire que le nom accessible d'un lien commence toujours par l'intitulé visible du lien, afin que l'utilisateur puisse le sélectionner et l'activer par commande vocale.\n\nEn cas de concurrence entre les différents moyens de nommer un lien, on peut consulter [l'algorithme de calcul du nom accessible](https://www.w3.org/TR/html-aam-1.0/#a-element-accessible-name-computation) ou bien utiliser le **devtools (Chrome) > Elements > Accessibility > Name**.\n\n🚀 [Nom accessible d'un lien - RGAA](https://accessibilite.numerique.gouv.fr/methode/glossaire/#intitule-ou-nom-accessible-de-lien)\n\n🔎 [Utiliser l'arbre d'accessibilité - blog.ineat-group.com](https://blog.ineat-group.com/2023/04/utiliser-larbre-daccessibilite/)\n\n### 8. Bonnes pratiques pour les liens qui s'ouvrent dans un nouvelle fenêtre (onglet)\n\nUn lien `\u003Ca>` avec un attribut `target=_blank` ouvrir la cicle dans une nouvelle fenêtre ou un nouvel onglet.\n\n- Visuellement, on peut ajouter un picto ↗️ :\n    - en dur dans le code\n    - en feuille de style\n- Dans le code, ajouter une information non visible mais vocalisée à la fin du **nom accessible**\n\nExemple de mise en place d'un lien externe accessible : \n```html\n\u003Ca href=\"#\" target=\"_blank\">\n\tVoir l'information sur le site dédié \n\t\u003Cspan class=\"sr-only\">(nouvelle fenêtre)\u003C/span>\n\t\u003Cspan class=\"ri-external-link-line\" aria-hidden=\"true\">\u003C/span>
2538\n\u003C/a>\n```\n\n### 9. Bonnes pratiques pour les liens de téléchargement des documents\n\nQuand on met un lien vers un document en téléchargement, le texte du lien doit comporter les mentions suivantes : \n\n- Nom du fichier\n- format\n- poids\n- langue si besoin\n\nOn ajoute en plus l'attribut `download`.\n\nExemples de liens de téléchargement de documents : \n```html\n\u003Ca href=\"nom-fichier.pdf\" download>Télécharger le compte rendu (PDF - 45Ko)\u003C/a>\n\u003Ca href=\"nom-fichier.xsl\" download>Tableau de gestion (.XSL 50ko)\u003C/a>\n```\n","tags":"$:/accessibilité $:/code/html","title":"$:/code/html/\u003Ca>","modified":"20240913095704982","type":"text/markdown"},
2539{"created":"20240903135000992","text":"## Balise `\u003Cbutton>` \n\n\nOn peut trouver plusieurs types de boutons : \n\n- `type=\"submit\"` = Bouton de soumission\n- `type=\"cancel\"` = Bouton d'annulation\n- `type=\"button\"` = Bouton d'action\n- Bouton sans attribut type\n    - En dehors d'un formulaire c'est un **bouton d'action par défaut**\n    - Dans un formulaire, c'est un **bouton de soumission par défaut**\n\nL'intitulé du bouton doit reprendre les mêmes règles que tous les intitulés vus jusqu'à présent.\n\nLes différentes façons de donner un intitulé à un bouton :\n\n- `value=\"Intitulé du bouton\"`\n- `title=\"Intitulé du bouton\"`\n- `aria-label=\"Intitulé du bouton\"`\n- `aria-labelledby=\"[Id_du_texte_1] [Id_du_texte_2]\"`\n- `alt=\"Intitulé du bouton\"` ( cas `\u003Cinput type=\"image\"/>`)\n\n### 1. Intitulé explicite\n\nL'intitulé du bouton doit être explicite : pas de \"ok\", \"valider\", \"envoyer\" ...\n\n❎Exemple de bouton non explicite :\n```html\n\u003Cinput type=\"submit\" value=\"OK\" />\n```\n\n✔️Exemple de bouton explicite :\n```html\n\u003Cinput type=\"submit\" value=\"OK\" title=\"Me connecter\" />\n```\n\n### 2. Nom accessible\n\nL'intitulé du bouton reprend les règles du nom accessible.\n\n❎ Exemple de nom non accessible :\n```html\n\u003Cinput type=\"submit\" value=\"Enregistrer\" aria-label=\"Valider mes modifications\"/>\n```\n⚠️ intitulé visible != nom accessible\n\n✔️ Exemple de nom accessible :\n```html\n\u003Cinput type=\"submit\" value=\"Enregistrer\" aria-label=\"Enregistrer Valider mes modifications\"/>\n```\n```html\n  \u003Cdiv class=\"section-btn\">\n    \u003Cbutton id=\"showIframeBtn\" class=\"anime\">\n      \u003Cspan class=\"circle\" aria-hidden=\"true\">\n        \u003Cspan class=\"icon arrow\">\u003C/span>\n      \u003C/span>\n      \u003Cspan class=\"button-text\">\u003C%= portails[portail].shortTitle %>\u003C/span>\n    \u003C/button>\n  \u003C/div>\n\n```\n\nLe rôle button devrait être utilisé pour les éléments cliquables qui déclenchent une réponse lorsqu'activés par l'utilisateur. \nAjouter role=\"button\" permettra à un élément d'apparaître comme un bouton de contrôle pour un lecteur d'écran. \nCe rôle peut être utilisé avec l'attribut aria-pressed afin de créer des boutons interrupteurs.\n\n```html\n\u003Cdiv id=\"saveChanges\" tabindex=\"0\" role=\"button\" aria-pressed=\"false\">\n  Enregistrer\n\u003C/div>\n```\n\n* Voir des exemples de bouton :\n* [[https://codepen.io/tag/buttons]]","tags":"$:/accessibilité $:/html","title":"$:/code/html/\u003Cbutton>","modified":"20240930211049058","type":"text/markdown"},
2540{"created":"20240919200932528","text":"```html\n\u003Cbutton class=\"js-menu menu button-clear menu-white menu-spinkit\" aria-label=\"Site navigation\">\n  \u003Cspan class=\"menu-icon-line-1 menu-icon-line\">\u003C/span>\n  \u003Cspan class=\"menu-icon-line-2 menu-icon-line\">\u003C/span>\n  \u003Cspan class=\"menu-icon-line-3 menu-icon-line\">\u003C/span>\n\u003C/button>\n\n```\n\n```css\n}\n.menu-icon-line {\n    display: block;\n    height: 2px;\n    width: 100%;\n    background-color: #a5acbc;\n    margin-bottom: 4px;\n    border-radius: 2px;\n    transition: transform 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275), opacity 0.2s ease-out;\n    transform: translateZ(0);\n}\n.button-clear {\n    border: none;\n    background-color: transparent;\n}\n\n\n```\n\n","tags":"","title":"$:/code/html/\u003Cbutton>/menu-burger","modified":"20240919201842960"},
2541{"created":"20240911185449231","text":"* Exemple de bouton avec une image svg (changement de thème)\n\n```js\n\u003Cbutton id=\"theme-toggle\" class=\"p-2 rounded-md hover:bg-gray-200 dark:hover:bg-gray-700\">\n                    \u003Csvg id=\"theme-toggle-dark-icon\" class=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\">\u003Cpath d=\"M17.293 13.293A8 8 0 016.707 2.707a8.001 8.001 0 1010.586 10.586z\">\u003C/path>\u003C/svg>\n                    \u003Csvg id=\"theme-toggle-light-icon\" class=\"w-5 h-5 hidden\" fill=\"currentColor\" viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\">\u003Cpath d=\"M10 2a1 1 0 011 1v1a1 1 0 11-2 0V3a1 1 0 011-1zm4 8a4 4 0 11-8 0 4 4 0 018 0zm-.464 4.95l.707.707a1 1 0 001.414-1.414l-.707-.707a1 1 0 00-1.414 1.414zm2.12-10.607a1 1 0 010 1.414l-.706.707a1 1 0 11-1.414-1.414l.707-.707a1 1 0 011.414 0zM17 11a1 1 0 100-2h-1a1 1 0 100 2h1zm-7 4a1 1 0 011 1v1a1 1 0 11-2 0v-1a1 1 0 011-1zM5.05 6.464A1 1 0 106.465 5.05l-.708-.707a1 1 0 00-1.414 1.414l.707.707zm1.414 8.486l-.707.707a1 1 0 01-1.414-1.414l.707-.707a1 1 0 011.414 1.414zM4 11a1 1 0 100-2H3a1 1 0 000 2h1z\" fill-rule=\"evenodd\" clip-rule=\"evenodd\">\u003C/path>\u003C/svg>\n                \u003C/button>\n\n```\n\n```css\n\n.p-2 {\n    padding: 0.5rem;\n}\n.rounded-md {\n    border-radius: 0.375rem;\n}\n```","tags":"","title":"$:/code/html/\u003Cbutton>/svg","modified":"20240911185949333"},
2542{"created":"20240918072741948","text":"\n* Creation d'une modale (une boite de dialogue)\n\n```js\n\u003Cdialog open>\n  \u003Cp>Salutations, à tous et à toutes !\u003C/p>\n  \u003Cform method=\"dialog\">\n    \u003Cbutton>OK\u003C/button>\n  \u003C/form>\n\u003C/dialog>\n```\n\n* Documentation : [[https://developer.mozilla.org/fr/docs/Web/HTML/Element/dialog]]","tags":"","title":"$:/code/html/\u003Cdialog>","modified":"20240918072935043"},
2543{"created":"20240905073344081","text":"\nL'élément `\u003Cdiv>` n'est pas naturellement focusable ou tabulable. \n\nSans l'attribut tabindex, il ne fera pas partie de l'ordre de tabulation de la page.\n\n* Nécessité d'ajouter tabindex=\"0\"\nPour rendre cet élément tabulable, il faut ajouter l'attribut tabindex=\"0\". Cela permettra à l'élément d'être inclus dans l'ordre de tabulation naturel de la page.\n\n* Gestion des événements clavier\nMême avec tabindex=\"0\", l'élément ne répondra pas automatiquement aux interactions clavier comme le ferait un vrai bouton. Il faut ajouter des gestionnaires d'événements pour les touches Espace et Entrée.\nPour rendre cet élément pleinement accessible et fonctionnel comme un bouton, voici comment il devrait être modifié :\n\n```html \n\u003Cdiv role=\"button\" tabindex=\"0\" onclick=\"handleClick()\" onKeyDown=\"handleKeyDown(event)\">\n  Cliquez ici !\n\u003C/div>\n\n```\nLe role aria d'une div en tant que section est `role=\"region\"`","tags":"$:/html $:/accessibilité","title":"$:/code/html/\u003Cdiv>","modified":"20240905091219748","type":"text/markdown"},
2544{"created":"20240702090734533","text":"\n  \n```html\n\u003Cform action=\"\" method=\"get\">\n            \u003Cinput type=\"search\" placeholder=\"Recherche\" role=\"search\">\n \u003C/form>\n\n```\n\n```html\n \u003Cform action=\"\" method=\"get\">\n            \u003Clabel for=\"search\">Recherche:\u003C/label>\n            \u003Cinput type=\"search\" placeholder=\"Recherche\" role=\"search\" id=\"search\" name=\"search\">\n\u003C/form>\n```\n```html\n\u003Ch1>Formulaire de réservation pour le chambre Licorne\u003C/h1>\n\u003Cform action=\"\">\n\n\u003Cfieldset>\n                \u003Clegend>Informations personnelles\u003C/legend>\n                \u003Cp>Tous les champs suivis d'un * sont obligatoires.\u003C/p>\n\u003Clabel for=\"lastname\">\n                    Nom * :\n                    \u003Csmall>exemple : Doe\u003C/small>\n                \u003C/label>\n                \u003Cinput type=\"text\" name=\"lastname\" id=\"lastname\" required autocomplete=\"family-name\">\n                \u003Cbr>\n\u003Clabel for=\"tel\">\n                    Téléphone :\n                    \u003Csmall>exemple : 0698745632\u003C/small>\n                \u003C/label>\n                \u003Cinput type=\"tel\" name=\"tel\" id=\"tel\" autocomplete=\"tel\">\n            \u003C/fieldset>\n\n\u003Cfieldset>\n                \u003Clegend>Informations de réservation\u003C/legend>\n\u003Clabel for=\"checkin\">Date d'arrivée * :\u003C/label>\n                \u003Cinput type=\"date\" name=\"checkin\" id=\"checkin\" required\n                    min=\"date qui correspond à la date du jour + 7jours : yyyy-mm-dd\"\n                    max=\"date du jour + 3mois - 1jour : yyyy-mm-dd\">\n                \u003Cbr>\n\u003Clabel for=\"checkout\">Date de départ * :\n                    \u003Csmall>La date de départ doit être postérieure à la date d'arrivée\u003C/small>\n                \u003C/label>\n\u003Cinput type=\"date\" name=\"checkout\" id=\"checkout\" required\n                    min=\"date supérieure à la date d'arrivée : yyyy-mm-dd\"\n                    max=\"date qui correspond à la date du jour + 3mois 
2544: yyyy-mm-dd\">\n                \u003Cbr>\n                \u003Clabel for=\"number\">Nombre de personne * :\n                    \u003Csmall>maximum : 10 personnes\u003C/small>\n                \u003C/label>\n\u003Cinput type=\"number\" name=\"number\" id=\"number\" min=\"1\" max=\"10\" value=\"1\" required>\n            \u003C/fieldset>\n\n\u003Cbutton>Réserver la chambre d'hotel\u003C/button>\n\n\u003C/form>\n```\n* rmq :  en javasccript, on peut faire un .reset() sur l'objet du formulaire pour vider ses champs [[Documentatin MDM|https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/reset]]\n\n# Formulaires\n\n## A. Composition d'un formulaire\n\n### 1. Une zone\n\n- `\u003Cform>`\n- `role=\"search\"` : zone de recherche, unique dans la page\n\n### 2. Les différents types d'éléments d’un formulaire\n\n- Des champs de saisie ou de sélection\n    - `\u003Cinput>`\n    - `\u003Ctextarea>`\n    - `\u003Cselect>`\n- Des systèmes de regroupement `\u003Cfieldset>`, `\u003Clegend>`\n- Des boutons\n    - bouton d'actions\n    - bouton de soumission de formulaires\n\n### 3. Les différents champs de saisie de formulaire\n\nDéfinition du glossaire RGAA : Objet d’un formulaire permettant à l’utilisateur :\n\n- de saisir des données textuelles ou préformatées,\n    \nexemples : `input type=\"text\"` `input type=\"password\"` `input type=\"search\"` `input type=\"email\"` `input type=\"number\"` `input type=\"tel\"` `input type=\"url\"` `textarea`.\n    \n- de sélectionner des valeurs prédéfinies,\n    \nexemples : `input type=\"checkbox\"` `input type=\"radio\"` `input type=\"date\"` `input type=\"range\"` `input type=\"color\"` `input type=\"time\"` `input type=\"month\"` `input type=\"week\"` `input type=\"datetime-local\"` `select` `datalist` `optgroup` `option`.\n    \n- de télécharger des fichiers,\n    \nexemples : `input type=\"file\"`.\n    \n- d’afficher des résultats,\n    \nexemples : `output` `progress` `meter`.\n    \n## B. Intitulés\n\nDéfinition : **Texte à proximité du champ de formulaire permettant d’en connaître la nature, le type ou le format des informations attendues.**\n\nSi il y a plusieurs étiquettes, le \"nom accessibile\" sera défini comme suit : \n\n`aria-labelledby` > `aria-label` > `\u003Clabel>` > `title`.\n\n### 1. Intitulés pertinents et transverses\n\n- chaque champ doit avoir un intitulé\n- l'intitulé de champ doit être visible\n- l'intitulé de champ doit être pertinent\n- chaque intitulé doit être associé visuellement (à coté du champ pour l'utilisation de la loupe) et techniquement à un champ\n- le nom accessible du champ doit reprendre l'intitulé visible du champ pour être sélectionnable pour les utilisateurs de commandes vocales\n\n❎Exemple de champ inaccessible :\n```html\n\u003Cp>Rechercher sur le site\u003C/p>\n\u003Cinput type=\"text\" aria-label=\"Saisir les termes de la recherche\"/>\n```\nDans cet exemple : \n- nom accessible : Saisir les termes de la recherche\n- intitulé visible du champ : Rechercher sur le site\n\n✔️Exemple de champ accessible : \n```html\n\u003Cp>Rechercher sur le site\u003C/p>\n\u003Cinput type=\"text\" aria-label=\"Recherchez sur le site Saisir les termes de la recherche\"/>\n```\n\n### 2. Les différentes méthodes pour construire un intitulé de champ accessible\n\n#### - Méthode 1 : `\u003Clabel>` et attribut `for`\n\n- L'intitulé est dans une balise `\u003Clabel>`\n- Le champ de formulaire doit avoir un attribut `id`\n- Relier l'intitulé du champ de formulaire : la valeur de l'attribut `for` est celle de l'attribut `id` du champ auquel il est relié\n- L’attribut `id`\n    - Indispensable sur tous les champs de formulaire\n    - Doit être unique.\n\n**Exemple 1 : `\u003Clabel>` avant `\u003Cinput>`**\n\n```html\n\u003Clabel for=\"field-name\">Nom\u003C/label>\n\u003Cinput type=\"text\" id=\"field-name\" />\n```\n\n**Exemple 2 : `\u003Cinput>` imbriqué dans `\u003Clabel>`**\n\n```html\n\u003Clabel for=\"field-name\">Nom\n\u003Cinput type=\"text\" id=\"field-name\" />\n\u003C/label>\n```\n\n💡**cette méthode est celle à privilégier car qu'elle permet à la fois d'avoir une étiquette visible pour chaque champ et de sélectionner le champ en cliquant sur son label.**\n\n#### - Méthode 2 : Utiliser `title`\n\nRedéfinit totalement l'intitulé du champ de formulaire\n\n⚠️ cette méthode est pertinente que dans le cas de la navigation à la souris, car l'infobulle n'est pas visible dans les formats tactiles (mobile, tablette).\n\n#### - Méthode 3 : Utiliser `aria-label`\n\nRedéfinit totalement l'intitulé du champ de formulaire.\n\nSi c'est la seule méthode pour intituler le champ, le nom accessible ne sera pas visible.\n\n⚠️ Navigation souris : au clic sur le texte à proximité, le focus ne se fera pas sur le champ et rendra plus complexe la saisie du formulaire, notamment quand il faut utiliser les checkbox ou les bouton radio.\n\nExemple :\n```html\n\u003Cinput type=\"text\" aria-label=\"Nom\" />\n```\n\n#### - Méthode 4 : Utiliser `aria-labelledby`\n\nRelier le champ à un texte extérieur ayant un attribut `id`\n\n⚠️ Navigation souris : au clic sur le texte à proximité, le focus ne se fera pas sur le champ et rendra plus complexe la saisie du formulaire, notamment quand il faut utiliser les checkbox ou les bouton radio.\n\nExemple :\n```html\n\u003Cdiv id=\"id-nom\">Nom\u003C/div>\n\u003Cinput type=\"text\" aria-labelledby=\"id-nom\" />\n```\n\n### 3. Les champs sans intitulé visible\n\nIls doivent être exceptionnels.\n\n- Un seul champ par formulaire\n- Bouton de soumission associé\n\n3 solutions pour palier à l'absence d'intitulé visible : \n- `sr-only` Avantage aux lecteurs d'écran qui auront l'information.\n- `aria-label` Avantage aux lecteurs d'écran qui auront l'information.\n- `title` Avantage aux systèmes qui permettent un affichage au survol.\n\nSolution avec intitulé géré par feuille de style :\n```html\n\u003Cform role=\"search\">\n\t\u003Clabel for=\"nom\" class=\"sr-only\">Rechercher par mot clé\u003C/label>\n\t\u003Cinput type=\"text\" id=\"nom\" />\n\u003C/form>\n```\n\nSolution avec intitulé géré par l'attribut title :\n```html\n\u003Cform role=\"search\">\n\t\u003Cinput type=\"text\" id=\"nom\" title=\"Rechercher par mot clé\" />\n\u003C/form>\n```\n\nSolution avec intitulé géré par l'attribut aria-label :\n```html\n\u003Cform role=\"search\">\n\t\u003Cinput type=\"text\" id=\"nom\" aria-label=\"Rechercher par mot clé\" />\n\u003C/form>\n```\n\n### 4. Le placeholder n'est pas un intitulé\n\n- L'attribut placeholder fait apparaître un texte dans le champ de saisie\n    - La couleur de contraste est atténuée et peu lisible\n    - Le texte disparaît quand on commence la saisie\n    - En cas de texte dont la taille dépasse celle du champ de saisie, tout ne sera pas visible.\n- Il peut aider à comprendre un champ, mais ne remplace jamais un intitulé\n\n```html\n\u003Clabel for=\"nom\">Nom\u003C/label>\n\u003Cinput type=\"text\" id=\"nom\" placeholder=\"exemple : Dupont\" />\n```\n\n⚠️ Lorsque l’attribut `placeholder` est présent, il est susceptible d’être restitué à la place de l’attribut `title`. \nPar conséquent, lorsque ces deux attributs `title` et `placeholder` sont présents, ils doivent être identiques.\
2544n\n## C. Regrouper les éléments\n\nOn peut regrouper les champs de même nature dans les cas suivants : \n- Trois champs successifs pour saisir une date (jour/mois/année) ;\n- Champs successifs pour un numéro de téléphone ;\n- Un bloc destiné à saisir l’identité et l’adresse de l’utilisateur, lorsque le formulaire contient plusieurs blocs de contact ;\n- Un ensemble de boutons radio ou de cases à cocher qui se rapportent à une même question.\n\nOn pourra les regrouper de plusieurs façons : \n\n### 1. `\u003Cfieldset>` et `\u003Clegend>`\n\n- `\u003Cfieldset>` englobe l'ensemble des regroupement de boutons radios ou de cases à cocher\n- `\u003Clegend>` permet d'identifier le titre du regroupement\n\nExemple des boutons radios : \n```html\n\u003Cfieldset>\n\t\u003Clegend>Combien de parfums de glace désirez vous?\u003C/legend>\n\t\n\t\u003Cinput type=\"radio\" id=\"quantite-1\"/>\n\t\u003Clabel for=\"quantite-1\" name=\"gout\">Fraise\u003C/label>\n\t\n\t\u003Cinput type=\"radio\" id=\"quantite-2\"/>\n\t\u003Clabel for=\"quantite-2\" name=\"gout\">Pistache\u003C/label>\n\t\n\t\u003Cinput type=\"radio\" id=\"quantite-3\"/>\n\t\u003Clabel for=\"quantite-3\" name=\"gout\">Caramel\u003C/label>\n\u003Cfieldset>\n```\n\nExemple des cases à cocher : \n```html\n\u003Cfieldset>\n\t\u003Clegend>Parfum de glace\u003C/legend>\n\t\n\t\u003Cinput type=\"checkbox\" id=\"gout-1\"/>\n\t\u003Clabel for=\"gout-1\">Fraise\u003C/label>\n\t\n\t\u003Cinput type=\"checkbox\" id=\"gout-2\"/>\n\t\u003Clabel for=\"gout-2\">Pistache\u003C/label>\n\t\n\t\u003Cinput type=\"checkbox\" id=\"gout-3\"/>\n\t\u003Clabel for=\"gout-3\">Caramel\u003C/label>\n\u003Cfieldset>\n```\n\nExemple de formulaires identiques : \n```html\n\u003Cfieldset>\n\t\u003Clegend>Enfant 1\u003C/legend>\n\t\n\t\u003Clabel for=\"first-name-1\">Prénom\u003C/label>\n\t\u003Cinput type=\"checkbox\" id=\"first-name-1\"/>\n\t\n\t\u003Clabel for=\"last-name-1\">Nom\u003C/label>\n\t\u003Cinput type=\"checkbox\" id=\"last-name-1\"/>\n\n\u003Cfieldset>\n\n\u003Cfieldset>\n\t\u003Clegend>Enfant 2\u003C/legend>\n\t\n\t\u003Clabel for=\"first-name-2\">Prénom\u003C/label>\n\t\u003Cinput type=\"checkbox\" id=\"first-name-2\"/>\n\t\n\t\u003Clabel for=\"last-name-2\">Nom\u003C/label>\n\t\u003Cinput type=\"checkbox\" id=\"last-name-2\"/>\n\n\u003Cfieldset>\n```\n\n### 2. Utiliser `aria-labelledby`\n\n`aria-labelledby` permet de relier un champ à plusieurs intitulés, très pratique pour préciser le contexte de chaque champ.\n\nExemple :\n```html\n\u003Ch1 id=\"enfant-1\">Enfant 1\u003C/h1>\n\n\u003Cdiv id=\"nom-1\">Nom\u003C/div>\n\u003Cinput type=\"text\" aria-labelledby=\"enfant-1 nom-1\" />\n\n\u003Cdiv id=\"prenom-1\">Prénom\u003C/div>\n\u003Cinput type=\"text\" aria-labelledby=\"enfant-1 prenom-1\" />\n```\n\n### 3. Utiliser `role=\"group\"`\n\nUtile quand on ne peut pas utiliser les balises `\u003Cfieldset>` et `\u003Clegend>`.\n\nExemple : \n```html\n\u003Cdiv role=\"group\" aria-labelledby=\"delivery-address\">\n  \u003Cp id=\"delivery-address\">adresse\u003C/p>\n  \u003Clabel for=\"street\">rue\u003C/label>\n  \u003Cinput type=\"text\" id=\"street\" name=\"adresse\">\n  \u003Clabel for=\"city\">ville\u003C/label>\n  \u003Cinput type=\"text\" id=\"city\" name=\"ville\">\n\u003C/div>\n```\n\n## D. Structuration des listes de choix\n\nLorsqu'une liste de choix contient beaucoup d'éléments, il peut devenir difficile de les parcourir et d'effectuer un choix. On pourra alors effectuer des regroupements d'éléments avec la balise `\u003Coptgroup label=\"nom du groupe\">`.\n\nExemple : \n```html\n\u003Cselect name=\"classe\">\n   \u003Coptgroup label=\"primaire\">\n     \u003Coption>CP\u003C/option>\n     \u003Coption>CE1\u003C/option>\n     \u003Coption>CE2\u003C/option>\n     \u003Coption>CM1\u003C/option>\n     \u003Coption>CM2\u003C/option>\n   \u003C/optgroup>\n   \u003Coptgroup label=\"collège\">\n     \u003Coption>6ème\u003C/option>\n     \u003Coption>5ème\u003C/option>\n     \u003Coption>4ème\u003C/option>\n     \u003Coption>3ème\u003C/option>\n   \u003C/optgroup>\n\u003C/select>\n```\n\n🚀[Structuration des listes de choix - RGAA](https://accessibilite.numerique.gouv.fr/methode/criteres-et-tests/#11.8)\n\n\n## E. Les boutons\n\n{{$:/code/html/\u003Cbutton>}}\n\n## F. Aide à la saisie\n\nIl s'agit ici des indications de format et des exemples pour mieux aider l'utilisateur à effectuer sa s
2544aisie\n\n- Email : donner un exemple\n- Date : donner une indication de format\n- Mot de passe : si besoin, indications de formats\n- ...\n\n### 1. Imbriqué dans `\u003Clabel>`\n\n```html\n\u003Clabel for=\"email\">\n\t\u003Cspan>Email\u003C/span>\n\t\u003Cspan>Exemple : [email protected]\u003C/span>\n\u003C/label>\n\u003Cinput type=\"text\" id=\"email\" />\n```\n\n### 2. Relié avec `aria-describedby`\n\n- L'indication est dans un élément sémantiquement neutre (div ou span) ayant un attribut id\n- Le champ de saisie a un attribut `aria-describedby`\n\n```html\n\u003Clabel for=\"email\">Email\u003C/label>\n\u003Cdiv id=\"format-email\">Exemple : [email protected]\u003C/div>\n\u003Cinput type=\"text\" id=\"email\" aria-describedby=\"format-email\" />\n```\n\n## G. Les champs obligatoires\n\nTous les champs obligatoires doivent être signalés à la fois visuellement et dans le code.\n\nSauf : \n- si il n'y a qu'un seul champ dans le formulaire\n- si on mentionne à l'inverse les champs optionnels\n\n### 1. Signaler visuellement les champs obligatoires\n\nOn peut utiliser une signalétique ou du texte pour chaque champ obligatoire.\n\n- Astérisque + texte \"* champs obligatoires\"\n\n```html\n* Champs obligatoires\n\n\u003Clabel for=\"nom\">Nom * \u003C/label>\n\u003Cinput type=\"text\" id=\"nom\" />\n```\n\n- Texte d’information global\n\n```html\nTous les champs sont obligatoires\n\u003Clabel for=\"nom\">Nom\u003C/label>\n\u003Cinput type=\"text\" id=\"nom\" />\n```\n\n- Texte (champ obligatoire) pour chaque intitulé\n\n```html\n\u003Clabel for=\"nom\">Nom (champ obligatoire)\u003C/label>\n\u003Cinput type=\"text\" id=\"nom\" />\n```\n\n### 2. Signaler dans le code : attribut `required` ou `aria-required`\n\nAttributs `required` ou `aria-required` à placer au niveau de la balise\n\n- Pour les champs ne dépendant pas d'un regroupement, l'attribut est au niveau de la balise\n\n```html\n\u003Clabel for=\"nom\">Nom * \u003C/label>\n\u003Cinput type=\"text\" id=\"nom\" required />\n\n\u003Clabel for=\"nom\">Prénom * \u003C/label>\n\u003Cdiv role=\"textbox\" id=\"prenom\" aria-required=\"true\" >\u003C/div>\n```\n\n## H. Les champs invalides\n\nLes aides à la saisie sont importantes pour tous les utilisateurs. \nLes utilisateurs ayant des difficultés de compréhension, les aides à la saisie sont essentielles, aisni que pour les utilisateurs de lecteur d'écran, pour lesquels la liaison des erreurs aux champs concernés est indispensable.\n\nOn doit préciser avant le champ de saisie si un format spécifique est attendu. \n\nLes messages d'erreurs doivent : \n- être situés avant les champs en erreur ou liés au champ concerné \n- comporter un exemple de saisie en cas d'erreur persistante.\n\nEnfin, la page de retour d'erreur doit préciser sa nature dans son titre.\n\n```html\n\u003Ctitle>Erreur sur le formulaire | Formulaire d'inscription | Example.org\u003C/title>\n```\n\n### 1. Signaler les champs invalides : attribut `aria-invalid`\n\nOn peut ajouter l'attribut `aria-invalid=\"true\"` avec Javascript ou l'ajouter au rechargement de la page.\n\nCela informe l'utilisateur des champs qui ont mal été remplis.\n\n```html\n\u003Clabel for=\"nom\">Nom * \u003C/label>\n\u003Cinput type=\"text\" id=\"nom\" />\n\n\u003Clabel for=\"prenom\">Prénom * \u003C/label>\n\u003Cinput type=\"text\" id=\"prenom\" aria-invalid=\"true\"/>\n```\n\n### 2. Messages d'erreurs\n\n- Les relier au champ de formulaire à l'aide de `aria-describedby` / `id`\n- Il doivent être vides par défaut, et se remplir en cas d'erreur avec du JS\n- Il doivent être explicites pour aider l'utilisateur à corriger sa saisie\n\n```html\n\u003Clabel for=\"nom\">Nom * \u003C/label>\n\u003Cinput type=\"text\" id=\"nom\" required aria-invalid=\"true\" aria-describedby=\"error-nom\" >\n\u003Cdiv id=\"error-nom\">\u003Cspan>Veuillez saisir votre nom de famille\u003C/span>\u003C/div>\n\n\u003Clabel for=\"email\">Adresse email * \u003C/label>\n\u003Cinput type=\"email\" id=\"email\" required aria-invalid=\"true\" aria-describedby=\"error-email\" >\n\u003Cdiv id=\"error-email\">\u003Cspan>Veuillez saisir votre email au format [email protected]\u003C/span>\u003C/div>\n```\n\n### 3. Relier plusieurs informations : Format et message d'erreur\n\nIl est possible de relier l'indication de format et le message d'erreur au champ de formulaire à l'aide de `aria-describedby` / `id` en cumulant les identifiants.\n\nIls seront lus dans l'ordre.\n\n```html\n\u003Clabel for=\"email\">Email\u003C/label>\n\u003Cdiv id=\"format-email\">Exemple : [email protected]\u003C/div>\n\u003Cinput type=\"text\" id=\"email\" aria-describedby=\"error-email format-email\" />\n\u003Cdiv id=\"error-email\">Veuillez saisir un email valide. Exemple : [email protected]\u003C/div>\n```\n\n### 4. Cas particulier du message d’erreur sur un regroupement de champs\n\nPour l'état d’erreur, ajouter un `role=\"group\"` à la balise `\u003Cfieldset>`. \n\nLe message d’erreur et la balise `legend` sont liés au `fieldset` via l’attribut `aria-labelledby` :\n\n```html\n\u003Cfieldset aria-labelledby=\"radio-error-legend radio-error-desc-error\" role=\"group\">\n    \u003Clegend id='radio-error-legend'>Légende pour l’ensemble de champs\u003C/legend>\n    \u003Cinput type=\"radio\" id=\"radio-error-1\" name=\"radio-error\">\n    \u003Clabel for=\"radio-error-1\">Label radio\u003C/label>\n    \u003Cinput type=\"radio\" id=\"radio-error-2\" name=\"radio-error\">\n    \u003Clabel for=\"radio-error-2\">Label radio\u003C/label>\n    \u003Cinput type=\"radio\" id=\"radio-error-3\" name=\"radio-error\">\n    \u003Clabel for=\"radio-error-3\">Label radio\u003C/label>\n    \u003Cp id=\"radio-error-desc-error\">Message d’erreur\u003C/p>\n\u003C/fieldset>\n```\n\n## I. L'attribut `autocomplete`\n\nL'attribut `autocomplete` donne à l'utilisateur la possibilité de recevoir une assistance automatisée pour remplir les valeurs des champs de formulaire.\n\nPour cela, on doit donner des indications au navigateur quant au type d'informations attendues dans chaque champ.\n\n- Champ concernés : `\u003Cinput>` `\u003Cselect>` `\u003Ctextarea>` et `\u003Cform>`\n- Valeurs : \n    - On : le navigateur doit utiliser des fonction heuristiques pour tenter de compléter le champ,\n    - Off : Le navigateur n'est pas autorisé à saisir automatiquement des valeurs pour ce champ.\n    - [Liste complète des autres valeurs possibles - MDN] : (https://developer.mozilla.org/fr/docs/Web/HTML/Attributes/autocomplete#valeurs)\n \n## J. Les formulaires traitant des données personnelles et sensibles\n\nDans certains cas, on doit mettre en place un processus qui permettra à l'utilisateur de garder le controle sur ses données personnelles ou sur des données sensibles et importantes.\n\nLe RGAA liste [4 manières de vérifier la saisie ou modifier celle-ci après validation - RGAA](https://accessibilite.numerique.gouv.fr/methode/criteres-et-tests/#11.12)\n  \n## K. Les captchas\n\nLes captchas sont inaccessibles par nature.\n\nOn doit : \n- avertir l'utilisateur de la présence d'un captcha, avec une alternative textuelle simple c
2544omme \"saisir le code présent dans l'image\"\n- fournir une alternative non graphique :\n  - captcha sonore ou logique\n  - envoi de code par email ou SMS\n\n🔍[Captcha et alternative textuelle](https://accessibilite.numerique.gouv.fr/methode/criteres-et-tests/#1.4)\n\n🔍[Captcha et alternative fonctionnelle](https://accessibilite.numerique.gouv.fr/methode/criteres-et-tests/#1.5)\n\n🚀[https://technology.blog.gov.uk/2020/02/24/why-the-gov-uk-design-system-team-changed-the-input-type-for-numbers/](https://technology.blog.gov.uk/2020/02/24/why-the-gov-uk-design-system-team-changed-the-input-type-for-numbers/)\n\n\n## autre exemple \n\n\n```css\nbody {\n  width: 100%;\n  height: 100vh;\n  margin: 0;\n  background-color: #1b1b32;\n  color: #f5f6f7;\n}\n\nlabel {\n  display: block;\n  margin: 0.5rem 0;\n}\n```\n\n* Pour aller plus loin :\n  * Tally — the free, intuitive form builder|[https://tally.so/]]","tags":"$:/accessibilité $:/html","title":"$:/code/html/\u003Cform>","modified":"20241002093306084","type":"text/markdown"},
2545{"created":"20240829114722167","text":"* Site pour récuperer des images libre de droits :\n\t* [[https://pixabay.com/fr/]]\n\n---\n\n```html\n\u003Cfigure aria-label=\"\"> \n\t\t\u003Cimg src=\"./images/04.jpg\" alt=\"une panthère qui nous regarde\">\n\t  \u003Cfigcaption> Jaguar, Guyane\u003C/figcaption>\n\u003C/figure>\n```\n\n```html\n// avec balise d'accessibilité\n\nrole=\"img\" focusable=\"false\"> \n```\n\n```\n//emmet\nimg[role=\"img\"][focusable=\"false\"]\nfigure[aria-label=\"\"]>(img[role=\"img\"][focusable=\"false\"]+figcaption)\n\n```\n\n## Rappels sur les différentes façons de gérer les images\n\n- Liste des balises pouvant supporter une image\n    - `\u003Cimg>` : image\n    - `\u003Csvg>` : image vectorielle\n    - `\u003Carea>` : zone d’image réactive\n    - `\u003Cinput type=”image”>` : élément de formulaire\n    - `\u003Ccanvas>` : dessin importé dans une page\n    - `\u003Cobject type=\"[type MIME d'image]\" data=\"[source]\">` : insertion d'un fichier image\n    - `\u003Cembed>` : image embarquée.\n- Images gérées par feuille de style CSS\n- Images par code ASCII\n\n##  Les images \u003Cimg>\n\n### Rappel sémantique\n\nLa balise image doit contenir au moins ces deux attributs, associés à des valeurs correctes :\n- `src` : chemin menant du document HTML au fichier image\n- `alt` : description de l'image\n\n```html\n\u003Cimg src=\"gateau.jpg\" alt=\"Cheesecake au caramel\">\n```\n\n### Boîte à outil\n\nGrace à l'extension [Web Developper](https://chrome.google.com/webstore/detail/web-developer/bfbameneiokkgbdmiekhjnmfkcnldhhm), on peut :\n\n- Désactiver les images\n- Faire apparaître les alternatives textuelles des images\n\n### L'attribut alt (obligatoire)\n\nL'attribut `alt` permet de définir une alternative textuelle à l'image, conformément au W3C :\n- l'alternative textuelle sera affichée en cas de problème avec l'URL de l'image\n- l'alternative textuelle sera lue par les lecteurs d'écran\n- Si l'attribut est absent, c'est le nom du fichier qui est lu par les lecteurs d'écrans\n\n**Attention** : l'attribut alt peut tout à fait être vide (aucun caractère) mais doit toujours être présent.\n\nExemple d'attribut `alt` vide : \n```html\n\u003Cimg src=\"gateau.jpg\" alt=\"\">\n```\n\n\n## 3. Les images `\u003Csvg>` inline\n\nUne image vectorielle peut être positionnée de façon \"inline\" dans le code HTML, c'est à dire directement dans le document HTML.\n\nExemple : \n\n```html\n\u003Cdiv class=\"card__ico\">\n  \u003Csvg xmlns=\"\u003Chttp://www.w3.org/2000/svg>\" viewBox=\"0 0 24 24\" width=\"24\" height=\"24\">\n    \u003Cpath fill=\"none\" d=\"M0 0h24v24H0z\"/>\n    \u003Cpath d=\"M18.031 16.617l4.283 4.282-1.415 1.415-4.282-4.283A8.96 8.96 0 0 1 11 20c-4.968 0-9-4.032-9-9s4.032-9 9-9 9 4.032 9 9a8.96 8.96 0 0 1-1.969 5.617zm-2.006-.742A6.977 6.977 0 0 0 18 11c0-3.868-3.133-7-7-7-3.868 0-7 3.132-7 7 0 3.867 3.132 7 7 7a6.977 6.977 0 0 0 4.875-1.975l.15-.15z\"/>\n  \u003C/svg>\n\u003C/div>\n```\n\nComment gérer l'alternative textuelle ?\n\n### Role=\"img\" (obligatoire)\n\nLa balise `\u003Csvg>` doit être interprétée par les lecteurs d'écran comme étant une image.\nPour cela, on ajoute l'attribut `role` associé à la valeur `img` : `role=\"img\"`\n\n⚠️ Précaution d'usage pour éviter les bugs de navigation au clavier : `focusable=\"false\"`\n\n### Alternative textuelle des SVG inline\n\nIl existe plusieurs méthodes pour donner une alternative textuelle à une image utilisant la balise `\u003Csvg>
2545`.\n\nVoici 3 exemples d'une page météo affichant un soleil : \n\n#### - SVG et aria-label\n\n```html\n\u003Csvg role=\"img\" aria-label=\"Soleil\" focusable=\"false\">\n   [Code du svg]\n \u003C/svg>\n```\n\n#### - SVG et TITLE\n\n```html\n\u003Csvg role=\"img\" focusable=\"false\" ...>\n   \u003Ctitle>Texte alternatif à l'image\u003C/title>\n   [Code du svg]\n\u003C/svg>\n```\n\n#### - SVG et aria-labelledby\n\n`aria-labelledby` est un attribut pour relier une balise à une autre. Il contient une information généralement textuelle.\n\nLa balise qui a un contenu textuel intéressant a un attribut id associé à une valeur qui doit être unique dans une même page.\n\nLa balise, que l’on veut rattacher au texte situé dans une autre balise, a un attribut `aria-labelledby`, avec comme valeur l’identifiant de la balise qui contient le texte.\n\n```html\n\u003Csvg role=\"img\" aria-labelledby =\"title-1\" focusable=\"false\">\n  \u003Ctitle id=\"title-1\">Soleil\u003C/title>\n   [Code du svg]\n\u003C/svg>\n```\n\n## 4. Images porteuses d’information vs les images de décoration\n\n### Définition : Image porteuse d’information\n\n- l'image informative apporte un élément pour la compréhension d’une information\n- l'image informative est composée d'un texte essentiel à la compréhension de l’information\n\n### Définition : Image décorative\n\n- l'image décorative n'apporte pas d'information.\n\nCertains éléments graphiques ne vont pas apporter d’information.\n\nPar exemple : \n- Les éléments de type “puce”\n- Les éléments graphique qui ont un texte équivalent à coté d’eux\n\nDans ce cas, il faut mettre en place l'une des solutions suivantes : \n- une alternative textuelle vide : `alt=\"\"`\n- un attribut `role=\"presentation\"`\n- cacher l'élément aux lecteurs d’écrans avec l'attribut `aria-hidden=\"true\"`\n- pas de labelisation avec les attributs ARIA\n- dans le cas d'un SVG, ne pas ajouter de balise `\u003Ctitle>`\n- dans le cas d'image objet `\u003Cobject type=\"image/...\">`, l'alternative textuelle entre \u003Cobject> et \u003C/object> doit être vide\n\nDans tous les cas, ne pas ajouter d'attribut `title`, même vide.\n\n```html\n\u003Csvg role=\"img\" focusable=\"false\" aria-hidden=\"true\">\n   [...]\n\u003C/svg>\n```\n\n## 6. Arbre de décision\n\n### Si l’image contient du texte\n\n- Et ce texte (ou information équivalente) est également présent en texte « pur » à proximité de celle-ci, alors **laisser son alternative textuelle vide** (`alt=\"\"`).\n- Et ce texte est seulement un effet visuel (purement décoratif, exemple : graph sur un mur), alors **laisser son alternative textuelle vide** (`alt=\"\"`).\n- Et ce texte (ou information équivalente) n’est pas présent à proximité de celle-ci, alors **renseigner son alternative textuelle** en reprenant l’information véhiculée par l’image et son texte.\n\n### Si l’image ne contient pas de texte\n\n#### - L'image est porteuse d'information\n\n- Et cette information est également présente en texte « pur » à proximité de celle-ci, alors **laisser son alternative textuelle vide** (`alt=\"\"`).\n- Et l’information véhiculée peut être résumée en une courte phrase, alors renseigner son alternative textuelle en reprenant brièvement ces informations.\n- Et cette image est porteuse de nombreuses informations (tel qu’un graphique complexe), alors renseigner son alternative textuelle en reprenant brièvement les informations véhiculée par celle-ci ainsi qu’une mention précisant où trouver sa description détaillée.\n\n#### - L'image n'est pas porteuse d'information\n\n- Alors laisser son alternative textuelle vide, ou autres solutions selon le cas (cf 4.)\n- Voir si elle ne peut pas plutôt être ajoutée via une feuille de style CSS en tant que fond d'un élément.\n\n### Quel texte pour l’alternative textuelle ?\n\nL'alternative textuelle doit décrire la **fonction d’une image**.\n\nPar exemple : \n    - “Agence Bidule”\n    - “Tableaux de Frieda Kalo…”\n\n⚠️ Ces deux exemples sont à éviter :\n    - “Logo de l’agence…” décrit l’image → Ne pas utiliser “Logo”\n    - “Image d’illustration du site Bidule” → Si c’est une illustration : pas d’alternative textuelle\n\n\n\n🚀[Test image légendée RGAA](https://accessibilite.numerique.gouv.fr/methode/criteres-et-tests/#1.9)\n\n\n## 7. Les descriptions longues ou les images complexes\n\nPour les images porteuses d'information qui nécessitent une [description détaillée](https://www.numerique.gouv.fr/publications/rgaa-accessibilite/methode-rgaa/glossaire/#description-detaillee-image), que faire?\n\n### Si le texte visible par tous\n\nOn peut utiliser `\u003Cfigure>` + `\u003Cfigcaption>` dans les cas suivants : \n- pour les images légendées\n- pour les images complexes nécessitant un texte descriptif long\n- pour associer des information légales de copyright\n- dans le cas d'une galerie d'images, pour donner des précisions visuelles sur les images\n\nTechnique :\n\n- La balise `\u003Cfigure>` englobe l’image ainsi que la légende, qui doit de son côté Ã
2545ªtre balisée avec `\u003Cfigcaption>`.\n- La balise `\u003Cfigure>` posséde un attribut `aria-label` dont le contenu doit reprendre celui de la balise `\u003Cfigcaption>`.\n- Ajouter un attribut `role=\"figure\"` ou `role=\"group\"` pour une bonne interprétation des lecteurs d'écrans\n\nConstruction HTML de base :\n\n```html\n\u003Cfigure role=\"figure\" aria-label=\"Texte visible\">\n   \u003Cimg src=\"…\" alt=\"Texte alternatif\" />\n   \u003Cfigcaption>\n      Texte visible\n   \u003C/figcaption>\n\u003C/figure>\n```\n\nOn peut aussi utiliser l'attribut `aria-describedby` qui renvoie à un élément de la page qui contient le texte descriptif : \n\n```html\n\u003Cimg src=\"/chemin/image.jpeg\" alt=\"évolution du prix du carburant de 1980 à nos jours\" aria-describedby=\"desc-1 desc-2\">\n\u003Cp id=\"desc-1\">Dès 1980...\u003C/p>\n\u003Cp id=\"desc-2\">A partir de 2001...\u003C/p> \n```\n\n### Si le texte est caché visuellement mais dont on peut activer la vision\n\nOn utilisera un lien ou bouton adjacent permettant d’accéder à la description détaillée :\n\n```html\n\u003Cimg src=\"...\" alt=\"\" >\n\u003Ca href=\"..\" >Description détaillée\u003C/a>\n```\n\n⚠️ l'attribut `longdesc` est déprécié, ne plus l'utiliser !\n\n\n### Les images gérées par css\n\n#### Les svg gérés par feuille de style\n\n- l'image vectorielle est appelée par la feuille de style\n- l'attribut `title`title du svg peut être lue par les lecteurs d'écran, pouvant créer de l'incompréhension : à cacher avec `aria-hidden=\"true\"`\n- ajouter une alternative textuelle si besoin avec la classe CSS `.sr-only`\n\n```html\n\u003Cspan class=\"ico-svg\">\u003C/span>\n\u003Cspan class=\"sr-only\">Accueil\u003C/span>\n```\n\n### Font-icon\n\nLes font-icons sont des images générées par une police particulière.\n\nExemples de font-icons : \n- Font-awesome([https://fortawesome.com/](https://fortawesome.com/)),\n- Font-icons de Bootstrap ([https://icons.getbootstrap.com/](https://icons.getbootstrap.com/))\n- Font-icons de Google ([https://fonts.google.com/icons](https://fonts.google.com/icons))\n\nLa propriété \"content\" peut être lue par les lecteurs d'écrans.\n\nCes éléments sont à cacher avec `aria-hidden=\"true\"` pour éviter que l'image soit \"lue\" par les lecteurs d'écran. \n\nOn peut ajouter une alternative textuelle si besoin avec `.sr-only`.\n\n```html\n\u003Cspan class=\"fa fa-instagram\">\u003C/span>\n\n\u003C!-- donnera : -->\n\n\u003Cspan class=\"fa-brands fa-instagram\" aria-hidden=\"true\">\n\t\u003Cspan class=\"sr-only\">Instagram\u003C/span>\n\u003C/span>\n```\n\n### Les images ASCII\n\nLes images ASCII sont dessinées à partir de caractères spéciaux contenus dans le code ASCII ([Art ASCII - Wikipédia](https://fr.wikipedia.org/wiki/Art_ASCII)).\n\nCes caractères seront difficilement lus / interprétés par les lecteurs d’écrans.\n\n- Cacher les codes ASCII aux lecteurs d’écrans\n- Ajouter un texte équivalent à l’information pour les lecteurs d’écrans si besoin\n\n### Caractères spéciaux directement dans le code\n\n```html\n\u003Cspan aria-hidden=\"true\">\n    \u003Cspan>★\u003C/span>\n    \u003Cspan>★\u003C/span>\n    \u003Cspan>★\u003C/span>\n    \u003Cspan>★\u003C/span>\n    \u003Cspan>☆\u003C/span>\n\u003C/span>\n\u003Cspan role=\"img\" class=\"sr-only\">Note : 4 sur 5\u003C/span>\n```\n\n### Les émoticônes dans la communication\n\n[https://blog.hello-bokeh.fr/2020/07/23/des-emoji-accessibles/](https://blog.hello-bokeh.fr/2020/07/23/des-emoji-accessibles/)\n\n- Un emoji est plus long qu’il en a l’air : c’est parfois la description qui sera restituée\n- Un emoji peut être restitué de façon différente. Exemple : \"coeur rouge\" pour Voice over, \"amour\" pour NVDA\n- chaque navigateur peut renvoyer des rendus visuels différents selon les emojis\n\nComment **utiliser des emojis** :\n\n- **Utiliser des emojis le moins souvent possible**\n- Placer l’émoji à la fin d’une phrase ou d’un message.\n- Mettre les informations importantes avant l’émoji.\n- Choisir un emoji pertinent (par son apparence mais aussi par sa description).\n- S’assurer que le message a du sens même sans emoji.\n\nSur mobile, les librairies d’emojis ne sont pas toujours actualisées. Les images sont alors remplacées par des carrés barrés.\n\nExemple pour une bonne restitution des emojis porteurs d'information : \n```html\n\u003Cdiv>\n  \u003Cp aria-hidden=\"true\">\n    &#x1F408;? &#x1F602;\n  \u003C/p>\n  \u003Cspan role=\"img\" class=\"sr-only\">Un chat? j'en pleure de rire!\u003C/span>\n\u003C/div>\n\n\u003C!-- ou bien : -->\n\n\u003Cdiv>\n  \u003Cp role=\"img\" aria-label=\"Un chat? j'en pleure de rire!\">\n    &#x1F408;? &#x1F602;\n  \u003C/p>\n\u003C/div>\n```\n\n## 9. Gestion des images selon la taille d'écran\n\nGrace aux attributs `srcset` et `sizes`, on peut indiquer au navigateur quelle image chercher en fonction de la taille de l'écran. Ce chargement différencié des nos images nous permet d'allier eco-conception et accessibilité.\n\nAvec `srcset` : \n- on donne au navigateur les chemins pour chercher les fichiers d'images.\n- on sépare les différents fichiers disponibles par une virgule.\n- on indique la largeur de l'image grâce à `480w` par exemple qui correspond à 480 pixels. La taille de l'image est forcément définie en pixels.\n\nAvec `sizes` : \n- on définit l'espace que pourra prendre l'image selon la largeur d'écran. Cet espace peut être défini en pixels, em ou vw.\n\n```html\n\u003Cimg\n  srcset=\"anniversaire-480w.jpg 480w, anniversaire-800w.jpg 800w\"\n  sizes=\"(max-width: 600px) 480px,\n            800px\"\n  src=\"anniversaire-800w.jpg\"\n  alt=\"Les invités de l'anniversaire de Paul\" />\n```\n\nDans l'exemple ci-dessus, `(max-width: 600px)` nous rappelle les media queries : cela indique jusqu'à 600px de largeur d'écran, l'image prend 480px d'espace dans le sens de la largeur. Dans tous les autres cas, l'image prendre 800
2545px d'espace dans le sens de la largeur. \n\n## Chargement des images :\n[[https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/loading]]\n\nPlace holder : [[https://placehold.co/]]\n * lien vers une image 1920x1080\n[[https://via.placeholder.com/1920x1080]]\n","tags":"","title":"$:/code/html/\u003Cimg>","modified":"20241021115505483","type":"text/markdown"},
2546{"created":"20240903113913620","text":"```html\n\u003Cul role=\"list\">\n  \u003Cli role=\"listitem\">Élément 1\u003C/li>\n  \u003Cli role=\"listitem\">Élément 2\u003C/li>\n  \u003Cli role=\"listitem\">Élément 3\u003C/li>\n\u003C/ul>\n```\nExemple de CSS personnalisé :\n\n```css\n.list {\n  list-style-type: disc; /* Utilise des puces */\n  padding-left: 2rem; /* Ajoute un peu de marge à gauche */\n  margin-top: 1rem; /* Ajoute un espace entre les éléments de la liste */\n  margin-bottom: 1rem; /* Ajoute un espace entre les éléments de la liste */\n}\n```","tags":"$:/code/html $:/code/css","title":"$:/code/html/balise/\u003Cul>","modified":"20240927153007541"},
2547{"created":"20240903072400007","text":"\n* aria-labelledby \n>aria-labelledby renvoi le lecteur d'écran vers le contenu textuel (etiquette) de la balise avec l'ID.\n```html\n\u003Cnav aria-labelledby=\"h3\">\n    \u003Ch3 id=\"h3\">Nos catégories\u003C/h3>\n    \u003Cul>\n        \u003Cli>\u003Ca href=\"\">Lien 1\u003C/a>\u003C/li>\n        \u003Cli>\u003Ca href=\"\">Lien 2\u003C/a>\u003C/li>\n        \u003Cli>\u003Ca href=\"\">Lien 3\u003C/a>\u003C/li>\n    \u003C/ul>\n\u003C/nav>\n```\n[[https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-labelledby]]\n\n\n\n\n* aria-descibedby \n\n\n\n__Principales sociétés d'audit d'accessibilité__ :\n\n* [[https://www.atalan.fr/accessibilite-numerique.html]]\n\n# ARIA et composants d'interface riche\n\nARIA sert à donner des informations aux technologies d'assistance. Ces attributs agissent **uniquement** sur la sémantique des éléments (pour donner un nom à un élément, préciser un état, etc...)\n\n## L'attribut `role`\n\nL'attribut `role` sert à changer la sémantique de base d'un élement.\n\nIl ne change PAS le comportement ni l'affichage de cet élément.\n\nExemples :\n- `\u003Cbutton role=\"link\">` sera restitué comme un lien par les lecteurs d'écran. Visuellement, il ressemblera toujours à un bouton dans le navigateur, et se comportera toujours comme un bouton.\n\n```html\n\u003Cdiv class=\"submit-button\" role=\"link\">Valider\u003C/div>\n```\n- `\u003Cdiv role=\"link\">` sera restitué comme un lien par les lecteurs d'écran. Cependant, cet élément ne sera pas cliquable et ne ressemblera pas à un lien dans le navigateur.\n\nL'attribut `role` permet également d'ajouter des sémantiques absentes de la spécification HTML. Par exemple : `role=\"tab\"` pour un onglet.\n\n## Les attributs `aria-*` (états et propriétés)\n\nLes attributs `aria-*` servent à définir des états ou des propriétés sur certains éléments.\n\nPar exemple :\n- `aria-invalid` pour indiquer qu'un champ est en erreur.\n- `aria-expanded` pour indiquer qu'un panneau est déplié.\n- `aria-current` pour indiquer quel est l'item courant dans un menu.\n- ...\n\n## Règle n°1 d'ARIA : Ne pas utiliser ARIA\n\nNE PAS UTILISER LES ATTRIBUTS `ROLE` SAUF DANS LES CAS VUS ENSEMBLE :\n\n- Les attributs `role` pour les zones de la page (`main`, `header`, `nav`, `contentinfo`) sont là pour des raisons de compatibilité, ils sont redondants avec les balises HTML (et donc pas utile selon le W3C validator).\n- `role=\"img\"` : à utiliser sur les balises `\u003Csvg>`.\n- `role=\"figure\"` : à utiliser sur la balise `\u003Cfigure>` (redondant) dans les images légendées.\n- `role=\"presentation\"` ou `role=\"none\"` : sert à annuler la sémantique d'un élément. A utiliser sur les tableaux de mise en forme.\n- Les attributs `role=\"\"` qui n'ont pas d'équivalent en HTML (exemple : `role=\"tab\"`. Il n'y a pas de balise `\u003Ctab>` en HTML.)\n\nUtiliser le moins possible les attributs `aria-*` (voir les cas d'usages ci-dessous).\n\n## Exemples d'attributs ARIA vus pendant la formation et de leurs usages :\n\n- `role=\"banner\"` : à utiliser sur la balise `\u003Cheader>` pour structurer l'en-tête de la page\n- `role=\"main\"` : à utiliser sur la balise `\u003Cmain>` pour structurer la zone de contenu principal\n- `role=\"contentinfo\"` : à utiliser sur la balise `\u003Cfooter>
2547` pour structurer le pied de page\n- `role=\"navigation\"` : à utiliser sur les balises `\u003Cnav>` pour structurer les menus\n- `role=\"img\"` : à utiliser sur les balises `\u003Csvg>` pour indiquer aux lecteurs d'écran qu'il s'agit d'une image (informative)\n- `role=\"figure\"` : à utiliser sur la balise `\u003Cfigure>` dans les images légendées.\n- `role=\"presentation\"` : à utiliser sur les tableaux de présentation (ou de mise en forme), pour éviter que les lecteurs d'écran donnent des indications sur les numéros de lignes, de colonnes, etc.\n- `aria-label` / `aria-labelledby` : à utiliser pour donner des noms à certains éléments.\n    - Sur les balises `\u003Ca>` ou `\u003Cbutton>` SEULEMENT lorsque l'intitulé du lien ou du bouton n'est pas explicite (par exemple : \"En savoir plus\", \"Lire la suite\", etc.).\n    - Sur les balises `\u003Cinput>` (ou autres champs de formulaire, comme `\u003Ctextarea>`) SEULEMENT lorsque l'étiquette du champ n'est pas visible.\n\t  ```html\n\t  \u003Cinput type=\"text\" id=\"name\" name=\"name\" aria-label=\"Saisir votre nom\" placeholder=\"Votre nom\">\n\t  ```\n    - Sur les balises `\u003Csvg>` informatives (ou seules dans un lien).\n    - Sur les balises `\u003Cfigure>`, pour des raisons de compatibilité : reprendre le contenu de la balise `\u003Cfigcaption>`.\n    - Sur des balises `\u003Cul>` ou `\u003Col>` pour nommer des listes (ce n'est pas obligatoire).\n    - Sur les balises `\u003Cnav>` pour donner un nom à chaque menu.\n- `aria-hidden=\"true\"` : sert à masquer un élément aux lecteurs d'écran.\n    - Sur les éléments qui contiennent des polices d'icônes (par exemple : `\u003Ci>`) car ces icônes pourraient être mal restituées par les technologies d'assistance.\n    - Sur les balises `\u003Csvg>` qui contiennent des images décoratives.\n- `aria-current=\"page\"` / `aria-current=\"step\"` / `aria-current=\"true\"` : à utiliser sur l'élément courant dans un menu, ou dans une liste d'étapes par exemple.\n- `aria-describedby` : à utiliser sur les champs de formulaires pour relier le champ à une indcation de format et/ou à un message d'erreur.\n- `aria-invalid` : à utiliser sur les champs de formulaires qui sont en erreur (ne doit pas être présent au chargement du formulaire).\n- `aria-required` : à utiliser sur les champs de formulaires qui sont obligatoires.\n\n## Les motifs de conception des composants d'interface riches\n\nPour certains composants interactifs, il est nécessaire aujourd'hui d'utiliser ARIA (la sémantique HTML n'est pas suffisante pour garantir une bonne restitution par les lecteurs d'écran).\n\nCes composants sont pour la plupart réalisés avec l'aide de Javascript. (Exemples : onglets, carrousels, panneaux dépliants, accordéons, modales...)\n\nPour ces composants, des ressources existent et précisent les interactions clavier attendues, ainsi que les attributs ARIA à utiliser. \n\n>Ces \"recettes\" de composants se nomment des \"motifs de conception\" (\"[[Design Patern|$:
2547/doc/design_patern]]\" en anglais).\n\n\nVoir les fiches dédiées sur AcceDe Web : [[https://www.accede-web.com/notices/interface-riche/]]\n\nvoir également wur le W3C:\n* [[https://www.w3.org/WAI/ARIA/apg/patterns/tabs/examples/tabs-automatic/]]\n *  [[https://www.w3.org/WAI/ARIA/apg/patterns/accordion/examples/accordion/]]\nOu sur APG (en anglais) : [[https://www.w3.org/WAI/ARIA/apg/patterns/]]\n\n* Vour l'article : [[Design Patern|$:/doc/design_patern]]\n  \n* Pour les carroussels : https://www.w3.org/WAI/ARIA/apg/patterns/carousel/examples/carousel-1-prev-next/","tags":"$:/accessibilité","title":"$:/code/html/balises_aria","modified":"20240926070601519","type":"text/markdown"},
2548{"created":"20240617134958697","text":"```html\n\n      \u003Cblockquote>\n        \u003Cp>La beauté est dans les yeux de celui qui regarde.\u003C/p>\n      \u003C/blockquote>\n\n```\n\nBloquote a surtout un usage sémantique (même comportement qu'une div)","tags":"","title":"$:/code/html/blockquote","modified":"20240618073017789"},
2549{"created":"20240617123849112","text":"\n```html\n\n  \u003Cfigure>\n    \u003Cblockquote>\n      \u003Cp>Le courage n'est pas l'absence de peur, mais la capacité de vaincre ce qui fait peur.\u003C/p>\n    \u003C/blockquote>\n    \u003Cfigcaption>\u003Ccite>Nelson Mandela\u003C/cite>\u003C/figcaption>\n  \u003C/figure>\n\n\n//figure>(blockquote>p)+(figcaption>cite)\n\n```\n\n","tags":"","title":"$:/code/html/cite","modified":"20240617135023944"},
2550{"created":"20240902091844902","text":"\n# Police et style\n\nToute la logique de mise en forme doit absolument être gérée par du CSS, afin que les utilisateurs puissent ajouter leur propre feuille de style qui répondra à leurs besoins, ou même, désactiver le CSS du site (critère d'accessibilité)\n\n```html\n\u003Clink rel=\"stylesheet\" href=\"/css/style.css\">\n```\n## Les feuilles de styles utilisateur\n\nUne feuille de styles utilisateur va généralement écraser tous les styles en passant par des sélecteurs d'éléments (`\u003Cp>`, `\u003Cimg / >`...) et en utilisant la déclaration `!important` pour s'assurer de l'application des styles. \nUne fois créée, il faut la déposer dans le dossier des préférences du navigateur.\n\n🚀 [Créer sa feuille de style utilisateur - kloh.ch](https://www.kloh.ch/articles/le-pouvoir-des-feuilles-de-style-utilisateur/#creer-css-user)\n\n## Ne pas utiliser de balises ou d’attributs liés à la présentation\n\n⚠️ Il ne faut pas utiliser les balises et les attributs HTML qui modifieraient la mise en forme.\n\n### Les balises dépréciées\n\nLes éléments `\u003Cbasefont>`, `\u003Cblink>`, `\u003Ccenter>`, `\u003Cfont>`, `\u003Cmarquee>`, `\u003Cs>`, `\u003Cstrike>`, `\u003Ctt>` et `\u003Cbig>` sont interdits.\n\n### Les attributs dépréciés\n\nLes attributs `align`,  `alink`,  `background`,  `bgcolor`,  `border`,  `cellpadding`,  `cellspacing`, `char`, `charoff`,  `clear`,  `compact`,  `color`,  `frameborder`,  `hspace` , `link`,  `marginheight`,  `marginwidth`,  `text`,  `valign`,  `vlink`,  `vspace`,  `size` sont interdits.\n\nNote : les attributs `width` et `height` utilisés sur d’autres éléments que les balises `\u003Cimg>`,  `\u003Cobject>`,  `\u003Cembed>`,  `\u003Ccanvas>`  et `\u003Csvg>` sont également interdits.\n\n### Les balises pour créer des espaces ou de la mise en forme\n\nLes balises de passage à la ligne et de paragraphe pour créer de l’espace\n\nExemple avec la balise `\u003Cbr>` \n\n```html\n\u003Cp>\nparagraphes d'un bloc de texte simulés\n\u003Cbr>\n\u003Cbr>\nà l'aide de plusieurs balises \u003Cbr>\n\u003C/p>\n```\n\nExemple avec la balise `\u003Cp>`\n\n```html\n\u003Cp>\u003C/p>\n\u003Cp>paragraphe d'un bloc de texte\u003C/p>\n\u003Cp>&nbsp;\u003C/p>\n```\n\nExemple avec les espaces insécables &nbsp;\n\n```html\n\u003Cp>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Paragraphe avec une indentation artificielle\u003C/p>\n```\n\n## Contenu inséré avec CSS\n\nAvec CSS, on peut ajouter des caractères dans les éléments. \nTant que ces contenus sont décoratifs, ça ne pose pas de problème. Mais si ces contenus sont importants pour la compréhension, alors, on court le risque qu'ils disparaissent si l'utilisateur importe son propre CSS.\n\nExemple de contenu décoratif inséré avec du CSS :\n```html\na:before{\n  display:inline-block;\n  content:'>>';\n}\n```\n\n## Contenu caché avec CSS\n\nCela concerne les contenus cachés par : \n- `display:none`\n- `visibility:hidden`\n- `aria-hidden=\"true\"`\n- `font-size:0`\n\n### Cachés pour être remplacés\n\nDans certains sites, certains éléments interractifs sont volontairement cachés pour être remplacés.\n\nPar exemple, un radio bouton sera caché par `display:none` pour être remplacé par un \"toggle switch\", plus esthétique. Dans ce cas, le radio bouton n'est plus accessible aux lecteurs d'écran.\n\n🔎 [Exemple de toggle switch où l'input est caché](https://codepen.io/josetxu/pen/LYXEexb)\n\n🔎 [Exemple de toggle switch où l'input n'est pas caché (mais il manque le focus)](https://www.w3schools.com/howto/howto_css_switch.asp)\n\n### Cachés puis affichés \n\nTout contenu caché qui devient visible suite à l'action de l'utilisateur doit être placé dans le code après l'élément qui a été actionné, pour pouvoir être restitué par un lecteur d'écran.\n\n🔎 [Exemple de contenu caché puis visible incompatible avec l'utilisation de lecteur d'écran](https://www.w3schools.com/howto/howto_js_read_more.asp)\n\n🔎 [Exemple de contenu caché puis visible compatible avec l'utilisation de lecteur d'écran](https://www.mam.paris.fr/fr/dates-cles)\n\n## Ordre de lecture défini par le HTML\n\nCe n'est pas le CSS qui doit déterminer l'ordre de lecture des éléments, mais bien l'ordre des éléments dans le HTML.\n\nOn devra faire attention à garder un contenu cohérent dans notre page quand seront désactivées les propriétés `float:right|left` ou `position:absolute|fixed|sticky`.\n\n## Méthode de vérification\n\n[ ] désactiver tous les CSS et de regarder si tout est compréhensible et accessible sans les styles.\n\n## Gestion du zoom texte 200% et du zoom navigateur 200%\n\nL'utilisateur va parfois préférer augmenter la taille de la police dans le navigateur, à la place de la loupe.\n\nOn doit veiller à ce que, lors de l'agrandissament de la taille de la police à 200%, aucun texte ne soit c
2550aché ou tronqué et qu'il n'y ait pas de chevauchement.\n\nNotre site doit supporter/implémenter l'une de ces 3 fonctionnalités sans altération du contenu : \n- zoom graphique du navigateur\n- agrandissement du texte\n- composant d'interface propre au site web permettant d'agrandir le texte ou de zoomer (exemple : boutons A+/A-)\n\n### Zoom Navigateur\n\nIl s’obtient en faisant \"ctrl+\", \"ctrl-\" ou \"ctrl 0\"\n\n### Zoom texte seulement\n\nCertains navigateurs permettent d’agrandir uniquement la taille du texte. \n\n### Du bon usage des unités relatives pour gérer le zoom texte\n\n#### Définir les blocs en %\n\nL’agrandissement des caractères à 200% peut provoquer l'apparition du scroll horizontal, voir pire : \n- Des textes qui sont coupés dans des colonnes trop étroites\n- Des textes qui débordent des blocs\n- Des textes coupés dans des blocs trop étroits\n\nPour éviter de rendre l'information difficile à percevoir, il suffit de permettre l'agrandissement des blocs à l'infini en définissant des largeurs de colonnes en %.\n\n#### Définir les textes en em\n\nL’utilisation d’unités relatives pour le texte telles que les `em`, ou les `rem` permet de résoudre quelques problèmes. \nEn effet, si le texte peut être zoomé, alors les containers doivent aussi suivre l’augmentation de la taille pour ne pas tronquer ou faire se chevaucher le texte.\n\n**Différence entre em et rem**\n\nLe **rem** rend une taille proportionnelle par rapport à la taille du texte à la racine du document (`\u003Chtml>`).\n\nLe **em** rend une taille proportionnelle par rapport à la taille de l'élément parent dans lequel il est contenu.\n\n→ **Privilégier le rem** (mais à défaut, le em, c’est bien aussi)\n\n### Utiliser des hauteurs minimales pour la hauteur des blocs\n\nPour gérer des blocs qui ont des hauteurs fixes, dont les éléments vont déborder si on agrandit le texte ou si on augmente les espacements entre les textes.\n\nDéfinir une hauteur minimale au lieu d’une hauteur fixe.\n\n```css\n.bloc{\n  min-height: 28.125rem; \n}\n```\n\n### Gestion des media-queries (ou points de rupture) en unités relatives\n\nLes média-queries permettent de détecter la taille de l’écran d’affichage, et d’imposer un style selon le format d’affichage \n\nQuand la taille de police est agrandie, les textes peuvent se retrouver entassés et difficiles à gérer.\n\nL’une des solutions est faire en sorte que quand la taille de police est agrandie, on passe à un affichage tablette, où on a gardé toutes les fonctionnalités\n\nLes points de rupture classiques\n\n- Mobile → SM : 576 pixels\n- Tablette → MD : 768 pixels\n- Ordinateur → LG : 992 pixels\n- Grand écran → XL : 1248 pixels\n\nMettre ses media-queries en unités relatives permet de prendre en compte l’agrandissement de la taille de police par défaut\n\nSachant que par défaut 1 em = 16px\n\n- Mobile → SM : 576 pixels → 36 em\n- Tablette → MD : 768 pixels → 48 em\n- Ordinateur → LG : 992 pixels → 62 em\n- Grand écran → XL : 1248 pixels → 78 em\n\n```css\n@media (max-width: 36em) {\n    html {\n      background: yellow;\n    }\n}\n\n@media (max-width: 48em) {\n    html {\n      background: orange;\n    }\n}\n\n@media (max-width: 62em) {\n    html {\n      background: red;\n    }\n}\n\n@media (max-width: 78em) {\n    html {\n      background: purple;\n    }\n}\n```\n\nSource : [https://zellwk.com/blog/media-query-units/](https://zellwk.com/blog/media-query-units/)\n\n🚀 [Refonte de mon portfolio : du responsive tout en EM - marieguillaumet.com](http://marieguillaumet.com/refonte-mon-portfolio-du-responsive-en-em-premiere-partie/)\n\n\n### Méthodes de vérification \n\n#### L’affichage sur mobile ou tablette\n\nEviter le double scroll ou le blocage de l’utilisateur sur un écran réduit ou quand l'affichage est augmenté de 400%.\n\n- Pour chaque page web, les contenus peuvent-ils être présentés sans avoir recours à un défilement vertical pour une fenêtre ayant une hauteur de 256px ou à un défilement horizontal pour une fenêtre ayant une largeur de 320px (hors cas particuliers) ?\n- Dans chaque page web, le contenu proposé est-il consultable quelle que soit l’orientation de l’écran (portrait ou paysage) (hors cas particuliers) ?\n\n#### Garantir la lisibilité en cas de changement des espacements de lettres, de mots de hauteur de ligne\n\nDans le cas où un utilisateur a mis en place une police par défaut avec un interlignage, un espace entre les mots, les caractères différents, peut-il encore lire l’information?  \n\n```css\n* {\n    line-height: 1.5!important;\n    letter-spacing:.12em!important;\n    word-spacing: .16em !important;\n}\n\np {\n    margin-bottom: 2em!important;\n}\n```\n\n### Astuce pour le mode contrastes augmentés\n\nEn mode contrastes augmentés, utiliser `fill: currentColor;` pour s'assurer de la visibilité des images au format SVG :\n\n```html\n\u003Ca class=\"ext-link\" href=\"#\" target=\"_blank\" rel=\"noopener\">\n  Link\n  \u003Csvg class=\"inline-icon\" aria-hidden=\"true\" fill=\"#000000\" xmlns=\"http://www.w3.org/2000/svg\"  viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" focusable=\"false\">\n    \u003Cpath d=\"M 5 3 C 3.9069372 3 3 3.9069372 3 5 L 3 19 C 3 20.093063 3.9069372 21 5 21 L 19 21 C 20.093063 21 21 20.093063 21 19 L 21 12 L 19 12 L 19 19 L 5 19 L 5 5 L 12 5 L 12 3 L 5 3 z M 14 3 L 14 5 L 17.585938 5 L 8.2929688 14.292969 L 9.7070312 15.707031 L 19 6.4140625 L 19 10 L 21 10 L 21 3 L 14 3 z\"/>\n  \u003C/svg>
2550\n\u003C/a>\n```\n\n```css\n.inline-icon {\n  height: 0.75em;\n  height: 1cap;\n  width: 0.75em;\n  width: 1cap;\n  fill: currentColor;\n}\n```\n\n## Les informations sont-elles visuellement perceptibles pour ceux qui voient?\n\n### Distinguer les éléments de leur arrière plan\n\n- Dans chaque page web, les couleurs utilisées dans les [composants d’interface](https://www.numerique.gouv.fr/publications/rgaa-accessibilite/methode-rgaa/glossaire/#composant-d-interface) ou les éléments graphiques porteurs d’informations sont-elles suffisamment contrastées (hors cas particuliers) ?\n- Dans chaque page web, le [contraste](https://www.numerique.gouv.fr/publications/rgaa-accessibilite/methode-rgaa/glossaire/#contraste) entre la couleur du texte et la couleur de son arrière-plan est-il suffisamment élevé (hors cas particuliers) ?\n- Dans chaque page web, les déclarations CSS de couleurs de fond d’élément et de police sont-elles correctement utilisées ?\n\nLes couleurs du texte et du fond doivent être suffisamment contrastées pour faciliter la lecture. Le rapport de contraste requis dépend de la taille calculée de la police.\n\n- Ratio de 4,5 minimum :\n  - taille de police \u003C 24px sans graisse\n  - taille de police \u003C 18,5px gras\n\n- Ratio de 3 minimum :\n  - taille de police >= 24px sans graisse\n  - taille de police >= 18,5px gras\n \nPour les éléments autres que le texte, le ratio doit être de 3 minimum.\n\nOn doit veiller à ce qu'une couleur de fond soit toujours définie sur l'élément ou par héritage. \n\n⚠️ Normalement, il suffit de définir une couleur de fond sur l'élément `\u003Cbody>`, mais il est possible qu'un texte ait une image en fond. Dans le cas où les images seraient désactivées, on perd le contraste nécessaire à la bonne lecture du contenu.\n\n🧰 [Analyseur de contraste des couleurs](https://www.tpgi.com/color-contrast-checker/)\n\n### Des informations qui ne sont pas données par la couleur, la taille, la position ou la forme\n\n- Dans chaque page web, l’information ne doit pas être donnée [par la forme, taille ou position](https://www.numerique.gouv.fr/publications/rgaa-accessibilite/methode-rgaa/glossaire/#indication-donnee-par-la-forme-la-taille-ou-la-position) uniquement. Cette règle est-elle implémentée de façon pertinente ?\n- Dans chaque page web, l’[information](https://www.numerique.gouv.fr/publications/rgaa-accessibilite/methode-rgaa/glossaire/#information-donnee-par-la-couleur) ne doit pas être donnée uniquement par la couleur. Cette règle est-elle respectée ?\n\n### Les liens identifiables facilement\n\n- Dans chaque page web, chaque [lien dont la nature n’est pas évidente](https://www.numerique.gouv.fr/publications/rgaa-accessibilite/methode-rgaa/glossaire/#lien-dont-la-nature-n-est-pas-evidente) est-il visible par rapport au texte environnant ?\n\nLes liens doivent pouvoir être identifiés visuellement lorsqu’ils se trouvent dans un bloc de texte. Dans ce cas, il faut :\n- soit qu'ils ont un contraste suffisant par rapport au texte environnant (un rapport de contraste supérieur à 3) ;\n- soit qu'ils sont indiqués par un autre moyen que la couleur (par exemple une icône adjacente ou tout simplement le soulignement natif text-decoration:underline).\n\n### La prise de focus\n\nLa prise de focus (sur les liens, éléments de formulaire, boutons...) doit rester visible par rapport à la couleur de fond (rapport de contraste de 3).\n\nLa prise de focus est le moment où l'élément est actif (enfoncé, pseudo-classe CSS `:active`) ou lorsque le focus de la tabulation est placé sur un élément pouvant le recevoir (pseudo-classes CSS `:focus`).\n\nPour cela, deux moyens : \n- ne pas annuler ou dégrader la valeur native de la propriété CSS `outline` native du navigateur\n- redéfinir l'effet visuel de prise de focus tout en respectant le [critère 3.3 du RGAA](https://accessibilite.numerique.gouv.fr/methode/criteres-et-tests/#3.3)\n\nDans le cas des liens à proximité d'un texte, au moment du focus/survol, il faut ajouter un autre effet visuel que le changement de couleur (exemple : bordure, graisse...)\n\n### Systèmes d'onglets et menus\n\nL'utilisateur doit savoir où il se trouve dans le site ou sur un système de panneaux. L'utilisation seule de la taille, de la position ou de la couleur n'est pas suffisante.\n\nOn pourra utiliser la propriété `title` ou désactiver l'élément de menu ou d'onglet.\n\nPour les menus, on pourra aussi spécifier `aria-current=\"page\"` sur l'élément de menu menant à la page courante.\n\nPour les systèmes d'onglet, on utilisera `aria-selected=\"true\"` pour savoir quel onglet est sélectionné.\n\n### Les images avec texte incrusté\n\nUne image avec un texte sur un arr
2550ière-plan peut-elle être remplacée par un texte stylisé?\n\n- Chaque [image texte](https://www.numerique.gouv.fr/publications/rgaa-accessibilite/methode-rgaa/glossaire/#image-texte) [porteuse d’information](https://www.numerique.gouv.fr/publications/rgaa-accessibilite/methode-rgaa/glossaire/#image-porteuse-d-information), en l’absence d’un [mécanisme de remplacement](https://www.numerique.gouv.fr/publications/rgaa-accessibilite/methode-rgaa/glossaire/#mecanisme-de-remplacement), doit si possible être remplacée par du [texte stylé](https://www.numerique.gouv.fr/publications/rgaa-accessibilite/methode-rgaa/glossaire/#texte-style). Cette règle est-elle respectée (hors cas particuliers) ?\n\n### L’information reste t-elle présente lorsque l’on désactive les styles?\n\nLorsque les informations sont portées par la feuille de style, celles-ci disparaissent lorsqu’elle est désactivée.\n\nOn vérifie ici que tous les éléments stylisés avec des images gérées en feuille de style ont une équivalence textuelle\n\nExemple : bouton image.\n\n### L’information reste-t-elle [compréhensible](https://www.numerique.gouv.fr/publications/rgaa-accessibilite/methode-rgaa/glossaire/#comprehensible-ordre-de-lecture) lorsque les [feuilles de styles](https://www.numerique.gouv.fr/publications/rgaa-accessibilite/methode-rgaa/glossaire/#feuille-de-style) sont désactivées ?\n\nOn vérifie ici que l’ensemble des éléments de la page sont compréhensibles\n\nExemple : un ordre des éléments qui positionnait le dernier bloc en tout premier visuellement.\n\nSans style, il se retrouve dans une position qui n’est pas compréhensible.\n[[https://color.adobe.com/fr/create/color-contrast-analyzer]]","tags":"$:/code/html $:/accessibilité $:/code/css","title":"$:/code/html/font","modified":"20240913101703905","type":"text/markdown"},
2551{"created":"20240925123040713","text":"[[https://fonts.google.com]]\n\nhttps://fonts.google.com/specimen/Inter?query=inter\n\n* Outil fontBase : Installation locale [[https://fontba.se/downloads/windows]]\n\n\nSinon, installer les fonts dans :\nC:\\Windows\\Fonts\nou \nC: \\Users\\Username\\AppData\\Local\\Microsoft\\Windows\\Fonts","tags":"","title":"$:/code/html/font/googlefonts","modified":"20241021121757634"},
2552{"created":"20240617135733977","text":"* Pour aller plus loin :[[Documentation MDN |https://developer.mozilla.org/fr/docs/Web/HTML/Element/input]]\n\n* Type=\"hidden\"\n\n```html\n\u003Cinput type=\"hidden\" name=\"ref\" value=\"mapetitevaraible\">\n```\n\n\n* Type=\"text\" ou \"submit\"\n```html\n \u003Cform method=\"get\" action='/display'>\n        \u003Cdiv class=\"mb-3\">\n          \u003Clabel for=\"lastname\" class=\"form-label\">Nom\u003C/label>\n          \u003Cinput type=\"text\" class=\"form-control\" id=\"lastname\" name=\"lastname\">\n          \u003Clabel for=\"firstname\" class=\"form-label\">Prénom\u003C/label>\n          \u003Cinput type=\"text\" class=\"form-control\" id=\"firstname\" name=\"firstname\">\n        \u003C/div>\n        \u003Cbutton type=\"submit\" class=\"btn btn-primary\">Envoyer\u003C/button>\n      \u003C/form>\n```\n* Avec accessibilité :\n\n```html\n      \u003Cform\n        action=\"\"\n        method=\"post\"\n        aria-label=\"formulaire de contact\"\n        autocomplete=\"on\"\n      >\n        \u003Clabel for=\"nom\">\n          Nom* :\n\n          \u003Cinput\n            type=\"text\"\n            id=\"nom\"\n            name=\"nom\"\n            placeholder=\"exemple : Dupont\"\n            autocomplete=\"family-name\"\n            required\n          />\n        \u003C/label>\n        \u003Cbr />\n        \u003Clabel for=\"email\">\n          Email* :\n\n          \u003Cinput\n            type=\"email\"\n            id=\"email\"\n            name=\"email\"\n            placeholder=\"exemple : [email protected]\"\n            autocomplete=\"email\"\n            required\n          />\n        \u003C/label>\n        \u003Cbr />\n        \u003Clabel for=\"message\">\n          Votre messsage *\n\n          \u003Ctextarea\n            id=\"message\"\n            placeholder=\"Mon message\"\n            name=\"message\"\n            required\n          >\u003C/textarea>\n        \u003C/label>\n        \u003Cbr />\n        \u003Cbutton>Envoyer un message\u003C/button>\n      \u003C/form>\n      \u003Cp>Les champs avec une asterisque (*) sont obligatoires\u003C/p>\n    \u003C/main>
2552\n```\n\n* Type=\"checkbox\"","tags":"$:/code/html","title":"$:/code/html/form/\u003Cinput>","modified":"20240920085248436"},
2553{"created":"20240704124407479","text":"* Pour aller plus loin : [[Documentation MDN|https://developer.mozilla.org/fr/docs/Web/HTML/Element/select]]\n\n```html\n\n\u003Cselect name=\"cars\" id=\"cars\">\n\u003Coption value=\"volvo\">Volvo\u003C/option>\n\u003Coption value=\"saab\">Saab\u003C/option>\n\u003Coption value=\"mercedes\">Mercedes\u003C/option>\n\u003Coption value=\"audi\">Audi\u003C/option>\n\u003C/select>\n```\n\n```html\n\n\u003Clabel>\n      Avez vous des enfants (oui/non) \u003Cspan title=\"Champ obligatoire\">*\u003C/span>\n      \u003Cselect type=\"email\" name=\"hasChildren\" required>\n        \u003Coption value=\"true\">Oui\u003C/option>\n        \u003Coption value=\"false\">non\u003C/option>\n      \u003C/select>\n\u003C/label>\n\n\n```\n\n* Gestion d'evenement en JS suite à un choix d'option avec ejs\n\n```html\n    \u003Csection class=\"segment\">\n      \u003Cdiv class=\"segment-title segment-title--action\">\n        \u003Ch2>Tous nos conseils de visite en Géorgie\u003C/h2>\n        \u003Clabel class=\"small-hidden\">\n          Visites par ligne\n          \u003Cselect name=\"nbViews\">\n            \u003Coption value=\"2\">2\u003C/option>\n            \u003C!-- \u003Coption value=\"3\">3\u003C/option> -->\n            \u003Coption selected value=\"4\">4\u003C/option>\n          \u003C/select>\n        \u003C/label>\n      \u003C/div>\n      \u003Cdiv class=\"segment-cards segment-cards--4\">\n        \u003C% for (place of data) { %>\n          \u003Carticle class=\"card\">\n\n            \u003Cimg class=\"card-img\" src=\u003C%=place.image %> alt=\"\">\n            \u003Ch3 class=\"card-title\">\n              \u003C%=place.title%>\n            \u003C/h3>\n            \u003Ca class=\"card-action btn\" href=\"../visiter/\u003C%=place.id%>\"\n              aria-label=\"Voir le détail de \u003C%=place.title%>\">Voir le détail\u003C/a>\n          \u003C/article>\n          \u003C% } %>\n\n      \u003C/div>\n    \u003C/section>\n```\n\n```js\nconst select = document.querySelector('select')\nif (select) {\n    select.addEventListener('change', (event) => {\n        const segment = document.querySelector('.segment-cards')\n        if (event.target.value === '2') {\n            segment.classList.remove('segment-cards--4')\n        } else if (event.target.value === '4') {\n            segment.classList.add('segment-cards--4')\n        }\n    })\n}\n```\n\n```css\n.segment-cards {\n  display: grid;\n  grid-template-columns: repeat(2, 1fr);\n  gap: 1rem;\n  margin: 1rem;\n}\n\n\n  .segment-cards--4 {\n    grid-template-columns: repeat(4, 1fr);\n  }\n```\n\n\n* Gestion d'evenement avec attribut onChange\n\n```html\n\u003Cselect onchange=\"handleSelectChange(event)\">\n    \u003Coption value=\"1\">one\u003C/option>\n    \u003Coption value=\"2\">two\u003C/option>\n\u003C/select>\n\n```\n\n```js\n\nWow, no really reusable solutions among answers yet.. I mean, a standard event handler should get only an event argument and doesn't have to use ids at all.. I'd use:\n\nfunction handleSelectChange(event) {\n\n    // if you want to support some really old IEs, add\n    // event = event || window.event;\n\n    var selectElement = event.target;\n\n    var value = selectElement.value;\n    // to support really old browsers, you may use\n    // selectElement.value || selectElement.options[selectElement.selectedIndex].value;\n    // like el Dude has suggested\n\n    // do whatever you want with the value\n}\nYou may use this handler with each – inline js:\n\n\u003Cselect onchange=\"handleSelectChange(event)\">\n    \u003Coption value=\"1\">one\u003C/option>\n    \u003Coption value=\"2\">two\u003C/option>\n\u003C/select>\njQuery:\n\njQuery('#select_id').on('change',handleSelectChange);\nor vanilla JS handler setting:\n\nvar selector = document.getElementById(\"select_id\");\nselector.onchange = handleSelectChange;\n// or\nselector.addEventListener('change', handleSelectChange);\nAnd don't have to rewrite this for each select element you have.\n\nExample snippet:\n\nfunction handleSelectChange(event) {\n\n    var selectElement = event.target;\n    var value = selectElement.value;\n    alert(value);\n}\n```\n","title":"$:/code/html/form/\u003Cselect>","modified":"20240919141528803","type":"text/markdown","tags":"$:/code/html"},
2554{"created":"20240704124611757","text":"```html\n\n\u003Clabel for=\"html\">HTML\u003C/label>\u003Cbr>\n\u003Cinput type=\"radio\" id=\"css\" name=\"fav_language\" value=\"CSS\">\n```","tags":"","title":"$:/code/html/form/input/radio","modified":"20240705072118816"},
2555{"created":"20240902082028717","text":"## La balise `\u003Ctitle>`\n\n\nLe titre d'une page peut être composé pour faire apparaitre dans cet ordre ces différentes informations : \n\n- le nom de la page\n- l'étape d’un parcours\n- l'état ou la position, exemples : \n    - Résultat d’une recherche : afficher le numéro de la page\n    - Rechargement d’un formulaire en erreur\n    - Confirmation de l’aboutissement d'une action\n- le nom du site\n\n```html\n\u003Chead>\n\u003Ctitle> nomdelapage - nomdusite\u003C/title>\n\u003C/head>\n\n```\n\nLes différents éléments composant le titre de la page peuvent être séparés par : \n\n- La virgule\n- le pipe : “|”\n- Le tiret : “-”","tags":"","title":"$:/code/html/head/\u003Ctitle>","modified":"20240911204500302","type":"text/markdown"},
2556{"created":"20240903132104833","text":"```html\n\u003Cheader role=\"banner\">\n```\nLe banner n'est pas nécesaire selon w3c","title":"$:/code/html/header","modified":"20240903132138584"},
2557{"created":"20240902093226584","text":"[[https://www.w3schools.com/graphics/canvas_intro.asp]]","tags":"","title":"$:/code/html/img/canvas","modified":"20240902093256420"},
2558{"created":"20240902084803007","text":"\n## Font-icon\n\nLes font-icons sont des images générées par une police particulière.\n\nExemples de font-icons : \n- Font-awesome([https://fortawesome.com/](https://fortawesome.com/)),\n- Font-icons de Bootstrap ([https://icons.getbootstrap.com/](https://icons.getbootstrap.com/))\n- Font-icons de Google ([https://fonts.google.com/icons](https://fonts.google.com/icons))\n\nLa propriété \"content\" peut être lue par les lecteurs d'écrans.\n\nCes éléments sont à cacher avec `aria-hidden=\"true\"` pour éviter que l'image soit \"lue\" par les lecteurs d'écran. \n\nOn peut ajouter une alternative textuelle si besoin avec `.sr-only`.\n\n```html\n\u003Cspan class=\"fa fa-instagram\">\u003C/span>\n\n\u003C!-- donnera : -->\n\n\u003Cspan class=\"fa-brands fa-instagram\" aria-hidden=\"true\">\n\t\u003Cspan class=\"sr-only\">Instagram\u003C/span>\n\u003C/span>\n```","tags":"","title":"$:/code/html/img/font-icon","modified":"20240914134138051","type":"text/markdown"},
2559{"created":"20240902093404735","text":"[[https://www.w3schools.com/graphics/svg_intro.asp]]","tags":"","title":"$:/code/html/img/svg","modified":"20240902093426472"},
2560{"created":"20240903111922733","text":"__Hierarchie des titres__\n\n```html\n\u003Cp role=\"heading\" aria-level=\"1\">Titre de niveau 1\u003C/p> est sémantiquement équivalent à \u003Ch1>Titre de niveau 1\u003C/h1>.\n\u003Cdiv role=\"heading\" aria-level=\"3\">Titre de niveau 3\u003C/div> à \u003Ch3>Titre de niveau 3\u003C/h3>.\n\n```\n[[https://www.accede-web.com/notices/html-et-css/structure-generale/mettre-en-place-une-hierarchie-de-titres-logique-et-exhaustive-avec-les-balises-h1-a-h6/#:~:text=Le%20role%20ARIA%20heading%20associ%C3%A9%20%C3%A0%20un%20attribut,est%20s%C3%A9mantiquement%20%C3%A9quivalent%20%C3%A0%20%3Ch1%3ETitre%20de%20niveau%201%3C%2Fh1%3E.))]]\n\n```html\n\u003Cbody>\n  \u003Cheader>\n    \u003Cdiv>Mon Blog\u003C/div>\n  \u003C/header>\n\n  \u003Cnav>\n    \u003Cdiv role=\"heading\" aria-level=\"1\">Menu de navigation\u003C/div>\n  \u003C/nav>\n\n  \u003Cmain>\n    \u003Cdiv role=\"heading\" aria-level=\"2\">Contenu principal\u003C/div>\n    \u003Carticle>\n      \u003Cdiv role=\"heading\" aria-level=\"3\">Titre du premier post\u003C/div>\n      \u003Csection>\n        \u003Cdiv role=\"heading\" aria-level=\"4\">Introduction\u003C/div>\n      \u003C/section>\n      \u003Csection>\n        \u003Cdiv role=\"heading\" aria-level=\"4\">Partie principale\u003C/div>\n        \u003Csection>\n          \u003Cdiv role=\"heading\" aria-level=\"5\">Sous-section\u003C/div>\n        \u003C/section>\n      \u003C/section>\n      \u003Csection>\n        \u003Cdiv role=\"heading\" aria-level=\"4\">Conclusion\u003C/div>\n      \u003C/section>\n    \u003C/article>\n\n    \u003Carticle>\n      \u003Cdiv role=\"heading\" aria-level=\"3\">Titre du second post\u003C/div>\n    \u003C/article>\n  \u003C/main>\n\n  \u003Caside>\n    \u003Cdiv role=\"complementary\">Contenu complémentaire\u003C/div>\n  \u003C/aside>\n\n  \u003Cfooter>\n    \u003Cdiv>Pied de page\u003C/div>\n  \u003C/footer>\n\u003C/body>\n\n```","tags":"","title":"$:/code/html/main/\u003Chx>","modified":"20240903134246141","type":"text/markdown"},
2561{"created":"20240903113547131","text":"```html\n\u003Csection role=\"list\">\n  \u003Cdiv role=\"listitem\">List item 1\u003C/div>\n  \u003Cdiv role=\"listitem\">List item 2\u003C/div>\n  \u003Cdiv role=\"listitem\">List item 3\u003C/div>\n\u003C/section>\n```\n\n\n","tags":"","title":"$:/code/html/main/\u003Cli>","modified":"20240903113912322"},
2562{"created":"20240902091544968","text":"\n# Médias\n\nCompatibilité avec les technologies d’assistance\n\n## A. Média temporel\n\n### 1. Définitions\n\n- Média temporel seulement audio : contenu sonore (Wav, Mp3…)\n- Média temporel seulement vidéo : images ou photos en mouvement ou en séquence\n- Média temporel synchronisé : flux audio ou vidéo synchronisé avec un autre format pour présenter de l’information et/ou comportant des composants temporels interactifs.\n\nUn média temporel peut être consulté de 2 manières différentes :\n\n- Fichier à télécharger consultable avec un logiciel externe à la page web\n- Contenu embarqué dans la page web et consultable dans la page web via :\n    - Un plugin (par exemple une vidéo diffusée par un lecteur Flas
2562h)\n    - L’élément `\u003Cvideo>` (par exemple une vidéo)\n    - L’élément `\u003Caudio>` (par exemple un podcast)\n    - L’élément `\u003Csvg>` (par exemple un dessin animé vectoriel)\n    - L’élément `\u003Ccanvas>` (par exemple un dessin animé en image bitmap)\n    - L’élément `\u003Cbgsound>` pour diffuser un arrière-plan sonore à la page web.\n\n### 2. Description\n\nLe média doit être identifiable grâce à un titre ou un texte adjacent (avant ou après).\n\nCette description doit permettre aux utilisateurs de comprendre la teneur du média et les informations qu'il contient.\n\n### 3. Les sous-titres\n\nLes sous-titres pour personnes sourdes ou mal-entendantes (*closed captions*) sont différents des sous-titres pour des besoins de traductions (*subtitle*).\n\nLes sous-titres pour rendre accessible un média qui contient une bande audio doit être écrit dans la langue originale de la vidéo, et doivent reprendre toutes les informations de la vidéo : \n- dialogues\n- voix off\n- bruits qui permettent de comprendre l'action\n\nIls doivent être activables/désactivables par l'utilisateur.\n\n### 4. La transcription textuelle\n\nLa transcription textuelle doit reprendre dans l'ordre chronologique de leur apparition dans le média :\n- la totalité de ce qui y est exprimé oralement\n- toutes les informations descriptives nécessaires à une compréhension équivalente de l'action.\n\nLa transcription textuelle est un contenu structuré qui peut comporter des titres ou des listes si nécessaire.\n\nElle peut être mise à disposition des utilisateurs : \n- directement en dessous du média, en précisant sa nature\n- sur une autre page accessible par un lien affiché sous le média\n\n### 5. Audiodescription\n\nL'audiodescription concerne les médias qui comportent des contenus visuels porteur d'information, comme par exemple : les textes inscrutés, descriptions d'actions visibles.\n\nElle peut être mise à disposition des utilisateurs : \n- via un bouton qui activera/désactivera l'audiodescription\n- une seconde vidéo qui comporte l'audiodescription\n\nElle doit être activable/désactivable par l'utilisateur.\n\n⚠️Si la bande sonore de la vidéo originale ne permet pas d'ajouter la totalité de l'audiodescription, alors cette dernière n'est pas requise. \n\n### 6. Navigation clavier et souris\n\n⚠️Le lecteur doit être utilisable aussi bien avec une navigation au clavier comme avec un système de pointeur (ex : souris).\n\nLes controles du média obligatoires sont : \n- bouton lecture\n- bouton pause\n- bouton arrêt\n- bouton pour désactiver le son (en cas de piste sonore)\n- bouton pour controler le volume du son (en cas de piste sonore)\n- bouton pour activer/désactiver les sous-titres (si présents)\n- bouton pour activer/désactiver l'audiodescription (si présente)\n\nSi on développe notre propre lecteur multimédia, il faudra utiliser des balises `\u003Cbutton>` ou `\u003Cinput type=\"range\">` pour créer ces boutons. \n\nCes boutons devront avoir des noms accessibles pertinents, et dans le cas d'un bouton image, il faudra une alternative textuelle correspondant à la fonction du bouton.\n\nLes noms des éléments doivent être mis à jour, c'est-à-dire qu'ils changent de valeur et/ou de nom (par exemple le contrôle de volume passe de 10 à 0, ou bien quand le bouton \"pause\" devient un bouton \"lecture\").\n\nDans le cas du bouton du controle du volume/temps, on peut utiliser des propriétés ARIA : \n- `role=\"slider\"`\n- `aria-valuemin=\"0\"` et `aria-valuemax=\"100\"` pour indiquer les deux valeurs limites\n- `aria-valuenow=\"n\"` doit être mis à jour quand on utilise le bouton. À noter que la valeur de aria-valuenow sera restituée au lecteur d'écran s'il n'y a pas de aria-valuetext présent\n- `aria-valuetext=\"n\"` c'est la valeur qui sera restituée par le lecteur d'écran. Cette valeur est à personnaliser : pourcentages, unités de temps en cas de barre de défilement de la vidéo\n- `aria-label=\"volume du son\"` définit le nom du bouton\n\nExemple : \n```html \n\u003Cdiv class=\"lecteur__volume-barre\" role=\"slider\" aria-valuenow=\"71\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-label=\"volume du son\" aria-valuetext=\"71%\" >\n```\n\n## B. Médias non temporel\n\nLes médias non temporels ne se déroule pas dans le temps, ils peuvent être consultables via un plugin (Flash, Java, Silverlight…) ou via les éléments `svg`  et `canvas`, comme par exemple : une carte interactive.\n\nUn média non temporel peut contenir des médias temporels (un lecteur Flas
2562h qui propose une liste de vidéos à consulter, par exemple).\n\nCe type de média est la plus souvent complètement inaccessibles aux utilisateurs de lecteur d'écran, et inutilisable en cas de navigation clavier.\n\nIl faut dans ce cas prévoir une alternative accessible, présentant l'information contenue dans ce média.\n\n🔎 Tests RGAA : \n- [https://accessibilite.numerique.gouv.fr/methode/criteres-et-tests/#4.8](https://accessibilite.numerique.gouv.fr/methode/criteres-et-tests/#4.8)\n- [https://accessibilite.numerique.gouv.fr/methode/criteres-et-tests/#4.9](https://accessibilite.numerique.gouv.fr/methode/criteres-et-tests/#4.9)\n- [https://accessibilite.numerique.gouv.fr/methode/criteres-et-tests/#4.12](https://accessibilite.numerique.gouv.fr/methode/criteres-et-tests/#4.12)\n- [https://accessibilite.numerique.gouv.fr/methode/criteres-et-tests/#4.13](https://accessibilite.numerique.gouv.fr/methode/criteres-et-tests/#4.13)\n","tags":"","title":"$:/code/html/media","modified":"20240902093849610","type":"text/markdown"},
2563{"created":"20240829082215975","text":"* Code html d'un bloc navigation avec accessibilité\n\n```html\n\u003Cnav role=\"navigation\" aria-label=\"Menu principal\" class=\"menu\">\n  \u003Cul>\n    \u003Cli>\u003Ca href=\"#\" aria-current=\"true\" class=\"menu__item menu__item--current\">Accueil\u003C/a>\u003C/li>\n    \u003Cli>\u003Ca href=\"#\" class=\"menu__item\">Rubrique 1\u003C/a>\u003C/li>\n    \u003Cli>\u003Ca href=\"#\" class=\"menu__item\">Rubrique 2\u003C/a>\u003C/li>\n  \u003C/ul>\n\u003C/nav>\n```\n\n```\n//emmet\nnav[role=navigation][aria-label=\"Menu principal\"].menu>ul>li*3>a\n\n// avec position courante\nli>a[aria-current=\"true\"].menu__item.menu__item--current\n```\n\n## Les blocs de navigation\n\nUne site web, pour être accessible, doit comporter au moins deux blocs de navigation parmi ceux listés :\n- Menu principal\n- Moteur de recherche\n- Plan du site\n\nIl faut que ces blocs soient placés au même endroit sur toutes les pages : \n- Visuellement (pour ceux qui utilisent l'interface graphique)\n- Dans le code (pour ceux qui utilisent les lecteurs d’écrans)\n\n☝️*Exception faite pour les sites qui ont moins de 5 pages.*\n\n### Menu principal\n\nLe menu principal d'un site est une liste non ordonnée des liens qui permet de naviguer sur le site.\n\nIl doit avoir un titre, par exemple :  “menu principal” ou “menu”\n\nPour que l'utilisateur puisse connaitre sa position courante dans un menu, on doit ajouter : \n- visuellement une bordure ou mise en gras ou un picto…\n- dans le code, un attribut `aria-current=”true”` (pour les lecteurs d’écrans)\n\n### - Moteur de recherche\n\nPour être considéré comme un système de navigation, le moteur de recherche doit indexer \u003Cu>toutes les pages et tous les contenus du site.\u003C/u>\n\n\n### - Plan du site\n\nLe plan du site est une **liste** de liens représentative de l’arborescence des pages du site web. \n\nLes intitulés des liens doivent être pertinents, et les liens doivent être tous fonctionnels.\n\nSi il existe une hiérarchie entre des liens, on peut la faire figurer en imbriquant les `\u003Cul>`. Si l'imbrication est trop complexe, on peut la subsituer à des listes titrées (`h(x)` + `ul`).\n\nLe plan du site n'est pas obligatoirement exhaustif, surtout si il y a beaucoup de pages (comme dans le cas des sites e-commerce avec beaucoup de pages produit), mais il doit contenir l'arborescence suffisante pour trouver une information.\n\n### - Fil d’Ariane\n\nPour aider l'utilisateur à s'y retrouver dans le site, dans le cas où il y a beaucoup de catégories et de sous-catégories, il est recommandé d'utiliser un menu de type \"fil d'ariane\" *(breadcrumb)*.\n\nIl doit être construit en suivant ces consignes : \n- Titre “Vous êtres ici”\n- Liste ordonnée : `\u003Col>`\n- Séparateurs cachés aux lecteurs d’écran\n\nExemple de fil d'ariane : \n```html\n\u003Cnav role=\"navigation\" aria-label=\"Vous êtes ici\">\n  \u003Col>\n    \u003Cli>\u003Ca href=\"#\">Accueil\u003C/a>\u003C/li>\n    \u003Cli>\u003Cspan aria-hidden=\"true\"> > \u003C/span>\u003Ca href=\"#\">Rubrique\u003C/a>\u003C/li>\n    \u003Cli>\u003Cspan aria-hidden=\"true\"> > \u003C/span>\u003Ca>Page\u003C/a>\u003C/li>\n  \u003C/ol>\n\u003C/nav>\n```\n##  Lien d'évitement ou lien d'accès rapide\n\nUn lien d'évitement \u003Cu>doit être présent \u003C/u> et \u003Cu>doit permettre d'accéder directement à la zone de contenu principal \u003C/u>.\n\nCe lien d'évitement peut être caché ou toujours visible, mais doit être obligatoirement visible à la prise de focus. \n\n\u003Cu>Il doit être le premier élément interactif de la page.\u003C/u>\n\n[Lien d'évitement - RGAA](https://accessibilite.numerique.gouv.fr/methode/criteres-et-tests/#12.7)","tags":"","title":"$:/code/html/nav","modified":"20240829195514581","type":"text/markdown"},
2564{"created":"20240902085805624","text":"# Tableaux\n\n## A. Tableaux de données simples\n\n### 
25641. Définition\n\nLes balises essentielles à la construction d’un tableau sont : `\u003Ctable>`, `\u003Ctr>`, `\u003Cth>`, `\u003Ctd>`\n\nExemple d'un tableau de données simple\n\n```html\n\u003Ctable>\n\t\u003Ctr>\n\t\t\u003Cth>Date\u003C/th>\n\t\t\u003Cth>Evènement\u003C/th>\n\t\t\u003Cth>Description\u003C/th>\n\t\u003C/tr>\n\t\u003Ctr>\n\t\t\u003Ctd>30 Janvier 2023\u003C/td>\n\t\t\u003Ctd>Cours sur les tableaux\u003C/td>\n\t\t\u003Ctd>Les tableaux de données dans leur complexité\u003C/td>\n\t\u003C/tr>\n\u003C/table>\n```\n\n### 2. Définition de groupes d'entête, corps et pied : thead, tbody, tfoot\n\nOn peut définir des groupes de lignes :\n\n- un groupe de lignes qui est identifié comme étant l'entête à l'aide de la balise `\u003Cthead>`\n- un pour le contenu à l'aide de la balise `\u003Ctbody>`\n- un pour le pied du tableau à l'aide de la balise `\u003Ctfoot>` (très peu utilisée)\nChaque balise `\u003Cthead>`, `\u003Ctbody>` ou `\u003Ctfoot>` est enfant direct de `\u003Ctable>` et a pour enfant une balise `\u003Ctr>` dans laquelle vont se trouver les cellules de la ligne.\n\nExemple :\n\n```html\n\u003Ctable>\n  \u003Cthead>\n\t\t\u003Cth>Date\u003C/th>\n\t\t\u003Cth>Evènement\u003C/th>\n\t\t\u003Cth>Description\u003C/th>\n  \u003C/thead>\n  \u003Ctbody>\n\t\t\u003Ctd>30 Janvier 2023\u003C/td>\n\t\t\u003Ctd>Cours sur les tableaux\u003C/td>\n\t\t\u003Ctd>Les tableaux de données dans leur complexité\u003C/td>\n  \u003C/tbody>\n\u003C/table>\n```\n\n### 3. Tableau de données ayant un titre\n\nOn peut définir un titre de tableau à l'aide de la balise `\u003Ccaption>`. \n\nElle doit être placée en tant que premier enfant de la balise `\u003Ctable>`.\n\nExemple :\n```html\n\u003Ctable>\n  \u003Ccaption>Concerts\u003C/caption>\n  \u003Cthead>\n\t\t\u003Cth>Date\u003C/th>\n\t\t\u003Cth>Evènement\u003C/th>\n\t\t\u003Cth>Description\u003C/th>\n  \u003C/thead>\n  \u003Ctbody>\n\t\t\u003Ctd>30 Janvier 2023\u003C/td>\n\t\t\u003Ctd>Cours sur les tableaux\u003C/td>\n\t\t\u003Ctd>Les tableaux de données dans leur complexité\u003C/td>\n  \u003C/tbody>\n\u003C/table>\n```\n\n### 4. Déclaration des entêtes de colonnes ou de ligne pour l’ensemble de la ligne ou de la colonne\n\n#### `\u003Cth>` et attributs `scope=\"row\"` ou  `scope=\"col\"`\n\nChaque cellule de tableau peut être reliée à une cellule d'entête.\nCes entêtes vont être définies par des balise `\u003Cth>`.\n\n##### - Entêtes verticales\n\nDans la très grande majorité des cas, il va s'agir d'entête de colonne qui vont donc être regroupées dans la première ligne du tableau, dans la zone d'entête.\n\nOn peut préciser si les cellules reliées à cette entête sont celles de la colonne à l'aide de l'attribut `scope=\"col\"`.\n\nExemple d'un tableau avec uniquement des entête de colonnes : \n\n```html\n\u003Ctable>\n  \u003Ccaption>Anniversaires à venir\u003C/caption>\n  \u003Cthead>\n\t  \u003Ctr>\n\t    \u003Cth scope=\"col\">Personne\u003C/th>\n\t    \u003Cth scope=\"col\">Date\u003C/th>\n\t  \u003C/tr>\n  \u003C/thead>\n  \u003Ctbody>\n\t  \u003Ctr>\n\t    \u003Ctd>Annie\u003C/td>\n\t    \u003Ctd>1er Janvier\u003C/td>\n\t  \u003C/tr>\n\t  \u003Ctr>\n\t    \u003Ctd>Marcel\u003C/td>\n\t    \u003Ctd>22 Août\u003C/td>\n\t  \u003C/tr>\n\t\u003C/tbody>\n\u003C/table>\n```\n\n##### - Entêtes horizontales\n\nIl est aussi possible d'avoir des entêtes de ligne, qui vont être positionnées en tant que première cellule de la ligne du tableau.\n\nDans ce cas, pour préciser que les cellules reliées à cette entête sont celles de la ligne, on utilise l'attribut `scope=\"row\"`.\n\nExemple d'un tableau avec uniquement des entête de lignes :\n```html\n\u003Ctable>\n  \u003Ccaption>Anniversaires à venir\u003C/caption>\n  \u003Ctr>\n    \u003Cth scope=\"row\">Annie\u003C/th>\n    \u003Ctd>1er Janvier\u003C/td>\n  \u003C/tr>\n  \u003Ctr>\n    \u003Cth scope=\"row\">Marcel\u003C/th>\n    \u003Ctd>22 Août\u003C/td>\n  \u003C/tr>\n\u003C/table>\n```\nDans ce cas, pas besoin de définir des lignes d'entête ou de contenu.\n\n#### Combiner entêtes de colonnes et de lignes\n\nExemple d'un tableau à double entrée : \n```html\n\u003Ctable>\n  \u003Ccaption>Concerts\u003C/caption>\n  \u003Cthead>\n\t  \u003Ctr>\n\t    \u003Cth scope=\"col\">Date\u003C/th>\n\t    \u003Cth scope=\"col\">Groupe\u003C/th>\n\t  \u003C/tr>\n  \u003C/thead>\n  \u003Ctbody>\n\t  \u003Ctr>\n\t    \u003Cth scope=\"row\">12 Février\u003C/th>\n\t    \u003Ctd>Mes souliers sont rouges\u003C/td>\n\t  \u003C/tr>\n\t  \u003Ctr>\n\t    \u003Cth scope=\"row\">14 Février\u003C/th>\n\t    \u003Ctd>Angèle\u003C/td>\n\t  \u003C/tr>\n  \u003C/tbody>\n\u003C/table>
2564\n```\n\n## B. Tableau de données complexes\n\n### 1. Définition\n\nUn tableau de données est une structure introduite par une balise `\u003Ctable>` ou lorsqu’il est correctement restitué par les technologies d’assistance par une balise pourvue d’un attribut WAI-ARIA `role=\"table\"`.\n\nLorsqu’un tableau de données contient des en-têtes qui ne sont pas répartis uniquement sur la première ligne et/ou la première colonne de la grille ou dont la portée n’est pas valable pour l’ensemble de la colonne ou de la ligne, on parle de tableau de données complexe. \nPar exemple : entêtes fusionnés.\n\nIl est alors nécessaire de fournir un « résumé » permettant d’en expliquer sa nature et sa structure afin d’en faciliter la consultation pour des utilisateurs de technologies d’assistance par exemple.\n\n### 2. Le résumé des tableaux complexes : `\u003Ccaption>`\n\nEn HTML5, la seule technique utilisable actuellement est celle qui consiste à insérer le résumé directement dans le titre (balise `\u003Ccaption>`) en masquant le résumé via CSS si nécessaire.\n\n### 3. Gestion des entêtes de ligne ou colonnes incomplètes\n\nAttributs interdits pour l’entête de ligne ou colonne incomplète : `scope` , `role=\"rowheader\"` , `role=\"columnheader\"`\n\n- Cellule d'en-tête avec attribut `id`\n- Cellule de donnée avec un attribut `headers`\n- L’attribut `headers` possède la liste des valeurs d’attribut `id` des en-têtes associés, séparées par un espace.\n\n```html\n\u003Ctable>\n  \u003Ccaption>\nCEN T3 - Établissements selon les sphères de\nl'économie au\n31 décembre 2011 \u003Cspan class=\"hidden\"> - Le tableau présente le\nnombre\nd'établissements et de postes salariées, en nombre et en pourcentage,\npour\nchaque sphère de l'économie avec, pour chacune d'elle, la part du\ndomaine\npublic. La première ligne du tableau totalise les résultats pour\nl'ensemble\ndes sphères.\u003C/span>\n  \u003C/caption>\n  \u003Ctr>\n      \u003Ctd rowspan=\"2\">\u003C/td>\n      \u003Cth colspan=\"2\" id=\"etab\">Établissements\u003C/th>\n      \u003Cth colspan=\"2\" id=\"poste\">Poste salariés\u003C/th>\n  \u003C/tr>\n  \u003Ctr>\n      \u003Cth id=\"nb1\">Nombre\u003C/th>\n      \u003Cth id=\"p1\">%\u003C/th>\n      \u003Cth id=\"nb2\">Nombre\u003C/th>\n      \u003Cth id=\"p2\">%\u003C/th>\n \u003C/tr>\n \u003Ctr>\n      \u003Cth id=\"ens\">Ensemble\u003C/th>\n      \u003Ctd headers=\"etab ens nb1\">59 943\u003C/td>\n      \u003Ctd headers=\"etab ens p1\">100,0\u003C/td>\n      \u003Ctd headers=\"poste ens nb2\">278 034\u003C/td>\n      \u003Ctd headers=\"poste ens p2\">100,0\u003C/td>\n \u003C/tr>\n \u003Ctr>\n      \u003Cth id=\"sp1\">Sphère non présentielle\u003C/th>\n      \u003Ctd headers=\"etab sp1 nb1\">24 017\u003C/td>\n      \u003Ctd headers=\"etab sp1 p1\">40,1\u003C/td>\n      \u003Ctd headers=\"poste sp1 nb2\">75 591\u003C/td>\n      \u003Ctd headers=\"poste sp1 p2\">27,2\u003C/td>\n  \u003C/tr>\n  \u003Ctr>\n      \u003Cth id=\"pub1\">dont domaine public\u003C/th>\n      \u003Ctd headers=\"etab sp1 pub1 nb1\">27\u003C/td>\n      \u003Ctd headers=\"etab sp1 pub1 p1\">40,1\u003C/td>\n      \u003Ctd headers=\"poste sp1 pub1 nb2\">594\u003C/td>\n      \u003Ctd headers=\"poste sp1 pub1 p2\">0,2\u003C/td>\n  \u003C/tr>\n  \u003Ctr>\n    \u003Cth id=\"sp2\">Sphère présentielle\u003C/th>\n    \u003Ctd headers=\"etab sp2 nb1\">35 926\u003C/td>\n    \u003Ctd headers=\"etab sp2 p1\">59,9\u003C/td>\n    \u003Ctd headers=\"poste sp2 nb2\">202 443\u003C/td>\n    \u003Ctd headers=\"poste sp2 p2\">72,8\u003C/td>\n  \u003C/tr>\n  \u003Ctr>\n    \u003Cth id=\"pub2\">dont domaine public\u003C/th>\n    \u003Ctd headers=\"etab sp2 pub2 nb1\">942\u003C/td>\n    \u003Ctd headers=\"etab sp2 pub2 p1\">1,6\u003C/td>\n    \u003Ctd headers=\"poste sp2 pub2 nb2\">69 878\u003C/td>\n    \u003Ctd headers=\"poste sp2 pub2 p2\">25,1\u003C/td>\n  \u003C/tr>\n\u003C/table>\n```\n\n## C. Tableau de mise en forme\n\n### 1. Définition\n\nC'est un tableau HTML qui ne contient aucune donnée, mais qui sert à structurer la mise en forme de la page. \n\nCe cas est rare, et ne devrait être dû qu'à l'héritage d'anciennes pratiques de mise en forme quand le CSS n'était pas encore bien utilisé.\n\n### 2. Désactiver la sémantique du tableau\n\nSi on n'a pas le temps de reprendre toute la structure du HTML, ARIA nous fournit ces valeurs pour l'attribut `role`, afin que le tableau de mise en forme ne soit pas restitué comme un tableau de données : \n- `role=”presentation”`\n- `role=”none”`\n\n### 3. Les balises interdites\n\n- Le tableau de mise en forme (balise `\u003Ctable>`) ne doit pas avoir d’attribut `summary` (sinon vide) et ne doit pas contenir de balises `\u003Ccaption>`, `\u003Cth>`, `\u003Cthead>`, `\u003Ctfoot>`, `\u003Ccolgroup>` ou de balises ayant un attribut WAI-ARIA `role=\"rowheader\"`, `role=\"columnheader\"` ;\n- Les cellules du tableau de mise en forme (balises `\u003Ctd>`) ne doivent pas posséder d’attributs `scope`, `headers`, `axis`.\n\n","tags":"","title":"$:/code/html/table","modified":"20240902091709792","type":"text/markdown"},
2565{"created":"20240530120735543","text":"\n\n!!! Switch\n\n\n```js\n\nconst expr = 'Papayas';\nswitch (expr) {\n  case 'Oranges':\n    console.log('Oranges are $0.59 a pound.');\n    break;\n  case 'Mangoes':\n  case 'Papayas':\n    console.log('Mangoes and papayas are $2.79 a pound.');\n    // Expected output: \"Mangoes and papayas are $2.79 a pound.\"\n    break;\n  default:\n    console.log(`Sorry, we are out of ${expr}.`);\n}\n\n```\n","tags":"","title":"$:/code/instructions_conditionnelles_itératives","modified":"20240610075349681"},
2566{"created":"20240605074422507","text":"* Déclaration du script en tant que module\n\n```js\n  \u003Cscript src=\"./script.js\" type=\"module\"  defer=\"true\">\u003C/script>\n\n// \u003Cscript> est une balise englobante qui peut contenir directement du JavaScript, toutefois on préférera de manière générale séparer les responsabilités, avec l'attribut  src=\n\n//ES205, un standard (ESM)\n//Les solutions vu précédemments sont des paliatifs à l'absence de système de module natif en JavaScript. Cependant avec l'évolution des standards le JavaScript s'est vu doté d'un tel système lors de l'arrivé de l'EcmaScript 2015.\n//Un script peut être chargé dans une page HTML comme un module.\n\n//\u003Cscript src=\"app.js\" type=\"module\">\n//A l'intérieur de ce fichier il est ensuite possible d'utiliser les mots clef import et export.\n//Ainsi, comme les modules prennent en charge des mots-clés et des fonctionnalités spéciales, nous devons indiquer au navigateur qu’un script doit être traité comme un module, en utilisant l’attribut \u003Cscript type=\"module\">
2566.\non place la balise \u003Cscript> dans le head ou à la fin du body\n```\n\n\n* Déclaration d'objet / collection\n\n```js\nconst profil = {\nname: \"Hercule\",\ninRelationship: true,\njob: \"Demi-dieu\",\nage:35;\ndepartement: \"75\",\narm: 60.5 ,\n displayProfil: function() { // méthode\n    const sentence = `${profil.name}  du ${profil.departement } n profession  ${profil.job}`;\n    alert(sentence);\n  }\n}\n```\n\n```js\n// en javascript\n```\n","tags":"","title":"$:/code/js","modified":"20240913092134252","icon":"$:/img/ico/js.ico"},
2567{"created":"20240530120641575","text":"\u003Cu>\u003Ch3> Qu'est‑ce qu'un tableau (array) ?\u003C/h3>\u003C/u>\n\n\n\n  \n> Les __tableaux__ sont généralement décrits comme des \"objets de type liste\" \n\n* Référence pour le langage javascript: [[Documentation MDM|https://developer.mozilla.org/fr/docs/Learn/JavaScript/First_steps/Arrays]]\n## Les tableaux\n> Notions : index, clé\n\n### Tableau indexé\n> Notions : déclaration, manipulation, lecture\n\n[Mdn : Tableau](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Global_Objects/Array)\n\n```js\nlet monTableau = [\"abc\", \"def\"];\nmonTableau.push(\"ghi\");\nconsole.table(monTableau);\n//0: \"abc\"\n//1: \"def\"\n//2: \"ghi\"\n\n\nconst valeurDeux = monTableau[1];\nconsole.log(valeurDeux);\n//'def'\n```\n\n### Tableau associatif (objets)\n> Notions : déclaration, manipulation, lecture\n\n[Mdn : Utiliser les objets](https://developer.mozilla.org/fr/docs/Web/JavaScript/Guide/Working_with_Objects#indexing_object_properties)\n\n```js\nlet monTabAsso = {\n    cle: \"valeur\",\n    autrecle: 42\n};\nconsole.log (monTabAsso);\n//{cle: 'valeur', autrecle: 42}\n\nmonTabAsso.encorecle = true; //ajoute un élément au tableau, impossible de monTabAsso.push\n// Comme monTabAsso contient un objet (js), encorecle est une propriété de l'objet stocké dans monTabAsso\n\nconsole.log(monTabAsso);\n//{cle: 'valeur', autrecle: 42, encorecle: true}\nconsole.log(monTabAsso.encorecle);\n//true\nconsole.log(monTabAsso['encorecle']);\n//true\n\nlet valeurCle = monTabAsso.cle;\nconsole.log(valeurCle);\n//\"valeur\"\n```\n\n\n\n\n```js\n// en javascript\nlet TableFriends = [\"Jupiter\", \"Junon\", \"Alcmène\",\"Déjanire\" ] ;\n\nTableFriends[0];  //  > Jupiter\nArray.isArray(TableFriends)  ; // > true\n\nconsole.log(typeof TableFriends);  // > object\n```\n\n[[https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Array]]\n\n* Methode ''Reduce''\n\n\n```js\n\nconst array1 = [1, 2, 3, 4];\n\n// 0 + 1 + 2 + 3 + 4\nconst initialValue = 0;\nconst sumWithInitial = array1.reduce(\n  (accumulator, currentValue) => accumulator + currentValue,\n  initialValue,\n);\n//reduce() exécute la fonction callback une fois pour chaque élément présent dans le tableau et ignore les éléments vides du tableau\n\n\n//exemple calcul de moyenne\n\nlet somme = notes.reduce((prev, curr) => prev + curr, 0);\nlet moyenne = somme / notes.length;\n```\n[[https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce]]\n","tags":"$:/code/js","title":"$:/code/js/array","modified":"20240920135215309","type":"text/markdown"},
2568{"created":"20240916141015858","text":"* exemple\n\n```js\n\n/**\n * Permet de récupérer les jeux disponibles sur un device\n * \n * @param {Array} games le tableau des jeux\n * @param {String} device le nom du device (playstation, xbox, windows, linux, mac, sega, nintendo, arcade, atari)\n * @returns Un tableau des jeux qui sont disponibles sur le device demandé\n */\nexport function getGamesByDevice (games, device) {\n  return games.filter((game) => game.devices.includes(device));\n}\n\n```\n\n","title":"$:/code/js/array/filter","modified":"20240916141217560"},
2569{"created":"20240927034550924","text":"La méthode `findIndex` renvoie l’index de la première occurrence d’un élément dans le tableau qui satisfait le prédicat donné\n\n```js\nconst arr = [3, 5, 4, 2, 7];\nconst item = 4;\nconst index = arr.findIndex(x => x === item);\nif (index !== -1) {\n    console.log(`L'élément ${item} se trouve à l'index ${index} dans le tableau.`);\n} else {\n    console.log(`L'élément ${item} n'est pas trouvé dans le tableau.`);\n}\n```","tags":"","title":"$:/code/js/array/findIndex","modified":"20240927034636131"},
2570{"created":"20240927034344483","text":"La méthode `indexOf` renvoie l’index de la première occurrence de l’élément donné dans un tableau.\n\n```js\nconst arr = [3, 5, 4, 2, 7];\nconst item = 4;\nconst index = arr.indexOf(item);\nif (index !== -1) {\n    console.log(`L'élément ${item} se trouve à l'index ${index} dans le tableau.`);\n} else {\n    console.log(`L'élément ${item} n'est pas trouvé dans le tableau.`);\n}\n```","tags":"","title":"$:/code/js/array/indexOf","modified":"20240927034451215"},
2571{"created":"20240625081321506","text":"\n## MAP\n\nLa méthode map permet de modifier les valeurs d'un tableau dans une nouvelle copie selon une règle.\n\nElle permet de créer un nouveau tableau avec les résultats de l’appel d’une fonction fournie sur chaque élément du tableau d’origine. \n\nLa méthode [`.map`](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Global_Objects/Array/map) du prototype Array est un exemple courant  pour se représenter une approche fonctionnelle puisqu'elle adopte complètement ce principe. \nAu même titre d'ailleurs que d'autres méthodes de Array telle que `forEac
2571h` ou `filter`.\n\n* Cette fonction est un peu comme un for each ... Le \".map\" permet d'appliquer une opération identique à tout les éléments d'un tableau et retourne un nouveau tableau.\nPour reprendre la doc, elle fonctionne ainsi : \n\n```js\nconst numbers = [1, 4, 9, 16];\n\n// la méthode map s'appelle sur un tableau\n// on lui passe une fonction callback qui sera executée sur chaque valeur du tableau d'origine\n// le callback prendra la valeur courante en paramètre\n// et sa valeur de retour sera utilisée pour remplir un nouveau tableau qui sera retourné par map\nconst doubles = numbers.map(value => value * 2);\n\nconsole.log(doubles); // [2, 8, 18, 32]\n\n// tout ce qu'on a à configurer c'est la transposition à opérer\n// on obtiendra toujours un nouveau tableau avec les résultats de ces transpositions\nconst triples = numbers.map(value => value * 3);\nconst screamNumbers = numbers.map(num => `${num} !!`);\n```\n\nLa méthode `map` sert donc à transposer un tableau vers un nouveau, le nom est bien choisi. \n\nGrâce à cette méthode dont on ne connait pas les détails, on ne sait pas _comment_ elle fonctionne (on ne sait pas si elle fait un `for` ou un `while` pour parcourir le tableau d'origine par exemple) on a pu se concentrer sur notre but, \"l'objectif\" : transposer un tableau.\n\nL'argument attendu à l'appel de la fonction map est une fonction callback.\n\n```js\n  let arrayToMap = [2,66,3,28,12];\n\t\narrayToMap = arrayToMap.map(value => value + 10);\n\n//ou\n\narrayToMap = arrayToMap.map(value => {return value + 10});\n\n\n\n```\n\n* Sur un objet contenu dans un tableau :\n\n```js\nconst data = [\n    {\n      firstname: 'Marge',\n      lastname: 'Simpson',\n      gender: 'Women',\n      age: 34,\n    },\n    {\n      firstname: 'Ned',\n      lastname: 'Flanders',\n      age: 61,\n    },\n    {\n      firstname: 'Charles Montgomery',\n      lastname: 'Burns',\n      age: 104,\n    },\n    {\n      firstname: 'Waylon',\n      lastname: 'Smithers',\n      age: 36,\n    },\n  ];\n\nconst characters = data.map( person => {\n  const name = `${person.firstname} ${person.lastname}`;\n    const young = person.age \u003C 50;\n  return {name, young};\n  \n    }); \n\n\t// ou \n\n\t     const characters2 = data.map(({ firstname, lastname, age }) => {\n        return { \n          name: `${firstname} ${lastname}`, \n          young: age \u003C 50 \n        }\n      })\n```\n\n* Recuperer la valeur max d'un tableau avec des identifiant numériques d' objets\n\n```js\nconst newTasks = [\n\t  {\n    id: 1,\n    label: 'Faire les courses',\n    done: true,\n  },\n  {\n    id: 2,\n    label: 'Réserver le resto',\n    done: false,\n  },\n]\nconst maxId = Math.max(newTasks.map((task) => task.id), 0);\n```\n\nLa méthode map ne fonctionne qu'avec des tableaus, pour appliquer une transformations similaires à un objet, il faut utiliser Object.entries ou object Object.fromEntries :\n\n```js\nconst user = {\n  name: 'Alice',\n  age: 25\n};\n\nconst updatedUser = Object.fromEntries(\n  Object.entries(user).map(([key, value]) => [key, typeof value === 'number' ? value * 2 : value])\n);\n\nconsole.log(updatedUser); // { name: 'Alice', age: 50 }\n```\n* Object.entries(user) : Convertit l’objet en un tableau de paires clé-valeur.\n* map(([key, value]) => [key, ...]) : Applique une transformation à chaque paire.\n* Object.fromEntries(...) : Convertit le tableau de paires transformées en un nouvel objet.\n* Pour aller plus loin : [[Documentation MDM |https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Global_Objects/Array/map]]","tags":"$:/code/js","title":"$:/code/js/array/map","modified":"20241002072909922","type":"text/markdown"},
2572{"created":"20240909134726401","text":"```js\nconst numbers = [1, -2, 3, -4, 5];\nconst sum = numbers.reduce((accumulator, currentValue) => accumulator + currentValue, 0);\nconsole.log(sum); // Affiche 3\n```\n\n```js\nconst data = [\n  { \"id\": -1, \"date\": \"2024-01-01\", \"label\": \"\", \"amount\": 1600, \"category\": \"Revenus\" },\n  { \"id\": -1, \"date\": \"2023-12-01\", \"label\": \"\", \"amount\": 1900, \"category\": \"Revenus\" },\n \n];\n\nconst result = data.reduce((acc, current) => {\n  if (!acc[current.category]) {\n    acc[current.category] = 0;\n  }\n  acc[current.category] += current.amount;
2572\n  return acc;\n}, {});\n\nconsole.log(result); // Affiche { Revenus: 11700 }\n```","tags":"","title":"$:/code/js/array/reduce","modified":"20240926174347950"},
2573{"created":"20240902204814144","text":"__exo1 - Inventory Update__\n\nCompare and update the inventory stored in a 2D array against a second 2D array of a fresh delivery. Update the current existing inventory item quantities (in arr1). If an item cannot be found, add the new item and quantity into the inventory array. The returned inventory array should be in alphabetical order by item.\n\nsource: [[https://www.freecodecamp.org/learn/coding-interview-prep/algorithms/inventory-update]]\n\n````js\nfunction updateInventory(arr1, arr2) {\n\n//\u003C!-- on teste si les données d'entrées sont bien des tableaux -->\nif (Array.isArray(arr1) && Array.isArray(arr2)) { \n\n// combinaison des deux tableaux en un seul\nlet combinedInv = [...curInv, ...newInv];\nconsole.log(\"Combinaison des deux tableaux\",combinedInv);\n\nvar inventory = combinedInv.reduce((acc, curr) => {\n    var existingItem = acc.find(item => item[1] === curr[1]);\n    if (existingItem) {\n        existingItem[0] += curr[0];\n    } else {\n        acc.push(curr);\n    }\n    return acc;\n}, []);\n\nconsole.log(\"Somme conditionnelle du tableau obtenu\",inventory)\n\n// tri du tableau obtenu \nlet sortInv = inventory.sort(function(a, b) {\n    var itemA = a[1].toUpperCase();\n    var itemB = b[1].toUpperCase();\n    if (itemA \u003C itemB) {\n        return -1;\n    }\n   if (itemA > itemB) {\n       return 1;\n   }\n   return 0;\n});\n\n\nconsole.log(\"Taille du tableau résultant :\",sortInv.length);\nconsole.log(\"Affichage du tableau\",sortInv);\n\nif (sortInv.length==6) { arr1 = sortInv;}\n} else {console.log(\"les données en entrées ne sont pas correctes\")}\n    return arr1;\n}\n\n// Example inventory lists\nvar curInv = [\n    [21, \"Bowling Ball\"],\n    [2, \"Dirty Sock\"],\n    [1, \"Hair Pin\"],\n    [5, \"Microphone\"]\n];\n\nvar newInv = [\n    [2, \"Hair Pin\"],\n    [3, \"Half-Eaten Apple\"],\n    [67, \"Bowling Ball\"],\n    [7, \"Toothpaste\"]\n];\n\nupdateInventory(curInv, newInv);\n\n```","tags":"","title":"$:/code/js/array/reduce/exo1","modified":"20240903124907095","type":"text/markdown"},
2574{"created":"20240916140848242","text":"\n* [[Documentation MDM|https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Global_Objects/Array/sort]]\n\n\n* Exemples de tri de tableau par ordre alphabétique ou par odre croissant\n\n```js\n/**\n * Permet de trier un tableau de jeux par nom\n * \n * @param {Array} games Le tableau des jeux\n * @param {String} order L'ordre de tri (asc ou desc)\n * @returns Un tableau de jeux triés dans l'ordre demandé\n */\n\nexport function sortGamesByName (games, order) {\n  return games.sort((a, b) => {\n    if (order === 'asc') {\n      return a.title.localeCompare(b.title);\n    } else {\n      return b.title.localeCompare(a.title);\n    }\n  });\n}\n\n\n```\n\n```js\n}\n\n/**\n * Permet de trier un tableau de jeux par note\n * \n * @param {Array} games le tableau des jeux\n * @param {String} order l'ordre de tri (asc ou desc)\n * @returns Un tableau des jeux triés par note dans l'ordre demandé\n */\nexport function sortGamesByRate (games, order) {\n  return games.sort((a, b) => {\n    if (order === 'asc') {\n      return a.rate - b.rate;\n    } else {\n      return b.rate - a.rate;\n    }\n  });\n}\n\n```\n\n* Exemple de tri pour privilegier une valeur en particulier \n\n```js\n        const oldGames = [...filteredGames];\n        const newGames = [];\n        newGames = oldGames.devices.sort((a,b)  =>  {\n            if (a=== plateformSelected ) {return -1} ;\n            if (b=== plateformSelected ) {return 1} ;\n            return a - b;}\n    );  \n```","tags":"$:/code/js","title":"$:/code/js/array/sort","modified":"20240919150652111"},
2575{"created":"20240820082130289","text":"## Body Parser\n\nPour récupérer les données envoyées dans le corps de la requête HTTP, on peut utiliser le middleware `express.urlencoded()` qui permet de parser les données envoyées dans le corps de la requête HTTP.\n\nPar exemple, pour récupérer les données d'un formulaire HTML, on peut utiliser le middleware `express.urlencoded()` :\n\n```js\n// ...\n\n// Permet de parser les données envoyées dans le corps de la requête HTTP\napp.use(express.urlencoded({extended: true}));\n\napp.post('/utilisateur', (req, res) => {\n   const email = req.body.email;\n   const password = req.body.password;\n   const nom = req.body.nom;\n    const prenom = req.body.prenom;\n  // Créer un nouvel utilisateur\n  // ...\n  res.json(utilisateur);\n});\n\n```\n\n## Accepter les données au format JSON dans nos requêtes\n\nPour les opérations en post et en patch pour créer ou mettre à jour, il faudra passer des informations dans la requête. Pour cela on avait vu le middleware `urlencoded` d'express pour parser le payload d'une requête écrit au format urlencoded.\n\nExpress fourni également un middleware json\n\n```js\napp.use(express.json());\n```\n\nAinsi le client peut envoyer le payload de sa requête au format JSON\n\nExemple pour la requête `PATCH /user/2` on pourra passer le payload suivant dans la requête\n```json\n{\n  \"pseudo\": \"toto\",\n  \"password\": \"123456789Abc!\"\n}
2575\n```","type":"text/markdown","title":"$:/code/js/BodyParser/HTTP","tags":"","modified":"20240919194155217"},
2576{"created":"20240530120836718","text":"```js\n\n//Exemple de compteur avec boucle for en javascript\nfor (let counter = 0; counter \u003C 3; counter++) {\n  console.log('coucou', counter); \n}\n\n//L'instruction break peut être utilisée pour stopper une boucle immédiatement, ce n'est pas réservé au switch\n\nfor (let counter = 0; counter \u003C 10; counter++) { // on prévoit de compter jusqu'à 10\n  console.log(counter);\n  if (counter === 7) { // sauf que finalement à 7 on sort\n    break;\n  }\n}\n\n```","tags":"$:/code/js","title":"$:/code/js/boucle_For","modified":"20240913095804817"},
2577{"created":"20240913093611181","text":"\n## Les boucles\n> for, for of, for in\n\n[Mdn : for](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Statements/for)\n\n[Mdn : les autres boucles](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Statements/for#voir_aussi)\n\n### for\n> Exécute une série d'instructions plusieurs fois\n\n```js\nfor (let i = 0; i \u003C 42;
2577 i++) {\n    console.log(i);\n}\n```\n\n```js\n let rateElement = \"\";\n\n    // Je ne fais cette partie que si rate est défini\n    if(rate) {\n        // EXEMPLE : RATE (note) vaut 4\n\n        // Pour les coeurs rouges => je compte de 0 à 4\n        for(let count = 0; count \u003C rate; count++) {\n            rateElement += \"❤️\"\n        }\n        // Pour les coeurs gris => je compte de 4 à 5\n        for(let count = rate; count \u003C 5; count--) {\n            rateElement += \"🖤\"\n        }\n    }\n\n```\n\n### for of\n\n> Parcours le tableau et fournit l'élément à chaque itération, ne fonctionne pas avec un tableau associatif\n\n```js\n\n// Cas Array\nconst monTableau = [\"abc\", \"def\", \"ghi\"];\n\nfor (const element of monTableau) {\n  console.log(element);     // Affichera \"abc\", puis \"def\", puis \"ghi\"\n}\n\n\n// Cas Object\nconst monTabAsso = {\n    cle: \"valeur\",\n    autrecle: 42,\n    encorecle: false\n};\n\nfor (const element of monTabAsso) {\n  console.log(element);     // erreur : pas itérable\n}\n\n\nfor (const key of Object.keys(monTabAsso)) {\n  console.log(key);     // plus d'erreur\n}\n\n//cle\n//autrecle\n//encorecle\n\n\nfor (const element of Object.entries(monTabAsso)) {\n  console.log(element);     // plus d'erreur\n}\n\n//['cle', 'valeur']\n//['autrecle', 42]\n//['encorecle', false]\n```\n\n### for in\n> Parcours le tableau et fournit l'index à chaque itération, ou la clé pour un objet\n\n```js\nconst monTableau = [\"abc\", \"def\", \"ghi\"];\n\nfor (const index in monTableau) {\n  console.log(index);                   // Affichera 0, puis, 1, puis 2\n  console.log(monTableau[index]);       // Affichera \"abc\", puis \"def\", puis \"ghi\"\n}\n\n//0\n//abc\n//1\n//def\n//2\n//ghi\n\n\nconst monTabAsso = {\n    cle: \"valeur\",\n    autrecle: 42,\n    encorecle: false\n};\n\nfor (const property in monTabAsso) {\n  console.log(property);                   // Affichera cle, puis autrecle, puis encorecle\n  console.log(monTabAsso[property]);       // Affichera \"valeur\", puis 42, puis false\n}\n\n//cle\n//valeur\n//autrecle\n//42\n//encorecle\n//false\n```\n\n[Autre boucle While MDN](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Statements/while)\n","tags":"$:/code/js","title":"$:/code/js/boucles","modified":"20240917083824678","type":"text/markdown"},
2578{"created":"20240701094915821","text":"**Attribut** : Un attribut est une variable définie au sein d’une classe. Il représente une propriété ou une caractéristique d’un objet créé à partir de cette classe. Par exemple, dans une classe Voiture, des attributs pourraient être couleur, marque, ou vitesseMaximale1.\n\n**Paramètre** : Un paramètre est une variable utilisée dans une fonction ou une méthode. Il est passé à la fonction lors de son appel et permet de fournir des données nécessaires à l’exécution de cette fonction. Par exemple, une méthode accélérer dans la classe Voiture pourrait prendre un paramètre augmentationVitesse pour indiquer de combien augmenter la vitesse.\n\n__Objet internes au javascript__\n\n>Les objets internes JavaScript commencent par une majuscule : String, Math, Array, Boolean, Date, Number, Function (à ne pas confondre avec le mot-clef function), RegExp, etc…\n\n\n```js\nconsole.log({} === {}); // false\n//C'est normal ?\n// Oui les objets et les tableaux sont stockés par référence. Bien que ces 2 objets soient identiques ce sont 2 objets distincts en mémoire\n```\n\n\n* Pour accéder à la valeur d'une propriété d'un objet : \n```js\n\nobjet.propriete //ou\nobjet[\"propriete\"]\n\n```\n\n* En JavaScript, il existe plusieurs façons de définir et de créer des objets, et les classes ne sont pas le seul moyen. \n\nVoici quelques autres méthodes courantes :\n\n* Notation littérale d'objet :\n```js\n\n/**\n * @property {object} person - la designation de l'objet\n * @property {string} name \n * @property {Array} propriete - une liste de proprietes\n */\n \nconst person = {\n  name: \"John\",\n  properties: [ {age:30}]\n};\n```\n\n* Constructeur d'objet :\n```js\nconst person = new Object();\nperson.name = \"John\";\nperson.age = 30;\n```\n* Fonction constructeur :\n\n```js\nfunction Person(name, age) {\n  this.name = name;\n  this.age = age;\n}\n\nconst john = new Person(\"John\", 30);\n```\n\n* La décomposition (ou destructuring)\n\nCela permet de récupérer le contenu d'un objet ou d'un tableau\n\n```js\n// Destructuring d'un objet\nconst user = { name: 'Alice', age: 25 };\nconst { name, age } = user;\nconsole.log(name); // Alice\nconsole.log(age);  // 25\n\n// Destructuring d'un tableau\nconst numbers = [1, 2, 3];\nconst [first, second, third] = numbers;\nconsole.log(first);  // 1\nconsole.log(second); // 2\nconsole.log(third);  // 3\n\n\n```\n\n\tExemple avec un objet qui contient des propriétés imbriquées : \n\n```js\nconst user = {\
2578n  name: 'Alice',\n  address: {\n    city: 'Paris',\n    country: 'France'\n  }\n};\n\n// Destructuring avec des propriétés imbriquées\nconst { name, address: { city, country } } = user;\n\nconsole.log(name);    // Alice\nconsole.log(city);    // Paris\nconsole.log(country); // France\n\n```\nIl est également possible de définir des valeurs par défaut lors du destructuring :\n\n```js\nconst user = {\n  name: 'Alice',\n  address: {\n    city: 'Paris'\n    // country n'est pas défini\n  }\n};\n\nconst { name, address: { city, country = 'Unknown' } } = user;\n\nconsole.log(name);    // Alice\nconsole.log(city);    // Paris\nconsole.log(country); // Unknown\n```\n\nou avec des alias :\n\n```js\nconst user = {\n  name: 'Alice',\n  address: {\n    city: 'Paris',\n    country: 'France'\n  }\n};\n\nconst { name: userName, address: { city: userCity, country: userCountry } } = user;\n\nconsole.log(userName);    // Alice\nconsole.log(userCity);    // Paris\nconsole.log(userCountry); // France\n```\n\n## Classe d'objet\n\n\n**Création d'un classe en javascript**\n\n```js\n\n// app/models/User.js\nclass User {\n// nom de la class avec une majuscule par convention\n  id;\n  name;\n  email;\n\n  constructor(idRecu, nameRecu, emailRecu) {\n    this.id = idRecu;\n    this.name = nameRecu;\n    this.email = emailRecu;\n  };\n  presentation() {\n    console.log(this.name) \n  }\n}\n\n\u003C!-- export default User; -->\n```\n\n* Pour instancier un objet de la classe\n\n```js\nconst benoit = new User( 1, 'benoit','[email protected]')\nbenoit.presentation();\n```\n\n* héritage \u003Ccode> class Entity extends User{ }\u003C/code>\n\n Si j'étends une classe mère avec `extends` lorsque je définis une nouvelle classe, j'hérite des méthodes et propriétés de la classe mère sans avoir besoin de les répéter dans la classe enfant\n\n\n```js\nclass Entity extends User{\n  telephone;\n\nconstructor(id, name, email, telephone) {\nsuper(id, name, email);\nthis.telephone = telephone;\n}\n\n}\n\n```\n\n\n* Création d'une instance de classe avec des propriétés privée et donc des \"setter\" et \"getter\"\n\n```js\nclass User {\n\n  // j'ai des propriétés privées\n  #name;\n  #email;\n\n  // pourtant je donne l'impression d'assigner des propriétés publiques dans le constructor\n  // j'appelle en fait le setter qui lui va assigner la propriété privée après avoir fait ses tests \n  constructor(name, email) {\n    this.name = name;\n    this.email = email; \n  }\n\n  // le setter fait les tests et assigne la propriété privée, celle qui sera rendue visible par les getter\n  // la valeur du paramètre, c'est la valeur assignée à la propriété\n  set name(value) {\n    if (typeof value !== 'string' || value.length === 0) {\n      throw new Error('Le nom doit être une chaîne de caractère non vide');\n    }\n    this.#name = value;\n  }\n\n  set email(value) {\n    if (typeof value !== 'string' || !value.includes('@')) {\n      throw new Error('L\\'email est invalide');\n    }\n    this.#email = value;\n  }\n\n  get name() {\n    return this.#name.toLowerCase();\n  }\n\n  get email() {\n    return this.#email;\n  }\n\n  get profil() {\n    return `${this.name} ${this.email}`;\n  }\n}\n```\nUne propriété privée N'est accessible qu'au sein de la classe qui la définit\n\n \n## méthode statique \n\nLes méthodes statiques sont appelées directement sur la classe, sans nécessiter d'instanciation.\nExemple : MaClasse.maMethodeStatique()\n* Indépendance des instances :\nLes méthodes statiques n'ont pas accès aux propriétés d'instance (non-statiques) de la classe.\nElles ne peuvent pas utiliser this pour référencer une instance.\nUtilisation commune :\nElles sont souvent utilisées pour des opérations utilitaires qui ne nécessitent pas d'état d'objet.\nExemple : Math.random() en JavaScript.\nAccès aux membres statiques :\nLes méthodes statiques peuvent accéder et manipuler des propriétés statiques de la classe.\nHéritage :\nLes méthodes statiques sont héritées par les sous-classes, mais ne peuvent pas être redéfinies.\nSyntaxe en JavaScript :\njavascript\nclass MaClasse {\n  static maMethodeStatique() {\n    // code\n  }\n}\n\nUtilisation dans la classe :\nÀ l'intérieur de la classe, on peut faire référence à une méthode statique en utilisant le nom de la classe ou this.constructor.\nIl est important de noter que les méthodes statiques ne peuvent pas être appelées sur des instances de la classe (monInstance.maMethodeStatique() ne fonctionnera pas) et qu'elles ne peuvent pas utiliser this pour accéder aux propriétés d'instance.","tags":"$:/code/js","title":"$:/code/js/class","modified":"20241002072125631","type":"text/markdown"},
2579{"created":"20240902220532957","text":"```js\nconst tableau1 = ['a', 'b', 'c'];\nconst tableau2 = [1, 2, 3];\nconst tableauConcatene = tableau1.concat(tableau2);\nconsole.log(tableauConcatene); // ['a', 'b', 'c', 1, 2, 3]\n```","tags":"","title":"$:/code/js/concat","modified":"20240902220904519"},
2580{"created":"20240913100659964","text":"\n\n## Les conditions\n> Notions : utilisation, opérateurs\n\n[Mdn : Prendre des décisions dans le code](https://developer.mozilla.org/fr/docs/Learn/JavaScript/Building_blocks/conditionals)\n\n```js\nlet valeur = 12;\n\nif ( valeur \u003C 5 ) {\n    console.log(\"valeur est inférieur à 5\");\n}\nelse if ( valeur \u003C 10 ) {\n    console.log(\"valeur est inférieur à 10 et supérieur à 5\");\n}\nelse {\n    console.log(\"valeur est supérieur ou égal à 10\");\n}\n```\n\n[Switch case](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Statements/switch)","tags":"$:/code/js","title":"$:/code/js/conditions","modified":"20240917083647636","type":"text/markdown"},
2581{"created":"20240912080827746","text":"!!! operateur de coalition : \n\nCondition, si sinon :\n\n`\nrepoDescElement.textContent = repoDesc !== null ? repoDesc : \"\";\n`\n\nen plus court encore :\n\n\n`\nrepoDes ?? \"\" (si repoDes est défini => repoDesc sinon chaine vide)\n`\n\n```js\n        if(repoDesc) {\n            repoDescElement.textContent = repoDesc;\n        } else {\n            repoDescElement.textContent = \"\";\n        }\n\n```\n","tags":"","title":"$:/code/js/conditions/ternaire","modified":"20241002080601034"},
2582{"created":"20240716080106322","text":"```\nconsole.log\nconsole.table\nconsole.dir\n```\n\n## Debogage\n\nLe débogage permet d'identifier et de corriger les erreurs dans le code, ce qui est crucial pour créer des applications robustes et fiables. \n\n### Utilisation de `console.log()`\n\nLa méthode la plus simple et la plus courante de débogage en JavaScript consiste à utiliser `c
2582onsole.log()` pour afficher des messages dans la console du navigateur ou du terminal. Cela vous permet de vérifier les valeurs des variables, de suivre l'exécution du code et de repérer les erreurs potentielles.\n\nExemple :\n\n```javascript\nlet x = 10;\nconsole.log(\"La valeur de x est :\", x);\n```\n\n### Placement des `console.log()`\n\nPlacer judicieusement des instructions `console.log()` dans votre code peut grandement faciliter le processus de débogage. Voici quelques conseils pour bien les placer :\n\n- **Avant et après les blocs de code critiques :** Ajoutez des messages de journalisation avant et après les blocs de code où vous soupçonnez un problème.\n- **Affichage des valeurs des variables :** Insérez des instructions `console.log()` pour afficher les valeurs des variables importantes afin de vérifier leur état à différents points d'exécution.\n\n- **Dans les boucles et les fonctions :** Utilisez des `console.log()` à l'intérieur des boucles et des fonctions pour suivre leur exécution et repérer les erreurs potentielles.\n\n- **Après les conditions :** Ajoutez des messages de journalisation après les instructions conditionnelles pour vérifier si elles sont exécutées comme prévu.\n\n- **Sur les événements :** Utilisez des `console.log()` pour suivre les événements et les interactions avec l'utilisateur dans les applications web.\n\nEn plaçant stratégiquement des instructions `console.log()` dans votre code, vous pouvez obtenir des informations précieuses sur son exécution et identifier plus facilement les problèmes.\n\n### Utilisation des breakpoints avec Visual Studio Code\n\nVisual Studio Code (VSCode) propose un excellent débogueur intégré qui vous permet de placer des breakpoints dans votre code JavaScript. Voici comment utiliser les breakpoints avec VSCode :\n\n1. Ouvrez votre fichier JavaScript dans VSCode.\n2. Cliquez sur le côté gauche de la ligne où vous souhaitez placer le breakpoint. Cela ajoutera un point rouge, indiquant que le breakpoint a été défini.\n3. Démarrez le débogage en cliquant sur le bouton de débogage dans la barre latérale ou en appuyant sur `F5`.\n4. Lorsque votre code atteint le breakpoint, l'exécution est mise en pause et vous pouvez inspecter les valeurs des variables, suivre le flux d'exécution, et analyser les erreurs à l'aide des outils de débogage de VSCode.\n\n### Utilisation des erreurs et des exceptions\n\nLes erreurs et les exceptions fournissent des informations précieuses sur les problèmes dans votre code JavaScript. En capturant et en gérant correctement les erreurs à l'aide des blocs `try...catch`, vous pouvez identifier et résoudre les problèmes plus rapidement.\n\nExemple :\n\n```javascript\ntry {\n  // Code susceptible de générer une erreur\n} catch (error) {\n  console.error(\"Une erreur s'est produite :\", error);\n}\n```\n\n### Utilisation des outils de développement du navigateur\n\nLes navigateurs modernes offrent des outils de développement puissants qui vous permettent de déboguer efficacement votre code JavaScript. Voici quelques fonctionnalités utiles disponibles dans les outils de développement du navigateur :\n\n- **Console :** L'onglet Console vous permet d'afficher les messages de journalisation, les erreurs et les avertissements générés par votre code JavaScript. Vous pouvez également exécuter des commandes JavaScript directement dans la console pour tester des expressions et des fonctions.\n\n- **Sources :** L'onglet Sources vous permet de visualiser et de déboguer le code source de votre application. Vous pouvez placer des breakpoints, suivre le flux d'exécution, inspecter les valeurs des variables et naviguer dans les fichiers source de manière interactive.\n\n- **Debugger :** L'onglet Debugger vous permet de contrôler l'exécution de votre code JavaScript en utilisant des breakpoints et des points d'arrêt. Vous pouvez mettre en pause l'exécution, reprendre l'exécution, avancer pas à pas dans le code et analyser les valeurs des variables à chaque étape.\n\n- **Network :** L'onglet Network vous permet de surveiller les requêtes HTTP effectuées par votre application, y compris les requêtes AJAX, les requêtes de chargement de ressources, etc. Vous pouvez inspecter les en-têtes de requête et de réponse, les données de requête et de réponse, ainsi que les temps de chargement.\n\n- **Performance :** L'onglet Performance vous permet d'analyser les performances de votre application en enregistrant et en analysant les événements de chargement, les temps de rendu, les temps d'exécution des scripts, etc. Vous pouvez identifier les goulots d'étranglement et optimiser les performances de votre application.\n\n- **Memory :** L'onglet Memory vous permet de surveiller l'utilisation de la mémoire par votre application JavaScript. Vous pouvez visualiser les allocations de mémoire, les références d'objets, les fuites de mémoire potentielles et identifier les zones de mémoire non utilisées.\n\n- **Application :** L'onglet Application vous permet de gérer les données stockées localement par votre application, y compris les cookies, le stockage local, le stockage de session, les bases de données IndexedDB, etc. Vous pouvez inspecter, modifier et supprimer les données de stockage selon vos besoins.\n\n### Utilisation des tests unitaires\n\nLes tests unitaires vous aident à détecter les erreurs dans votre code en vérifiant automatiquement le comportement des fonctions et des modules individuels. En écrivant des tests unitaires robustes à l'aide de frameworks comme Jest ou Mocha, vous pouvez identifier et corriger les problèmes dès qu'ils surviennent. On voit ça dans la saison 8 ;)\n\n### Tips & Tricks pour lire les erreurs correctement\n\n- Lisez attentivement le message d'erreur pour comprendre où se situe le problème dans votre code.\n- Utilisez les outils de débogage de VSCode pour examiner la pile d'appels (stack trace) et identifier la ligne exacte où l'erreur s'est produite.\n- Utilisez des noms de variables descriptifs pour faciliter la compréhension du code et des messages d'erreur.\n- Décomposez le problème en parties plus petites et testez chaque partie individuellement pour isoler la cause de l'erreur.\n- N'hésitez pas à rechercher des solutions en ligne, avec chatGPT, consulter la documentation ou demander de l'aide à d'autres développeurs si vous rencontrez des difficultés pour résoudre une erreur.\n","tags":"","title":"$:/code/js/console","modified":"20240921221549098","type":"text/markdown"},
2583{"created":"20240605114052539","text":"\n\n```js\n\nconst now = new Date();\nconst heures = now.getHours();
2583\nconst hour = now.toLocaleString(\"fr-FR\", { month: \"2-digit\", day: \"2-digit\" })\n\nconst today = new Date();\nconst H = today.getHours();\nconst M = today.getMinutes();\nconst S = today.getSeconds();\nconst heureActuelle = H + \":\" + M;\n\n\n```\n\n```js\n// Plutôt privilégier moment.js\nconst jour = date.getDay(); // Jour de la semaine (0 = dimanche, 1 = lundi, ...)\nconst mois = date.getMonth(); // Mois (0 = janvier, 1 = février, ...)\nconst annee = date.getFullYear(); // Année\n\nconst d = now.getDate(); // attention il faut privilegier getDate() pour la bonne date\nconst m = now.getMonth() + 1; // piege avec les mois qui commence à 0\nconst Y = now.getFullYear();\n\n```\n\n\n```js\nconst date1 = new Date('2023-09-21');\nconst date2 = new Date('2024-08-19');\n\nif (date1 \u003C date2) {\n    console.log('date1 est antérieure à date2');\n} else if (date1 > date2) {\n    console.log('date1 est postérieure à date2');\n} else {\n    console.log('Les dates sont égales');\n}\n```\n\n\n\u003C$macrocall $name=details label=\" Exemples de gestion de dates avec moment.js\" src={{$:/code/js/date/moment.js}} status=closed labelClass=\"h6\" srcClass=\"alert border-info\"/>\n\n","tags":"$:/code/js","title":"$:/code/js/date","modified":"20240926054458769","type":"text/markdown"},
2584{"created":"20240819115821438","text":"\n__installation__\n\n```shell\nnpm install moment --save\n```\n\n__Changer la langue de restitution des dates__\n\n```js\nimport moment from \"moment\";\nmoment.locale(\"fr\");\n```\n\n__exemples__\n\n```js\nconst dateDuJour = moment(today);\nconst demain = moment().add(1, 'days').format('h:mm:ss , Do MMMM YYYY ');;\n    \n// affichage dans une APIU du jour calendaire de la date passé en paramètre\n    const dateToFindDayOfWeek = moment().day();\n    if (moment(dateToFindDayOfWeek).isValid()) {\n      res.json({\n        \"weekdays\": moment(dateToFindDayOfWeek).format('dddd')\n      })\n    }\n\n// calcul de l'age\n\nconst age = moment(today).diff(dateanniversaire, 'years');\n\n```\n\n* Pour aller plus loin :\n  * [[https://momentjs.com/]]\n  * [[https://www.freecodecamp.org/news/the-ultimate-guide-to-javascript-date-and-moment-js/]]\n\n* voir egalement la librairie moment en python [[https://pypi.org/project/moment/0.0.14/]]","tags":"","title":"$:/code/js/date/moment.js","modified":"20240926163614027","type":"text/markdown"},
2585{"created":"20240910095133154","text":"__Defer__\n\n>En général, le code JavaScript est exécuté après le chargement du HTML pour garantir que tous les éléments de la page sont disponibles pour manipulation. Cependant, il est possible de charger et d’exécuter un script JavaScript avant le HTML en utilisant l’attribut `defer` ou `async` dans la balise `\u003Cscript>`.\n\n* `defer` : Ce mot-clé indique au navigateur de télécharger le script en arrière-plan et de l’exécuter une fois que le HTML est complètement analysé.\n* `async` : Ce mot-clé permet au script de s’exécuter dès qu’il est téléchargé, ce qui peut se produire avant que le HTML soit complètement chargé.\n\n```js\n\n\u003C!DOCTYPE html>\n\u003Chtml lang=\"fr\">\n\u003Chead>\n    \u003Cmeta charset=\"UTF-8\">\n    \u003Ctitle>Exemple\u003C/title>\n    \u003Cscript src=\"script.js\" defer>\u003C/script>\n\u003C/head>\n\u003Cbody>\n    \u003Ch1>Bonjour le monde\u003C/h1>\n\u003C/body>\n\u003C/html>\n\n//Dans cet exemple, le script script.js sera téléchargé en arrière-plan et exécuté après que le HTML soit complètement chargé grâce à l’attribut defer.\n\n\n```\n","tags":"","title":"$:/code/js/defer","modified":"20240910095504708","type":"text/markdown"},
2586{"created":"20240605083826830","text":"Le DOM  Document Object Model est une représentation sous forme d'objet modifiable du document en cours de consultation dans le navigateur\n\n\n\u003Cu> \u003Ch3> Comment créer et manipuler les éléments du DOM ? \u003C/h3> \u003C/u>\n\nquerySelector, getElementById, createElement\nsont des méthodes de l'objet document qui retournent chacune un objet Element\n\n   * Exemple de __création de balise__, avec affectation d'une classe et d'un texte\n\n\n\u003Cb> document.createElement() \u003C/b>\n\n *[[Propiété:classList  |https://developer.mozilla.org/en-US/docs/Web/API/Element/classList]]\n\n```js\n// en javascript\nconst NewTitreElement = document.createElement('h1');\n\nNewTitreElement.className = \"banner__title\";\nNewTitreElement.textContent = \"Vous consultez le profil de Hercule\";\n\n// Autre modalité de manipulation des classe d'un élement du dom\nNewTitreElement.classList.add('nouvelle--classe');\n// ou NewTitreElement..classList.toggle('nouvelle--classe');\n\n```\n\n\n   * Exemple de __sélection d'élément existant__ du DOM\n\n\u003Cb>document.getElementById() \u003C/b>\n\n```js\n// en javascript\nconst ParentCibleElement = document.getElementById('header-banner');\n\nconsole.dir(ParentCibleElement);
2586\n```\n\n\n   * Exemple d'insertion d'élément dans le document\n\n\n\u003Cb>append() - prepend() \u003C/b>\n\n\n```js\n// en javascript\nParentCibleElement.append(NewTitreElement);\n\ndocument.body..appendChild(imagejavascript)\n```\n\n---\n\n## Le DOM (document object model)\n> Notions : sélection d'un élément HTML, manipulation, intéractions, création\n\n### Sélection\n\n[Mdn : Manipuler des documents](https://developer.mozilla.org/fr/docs/Learn/JavaScript/Client-side_web_APIs/Manipulating_documents)\n\n```html\n\u003Cmain>\n    \u003Ch1 id=\"id-du-noeud\">Titre\u003C/h1>\n\n    \u003Cdiv class=\"class-de-noeuds\">1\u003C/div>\n    \u003Cdiv class=\"class-de-noeuds\">2\u003C/div>\n    \u003Cdiv class=\"class-de-noeuds\">3\u003C/div>\n    \u003Cdiv class=\"class-de-noeuds\">4\u003C/div>\n\u003C/main>\n```\n\n\n```js\n// Récupère un noeud avec son id\nlet node1 = document.getElementById(\"id-du-noeud\");\n\n// Récupère le premier noeud qui correspond au sélecteur css\nlet node2 = document.querySelector('div.class-de-noeuds')\n\n// Récupère plusieurs noeuds avec la classe\nlet nodesList1 = document.getElementsByClassName(\"class-de-noeuds\");\n\n// Récupère tous les noeuds qui correspondent au sélecteur css\nlet nodesList2 = document.querySelectorAll(\"div.class-de-noeuds\");\n```\n\n### Manipulation\n\n```js\nlet node1 = document.getElementById(\"id-du-noeud\");\n\n// Modifie l'id\nnode1.id = \"autre-id\";\n\n// Ajoute une classe\nnode1.classList.add('class-title');\n// Supprime une classe\nnode1.classList.remove('class-title');\n// Bascule une classe (ajoute ou supprime)\nnode1.classList.toggle('class-title');\n\n// Redéfini le contenu\nnode1.textContent = \"Nouveau titre\";\n\n// Ajoute un attribut\nnode1.setAttribute('role', 'presentation');\n// Supprime un attribut\nnode1.removeAttribute('role');\n\n// Suppression de l'élément du DOM\nnode1.remove();\n```\n\n### Intéractions \n```html\n\u003Cbutton id=\"go\">GO\u003C/button>\n```\n\n```js\n// Fonction de callback appelée lors d'un click\n// JS fournit automatiquement un argument, on le nomme comme on veux, ici `event`\nfunction handleButtonClick (event) {\n    console.log(event);\n\n    // Pour récupérer le bouton cliqué depuis l'argument event\n    const btn = event.currentTarget;\n\n    // Modification du texte du bouton après le click\n    btn.textContent = \"Gone\";\n}\n\n// Récupération du bouton et branchement de l'event click\nconst btnGo = document.getElementById(\"go\");\nbtnGo.addEventListener('click', handleButtonClick);\n```\n\n### Création\n```html\n\u003Cdiv class=\"container\"> \n    \u003C!-- \u003Cspan class=\"span-class\">Texte du span\u003C/span> -->\n\n\u003C/div>\n```\n\n```js\n// Création d'un élément de toute pièce\nconst newElt = document.createElement('span');\nnewElt.classList.add('span-class')\nnewElt.textContent = \"Texte du span\";\n\n// Récupération du container\nconst ctn = document.querySelector('.container');\n// Ajout de l'élément au container\nctn.append(newElt); // à partir de là, le nouveau span s'affichera\n// append : ajoute d'élément à la fin de la liste des enfants du conteneur\n// preprend : ajoute d'élément au début de la liste des enfants du conteneur\n```\n\n\n## Modules (presque POO)\n> Notions : déclaration, utilisation\n\n[Mdn : Les bases de JavaScript, orienté objet](https://developer.mozilla.org/fr/docs/Learn/JavaScript/Objects/Basics)\n\n```js\n// Déclaration du module\nconst MonModule = {\n\n    // Propriétés (comme en PHP)\n    container: null,\n\n    // Méthode d'initialisation (un genre de constructeur comme en PHP)\n    init: function () {\n        // Accès à la propriété du module en écriture\n        MonModule.container = document.querySelector('#container');\n\n        // Accès à la propriété du module en lecture\n        console.log(MonModule.container);\n\n        // Appel d'une méthode interne\n        const result = MomModule.maMethode(1,5);\n    },\n\n    // Méthode (comme en PHP)\n    maMethode: function (arg1, arg2) {\n        return arg1 + arg2;\n    }\n}\n\n// Branchement de la méthode d'initialisation du module à la fenêtre\n// DOMContentLoaded est appelé quand le DOM est entièrement chargé et analysé\nwindow.addEventListener(\"DOMContentLoaded\", MonModule.init);\n```","tags":"","title":"$:/code/js/DOM","modified":"20240916091113490"},
2587{"created":"20240911082006923","text":"* Ajout d'une ligne dans un tableau\n\n```js\n    const countriesTableToup = document.getElementById('countries-table');\n\n    const countriesTableFooter = document.createElement('tfoot');\n    const countriesNewTrToup = document.createElement('tr');\n    const countriesNewTdToup = document.createElement('td');\n    countriesNewTdToup.colSpan = 4;\n\n    countriesNewTdToup.innerHTML = DOMPurify.sanitize(contentFooter);\n\n    countriesNewTrToup.append(countriesNewTdToup);\n    countriesTableFooter.append(countriesNewTrToup);\n    countriesTableToup.append(countriesTableFooter);\n    \n\n```\n","tags":"","title":"$:/code/js/DOM/createElement","modified":"20240918073123935"},
2588{"created":"20241001080348383","text":"Ces exemples montrent comment vous pouvez lire, écrire et manipuler les attributs de données personnalisés d’un élément HTML en utilisant la propriété dataset\n\n\nLa propriété dataset de l’interface HTMLElement permet d’accéder aux attributs de données personnalisés (data-*) d’un élément HTML. Voici quelques exemples d’utilisation :\n\n* Accéder à un attribut d'une élement\n\n```js\nlet element = document.getElementById('monElement');\nlet valeur = element.dataset.monAttribut; // Accède à data-mon-attribut\nconsole.log(valeur);\n```\n* Modifier un attribut\n\n```js\nlet element = document.getElementById('monElement');\nelement.dataset.monAttribut = 'nouvelleValeur'; // Modifie data-mon-attribut\n```\n* ajouter un élément \n\n```js\nlet element = document.getElementById('monElement');\nelement.dataset.nouvelAttribut = 'valeur'; // Ajoute data-nouvel-attribut\n```\n\n* Boucler sur tous les attributs de données \n\n```js\nlet element = document.getElementById('monElement');\nfor (let key in element.dataset) {\n    console.log(`${key}: ${element.dataset[key]}`);\n}\n```\n\nLa différence entre dataset et getAttribute réside principalement dans leur utilisation et leur accessibilité :\n\n* dataset :\nAccès simplifié : dataset permet d’accéder directement aux attributs de données personnalisés (data-*) d’un élément HTML via une interface JavaScript plus intuitive.\n* Syntaxe : Utilise la notation en camelCase pour accéder aux attributs. Par exemple, data-mon-attribut devient element.dataset.monAttribut.\n* Lecture et écriture : Vous pouvez facilement lire et modifier les valeurs des attributs de données.\n\n```js\nlet element = document.getElementById('monElement');\nconsole.log(element.dataset.monAttribut);
2588 // Lire\nelement.dataset.monAttribut = 'nouvelleValeur'; // Écrire\n\n```\ngetAttribute et setAttribute :\nFlexibilité : getAttribute et setAttribute permettent d’accéder à n’importe quel attribut d’un élément HTML, pas seulement aux attributs de données personnalisés.\nSyntaxe : Utilise le nom exact de l’attribut tel qu’il apparaît dans le HTML.\nLecture et écriture : Vous pouvez lire et modifier les valeurs de tous les attributs, y compris les attributs standards comme id, class, etc.\n\n```js\n\nlet element = document.getElementById('monElement');\nconsole.log(element.getAttribute('data-mon-attribut')); // Lire\nelement.setAttribute('data-mon-attribut', 'nouvelleValeur'); // Écrire\n```\n","tags":"$:/code/js","title":"$:/code/js/DOM/dataset","modified":"20241001081926586"},
2589{"created":"20240605112333945","text":"\u003Cb> Réagir à des évènements \u003C/b>\n\n* Référence documentaire :  [[Event - Documentation MDM|https://developer.mozilla.org/fr/docs/Web/Events#listing_des_%C3%A9v%C3%A9nements]]\n\n----\n\n\n \u003Cb> addEventListener() \u003C/b> \n\n* Réagir aux évènements \u003Cu>click de souris \u003C/u> \n[[Documentation addEventListener() |https://developer.mozilla.org/fr/docs/Web/API/EventTarget/addEventListener]]\n\n```js\n// en javascript\n// avec addEventListener()  pour réagir à un click sur le premier bouton de la page\n\nconst button = document.querySelector('button');\nbutton.addEventListener('click', ceQuilFaudraFaire);\n\n//exemple de capture d'un élément avec l'id menu-toggler on lui affecte une class en fonction du clic, en l'occurence, on fait apparaitre un menu ou pas\n\nconst ParentElementMenu = document.getElementById('menu-toggler');\n\nParentElementMenu.addEventListener('click', () => {\n\n    const ParentHeaderBanner = document.getElementById('header-banner');\n    console.log(ParentHeaderBanner);\n    if (ParentHeaderBanner.classList.contains(\"banner--open\")) {\n        ParentHeaderBanner.classList.remove('banner--open');\n    } else {\n        ParentHeaderBanner.classList.add('banner--open');\n    }\n// ParentHeaderBanner.classList.toggle('banner--open');\n```\nExemple de programmation déclarative sur un click bouton\n\n```js\nfunction changeBackground(element) {                element.style.backgroundColor = '#eeefff';\n            }\n\n            buttonElement.addEventListener('click', ()=> {\n                changeBackground(buttonElement);\n            });\n```\n\n\n*  Réagir à la soumission d'un formulaire (avec le clic bouton ou la touche entrée)\n\n\n```js\n// en javascript\n\nfunction handleSubmit(event) {\n  console.log(event);\n\n  event.preventDefault(); // empeche le comportement par défaut par exemple la soumission d'un formulaire\n  console.log(event.target); // l'élement qui a déclenché l'événement\n}\n\nconst form = document.querySelector('#form');\nform.addEventListener('submit', handleSubmit);\n```\n\n\n```js\n\nconst form = document.querySelector('#contact');\nform.addEventListener('submit', handleSubmit);\n\nfunction handleSubmit(event) {\n    // console.log(event);\n  \n    event.preventDefault(); // empeche le comportement par défaut par exemple la soumission d'un formulaire\n    alert(\"Hercule ne souhaite pas être dérangé\");\n    \n    console.log(event.target); // l'élement qui a déclenché l'événement\n  }\n\n```\n\n* Réagir à un scroll de la page\n\n\n```js\n\ndocument.addEventListener(\"scroll\", () => {\n    const ParentElementbis = document.querySelector(\".newsletter\");\n    // console.dir(ParentElementbis);\n    if ( !ParentElementbis.classList.contains('newsletter--on')) {  \n        ParentElementbis.classList.add('newsletter--on');\n    }\n\n})\n\n```\n\n\n\n* Gérer la prise en compte d'un theme au clic + Ajaout d'une info dans l'objet window.localStorage\n\n\n```js\nconst BtnTheme = document.getElementById('theme-switch');\n// console.dir(BtnTheme);\nBtnTheme.addEventListener('click', () => {\n    const ParentCibleElement = document.querySelector('body');\n    ParentCibleElement.classList.toggle('theme-dark');\n    if (  ParentCibleElement.classList.contains('theme-dark')) {  \n        Stockage.setItem(\"theme-dark\", true)\n    }\n     else {  Stockage.setItem(\"theme-dark\", false)\n     }\n})\n```\n\n* Réagir aux évènements \u003Cu>attendre la fin du chargement d'une précédente page \u003C/u> pour ne pas charger la fonction `init()` prématurément. \n\n\n```js\ndocument.addEventListener('DOMContentLoaded', () => {\n    init();\n});\n```","tags":"","title":"$:/code/js/DOM/Event","modified":"20240917114155347"},
2590{"created":"20240830163428112","text":"__Exemple de gestion de l'objet window coté serveur et coté client__\n\n## Coté client (HTML) :\n\n```html\n\u003C!DOCTYPE html>\n\u003Chtml lang=\"fr\">\n\u003Chead>\n  \u003Cmeta charset=\"UTF-8\">\n  \u003Ctitle>Page Active\u003C/title>\n\u003C/head>\n\u003Cbody>\n  \u003Ch1>Bienvenue sur ma page\u003C/h1>\n  \u003Cscript>\n    // Envoyer la page active au serveur\n    fetch('/active-page', {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json'\n      },\n      body: JSON.stringify({ page: window.location.pathname })\n    });\n  \u003C/script>\n\u003C/body>\n\u003C/html>\n\n```\n\n## Coté serveur (express.js)\n\n```js\n\nonst express = require('express');\nconst bodyParser = require('body-parser');\nconst app = express();\n\napp.use(bodyParser.json());\n\napp.post('/active-page', (req, res) => {\n  const activePage = req.body.page;\n  console.log(`Page active : ${activePage}`);\n  res.sendStatus(200);\n});\n\napp.listen(3000, () => {\n  console.log('Serveur démarré sur le port 3000');\n});\n```","tags":"$:/code/js","title":"$:/code/js/DOM/express/window","modified":"20241015181344193","type":"text/markdown"},
2591{"created":"20240911080755264","text":"\n\n```js\n\n    const countriesTables = document.getElementById('countries-table');
2591\n    countries.slice(0,10).forEach(country => {\n\n        console.log(country);\n\n        const newRow = document.createElement('tr');\n\n        const newLineRegion = document.createElement('td');\n        newLineRegion.textContent = country.region;\n        newRow.appendChild(newLineRegion);\n\n        const newLine = document.createElement('td');\n        newLine.textContent = country.name.common;\n        newRow.appendChild(newLine);\n        \n        \n        const newLineCapital = document.createElement('td');\n        newLineCapital.textContent = country.capital[0];\n        newRow.appendChild(newLineCapital);\n\n        \n        const newLineFlags = document.createElement('td');\n\n        const flagImg = document.createElement('img');\n        flagImg.src = country.flags.png;\n        flagImg.alt = country.flags.alt;\n        newLineFlags.appendChild(flagImg);\n        newRow.appendChild(newLineFlags);\n\n        countriesTables.appendChild(newRow);\n    })\n```\n","tags":"","title":"$:/code/js/DOM/getElementById","modified":"20240911081547467"},
2592{"created":"20240911063751824","text":"* Exemple de query selector pour l'animation d'une galerie\n\n```js\n\nconst imageContainerEl = document.querySelector(\".image-container\");\n\nlet x = 0;\nlet timer;\n\nfunction updateGallery() {\n    imageContainerEl.style.transform = `perspective(1000px) rotateY(${x}deg)`;\n    timer = setTimeout(() => {\n        x -= 90;\n        updateGallery();\n    }, 3000)\n}\n\nupdateGallery();\n\n\n```\n\n```css\n\n.image-container {\n  width: 150px;\n  height: 150px;\n  transform-style: preserve-3d;\n  transform: perspective(1000px) rotateY(0deg);\n  transition: transform .7s;\n}\n\n.image-container span {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  transform: rotateY(calc(var(--i) * 90deg)) translateZ(200px);\n}\n\n.image-container span img {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\naspect-ratio: 1/1;\n-o-object-fit: cover;\n   object-fit: cover;\nfilter: grayscale(100%);\n\n}\n\n.image-container span img:hover {\nfilter: none;\n}\n\n```","tags":"","title":"$:/code/js/DOM/queryselector","modified":"20240911063946945"},
2593{"created":"20240909125216785","text":"Sélectionner tous les éléments `\u003Cdiv>` avec les classes note ou alert :\n\n```js\nconst divs = document.querySelectorAll(\"div.note, div.alert\");\nconsole.log(divs);\n```\n\nSélectionner tous les éléments `\u003Cp>` dont le parent immédiat est un `\u003Cdiv>` avec la classe highlighted :\n\n```js\n\nconst highlightedParagraphs = document.querySelectorAll(\"div.highlighted > p\");\nconsole.log(highlightedParagraphs);\n```\n\nSélectionner tous les éléments `\u003Ciframe>` avec un attribut data-src :\n\n```js\n\nconst iframes = document.querySelectorAll(\"iframe[data-src]\");\nconsole.log(iframes);\n```\n\nSélectionner tous les éléments de liste \u003Cli> dans une liste avec l’identifiant userlist et ayant un attribut data-active avec la valeur 1 :\n```js\n\nconst activeItems = document.querySelectorAll(\"#userlist li[data-active='1']\");\nconsole.log(activeItems);\n```\n{{$:/diagram/js/API_web}}","tags":"","title":"$:/code/js/DOM/queryselectorAll","modified":"20240909130732853","type":"text/markdown"},
2594{"created":"20240830162356275","text":"\u003Cu> \u003Ch3> Comment créer et manipuler l'objet windows du DOM ? \u003C/h3> \u003C/u>\n\n__''innerWidth - innerHeight ''__\n\n```js\n\nconst width = window.innerWidth;\nconst height= window.innerHeight;\n\n\nconsole.log(width);\nconsole.log(typeof width);\nconsole.log(height);\nconsole.log(typeof height);\n\n// Le ratio c'est le rapport entre la largeur de la fenètre et la hauteur (on divise la largeur par la hauteur)\n\nlet ratio;\nratio = width/height;\n\n// On considère que le fenêtre est large au délà de 1000 pixels\n\nlet isWide  ;\n isWide = width> 1000;\n\n// exemple de string contenant le résultat d'une expression évaluée\n\nconsole.log(` La fenètre est  large de ${width} pixels`);\n\n\n// Une fenêtre est en mode paysage si sa largeur est supérieure à sa hauteur\n// Cela se traduit par un ratio supérieur à 1\n\nlet  landscape  ;\nlandscape = ratio > 1;\nconsole.log(landscape);\n\n// On considère que le fenêtre est large au délà de 1000 pixels\n// On considère que le fenêtre est haute au délà de 500 pixels\nlet isBig;\n    isBig = width> 1000 || height > 500 ; \n    console.log(isBig)\n\nlet isSmallPortrait;\n\n    isSmallPortrait = (width\u003C= 1000) && (height \u003C 500) && !lanscape; \n\nlet isSquare ;\nisSquare =(width\u003C= 1000) && (height \u003C 500) && landscape; \n\nconst isSquareBis = ratio === 1;\n\n```\n\n```js\nwindow.resizeTo(largeur, hauteur);\n````\n","tags":"","title":"$:/code/js/DOM/window/innerWidth-innerHeight","modified":"20240909130712981","type":"text/markdown"},
2595{"created":"20240610122228037","text":"\n\u003Cu> \u003Ch3> Comment créer et manipuler l'objet windows du DOM ? \u003C/h3> \u003C/u>\n\n__''localStorage''__\n\n[[windows.localStorage|https://developer.mozilla.org/fr/docs/Web/API/Window/localStorage]]\n\n\n\n```js\n\nStockage = localStorage;
2595\n// stockage d'une clé et de sa valeur avec setItem\nStockage.setItem(\"monChat\", \"Tom\");\n// Récuperer une clé avec getItem\nvar cat = localStorage.getItem(\"monChat\");\nlocalStorage.clear();\n\n// test pour savoir si une valeur existe dans local.storage\n\nif (localStorage.getItem(\"username\") === null) {\n  //...\n}\n\nif (\"username\" in localStorage) {\n    alert('yes');\n} else {\n    alert('no');\n}\n\n// exemple de gestion d'un theme dark en javascript \n\n    ParentCibleElement.classList.toggle('theme-dark');\n    if(document.body.classList.contains('dark')) {\n        localStorage.setItem('theme-dark','true');\n    } else {\n        localStorage.setItem('theme-dark','false');\n        \n})\n\n// pour une mise à jour \nif (localStorage.hasOwnProperty(\"username\")) {\n    //\n}\n\n// ou\n\nif (localStorage[\"username\"]) {\n    //\n}\n\n```\n\nLe contenu du Local Storage est visible via les outils du dev dans le menu \"Application\" (Pour Chrome)\n","tags":"","title":"$:/code/js/DOM/window/localStorage","modified":"20240830162528113"},
2596{"created":"20240830133103488","text":"Une url est composée de :\n\n* protocol : le protocole d'accès (http: ou https:)\n* host : le nom de domaine\n* pathname : l'arborescence de la page\n* search : les éventuels paramètres passés sur la page\n\n\n```js\nconst currentPage = window.location.pathname;\nconsole.log(window.document.title);\nconsole.log(currentPage);\nconst pageLinks = {\n    '/': 'home-link',\n     '/visiter': 'visit-link',\n     '/loger': 'loger-link',\n     '/en_pratique': 'practice-link',\n };\nconst currentLinkId = pageLinks[currentPage];\n if (currentLinkId) {\n     const currentLink = document.getElementById(currentLinkId);\n     currentLink.setAttribute('aria-current', 'true');\n }\n```\n","tags":"","title":"$:/code/js/DOM/windows/location","modified":"20240831084631941"},
2597{"created":"20241002122257172","text":"* Pour lutter contre les failles XSS\n[[https://www.npmjs.com/package/dompurify]]","tags":"","title":"$:/code/js/DOMPurify.sanitize()","modified":"20241002122635505"},
2598{"created":"20240627125533218","text":"## Gestion des routes paramétrées\n\n```js\n\nconst product = (req, res, next) => {\n\n    const slug = req.params.slug ;\n\n    const productDetail = products.find(element => element.slug === slug );\n\n// C'est le controllers qui récupère les données et qui les passent à la vue \n    if(productDetail){\n        \n        res.render('product' , {\n            product: productDetail\n        })\n    }\n    else {\n        next()\n    }\n};\n\nexport { product }\n\n```\n## Gestion des méthodes POST\n\n```js\n\nimport quotes from '../data/quotes.js';\n\nconst mainController = {\n\n  home: function (req, res) {\n\n    // console.log(req.query);\n    if (req.query.keywords) {\n      const filtredQuotes = quotes.filter(element => element.season == req.query.keywords);\n      // console.log(filtredQuotes);\n      let data = {\n        quotes: filtredQuotes,\n      };\n      res.render('home', data);\n    }\n    else {\n      let data = {\n        quotes: quotes,\n      };\n      res.render('home', data);\n    }\n  },\n\n  code: function (req, res) {\n    console.log(req.body.answer);\n    if (req.body.answer === 'code') {\n      res.render('win');\n    } else {\n      res.render('loose');\n    }\n  },\n\n  notFound: function (req, res) {\n    res.status(404).render('error', {\n      message: 'Page non trouvée',\n    });\n  },\n\n};\n\nexport default mainController;\n\n```\n## Gestion d'une API\n\n```js\n/// exemple de controller pour une API\n\n\nimport fs from 'fs';\nimport path from 'path';\nimport movies from '../data/movies.json' assert { type: \"json\" };;\n\n\nconst moviesController = {\n\n    __dirname: path.resolve(),\n\n    movies: movies,\n\n    // Get all movies\n    getAllMovies(req, res) {\n        res.json(moviesController.movies);\n    },\n\n    // Get movie by id\n    getMovieById(req, res) {\n        const movieId = req.params.id;\n        const movie = moviesController.movies.find(movie => movie.id === Number(movieId));\n        if (movie) {\n            res.json(movie);\n        } else {\n            res.status(404).json({ message: 'Movie not found' });\n        }\n    },\n\n    // Add new movie\n    addNewMovie(req, res) {\n        const newMovie = req.body;\n        moviesController.movies.push(newMovie);\n        moviesController.saveData();\n        res.json(newMovie);\n    },\n\n    // Update movie\n    updateMovie(req, res) {\n        const movieId = req.params.id;\n        const movieIndex = moviesController.movies.findIndex(movie => movie.id === Number(movieId));\n        const updatedMovie = { ...moviesController.movies[movieIndex], ...req.body };\n        moviesController.movies[movieIndex] = updatedMovie;\n        moviesController.saveData();\n        res.json(updatedMovie);\n    },\n\n    // Delete movie\n    deleteMovie(req, res) {\n        const movieId = req.params.id;\n        const movieIndex = moviesController.movies.findIndex(movie => movie.id === Number(movieId));\n        moviesController.movies.splice(movieIndex, 1);\n        moviesController.saveData();\n        res.json(moviesController.movies);\n    }
2598,\n\n    // Save data to JSON file\n    saveData() {\n        const filePath = path.join(moviesController.__dirname, 'data/movies.json');\n        const jsonData = JSON.stringify(moviesController.movies);\n        fs.writeFileSync(filePath, jsonData);\n    }\n}\n\nexport default moviesController;\n\n\n```\n\n## Gestion des authentifications\n\n```js\nimport validator from 'validator';\nimport bcrypt from 'bcrypt';\n\nimport users from '../data.js';\n\nconst authController = {\n\n  login: function(req, res) {\n    try {\n      // on cherche un utilisateur suivant le login reçu\n      const foundUser = users.find(user => user.login === req.body.login);\n      // si on en trouve un on va comparer son mot de passe\n      if (foundUser) {\n        bcrypt.compare(req.body.password, foundUser.hash, function(err, result) {\n          // result est true quand le mot de passe est bon\n          if (result) {\n            res.render('confirmation');\n          }\n          else {\n            // on ne va pas throw depuis un callback, on verra la notation promesse citée dans la doc plus tard ;)\n            res.render('error', { message: 'Mauvais couple identifiant/mot de passe' });\n          }\n        });\n      }\n      // sinon on donne une erreur\n      else {\n        throw new Error('Mauvais couple identifiant/mot de passe');\n        // On ne précise pas si c'est l'identifiant ou le mot de passe qui est faut\n        // on ne veut pas donner d'informations à quelqu'un qui essaie de voler le compte d'un autre\n      }\n    } catch (error) {\n      res.render('error', { message: error.message });\n    }\n  },\n\n};\n\n```\n\n* Gestion des mots de passe robustes (12 caractères minimum, 4 types de symboles minimum d'après la CNIL)\n\n```js\nimport validator from 'validator';\n\nconst authController = {\n  register: function(req, res) {\n    try {\n      // https://www.npmjs.com/package/validator\n      const options = { minLength: 12, minLowercase: 1, minUppercase: 1, minNumbers: 1, minSymbols: 1 };\n      if (!validator.isStrongPassword(req.body.password, options)) {\n        throw new Error('Le mot de passe doit comporter au moins 12 caractères et au moins 1 majuscule, 1 minu
2598scule, 1 chiffre et 1 caractère spécial');\n      }\n      // ...\n    }\n    // ...\n  },\n};\n\n// On peut noter qu'on n'a pas mis cette validation dans un modèle, \n// c'est parce qu'on ne va pas mémoriser le mot de passe en clair, voir ci-dessous \n```","tags":"","title":"$:/code/js/express/ejs/app/controller.js","modified":"20240823074202708","type":"text/markdown"},
2599{"created":"20240627125342870","text":"\n\n```js\n\nimport express from \"express\";\nimport {about, list, product, fruits, legumes} from \"./controllers.js\"\n// ou import- * as controllers from \"./controllers.js\"\n\nconst router = express.Router();\nrouter.get('/', about);\nrouter.post('/', other);\n\nrouter.get('/list', list);\n\nrouter.get('/fruits', fruits);\n\nrouter.get('/legumes', legumes);\n\nrouter.get('/product/:slug', product);\n\nrouter.get('/about', about);\n\nexport default router;\n```\n\n```js\n\n\nimport express from \"express\";\nimport moviesController from \"../controllers/moviesController.js\";\n\nconst router = express.Router();\n\nrouter.get('/', (req, res) => {\n    res.send(`\n       \u003Cp> test API\u003C/p>\n        `)\n})\n\nrouter.get('/api/movies', moviesController.getAllMovies);\nrouter.get('/api/movies/:id', moviesController.getMovieById);\nrouter.post('/api/movies', moviesController.addNewMovie);\nrouter.delete('/api/movies/:id', moviesController.deleteMovie);\nrouter.patch('/api/movies/:id', moviesController.updateMovie);\nexport default router;\n```\n\n* voir aussi : [[$:/code/js/express/ejs/app/controller.js]]","tags":"","title":"$:/code/js/express/ejs/app/router.js","modified":"20240823115140085","type":"text/markdown"},
2600{"created":"20240910075512303","text":"\n## Les méthodes HTTP dans Express\n\n[[Express|$:/doc/module/express]] permet de définir des routes pour chaque méthode HTTP. Par exemple, pour définir une route pour récupérer les informations d'un utilisateur, on peut utiliser la méthode `get` :\n\n```js\n\napp.get('/utilisateurs/:id', (req, res) => {\n  // Récupérer les informations de l'utilisateur\n  // ...\n  res.json(utilisateur);\n});\n\n```\n\nPour définir une route pour créer un nouvel utilisateur, on peut utiliser la méthode `post` :\n\n```js\n\napp.post('/utilisateurs', (req, res) => {\n  // Créer un nouvel utilisateur\n  // ...\n  res.json(utilisateur);\n});\n\n```\n\nPour définir une route pour mettre à jour les informations d'un utilisateur, on peut utiliser la méthode `put` :\n\n```js\n\napp.patch('/utilisateurs/:id', (req, res) => {\n  // Mettre à jour les informations de l'utilisateur\n  // ...\n  res.json(utilisateur);\n});\n\n```\n\n\n{{$:/doc/HTTP/BodyParser}}","tags":"","title":"$:/code/js/express/methodes/HTTP","modified":"20240910121939847","type":"text/markdown"},
2601{"created":"20240910111932697","text":"\n### Definir la politique CORS dans Express\n\nPour définir la politique CORS dans Express, vous devez utiliser le middleware cors. \nLe middleware cors est un module npm qui permet de définir la politique CORS dans Express. \n\nPour installer le middleware cors, exécutez la commande suivante dans le terminal:\n\n* Pour aller plus loin : [[Documentation Express JS|https://expressjs.com/en/resources/middleware/cors.html]]\n* \n```\nnpm install cors\n```\n\nEnsuite, vous devez importer le middleware cors dans votre fichier d'application Express et l'utiliser comme un middleware global. Le code suivant montre comment importer et utiliser le middleware cors dans votre fichier d'application Express:\n\n```js\nimport express from 'express';\nimport cors from 'cors';\n\nconst app = express();\n\napp.use(cors());\n\napp.get('/', (req, res) => {\n  res.send('Bienvenue sur mon API REST!');\n});\n\napp.listen(3000, () => {\n  console.log('Le serveur est démarré sur le port 3000');\n});\n```\n\nDans le code ci-dessus, nous avons importé le middleware cors dans notre fichier d'application Express et l'avons utilisé comme un middleware global. En utilisant le middleware cors comme un middleware global, nous autorisons toutes les requêtes CORS à accéder à notre API REST.\n\n### Autoriser les requêtes CORS pour une seule route\n\nVous pouvez également utiliser le middleware cors pour autoriser les requêtes CORS pour une seule route. Le code suivant montre comment utiliser le middleware cors pour autoriser les requêtes CORS pour une seule route:\n\n```js\nimport express from 'express';\nimport cors from 'cors';\n\nconst app = express();\n\napp.get('/', (req, res) => {\n  res.send('Bienvenue sur mon API REST!');\n});\n\napp.get('/users', cors(), (req, res) => {\n  // Code pour récupérer la liste des utilisateurs\n  res.json([{ id: 1, name: 'John Doe' }]);\n});\n\napp.listen(3000, () => {\n  console.log('Le serveur est démarré sur le port 3000');\n});\n```\n\nDans le code ci-dessus, nous avons utilisé le middleware cors pour autoriser les requêtes CORS pour la route /users.\n\n* Exemple de configuration d'un CORS pour express\n\n```js\nconst express = require('express');\nconst cors = require('cors');\nconst app = express();\n\n// Configuration CORS\nconst corsOptions = {\n  origin: 'http://example.com', // Remplacez par l'origine autorisée\n  methods: ['GET', 'POST', 'PUT', 'DELET
2601E'], // Méthodes HTTP autorisées\n  allowedHeaders: ['Content-Type', 'Authorization'], // En-têtes autorisés\n  credentials: true, // Autorise l'envoi de cookies\n  optionsSuccessStatus: 200 // Statut de réponse pour les requêtes OPTIONS\n};\n\n// Appliquer CORS à toutes les routes\napp.use(cors(corsOptions));\n\n// Ou appliquer CORS à une route spécifique\napp.get('/api/data', cors(corsOptions), (req, res) => {\n  res.json({ message: 'Données accessibles avec CORS' });\n});\n\n// Démarrer le serveur\napp.listen(3000, () => {\n  console.log('Serveur démarré sur le port 3000');\n});\n```\n  \n### Les paramêtre du middleware cors\n\nLe middleware cors prend en charge les paramètres suivants:\n\n- origin: Définit l'origine qui est autorisée à accéder à la ressource. Vous pouvez définir l'origine comme une chaîne, un tableau ou une fonction. Si vous définissez l'origine comme une chaîne, vous devez définir l'origine exacte. Si vous définissez l'origine comme un tableau, vous devez définir toutes les origines autorisées. Si vous définissez l'origine comme une fonction, vous devez définir une fonction personnalisée qui détermine si l'origine est autorisée ou non. Par défaut, l'origine est autorisée.\n- optionsSuccessStatus: Définit le code de statut à renvoyer lorsqu'une requête OPTIONS est reçue, avant la réponse de la requête. Par défaut, le code de statut est 204.","tags":"","title":"$:/code/js/express/module/cors","modified":"20241028143521141","type":"text/markdown"},
2602{"created":"20240702082845583","text":"__query string__\n\n>La partie derrière le point d'interrogation est une __query string__ : elle permet au client de préciser sa requête et pourra être utiliser côté serveur pour apporter une réponse adaptée\n\n> Une url peut se compléter ainsi protocol: \u003Cbr>\n> `//domain.extension/path/to/resource?query-string` \u003Cbr>\n> avec une query string derrière un point d'interrogation.\n\n> La query string est une chaîne de caractères contenant des paires clé=valeur séparées par des &. \u003Cbr>\n> Par exemple `name=alexis&object=coucou&message=bisous`. \u003Cbr>\n> On appelle souvent ces données envoyées des paramètres.\n\n\n ```js\n\u003Cform method=\"GET\" action=\"/search\">\n  \u003Cinput name=\"keywords\" type=\"text\">\n  \u003Cselect name=\"orderby\">\n    \u003Coption value=\"price\">Prix\u003C/option>\n    \u003Coption value=\"date\">Date\u003C/option>\n  \u003Cselect>\n\t\u003Cbutton> Valider \u003C/button>\n\u003C/form>\n```\n\non va dans payload dans les outils du dev pour voir les infos\n\n ```js\n req.query\n \n ```\n\n```js\nconst mainController = {\n  search: function (req, res) {\n    console.log(req.query);\n    // si la recherche a été précisée on filtre les données\n    if (req.query.keywords) {\n      const filteredProducts = products.filter(element => element.includes(req.query.keywords));\n      res.render('list', { items: filteredProducts });\n    }\n    // sinon non\n    else {\n      res.render('list', { items: products });\n    }\n    // on a décidé de ne pas tenir compte du paramètre orderby\n  },\n};\n\n```\n","tags":"","title":"$:/code/js/express/query-string","modified":"20240910075921292","type":"text/markdown"},
2603{"created":"20240627132141231","text":"```js\n// console.log('fichier main: index.js');\nimport express from \"express\";\nimport * as dotenv from \"dotenv\" ;\nimport router from './app/router.js';\n\n\ndotenv.config() ;\nconst port = process.env.PORT || 3000;\n\nconst app = express();\napp.use(express.static('./public'));\napp.use(express.urlencoded({ extended: true })); // l'option extended permet de passer aussi des objets et des tableaux, ce n'est pas le plus important à retenir ;)\n\n\n// on configure le moteur de template\napp.set('view engine', 'ejs');\n// on configure le chemin vers le dossier des views\napp.set('views', './app/views/');\n// ...\n\napp.use(router);\n\napp.use((req, res) => {\n    res.status(404).render(\"404\");\n   // ou    res.sendStatus(404);\n  // ou    res.status(404).send('error 404');\n//         res.status(404).render('error', {\n //         message: 'Page non trouvée',\n  //      });\n\n  });\n\napp.listen(port,() => {\n    console.log(`Listening on http://localhost:${port}/`)\n    })\n\n\n```\n\n```js\nimport express from \"express\";\nimport * as dotenv from \"dotenv\" ;\nimport router from './app/router.js';\n// gestion des variables d'environnement\ndotenv.config();\n\n// On definit le port sur lequel on veut que notre serveur ecoute (plusieurs serveurs peuvent tourner sur la meme machine, en revanche chacun doit tourner sur un port unique)\nconst port = process.env.PORT || 3000;\n\n// on instancie le serveur\nconst app = express();\n\napp.use(express.urlencoded({ extended: true }));\napp.use(express.json());\n\napp.use(router);\n\napp.listen(port, () => {\n    console.log(`Listening on http://localhost:${port}/`)\n})\n```\n\n* voir aussi : [[$:/code/js/express/ejs/app/router.js]]\n* voir aussi : [[$:/code/js/express/ejs/app/controller.js]]","tags":"","title":"$:/code/js/express/template/ejs/index.js","modified":"20240823074353258"},
2604{"created":"20240909075403136","text":"En js, coté front (client), l'instruction `fetch` permet de récupérer des données du backend.\n\n* [[Documentation MDM|https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch]]\n\n\n\n* La fonction fetch est une API moderne et native du navigateur qui permet de faire des requêtes HTTP, y compris des requêtes GET ou POST. \n\n```js\n\nfetch('https://api.example.com/data')\n  .then(response => response.json())\n  .then(data => console.log(data))\n  .catch(error => console.error('Error:', error));\n\n```\n\n```js\nconst data = { \n  name: 'Alice', \n  age: 25 \n};\n\nfetch('https://api.example.com/users', {\n  method: 'POST', // Méthode HTTP\n  headers: {\n    'Content-Type': 'application/json' // Type de contenu\n  },\n  body: JSON.stringify(data) // Corps de la requête\n})\n.then(response => response.json())\n.then(data => {\n  console.log('Success:', data);\n})\n.catch((error) => {\n  console.error('Error:', error);\n});\n```\n\n\n* Exemple avec une utilisation via react :\n\n```js\n\n   const [pokemons, setPokemons] = useState([])\n\n        const getPokemons = async () => {\n            const response = await fetch(\"http://localhost:3000/pokemons\");\n            const data = await response.json();\n            setPokemons(data)\n        }\n```\n","tags":"$:/code/js","title":"$:/code/js/fetch","modified":"20241015151318683"},
2605{"created":"20240910141641939","text":"* Exemple de code pour intérroger l'API documenter à cette adresse : [[https://restcountries.com/]] \n\n```js\n\nconst endpointAllCountries = \"https://restcountries.com/v3.1/all\";\nconst filters = \"fields=name,capital,region,flag\" ;\n\n    const response =  await fetch( `${endpointAllCountries}?${filters}`, options);\n    const countries =  await response.json();\n\n```\n\n* Voici un exemple d’utilisation de la méthode POST avec AJAX :\n\n```js\nconst xhr = new XMLHttpRequest();\nxhr.open('POST', 'https://api.example.com/data', true);\nxhr.setRequestHeader('Content-Type', 'application/json;charset=UTF-8');\nxhr.onreadystatechange = function () {\n  if (xhr.readyState === 4 && xhr.status === 200) {\n    console.log(xhr.responseText);\n  }\n};\nxhr.send(JSON.stringify({ name: 'Alice', age: 25 }));\n```","tags":"$:/code/js","title":"$:/code/js/fetch/AJAX","modified":"20241002073533020","type":"text/markdown"},
2606{"created":"20240913093713435","text":"**Attribut** : Un attribut est une variable définie au sein d’une classe. Il représente une propriété ou une caractéristique d’un objet créé à partir de cette classe. Par exemple, dans une classe Voiture, des attributs pourraient 
2606être couleur, marque, ou vitesseMaximale1.\n\n**Paramètre** : Un paramètre est une variable utilisée dans une fonction ou une méthode. Il est passé à la fonction lors de son appel et permet de fournir des données nécessaires à l’exécution de cette fonction. Par exemple, une méthode accélérer dans la classe Voiture pourrait prendre un paramètre augmentationVitesse pour indiquer de combien augmenter la vitesse.\n## Les fonctions\n> Notions : déclaration, arguments, retour, appel\n\n[Mdn : les fonctions](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Statements/function)\n\n```js\n\n\n// syntaxe conventionnelle\nconst valeur1 = maFonction(2, 65); // pas d'erreur\nfunction maFonction(param1, param2) {\n    const resultat = param1 + param2;\n    return resultat;\n}\nconst valeur2 = maFonction(2, 65); // pas d'erreur\n\n// Autre syntaxe : \nconst valeur3 = autreFonction(2, 65); // erreur : ne trouve pas la fonction\nconst autreFonction = function(param1, param2) {\n    const resultat = param1 - param2;\n    return resultat;\n}\nconst valeur4 = autreFonction(2, 65); // pas d'erreur\n```\n\n","tags":"$:/code/js","title":"$:/code/js/fonctions","modified":"20241001141019906","type":"text/markdown"},
2607{"created":"20240705071757564","text":"!!! Hashing in JavaScript\n\n[[https://www.geeksforgeeks.org/hashing-in-javascript/]]\n\n\n> Côté serveur on va mémoriser les mots de passe des utilisateurs et leurs identifiants. Toutefois il est hors de question de stocker les mot de passe en clair / en dur, c'est à dire de manière lisible. En effet en cas de piratage on comprommetrait des informations confidentielles pour nos utilisateurs. Et on risquerait de sérieuses répercutions en cas de contrôle de la CNIL.\n\nexemple : [[https://www.cnil.fr/fr/securite-des-donnees-et-droits-des-personnes-sanction-de-300-000-euros-lencontre-de-la-societe-free]]\n\nNTUI : never trust user input\n\n''Les textes de référence''\n\n* Article 15 du RGPD (droit d’accès de la personne concernée)\n* Article 17 (droit à l’effacement)\n* Article 32 du RGPD (sécurité des données)\n* Article 33 du RGPD (notification à l'autorité de contrôle d'une violation de données\n\n\n\n''Mot de passe robuste''\n\n* exiger des mots de passe robustes (12 caractères minimum, 4 types de symboles minimum d'après la CNIL).\n\n* Exemple d'usage de controle avec validator dans un contrôleur\n\n```js\n\nimport validator from 'validator';\n\nconst authController = {\n  register: function(req, res) {\n    try {\n      // https://www.npmjs.com/package/validator\n      const options = { minLength: 12, minLowercase: 1, minUppercase: 1, minNumbers: 1, minSymbols: 1 };\n      if (!validator.isStrongPassword(req.body.password, options)) {\n        throw new Error('Le mot de passe doit comporter au moins 12 caractères et au moins 1 majuscule, 1 minu
2607scule, 1 chiffre et 1 caractère spécial');\n      }\n      // ...\n    }\n    // ...\n  },\n};\n```\n{{$:/code/js/module/bcrypt}}\n","tags":"","title":"$:/code/js/Hashing","modified":"20240910100327418"},
2608{"created":"20240926160701205","text":"Exemple d'import :\n\n```js\nimport data from \"../../data.json\" assert { type: 'json' };\n```\n\nou \n\n```js\nimport fs from 'fs' ;\n// ou const fs = require('fs');\n\nfs.readFile('data.json', 'utf8', (err, data) => {\n    if (err) {\n        console.error(err);\n        return;\n    }\n    const jsonData = JSON.parse(data);\n    console.log(jsonData);\n});\n```\n\n\n","tags":"$:/code/js","title":"$:/code/js/json","modified":"20240926160941972"},
2609{"created":"20240530120618194","text":"\n* les __listes__ en JavaScript (tableau) peuvent contenir des éléments de types différents. \n\n> Les tableaux en JavaScript sont hétérogènes, ce qui signifie qu'ils peuvent stocker des valeurs de différents types de données, tels que des nombres, des chaînes de caractères, des booléens, des objets, etc.\n\nPar exemple, le tableau suivant contient des éléments de types différents :\njavascript\n\n\n```js\nlet monTableau = [42, true, \"Bonjour\", {nom: \"John\", age: 30}, [1, 2, 3]];\n```\n!! Les méthodes \n\n* methode ''push'' : Ajouter un élément à une liste \n\n\n```js\n.push()\n```\n\nMéthode pour chercher un élément unique dans une liste\n\n```js\nconst MonTableau  = {\n\t{name:\"roger\" , messsage: \"tout va bien\"},\n   {}\n}\n\nconst Resultat = MonTableau.find(element => element.sign === line);\n```\n\n* méthode ''filter'' qui renvoie un tableau\n\n```js\nconst Resultat = MonTableau.filter(element => element.category === value);\n\n```\n* méthode ''includes'' : retourne 'true' si le paramètre est présent (ou false si il est absent) \n\n```js\n\n        const allowedFoods = [\"poulet-frites\", \"raclette\", \"pizza\", \"couscous\", \"boeuf bourguignondis\", \"blanquette\", \"quiche lorraine\", \"paëlla\"]\n\n set favFood(value) {\n\n        if (!allowedFoods.includes(value)) {dishes\n            throw new Error('Le plat ne fait pas partie de la liste des plats autorises. Tu as mauvais gout.')\n        }\n        this.#favFood = value;\n    }\n```","tags":"","title":"$:/code/js/listes","modified":"20240705071602109"},
2610{"created":"20240924103421577","text":"```js\n\n// Importer TensorFlow.js\nimport * as tf from '@tensorflow/tfjs';\n\n// Exemple de création d'un tenseur\nconst tensor = tf.tensor([1, 2, 3, 4]);\ntensor.print(); // Affiche le tenseur dans la console\n\n// Lister les algorithmes disponibles\nconsole.log(tf); // Affiche les fonctions et classes disponibles dans TensorFlow.js\n```","tags":"","title":"$:/code/js/module/@tensorflow/tfjs","modified":"20240924103509825"},
2611{"created":"20240924195718197","text":"**Axios**\n\n>axios est une bibliothèque JavaScript qui facilite les requêtes HTTP. Dans le code que je t’ai fourni, axios est utilisé pour faire une requête GET à l’API spécifiée. Voici les principales fonctions de axios dans ce contexte :\n\n* Faire des requêtes HTTP : axios.get(apiUrl) envoie une requête GET à l’URL de l’API pour récupérer les données.\n* Gérer les Promesses : axios retourne une promesse, ce qui permet d’utiliser async/await pour écrire du code asynchrone de manière plus lisible.\n* Manipuler les réponses : axios simplifie l’accès aux données de la réponse via response.data.\n\n\n```js\nconst axios = require('axios');\nconst fs = require('fs');\n\n// URL de l'API\nconst apiUrl = 'https://opendata.paris.fr/api/explore/v2.1/catalog/datasets/subventions-versees-annexe-compte-administratif-a-partir-de-2018/records?limit=20';\n\n// Fonction pour récupérer les données et les stocker dans un fichier\nasync function fetchDataAndStore() {\n    try {\n        const response = await axios.get(apiUrl);\n        const data = response.data;\n\n        // Écrire les données dans un fichier local\n        fs.writeFileSync('resultats.json', JSON.stringify(data, null, 2));\n        console.log('Les données ont été sauvegardées dans resultats.json');\n    } catch (error) {\n        console.error('Erreur lors de la récupération des données:', error);\n    }\n}\n\n// Appel de la fonction\nfetchDataAndStore();\n\n```\n\navec le module http , on aurait fait :\n\n```js\nconst http = require('http');\nconst fs = require('fs');\n\n// URL de l'API\nconst apiUrl = 'http://opendata.paris.fr/api/explore/v2.1/catalog/datasets/subventions-versees-annexe-compte-administratif-a-partir-de-2018/records?limit=20';\n\n// Fonction pour récupérer les données et les stocker dans un fichier\nfunction fetchDataAndStore() {\n    http.get(apiUrl, (res) => {\n        let data = '';\n\n        // Récupérer les données par morceaux\n        res.on('data', (chunk) =>
2611 {\n            data += chunk;\n        });\n\n        // Une fois toutes les données reçues\n        res.on('end', () => {\n            fs.writeFileSync('resultats.json', data);\n            console.log('Les données ont été sauvegardées dans resultats.json');\n        });\n\n    }).on('error', (err) => {\n        console.error('Erreur lors de la récupération des données:', err);\n    });\n}\n\n// Appel de la fonction\nfetchDataAndStore();\n```","tags":"","title":"$:/code/js/module/axios","modified":"20240925053213079","type":"text/markdown"},
2612{"created":"20240705121018401","text":"Distinguer le cryptage du hashage : Le cryptage est réversible.\n\n'' Module pour crypter / decrypter : Bcrypt''\n\n```\nnpm install bcrypt\n\n```\n\n```js\n\nimport bcrypt from 'bcrypt';\n\n\nbcrypt.hash(myPlaintextPassword, saltRounds, function(err, hash) {\n  console.log(hash);\n});\n\n\n// exemple aprés la saisie d'un pasword dans un formulaire avec la méthode POST\nbcrypt.hash(req.body.password, 10, (error, hash) => {\n  // on peut imaginer construire un objet paramétré avec le login et le hash\n  const user = new User(req.body.login, hash);\n});\n```\n\n```js\n\nbcrypt.compare(myPlaintextPassword, hash, function(err, result) {\n  console.log(result);\n  // result vaut true ou false suivant si le mot de passe correspond au hash auquel on le compare\n});\n\n\n\n\n```\n[[https://fr.wikipedia.org/wiki/Bcrypt]]\n[[https://github.com/kelektiv/node.bcrypt.js]]\n\n* Exemple d'usage  dans un contrôleur\n\n```js\nimport users from '../data.js';\n\nconst authController = {\n\n  login: function(req, res) {\n    try {\n      // on cherche un utilisateur suivant le login reçu\n      const foundUser = users.find(user => user.login === req.body.login);\n      // si on en trouve un on va comparer son mot de passe\n      if (foundUser) {\n        bcrypt.compare(req.body.password, foundUser.hash, function(err, result) {\n          // result est true quand le mot de passe est bon\n          if (result) {\n            res.render('confirmation');\n          }\n          else {\n            // on ne va pas throw depuis un callback, on verra la notation promesse citée dans la doc plus tard ;)\n            res.render('error', { message: 'Mauvais couple identifiant/mot de passe' });\n          }\n        });\n      }\n      // sinon on donne une erreur\n      else {\n        throw new Error('Mauvais couple identifiant/mot de passe');\n        // On ne précise pas si c'est l'identifiant ou le mot de passe qui est faut\n        // on ne veut pas donner d'informations à quelqu'un qui essaie de voler le compte d'un autre\n      }\n    } catch (error) {\n      res.render('error', { message: error.message });\n    }\n  },\n\n};\n```","title":"$:/code/js/module/bcrypt","modified":"20241001140410084"},
2613{"created":"20240923122246245","text":"__Clsx__\n\n* Concatenation de classe\n\n>A tiny (239B) utility for constructing className strings conditionally.\nAlso serves as a faster & smaller drop-in replacement for the classnames module.","tags":"","title":"$:/code/js/module/clsx/css","modified":"20240923122420922","type":"text/markdown"},
2614{"created":"20240709083835554","text":"\n!!! Présentation \n\n> Dotenv is a zero-dependency module that loads environment variables from a .env\n\n!!! ''Installation '':\n\n```\n# install locally (recommended)\nnpm install dotenv --save\n\n```\n\n!!! '' ou aprés une déclaration dans le package.json ''\n\n```js\n\n  \"dependencies\": {\n    \"dotenv\": \"^16.0.3\",\n  }\n```\n\n!!! ''Configuration''\n\n```js\ndotenv.config()\n```\n\n* fichier .env et .env_exemple à créer (par exemple pour express : )\n\n```\nPORT=\nSECRET=\n\n```\n\n// exemple de varaible d'environnement supplémentaires pour une base postgress\n\n```\n\nPGUSER=\nPGHOST=\nPGPASSWORD=\nPGDATABASE=\nPGPORT=\n\n``\n\n* Documentation de référence : \n\n[[https://www.npmjs.com/package/dotenv]]\n\n\n\n","tags":"","title":"$:/code/js/module/dotenv","modified":"20240919194617221"},
2615{"created":"20240626071131198","text":"## Moteur de template (template engine) pour construire des vues (views)\n\n> Un \u003Cb>moteur de template\u003C/b> en développement web sert à générer du HTML dynamiquement. Il permet de séparer la logique de programmation (code) du design (template), facilitant ainsi la maintenance et l'évolution des applications web.\n\n\u003Cfieldset>EJS signifie \u003Cb>\"Embedded JavaScript\". \u003C/b> C'est un moteur de template, soit de vues. Un template peut être considéré comme un modèle qui sert de base pour la création de documents ou d’interfaces. Il définit la structure et le format de sortie, facilitant ainsi la présentation des données de manière cohérente. \n\u003C/fieldset>\n\n>
2615 Exemple de moteurs de template : **ejs**, Nunjunks, ou [[pug|$:/code/js/pug]]\n\n \n\n\n* Lien vers la documentation officielle : [[https://ejs.co/]]\n\n ---\n \n\u003Cdetails> \u003Csummary> \u003Cb>Présentation d'EJS du site de référence du projet [[\u003C/b>\u003C/summary>\n\n[[FAQ : https://ejs.co/#promo]]\n\n\u003Cfieldset>\n\u003Ccite>\n\nÀ quoi correspond le « E » ? « Intégré » ? Peut-être. Pourquoi pas « Efficace », « Élégant » ou simplement « Facile » ? EJS est un langage de création de modèles simple qui vous permet de générer du balisage HTML avec du JavaScript simple. Aucune religion sur la façon d'organiser les choses. Aucune réinvention de l'itération et du flux de contrôle. C'est juste du JavaScript simple.\n\n\u003C/cite>\n\u003C/fieldset>\n\n* Écrivez simplement du JavaScript qui émet le code HTML souhaité et faites le travail !\n* Utilise uniquement du javascript, soit un langage totalement convivial. \n* la vitesse\n\nNota bene de sécurité : \nEn bref, NE soumettez PAS de « vulnérabilités » qui incluent cet extrait de code :\n\n```js\n//En bref, NE soumettez PAS de « vulnérabilités » qui incluent cet extrait de code :\n\napp.get('/', (req, res) => {\n res.render('index', req.query);\n});\n```\n\u003C/fieldset>\n\n* Caractéristiques\n* Compilation et rendu rapides\n* Balises de modèle simples : \u003C% %>\n* Délimiteurs personnalisés (par exemple, utilisez [? ?] au lieu de \u003C% %>)\n* Le sous-modèle comprend\n* Livré avec CLI\n* Prise en charge du serveur JS et du navigateur\n* Mise en cache statique de JavaScript intermédiaire\n* Mise en cache statique des modèles\n* Conforme au système de visualisation Express\n\n\n\n\u003C/details>\n\n\n ---\n \n\u003Cdetails> \n\u003Csummary> \u003Cstrong> Installation \u003C/strong>\n\u003C/summary>\n\n*\tinstallation de l'extension ejs dans vscode \n> \u003Ccode> EJS language support \u003C/code> voir également dans VS code : parametres >settings --> decocher htmlHint pour l'occasion, si l'option existe\n\n* installation dans node.js\n\n```js\nnpm install ejs\n```\n\u003C/details>\n\n ---\n\n\u003Cdetails> \n\u003Csummary> \u003Cstrong> Déclaration \u003C/strong>\n\u003C/summary>\n\n```js\napp.set('view engine','ejs');\napp.set('views','./app/views/');\n\n```\n\n\u003C/details> \n\n---\n\n\u003Cdetails> \n\u003Csummary> \u003Cstrong>implementation des vues dans le router\u003C/strong>\n\u003C/summary>\n\t\n```js\nrouter.get('/mavue',res,req) => {\nres.render(pathdufichierdanslerepertoireviews);\n}\n\n\nrouter.get('/mavue',res,req) => {\nres.render(pathdufichierdanslerepertoireviews, {\nproduct1: 'DVD',\nproduct2: 'CD'\n});\n}\n\n```\n\n\u003C/details> \n\n---\n\t\n\u003Cdetails> \n\u003Csummary> \u003Cstrong> FAQ : Afficher les contenu des variables\u003C/strong>\n\u003C/summary>\n\t\n```\n\u003C%= product1 %>\n```\n\n\u003C/details>\n\n---\n\n\u003Cdetails> \n\n\u003Csummary> \u003Cstrong> FAQ : Inclure une vue dans une autre vue (i.e un  fichers ejs)\u003C/strong>\n\n\u003C/summary>\n\n```js\n\u003C%- include('template_name.ejs') %>\n\n```\n\u003C/details> \n\n---\n\t\nLiens utiles pour aller plus loin : \n* Pour connaitre les outils les plus utilisés, on peut consulter nom trends : [[https://npmtrends.com/]]","tags":"$:/code/js","title":"$:/code/js/module/ejs/express/template","modified":"20241016215858035","type":"text/markdown","source":"https://ejs.co/"},
2616{"created":"20240705083550837","text":"__Express-session__\n\n[[https://www.npmjs.com/package/express-session]]\n\n\n\u003Cdetails> \n\u003Csummary> \n\u003Cstrong>\tInstallation \u003C/strong>\n\t\n\u003C/summary>\n\nModule  à installer sur node.js \n\n```js\nnpm install express-session\n```\n\u003C/details>\n\n\n## Declaration de la session \n* Le cookies de connexion est stocké dans ''user_session'' : \n\n```js\nimport session from 'express-session';\n\n// Declarer dans le fichier index.js, avant le lancement du rooter et aprés l'instanciation d'express \n\napp.use(session({\n  resave: true, // la session est réenregistrée meme si elle n'est pas modifiée\n  secret: process.env.SECRET, // ajoute une part d'aléatoire dans la génération des id de session imprédictible\n  saveUninitialized: true, // génère un id de session pour tous ceux qui n'en ont pas encore\n}));
2616\n```\n\n```\nSession {\n  cookie: { path: '/', _expires: null, originalMaxAge: null, httpOnly: true }\n}\n```\nc'est une information stockée côté client associée à un domaine et envoyée automatiquement en entête dans chaque requête pour ce domaine.\n\n## mise en place d'un middleware de session \n\n```js\napp.use((req, res, next) => {\n    console.log(req.session);\n    req.session.visit = true;\n    next();\n}\n);\n\n```\n\n\n\n\nOn pose le middleware qui va intercepter chaque requete pour regarder si elle contient un id de session en entete cookie et qui va retrouver si possible les infos associées à cet id de session et enrichir la requete avec ces données. Si aucun id de session n'est présent, il est alors créé et renvoyé dans la réponse via l'entete `Set-Cookie`\n\n```js\n// avant de poser notre routeur, comme ça les données de la session identifiée seront accessible dans nos routes\n\napp.use(session({\n  resave: true, // la session est réenregistrée meme si elle n'est pas modifiée\n  secret: process.env.SECRET, // ajoute une part d'aléatoire dans la génération des id de session imprédictible\n  saveUninitialized: true, // génère un id de session pour tous ceux qui n'en ont pas encore\n}));\n```\n\nPar la suite je peux alimenter la session avec des informations spécifiques à l'émetteur de la requête :\n\n```js\n// dans un middleware associé à une route par exemple\nreq.session.pseudo = 'toto';\nreq.session.role = 'admin';\n```\n\nAinsi par la suite je peux aussi lire les infos de la session pour retrouver mes informations pour une requêtes ultérieure :\n\n```js\n// dans un middleware associé à une route par exemple\n// ainsi je peux contrôler mes accès !\nif (req.session.role === 'admin') {\n  res.render('administration');\n}\nelse {\n  res.sendStatus(403);\n}\n```\n## Exemple complet de gestion des authentificaiton dans un controller\n\n```js\n// Importation des modules nécessaires\nimport validator from 'validator';\nimport User from '../models/User.js';\nimport users from '../data/users.js';\nimport bcrypt from 'bcrypt';\n\n// Définition du contrôleur utilisateur\nconst userController = {\n\n  // Affiche la page d'inscription\n  signupPage: function (req, res) {\n    res.render('signup');\n  },\n\n  // Traite les données d'inscription soumises\n  signupAction: function (req, res) {\n    try {\n      // Options de validation pour un mot de passe fort (pour les passer a la fonction isStrongPassword de validator ligne suivante)\n      const options = { minLength: 12, minLowercase: 1, minUppercase: 1, minNumbers: 1, minSymbols: 1 };\n      // Vérification de la force du mot de passe\n      if (!validator.isStrongPassword(req.body.password, options)) {\n        throw new Error('Mot de passe trop faible');\n      }\n      // Hachage du mot de passe\n      bcrypt.hash(req.body.password, 10, (error, hash) => {\n        // Gestion des erreurs lors du hachage\n        if (error) {\n          console.error(error);\n          return res.render('signup', { alert: 'Erreur lors du hachage du mot de passe' });\n        }
2616\n        try {\n          // Création d'un nouvel utilisateur et ajout à la liste des utilisateurs\n          const newUser = new User({\n            email: req.body.email,\n            hash: hash,\n          });\n          users.push(newUser)\n          // Stockage de l'utilisateur dans la session pour le connecter\n          req.session.user = newUser;\n          // Redirection vers la page d'accueil après inscription\n          res.redirect('/');\n        } catch (error) {\n          console.error(error);\n          res.render('signup', { alert: error.message });\n        }\n      })\n    }\n    // Gestion des erreurs de validation du mot de passe\n    catch (error) {\n      console.error(error);\n      res.render('signup', { alert: error.message });\n    }\n  },\n\n  // Affiche la page de connexion\n  loginPage: function (req, res) {\n    res.render('login');\n  },\n\n  // Traite les données de connexion soumises\n  loginAction: function (req, res) {\n    try {\n      // Recherche de l'utilisateur par email\n      const foundUser = users.find(element => element.email === req.body.email);\n\n      // Si l'utilisateur n'est pas trouvé, lever une erreur\n      if (!foundUser) {\n        throw new Error('Couple email/mot de passe invalide');\n      }\n      // Vérification du mot de passe\n      bcrypt.compare(req.body.password, foundUser.hash, (error, result) => {\n        // Gestion des erreurs lors de la vérification du mot de passe\n        if (error) {\n          console.error(error);\n          return res.render('login', { alert: 'Erreur lors de la vérification du mot de passe' });\n        }\n        // Si le mot de passe ne correspond pas, afficher un message d'erreur\n        if (!result) {\n          return res.render('login', { alert: 'Couple email/mot de passe invalide' });\n        }\n        // Stockage de l'utilisateur dans la session pour le connecter\n        req.session.user = foundUser;\n\n        // Redirection vers la page d'accueil après connexion\n        res.redirect('/');\n      })\n    }\n    // Gestion des erreurs si l'utilisateur n'est pas trouvé\n    catch (error) {\n      console.error(error);\n      res.render('login', { alert: error.message });\n    }\n  },\n\n  // Gère la déconnexion de l'utilisateur\n  disconnect: function (req, res) {\n    // Destruction de la session (on oublie les données de session)\n    req.session.destroy();\n    // Redirection vers la page d'accueil après déconnexion\n    res.redirect('/');\n  },\n};\n\nexport default userController;\n\n```","tags":"","title":"$:/code/js/module/express/express-session","modified":"20241028145727064","type":"text/markdown"},
2617{"created":"20240701072719669","text":"```js\n\u003C% console.log(locals) %>\n\u003C%- include('./partials/header.ejs') %>\n   \u003C% for( let index = 0; index \u003C products.length; index++) { %>\n                \u003C% if (products[index].category === category) { %>\n                \u003Carticle class=\"card\">\n                    \u003Cimg class=\"card-img\" src=\"/img/products/\u003C%= products[index].slug %>.jpg\" alt=\"\">\n                    \u003Ch3 class=\"card-title\">\u003C%= products[index].title %>\u003C/h3>\n                    \u003Ca class=\"card-action btn\" href=\"product/\u003C%= products[index].slug %>\" aria-label=\"Voir le détail du produit Abricots\">Voir le détail\u003C/a>\n                \u003C/article>\n                \u003C% } %>\n            \u003C% } %>\n\n  \u003C%- include('./partials/footer.ejs') %>\n```","tags":"","title":"$:/code/js/module/express/template/ejs/app/views/view.ejs","modified":"20240701083926109"},
2618{"created":"20240626090301791","text":"[[https://handlebarsjs.com/]]","tags":"","title":"$:/code/js/module/express/template/handlebars","modified":"20240626090353063"},
2619{"created":"20240619133955160","text":"[[https://feathericons.com/]]\n\n!!! ''installation ''\n```ksh\nnpm install feather-icons --save\n```\n\n\n\n[[https://www.npmjs.com/package/feather-icons]]\n\n```js\nimport feather from 'feather-icons';\n\nfeather.replace();\n\n```\n\n* package.json\n\n```js\n\n  \"dependencies\": {\n    \"feather-icons\": \"^4.29.0\",\n    \"reset-css\": \"^5.0.1\"\n  }\n```","tags":"","title":"$:/code/js/module/feather-icons","modified":"20240919194709115"},
2620{"created":"20240619085943433","text":"\n* module : __'fs'__ Création de dossier\n\n```js\nconst fs = require('fs');\n\nfs.mkdir('./chemin/vers/monnouveaudossier', (err) => {\n\tif (err) throw err;
2620\n\tconsole.log('Le dossier a été créé');\n});\n\n```\n\n* sous module : __'fs/promises'__\n\n```js\n\nconst { writeFile } = require('fs/promises');\n\nasync function writeToFile(fileName, data) {\n  try {\n    await writeFile(fileName, data);\n    console.log(`Creer un fichier ${fileName}`);\n  } catch (error) {\n    console.error(`  : ${error.message}`);\n  }\n}\n```\n","tags":"","title":"$:/code/js/module/fs","modified":"20240619091040413"},
2621{"created":"20240620070610011","text":"```js\nimport http from 'http'; \n// ou node:http\n//On n'oublie pas de le lancer\n\n//Soit avec node chemin/vers/server mais il faudra penser à le relancer à chaque modification\n//Soit si on a ajouté node-dev en dépendance et créé des scripts raccourcis via npm run monScript par exemple npm run dev\n```\n\n\n* Création d'un serveur : \u003Ccode> createServer\u003C/code>\n\n> La méthode \u003Ccode> createServer \u003C/code>retourne un objet représentant le serveur que je peux mémoriser, il aura des méthodes pratiques.\n\n```js\n\n\n// je prépare la fonction que je passerai en callback\n// elle aura accès à chaque requête reçue, \n// et devra achever la construction d'une réponse\nfunction prepareResponse(request, response) {\n  console.log(`je vais devoir préparer une réponse pour ${request.url}`);\n  // console.log(request);\n  // console.log(response);\n}\n\nconst server = http.createServer(prepareResponse);\n```\n\n```js\nconst port = 3000;\n\nserver.listen(port, () => {\n  console.log(`Serveur démarré sur http://localhost:${port}/`);\n});\n\n\n// http://localhost:3000/\n```\n\n* http://localhost:3000/ = http://127/0.0.1\n\n> Il faut étoffer notre serveur HTTP pour réellement préparer une réponse\n\n```js\nfunction prepareResponse(request, response) {\n  // je peux construire ma réponse\n\n  // avec des entêtes\n  response.setHeader('Content-Type', 'text/html; charset=UTF-8');\n  // et écrire dans le corps\n  response.write('\u003Ch1>Coucou\u003C/h1>');\n  // attention l'ordre est important, on doit d'abord dire les entêtes, puis le corps\n  // puis dire que j'ai terminé pour envoyer la réponse\n  response.end();\n}\n```\n","tags":"$:/code/js","title":"$:/code/js/module/http","modified":"20240919195049374"},
2622{"created":"20240624082527638","text":"astuce : ctrl + clic pour accéder à l'emplacement de la fonction.\n\n[[https://javascript.info/modules-intro]]\n\n[[https://javascript.info/import-export]]\n\n* impact des modules :\n\n```js\n\u003Cscript>\n  alert(this); // window\n\u003C/script>\n\n\u003Cscript type=\"module\">\n  alert(this); // undefined\n\u003C/script>\n```\n\n* sans module\n\n```js\n\nconst circle = require('./circle.js');\n// const express = require('express');\n// const pages = require('./app/data/pages.json');\n// const publicRouter = require('./app/routers/public');\n// app.set('views', __dirname + '/app/views');\n// app.use(express.static(__dirname + '/public'));\n// const mainController = require('../controllers/main');\n// module.exports = router;\n// module.exports = mainControler;\n```\n\n* Export default : on ne peux exporter qu'une seule variable (ou fonction).\n\n```js\nexport default voiture;\nimport voiture from \"./data.js\";\n\n```\n\n```js\nexport { cp, ce1, ce2, enfantsDeLaClasse };\n\nimport { cp, ce1, ce2, enfantsDeLaClasse } from './data.js';\n```","tags":"","title":"$:/code/js/module/import-export","modified":"20240930183335602"},
2623{"created":"20240619122330199","text":"\n!!! Module pour le traitement par lot d'image\n\n```js\n\nimport { root, getFilePath } from './files.js' ;\nimport fs from \"fs\";\nimport path from 'node:path';\nimport Jimp from \"jimp\";\n\nfunction converter(image) {\n\n    let pathImage = getFilePath(image) ;\n    const outPath = path.join('./app/out', image);\n    // console.log(outPath);\n    Jimp.read(pathImage, (err, lenna) => {\n        if (err) throw err;\n        lenna\n          .resize(256, 256) // resize\n          .quality(60) // set JPEG quality\n          .greyscale() // set greyscale\n          .write(outPath); // save\n      });\n\n}\n\nexport default converter;\n```","tags":"","title":"$:/code/js/module/jimp","modified":"20240919194605826"},
2624{"created":"20240924095740853","text":"Le but : simuler un vrai serveur backend grâce à un fichier JSON.\n\nOn peut suivre la doc pour installer `json-server`\n\n```shell\n# l'option -g permettra d'installer json-server sur la machine de façon globale\nnpm install -g json-server\n\n# Une fois la librairie installée, je lance le serveur\njson-server db.json\n```\n\nCette dernière commande va lancer un serveur `http://localhost:3000`.\n\nPOINT IMPORTANT : la librairie gère automatiquement la gestion des CORS.\n\nEn vrai, dans la vrai vie, on devrait créer un projet NodeJS avec des routes, des controllers et des modèles (ou requêtes SQL) qui nous enverrait les données sous la forme JSON\n\n```js\nexport class PokemonController {\n    async list({ req, res }) {\n        // je récupère les données de la bdd\n        const pokemons = await Pokemon.findAll(
2624)\n        // je retourne les éléments JSON\n        return res.json(pokemons)\n    }\n}\n```","tags":"","title":"$:/code/js/module/json-server","modified":"20240924100132273"},
2625{"created":"20241001105218240","text":"Installation :\n\n```\nnpm install jwt-decode\n```\n\nDécodage d’un JWT :\n\n```js\n\nconst jwtDecode = require('jwt-decode');\nconst token = 'votre_jwt';\nconst decoded = jwtDecode(token);\nconsole.log(decoded);\n```\nCe module est particulièrement utile dans les applications web pour afficher des informations contenues dans le JWT sans avoir besoin de le vérifier côté client. Cependant, il est important de toujours valider le JWT côté serveur pour des raisons de sécurité.","tags":"","title":"$:/code/js/module/jwt-decode","modified":"20241001105354821"},
2626{"created":"20240805135615877","text":"\n* Installation avec node.js\n\n```ksh\nnpm install --save leaflet\n```\n\n```js\nimport L from 'leaflet';\n```\n\n```html\n\u003Cdiv id=\"mapid\" style=\"height: 400px;\">\u003C/div>\n```\n\n```js\nconst map = L.map('mapid').setView([51.505, -0.09], 13);\n\nL.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {\n  attribution: '&copy; \u003Ca href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap\u003C/a> contributors'\n}).addTo(map);\n```","tags":"","title":"$:/code/js/module/leaflet","modified":"20240919194725605"},
2627{"created":"20240823131133764","text":"ORM pour mongpDB\n\n```js\nconst axios = require('axios');\nconst mongoose = require('mongoose');\n\n// Connexion à MongoDB\nmongoose.connect('mongodb://localhost:27017/nom_de_ta_base_de_donnees', {\n    useNewUrlParser: true,\n    useUnifiedTopology: true\n});\n\nconst db = mongoose.connection;\ndb.on('error', console.error.bind(console, 'Erreur de connexion à MongoDB:'));\ndb.once('open', () => {\n    console.log('Connecté à MongoDB');\n});\n\n// Définir un schéma et un modèle\nconst dataSchema = new mongoose.Schema({\n    // Définir les champs selon la structure des données de l'API\n    field1: String,\n    field2: Number,\n    // Ajouter d'autres champs nécessaires\n});\n\nconst Data = mongoose.model('Data', dataSchema);\n\n// URL de l'API\nconst apiUrl = 'https://opendata.paris.fr/api/explore/v2.1/catalog/datasets/subventions-versees-annexe-compte-administratif-a-partir-de-2018/records?limit=20';\n\n// Fonction pour récupérer les données et les stocker dans MongoDB\nasync function fetchDataAndStore() {\n    try {\n        const response = await axios.get(apiUrl);\n        const records = response.data.records;\n\n        // Sauvegarder chaque enregistrement dans MongoDB\n        records.forEach(async (record) => {\n            const newData = new Data({\n                field1: record.field1,\n                field2: record.field2,\n                // Ajouter d'autres champs nécessaires\n            });\n\n            await newData.save();\n        });\n\n        console.log('Les données ont été sauvegardées dans MongoDB');\n    } catch (error) {\n        console.error('Erreur lors de la récupération des données:', error);\n    }\n}\n\n// Appel de la fonction\nfetchDataAndStore();\n```","tags":"","title":"$:/code/js/module/ORM/mongoose","modified":"20240924201347270"},
2628{"created":"20240802064214013","text":"\n## Sequelize\n\nSequelize est un ORM pour NodeJS. Il va nous permettre de communiquer avec nos base de données directement au travers d'objets. \n\n## Installation de Sequelize\n\nOn va d'abord installer Sequelize, le pilote PostgreSQL (pg) et le cas échéant les autres dépendances avec la commande suivante :\n\n```bash\nnpm install sequelize pg\n```\n\nEnsuite, on créé le module de connexion à la base de données comme on l'avait fait pour `pg` mais en uitlisant Sequelize\n\n```js\nimport Sequelize from 'sequelize';\n\nconst sequelize = new Sequelize('postgres://user:pass@localhost:5432/dbname')\n\nexport default sequelize;\n```\n\nEvivemment ces informations de connexion étant spécifique à chaque projet et n'ayant rien à faire sur Github, on préfèrera utiliser une variable d'environnement.  \nExemple:\n\n```js\nimport Sequelize from 'sequelize';\n\nconst sequelize = new Sequelize(process.env.PG_URL)\n\nexport default sequelize;\n```\n\n## Mise en place \n\nOn créé nos modèles basés sur la structure de la base de données\n\n```js\n// on importe la classe la mère et la liste des types fournis par sequelize\nimport { Model, DataTypes } from 'sequelize';\n// on importe notre client connecté à la base de données\nimport sequelize from \"./app/database.js\";\n\n// on définit le modèle qui étend la classe mère et hérite donc de ses méthodes\nclass User extends Model {}\n\n// on execute la méthode qui sert à initialiser les propriétés de notre modèle\n// on passe à init 2 objets en argument\nUser.init({\n  // dans le premier objet on liste notre propriétés à qui on associe un objet de configuration\n  firstname: {\
2628n    // https://sequelize.org/docs/v6/core-concepts/model-basics/#data-types\n    type: DataTypes.TEXT, // on configure un type\n    // https://sequelize.org/docs/v6/core-concepts/validations-and-constraints/ \n    allowNull: false, // on peut configurer des contraintes qui se mettront au niveau de la bdd\n    // https://sequelize.org/docs/v6/core-concepts/validations-and-constraints/#validators\n    validate: { // en plus on peut mettre tout un tas de validateurs qui agiront au niveau des setter\n      notEmpty: true,\n    },\n  },\n  lastname: {\n    type: DataTypes.TEXT,\n  }\n}, { // dans le 2ème objet on dit dans quelle bdd devront persister les infos\n  sequelize, // pour cela on indique le client connecté à la bdd\n  modelName: 'User', // on donne un nom au modèle, cela pourra servir plus tard\n  tableName: 'user', // on peut demander à sequelize de ranger les infos liées à ce modèle dans la table de notre choix\n});\n\nexport default User;\n```\n\n\n```js\nimport { Model, DataTypes } from 'sequelize';\n\nclass Role extends Model {};\n\nRole.init({\n    name: {\n        DataTypes.TEXT,\n    }\n}, {\n    sequelize,\n    modelName: 'Role',\n    tableName: \"role\"\n});\n\nexport default Role;\n```\n\nOn défini ensuite les associations entre nos table. Il existe plusieurs types d'associations dans Sequelize :\n\n- **belongsTo**: définit une relation de type \"many-to-one\", où un enregistrement de la table source (ex: User) appartient à un enregistrement de la table cible (ex: Company).\n- **hasOne**: définit une relation de type \"one-to-one\", où un enregistrement de la table source (ex: User) est associé à un unique enregistrement de la table cible (ex: Profile).\n- **hasMany**: définit une relation de type \"one-to-many\", où un enregistrement de la table source (ex: User) peut être associé à plusieurs enregistrements de la table cible (ex: Post).\n- **belongsToMany**: définit une relation de type \"many-to-many\", où un enregistrement de la table source (ex: User) peut être associé à plusieurs enregistrements de la table cible (ex: Group), et vice versa.\n\nDans notre cas, si on part du principe qu'un compte ne peut avoir qu'un seul rôle :\n\n```js\n// Nous indique qu'un compte fait référence à un role\nAccount.belongsTo(Role, {foreignKey: 'role_id', as : 'role'});\n// Nous indique qu'un rôle peut être affecté à plusieur comptes\nRole.hasMany(Account, {foreignKey: 'role_id', as : 'accounts'});\n```\n\n## Manipuler les données\n\nMaintenant que nos modèles sont prêt on va pouvoir manipuler les données de la base sans avoir à utiliser de requête SQL.\n\nVoici une liste de méthodes permettant de manipuler les données d'un modèle qu'on aurait relier avec Sequelize\n\n- **create(values, options)**: crée un nouvel enregistrement dans la base de données avec les valeurs spécifiées.\n- **findAll(options)**: récupère tous les enregistrements de la table correspondante dans la base de données.\n- **findByPk(id, options)**: récupère un enregistrement de la table correspondante en utilisant sa clé primaire (id).\n- **findOne(options)**: récupère le premier enregistrement correspondant aux options de recherche spécifiées.\n- **update(values, options)**: met à jour un ou plusieurs enregistrements correspondant aux options de recherche spécifiées avec les valeurs spécifiées.\n- **destroy(options)**: supprime un ou plusieurs enregistrements correspondant aux options de recherche spécifiées.\n- **count(options)**: récupère le nombre d'enregistrements correspondant aux options de recherche spécifiées.\n- **bulkCreate(records, options)**: crée plusieurs enregistrements dans la base de données en une seule opération.\n\n## options ?\n\nLes options dans Sequelize sont utilisées pour personnaliser le comportement des méthodes de requête générées par Sequelize, telles que create, findAll, findOne, etc. Les options sont généralement passées en tant que deuxième paramètre dans ces méthodes.\n\nVoici quelques-unes des options les plus couramment utilisées dans Sequelize :\n\n- **where**: spécifie une condition WHERE pour la requête, sous forme d'objet ou de chaîne de caractères.\n- **include**: spécifie les associations à inclure dans la requête. L'option include prend une ou plusieurs options d'association, qui peuvent être définies en utilisant les méthodes hasMany,belongsTo, hasOne et belongsToMany sur les modèles Sequelize.\n- **attributes**: spécifie les colonnes à inclure dans la requête, sous forme d'un tableau de chaînes de caractères ou d'un objet.\n- **limit**: spécifie le nombre maximum d'enregistrements à retourner.\n- **offset**: spécifie le nombre d'enregistrements à sauter avant de commencer à retourner des enregistrements.\n- **order**: spécifie l'ordre de tri des enregistrements, sous forme d'un tableau de chaînes de caractères.\n- **group**: spécifie les colonnes à utiliser pour regrouper les résultats, sous forme d'un tableau de chaînes de caractères.\n- **transaction**: spécifie la transaction dans laquelle la requête doit s'exécuter.\n- **lock**: spécifie le type de verrouillage à utiliser pour la requête, par exemple, FOR UPDATE ou SHARE.\n- **raw**: spécifie si la requête doit retourner des données brutes (par exemple, un tableau d'objets) plutôt que des instances de modèle Sequelize.\n\nIl existe de nombreuses autres options disponibles dans Sequelize, en fonction du type de requête et des fonctionnalités spécifiques de chaque méthode. Consultez la [documentation officielle](https://sequelize.org/) de Sequelize pour plus d'informations sur les options disponibles pour chaque méthode.\n\n\n* Étendre la classe Model :\nest  une étape courante et recommandée pour créer un modèle Sequelize.\nCela permet d'hériter des méthodes et fonctionnalités de base de Sequelize.\n* Appeler la méthode statique init :\nC'est une étape cruciale pour définir la structure et les propriétés du modèle.\nCette méthode permet de spécifier les attributs, leurs types, et d'autres options.\n* Définir manuellement les setters :\nSequelize génère automatiquement les getters et setters pour les propriétés définies.\nIl n'est généralement pas nécessaire de les définir manuellement, sauf si vous avez besoin d'une logique personnalisée.\n\nExemple de création typique d'un modèle Sequelize :\n```javascript\nconst { Model, DataTypes } = require('sequelize');\n\nclass User extends Model {\n  static init(sequelize) {\n    super.init({\n      username: DataTypes.STRING,\n      email: DataTypes.STRING\n    }, { sequelize });\n  }\n}\n```\nDans cet exemple :\nLa classe User étend Model.\nLa méthode statique init est utilisée pour définir les propriétés.\nLes setters (et getters) sont automatiquement générés par Sequelize.\nIl est important de noter que bien que la définition manuelle des setters ne soit généralement pas nécessaire, Sequelize offre la flexibilité de les personnaliser si besoin, en les définissant explicitement dans le modèle ou en utilisant l'option set lors de la définition des attributs.","tags":"","title":"$:/code/js/module/ORM/Sequelize","modified":"20240919194356852","type":"text/markdown"},
2629{"created":"20240729072249732","text":"## Installation du package `pg`\n\n> Le package `pg` nous fournit un constructeur pour construire un objet représentant notre client connecté à la basse de données (un objet qui disposera de méthodes pour envoyer des requêtes à la BDD).  \nOn pourra exporter cet objet pour s'en servir dans nos autres fichiers\n\n\n```bash\nnpm install pg\n```\n* Pour aller plus loin avec la documentation [Une documentation](https://node-postgres.com/) \n\n\n```js\n// par exemple dans un fichier app/database.js\nimport pg from 'pg';\nimport * as dotenv from 'dotenv';\ndotenv.config();\n\nconst client = new pg.Client();\nclient.connect();\n\nexport default client;\n```\nPour se connecter, le constructeur Client va avoir besoin de connaître un certain 
2629nombre d'informations :\n\n - Le nom d'hôte / l'adresse IP de la machine qui héberge le serveur Postgres dont on a besoin.\n - Le nom d'utilisateur de la base de données que l'on souhaite consulter.\n - Son mot de passe.\n - Le nom de la base de données que l'on souhaite consulter.\n - Le port sur lequel écoute le service PostgreSQL.\n\n[Plusieurs moyen s'offrent à nous pour les fournir d'après la doc](https://node-postgres.com/features/connecting). La bonne pratique étant d'avoir recours aux variables d'environnement.\n\nDonc finalement on crée un fichier `.env` avec les informations suivantes (exemple)\n\n```\nPGUSER=otorent\nPGHOST=localhost\nPGPASSWORD=otorent\nPGDATABASE=otorent\nPGPORT=5432\n```\n, on est connecté à une base.\n \n## Exécution d'une requête\n\nLa méthode `query` de notre objet client permet d'executer une requête\n\n```js\nclient.query('SELECT * FROM movies');\n\n//ou \n\nclient.query('SELECT * FROM users', (err, res) => {\n  if (err) {\n    console.error(err);\n  } else {\n    console.log(res.rows);\n  }\n});\n\n// ou avec des paramètres :\n\nconst text = 'INSERT INTO users(name, email) VALUES($1, $2)';\nconst values = ['John', '[email protected]'];\nclient.query(text, values, (err, res) => {\n  // ...\n});\n```\n[Le module pg offrent 2 moyens](https://node-postgres.com/features/queries) de dire quoi faire des résultats une fois que nous les aurons (spoiler alert: nous choisirons la 2ème solution)\n\n\n1. Via des callback\n\n```js\n// exemple dans une méthode de contrôleur\nclient.query('SELECT * FROM movie', (err, response) => {\n  res.render('home', {\n    movies: response.rows\n  });\n});\n```\n\nLe problème c'est qu'on tombe dans l'enfer des callbacks si on a besoin du résultat de plusieurs requêtes : horrible\n\n```js\n// exemple dans une méthode de contrôleur\nclient.query('SELECT * FROM movie', (err, movies) => {\n  client.query('SELECT * FROM director', (err, directors) => {\n    client.query('SELECT * FROM actor', (err, actors) => {\n      res.render('home', {\n        movies: response.rows,\n\tdirectors: response2.rows,\n\tactors: response3.rows,\n      });\n    });\n  });\n});\n```\n\n2. Via des promesses\n\n\n```js\n// exemple dans une méthode de contrôleur\ntry {\n  const movies = await client.query('SELECT * FROM movie');\n  const directors = await client.query('SELECT * FROM directors');\n  const actors = await client.query('SELECT * FROM actors');\n  \n  res.render('home', {\n    movies: movies.rows,\n    directors: directors.rows,\n    actors: actors.rows,\n  });\n} catch (error) {\n  // ...\n}\n\n//ou \nclient.query('SELECT * FROM users')\n  .then(res => console.log(res.rows))\n  .catch(e => console.error(e.stack));\n```\n\n\n\n## Les promesses\n\n> Une promesse est un moyen d'encapsuler la production d'une valeur potentiellement longue à obtenir et qui laissera paramétrable \"quoi faire\" quand la valeur est obtenue ou en cas d'erreur.\n\nPar exemple\n\n```js\n// une promesse se construit avec le constructeur Promise\n// on lui passe en argument une fonction qui a pour mission de calculer une valeur\n// on récupère un objet représentant notre promesse\nconst myTestPromise = new Promise(function(resolve, reject) {\n  // ici je dois calculer une valeur via des calculs qui peuvent prendre du temps\n  // je pourrais ensuite appeler resolve et lui passer cette valeur si tout va bien\n  // sinon appeler reject et lui passer une erreur\n});\n\n// dans un second temps on peut dire quoi faire une fois qu'on aura le résultat\n// en cas de succès via la méthode .then\nmyTestPromise.then(function(result) {\n  console.log(result);\n});\n\n// en cas d'erreur via la méthode .catch\nmyTestPromise.catch(function(error) {\n  console.log(error);\n});\n\n// l'avantage des promesses est qu'elles ne bloquent pas l'execution du script\nconsole.log('un message visible sans attendre la résolution de la promesse');\n```\n\nVoici une démo pour tester\n\n```js\nconst myTestPromise = new Promise(function(resolve, reject) {\n  let value;\n  setTimeout(() => {\n    value = 123;\n    resolve(value);\n  }, 2000);\n});\n\nmyTestPromise.then(function(result) {\n  console.log('resultat obtenu', result);\n});\n\nconsole.log('un message visible sans attendre la résolution de la promesse');\n```\n\nBien sûr cet exemple est un peu triste, la méthode `query` renvoie elle au
2629ssi une promesse, on peut donc utiliser la même syntaxe\n\n```js\nconst sqlQuery = client.query('SELECT * FROM movie');\n\nsqlQuery.then(function(result) {\n  console.log('resultat obtenu', result);\n});\n\nsqlQuery.catch(function(error) {\n  console.log('erreur', error);\n});\n```\n\n\n## Async/await\n\nUne autre syntaxe est disponible et plus sympa pour les promesses, avec les mots clés `async` et `await`\n\nOn peut bloquer l'execution du script avec le mot clé await, pour attendre la valeur calculée dans la promesse\n\n```js\nconst result = await client.query('SELECT * FROM movie');\nconsole.log('resultat obtenu', result);\n```\n\nDe plus si une erreur est produite lors de la résolution de la promesse on peut l'attraper avec un block `try/catch`\n\n```js\ntry {\n  const result = await client.query('SELECT * FROM movie');\n  console.log('resultat obtenu', result);\n} catch (error) {\n  console.log('erreur', error);\n}\n```\n\n**Attention** toutefois, on bloque l'execution du script tant qu'on a pas la valeur avec `await`, ce qui pourrait poser problème.   \nAinsi ce mot clé n'est pas disponible dans les fonctions basiques, il faut leur ajouter le mot clé `async` pour l'autoriser. Cela signifie que ces fonctions s'executerons dans leur coin, sans bloquer l'execution globale.\n\n\n```js\nasync function demo() {\n  try {\n    const result = await client.query('SELECT * FROM movie');\n    console.log('resultat obtenu', result);\n  } catch (error) {\n    console.log('erreur', error);\n  }\n}\n\n// la fonction s'executera dans son coin\ndemo();\n// ainsi ce message pourra être visible avant que l'execution de la fonction soit terminée\nconsole.log(\"coucou\");\n```\n\nCe qu'on pourra faire donc, c'est par exemple executer des requête dans les méthodes de nos contrôleurs et attendre le résultat. On devra donc marquer nos méthodes de contrôleurs comme asynchrones\n\n```js\n// app/controllers/mainController.js\n\nconst mainController = {\n  home: async function(req, res) {\n    try {\n      const result = await client.query('SELECT * FROM movie');\n      res.render('home', { movies: result.rows })\n    } catch (error) {\n      console.log('erreur', error);\n      res.render('error', { error });\n    }\n  },\n};\n```\nPour tester la connexion :\n\n```js\nconst { Client } = require('pg');\n\nconst client = new Client({\n  user: 'dbuser',\n  host: 'database.server.com',\n  database: 'mydb',\n  password: 'secretpassword',\n  port: 5432,\n});\n\nclient.connect()\n  .then(() => console.log('Connected successfully'))\n  .catch(err => console.error('Connection error', err.stack))\n  .finally(() => client.end());\n```\n\n","tags":"$:/doc/postgreSQL","title":"$:/code/js/module/pg","modified":"20241028180328810","type":"text/markdown"},
2630{"created":"20241001104909981","text":"Installation : Pour installer le module, vous pouvez utiliser npm :\n\n```\nnpm install jsonwebtoken\n```\n\nCréation d’un JWT : Vous pouvez créer un JWT en utilisant la méthode sign du module. \n\nPar exemple :\n\n```js\n\nconst jwt = require('jsonwebtoken');\nconst token = jwt.sign({ userId: 123 }, 'votre_clé_secrète', { expiresIn: '1h' });\nconsole.log(token);\nCode généré par l'IA. Examinez et utilisez soigneusement. Plus d'informations sur la FAQ.\nVérification d’un JWT : Pour vérifier un JWT, utilisez la méthode verify :\nJavaScript\n\njwt.verify(token, 'votre_clé_secrète', (err, decoded) => {\n  if (err) {\n    console.log('Token invalide');\n  } else {\n    console.log(decoded);\n  }\n});\n```\n","tags":"$:/doc/react $:/code/js","title":"$:/code/js/module/react/JWT","modified":"20241028145839212"},
2631{"created":"20240619122352644","text":"!!! Syntaxe complète :\n\n```js\n\nslugify('some string', {\n  replacement: '-',  // replace spaces with replacement character, defaults to `-`\n  remove: undefined, // remove characters that match regex, defaults to `undefined`\n  lower: false,      // convert to lower case, defaults to `false`\n  strict: false,     // strip special characters except replacement, defaults to `false`\n  locale: 'vi',      // language code of the locale to use\n  trim: true         // trim leading and trailing replacement chars, defaults to `true`\n})\n\n```\n\n* Aprés npm install slugify, on importe le module :\n\n```js\nimport Slugify from \"slugify\";\n```\n\nExemple d'utilisation : \n```js\nconst outPath = path.join('./app/out', Slugify(image, '_'));\n\n```","tags":"","title":"$:/code/js/module/slugify","modified":"20240919194542392"},
2632{"created":"20240926104852510","text":"\n## Storybook\n\n### Présentation et installation\n\n- Présentation de Storybook\n- [[Installation de Storybook|https://storybook.js.org/docs/get-started/install]] dans un projet React existant\
2632n  - Étapes détaillées pour installer Storybook.\n\n\t```\npnpx storybook@latest init\n  ```\nChoisir le composant vite\n\n  - Configuration de base et lancement de Storybook.\n\n### Utilisation de l'addon @storybook/addon-a11y\n\n- Ajouter et configurer l'addon @storybook/addon-a11y\n  - Installation de l'addon.\n  - Configuration de Storybook pour utiliser l'addon.\n- Audit d'accessibilité avec l'addon\n  - Exemple d'utilisation de l'addon pour tester l'accessibilité des composants.\n  - Identifier et corriger les problèmes d'accessibilité\n    - Analyse des résultats de l'audit.\n    - Apporter des modifications pour corriger les problèmes identifiés.\n","tags":"$:/doc/react","title":"$:/code/js/module/storyBook","modified":"20241028152332180","type":"text/markdown"},
2633{"created":"20240926113919201","text":"[[https://jestjs.io/]]\n\n[[https://vitest.dev/]]\n\n\n- `describe` : On peut ensuite délimiter des chapitres pour organiser nos tests via la fonction describe accessible dans le contexte de nos tests.\n\n```javascript\n// ...\ndescribe('Execution', () => {\n  // ici viendront des tests ou des sous-chapitres\n});\n```\n\n- `test` ou `it` : On peut ensuite décrire un test unitaire via la fonction test ou it accessible dans le contexte de nos tests.\n\n```javascript\n// ...\ntest('it should give 5 for 2 and 3', () => {\n  // ici viendra l'assertion\n});\n```\n\n- `expect` : On peut ensuite écrire une assertion via la fonction expect accessible dans le contexte de nos tests. L’assertion est une affirmation qui sera vérifiée à l’exécution des tests pour savoir si elle est vérifiée ou non (si le test passe ou s’il échoue). C’est comme faire des comparaisons avec nos opérateurs habituels. Sauf que notre outil de test nous fourni des fonctions pratiques pour faire cela plus facilement.\n\n```javascript\n// ...\ntest('it should give 5 for 2 and 3', () => {\n  expect(2 + 3).toBe(5);\n});\n```","tags":"","title":"$:/code/js/module/testing/jest","modified":"20240927030131586"},
2634{"created":"20240704082318373","text":"```\nnpm install validator\n```\n\n\n```js\nimport validator from 'validator' ;\n\n/// Appel de la methode\nvalidator.isEmail(value);\n\n```\n[[https://www.npmjs.com/package/validator]]\n\n!!! Validations interessantes :\n\n* Pour les mots de passe robuste :\n\n```js\nisStrongPassword(str [, options])\n\n//check if the string can be considered a strong password or not. Allows for custom requirements or scoring rules. If returnScore is true, then the function returns an integer score for the password rather than a boolean.\n//Default options:\n//{ minLength: 8, minLowercase: 1, minUppercase: 1, minNumbers: 1, minSymbols: 1, returnScore: false, pointsPerUnique: 1, pointsPerRepeat: 0.5, pointsForContainingLower: 10, pointsForContainingUpper: 10, pointsForContainingNumber: 10, pointsForContainingSymbol: 10 }\n\n```\n* pour valider une url \n\n```js\nisURL(str [, options])\tcheck if the string is a URL.\n\n//options is an object which defaults to { protocols: ['http','https','ftp'], require_tld: true, require_protocol: false, require_host: true, require_port: false, require_valid_protocol: true, allow_underscores: false, host_whitelist: false, host_blacklist: false, allow_trailing_dot: false, allow_protocol_relative_urls: false, allow_fragments: true, allow_query_components: true, disallow_auth: false, validate_length: true }.\n\n//require_protocol - if set to true isURL will return false if protocol is not present in the URL.\n//require_valid_protocol - isURL will check if the URL's protocol is present in the protocols option.\n//protocols - valid protocols can be modified with this option.\n//require_host - if set to false isURL will not check if host is present in the URL.\n//require_port - if set to true isURL will check if port is present in the URL.\n//allow_protocol_relative_urls - if set to true protocol relative URLs will be allowed.\n//allow_fragments - if set to false isURL will return false if fragments are present.\n//allow_query_components - if set to false isURL will return false if query components are present.\n//validate_length - if set to false isURL will skip string length validation (2083 characters is IE max URL length).\n```","tags":"","title":"$:/code/js/module/validator.js","modified":"20240919194800295"},
2635{"created":"20241001105702151","text":"[[https://zod.dev/]]\n\nPour installer Zod, vous pouvez utiliser npm :\n\n```\nnpm install zod\n```\n\n* Création d’un schéma\nAvec Zod, vous pouvez créer des schémas pour différents types de données. Par exemple, pour un objet utilisateur :\n\n```js \n\nconst { z }
2635 = require('zod');\n\nconst userSchema = z.object({\n  name: z.string(),\n  age: z.number().int(),\n  email: z.string().email(),\n});\n\nconst user = {\n  name: \"Alice\",\n  age: 30,\n  email: \"[email protected]\"\n};\n\ntry {\n  userSchema.parse(user); // Valide les données\n  console.log(\"Données valides !\");\n} catch (e) {\n  console.error(\"Données invalides :\", e.errors);\n}\n```","tags":"","title":"$:/code/js/module/zod","modified":"20241001105911733","type":"text/markdown"},
2636{"created":"20240607135211156","text":"Quel type de valeur n'existe pas en javascript\n[4.12]\n*\n1 point\nInteger\nBoolean\nString\n\n\n```js\n\nNumber.prototype.toFixed()\n// formater un nombre en notation à point-fixe.\n\n```\n\n* Source : [[Documentation MDM|https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed]]\n\n\n\n\nLa fonction parseInt() en JavaScript sert principalement à analyse une chaîne de caractère fournie en argument et renvoie un entier exprimé dans une base donnée. \n\nConversion de chaînes en nombres entiers\nparseInt() analyse une chaîne de caractères et renvoie un entier représentant la valeur numérique contenue dans cette chaîne. Par exemple :\njs\nconst num1 = parseInt(\"42\");     // renvoie 42\nconst num2 = parseInt(\"-10\");    // renvoie -10\n\nConversion avec une base spécifiée\nLe deuxième paramètre optionnel de parseInt() permet de préciser la base numérique à utiliser pour la conversion. Cela est utile pour convertir des nombres représentés dans d'autres bases que la base 10 (décimale). Par exemple :\njs\nconst hex = parseInt(\"0xFF\", 16);  // renvoie 255 (base hexadécimale)\nconst bin = parseInt(\"0b101\", 2);  // renvoie 5 (base binaire)\n\nExtraction de la partie entière\nparseInt() peut être utilisé pour extraire la partie entière d'un nombre flottant en ignorant la partie décimale. Par exemple :\njs\nconst float = 3.14;\nconst int = parseInt(float);  // renvoie 3\n\nGestion des valeurs non numériques\nSi la chaîne ne commence pas par un chiffre valide dans la base spécifiée, parseInt() renvoie NaN (Not a Number). Par exemple :\njs\nconst notANumber = parseInt(\"hello\");  // renvoie NaN\n\nEn résumé, la fonction parseInt() est très utile pour convertir des données textuelles en nombres entiers, en gérant différentes bases numériques et en extrayant la partie entière d'un nombre flottant. Elle permet de s'assurer que les données sont dans le bon format numérique pour effectuer des opérations mathématiques.","tags":"","title":"$:/code/js/number","modified":"20240613081145101"},
2637{"created":"20240913100747442","text":"\n### Opérateurs de comparaison\n\n```js\nif ( valeur === 12 ) {\n    console.log(\"valeur est strictement égal à 12 (valeur et type)\");\n}\nif ( valeur !== 12 ) {\n    console.log(\"valeur est strictement différent de 12 (valeur et type)\");\n}\n\nif ( valeur != \"12\" ) {\n    console.log(\"valeur est différent 12 (valeur uniquement)\");\n}\n\nif ( valeur >= 12 ) {\n    console.log(\"valeur est supérieur ou égal à 12\");\n}\n```\n\n### Opérateurs logiques\n\n```js\nif ( valeur === 12 || valeur === true ) {\n    console.log(\"valeur est égal à 12 OU est vrai\");\n}\n```\n\n```js\nif ( valeur \u003C 5 && valeur > 10 ) {\n    console.log(\"valeur est inférieur à 5 et supérieur à 10\");\n}\n\n\n```\n\n```js\nif ( !valeur ) {\n    console.log(\"valeur n'est pas vrai\");\n}\n```\n\nAttention à l'opérateur `&&`, il peut également service :\n\n* Short-circuit evaluation:\n&& evaluates operands from left to right and returns immediately with the value of the first falsy operand it encounters. If all values are truthy, it returns the value of the last operand. //Renvoie la valeur à droite de l'opérateur si la valeur de gauche est considérée comme vraie.\n\n* Affect Default values:\n&& can be used to provide default values or handle potential null/undefined values:\n\n```js\nconst result = someObject && someObject.property;\n```\nThis will return undefined if someObject is falsy, avoiding errors if someObject doesn't exist.\n\n** Returning non-boolean values:\n\n```js\nconst result = \"hello\" && 42; // returns 42\n```\n\n* Combining with assignment:\nThe &&= operator can be used for logical AND assignment, which only assigns if the left operand is truthy2.","tags":"$:/code/js","title":"$:/code/js/operateurs","modified":"20241002091311139","type":"text/markdown"},
2638{"created":"20240702092942387","text":"__Payload__\n\n>un payload (ou charge utile) désigne les données transmises dans le corps d’une requête ou d’une réponse HTTP. Ces données peuvent être au format JSON, XML, ou même binaire comme des images ou des vidéos.\n\n```html\n\n\u003Cform method=\"POST\" action=\"/subscribe\">\n  \u003Cinput name=\"email\" type=\"email\">\n  \u003Cselect name=\"frequence\">\n    \u003Coption value=\"dayly\">Quotidienne\u003C/option>\n    \u003Coption value=\"monthly\">Mensuelle\u003C/option>\n  \u003Cselect>\n\u003C/form>\n```\n\n```js\n// /index.js\nimport express from 'express';
2638\n// ...\n\nconst app = express();\napp.use(express.urlencoded({ extended: true })); \n// l'option extended permet de passer aussi des objets et des tableaux, ce n'est pas le plus important à retenir ;)\n\n```\n\nNTUI ou Never Trust User Input.\n\n\n## Les méthodes HTTP\n\nIl existe différentes [méthodes de requêtes HTTP](https://developer.mozilla.org/fr/docs/Web/HTTP/Methods)\n\nUne requête (et aussi une réponse) HTTP c'est un échange d'informations entre 2 parties, le client et le serveur. Ces informations commencent par des lignes d'entêtes suivi d'un corps.\n\nLes lignes d'entêtes commencent par le verbe HTTP (ou méthode) suivi de l'url. Par exemple quand je tape `http://oclock.io/search` dans ma barre d'adresse, la requête qui part commence par `GET /search`.\n\nLe navigateur n'émet par défaut que des requêtes en `GET`.\n\nIl est capable de gérer une autre méthode dans certains cas : la méthode `POST`.  \n\nLe seul moyen dont on dispose facilement dans le navigateur pour envoyer des requêtes en `POST` c'est via un formulaire.  \nL'avantage (ou l'inconvénient suivant le cas) c'est que dans ce cas les informations complémentaires ne seront pas envoyées via la query string mais via le corps de la requête.  \nAinsi les informations envoyées peuvent être cachées. Pratique dans le cas d'une connexion ou d'une inscription, mais pas judicieux pour un moteur de recherche pour lequel on préférera le `GET`.\n\nLes données d'un formulaire peuvent être envoyé via la requête GET en tant qu'URL ou via POST request comme données dans la request body (avec la method=\"post\").\n\n\n## Envoyer des informations en payload dans le corps de la requête\n\nDonc on a dit que le seul moyen évident d'envoyer une requête en `POST` depuis le navigateur est via un formulaire.\n\nPour cela on met l'attribut `method=\"POST\"`.\n\nCe sont toujours les attributs `name` des champs qui seront utilisés en clé et les saisies de l'utilisateur en valeur.  \nToutefois les paires `clé=valeur` ne figureront pas dans l'url de la requête mais dans son corps.  \nCe corps n'est pas visible dans la barre d'adresse, on peut le voir dans le devtool toujours dans l'onglet _Network_ puis, après avoir sélectionné la requête qui nous intéresse, dans l'onglet _Payload_.\n\nExemple pour un formulaire d'inscription à une newsletter :\n\n```html\n\u003Cform method=\"POST\" action=\"/subscribe\">\n  \u003Cinput name=\"email\" type=\"email\">\n  \u003Cselect name=\"frequence\">\n    \u003Coption value=\"dayly\">Quotidienne\u003C/option>\n    \u003Coption value=\"monthly\">Mensuelle\u003C/option>\n  \u003Cselect>\n\u003C/form>\n\n\u003C!-- \n  Imaginons que j'écrive \"[email protected]\" et que je choisisse \"Quotidienne\"\n  La requête générée sera `/subscribe` en `POST`\n  Les informations suivantes seront passées dans le corps de la requête\n  `[email protected]&frequence=dayly`\n-->\n```\n\nOn dit que les données sont écrites au format **urlencoded** dans le corps de la requête. On parle aussi de _payload_.\n\n### Parser et utiliser le payload\n\nCe qu'on veut maintenant surtout c'est utiliser ces données côté serveur.\n\nPour cela il y a 1 prérequis.  \nEn effet la chaîne transmise `[email protected]&frequence=dayly` n'est pas facilement manipulable, un objet serait plus pratique.  \nExpress est capable de transformer cette chaîne en objet, mais ne le fait pas par défaut il faut le demander.\n\nPour cela on doit ajouter le middleware [`express.urlencoded`](https://expressjs.com/fr/api.html#express.urlencoded)\n\nExemple :\n\n```js\n// /index.js\nimport express from 'express';\n// ...\n\nconst app = express();\napp.use(express.urlencoded({ extended: true })); // l'option extended permet de passer aussi des objets et des tableaux, ce n'est pas le plus important à retenir ;)\n\n// ...\n```\n\nGrâce à cela express va transformer les informations reçues en un objet facile à manipuler et mis à disposition dans tous les middlewares suivants. \nC'est dans la propriété `req.body` qu'on trouvera cette objet à présent pour nos routes en `POST`.\n\nExemple : \n```js\n// app/router.js\n// Attention la méthode n'est plus get mais post !\nrouter.post('/subscribe', mainController.subscribe);\n\n// A noter qu'il est tout à fait possible d'avoir une route en GET et une route en POST pour le même chemin\n// Celle en GET sera pratique pour renvoyer de quoi afficher le formulaire\n// Celle en POST sera pratique pour traiter les données envoyées via le formulaire\n```\n\n```js\n// app/controllers/mainController.js\nconst mainController = {\n  subscribe: function (req, res) {\n    // si j'ai bien placé le middleware express.urlencoded à la création de mon serveur\n    // j'ai accès à req.body\n    console.log(req.body);\n    // j'y trouverais un objet avec en propriétés les informations envoyées via le formulaire\n    console.log(req.body.email);\n    // ...\n  },\n};\n```\n\nIl n'y a plus qu'à utiliser les données selon nos besoins.\n\n## Tester les données reçues et gérer des erreurs\n\nEn développement on dit souvent _NTUI_ ou **Never Trust User Input**.  \nOn n'aura jamais confiance envers les données envoyées par une utilisateur.  \nIl faudra toujours les tester côté serveur pour les valider.  \nEn effet des tests côtés client en javascript ne suffiraient pas car l'utilisateur peut modifier le code qui s'execute côté client.  \nIl faut donc des tests côté serveur pour que ce soit fiable.\n\nPour tester les données, de simples `if` peuvent suffire\n\nExemple : imaginons que j'attende un nom d'utilisateur dans `req.body`\n\n```js\nconst mainController = {\n  subscribe: function (req, res) {\n    // je teste différents critères\n    if (!req.body.username) {\n      res.render('error', { message: 'Nom d\\'utilisateur manquant.' });\n    }\n    else if (req.body.username.length \u003C 3) {\n      res.render('error', { message: 'Nom d\\'utilisateur top court. 4 caractères minimum.' });\n    }
2638\n    else if (users.includes(req.body.username)) {\n      res.render('error', { message: 'Nom d\\'utilisateur déjà pris.' });\n    }\n    else {\n      res.render('confirmation');\n    }\n  },\n};\n```\n\nToutefois il y a quelques répétitions.  \nCe code peut être un peu plus élégant un bloc [`try/catch`](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Statements/try...catch) et en jetant des [erreurs](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Global_Objects/Error) avec [`throw`](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Statements/throw).  \nOn va en utiliser pas mal par la suite donc ça peut être chouette de le tester un peu d'ores et déjà.\n\nExemple\n\n\n```js\nconst mainController = {\n  subscribe: function (req, res) {\n    // un block try/catch est évalué ainsi :\n    // tant qu'aucune erreur n'est jetée les instructions du try s'executent dans l'ordre\n    // si une erreur est jetée, l'execution du try s'achève immédiatemment et c'est le block catch qui s'execute\n    // puis on sort du bloc\n    // L'objet erreur qui a été jeté est disponible dans le block catch et peut être utilisé \n    try {\n      if (!req.body.username) {\n        throw new Error('Nom d\\'utilisateur manquant.');\n      }\n      else if (req.body.username.length \u003C 3) {\n        throw new Error('Nom d\\'utilisateur top court. 4 caractères minimum.');\n      }\n      else if (users.includes(req.body.username)) {\n        throw new Error('Nom d\\'utilisateur déjà pris.');\n      }\n      else {\n        res.render('confirmation');\n      }\n    }\n    catch (error) {\n      // console.log(error.name, error.message);\n      res.render('error', { message: error.message });\n    }\n  },\n};\n```","tags":"$:/code/js","title":"$:/code/js/payload","modified":"20241028144229325","type":"text/markdown"},
2639{"created":"20240826075215787","text":"Utiliser await pour attendre la valeur dans une fonction async ou bien appeler la méthode then sur l'objet Promise, au choix :\n\n* Utilisation de await dans une fonction async :\n```javascript\nasync function getUsers() {\n  try {\n    const result = await client.query('SELECT * FROM users');\n    console.log(result.rows);\n  } catch (err) {\n    console.error('Error executing query', err);\n  }\n}\n```\n\n* Utilisation de la méthode then :\n```javascript\nclient.query('SELECT * FROM users')\n  .then(result => {\n    console.log(result.rows);\n  })\n  .catch(err => {\n    console.error('Error executing query', err);\n  });\n```\nPourquoi cette flexibilité est importante :\n\nContexte du code : Selon que vous travaillez dans un environnement qui supporte async/await ou non, vous pouvez choisir l'approche la plus appropriée.\n\nCompatibilité : Dans des environnements plus anciens qui ne supportent pas async/await, l'utilisation de then reste une option viable.\n\nPoints importants à retenir :\nLes deux méthodes sont équivalentes en termes de fonctionnalité.\nawait ne peut être utilisé que dans une fonction marquée comme async.\nL'utilisation de then peut conduire à des chaînes de promesses plus complexes pour des opérations multiples.\nLa gestion des erreurs diffère légèrement : try/catch pour await, .catch() pour les promesses.","tags":"","title":"$:/code/js/pg","modified":"20240826075526293","type":"text/markdown"},
2640{"created":"20240730060959935","text":"\n## Sécuriser ses requêtes\n\nA NE JAMAIS FAIRE\n> ne  jamais concaténer telle quelle des données saisies par l'utilisateur\n\n```js\n// A NE JAMAIS FAIRE\nconst result = await client.query(`\n  SELECT *\n  FROM product \n  WHERE product.slug = '${req.params.slug}';\n`);\n// FIN DE CE QU'IL NE FAUT PAS FAIRE\n```\n### Concevoir des requêtes paramétrées sécurisées\n\n> On passe en premier argument la requête en indiquant $1, $2, $3, ... sur les parties paramétrables.\nPuis en second argument on passe un tableau qui contient les valeurs à injecter.\nAinsi on laisse le module pg remplacer les valeurs des paramètres à l'aide de robustes fonctions de substitutions largement testées.\n\n\n```js\n// Bien\nconst result = await client.query(`\n  SELECT *\n  FROM product \n  WHERE product.slug = $1;\n`, [req.params.slug]);\n```\n\nSi on préfère avoir recourt à des variables intermédiaires pour la lisibilité, c'est bien aussi\n\n```js\n// Bien\nconst text = `\n  SELECT *\n  FROM product \n  WHERE product.slug = $1;\n`;\nconst values = [req.params.slug];\nconst result = await client.query(text, values);\n```\n\n\n## Active Record\n\nActive Record est un design pattern communément utilisé dans le développement web qui permet aux développeurs de mani
2640puler des données dans une base de données relationnelle à l'aide d'un modèle de données objet. En d'autres termes, il s'agit d'un moyen de lier des objets de modèle à des enregistrements de base de données, de sorte que les développeurs puissent facilement créer, lire, mettre à jour et supprimer (CRUD) les données.\n\n### Principe\n\nOn va ajouter des méthodes dans nos classes modèles correspondant aux actions du CRUD pour la table liée à ce modèle, ainsi on aura (les noms peuvent varier selon nos habitudes)\n\n- create: une méthode pour sauvegarder une nouvelle ligne dans la table de la base données contenant toutes les informations d'un objet créé à partir du modèle\n- read: une méthode pour trouver une ligne dans la bdd renvoyant un objet créé à partir du modèle\n- update: une méthode pour sauvergarder des modifications apportée à un objet créé à partir du modèle\n- delete: une méthode pour supprimer une ligne en bdd correspondant à un objet créé à partir du modèle\n\nIl est possible de rajouter d'autres méthodes selon nos besoin, par exemple on ajoute souvent\n\n- readAll: une méthode pour trouver toutes les lignes de la table correspondant au modèle\n- search : une méthode paramétrable pour faire un `SELECT` avec un `WHERE`\n- ...\n\n### Exemple\n\nVoici un modèle d'exemple active record qu'on va pouvoir discuter et dont on va pouvoir s'inspirer\n\n```js\nimport client from \"../database.js\";\n\nclass Teacher {\n  #id;\n  #name;\n  \n  constructor(config) {\n    this.id = config.id;\n    this.name = config.name;\n  }\n  \n  get id() {\n    return this.#id;\n  }\n  \n  get name() {\n    return this.#name;\n  }\n  \n  set id(value) {\n    if (typeof value !== 'number' && typeof value !== 'undefined') {\n      throw new Error('Id incorrect');\n    }\n    this.#id = value;\n  }\n  \n  set name(value) {\n    if (typeof value !== 'string') {\n      throw new Error('Nom incorrect');\n    }\n    this.#name = value;\n  }\n\n  async create() {\n    const text = `\n      INSERT INTO teacher (name)\n      VALUES ($1)\n      RETURNING id;\n    `; // RETURNING permet de récupérer des informations de la ligne insérée, ici l'id\n    const values = [this.name];\n    const result = await client.query(text, values);\n    // on modifie l'instance pour qu'elle possède son id\n    this.#id = result.rows[0].id; \n  }\n\n  static async read(id) {\n    const text = `\n      SELECT * FROM teacher\n      WHERE id = $1;\n    `;\n    const values = [id];\n    const result = await client.query(text, values);\n    if (result.rowCount > 0) {\n      return new Teacher(result.rows[0]); // on retourne une nouvelle instance\n    }\n    else {\n      throw new Error('Teacher non trouvé');\n    }\n  }\n\n  async update() {\n    const text = `\n      UPDATE teacher \n      SET name = $1\n      WHERE id = $2;\n    `;\n    const values = [this.name, this.id];\n    await client.query(text, values);\n  }\n\n  async delete() {\n    const text = `\n      DELETE FROM teacher \n      WHERE id = $1;\n    `;\n    const values = [this.id];\n    await client.query(text, values);\n  }\n}\n\nexport default Teacher;\n\n```\n\n## Méthode statique et non-statique\n\nOn peut noter que la méthode `create` par exemple fait réference à `this`, cela signifie qu'avant de l'appeler il faudra construire une instance avec `new`\n\nExemple dans un controller\n\n```js\n// on crée un objet\nconst dwaTeacher = new Teacher({ name: 'Alexis' });\n// on crée la ligne en bdd pour la faire persister\nawait dwaTeacher.create();\n```\n\nD'autres méthodes sont marquées comme statiques avec `static`, car elles n'ont pas besoin de `this`, cela signifie qu'on peut les appeler sans avoir à construire un objet au préallable\n\n```js\n// on trouve un objet user par son id, pas d'appel à new pour utiliser une méthode statique\nconst searchedTeacher = await Teacher.read(2);\n```\n\nOn peut manipuler aisément nos données une fois le modèle en place\n\n```js\n// on trouve le deuxième prof\nconst searchedTeacher = await Teacher.read(2);\n\n// on modifie ses propriété\nsearchedTeacher.name = 'Marion';\n// on appelle la méthode correspondante pour la persistance en bdd\nawait searchedTeacher.update(
2640);\n\n// pour supprimer ce serait pareil\nawait searchedTeacher.delete();\n```\n\nAinsi les méthodes non statiques (classiques) s'executent sur une instance, tandis que les méthodes statiques sur la classe.\n\n\n","tags":"","title":"$:/code/js/pg/active_record","modified":"20240826114258306","type":"text/markdown"},
2641{"created":"20240926065023175","text":"__Pug__\nanciennement connu sous le nom de Jade, est un moteur de template pour Node.js et les navigateurs. Il permet de générer du HTML de manière plus concise et lisible grâce à une syntaxe simplifiée et indentée.\n\n1. **Syntaxe simplifiée** : Au lieu d’utiliser des balises HTML traditionnelles, Pug utilise une indentation pour représenter la hiérarchie des éléments.\n1. **Interpolation** : Pug permet d’insérer facilement des variables et des expressions JavaScript directement dans le template.\n1. **Réutilisation des composants** : Vous pouvez créer des mixins et des blocs réutilisables pour éviter la répétition de code.\n\n```js\ndoctype html\nhtml\n  head\n    title= title\n  body\n    h1 Hello, #{name}!\n    p Welcome to Pug.\n```\n\nCaractéristiques :\n\n* Syntaxe simplifiée : Au lieu d’utiliser des balises HTML traditionnelles, Pug utilise une indentation pour représenter la hiérarchie des éléments.\n* Interpolation : Pug permet d’insérer facilement des variables et des expressions JavaScript directement dans le template.\n* Réutilisation des composants : Vous pouvez créer des mixins et des blocs réutilisables pour éviter la répétition de code.\n* Compatibilité avec Node.js : Pug s’intègre parfaitement avec les applications Node.js, facilitant le rendu côté serveur.\n\n**Syntaxe de base**\n* Indentation : La structure de Pug repose sur l’indentation, ce qui rend le code plus lisible et évite les erreurs de balises non fermées.\n\n```pug\nhtml\n  head\n    title Titre de la page\n  body\n    h1 Titre principal\n    p Ceci est un paragraphe.\n```\n\n* Classes et IDs : Les classes et IDs sont définis de manière similaire aux sélecteurs CSS.\n\n```pug\ndiv#mon-id.ma-classe\n```\n\nUne div avec un ID et une classe\n\n* Attributs : Les attributs sont placés entre parenthèses après le nom de la balise.\n  \n```pug\n\na(href=\"https://example.com\" target=\"_blank\") \n\n```\n   Lien vers Example\n\n* Interpolation : Les variables peuvent être interpolées directement dans le texte.\n\n```pug\n- var nom = \"Timothy\"\np Bonjour, #{nom}!\n\n```\n\n* Boucles et conditions : Pug supporte les structures de contrôle comme les boucles et les conditions.\n\n```pug\nul\n  each item in ['Pomme', 'Banane', 'Cerise']\n    li= item\n\nif utilisateur\n  p Bonjour, #{utilisateur.nom}!\nelse\n  p Bonjour, invité!\n```\n\n* Mixins : Les mixins permettent de réutiliser des blocs de code.\n\n```\nmixin bouton(text, lien)\n  a(href=lien) #{text}\n\n+bouton('Cliquez ici', 'https://example.com')\n\n```\n\n* Pour aller plus loin :\n[[https://pugjs.org/api/getting-started.html]]\n\n\n[[https://github.com/pugjs/babel-plugin-transform-react-pug]]\n\n\n[[https://medium.com/@alicialebreton44/une-pr%C3%A9sentation-g%C3%A9n%C3%A9rale-de-pug-21b4c5b05b70]]\n\n[[https://github.com/Alchemist501/Pug-Playground]]\n","tags":"","title":"$:/code/js/pug","modified":"20241015091932497","type":"text/markdown"},
2642{"created":"20240926072451519","text":"[[https://storybook.js.org/]]\n\ninstallation\n\n```\n\n```\n\n```\nnpm install @storybook/react pug pug-loader --save-dev\n```\n\nConfiguration de Webpack : Ajoutez une configuration Webpack personnalisée pour gérer les fichiers Pug. Créez ou modifiez le fichier main.js dans le répertoire .storybook :\n\n```js\nmodule.exports = {\n  stories: ['../src/**/*.stories.@(js|jsx|ts|tsx|mdx)'],\n  addons: ['@storybook/addon-links', '@storybook/addon-essentials'],\n  webpackFinal: async (config) => {\n    config.module.rules.push({\n      test: /\\.pug$/,\n      use: ['pug-loader'],\n    });\n    return config;\n  },\n};\n```\n\nCréation de composants Pug : Vous pouvez maintenant créer des composants en utilisant Pug. Par exemple, créez un fichier MyComponent.pug :\n\n```\ndiv\n  h1 #{title}\n  p #{content}\n\n```\n\nCréation d’histoires pour Storybook : Créez des histoires pour vos composants Pug dans un fichier .stories.js :\n\n```js\n\nimport React from 'react';\nimport MyComponent from './MyComponent.pug';
2642\n\nexport default {\n  title: 'Example/MyComponent',\n  component: MyComponent,\n};\n\nconst Template = (args) => \u003CMyComponent {...args} />;\n\nexport const Primary = Template.bind({});\nPrimary.args = {\n  title: 'Hello, Storybook!',\n  content: 'This is a Pug component in Storybook.',\n};\n\n```","tags":"","title":"$:/code/js/pug/storyBook","modified":"20240926104600176"},
2643{"created":"20240912115337731","text":"\n\n## Arborescence type d’un projet \n\n L’arborescence de base  pourra ressembler à :\n\n```\nmy-app/\n|-- dist/\n|    └-- // Fichiers pour la production (distribution), \n|           sera rempli par Parcel\n|           c'est ce qu'on consultera dans le navigateur\n|-- src/\n|    └-- // Fichiers sources pour le développement, \n|           c'est ici qu'on va travailler\n|    └--index.html\n|    └--index.js\n|    └--components/\n|-- node_modules/\n|    └-- // C'est ici que npm/yarn va télécharger nos dépendances\n|-- .gitignore        // pour ne pas indexer node_modules entre autres\n|-- package.json      // carte d'identité du projet, liste des dépendances\n└-- yarn.lock         // contient les versions des dépendances yarn\n```\n\n## JSX\n\n>
2643 Lorsque l’on crée des éléments avec React, on utilise du JSX pour définir nos vues.\nIl s’agit d’un *sucre syntaxique* permettant de décrire la création de nos éléments\nplus facilement.\n\n  VSCode intègre également nativement des fonctionnalités IntelliSense pour JSX.\n\n## Creation d'une app React (premiers pas)\n\n* Installation :\n  * `yarn init`\n  * `yarn add --dev parcel`\n  * `yarn add react react-dom`\n\n* Création d'un dossier `src`: On travaille dans le dossier src qui va contenir tout notre code React.\n* Création d'un fichier `index.html` à la racine du dossier src.  Il doit contenir:\n  - Le doctype avec son header\n  - Une div dans le body avec un id\n  - Avant la fermeture du body, l'appel du fichier de script principal, `index.js`\n\n\t\u003Cdetails>\n\t\t\u003Csummary> Structure de base pour un fichier react (emmet)\n\t\u003C/summary> \n\t\t\n\t\t```\thtml:5>div[id=\"app\"]+script[type=\"module\"][src=\"./index.js\"]\n\t\t```\n\t\u003C/details>\n\u003Cbr>\n\t\n* Creation d'un fichier `index.js` à la racine de src. C'est le point principal autour duquel toutes les pages vont s'articuler\n\n```js\n// On importe la fonction createRoot de react-dom/client pour pouvoir l'utiliser\nimport { createRoot } from \"react-dom/client\";\n```\n* Création d'élément (exemple): \n\n```js\nimport { createRoot } from \"react-dom/client\";\nimport { createElement } from \"react\";\n\nconst container = document.getElementById(\"app\")\nconst root = createRoot(container);\nconst reactElement = createElement(\"h1\",\n    null,\n    \"Une poule, c'est cool !\" ) ;\n\nroot.render(reactElement);\n    \n```\n\nOn lance le serveur avec la commande `yarn parcel src/index.html`\n\n* creation d'elements avec jsx\n\n```js\nimport { createRoot } from \"react-dom/client\";\nimport { createElement } from \"react\";\nimport picture from './img/poules.jpg';\n\nconst container = document.getElementById(\"app\")\nconst root = createRoot(container);\n\nconst alt = \"3 belles poules sur le bord d'un poualiller\"\n\nconst pageContent = \n\u003C>\n\u003Ch1>Une poule, c'est cool ! \u003C/h1>\n\u003Cp>Qu'il soit question de la poule pondeuse, de la poule d'ornement ou de la poule couveuse, tout vous mènera à conclure que les poules, c'est cool\u003C/p>\n\u003Cimg src={picture} alt={alt} />\n\u003Cul>\n    \u003Cli>Tout doux\u003C/li>\n    \u003Cli>Cou gyroscopique\u003C/li>\n    \u003Cli>Fait cotcot\u003C/li>\n    \u003Cli>Fait COTCOT en cas d'intrusion\u003C/li>\n    \u003Cli>Mange de tout\u003C/li>\n    \u003Cli>Fait un super engrais\u003C/li>\n    \u003Cli>Chasse les tiques et les puces\u003C/li>\n\u003C/ul>\n\n\u003C/>\n\nroot.render(pageContent);\n\n```\n   \n### Créer un élément\n\n\u003Cu> _Avec createElement_ \u003C/u>\n\nReact met à disposition une fonction createElement. Celle-ci permet de créer des éléments un peu comme avec append mais de manière simplifiée.\n\nPour utiliser createElement, il faut l'importer:\n\n```js\nimport { createElement } from \"react\";\n```\n\n`createElement()` utilise 3 paramètres (ou plus) :\n\n  - **Type**: Doit être rempli avec un type de balise html en chaîne de caractères, par exemple `'a'`, `'h1'`, `'p'`, `'span'`... (ou avec un composant, mais ça, c'est pour le prochain cours !)\n  - **Props**: On en parle au prochain cours, pour l'instant on va se contenter de mettre ce paramètre à `null`\n  - **Enfants**: Représente ce qui se trouve à l'intérieur de la balise (il peut y avoir autant d'enfants qu'on veut en paramètres de la fonction createElement. React les récupère avec un spread operator `...children`)\n\n\nLes **Enfants** peuvent être de type:\n\n  - Noeud React,\n  - Élément react, \n  - String,\n  - Nombre,\n  - Vide (null, undefined, true, false),\n  - Tableau de noeuds React.\n\nExemple d'utilisation de `createElement`:\n\n```js\n// On crée une balise h1 (premier paramètre), qui va contenir le texte \"Titre d'exemple\" (troisième paramètre)\nconst titrePage = createElement(`h1`, null, `Titre d'exemple`);\n\n// Exemple avec utilisation de variable\nconst titrePage = `Titre d'exemple`;\nconst titre = createElement(`h1`, null, titrePage);\n```\n\nExemple d'éléments imbriqués:\n\n```js\n// On crée une div qui contient un titre et un paragraphe\n// Facile à lire non ?\nconst pageComplete = createElement(`div`, null, createElement(`h1`, null, `Titre d'exemple`), createElement(`p`, null, `Paragraphe d'exemple`));\n```\n\n\nSi on indente nos paramètres, on y voit tout de suite un peu plus clair (lis bien les commentaires):\n\n```js\nconst pageComplete = createElement(\n    // Notre élément conteneur est une div\n    `div`, \n    null, \n    // Notre div contient un h1\n    createElement(\n        `h1`, \n        null, \n        // Ce h1 contient une chaîne de caractères\n        `Titre d'exemple`\n    ), \n    // Notre div contient également un paragraphe\n    createElement(\n        `p`,\n        null,\n        // Ce paragraphe contient une chaîne de caractères\n        `Paragraphe d'exemple`\n    )\n);\n```\n\n\u003Cu> _Avec JSX_ \u003C/u>\n\nL’idée de JSX, c’est de concilier le meilleur des deux mondes :\n- Les `createElement` c'est pratique, mais ça reste long à écrire.\n- Avec JSX, on code du JS, donc on continue à créer/manipuler des objets, mais on utilise la syntaxe HTML !\n- Parcel s'occupera de transpiler le code JSX en le traduisant en un `createElement()` du module **react**.\n\nConcrètement, la syntaxe JSX est transpilée en JS version ES5 :\n\n```javascript\n// Un fichier .js contient ce code JSX :\n\u003Ca id=\"home\" href=\"https://oclock.io\">Accueil\u003C/a>\n```\n```javascript\n// Parcel va transpiler ce code JSX en JS version ES5 :\ncreateElement('a', {id: 'home', href: 'https://oclock.io'}, 'Accueil'); \n```\n\n⚠️ Le JSX, ça ressemble à du HTML, mais ça reste du JavaScript !\n\n- Attention au nom des « attributs », ils correspondent aux propriétés JS des éléments du DOM. Par exemple : `\u003Cdiv className=\"ma-classe\">\u003C/div>` => en JS, on a la propriété `className` pour définir la valeur de l’attribut HTML class.\n- Les propriétés d’évènement (ex. `\u003Cbutton onClick={func} />`) … une mauvaise pratique en HTML, mais on fait bien du JS ! Donc bonne pratique en JSX.\n\nNota bene : en JSX, il ne doit pas contenir d'éléments se succédant sans élément parent.\n\nainsi, le code suivant ne va pas fonctionner :\n\n```js\nconst pageContent = \n    \u003Ch1>Titre d'exemple\u003C/h1>\n    \u003Cp>Paragraphe d'exemple\u003C/p>\n;\n\n```\n\nIl faut opter pour :\n\n```js\nconst pageContent = \n    // On a un élément parent qui encadre les deux enfants, c'est ok !\n    \u003Cdiv>\n        \u003Ch1>Titre d'exemple\u003C/h1>\n        \u003Cp>Paragraphe d'exemple\u003C/p>\n    \u003C/div>\n;\n```\nPour ajouter des fragments sans parent, en JSX, on utilise  une balise spécialement pour ça: `\u003C>\u003C/>`. Elle porte le nom de Fragment et est un élément React qui permet de regrouper les éléments.\n\n```js\nconst pageContent = \n    // Même exemple avec un fragment:\n    \u003C>\n        \u003Ch1>Titre d'exemple\u003C/h1>\n        \u003Cp>Paragraphe d'exemple\u003C/p>\n    \u003C/>\n;\n\n```\n\n### Utilisation des images \n\nPour utiliser une image avec du JSX, il faut tout d'abord l'importer.\n\n```js\nimport picture from './picture.png';\n```\n\nNotre import sert à récupérer une variable qui contient le lien vers le fichier (au format str
2643ing) qui est positionné dans `dist` après le build de Parcel.\n\n#### En résumé\n\nPour créer un élément React avec JSX, par exemple un objet modélisant un lien, on peut taper le code suivant :\n\n```javascript\nconst link = \u003Ca href=\"https://oclock.io\">Accueil\u003C/a>;\n```\n*👓 On voit aussi qu'avec JSX, il n'y a pas de `\"` ni de `'` pour encadrer la définition de l'objet, car ce n'est pas une chaine de caractère !*\n\nQuand on parle d’élément React, on désigne bien un objet JS, lequel peut être généré avec `React.createElement`. La syntaxe JSX est totalement optionnelle.\n\nParcel transpile le JSX en une version ES5 rétro-compatible avec tous les navigateurs :\n```javascript\n// la version transpilée du JSX ci-dessus :\nvar link = React.createElement('a', { href: 'https://oclock.io' }, 'Accueil');\n```\n\n### Utiliser des variables avec JSX\n\nOn peut tout à fait utiliser des variables dans du JSX. Pour ce faire, il faut l'entourer de `{}`.\n\n```js\nconst sample = `Un texte d'exemple`;\n\nconst pageContent = \n    \u003C>\n        \u003Ch1>Mon titre\u003C/h1>\n        \u003Cp>{sample}\u003C/p>\n    \u003C/>\n;\n```\n\n:warning: Attention! On encadre jamais nos variables avec des `\"` ou des `'` dans du JSX, sinon elles seront considérées comme des chaînes de caractères.\n\n```js\nconst url = \"https://oclock.io/\";\n\n// Le render transformera la \nconst jsx = \u003Ca href={url}>Notre site\u003C/a>;\n\n```\n\n## React, React-DOM & Render\n\n\nGrace à React on décrit des éléments React, des objets représentants des morceaux d’UI. Si on veut les voir dans le DOM réel il faut utiliser une autre bibliothèque : React-DOM\n\nOn dit que React-DOM va réconcilier notre arbre d’éléments React (aussi appelé DOM virtuel) avec le DOM Réel (quelques explications sur [la doc de React](https://fr.reactjs.org/docs/faq-internals.html)).\n\nAinsi on pourra se contenter de décrire notre interface telle qu’elle devrait être via React. React-DOM se débrouillera pour faire en sorte que le DOM réel corresponde à ce qu’on décrit.\n\nOn va executer la méthode `render` qui permet de faire le rendu initial, on passe à render en argument notre élément React racine, une instance de l'élément racine qui contient tout notre arbre d'éléments enfants. (En fait, on parlera plutôt de composants, mais on voit ça au prochain cours, chaque chose en son temps).\n\nAinsi on appelle render une seule fois, on verra en plus que la mise à jour du rendu par React-DOM lors des interactions se fait automatiquement si on utilise correctement les outils fournis par React, donc finalement on appellera render 1 seule fois par projet.\n\n```javascript\nimport { createRoot } from 'react-dom/client';\n\n// container est l'élément qui va contenir l'ensemble de l'app, il récupère une div avec un id donné\nconst container = document.getElementById(\"app\");\n\n// root est l'élément racine créé à partir de la cible du rendu dans le DOM\nconst root = createRoot(container);\n\n// On crée l'élément à afficher\nconst reactElement = \u003Ch1>Mon titre\u003C/h1>;\n\n// On appelle render sur le container et lui donne en paramètre le composant dont on veut faire le rendu\nroot.render(reactElement);\n```\n\n---\n\nInstallation de react dans le navigateur : [[https://gist.githubusercontent.com/gaearon/0275b1e1518599bbeafcde4722e79ed1/raw/db72dcbf3384ee1708c4a07d3be79860db04bff0/example.html]]\n","tags":"$:/doc/react","title":"$:/code/js/react","modified":"20241027100608007","type":"text/markdown"},
2644{"created":"20240925195535178","text":"\nL'accessibilité n'est pas incompatible avec le développement moderne d'applications web via des frameworks tels que React.\n\n## Les bonnes pratiques avec react\n\n\n### Changement dynamique du titre de la page\n\n- Utilisation de `document.title`\n  - Exemple de mise à jour du titre de la page avec `document.title` dans un composant React.\n- Utilisation de React Helmet\n  - Installation et configuration de React Helmet.\n  - Exemple pratique : Mise à jour dynamique du titre de la page en fonction du contenu affiché.\n\n### Focus management\n\n- Utilisation de la méthode `focus()`\n  - Focus en haut de page au chargement\n    - Exemple de code pour déplacer le focus en haut de la page lors du chargement.\n  - Déplacement du focus sur un élément spécifique\n    - Créer un bouton qui, lorsqu'il est cliqué, déplace le focus sur un élément spécifique de la page.\n  - Bouton \"Retour en haut de page\"\n    - Implémentation d'un bouton qui permet de revenir en haut de la page et de gérer le focus pour améliorer la navigation.\n\n### Navigation au clavier\n\n- Introduction à la navigation au clavier\n  - Importance de la navigation au clavier pour l'accessibilité.\n  - Utiliser des attributs tels que `tabindex`.\n- Implémentation de la navigation au clavier\n  - Exemple de code pour permettre la navigation au clavier dans une application React.\n  - Zones de navigation (skip links)\n    - Création de liens de saut pour accéder rapidement aux sections principales de la page.\n\n### Gestion des rôles et des attributs ARIA\n\n- Implémentation des rôles ARIA dans les composants React\n  - Introduction aux rôles ARIA courants et à leur utilisation dans React.\n- Utilisation des attributs ARIA pour améliorer l'accessibilité\n  - `aria-label` : Fournir des descriptions supplémentaires pour les lecteurs d'écran.\n  - `aria-labelledby` : Relier des éléments à des étiquettes.\n  - `aria-hidden` : Masquer des éléments des lecteurs d'écran.\n  - Exemple de code pour intégrer ces attributs dans les composants React.\n\n\n## Un exemple pour illustrer\n\n```js\n\n\nimport { useEffect, useRef, useState } from 'react';\nimport './style.scss';\n\nconst App = () =>  {\n\n    useEffect(() =>
2644 {\n        // Pour chaque page de mon site, je peux venir changer le titre de cette façon\n        document.title = \"Projet pokémons\"\n        // Exemple de code pour déplacer le focus en haut de la page lors du chargement.\n        //document.body.focus()\n\n        // Les effets de scroll\n        //document.body.onscroll()\n        // setTimeOut(), setInterval() sont à déclarer lors du chargement (donc ici)\n    }, [])\n\n    // Créer un bouton qui, lorsqu'il est cliqué, déplace le focus sur un élément spécifique de la page.\n\n    // je veux stocker le footer dans une variable\n    // const footerElement = document.querySelector('footer')\n\n    const footerRef = useRef()\n\n    const handleClick = (e) => {\n        console.log(\"Click sur le bouton\")\n        // footerRef.current.focus() OU scrollIntoView()\n        footerRef.current.scrollIntoView({ behavior: \"smooth\" });\n    }\n\n    return (    \n        \u003C>\n            \u003Ca class=\"skip-section\" href=\"#content\">Aller au contenu\u003C/a>\n\n            {/* tabIndex à la valeur -1 me permet de rajouter le focus en respectant le flux naturel des éléments dans la page */}\n            \u003Cdiv tabIndex={-1}>\u003C/div>\n            \u003Cheader tabIndex={-1}>\n                \u003Ch1>Bienvenue les gens !\u003C/h1>\n                \u003Cbutton\n                    onClick={(e) => handleClick(e)}\n                >Aller au footer\u003C/button>\n            \u003C/header>\n            \u003Cmain tabIndex={-1} id=\"content\">\n                \u003Cp>Du contenu sur la page\u003C/p>\n                \u003Cp>Du contenu sur la page\u003C/p>\n                \u003Cp>Du contenu sur la page\u003C/p>\n                \u003Cp>Du contenu sur la page\u003C/p>\n            \u003C/main>\n            \u003Cfooter ref={footerRef}>\n\n                \u003Cp>Copyright 2024 - fait par la promo Licorne\u003C/p>\n            \u003C/footer>\n        \u003C/>\n    );\n}\n\n\nexport default App;\n\n```\n\n```css\n\n.skip-section:not(:focus) {\n    display: block;\n    position: absolute !important;\n    clip: rect(1px, 1px, 1px, 1px);\n    width: 1px;\n    height: 1px;\n    margin: -1px;\n    border: 0;\n    padding: 0;\n    overflow: hidden;\n    -webkit-user-select: none;\n    -moz-user-select: none;\n    user-select: none;\n}\n```\n","tags":"$:/doc/react $:/accessibilité","title":"$:/code/js/react/A11y","modified":"20240926104839395","type":"text/markdown"},
2645{"created":"20240913070728358","text":"__Les composants web__ (Web Components) sont un ensemble de technologies permettant de créer des éléments personnalisés réutilisables avec des fonctionnalités encapsulées\n\nLes composants dans React peuvent être décrits en utilisant des fonctions ou des classes.\n\nLes composants créés en utilisant des classes sont appelés des composants de classe. Ils ont accès à des fonctionnalités supplémentaires telles que l'état local et les cycles de vie.\n\n__Les composants react__ : \n- Les composants sont des morceaux de code réutilisables et paramétrables.\n- Un composant doit être composé d'une fonction exportée qui retourne du JSX\n- On doit importer les composants que l'on souhaite utiliser dans les composants qui l'utilisent\n- C'est un composant racine que notre render va appeler\n- Les props permettent de configurer nos composants avec des paramètres\n- Tout ce qui est transmis en prop dans du JSX arrive regroupé dans un objet dont le nom de chaque propriété représente une prop définie dans le JSX du composant\n- Comme avec les props on reçoit un objet, on peut le destructurer pour récupérer la ou les props qui nous intéressent\n- Les Prop-types permettent de s'assurer du type reçu en prop par un composant\n- La props children peut être utilisée pour parametrer le contenu d'un composant\n\n**Les props** (abréviation de \"properties\") sont un mécanisme fondamental de React permettant de transmettre des données d'un composant parent à ses composants enfants\n\n```js\nimport { createRoot } from 'react-dom/client';\n\n// un composant est une fonction qui commence par une majuscule par convention\nfunction Header() {\n  // qui retourne un element React (React.createElement()) écrit ici en JSX\n  return (\n    \u003Cheader>\n      \u003Ch1>Coucou\u003C/h1>\n    \u003C/header>\n  );\n}\n\nfunction Content() {\n  return (\n    \u003Cmain>\n      \u003Cp>Hello world\u003C/p>\n    \u003C/main>\n  );\n}\n\nfunction Root() {\n  return (\n    \u003Cdiv>\n      \u003CHeader />\n      \u003CContent />\n    \u003C/div>\n  );\n);\n\nconst rootElement = \u003CRoot />;\n\nconst rootContainer = createRoot(document.getElementById('root'));\nrootContainer.render(rootElement);\n\n\n```\n\nSur le web on parle parfois de RFC pour les composants.\n\nLes bonnes habitudes:\n* nommer le fichier avec la première lettre en majuscule (App.jsx)\n* renommer les fichiers en .jsx (App.jsx)\n* Nommer le nom de l afonctin du même nom que le fichier App.jsx => export default function App\n* \nRmq : Les composants vont prendre quasiment l'apparence d'une balise quand il faudra les appeler dans le render.  `\u003CApp />`\n\nPlutôt que de tout écrire dans un seul fichier qui deviendrait énorme, on va écrire dans plusieurs petits fichiers.\nOn va exporter d’un coté pour importer là où on se sert des composants.\n\nVoici un composant *Header* : \n```javascript\n// Header.js\nfunction Header() {\n  return (\n    \u003Cheader>\n      \u003Ch1>Coucou\u003C/h1>\n    \u003C/header>\n  );\n}\n\nexport default Header;\n```\n\nAilleurs dans un autre composant, on importe le composant *Header* \n\n```javascript\n// App.js\nimport Header from './chemin/vers/Header';\n\nfunction App() {\n  return (\n    \u003Cdiv>\n      \u003CHeader />\n      \u003Cp>Hello world\u003C/p>\n    \u003C/div>\n  );\n}\n\nexport default App;\n```\n\nCela donne l'organisation suivante :\n\n```\nsrc/\n- index.html         // contient une div vide pour recevoir l'appli react\n- index.js           // fait le render avec ReactDOM de l'élement React racine qui contient tous les autres\n- index.scss         // nos styles génériques\n- components/\n    - App/\n       - index.js    // contient une fonction qui retourne l'élement décrivant l'application\n       - style.scss  // contient les styles spécifique à l'élement décrivant l'application\n    - Recipe/\n       - index.js    // contient une fonction qui retourne l'élement décrivant une recette\n       - style.scss  // contient les styles spécifique à l'élement décrivant une recette\n    - Button/\n       - index.js    // contient une fonction qui retourne l'élement décrivant un bouton\n       - style.scss  // contient les styles spécifique à l'élement décrivant un bouton\n   ...\n```\nPour aller plus loin : \n* Shadcn UI est un framework open source qui propose des composantd préconstruits, accessibles et customisables [[https://ui.shadcn.com/]]\n* chakra-ui propose des composants pour react : [[https://v2.chakra-ui.com/]]\n\n## Les props\n\nLes composants peuvent être configurés via des **props**.\n\nnos composants étant des fonctions, on peut gérer un paramètre pour rendre paramétrable cette fonction, on l'appelle _props_ dans l'univers React .\n\n\n```js\n// Title.js\n//  sans destructuring\nfunction ListItem(props) {\n return (\n    \u003Cli>\n      {props.title}\n      \u003Cspan>{props.quantity}\u003C/span>\n    \u003C/li>\n   );\n }\n```\n\nAvec **destructuring**, c'est la même chose : \n```javascript\n// on reçoit toujours 1 objet en paramètre mais on décompose les propriétés qui nous intéressent\nfunction ListItem({ title, quantity }) {\n  return (\n    \u003Cli>\n      {title}\n      \u003Cspan>{quantity}\u003C/span>\n    \u003C/li>\n  );\n}\n\nexport default ListItem;\n```\n\nComme on peut écrire des expressions interprétées entre `{}` dans du jsx, il devient très pratique de paramétrer l'élément retourné en fonction des props.\nOn passera la valeur des props à l’utilisation du composant.\n\nDans cet exemple, on déclare le composant *List* qui contiendra des composants *ListItem*. le composant *List* passe des valeurs aux différents composants *ListItem* via les **props** : \n\n```javascript\n// List.js\nimport ListItem from './chemin/vers/ListItem';\n\n// on passe les props comme on noterait des attributs, des paires clés/valeurs\n// on note entre \" pour des String, entre {} pour ouvrir une expression pour d'autres types\nfunction List() {\n  return (\n    \u003Cul>\n      \u003CListItem title=\"Pommes\" quantity={3} />\n      \u003CListItem title=\"Poires\" quantity={2} />\n      \u003CListItem title=\"Citrons\" quantity={5} />\n    \u003C/ul>\n  );\n}\n\nexport default List;\n```\n\n\n_A noter_ : il est possible de valider les types des props attendues (string, number, boolean, ...) avec la bibliothèque [prop-types](https://www.npmjs.com/package/prop-types) ou avec [typescript](https://www.t
2645ypescriptlang.org/).\n\n## La props children\n\nIl y a une props spéciale avec React qu'on appelle `children`. En JSX, elle représente le troisième paramètre de la fonction `createElement` vue lors de [l'épisode précédent](./e04.md#cr%C3%A9er-un-%C3%A9l%C3%A9ment).\n\n### Quand l'utiliser ?\n\nLa prop `children` est utile lorsqu'on souhaite créer des composants réutilisables qui peuvent contenir un contenu variable ou des éléments React arbitraires à l'intérieur. Elle permet également de créer des composants de mise en page flexibles qui acceptent divers éléments en tant qu'enfants tout en maintenant une structure de code propre et modulaire.\n\n### Comment l'utiliser ?\n\nElle peut se définir comme n'importe quelle props : \n\n```jsx\nfunction Header({ title, children }) {\n  return (\n    \u003Cheader>\n      \u003Ch1>{title}\u003C/h1>\n      {children}\n    \u003C/header>\n  );\n}\n```\n\nOn peut la passer ensuite comme n'importe quelle props\n\n```jsx\nfunction App() {\n  return (\n    \u003Cdiv>\n      \u003CHeader title=\"Hello world\" children={\u003Cp>How ara you ?\u003C/p>}\n    \u003C/div>\n  )\n}\n```\n\nMais on peut aussi la passer en contenu d'une balise englobante, cela revient exactement au même\n\n```jsx\nfunction App() {\n  return (\n    \u003Cdiv>\n      \u003CHeader title=\"Hello world\">\n        \u003Cp>How ara you ?\u003C/p>\n      \u003C/Header>\n    \u003C/div>\n  )\n}\n```\n➡️ Autre exemple : [react.dev/learn Passing JSX as children](https://react.dev/learn/passing-props-to-a-component#passing-jsx-as-children)\n\n### Controle des types des props \n\n\n\u003Cdetails>\n\t\u003Csummary> Il faut installer la librairie `prop-types` dans le projet.\n\u003C/summary>\n\t\n- Avec yarn\n\n```\nyarn add prop-types\n```\n\n- Avec npm\n```\nnpm install --save prop-types\n```\n\u003C/details>\n\nOn importe la libraire `prop-types` dans le composant à controler :\n\n```js\nimport PropTypes from 'prop-types';\n```\n\n* [[Documentation npm|https://www.npmjs.com/package/prop-types]]","tags":"$:/doc/react","title":"$:/code/js/react/components","modified":"20241002074539493","type":"text/markdown"},
2646{"created":"20240924104308266","text":"\n```js\nexport default function PokemonCard({ pokemon }) {\n    return (\n        \u003Carticle className=\"card\">\n            \u003Cdiv>\n                \u003Cdiv className=\"header\">\n                    \u003Cp className=\"header_name\">{pokemon.name}\u003C/p>\n                    \u003Cp className=\"header_pv\">{pokemon.pv} PV\u003C/p>\n                \u003C/div>\n                \u003Cimg src={pokemon.picture_url} />\n                \u003Cp className=\"info_desc\">{pokemon.desc}\u003C/p>\n            \u003C/div>\n        \u003C/article>\n    )\n}\n```\n","tags":"","title":"$:/code/js/react/components/exemples","modified":"20240924160314123"},
2647{"created":"20240918115846204","text":"**JSX** : une syntaxe pour créer des éléments React\n\n* On passe une base de données tasksData et on créé autant de composant task qu'il y a d'occurence dans la base .\n\nAtention, on utilise des paraenthèse et pas des accolades pour la fonction map.\n\n```js\nimport React from 'react';\nimport PropTypes from 'prop-types';\n\nimport Task from './Task';\n\n\nimport tasksData from '/src/data/tasks';\nconsole.table(tasksData);\n\nimport './index.scss';\n\nconst Tasks = (taskData = {tasksData}) => {\n  return (\n    \u003Cul className=\"tasks\">\n    {tasksData.map((task) => (\n        \u003CTask \n          id={task.id}\n          label={task.label}\n          done={task.done}\n        />\n      ))}\n    \u003C/ul>\n  );\n}\n\nexport default Tasks;\n```\n\n\n\n* Gestion d'une classe CSS condtionnelle avec une conditiono ternaire et d'un input de type checkbox \n\n```js\n\nimport data from \"../../data/tasks.js\";\nimport { useState } from \"react\";\n\n// console.table(data);\n// const listTasks = data;\n\nexport default function Tasks() { \n    const [listTasks, setListTasks] = useState(data);\n    // console.table(data);\nreturn (\n\n    \u003Cul className=\"list\">\n       {listTasks.map((task) => (\n        \u003Cli>\n            \u003Clabel className={task.done ? \"list-item list-item--done\" : \"list-item\"}>\n                \u003Cinput type=\"checkbox\" checked={task.done}  /> \n                {task.label}\n            \u003C/label>\n        \u003C/li>\n       ))\n    }\n    \u003C/ul>\n)\n```\n```","tags":"$:/doc/react","title":"$:/code/js/react/components/JSX/exemple/map","modified":"20241002122522607","type":"text/markdown"},
2648{"created":"20240909071247750","text":"* Pour aller plus loin : [[Documentation sur le JSX|https://fr.legacy.reactjs.org/docs/introducing-jsx.html]]\n\n\n- On peut utiliser le résultat d'une expression dans du JSX\n- On peut utiliser `.map` pour transposer un tableau vers un tableau d'élements React \n- L'opérateur `&&` permet d'afficher conditionnellement un élément JSX\n- On peut insérer une image en l'important avec notre bundler\n- Les fragments permettent de retourner plusieurs éléments JSX sans avoir à les encapsuler dans un élément parent\n## Expressions dans le JSX\n\nEn JSX, il est possible d’utiliser des expressions JS entre accolades. Une expression est une unité de code qui sera évaluée pour donner une valeur.\n\n```jsx\nfunction DemoCompoent() {\n  const teacher = {\
2648n    firstName: 'Alexis',\n    lastName: 'O\\'Clock'\n  };\n  \n  const darkMode = true;\n  \n  return (\n    \u003Carticle className={darkMode ? 'dark' : 'light'}>        {/* on peut mettre le résultat d'une expression pour une props, ici on a utilisé une expression ternaire */}\n      \u003Ch2 style={{                                           \n        fontWeight: 'bold',\n        color: darkMode ? 'black' : 'white',\n      }}>                                                    {/* les styles inlines se notent dans un objet */}\n        Bonjour, {teacher.firstName} !                       {/* on accède ici à une propriété d'un objet */}\n      \u003C/h2>\n      \u003Cp>Vous avez tirer le nombre {Math.random()}\u003C/p>       {/* on prend ici la valeur de retour d'une fonction */}\n    \u003C/article>\n  );\n}\n```\n\n### `.map`\n\n\nLorsqu’on crée un élément React on peut lui passer en enfant un tableau\n \n\n ```javascript\n  return (\n    \u003Cul className=\"ingredients\">{['farine', 'sel']}\u003C/ul>\n  );\n}\n```\n\nOn peut aussi lui passer un tableau d’éléments\n\n```javascript\n  return (\n    \u003Cul className=\"ingredients\">\n      {[\u003Cli>Farine\u003C/li>, \u003Cli>Sel\u003C/li>]}\n    \u003C/ul>\n  );\n}\n```\n\nL’intérêt de ceci est qu’on peut se servir de `.map` pour construire un tableau d’éléments à partir d’un tableau de données\n\nOn peut même zapper la variable intermédiaire et raccourcir la syntaxe fléchée.\n\n```javascript\nfunction Ingredients({ listOfIngredients }) {\n  \u003Cul className=\"ingredients\"> \n    {\n      listOfIngredients.map((currentIngredient) => (\n        \u003Cli>{currentIngredient}\u003C/li>\n      ))\n    }\n  \u003C/ul>\n)\n```\n* Exemple complet :\n\n```js\nimport Ingredient from \"./Ingredient\"\n\nexport default function Demo2() {\n\n    // On a un tableau qui contient des valeurs\n    const ingredients = [\n        \"lait\",\n        \"farine\",\n        \"oeufs\",\n        \"sucre\",\n        \"beurre\"\n    ]\n\n    // Warning: Each child in a list should have a unique \"key\" prop.\n    // Pour les questions de rendu dans une App React, et notamment lorsque vous utilisez la fonction map(), il faut penser à rajouter la clé sur l'élément racine renvoyé dans le JSX du callback\n    // l'élement clé doit contenir une clé unique (ça peut être un id, une string, ce que vous voulez)\n\n    return \u003Cul>\n        {ingredients.map((ingredient) => (\n            // ici je remplace le => { return ... } par => ()\n            \u003CIngredient key={ingredient} ingredient={ingredient} />\n        ))}\n    \u003C/ul>\n\n}\n```\nChaque fois qu’on manipule un tableau d’éléments React il faut une prop key unique qui identifie chaque élément du tableau. \nCela permettra à React de continuer à faire des rendus performants.\n\nCe qui nous donne en version finale :\n\n```javascript\n// si listOfIngredients est du type : [{id: 32, name: sucre}, {id: 75, name: sel}]\nfunction Ingredients({ listOfIngredients }) {\n  \u003Cul className=\"ingredients\"> \n    {\n      listOfIngredients.map((currentIngredient) => (\n        \u003Cli key={currentIngredient.id}>{currentIngredient.name}\u003C/li>\n      ))\n    }\n  \u003C/ul>\n)\n```\n\n### Vues conditionnelles\n\n\nL’opérateur `&&` signifie « ET », dans les faits il est interprété ainsi :\n\n* Si ce qu’il y a à gauche de l’opérateur est vrai alors l’opération donne la valeur de droite\n* Si ce qu’il y a à gauche de l’opérateur est faux alors l’opération donne faux, sans même regarder ce qu’il y a à droite\n\n```javascript\n// ce qui donne\ntrue && true; // true\nfalse && true; // false\n\n// mais aussi\ntrue && 123; // 123\nfalse && 123; // false\n```\n\nOn peut exploiter ceci dans du JSX\n\n```javascript\nfunction Welcome({ age }) (\n  \u003Cmain className=\"content\">\n    {age > 18 && \u003CArticles />}\n    {age \u003C= 18 && \u003Cp>Accès interdit\u003C/p>}\n  \u003C/main>\n);\n```\n\n## Quelques précisions supplémentaires\n\n### Utilisation d'une image dans un composant avec notre bundler\n\nPour utiliser une image dans notre composant, il faut l'importer avec notre bundler\n\n```\n- src/\n  - components/\n    - Demo/\n      - index.js\n      - logo.png\n```\n\nDonnera\n\n```js\nimport logo from './logo.png';
2648\n\nfunction Demo() {\n  return (\n    \u003Cheader>\n      \u003Cimg src={logo} alt=\"\" />\n    \u003C/header>\n  );\n}\n```\n\n### Fragments React\n\nOn a dit qu'on ne pouvait pas avoir 2 élements React voisins sans un parent unique. Ce qui nous oblige parfois à ajouter une `div` qu'on ne désirerait pas.  \nOn peut alors préférer utiliser un fragment, il aura l'avantage de ne pas avoir de représentation dans le DOM réel.\n\n```javascript\nfunction Demo() {\n  return (\n    \u003C>\n      \u003Cp>One\u003C/p>\n      \u003Cp>Two\u003C/p>\n      \u003Cp>Three\u003C/p>\n    \u003C/>\n  );\n}\n```","tags":"$:/doc/react","title":"$:/code/js/react/components/JSX/expression","modified":"20240920085507161","type":"text/markdown"},
2649{"created":"20240916082536030","text":"\n```js\nimport PropTypes from 'prop-types';\n\nParagraph.PropTypes= {\n    titre: PropTypes.string.isRequired,\n    text: PropTypes.string.isRequired,\n  };\n/**\n * A function that returns a React component displaying a paragraph with a title and text.\n *\n * @function Paragraph\n * @param {Object} props - The properties passed to the component.\n * @param {string} props.titre - The title of the paragraph.\n * @param {string} props.text - The text content of the paragraph.\n * @returns {JSX.Element} - A React component with a title and text.\n */\nexport default function Paragraph({ titre , text}) {\n    return  \u003C>\n    \u003Ch2>{titre}\u003C/h2>\n    \u003Cp> {text}\n    \u003C/p>\n    \u003C/>\n}\n\n\n```\n","tags":"$:/doc/react","title":"$:/code/js/react/components/prop-types","modified":"20240917083951483"},
2650{"created":"20240917111541257","text":"```js\nexport default function App() {\n    const titlePage = \"GitHub API\";\n    console.log(titlePage);\n    \n    return (\n    \u003C>\n        \u003Ch1> {titlePage} \u003C/h1>\n        \u003CMain />\n    \u003C/>\n    )\n}\n```","tags":"$:/doc/react","title":"$:/code/js/react/exemple/src/components/App.js","modified":"20240920065943242"},
2651{"created":"20240917133947257","text":"","tags":"","title":"$:/code/js/react/exemple/src/components/main.js","modified":"20240917134128107"},
2652{"created":"20240917111254773","text":"```js\nimport { createRoot } from \"react-dom/client\";\n//import './styles/style.scss'; ou une autre feuille de style\nimport './styles/reset.css';\nimport './styles/style.css';\nimport App from \"./components/App\";\n\nconst container = document.getElementById(\"App\");\n\nconst root = createRoot(container);\n\nroot.render(\u003CApp />);\n\n```\n\n```html\n\u003C!DOCTYPE html>\n\u003Chtml lang=\"fr\">\n  \u003Chead>\n    \u003Cmeta charset=\"UTF-8\" />\n    \u003Cmeta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n    \u003Cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    \u003Clink rel=\"stylesheet\" href=\"./styles/reset.css\" />\n    \u003Clink rel=\"stylesheet\" href=\"./styles/style.css\" />\n\n    \u003Ctitle>Github API\u003C/title>\n  \u003C/head>\n  \u003Cbody>\n    \u003Cdiv id=\"App\" class=\"container\">\u003C/div>\n    \u003Cscript type=\"module\" src=\"./index.js\">\u003C/script>\n\u003C/body>\n\u003C/html>\n```","tags":"$:/doc/react","title":"$:/code/js/react/exemple/src/index.js","modified":"20240920070436829"},
2653{"created":"20240917091838926","text":"[[https://react.dev/reference/react/useEffect]]\n\nLa mémorisation d'effets après le rendu est gérée par le hook useEffect (pas par le state). Elle permet d'effectuer des actions après la réconciliation d'un élément avec le DOM réel\n\n- Le hook useEffect permet d’exécuter des effets de bord\n- On passe à `useEffect` un callback qui sera executé après les rendus du composants\n- Pour limiter l'effet au rendu initial, on passe un tableau vide en second argument\n- Pour limiter l'effet aux rendus où une dépendances a changé, on indique cette dépendance dans un tableau en second argument\n\n```javascript\nuseEffect(() => {}); // après tous les rendu\nuseEffect(() => {}, []); // uniquement au rendu initial\nuseEffect(() => {}, [toto, tata]); // après tous les rendu où toto et/ou tata a changé\n```\n\n- On peut faire de l'ajax en réaction à un événement dans un composant\n- On peut faire de l'ajax au rendu d'un composant via useEffet\n\n# Utiliser le hook d'effet et appliquer de l'AJAX au sein d'un projet React\n\nOn a décrit de supers interfaces intéractives avec React. On a pu créer des SPA: des applications où la page ne s'actualise pas dans le navigateur, on fait évoluer le DOM en réaction aux intéractions.\n\nPour décrire nos évolutions du DOM, on a adopté une approche déclarative. On décrit des élements React et des évolutions d'un state, finalement les mise à jour du DOM sont abstraites et gérées sous le capôt par React DOM lors des nouvelles phases de rendus.\n\nToutefois il peut arriver qu'on ait besoin de décrire des effets qui ne seront pas gérées par React et React DOM, c'est la qu'entre en jeu le hook d'effet\n\n# Hook useEffect\n\nAvant de se lancer, comme toujours la doc\n\n- [Nouvelle doc](https://react.dev/learn/synchronizing-with-effects) complète\n- [Ancienne doc](https://fr.legacy.reactjs.org/docs/hooks-effect.html) peut être plus accessible pour commencer\n- [API reference](https://react.dev/reference/react/useEffect)\n\nLe hook d'effets permet comme son nom l'indique de déclencher un effet après un rendu d'un composant\n\nIl s'agit d'une fonction nommé `useEffect` qui peut s'executer dans les fonctions composants comme tous les hooks.\n\nOn lui passe en argument une fonction callback qui sera executée après un rendu du composants pour décrire un effet externe à l'application gérée par React.\n\nExemple \n\n```javascript\nimport React, { useEffect } from 'react';\n\nfunction Demo({ title }) {\n  // ici l'effet sera executée après chaque rendu de ce composant pour aller réécrire le title du document (utilisé dans l'onglet du navigateur par exemple)\n  useEffect(() =>
2653 {\n    document.title = title;\n  });\n  return \u003Ch1>{title}\u003C/h1>;\n}\n```\n\n**On a au final ce cycle de vie (lifecycle) dans nos composants :** \n\n- Rendu Initial  \n  1. Les fonctions composants sont executées pour retourner les élements React composant le DOM virtuel\n  2. Le DOM réel est réconcilié avec le DOM virtuel par ReactDOM\n  3. Les effets externes à React renseignés dans les composants sont executés\n  \nPuis lorsque qu'on déclenche un cycle de mise à jour en modifiant un state :\n\n- Rendu de mise à jour  \n  1. Les fonctions composants dépendantes du nouveau state sont executées pour retourner les élements React composant le DOM virtuel\n  2. Le DOM réel est réconcilié avec le DOM virtuel par ReactDOM\n  3. Les effets externes à React renseignés dans les composants sont executés\n\nBien se représenter ce cycle permet de comprendre la mécanique interne de react.\n\n`useEffect` accepte un 2ème argument, un tableau de dépendances. Très pratique pour l’optimisation.\n\n```javascript\nfunction Demo({ title, text }) {\n  // ici l'effet sera exécuté si title change, \n  // s'il n'y a que text qui change l'effet ne se sera pas exécuté\n  // niveau optimisation c'est top, on évite d’exécuter des instructions qui n'ont pas besoin de l’être\n  useEffect(() => {\n    document.title = title;\n  }, [title]);\n  return (\n    \u003C>\n      \u003Ch1>{title}\u003C/h1>\n      \u003Cp>{text}\u003C/p>\n    \u003C/>\n  );\n}\n```\n\nOn peut exploiter ce tableau de dépendances pour limiter notre effet au premier rendu, au rendu initial du composant.\n\nPour cela on passe un tableau vide\n\n```javascript\nfunction Demo({ title }) {\n  // ici on n'exécutera l'effet qu'après le rendu initial, ça sera pratique par exemple pour un appel API initial\n  useEffect(() => {\n   fetchDataFromApi();\n  }, []);\n  return \u003Ch1>{title}\u003C/h1>;\n}\n```\n\nSi ce tableau n'est pas vide, l'effet ne sera exécuté que pour des rendus où la valeur de la dépendance change.\n\n\u003Cdetails>\n  \u003Csummary>Bonus à propos du useEffet\u003C/summary>\n  \nOn peut noter qu'il est également possible de retourner une fonction de nettoyage qui sera utilisée pour stopper l'effet quand le composant cesse d'être utilisé.  \n\n\n```javascript\nfunction Demo({ title }) {\n  useEffect(() => {\n   // au rendu du composant on pose un décompte\n   const countdown = setTimeout(doSomething, 10000);\n   \n   // on retourne une fonction pour annuler ce décompte\n   // elle sera executée par react quand notre composant cesse d'être utilisé\n   return () => {\n     clearTimeout(countdown);\n   };\n  }, []);\n  return \u003Ch1>{title}\u003C/h1>;\n}\n```\n\u003C/details>\n\n\n## Faire de l'AJAX dans React\n\nPour l'instant sur nos SPA on n'appelle pas de serveur HTTP au délà du premier affichage, pas pratique pour la persistence des données.\n\nOn connait une solution vue en début de saison pour faire de requête HTTP depuis les scripts pour rester sur une SPA: l'AJAX.\n\nVoyons comment faire de l'AJAX au sein d'un projet React.\n\n### En réaction a un événement\n\nExemple :\n\n```javascript\nimport { useState } from 'react';\n\nfunction Widget() {\n  const [quote, setQuote] = useState('');\n\n  const getQuote = async () => {\n    try {\n      const response = await fetch(\"https://api.chucknorris.io/jokes/random\");\n      const data = await response.json();\n      setQuote(data.value);\n    } catch (error) {\n      console.error(error);\n      alert('Erreur de récupération');\n    }\n  }\n\n  return (\n    \u003Carticle className=\"widget\">\n      \u003Cbutton onClick={getQuote} type=\"button\" className=\"button\">Nouvelle citation\u003C/button>\n      \u003Cp className=\"widget-content\">{quote}\u003C/p>\n    \u003C/article>\n  );\n}\n\nexport default Widget;\n```\n\n### Au chargement initial\n\n```javascript\nimport { useState, useEffect } from 'react';\n\nfunction Widget() {\n  const [quote, setQuote] = useState('');\n\n  const getQuote = async () => {\n    try {\n      const response = await fetch(\"https://api.chucknorris.io/jokes/random\");\n      const data = await response.json();\n      setQuote(data.value);\n    } catch (error) {\n      console.error(error);\n      alert('Erreur de récupération');\n    }\n  }\n  \n  useEffect(getQuote, []);\n\n  return (\n    \u003Carticle className=\"widget\">\n      \u003Cp className=\"widget-content\">{quote}\u003C/p>\n    \u003C/article>\n  );\n}\n\nexport default Widget;\n```","tags":"$:/doc/react","title":"$:/code/js/react/hook/useEffect","modified":"20241002075933733","type":"text/markdown"},
2654{"created":"20240925092839470","text":"__useRef__\n\n> useRef est un Hook React qui vous permet de référencer une valeur qui n’est pas nécessaire au code du rendu lui-même.","tags":"","title":"$:/code/js/react/hook/useRef","modified":"20240926074328609","type":"text/markdown"},
2655{"created":"20240917091741264","text":"\n# Hook d’état ou useState\n\n## Que sont les hooks ?\n\nLes **hooks** sont une nouvelle fonctionnalité de React, introduite en version 16, qui vise à remplacer l’écriture de code orienté objet par du code fonctionnel.\nEn d’autres termes, on met de côté les composants sous forme de classe, et on utilise uniquement des composants sous forme de fonction.\nDans ces composants, on appelle des fonctions de React (les hooks) pour composer des fonctionnalités (état, cycle de vie, …)\n\n## Le hook d’état\n\nNous allons simplifier tout ce code en utilisant le **hook d’état**.\n\nCommençons par écrire le composant en fonction :\n\n```javascript\nfunction MyButton() {\n  return (\n    \u003Cdiv>\n      \u003Cdiv>{????}\u003C/div>\n      \u003Cbutton onClick={????}>Click\u003C/button>\n    \u003C/div>\n  )\n}\n```\n\nDe quoi avons nous besoin ?\n\n* la valeur du compteur, pour l’afficher dans la div : `value`\n* une fonction, que l’on pourra appeller dans le `onClick` pour modifier le state : `setValue`.\n\n```javascript\nfunction MyButton() {\n  return (\n    \u003Cdiv>\n      \u003Cdiv>{value}\u003C/div>\n      \u003Cbutton onClick={() => setValue(value + 1)}>Click\u003C/button>\n    \u003C/div>\n  )\n}\n```\n\nReste à obtenir cette valeur et cette fonction de modification. C’est ici que le hook d’état (`useState`) entre en jeu :\n\n```javascript\nimport { use
2655State } from \"react\";\n\nfunction MyButton() {\n  const [value, setValue] = useState(0); // le hook d'état\n\n  return (\n    \u003Cdiv>\n      \u003Cdiv>{value}\u003C/div>\n      \u003Cbutton onClick={() => setValue(value + 1)}>Click\u003C/button>\n    \u003C/div>\n  )\n}\n```\n\nLe hook d’état nous permet de manipuler une donnée dans notre state. Il prend en paramètre la valeur par défaut : dans notre cas, nous voulons que value soit initialisé avec la valeur 0.\n\nLe hook d’état renvoie un tableau de deux éléments. Dans ce tableau, nous avons :\n\n* en premier, une variable contenant notre valeur\n* en second, une fonction pour modifier cette variable\n\n## Conclusion\n\nNous avons appris comment remplacer une gestion d’état dans un composant sous forme de classe, par l’utilisation du hook **useState**. Lorsque l’on a plusieurs données que l’on veut stocker et manipuler, on appellera plusieurs fois useState, pour créer différentes « cases » dans le state de notre composant.\n\nLecture complémentaire : [la doc](https://fr.reactjs.org/docs/hooks-state.html)","tags":"$:/doc/react","title":"$:/code/js/react/hook/useState","modified":"20240917092103796","type":"text/markdown"},
2656{"created":"20240918090607842","text":"\n* Pour un formulaire React\n(Attention le useState est à importer et la déclaration soit se faire dans la fonction)\n\n```js\nimport { useState } from \"react\";\nimport \"./style.css\"\n\n// But : créer un formulaire et récupérer les valeurs du formulaire\n// Todolist : je veux avoir un formulaire pour créer une tâche\n\nexport default function App() {\n\n    // Question - est-ce que j'ai besoin de demander à React de rendre le composant ? Oui\n    // je vais utiliser useState() pour faire des champs/input contrôlés par React\n\n    const [formId, setFormId] = useState(\"\")    // la valeur du useState contient une chaine vide\n    const [formName, setFormName] = useState(\"\")\n\n    const [isSubmit, setIsSubmit] = useState(false)\n\n    const formSubmit = (e) => {\n        // Pour éviter que la page se recharge\n        e.preventDefault()\n        setIsSubmit(true)\n    }\n\n    return (\n        \u003Cmain className=\"container\">\n            {/* Un formulaire */}\n            \u003Ch1>Application Todolist\u003C/h1>\n\n            \u003Ch2>Saisie d'une todo\u003C/h2>\n            \u003Cform method=\"post\" onSubmit={(e) => formSubmit(e)}>\n                \u003Clabel htmlFor=\"id\">Id de la tâche\u003C/label>\n                \u003Cinput \n                    id=\"id\" \n                    name=\"id\" \n                    value={formId}\n\n                    // onChange : lorsque je change la valeur de l'input\n                    // > j'appelle la fonction setFormId pour mettre à jour la valeur de formId\n                    // > e : evenement récupéré par JS \n                    // > e.target : accéder à l'élément HTML courant\n                    // > e.target.value : récupérer la valeur saisie par l'utilisateur dans ce champs\n\n                    onChange={(e) => { setFormId(e.target.value) }}\n                />\n                \n                {/* onChange => input.addEventListener('change', (e) => { ... }) */}\n\n                \u003Clabel htmlFor=\"name\">Nom de la tâche\u003C/label>\n                \u003Cinput \n                    id=\"name\" \n                    name=\"name\" \n                    value={formName}\n                    onChange={(e) => { setFormName(e.target.value) }}\n                />\n\n                \u003Cinput type=\"submit\" value=\"Ajouter\" />\n            \u003C/form>\n\n            {/* Un contenu */}\n            \u003Cdiv>\n                \u003Ch2>Liste des todos\u003C/h2>\n                {/* je veux afficher l'id et le name récupéré */}\n                { \n                    isSubmit && \n                    \u003Cp>Voici la tâche récupérée. Id: {formId} et Nom: {formName}\u003C/p>\n                }\n            \u003C/div>\n        \u003C/main>\n    )\n}\n```\n\n* Incrementatin d'un compteur \n\n\n```js\n\nimport { use
2656State } from \"react\";\nimport \"./style.css\"\n\n// But : un bouton qui permet d'incrémenter un compteur\n\nexport default function App() {\n\n    const [count, setCount] = useState(0)\n\n    return (\n        \u003Cmain className=\"container\">\n            \u003Cp>Valeur du compteur : \u003Cspan>{count}\u003C/span>\u003C/p>\n            \u003Cbutton onClick={() => setCount(count + 1)}>Incrémenter\u003C/button>\n        \u003C/main>\n    )\n}\n```\n* creation d'un composant bouton\n\n ** composant App\n\n```js\nimport { useState } from \"react\";\nimport \"./style.css\"\nimport Button from \"../Button\";\n\n// But : un bouton qui permet d'incrémenter un compteur\n\nexport default function App() {\n\n    const [count, setCount] = useState(0)\n\n    const increment = () => {\n        setCount(count + 1)\n    }\n    const decrement = () => {\n        if(count > 0) {\n            setCount(count - 1)\n        }\n    }\n\n    return (\n        \u003Cmain className=\"container\">\n            \u003Cp>Valeur du compteur : \u003Cspan>{count}\u003C/span>\u003C/p>\n            \u003CButton \n                text=\"Incrémenter\"\n                fctColback={increment}\n            /> \n            \u003CButton \n                text=\"Décrémenter\"\n                fctColback={decrement}\n                color=\"lightgreen\"\n            /> \n        \u003C/main>\n    )\n}\n```\n\n\n ** composant Button\n\n```js\nexport default function Button({ text, fctColback, color = \"black\" }) {\n    return (\n        \u003Cbutton \n            style={{color: color, margin: '1rem'}} \n            onClick={() => fctColback()}>\n                {text}\n        \u003C/button>\n    )\n}\n```\n","tags":"$:/doc/react","title":"$:/code/js/react/hook/useState/exemples","modified":"20240920083839987"},
2657{"created":"20240917071434160","text":"# Évènements\n\n\n- On peut appeler des events en JSX en utilisant des attributs prédéfinis ([voir liste](https://fr.reactjs.org/docs/events.html))\n- Les states stockent les informations variables afin que chaque changement impacte en cascade le reste de l'interface\n- On peut créer un state en utilisant le hook `[nomState, fonctionDeModification] = useState(valeurParDefaut);`\n- Pour utiliser `useState` il faut l'importer depuis react en utilisant `import { useState } from \"react\";`\n\n### La documentation : \n- [Doc](https://fr.reactjs.org/docs/handling-events.html)\n- [Liste des events](https://fr.reactjs.org/docs/events.html)\n\n\n# État ou State\n\n* Le state (état) dans React est en effet utilisé pour gérer et stocker les données qui peuvent changer au fil du temps dans un composant. \n* Il représente les données qui peuvent être modifiées au cours de la vie d'un composant.\n* Lorsque le state change, React re-rend automatiquement le composant pour refléter ces changements dans l'interface utilisateur.\n* Le state est généralement initialisé dans le constructeur d'un composant de classe ou avec le hook useState dans un composant fonctionnel.\n* La modification du state doit toujours se faire via la méthode setState pour les composants de classe ou la fonction de mise à jour retournée par useState pour les composants fonctionnels.\n* Le state est local à un composant, ce qui signifie qu'il n'est accessible et modifiable que par le composant lui-même, sauf s'il est explicitement passé à des composants enfants via les props.\n  \nCela permet de pser un écouteur directement sur l’élément qui nous intéresse avec le nom de l’événement en camelCase, on passe une fonction callback qui sera executée chaque fois que l’événement aura lieu\n\n\n```javascript\nconst Demo = () => {\n  // on prépare une définition de fonction, notre handler\n  // c'est la fonction callback qu'on associera à notre événement\n  // elle accepte un paramètre\n  // il s'agira d'un objet représentant l'événement qui a eu lieu\n  function handleClick(event) {\n    console.log('je réagis au click');\n  };\n\n  // on pose le handler directement sur l’élément dans le JSX\n  return (\n    \u003Cdiv onClick={handleClick}>\n      Demo\n    \u003C/div>\n  );\n};\n```\nDans nos composants React, on adopte un style déclaratif, on se focalise sur le « quoi », sur ce qu’on cherche à représenter.\n\nOn décrit nos éléments d’interface grâce à React. En appelant ensuite la méthode `render` de ReactDOM, celui-ci peut s’occuper de matérialiser ces éléments dans le DOM réel.\n\nReact va en plus nous permettre de garder cette approche déclarative même lorsqu’on cherchera à faire évoluer notre interface et ce qu’elle affiche au fil du temps.\n\nPour cela on va faire en s
2657orte que nos composants soient une représentation d’une source de vérité, qu’on va appeler l’état de l’application ou le **state**.\n\nNos composants vont savoir décrire l’interface, de différentes façons, en fonction du state.\n\nAinsi en réponse à une interaction par exemple, si on souhaite que l’affichage change, on ne va pas décrire comment impacter le DOM. On va continuer à se focaliser sur le *quoi* : on se contentera de décrire ce qui change dans le state. Pour cela on va utiliser la méthode `setState` héritée de la classe `React.Component` fourni par React. \n\nL’appel de cette méthode aura 2 effets :\n\n* Modifier le state\n* Déclencher un nouveau rendu du composant et de ses enfants : les éléments React retournés par nos composants sont de nouveau calculés pour un state différent. ReactDOM va suivre les évolutions des éléments React et impacter le DOM réel pour traduire ces évolutions.\n\nAinsi une simple description des changements du state me permettra de faire évoluer mon interface.\n\n```javascript\nconst Counter = (props) => {\n\n    // on initialise l'état via une propriété state de notre instance\n    let state = {\n      number: 0,\n    }\n\n  function increment() {\n    // en réponse à une interaction on fait 2 choses via setState\n    // - on modifie l'état\n    // - on déclenche un nouveau rendu du composant\n    state.number = state.number + 1;\n  }\n\n   // notre rendu décrit l'interface quel que soit le state\n   return (\n     \u003Cdiv>\n       Vous avez compté jusque {state.number} \n       \u003Cbutton onClick={increment}>Compter\u003C/button>\n     \u003C/div>\n    ); \n  } \n} \n\nexport default Counter;\n```\n\nLe soucis, comme on peut le constater, c’est que la valeur de `state.number` ne se met pas a jour dans le DOM. Pour cela on va utiliser le **Hook d’état** ou `useState`.\n\n{{$:/code/js/react/hook/useState}}","tags":"$:/doc/react","title":"$:/code/js/react/state","modified":"20241002075453313","type":"text/markdown"},
2658{"created":"20240925093535954","text":"   ```bash\n   npm install zustand\n   ```\n\n\nDans le dossier `src/`, créez un dossier `store`. Vous allez maintenant créer un fichier `index.js` qui contiendra le code suivant\n\n- **store/index.js** : contiendra notre ou nos stores :\n  ```js\n  import { create } from 'zustand'\n\n  export const useUserStore = create((set) => ({\n      user: null,\n      login: (username, password) => set(() => ({\n          user: { name: username }\n      })),\n      logout: () => set({ user: null }),\n  }))\n  ```\nDans le dossier `src/pages`, nous allons créer 2 nouveaux composants pour créer le formulaire de **login** et le **logout**.\n\n- source du fichier **Login.jsx**\n\n```jsx\nimport { useUserStore } from '../store';\nimport { useNavigate } from 'react-router-dom';\n\nexport default function Login() {\n    // ici on récupère la fonction login() de notre store (destructuration du store)\n    const { login } = useUserStore()\n    const navigate = useNavigate()\n\n    const handleSubmit = (e) => {\n        e.preventDefault()\n        // ici on appelle la fonction login du store avec les valeurs du form\n        login(username, password)\n        // notez ici la redirection vers la page d'accueil\n        return navigate('/')\n    }\n\n    const [username, setUsername] = useState(\"\")\n    const [password, setPassword] = useState(\"\")\n\n    return (\n        \u003Cdiv>\n            \u003Ch1>Se connecter\u003C/h1>\n            \u003Cp>C&apos;est ici que tu pourras te connecter à ton profil utilisateur !\u003C/p>\n            \u003Cform method=\"post\" onSubmit={(e) => handleSubmit(e)}>\n                \u003Cfieldset>\n                    \u003Clabel htmlFor=\"username\">Utilisateur\u003C/label>\n                    \u003Cinput\n                        type=\"text\" id=\"username\" name=\"username\"\n                        value={username} onChange={(e) => setUsername(e.target.value)}\n                    />\n                \u003C/fieldset>\n                \u003Cfieldset>\n                    \u003Clabel htmlFor=\"password\">Mot de passe\u003C/label>\n                    \u003Cinput\n                        type=\"password\" id=\"password\" name=\"password\"\n                        value={password} onChange={(e) => setPassword(e.target.value)}\n                    />\n                \u003C/fieldset>
2658\n                \u003Cinput type=\"submit\" value=\"Se connecter\" />\n            \u003C/form>\n        \u003C/div>\n    );\n}\n```\n\n- source du fichier **Logout.jsx**\n\n```jsx\nimport { useUserStore } from '../store';\nimport { useNavigate } from 'react-router-dom';\n\nexport default function Logout() {\n    // ici on récupère le store en faisant un import (uniquement le logout)\n    const { logout } = useUserStore()\n    // ici on utilise la redirection de React-router-dom\n    const navigate = useNavigate()\n    // On appelle la fonction logout du store\n    logout()\n    return navigate('/')\n}\n```\n\n* SOurce du fichier NavBar.jsx\n```jsx\nimport { Link } from 'react-router-dom';\nimport { useUserStore } from '../store';\n\nexport default function Navbar() {\n  // Voyez encore ici la récupération de la variable user du store\n  const { user } = useUserStore()\n\n  return (\n    \u003Cnav>\n      \u003Cul>\n        \u003Cli>\u003CLink to=\"/\">Accueil\u003C/Link>\u003C/li>\n        \u003Cli>\u003CLink to=\"/about\">À propos\u003C/Link>\u003C/li>\n        \u003Cli>\u003CLink to=\"/contact\">Contact\u003C/Link>\u003C/li>\n      \u003C/ul>\n      \u003Cul>\n        {!user ?\n          \u003Cli>\u003CLink to=\"/login\">Se connecter\u003C/Link>\u003C/li>\n          :\n          \u003C>\n            \u003Cli>Bienvenue {user.name}\u003C/li>\n            \u003Cli>\u003CLink to=\"/logout\">Se déconnecter\u003C/Link>\u003C/li>\n          \u003C/>\n        }\n      \u003C/ul>\n    \u003C/nav>\n  );\n}\n```\n\n\nPour terminer, il faut rajouter les routes login et logout dans le routeur.  \nModifions enfin le fichier **main.jsx** avec le code suivant :\n\n```jsx\n// Attention de ne pas oublier les imports\nimport Login from './pages/Login.jsx';\nimport Logout from './pages/Logout.jsx';\n\ncreateRoot(document.getElementById('root')).render(\n  \u003CBrowserRouter>\n    \u003CNavbar />\n    \u003CRoutes>\n      \u003CRoute path=\"/\" element={\u003CHome />} />\n      \u003CRoute path=\"/about\" element={\u003CAbout />} />\n      \u003CRoute path=\"/contact\" element={\u003CContact />} />\n      \u003CRoute path=\"/login\" element={\u003CLogin />} />\n      \u003CRoute path=\"/logout\" element={\u003CLogout />} />\n      \u003CRoute path=\"*\" element={\u003CNotFound />} />\n    \u003C/Routes>\n  \u003C/BrowserRouter>\n);\n```","tags":"$:/doc/react","title":"$:/code/js/react/zustand","modified":"20240930085031926","type":"text/markdown"},
2659{"created":"20240927034453561","text":"```js\nconst set = new Set([3, 5, 4, 2, 7]);\nconst arr = Array.from(set);\nconst firstItem = arr[0];\nconsole.log(`Le premier élément de l'ensemble est ${firstItem}.`);\n```\n\nIl faut utiliser `.size` et non pas `.length` pour avoir la taille de la collection.","tags":"","title":"$:/code/js/set","modified":"20240927091910265"},
2660{"created":"20240823072358028","text":"__Copie par référence VS par valeur__\n\nLorsque je crée une copie de mon tableau avec la syntaxe suivante. lorsque je modifie  la copie, je modifie également l'original !\n\nQuand on crée une variable, celle-ci va aller s'enregistrer à une adresse dans la mémoire de notre machine.\n\nPour les tableaux et les objets, lors d'une copie, on copie seulement l'adresse de la mémoire et non la donnée elle-même. C'est à dire que notre tableau ou objet copié pointera (donc fera __référence__) à l'adresse mémoire exacte de son original. De fait, lorsqu'on modifie la copie, en fait on modifie directement l'original.\n\nEn utilisant le destructuring, ou certaines fonctions javascript, on peut créer ce que l'on appelle une __copie par valeur__. C'est à dire qu'on ne copie plus directement l'adresse mémoire (la référence) mais qu'on crée un tout nouvel objet ou tableau qui copie uniquement le contenu de l'original mais avec deux adresses mémoires indépendantes l'une de l'autre.\n\n__spread operator__\n\n>Le spread operator, qui se présente ni plus ni moins sous la forme de points de suspension : ... permet de faire des copies de variables en un tour de main.\n\n```js\nconst originale = \"Pringles\";\nconst copie = ...originale;\nconsole.log(copie);\n```\n\nil diffère de :\n\n```js\nconst originale = \"Pringles\"\nconst reference = originale\nconsole.log(reference)\n//affiche \"Pringles\"\n```\n\nCette façon de faire qui pourrait pourtant sembler naturelle créée en réalité non pas une copie, mais une référence à la variable d’origine. C’est-à-dire qu’en cas de modification d’une valeur dans la pseudo-copie, elle sera immédiatement répercutée sur la variable à laquelle elle fait référence.\n\nPour copier un tableau :\n\n```js\nconst array = [\"jambon\", \"emmental\", \"cornichons\", \"pain\", \"beurre\"]\nconst arrayCopie = [...array]\n\n//affiche ['jambon', 'emmental', 'cornichons', 'pain', 'beurre']\n\n```\nsoit la même chose qu'en programmation impérative  :\n\n```js\nconst arrayCopie = []\n  for(const item of array) {\n        arrayCopie.push(item);\n      }\n```\n\nPour créer un tableau :\n\n```js\nvar string = \"geek\"\nvar array = [...string]\nconsole.log(array)\n// ['g', 'e',' e',' k']\n```\n## combiner deux tableaux \n\n```js\nvar curInv = [\n    [21, \"Bowling Ball\"],\n    [2, \"Dirty Sock\"],\n    [1, \"Hair Pin\"],\n    [5, \"Microphone\"]\n];\n\nvar newInv = [\n    [2, \"Hair Pin\"],\n    [3, \"Half-Eaten Apple\"],\n    [67, \"Bowling Ball\"],\n    [7, \"Toothpaste\"]\n];\n\nlet combinedInv = [...curInv, ...newInv];\nconsole.log(combinedInv)\n```\n\nLe spread operator fonctionne **sur les objets et sur les tableaux** ou sur une liste d'arguments à une fonction.\nCe n'est pas une simple méthode d'un prototype mais une syntaxe\n\n* Pour aller plus loin : [[https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax]]\n\n* voir aussi [[$:/code/js/concat]]","tags":"","title":"$:/code/js/spread_operator","modified":"20240919080818636","type":"text/markdown"},
2661{"created":"20240607094345054","text":"\n```js\n\n/// Supprimer tout les espaces d'une chaine de caractères\nStringText.replace(/\\s+/g,\"\")\n\n/*\ns modifier (single-line)\ng modifier (global)\n*/\n\nStringText.replaceAll(\" \",\"\")\n\n```\nEn JavaScript, il est possible d'exécuter des méthodes sur des objets de type Str
2661ing et Array.\n\n Voici quelques exemples de méthodes courantes pour chaque type :\n\nMéthodes de l'objet String :\n\n* toUpperCase() : convertit une chaîne en majuscules\n* toLowerCase() : convertit une chaîne en minuscules\n* slice() : extrait une partie d'une chaîne\n* split() : scinde une chaîne en un tableau de sous-chaînes\n* replace() : remplace un motif par une nouvelle sous-chaîne\n\n Exemple :\n\n```js\nconst message = \"Hello, World!\";\nconst uppercaseMessage = message.toUpperCase(); // \"HELLO, WORLD!\"\n\n```\n\n\n* Autre exemple avec [[includes|https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Global_Objects/String/includes]]:\n\n```js\nlet phrase = \"Bonjour tout le monde\";\nlet mot = \"tout\";\n\nif (phrase.includes(mot)) {\n    console.log(\"La chaîne contient le mot.\");\n} else {\n    console.log(\"La chaîne ne contient pas le mot.\");\n\n```\n\n\n\nMéthodes de l'objet Array\n\n* push() : ajoute un ou plusieurs éléments à la fin d'un tableau\n* pop() : supprime le dernier élément d'un tableau et renvoie cet élément\n* forEach() : exécute une fonction donnée pour chaque élément du tableau\n* filter() : crée un nouveau tableau avec tous les éléments qui passent le test implémenté par la fonction donnée\n* map() : crée un nouveau tableau avec les résultats de l'appel d'une fonction fournie sur chaque élément du tableau appelant\n\nExemple :\n\n```js\nconst fruits = [\"apple\", \"banana\", \"orange\"];\nfruits.forEach(fruit => console.log(fruit)); // affiche chaque fruit sur une nouvelle ligne\n```\n\nEn JavaScript, les chaînes de caractères et les tableaux sont des objets, et les méthodes sont des fonctions liées à ces objets qui permettent de manipuler et d'extraire des données. \n\nL'utilisation de ces méthodes rend le code plus concis et expressif.","tags":"","title":"$:/code/js/string","modified":"20240919113203661"},
2662{"created":"20240921222851359","text":"charAt()\n\n>La méthode charAt() renvoie une nouvelle chaîne contenant le caractère (ou, plus précisément, le point de code UTF-16) à la position indiquée en argument.\n\n* [[Documentation MDN|https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Global_Objects/String/charAt]]\n\n```js\n\u003Cscript>     \nvar i = 0;     \nconst texts = [\"Hello!\", \"My name is Adithya.\", \"Welcome to my digital garden.\"]; \n\nvar speed = 100, index = 0;\n\nfunction typeWriter() {\nvar e = texts[index];\ni \u003C e.length ? (0 == i ? document.getElementById(\"hero-heading\").innerHTML = e.charAt(i) : document.getElementById(\"hero-heading\").innerHTML += e.charAt(i), i++, setTimeout(typeWriter, speed)) : index \u003C texts.length - 1 && (index++, i = 0, setTimeout(typeWriter, 8 * speed)}     \n\nwindow.addEventListener(\"load\", \nfunction () {         setTimeout(typeWriter, 8 * speed)}); \n\u003C/script>\n\n      \u003Ch1 class=\"title\" id=\"hero-heading\">\n        ...\n      \u003C/h1>\n```","tags":"","title":"$:/code/js/string/charAt","modified":"20240921224148882","type":"text/markdown"},
2663{"created":"20240926135631007","text":"__Vitest , un framework de tests__ :\n\n* rapidité, \n* intégration facile \n\n\n[Documentation Vitest](https://vitest.dev/config/)\n\n\u003Cdetails>\n\t\u003Csummary>\n\t\tInstallation\n\t\u003C/summary>\n\n```\nnpm install -D vitest\n```\n\n\t\nDans package.json :\n\n```json\n \"scripts\": {\n   \"dev\": \"vite\",\n   \"build\": \"vite build\",\n   \"lint\": \"eslint . --ext js,jsx --report-unused-disable-directives --max-warnings 0\",\n   \"preview\": \"vite preview\",\n   \"test\": \"vitest\"\n },\n```\n\t\n\u003C/details>\n\n\n\n\u003Cdetails> \n\u003Csummary>\nExecution\t\n\u003C/summary>\n\n\t```\n\tnpm run test\n\t```\n\t\n\u003C/details>\n\n## La syntaxe\n\n- `describe` : délimiter des chapitres pour organiser nos tests via la fonction describe accessible dans le contexte de nos tests.\n \n\n```javascript\n// ...\ndescribe('Execution', () => {\n  // ici viendront des tests ou des sous-chapitres\n});\n```\n\n- `test` ou `it` : On peut ensuite décrire un test unitaire via la fonction test ou it accessible dans le contexte de nos tests.\n\n```javascript\n// ...\ntest('it should give 5 for 2 and 3', () => {\n  // ici viendra l'assertion\n});\n```\n\n- `expect` : On peut ensuite écrire une assertion via la fonction expect accessible dans le contexte de nos tests. L’assertion est une affirmation qui sera vérifiée à l’exécution des tests pour savoir si elle est vérifiée ou non (si le test passe ou s’il échoue). C’est comme faire des comparaisons avec nos opérateurs habituels. Sauf que notre outil de test nous fourni des fonctions pratiques pour faire cela plus facilement.\n\n```javascript\n// ...\ntest('it should give 5 for 2 and 3', () => {\n  expect(2 + 3).toBe(5);\n});\n```\n\n## Des exemples\n\n* tests de fonctions :\n\n```js\nimport { getAnalyse, CATEGORIES } from './getAnalyse.js';\nimport { expect, it, describe } from 'vitest'\nimport movementsData from '../../data.json';\n\nconst result = getAnalyse(movementsData);\n\n\ndescribe('Bank analysis', () => {\n    // Teste si la fonction retourne un objet avec des clés au format année-mois.\n    it('should return an object with year-month as key', () =>
2663 {\n      const keys = Object.keys(result);\n        // console.log(keys);\n      expect(keys.length).toBeGreaterThan(0); // S'assure que l'objet n'est pas vide.\n      expect(keys[0]).toMatch(/\\d{4}-\\d{2}/); // Vérifie le format des clés.\n    });\n\n    // On teste si la fonction retourne bein toutes les catégories pour chaque mois.\n    it('should return all categories as key', () => {\n        const keys = Object.keys(result);\n        for(let i=0; i \u003C keys.length; i++) {\n            for (const categorie of CATEGORIES) {\n            //  je verifie qu'il n'y a pas de catégorie manquante pour tous les mois\n            expect(!result[keys[i]][categorie]).toBe(false);\n            }\n    //   const entries =  Object.entries(getAnalyse(movementsData));\n   })\n\n\n\t \n```\n\n\n\n```js\n\nConst { getAmountByCategory } = require('../src/utils/getAnalyse');\n\n\ntest('Should return correct total amount by category', () => {\n  const expectedResult = {\n    Charges: -200,\n    Revenus: 500,\n    Alimentation: -150,\n    Loisirs: -75,\n    Logement: -100,\n    Autres: -50\n  };\n\n```","tags":"$:/doc/bundler/vite","title":"$:/code/js/testing/vitest","modified":"20240927094104231","type":"text/markdown"},
2664{"created":"20240913093157764","text":"\n## Les variables\n> Notions : let, const, camelCase\n\n\nDe base : on va créer une Constante (const), et c'est seulement si on sait qu'on doit modifier la valeur stockée dans cette variable, qu'on modifiera le `const` par `let`.\n\nLes constantes sont plus pratiques pour la mémoire.\n\n[Mdn : const](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Statements/const)\n\n```js\nconst maConstante = \"Une valeur fixe\";\n```\n\n[Mdn : let](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Statements/let)\n\n```js\nlet maVariable = \"quelque chose\";\nmaVariable = 12;\n```\n\n### Les types\n> Notions : int, float, string, bool\n> En JS : Number, string, bool, NaN, [int, float]\n\n[Mdn : Types et structures de données](https://developer.mozilla.org/fr/docs/Web/JavaScript/Data_structures)\n\n```js\nlet valeur;\nconsole.log(valeur);    // undefined\nvaleur = null;\nvaleur = 12;\nvaleur = 42.12;\nvaleur = \"quarante deux\";\nvaleur = false;\n```\n\n```js \nlet input = \"3\"; // string\nconsole.log(typeof input); // string\n// pour convertir la valeur stockée dans input en un entier : \nlet result = Number(input);\nconsole.log(result); // 3\n\n```\n\n```js\nlet string=\"bonjour\";\nresult = Number(string);\n//NaN\nconsole.log(result);\n//NaN\nisNaN(result);\n//true\n```\n","tags":"$:/code/js","title":"$:/code/js/variables","modified":"20240913093302202","type":"text/markdown"},
2665{"created":"20240826073458924","text":"Pour le MCD (Modèle Conceptuel de Données) que vous avez présenté :\nProduct --0,1-------- HAS ------- 0,N-- Brand\n\nCette association est qualifiée de relation binaire de type 0,1 - 0,N.\nVoici quelques points importants à noter sur cette association :\nType de relation : C'est une relation binaire car elle implique deux entités (Product et Brand).\n\n* Cardinalités :\nDu côté de Product : 0,1\nDu côté de Brand : 0,N\nInterprétation :\n* Un produit peut être associé à 0 ou 1 marque.\nUne marque peut être associée à 0, 1 ou plusieurs produits.\nCaractéristiques :\nC'est une relation optionnelle des deux côtés (car les cardinalités minimales sont 0).\nC'est une relation de type \"plusieurs-à-un\" (many-to-one) du point de vue de Brand vers Product.\n* Implémentation en MLD :\nDans le Modèle Logique de Données (MLD), cette relation sera généralement implémentée en ajoutant une clé étrangère dans la table Product qui référencera la table Brand.\n* Particularité :\nLa cardinalité 0,1 du côté Product indique qu'un produit peut exister sans être associé à une marque, ce qui peut être intéressant à noter dans certains contextes métier.\nCette structure permet une grande flexibilité dans la modélisation des relations entre produits et marques, autorisant des produits sans marque et des marques sans produits, tout en permettant à une marque d'avoir plusieurs produits.\n\nLa traduction correcte d'une association one-to-many (un-à-plusieurs) estl'ajout d'une clé étrangère sur la table qui fait référence à plusieurs lignes de l'autre table de l'association\nVoici une explication détaillée :\nTraduction d'une association one-to-many\n\n* Principe de base :\nDans une relation one-to-many, une entité du côté \"one\" peut être associée à plusieurs entités du côté \"many\", mais chaque entité du côté \"many\" ne peut être associée qu'à une seule entité du côté \"one\".\n* Implémentation correcte :\nLa clé étrangère est ajoutée dans la table du côté \"many\".\nCette clé étrangère fait référence à la clé primaire de la table du côté \"one\".\nExemple :\nSi nous avons une relation one-to-many entre \"Département\" (one) et \"Employé\" (many):\nLa table \"Employé\" aura une clé étrangère faisant référence à la table \"Département\".","tags":"","title":"$:/code/MCD","modified":"20240906124601531","type":"text/markdown"},
2666{"created":"20240826113104621","text":"\n\n## Types de Cardinalités\n\n### 
26661. **One-to-One (1:1)**\nUne relation **one-to-one** signifie qu'une instance d'une entité est associée à une seule instance d'une autre entité, et vice versa.\n\n#### Traduction en base de données\nCette relation se traduit généralement par l'ajout d'une clé étrangère dans l'une des deux tables, au choix.\n\n#### Exemple\n```markdown\n- Une personne possède un seul passeport.\n- Un passeport est associé à une seule personne.\n```\n\n#### Modélisation dans une base de données\n```sql\nCREATE TABLE Person (\n  id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,\n  name VARCHAR(100)\n);\n\nCREATE TABLE Passport (\n  id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,\n  passport_number VARCHAR(20) UNIQUE,\n  person_id INTEGER UNIQUE REFERENCES Person(id)\n);\n```\n\n### 2. **One-to-Many (1:N)**\nUne relation **one-to-many** signifie qu'une instance d'une entité peut être associée à plusieurs instances d'une autre entité, mais chaque instance de la deuxième entité est associée à une seule instance de la première.\n\n#### Traduction en base de données\nCette relation se traduit par l'ajout d'une clé étrangère dans la table qui représente le côté \"many\".\n\n#### Exemple\n```markdown\n- Un auteur peut écrire plusieurs livres.\n- Un livre est écrit par un seul auteur.\n```\n\n#### Modélisation dans une base de données\n```sql\nCREATE TABLE Author (\n  id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,\n  name VARCHAR(100)\n);\n\nCREATE TABLE Book (\n  id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,\n  title VARCHAR(100),\n  author_id INTEGER REFERENCES Author(id)\n);\n```\n\n### 3. **Many-to-Many (N:N)**\nUne relation **many-to-many** signifie que plusieurs instances d'une entité peuvent être associées à plusieurs instances d'une autre entité.\n\n#### Traduction en base de données\nCette relation se traduit par la création d'une table intermédiaire (table de jonction) qui contient des clés étrangères pointant vers chacune des deux tables liées.\n\n#### Exemple\n```markdown\n- Un étudiant peut s'inscrire à plusieurs cours.\n- Un cours peut avoir plusieurs étudiants inscrits.\n```\n\n#### Modélisation dans une base de données\n```sql\nCREATE TABLE Student (\n  id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,\n  name VARCHAR(100)\n);\n\nCREATE TABLE Course (\n  id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,\n  course_name VARCHAR(100)\n);\n\nCREATE TABLE Enrollment (\n  student_id INTEGER REFERENCES Student(id),\n  course_id INTEGER REFERENCES Course(id),\n  PRIMARY KEY (student_id, course_id)\n);\n```\n\n## Importance des Cardinalités\n\n1. **Intégrité des Données** : Les cardinalités aident à maintenir l'intégrité référentielle, en s'assurant que les relations entre les entités sont correctement respectées.\n\n2. **Performance** : Une bonne compréhension des cardinalités permet d'optimiser les requêtes et d'améliorer les performances de la base de données en structurant les relations de manière efficace.\n\n3. **Modélisation** : Les cardinalités sont essentielles pour modéliser correctement les relations dans une base de données, en capturant fidèlement les interactions entre les entités du monde réel.\n","tags":"","title":"$:/code/MCD/Cardinalités","modified":"20240826113256982","type":"text/markdown"},
2667{"created":"20240822072030972","text":"## Connexion et commande de base\n\nOn peut se connecter au serveur mongo via la commande shell  `mongosh` (si disponible sur la machine)\n\n\nQuelques commandes :\n\n- `show dbs` pour lister les database\n- sélectionner une base (crée la base à la volée si elle n'existe pas) : `use maBase`\n- lister les collections : `show collections`\n- quitter la console : `exit`\n\nUne fois connecté on peut choisi notre database `use mydatabase`  \nOn peutrenommer une collection avec `db.samples_mydatabase.renameCollection('mycollection')`\n\n\n## Tester les 4 opérations du CRUD\n\n- Create avec [insertOne](https://www.mongodb.com/docs/manual/crud/#create-operations)  \n  `db.mycollection.insertOne({ name: 'Etienne', job: 'Tutor'  })`\n- Read avec [find](https://www.mongodb.com/docs/manual/crud/#read-operations)\n  `db.mycollection.find()` pour tout trouver  \n  `db.mycollection.find({ name: 'Etienne' })` pour trouver les pokémon s'appelant Etienne\n  `db.mycollection.find({ num: '151' })` pour trouver les pokémon numéro 151\n- Update avec [updateOne](https://www.mongodb.com/docs/manual/crud/#update-operations) ou Many selon si on veut impacter une ou plusieurs ligne  \n  ```js\n    db.mycollection.updateOne(\n      {\n        name: \"Etienne\",\n      },\n      {\n        $set: { job: \"Directeur\" },\n      }\n    );\n  ```\n- Delete avec [deleteOne](https://www.mongodb.com/docs/manual/crud/#delete-operations)\n  `db.mycollection.deleteOne({ name: \"Etienne\" })`\n\n[Pour faire un dump on a les mongo tools à dispo](https://www.mongodb.com/docs/database-tools/mongodump/#examples)\n\n\n## Un peu plus sur 'find'\n\n- Sans argument on cherche tout `db.collection.find()`\n- Le premier argument est un objet de critère, chaque propriété est un critère `db.mycollection.find({ id: 150, name: \"Mew\" });`\n- Le second argument est la projection, l'aspect qu'auront les résults `db.mycollection.find({}, { id:1, name: 1, _id: 0  })` ici on a aucun critère mais une projection avec uniquement id et name et pas _id ni les autres champs\n\n### Valeurs incluses\n\nQuand le document contient un array, on peut tester si l'array en question CONTIENT une valeur : \n\n`db.mycollection.find({type: \"Dragon\"})`\n\nQuand le document contient un objet, on peut tester les valeurs de cet objet, avec la dot-notation habituelle : \n\n(pas d'exemple direct dans la base)\n`db.example.find({ \"objet.value\": \"valeur\"})`, ex: `db.mycollection.find({ \"prev_evolution.name\": \"Dratini\"})`\n\nEt le must du must : on peut combiner les deux ! Quand un document contient un array de sous-document, ça fonctionne tout pareil :\n\n`db.mycollection.find({\"prev_evolution.name\":\"Eevee\"});`\n\n### Modificateurs\n\nOn retrouve la liste des [opérateurs](https://www.mongodb.com/docs/manual/reference/operator/query/) dans la doc\n\n- plus grand que : `find({\"spawn_chance\": {$gte: 2}});`\n- plus petit que : `find({\"spawn_chance\": {$lte: 2}});`\n- parmi (sert de OU logique!) : `find({\"type\": {$in: [\"Dragon\", \"Ice\"] } }, {name:1});`\n- pas dans : `find({\"type\": {$nin: [\"Water\", \"Fire\"] } }, {name:1});`\n- \"ET\" sur même prop : `find({ \"type\": {$eq:\"Flying\", $ne:\"Normal\"} },{name:1,type:1});`\n- regexp ! : `find({\"name\": /b/i})` qui contiennent un b en majuscule ou en minuscule  \n  `db.mycollection.find({\"name\": /^b/i}, { _id: 0, name:1 })` qui commencent par un b majuscule ou minuscule avec une projection pour ne lister que les noms\n\n### Tri et limite\n\n- tri simple : `db.mycollection.find({}, {name:1}).sort({name:1})` (1 pour ascendant, -1 pour descendant)\n- tri à paramètres multiples: `db.mycollection.find().sort({type:1, name:-1})`. L'ordre de priorité est égal à l'ordre de déclaration (ici, \"type ascendant\" en premier, puis \"name descendant\" )\n- un exemple plus lisible (avec une projection) : `db.mycollection.find({},{name:1, type:1}).sort({type:1, name:-1})`\n- limite : `db.mycollection.find().limit(4)`\n","tags":"","title":"$:/code/MongoDB","modified":"20240822092519522","type":"text/markdown"},
2668{"created":"20240822092609097","text":"\n# Premières requêtes\n\n## Requetes \"valeur exacte\"\n\n1. `db.pokedex.find()` : \"trouve les éléments de la collection pokedex, sans filtre\"\n2. `db.pokedex.count()` : \"compte tous les éléments....\"\n3. `db.pokedex.find({id: 150})` : \"trouve les éléments..., dont la propriété `id` est égale à 150\"\n4. Attention:  `db.pokedex.find({id: \"150\"})`, paf ça renvoie rien !! MongoDB est stricte sur les types de données.\n5. Bien sur, c'est combinable : `db.pokedex.find({name:\"Mewtwo\", id: 150})`. C'est un ET, pas un OU !\n6. c'est moche? cadeau : `db.pokedex.find({id: 150}).pretty()`\n\n## Projection\n\nLorsqu'on ne veut que certaines propriétés des documents, on passe un objet en 2ème paramètre de find() :\n\n`db.pokedex.find({}, {name: 1})`\n\nPar défaut, l'id sera toujours inclus. On peut le désactiver : \n\n`db.pokedex.find({}, {name: 1, _id:0})`\n\n## Valeurs incluses\n\nQuand le document contient un array, on peut tester si l'array en question CONTIENT une valeur : \n\n`db.pokedex.find({type: \"Dragon\"})`\n\nQuand le document contient un objet, on peut tester les valeurs de cet objet, avec la dot-notation habituelle : \n\n(pas d'exemple direct dans la base)\n`db.example.find({objet.value: \"valeur\"})`\n\nEt le must du must : on peut combiner les deux ! Quand un document contient un array de sous-document, ça fonctionne tout pareil :\n\n`db.pokedex.find({\"prev_evolution.name\":\"Eevee\"});`\n\n## Modificateurs\n\n- plus grand que : `find({\"spawn_chance\": {$gte: 2}});`\n- plus petit que : `find({\"spawn_chance\": {$lte: 2}});`\n- parmi (sert de OU logique!) : `find({\"type\": {$in: [\"Dragon\", \"Ice\"] } }, {name:1});`\n- pas dans : `find({\"type\": {$nin: [\"Water\", \"Fire\"] } }, {name:1});`\n- \"ET\" sur même prop : `find({ \"type\": {$eq:\"Flying\", $ne:\"Normal\"} },{name:1,type:1});`\n- regexp ! : `find({\"name\": /ard/gi})`\n\n## Tri et limite\n\n- tri simple : `db.pokedex.find({}, {name:1}).sort({name:1})` (1 pour ascendant, -1 pour descendant)\n- tri à paramètres multiples: `db.pokedex.find().sort({type:1, name:-1})`. L'ordre de priorité est égal à l'ordre de déclaration (ici, \"type ascendant\" en premier, puis \"name descendant\" )\n- un exemple plus lisible (avec une projection) : `db.pokedex.find({},{name:1, type:1}).sort({type:1, name:-1})`\n\n- limite : `db.pokedex.find().limit(4)`\n\n## Insertion\n`db.pokedex.insert({nom: \"JaiRienAFaireLa\"})`\n\nOn remarque que le nouvel objet n'a aucune propriété en commun avec les autres. Et pourtant, mongo l'a inséré sans broncher dans la collection...\n\n## Modification\n\nModifier un seul document : \n\n`db.pokedex.updateOne({nom: \"JaiRienAFaireLa\"},{\"$set\": {test: \"truc\"}});`\n\nL'opérateur \"$set\" est nécessaire. Il en existe un paquet : [[https://docs.mongodb.com/manual/reference/operator/update/#id1]]\n\nMo
2668difier plusieurs document : \n\n`db.collection.updateMany(...)` sur le même format que updateOne\n\n## Suppression\n\nSupprimer un seul document : \n\n`db.pokedex.deleteOne({nom: \"JaiRienAFaireLa\"});`\n\n\nSupprimer plusieurs document : `db.collection.deleteMany(...)`, sur le même format.\n# Quelques requêtes Mongo\n\nOn fait le CRUD : CREATE / READ / UPDATE / DELETE\n\n### READ\n\n```js\n// Compter le nombre de pokemons\ndb.pokedex.countDocuments()\n\n// Selectionner le pokemon dont l'ID vaut 20\ndb.pokedex.find({ id: 20 }) // attention au type !\n\n// Selectionner le pokemon dont l'ID vaut 20 ET le nom vaut Raticate\ndb.pokedex.find({ id: 20, name: \"Raticate\" })\ndb.pokedex.findOne({ id: 20, name: \"Raticate\" })\n\n// Selectionner tous les pokemons mais uniquement le champ \"name\" => PROJECTION \ndb.pokedex.find({}, { name: 1 }) // Mongo laisse tout de même l'ID dans les projections \ndb.pokedex.find({}, { name: 1, _id: 0 }) // Sans l'ID // 1 ~= true pour mongo ET 0 ~= false\n\n// Selectionner tous les pokemons de type Electric\ndb.pokedex.find({ type: [\"Electric\"] }) // Et seulement Eletric\ndb.pokedex.find({ type: \"Electric\" }) // Dont 1 des types est électrique\n\n// Selectionner tous les pokemons de type Eletric ET Flying\ndb.pokedex.find({ type: [\"Electric\", \"Flying\"] })\n\n// Selectionner tous les pokemons de type Electric OU Flying\ndb.pokedex.find({ $or: [{ type: \"Electric\" }, { type: \"Flying\" }] })\ndb.pokedex.find({ type: { $in: [\"Electric\", \"Flying\"] }})\n\n// Selectionner le pokemon dont l'évolution \"précédente\" était Rattata\ndb.pokedex.find({ \"prev_evolution.name\": \"Rattata\" }); // Nested query\n\n// Selectionner les pokemons dont les chances d'apparitions (spawn_chance) sont inférieures à 0.5\ndb.pokedex.find({ spawn_chance: { $lt: 0.5 } })\n\n// Le pokemon qui a le moins de chance d'apparition\ndb.pokedex.find({}).sort({ spawn_chance: 1 }).limit(1)\n\n// Selectionner les pokemons qui ont \"chu\" dans leur name (similaire à regex LIKE %chu% en Postgres)\ndb.pokedex.find({ name: /chu/ }, { name: 1 })\ndb.pokedex.find({ name: { $regex: \"chu\"} }, { name: 1 })\n\n// Selectionner seulement 3 pokemons\ndb.pokedex.find({}).limit(3)\n\n// Selectionner les pokemons triés par noms croissant\ndb.pokedex.find({}).sort({ name: 1 })\n```\n\n\n## CREATE \n\n```js\ndb.pokedex.insertOne({ name: \"Nicotin\" })\ndb.pokedex.findOne({ _id: ObjectId(\"63b5545e40e944dfe6060ad6\") })\n```\n\n\n## UPDATE\n\n`db.pokedex.update(QUERY, MODIFICATION, OPTIONS)`\n\n```js\ndb.pokedex.updateOne({ name: \"Nicotin\" }, { $set: { attacks: [\"Rassurer les Mayas\", \"Bagarre de chat\", \"Lance patate\"] } })\ndb.pokedex.updateOne({ name: \"Nicotin\"}, { $pull: { attacks: \"Lance patate\" } })\ndb.pokedex.updateOne({ name: \"Nicotin\"}, { $push: { attacks: \"Crash de VM\" } })\n\n// On rajoute un champ height puis on le retire\ndb.pokedex.updateOne({ name: \"Nicotin\"}, { $set: { height: 180 } })\ndb.pokedex.updateOne({ name: \"Nicotin\"}, { $unset: { height: 1 } })\n\n// Update plusieurs documents (= enregistrement) en même temps !\ndb.pokedex.update({}, { $unset: { candy: 1 } }, { multi: true })\n```\n\n## DELETE\n\n```js\ndb.pokedex.deleteOne({ name: \"Nicotin\" })\n```\n\n## La méthode aggregate\n\n\nFaire de la data avec de la data. Et vice et versa.\n\n## Le principe\n\nAggregate fonctionne sur un principe de _steps_. Chaque _step_ ne connait que ce que le _step_ précédent lui a donné.\n\nDans les steps, le caractère `$` représente l'ojet en traitement (un peu comme `this`). Ainsi pour atteindre la propriété \"name\" de l'objet, on donnera le paramètre \"$name\".\n\n## Quelques opérateurs\n\n- `$project` fait une projection (fonctionne comme le 2ème paramètre de find)\n- `$size` renvoie la taille d'une liste.\n- `$unwind` \"déroule\" une liste, en dupliquant le reste du document au besoin.\n  - Ainsi `{name: \"Dracaufeu\", types: [\"Feu\", \"Vol\"]}` devient `[{name: \"Dracaufeu\", types: \"Feu\"}, {name:\"Dracaufeu\", types: \"Vol\"}]`.\n- `$group` est l'équivalent du \"GROUP BY\" de SQL. C'est un peu comme l'inverse de \"unwind\", mais on doit définir comment les valeurs sont regroupées (liste, addition/concaténation, moyenne, comptage, ...). A noter que les groupes doivent forcément possèder une propriété \"_id\", qui sera le discriminant, et qui peut lui aussi être un objet.\n- `$sort` fait un tri, de la même manière que la méthode `sort()` dans les requêtes simple.\n- `$lookup` permet d'aller chercher une info dans une autre collection (bonjour, associations !)\n\nLa (longue) liste complète des opérateurs : https://docs.mongodb.com/manual/reference/operator/aggregation/\n\n## Exemples sur le pokedex\n\n### Classer et compter les pokémons par type\n\n```js\ndb.pokedex.aggregate([\n    {$unwind: \"$type\"},\n    {$project: {\n        _id:0,\n        name:1,\n        type:1\n    }},\n    {$group: {\n        _id: \"$type\",\n        total: {\n            $sum:1\n        },\n        list: {\n            $push: \"$name\"\n        }\n    }},\n    {$sort:{\n        total:-1\n    }}\n]);\n```\n\nExplications du pipeline : \n- étape 1, $unwind : on \"déroule\" la liste \"type\".\n- étape 2, $project : on ne garde que \"name\" et \"type\"\n- étape 3, $group : on crée des groupes selon le discriminant \"type\". Chaque groupe possède une propriété \"total\" (incrémenté de 1 par document dans le groupe), et une propriété \"list\" (dans laquelle on a \"push\" le nom de chaque document du groupe - et qui sera donc automatiquement un array)\n- étape 4, on tri les groupes par \"total\" decroissant.\n\n### Classer les pokémons par nombre d'évolutions\n\n```js\ndb.pokedex.aggregate([\n  {$project: {\n    _id: 0,\n    name: 1,\n    nbEvol: {\n      $cond: {\n        if: {$isArray: [\"$next_evolution\"] },\n        then: {$size: \"$next_evolution\"},\n        else: 0\n      }\n    }\n  }},\n  {\n    $sort: {nbEvol: -1}\n  }\n]);\n```\n\nExplications : \n- etape 1: projection. On garde \"name\", et on définit une propriété \"nbEvol\"\n  - on rajoute une condition, si \"next_evolution\" existe et est un array ($isArray), alors on renvoie la taille de la liste\n  - sinon, on renvoie 0\n- étape 2 : on trie par \"nbEvol\" décroissant.\n\n### Grouper les pokemon par tranches de poids\n\nLe traitement est compliqué à cause du fait que les poids sont au format str
2668ing. On est obligé de commencer par une transformation (on supprime \" kg\", et on cast en `double` - un nombre à virgule)\n\n```js\ndb.pokedex.aggregate([\n  {\n    \"$project\": {\n      _id: 0,\n      name: 1,\n      poids: {\n        $toDouble: {\n          $rtrim: {\n            input: \"$weight\",\n            chars: \" kg\"\n          }\n        }\n      }\n    } \n  },\n  {\n    $bucket: {\n      groupBy: \"$poids\",\n      boundaries: [0,10,25,50,100,150,200,300,1000],\n      default: -1,\n      output: {\n        total: {$sum: 1},\n        list: {$push: \"$name\"}\n      }\n    }\n  }\n]);\n```\n\n\n## Executer des requêtes depuis un projet Node JS\n\nAu choix, pour se connecter, on trouvera des packages npm comme :\n\n- [mongodb](https://www.npmjs.com/package/mongodb) pour se connecter et envoyer nos requêtes construites à la main\n- [mongoose](https://www.npmjs.com/package/mongoose) qui est un ODM (object-document mapping) qui permet de structurer nos documents\n\n### Connexion à MongoDB depuis Express\n\n* le port par défaut de MongoDB est 27017\n* on utilise des méthodes asynchrones pour interagir avec la BDD\n* \n```js\n// on importe un constructeur de client\nimport { MongoClient } from 'mongodb';\n\n// 127.0.0.1 = localhost, 27017 = port mongodb par défaut\nconst url = 'mongodb://127.0.0.1:27017'; \n// on crée un objet représentant la connexion au serveur mongo\nconst client = new MongoClient(url);\n\n// on attend que la connexion se fasse\nawait client.connect();\n\n// ensuite on peut cibler une database\nconst db = client.db('mydatabase');\n// sur cette database on peut cibler une collection\nconst pokedexCollection = db.collection('mycollection');\n```\n\n```js\nimport { MongoClient } from \"mongodb\";\n\nconst uri = \"mongodb://localhost:27017\";\nexport const client = new MongoClient(uri);\n\nexport async function initDb() {\n  try {\n    await client.connect();\n    console.log(\"Connected to MongoDB\");\n  } catch (err) {\n    console.error(err);\n  }\n}\n```\n## Opérations CRUD\n\n```js\nimport express from \"express\";\nconst app = express();\n\napp.use(express.json());\n\nimport { client, initDb } from \"./config/db.js\";\nimport { ObjectId } from \"mongodb\";\n\n// On lance la connexion à l'instance MongoDB\ninitDb();\n\n// On se positionne sur la bonne base de données\nconst db = client.db(\"mongotests\");\n\napp.post(\"/users\", async (req, res) => {\n  const { email, password } = req.body;\n\n  // Ici on devrait hasher le mot de passe\n\n  const result = await db.collection(\"users\").insertOne({ email, password });\n\n  console.log(result);\n\n  res.status(201).json(result);\n});\n\napp.get(\"/users\", async (req, res) => {\n  // Ici on doit utiliser `toArray` pour formater la réponse de la BDD correctement\n  const users = await db.collection(\"users\").find().toArray();\n\n  console.log(users);\n\n  res.status(200).json(users);\n});\n\napp.get(\"/users/:id\", async (req, res) => {\n  const { id } = req.params;\n\n  // /!\\ Subtilité : on doit passer par la classe `ObjectId` pour envoyer correctement l'id de l'élément recherché\n  const user = await db.collection(\"users\").findOne({ _id: new ObjectId(id) });\n\n  console.log(user);\n\n  res.status(200).json(user);\n});\n\napp.put(\"/users/:id\", async (req, res) => {\n  const { id } = req.params;\n  const { email, password } = req.body;\n\n  const result = await db\n    .collection(\"users\")\n    .updateOne({ _id: new ObjectId(id) }, { $set: { email, password } });\n\n  console.log(result);\n\n  res.status(200).json(result);\n});\n\napp.delete(\"/users/:id\", async (req, res) => {\n  const { id } = req.params;\n\n  const result = await db\n    .collection(\"users\")\n    .deleteOne({ _id: new ObjectId(id) });\n\n  console.log(result);\n\n  res.status(200).json(result);\n});\n\napp.listen(3000, () => {\n  console.log(\"Listening on port 3000\");\n});\n```\n\n### Validation de données\n\nVu que MongoDB ne vérifie pas les données qu'on lui envoie, il peut être intéressant de sécuriser cet aspect en utilisant la librairie Joi qui va nous permettre de mettre en place des schémas de validation des données saisies par l'utilisateur. Voici un exemple d'implémentation pour la route POST /users utilisée dans l'exemple précédent :\n\n```js\n/**\n * On déclare un schéma qui comprend tous les critères à respecter\n * On veut :\n * - Un objet qui contient deux propriétés : email et password\n * - email doit être une chaîne de caractères, un email conforme, avec des options paramétrables\n * - password doit être une chaîne de caractères et doit respecter une expression régulière spécifiée\n *\n * Parcourir la doc pour voir toutes les options possibles : https://joi.dev/api/?v=17.13.0\n */\nconst schema = Joi.object({\n  email: Joi.string().email({\n    minDomainSegments: 2,\n    tlds: { allow: [\"com\", \"fr\"] },\n  }),\n  password: Joi.string().pattern(new RegExp(\"^[a-zA-Z0-9]{3,30}$\")),\n});\n\n// On vérifie la validité des données dans un bloc try/catch.\ntry {\n  await schema.validateAsync({ email, password });\n} catch (err) {\n  return res.status(403).json(err);\n}\n```","type":"text/markdown","title":"$:/code/mongodb/queries","tags":"","modified":"20240823122927711"},
2669{"created":"20240822091417737","text":"* Voir documentation du package mongodb de node.js nécessaire : [[https://www.npmjs.com/package/mongodb]]\n\nExemple de fic
2669hier javascript `/app/config/db.js` pour une connexion en tant qu'admin admin.\n\n\n\n```js\nimport { MongoClient } from \"mongodb\";\nimport * as dotenv from \"dotenv\";\ndotenv.config();\nconst portmd = process.env.PORTMD;\n\nconst uri = `mongodb://localhost:${portmd}`;\n// Création  du client de connexion\nexport const client = new MongoClient(uri);\n\n// Création d'une instance de connexion\nexport async function initDb() {\n    try {\n        await client.connect();\n\n        console.log(\"Connected to MongoDB\");\n\n    } catch (err) {\n        console.error(err);\n    }\n}\n\n\nexport default client;\n```\nLes methodes sont à importer par la suite avec : `import { client, initDb } from \"../config/db.js\";`\n\n* Exemple de requêtes MongoDB de test.\n\n\n\n```js\n\n\n// const { MongoClient } = require(\"mongodb\");\nimport { MongoClient } from \"mongodb\";\nconst client = new MongoClient(\"mongodb://localhost:27017\");\n\n\nasync function main() {\n  // On se connecte au client mongoDB\n  await client.connect();\n  // On récupère la base de données nommée \"pokemon\"\n  const db = client.db(\"pokemon\");\n  // On récupère la collection (c'est l'equivalent d'une table avec postgres) nommée \"pokedex\"\n  const pokedex = db.collection(\"pokedex\");\n\n  const pokemons = await pokedex.find({})\n    .project({ name: 1, _id: 0 })\n    .sort({ name: 1 })\n    .limit(3)\n    .toArray();\n\n  console.log(pokemons); // On affiche le nom des 3 premiers pokemons triés par ordre alphabétique !\n}\n\nmain();\n\n\nasync function exo1() {\n  // Trouver toutes les infos du Pokémon nommé Doduo (et les console.log)\n\n}\nexo1();\n\nasync function exo2() {\n  // Trouver le nom et les types des 5 premiers Pokémons (par ordre alphabétique) qui ont exactement 2 types\n}\nexo2();\n\nasync function exo3() {\n  // Trouver les Pokémons avec deux 'E' consécutifs dans le nom (exemple : Goldeen) (astuce : Regex)\n}\nexo3();\n\nasync function exo4() {\n  // Trouver le nom des Pokémons qui sont une évolution finale (exemple : Alakazam, car évolution de Kadabra > Abra) \n  // Astuce : il a un prev_evolution mais PAS de next_evolution\n}\nexo4();\n\nasync function exo5() {\n  // Récupérer la liste de tous les types (sans doublons) par ordre alphabétiques (avec par exemple une aggregation)\n}\nexo5();\n\n```","tags":"","title":"$:/code/node.js/mongodb/db.js","modified":"20240823093124380","type":"text/markdown"},
2670{"created":"20240705160710459","text":"* Exemple avec express, express-session, ejs, dotenv, bcrypt\n\n```json\n\n{\n  \"name\": \"Trip-Georgie-Advisor\",\n  \"version\": \"0.0.1\",\n  \"description\": \"Carnet de voyage en géorgie\",\n  \"main\": \"index.js\",\n  \"type\": \"module\",\n  \"scripts\": {\n    \"start\": \"node index\",\n    \"dev\": \"node-dev index --clear --notify=false\"\n  },\n  \"keywords\": [],\n  \"author\": \"lodbigdata\",\n  \"license\": \"ISC\",\n  \"dependencies\": {\n    \"bcrypt\": \"^5.1.1\",\n    \"dotenv\": \"^16.0.3\",\n    \"ejs\": \"^3.1.8\",\n    \"express\": \"^4.18.2\",\n    \"express-session\": \"^1.18.0\",\n    \"validator\": \"^13.9.0\",\n  },\n  \"devDependencies\": {\n    \"node-dev\": \"^8.0.0\"\n  }\n}\n\n```\n* Exemple avec parcel et react\n\n\n```json\n{\n  \"devDependencies\": {\n    \"@parcel/transformer-sass\": \"^2.10.0\",\n    \"parcel\": \"^2.9.3\",\n    \"parcel-reporter-static-files-copy\": \"^1.5.0\",\n    \"process\": \"^0.11.10\"\n  },\n  \"dependencies\": {\n    \"react\": \"^18.2.0\",\n    \"react-dom\": \"^18.2.0\"\n  },\n  \"scripts\": {\n    \"start\": \"parcel src/index.html\",\n    \"build\": \"parcel build src/index.html\",\n    \"clear\": \"rd -r dist /S /Q; rd -r .parcel-cache /S /Q;\"\n  },\n  \"name\": \"e06-atelier\",\n  \"description\": \"O'Games est un site qui liste des jeux vidéos. On \\r - Changer la structure d'une réception de tableau avec .map\\r   - Afficher en premier les favoris de l'utilisateur\\r   - Si aucune image disponible pour le film, afficher une image par défaut \\\"no-image.png\\\"\\r   - Si une note existe, afficher la note, sinon afficher \\\"Pas encore noté\\\"\\r   - Si l'utilisateur a déjà noté le film:\\r     - Afficher la note de l'utilisateur\\r     - \\r   - Dans le .map ajouter une vue conditionnelle\\r   - Ajouter une classe conditionnelle dans le .map\",\n  \"version\": \"1.0.0\",\n  \"keywords\": [],\n  \"author\": \"\",\n  \"license\": \"ISC\"\n}\n","tags":"","title":"$:/code/node.js/package.json","modified":"20240917114948910","type":"text/markdown"},
2671{"created":"20240530120659761","text":"","tags":"","title":"$:/code/operateurs","modified":"20240804120223444"},
2672{"created":"20241015092310228","text":"Les bases de PHP\n---\n\n[[https://o-syntaxe.surge.sh/]]\n\nla commande `php -S localhost:8000`. Cette c
2672ommande démarre un serveur de développement intégré à PHP sur le port 8000 de ta machine locale.\n\n\nPour que tout se passe bien :\n\n* Le moteur PHP doit être installé ;\n* Il faut créer un fichier avec l'extension .php ;\n* On vient placer le code PHP entre les balises `\u003C?php` et `?>` ;\n* Si un fichier contient exclusivement du PHP, on peut omettre ?>.\n\nCommentaires :\n\nAvant de commencer à écrire des instructions, on va pouvoir faire des commentaires, comme en HTML et en CSS, pour donner des indications uniquement destinées au développeur.\n\nIl y a deux types de commentaires :\n\n* Sur une ligne, avec // : tout ce qu'il y a à droite sera ignoré ;\n* Sur plusieurs lignes, avec /* et */… Comme en CSS.\n\n```php\n\u003C?php\n// Ceci est un commentaire sur une ligne\n\n/*\n    Et ça, c'est un commentaire\n    sur plusieurs lignes\n*/\n```\n\nPremière instruction\n* On ouvre le PHP avec \u003C?php ;\n* On utilise echo, une fonction PHP permettant d'afficher du texte ;\n* On écrit le message à afficher entre guillemets : 'Hello, World!' ;\n* On termine notre instruction par ;. Cela permet de délimiter chaque instruction.\n  \n```php\n\u003C?php\n// Affiche : Hello, World!\necho \"Hello, World!\";\n```\n\nInspecter une variable\nPour voir ce qu'il y a dans une variable, on peut utiliser la fonction var_dump.\n\n```php\n\u003C?php\n$age = 32;\n$prenom = \"Lucie\";\n\n/* Affiche le type de donnée et le contenu */\n// String(5) Lucie = une string de 5 caractères de long, \"Lucie\"\nvar_dump($prenom);\n\n// Int(32) = un nombre entier, 32\nvar_dump($age);\n```\n\n## Utiliser PHP sur Ubuntu\n\n### PHP CLI (command line interface)\n\n#### Installation\n\nOn oublie pas de mettre à jour sa machine, avant : \n\n```bash\nsudo apt update\nsudo apt upgrade\n```\n\nOn met à jour l'adresse du dépôt qui contient les paquets pour installer PHP : \n\n```bash\nsudo apt install software-properties-common\nsudo add-apt-repository ppa:ondrej/php\nsudo apt update\n```\n\nOn installe enfin PHP ! On peut préciser la version désirée : \n\n```bash\nsudo apt install php8.3\n```\n\nPour vérifier la version : \n\n```bash\nphp -v\n```\n\nPour installer une extension de PHP, on fera attention au numéro de version de php !\n\n```bash\nsudo apt install php8.3-extension_name\n```\n\nSi vous souhaitez changer la version de PHP, après en avoir installé une autre, utilisez cette commande : \n\n``` bash\n sudo update-alternatives --config php\n```\n\n#### Développement\n\n\nOn peut utiliser directement PHP dans le terminal avec la commande `php -a`, en lui demandant d'exécuter du code, un peu comme dans la console JS du navigateur.\n\nOn peut aussi exécuter un fichier de code PHP. Le résultat s'affichera donc diretement dans le terminal.\n\n```bash\nphp index.php\n```\n\nPHP CLI possède aussi un serveur de développement de base. Pour le lancer, il suffira de taper cette commande dans le répertoire du projet : \n\n```bash\nphp -S localhost:8000\n```\n➡️ *pour en savoir plus : [documentation php.net](https://www.php.net/manual/en/features.commandline.webserver.php)*\n\n##### Lancement en local : \n```php -S localhost:8082```\n\n### PHP pour APACHE2\n\n#### Installation\n\n```bash \nsudo apt install libapache2-mod-php\n```\n\n#### Développement\n\nOn développera directement dans le répertoire dédié de Apache2 : `/var/www/html`.\n\nLes fichiers avec l'extension `.php` seront automatiquement interprêtés avant d'être servis par Apache2, contrairement aux fichiers CSS, HTML, JS etc...\n\nPar défaut, on aura accès à notre site via l'url : http://localhost:80\n\n","tags":"$:/code/php","title":"$:/code/php","modified":"20241018082933437","type":"text/markdown","icon":"$:/img/ico/php.svg"},
2673{"created":"20241015115020212","text":"Les boucles\n---\n\n### while\n\nJavaScript\n```js\n// initialisation de la variable i\nlet i = 1;\n\n// exécution de la boucle\n// tant que la condition est vrai\nwhile (i \u003C= 10) {\n  console.log(i);\n  i++;\n}\n```\n\nPHP\n\n```php\n\u003C?php\n// initialisation de la variable $i\n$i = 1;\n\n// exécution de la boucle\n// tant que la condition est vrai\nwhile ($i \u003C= 10) {\n    echo \"$i\\n\";\n    $i++;\n}\n```\n\nJavaScript\n\n```js\n// l'instruction for est décomposée\n// en 3 parties séparées par un ;\n// 1ere partie : initialisation\n// 2e partie : condition de réalisation de la boucle\n// 3e partie : instruction exécutée après chaque\n// itéraction de la boucle\nfor (let i = 1; i \u003C= 10;
2673 i++) {\n  console.log(i);\n}\n```\n\nPHP\n\n```php\n\u003C?php\n// l'instruction for est décomposée\n// en 3 parties séparées par un ;\n// 1ere partie : initialisation\n// 2e partie : condition de réalisation de la boucle\n// 3e partie : instruction exécutée après chaque\n// itéraction de la boucle\nfor ($i = 1; $i \u003C= 10; $i++) {\n    echo $i;\n}\n```\n\n### do while\n\nJavaScript\n```js\n// initialisation de la variable i\nlet i = 5;\n\n// exécution de la boucle au minimum\n// une fois même si la condition est\n// fausse\ndo {\n  console.log(i);\n  i++;\n} while (i \u003C 9);\n// condition pour executer la prochaine\n// itération de la boucle\n```\n\nPHP\n\n```php\n\u003C?php\n// initialisation de la variable $i\n$i = 5;\n\n// exécution de la boucle au minimum\n// une fois même si la condition est\n// fausse\ndo {\n    echo $i;\n    $i++;\n} while ($i \u003C 9); \n// condition pour executer la prochaine\n// itération de la boucle\nfor\n```\n\n### foreach\n\nL'utilisation de foreach implique d'avoir un tableau pour faire cette boucle.\n\nJavaScript\n\n```js\nconst tableau = [\n  'bleu',\n  'vert',\n  'rouge',\n];\n\nconst tableauAssoc = {\n  prenom: 'Nicolas',\n  age: 43,\n  codePostal: '44220',\n};\n\n// forEach prend une fonction de callback comme paramètre\n// pour récupérer chaque élement du tableau\ntableau.forEach((element) => {\n  console.log(element);\n});\n\n// avec une fonction fléchée\ntableau.forEach((element) => {\n  console.log(element);\n});\n\n// ou on peut boucler juste sur les valeurs\nfor (const value of tableau) {\n  console.log(value); // \"bleu\" puis \"vert\" puis \"rouge\" etc.\n}\n\n// ou on peut boucler juste sur les clés\nfor (const key in tableau) {\n  console.log(key); // 0 puis 1 puis 2 etc.\n}\n// marche aussi pour un tableau associatif\nfor (const key in tableauAssoc) {\n  console.log(key, tableauAssoc[key]);\n}\n```\n\nPHP\n\n```php\n\u003C?php\n$tableau = [\n    \"prenom\" => \"Nicolas\",\n    \"age\" => 43,\n    \"code_postal\" => \"44220\"\n];\n\n\nforeach ($tableau as $valeur){\n    // affichage des différentes valeurs\n    echo \"$valeur\\n\";\n}\n\n\nforeach ($tableau as $clef => $valeur){\n    // affichage des différentes valeurs\n    echo \"$clef : $valeur\\n\";\n}\n```\n\n### switch\n\nJavaScript\n```js\n// initialisation de la variable i\nconst i = 1;\n\nswitch (i) {\n  case 0:\n    console.log('i égal 0');\n    break;\n  case 1:\n    console.log('i égal 1');\n    break;\n  case 2:\n    console.log('i égal 2');\n    break;\n}\n\n// chaque cas doit se terminer avec break;\n```js\n\nPHP\n\n```php\n\u003C?php\n// initialisation de la variable $i\n$i = 1;\n\nswitch ($i) {\n    case 0:\n        echo \"i égal 0\";\n        break;\n    case 1:\n        echo \"i égal 1\";\n        break;\n    case 2:\n        echo \"i égal 2\";\n        break;\n}\n\n// chaque cas doit se terminer avec break;\n```\n\n","tags":"$:/code/php","title":"$:/code/php/boucles","modified":"20241015133040188","type":"text/markdown"},
2674{"created":"20241015140902568","text":"# Les classes & objets\n\n\n### Définitions\n\n* Un objet est la représentation d'une chose matérielle ou immatérielle. Il peut posséder des propriétés et des méthodes.\nLes propriétés sont des attributs de cet objet.\nLes méthodes sont des fonctions qui sont spécifiques à cet objet.\n\n* La classe est le « moule » / « template » / « modèle » de notre futur objet : la classe servira à créer notre objet.\nOn dit qu'un objet est une instance de notre classe.\n\n#### JavaScript\n\nIl est possible de créer un objet sans instancier une classe. C'est une particularité de ce langage.\n\nIl faudra donc vous habituer à déclarer des classes si vous passez sur un autre langage.\n\n#### PHP\nUn objet doit être créé par l'instanciation d'une classe.\n\nIl n'est pas possible de créer un objet sans classe.\n\nLes classes\n---\n\n#### Déclarer la classe\n\nJavaScript\n\n```js\n// Il faut mettre le mot clé class\n// avant le nom de la classe.\n// Par convention : on met la première lettre\n// de la classe en majuscule\nclass Voiture {\n\n}\n```\n\n\nPHP\n\n```php\n\u003C?php\n// Il faut mettre le mot clé class \n// avant le nom de la classe.\n// Par convention : on met la première lettre\n// de la classe en majuscule\nclass Voiture {\n    \n}\nLes propriétés de la classe\nJavaScript\nclass Voiture {\n    // Il est possible de définir une propriété\n    // sans lui mettre de valeur.\n    modele;\n\n    marque;\n\n    couleur;\n\n    // Il est possible de mettre une valeur par defaut.\n    km = 0;\n}\n```\n\nPHP\n\n```php\n\u003C?php\nclass Voiture {\n    // Il est possible de définir une propriété\n    // sans lui mettre de valeur;\n    // Il faut utiliser le mot clé \n    // public, private ou protected \n    // avant le nom de la propriété\n    // et mettre un $ avant le nom\n    public $modele;\n    public $marque;\n    public $couleur;\n\n    // il est possible de mettre une valeur par defaut\n    public $km = 0;\n}\n```\n\n### Les méthodes de la classe\n\nJavaScript\n\n```js\nclass Voiture {\n    modele;\n\n    marque;\n\n    couleur;\n\n    km = 0;\n\n    // Une méthode fonctionne comme une fonction,\n    // il est possible de mettre des paramètres.\n    // Ces paramètres peuvent être optionnels.\n    // Une méthode peut retourner une valeur\n    // avec le mot clé return.\n    avancer(nbDeMetre = 0) {\n      // vous pouvez exécuter plusieurs\n      // instructions au sein de la méthode\n\n      // convert
2674ion des mètres en Km\n      nbKm = nbDeMetre / 1000;\n\n      // on ajout le nombre de km parcourus\n      // à la propriété km de notre objet\n      this.km += nbKm;\n\n      // this fait référence à l'objet qui sera créé\n      // à partir de notre classe.\n      // this n'est pas notre classe, c'est bien l'objet.\n\n      // retourne le nombre de km de la voiture\n      return this.km;\n    }\n}\n```\n\nPHP\n\n```php\n\u003C?php\nclass Voiture {\n    public $modele;\n    public $marque;\n    public $couleur;\n    public $km = 0;\n\n    // Même si l'on parle de méthode dans une classe,\n    // on utilise le mot clé function.\n    // Une méthode fonctionne comme une fonction,\n    // il est possible de mettre des paramètres.\n    // Ces paramètres peuvent être optionnels.\n    // Une méthode peut retourner une valeur \n    // avec le mot clé return.\n    public function avancer($nbDeMetre = 0) {\n        // vous pouvez executer plusieurs \n        // instructions au sein de la méthode\n\n        // convertion des mètres en Km\n        $nbKm = $nbDeMetre / 1000;\n\n        // on ajout le nombre de km parcourus\n        // à la propriété $km de notre objet\n        $this->km += $nbKm;\n\n        // $this fait référence à l'objet qui sera créé \n        // à partir de notre classe.\n        // $this n'est pas notre classe, c'est bien l'objet.\n        // A noter que le nom de la propriété \n        // n'a plus en prefixe $ mais $this-> à la place\n\n        // retourne le nombre de km de la voiture\n        return $this->km;\n    }\n}\n```\n\n#### Le constructeur\n\nUn constructeur est une méthode de notre classe qui est automatiquement appelée lors de l'instanciation. Il est possible de mettre des paramètres sur cette méthode.\n\nJavaScript\n\n```js\nclass Voiture {\n    modele;\n\n    marque;\n\n    couleur;\n\n    km = 0;\n\n    // on peut rendre les paramètres optionnels\n    // en mettant une valeur par defaut\n    constructor(\n      modeleParam = null,\n      marquePram = null,\n      couleurParam = null,\n    ) {\n      this.modele = modeleParam;\n      this.marque = marquePram;\n      this.couleur = couleurParam;\n    }\n}\n```\n\nPHP\n\n```php\n\u003C?php\nclass Voiture {\n    public $modele;\n    public $marque;\n    public $couleur;\n    public $km = 0;\n\n    // on peut rendre les paramètres optionnels \n    // en mettant une valeur par defaut\n    public function __construct(\n        $modeleParam = null, \n        $marquePram = null, \n        $couleurParam = null)\n    {\n        $this->modele = $modeleParam;\n        $this->marque = $marquePram;\n        $this->couleur = $couleurParam;\n    }\n}\n```\n\n### Accesseurs & Mutateurs (Getter & Setter pour les intimes)\n\n* Les Accesseurs (Getter) retournent la valeur d'une propriété.\n* Les Mutateurs (Setter) permettent d'envoyer une nouvelle valeur à notre propriété. On peut faire des contrôles avant de changer la valeur de notre propriété.\nToutes les propriétés n'ont pas obligatoirement d'Accesseurs et/ou de Mutateurs.\n\nJavaScript\n```js\nclass Voiture {\n    // quand on utilise la notation get / set au sein d'une classe\n    // on ajoute par convention un _ devant le nom de nos propriétés\n    // pour les différencier de nos méthodes (getters / setters)\n    // qui porteront généralement le même nom\n    _modele;\n\n    _marque;\n\n    _couleur;\n\n    _km = 0;\n\n    // Accesseurs/Getter pour la propriété modele\n    get modele() {\n      return this._modele;\n    }\n\n    // Mutateurs/Setter pour la propriété modele :\n    set modele(modeleParam) {\n      this._modele = modeleParam;\n    }\n\n    // Mutateurs/Setter pour la propriété km :\n    set km(kmParam) {\n      // verifie que la valeur envoyer\n      // est de type numérique\n      if (!isNaN(kmParam)) {\n        this._km = kmParam;\n      }\n    }\n}\n```\n\nPHP\n\n```php\n\u003C?php\nclass Voiture {\n    public $modele;\n    public $marque;\n    public $couleur;\n    public $km = 0;
2674\n\n    // Accesseurs/Getter pour la propriété $modele\n    public function getModele() {\n        return $this->modele;\n    }\n\n    // Mutateurs/Setter pour la propriété $modele :\n    public function setModele($modeleParam) {\n        $this->modele = $modeleParam;\n    }\n\n    // Mutateurs/Setter pour la propriété $km :\n    public function setKm($kmParam) {\n        // verifie que la valeur envoyée \n        // est de type numérique\n        if (is_numeric($kmParam)) {\n            $this->km = $kmParam;\n        }\n    }\n\n    // il est possible de typer le valeur retournée\n    public function getCouleur(): string {\n        return $this->couleur;\n    }\n\n    // il est possible de typer les paramètres\n    public function setCouleur(string $couleurParam) {\n        $this->couleur = $couleurParam;\n    }\n}\n```\n\n#### Visibilité\n\nJavaScript\n\n```js\nclass Voiture {\n    // visibilité public :\n    // depuis l'extérieur et l'intérieur,\n    // cette propriété est accessible\n    // (lecture / ecriture)\n    // Il suffit de déclarer la propriété\n    modele;\n\n    // visibilité private :\n    // depuis l'extérieur, cette propriété n'est pas accessible\n    // (ni lecture / ni ecriture)\n    // depuis l'intérieur de notre objet/classe\n    // accessible grâce à this\n    // (lecture / ecriture)\n    // Il faut ajouter # devant la déclaration\n    // de la propriété\n    #marque;\n\n    #couleur;\n\n    #km = 0;\n\n    // la visibilité fonctionnement de la même manière pour\n    // les méthodes que pour les propriétés\n\n    // visibilité public :\n    // Depuis l'extérieur et l'intérieur,\n    // cette méthode est accessible.\n    avancer(nbDeMetre = 0) {\n      nbKm = this.conversionMetreEnKm(nbDeMetre);\n      this.km += nbKm;\n    }\n\n    // visibilité private :\n    // Depuis l'extérieur, cette méthode n'est pas accessible.\n    // Depuis l'intérieur de notre objet/classe\n    // accessible grâce à this.\n    #conversionMetreEnKm(nbDeMetre = 0) {\n      return nbDeMetre / 1000;\n    }\n}\n```\n\nPHP\n\n```php\n\u003C?php\nclass Voiture {\n    // depuis l'extérieur et l'intérieur,\n    // cette propriété est accessible\n    // (lecture / ecriture)\n    public $modele;\n\n    // depuis l'extérieur, cette propriété n'est pas accessible \n    // (ni lecture / ni ecriture)\n    // depuis l'intérieur de notre objet/classe \n    // accessible grâce à $this\n    // (lecture / ecriture)\n    private $marque;\n    private $couleur;\n\n    // même fonctionnement que private\n    // mais cette propriété sera également visible\n    // par les objets/classes qui hériteraient de cette classe\n    protected $km = 0;\n\n\n    \n    // la visibilité fonctionnement de la même manière pour\n    // les méthodes que pour les propriétés\n\n    // depuis l'extérieur et l'intérieur,\n    // cette méthode est accessible\n    public function avancer($nbDeMetre = 0) {\n        $nbKm = $this->conversionMetreEnKm($nbDeMetre);\n        $this->km += $nbKm;\n    }\n\n    // depuis l'extérieur, cette méthode n'est pas accessible \n    // depuis l'intérieur de notre objet/classe \n    // accessible grâce à $this\n    private function conversionMetreEnKm($nbDeMetre = 0) {\n        return $nbDeMetre / 1000;\n    }\n\n    // même fonctionnement que private\n    // mais cette méthode sera également visible\n    // par les objets/classes qui hériteraient de cette classe\n    protected function demarrer() {\n\n    }\n}\n```\n\nLes objets\n---\n\n### Création d'un objet (instanciation de la classe)\n\nJavaScript\n```js\n// création d'un n
2674ouvel objet de type Voiture\n// qui sera stocké dans notre variable $clio\nconst clio = new Voiture();\n\n// il est possible d'ajouter des arguments\n// lors de l'instanciation de notre classe\n// ils seront transmis au constructeur\n// qui les traitera\nconst polo = new Voiture('Polo', 'Volkswagen', 'Rouge');\nPHP\n\u003C?php\n// création d'un nouvel objet de type Voiture\n// qui sera stocké dans notre variable $clio\n$clio = new Voiture();\n\n// il est possible d'ajouter des arguments\n// lors de l'instanciation de notre classe\n// ils seront transmis au constructeur\n// qui les traitera\n$polo = new Voiture('Polo', 'Volkswagen', 'Rouge');\nLecture / écriture d'une propriété de notre objet\nJavaScript\nconst polo = new Voiture('Polo', 'Volkswagen', 'Rouge');\n\n// lecture de la propriété couleur de notre objet polo\n// et affectation à la variable couleurDeMaPolo\nconst couleurDeMaPolo = polo.couleur;\n\n// Ecriture de la propriété couleur de notre objet polo\npolo.couleur = \"marron\";\n\n// pour pouvoir lire et/ou ecrire sur une propriété\n// celle-ci doit-être public\n// (voir la section visibilité)\n// sinon il faut utiliser les getters / setters\n\n// si des getters / setters ont été créés dans la classe\n// avec les mots clés get / set\n// alors ils s'utilisent comme des propriétés\n// ici on appelle le getter \nconst couleurDeMaPolo = polo.couleur;\n// ici on appelle le setter\npolo.couleur = \"marron\";\n// en effet, la propriété couleur avait été renommée _couleur\n// ici on accède bien aux méthodes get et set liées à la propriété _couleur\n// donc on n'accède ni ne modifie la propriété directement\n// on passe bien par les méthodes définies dans la classe\n```\n\nPHP\n\n```php\n\u003C?php\n$polo = new Voiture('Polo', 'Volkswagen', 'Rouge');\n\n// lecture de la propriété couleur de notre objet $polo\n// et affectation à la variable $couleurDeMaPolo\n$couleurDeMaPolo = $polo->couleur;\n\n// Ecriture de la propriété couleur de notre objet $polo\n$polo->couleur = \"marron\";\n\n// pour pouvoir lire et/ou ecrire sur une propriété\n// celle-ci doit-être initialisée avec le mot clé : public\n// (voir la section visibilité)\nAppel d'une méthode de notre objet\n```\n\nJavaScript\n\n```js\nconst polo = new Voiture('Polo', 'Volkswagen', 'Rouge');\n\n// appel de notre méthode avancer de notre objet polo\n// cette méthode a été définit dans la classe Voiture\npolo.avancer(1560);\n\n// pour pouvoir appeler cette méthode\n// celle-ci doit-être public\n// (voir la section visibilité)\n```\n\nPHP\n\n```php\n\u003C?php\n$polo = new Voiture('Polo', 'Volkswagen', 'Rouge');\n\n// appel de notre méthode avancer de notre objet $polo\n// cette méthode a été définit dans la classe Voiture\n$polo->avancer(1560);\n\n// pour pouvoir appeler cette méthode\n// celle-ci doit-être initialisée avec le mot clé : public\n// (voir la section visibilité)\nExtra\nJavaScript\nclass Math {\n    // le mot clé static permet à\n    // une propriété ou une méthode\n    // d'être utilisé sans instancier la classe\n    static ageDuCapitaine = 26;\n\n    static surfaceRectangle(largeur, profondeur) {\n      return largeur * profondeur;\n    }\n\n  // les règles de visibilités s'appliquent\n  // comme pour les propriétés et méthodes \"classiques\"\n}\n\n// lecture de la propriété nombreMetre\nconsole.log(Math.ageDuCapitaine);\n\n// appel d'une méthode statique de notre classe Math\nsurface = Math.surfaceRectangle(10, 65);\nconsole.log(surface);\n```\n\nPHP\n```php\n\u003C?php\nclass Math {\n    // le mot clé static permet à \n    // une propriété ou une méthode\n    // d'être utilisé sans instancier la classe\n    public static $ageDuCapitaine = 26;\n\n    public static function surfaceRectangle($largeur, $profondeur) {\n        return $largeur * $profondeur;\n    }\n\n    // les règles de visibilités s'appliquent \n    // comme pour les propriétés et méthodes \"classiques\"\n\n    \n    // le mot clé const permet de définir \n    // une constante dans notre classe\n    // la visibilité par défaut d'une constante est public\n    // cette constante peut-être appelée comme une static\n    const PI = 3.1415926;\n\n    public function calculCirconference($rayon) {\n        return 2 * self::PI * $rayon;\n    }\n}\n\n// affichage de la valeur de PI\n// sans avoir recours à un objet\n// c'est une constante, il ne sera pas \n// possible de modifier sa valeur\necho Math::PI ;\n\n// affichage de l'age du capitaine\n// noté la présence du $ après ::\necho Math::$ageDuCapitaine;\n\n// modification de l'age du capitaine\nMath::$ageDuCapitaine = 43;\n\n// appel d'une méthode statique de notre classe Math\n$surface = Math::surfaceRectangle(10, 65);\necho $surface;\n```\n\n L'héritage\n---\n\n* Définitions\nL'héritage est un des grands principes de la programmation orientée objet. Par exemple, lorsqu'une classe est étendue, la classe enfant hérite de toutes les méthodes publiques et protégées, propriétés et constantes de la classe parente. Tant qu'une classe n'écrase pas ces méthodes, elles conservent leur fonctionnalité d'origine.\n\n### Définir et utiliser\n\nJavaScript\n\n```js\n// Définition de notre classe Utilisateur basique\nclass Utilisateur {\n    // Ces propriétés sont privées\n    #messages;\n\n    #compteActif;\n\n    constructor(id, nom, email) {\n      this.id = id;\n      this.nom = nom;\n      this.email = email;\n      this.messages = [];\n      this.compteActif = true;\n    }\n\n    // On en profite pour voir qu'on peut passer\n    // les variables par référence\n    // grâce à ça, l'objet utilisateur passé\n    // en paramètre sera réellement modifié\n    envoyerMessage(message, utilisateur) {\n      if (this.compteActif) {\n        utilisateur.recevoirMessage(message, this.nom);\n      }
2674 else {\n        let msg = 'Votre compte n\\'est pas actif. ';\n        msg += 'Vous ne pouvez pas envoyer de messages.';\n        console.log(msg);\n      }\n    }\n\n    recevoirMessage(message, nomUtilisateur) {\n      this.messages.push({\n        nomUtilisateur,\n        message,\n      });\n    }\n\n    lireMessages() {\n      for (const message of this.messages) {\n        console.log(`${message.nomUtilisateur} \n            : ${message.message}`);\n      }\n    }\n\n    getId() {\n      return this.id;\n    }\n}\n\n// On étend de la classe Utilisateur en ajoutant le mot clef\n// \"extends\" suivi de la classe qu'on souhaite étendre\n// La classe Admin possédera tout ce qui a été défini\n// dans la classe Utilisateur\nclass Admin extends Utilisateur {\n  // en plus de récupérer tout ce que contient\n  // la classe utilisateur\n  // on peut définir des méthodes et\n  // propriétés supplémentaires\n  // ici on a ajoute une méthode\n  // pour bannir un utilisateur\n  banUtilisateur(utilisateur) {\n    utilisateur.compteActif = false;\n  }\n}\n\n// On test en créant un utilisateur classique\nconst marcel = new Utilisateur(1, 'Marcel', '[email protected]');\n\n// Utilisateur admin\nconst admin = new Admin(2, 'Admin', '[email protected]');\n\n// marcel étant une instance de la classe Utilisateur,\n// il peut utiliser la méthode envoyerMessage()\nmarcel.envoyerMessage('Ça te dit une chocolatine ? ', admin);\n\n// L'admin étant une instance de classe Admin\n// qui étend la classe Utilisateur\n// il a aussi accès aux méthodes de la classe Utilisateur\n// plus celle qui est définie dans Admin\n\n// => \"\u003Cp>Marcel : \"Ça te dit une chocolatine ? \"\u003C/p>\nadmin.lireMessages();\nadmin.envoyerMessage('On dit pain au chocolat ! ', marcel);\nadmin.banUtilisateur(marcel);\n\n// => \"On dit pain au chocolat\"\nmarcel.lireMessages();\n// => \"Votre compte n'est pas actif.\n// Vous ne pouvez pas envoyer de messages.\"\nmarcel.envoyerMessage('Oui tu as raison. ', admin);\n```\n\nPHP\n\n```php\n\u003C?php \n// Définition de notre classe Utilisateur basique\nclass Utilisateur {\n    // tout ce qui sera private ne sera accessible \n    // QUE dans la classe qui définie la propriété\n    // donc cette classe Utilisateur\n    private $id;\n    public $nom;\n    public $email;\n    private $messages = [];\n\n    // avec protected, on rend visible \n    // la propriété ou la méthode aux classes enfantes\n    protected $compteActif = true;\n\n    public function __construct($id, $nom, $email)\n    {\n        $this->id = $id;\n        $this->nom = $nom;\n        $this->email = $email;\n    }\n\n    // on en profite pour voir qu'on peut passer \n    // les variables par référence\n    // grâce à ça, l'objet utilisateur passé \n    // en paramètre sera réellement modifié\n    public function envoyerMessage($message, \n        Utilisateur &$utilisateur) {\n        if($this->compteActif) {\n            $utilisateur->recevoirMessage($message, $this->nom);\n        } else {\n            $msg = 'Votre compte n\\'est pas actif. ';\n            $msg .= 'Vous ne pouvez pas envoyer de messages.';\n            return $msg;\n        }\n    }\n\n    public function recevoirMessage($message, $nomUtilisateur) {\n        $this->messages[] = [\n            'nomUtilisateur' => $nomUtilisateur,\n            'message' => $message\n        ];\n    }\n\n    public function lireMessages() {\n        foreach($this->messages as $message) {\n            echo \"\u003Cp>$message->nomUtilisateur : \n                $message->message \u003C/p>\"; \n        }\n    }\n\n    public function getId() {\n        return $this->id;\n    }\n}\n\n// On étend de la classe Utilisateur en ajoutant le mot clef\n// \"extends\" suivi de la classe qu'on souhaite étendre\n// La classe Admin possédera tout ce qui a été défini\n// dans la classe Utilisateur\nclass Admin extends Utilisateur {\n\n    // en plus de récupérer tout ce que contient la classe utilisateur\n    // on peut définir des méthodes et propriétés supplémentaires\n    // ici on a ajoute une méthode pour bannir un utilisateur\n    public function banUtilisateur(Utilisateur &$utilisateur) {\n        $utilisateur->compteActif = false;\n    }\n}\n\n// On test en créant un utilisateur classique\n$marcel = new Utilisateur(1, 'Marcel', '[email protected]');\n\n// Utilisateur admin\n$admin = new Admin(2, 'Admin', '[email protected]');\n\n// $marcel étant une instance de la classe Utilisateur,\n// il peut utiliser la méthode envoyerMessage()\n$marcel->envoyerMessage(\"Ça te dit une chocolatine ? \", $admin);\n\n// L'admin étant une instance de classe Admin \n// qui étend la classe Utilisateur\n// il a aussi accès aux méthodes de la classe Utilisateur\n// plus celle qui est définie dans Admin\n\n// => \"\u003Cp>Marcel : \"Ça te dit une chocolatine ? \"\u003C/p>\n$admin->lireMessages(); \n$admin->envoyerMessage(\"On dit pain au chocolat ! \", $utilisateur);\n$admin->banUtilisateur($marcel);\n```\n\nLes classes abstraites\n---\n\nUne classe abstraite ne peut pas être directement instanciée. Elle sert a regrouper des propriétés et méthodes utiles aux classes qui hériteront d'elles.\nUne classe abstraite peut contenir des méthodes abstraites. Celles-ci devront obligatoirement être implémentées par les classes enfants.\n\n### Déclarer une classe abstraite\n\nJavaScript\n```\n
2674// les classes abstraites n'existent pas nativement en JS\n```\n\nPHP\n\n```php\n\u003C?php \n// on place le mot clé abstract avant la classe\nabstract class Personnage {\n    // Le mot clé protected permet de rendre visible cette variable\n    // dans la classe enfant\n    protected $nom;\n\n    public function getNom() {\n        return $this->nom;\n    }\n\n    public function setNom($nom) {\n        $this->nom = $nom;\n    }\n\n    // Une méthode abstraite ne peut pas définir l'implémentation\n    // elle est là pour indiquée aux classes \n    // enfantes qu'elles doivent l'implémenter\n    abstract public function disBonjour();\n}\n```\n\n### Utiliser une classe abstraite\n\n\nJavaScript\n```js\n// les classes abstraites n'existent pas nativement en JS\nPHP\n\u003C?php \n// le code suivant est dépendant du code de la section précédente\n\n// On étend de la classe abstraite Personnage\nclass Magicien extends Personnage {\n\n    // On définit l'implémentation de la méthode abstraite disBonjour\n    // elle doit être public, tout comme définie dans la classe Personnage\n    public function disBonjour() {\n        if($this->nom) {\n            echo 'Bonjour, je suis ' . $this->nom . ' le Magicien !';\n        } else {\n            echo 'Bonjour, je suis le Magicien sans nom !';\n        }\n    }\n}\n\n\n// comme on a étendu la classe Personnage\n// on a accès à la propriété $nom et les méthode setNom et getNom\n$magicien = new Magicien();\n$magicien->disBonjour(); // => Bonjour, je suis le Magicien sans nom !\n\n$magicien2 = new Magicien();\n$magicien->setNom('Gandalf'); // => Bonjour, je suis Gandalf le Magicien !\n$magicien->getNom(); // => \"Gandalf\"\n$magicien->disBonjour();\n```\n\nLes interfaces\n---\n\nLes interfaces en programmation objet vous permettent de créer du code qui spécifie quelles méthodes doivent être implémentées par une classe, sans avoir à définir comment ces méthodes fonctionneront.\n\n\n#### Déclaration\n\nJavaScript\n```\n// les interfaces n'existent pas en Javascript\n// Il faut utiliser TypeScript pour cela\n```\n\nPHP\n\n```php\n\u003C?php\n// on met le mot clé interface devant le nom de l'interface\n// Par convention, comme pour une classe la première\n// lettre est en majuscule\ninterface Geometrie\n{\n    // les méthodes que devront implémenter les classes\n    // seront déclarées ici sans le code\n    // noté qu'il n'y a pas de bloc d'instruction\n    // mais directement un point-virgule\n    public function perimetre();\n    public function superfice();\n}\nImplémentation\nJavaScript\n// les interfaces n'existent pas en Javascript\n// Il faut utiliser TypeScript pour cela\n```\n\nPHP\n\n```php\n\u003C?php\n// notre classe Rond implémente l'interface Geometrie\nclass Rond implements Geometrie {\n    private $rayon;\n\n    public function __construct(float $rayonParam)\n    {\n        $this->rayon = $rayonParam;\n    }\n\n    public function perimetre() {\n        return 2 * pi() * $this->rayon;\n    }\n    public function superfice() {\n        return pi() * pow($this->rayon, 2);\n    }\n}\n\n// notre classe Rectangle implémente egalement l'interface Geometrie\nclass Rectangle implements Geometrie {\n    private $largeur;\n    private $longueur;\n\n    public function __construct(float $largeurParam, float  $longueurParam)\n    {\n        $this->largeur = $largeurParam;\n        $this->longueur = $longueurParam;\n    }\n\n    public function perimetre() {\n        return 2 * ($this->largeur + $this->longueur);\n    }\n\n    public function superfice() {\n        return $this->largeur * $this->longueur;\n    }\n}\n\n```","tags":"$:/code/php","title":"$:/code/php/classes","modified":"20241015142648440","type":"text/markdown"},
2675{"created":"20241015114201207","text":"Les conditions\nLes opérateurs de comparaison\n\n\nJavaScript\n\n```js\nconst a = 2;\nconst b = 5;\nconst c = '2';\n\nlet result;\n\n// Égalité \"==\"\nresult = a == b; // false\nresult = a == c; // true\n\n// Égalité stricte \"===\"\nresult = a === c; // false cette fois ci\n\n// Différence \"!=\"\nresult = a != b; // true\nresult = a != c; // false\n\n// Différence stricte \"!==\"\nresult = a !== c; // true\n\n// Plus petit que\nresult = a \u003C b; // true\n\n// Plus grand que\nresult = a > b; // false\n\n// Inférieur ou égal\nresult = a \u003C= b; // true\nresult = a \u003C= c; // true\n\n// Supérieur ou égal\nresult = a >= b; // false\nresult = a >= c; // true\n```\n\nPHP\n\n```php\n\u003C?php \n$a = 2;\n$b = 5;\n$c = '2';\n\n// Égalité \"==\"\n$result = $a == $b; // false\n$result = $a == $c; // true\n\n// Égalité stricte \"===\"\n$result = $a === $c; // false cette fois ci\n\n// Différence \"!=\"\n$result = $a != $b; // true\n$result = $a != $c; // false\n\n// Différence stricte \"!==\"\n$result = $a !== $c; // true\n\n// Plus petit que \n$result = $a \u003C $b; // true\n\n// Plus grand que \n$result = $a > $b; // false\n\n// Inférieur ou égal\n$result = $a \u003C= $b; // true\n$result = $a \u003C= $c; // true\n\n// Supérieur ou égal\n$result = $a >= $b; // false\n$result = $a >= $c; // true\n```\n\nLes conditions\n\nJavaScript\n```js\nconst age = 20;\nconst ageMinimum = 18;\n\n// cette variable va changer, on pense bien à la définir avec \"let\"\nlet sentence = '';\n\n// SI\nif (age > ageMinimum) {\n  sentence = 'Tu peux voter.';\n}\n// SINON SI\n// dans certains langages on peut écrire \"elseif\",\n// ce n'est pas possible en JavaScript\nelse if (age === ageMinimum) {\n  sentence = 'Tu as tout juste le droit de voter !';\n}\n// SINON\nelse {\n  sentence = 'Tu ne peux pas voter.';\n}\n\n// va afficher \"Tu peux voter.\"\n// car age (20) est strictement supérieur à ageMinimum (18).\nconsole.log(sentence);\n\n// Vu que dans l'exemple ci-dessus, il n'y a qu'une instruction par bloc de code {}\n// on pourrait omettre les accolades et écrire la condition sous cette forme :\nif (age > ageMinimum) sentence = 'Tu peux voter.';\nelse if (age === ageMinimum) sentence = 'Tu as tout juste le droit de voter !';\nelse sentence = 'Tu ne peux pas voter.';\n```\n\nPHP\n```php\n\u003C?php \n$age = 20;\n$ageMinimum = 18;\n$sentence = '';\n\nif ($age > $ageMinimum) {\n    $sentence = 'Tu peux voter';\n// on peut écrire \"else if\" ou \"elseif\"\n} else if ($age === $ageMinimum) {\n    $sentence = 'Tu as tout juste le droit de voter !';\n} else {\n    $sentence = 'Tu ne peux pas voter';\n}\n```","tags":"$:/code/php","title":"$:/code/php/conditions","modified":"20241015120611968","type":"text/markdown"},
2676{"created":"20241015114851936","text":"Les exceptions\n---\n\n### Implémentation\n\nJavaScript\n\n```js\nfunction inverse(x) {\n  if (!x) {\n    // déclenchement d'une exception en cas\n    // de division par 0\n    throw 'Division par zéro.';\n  }\n  return 1 / x;\n}\n\ntry {\n  // cette ligne est executée\n  console.log(inverse(5));\n\n  // cette ligne va lever une exception\n  console.log(inverse(0));
2676\n\n  // cette ligne ne sera pas executée suite\n  // à l'exception levée à la ligne précédente\n  console.log(inverse(10));\n} catch (error) {\n  console.error(error);\n}\n\n// Continue l'exécution\nconsole.log('Bonjour le monde !');\n```\n\nPHP\n\n```php\n\u003C?php\nfunction inverse($x)\n{\n    if (!$x) {\n        // déclenchement d'une exception en cas\n        // de division par 0\n        throw new Exception('Division par zéro.');\n    }\n    return 1 / $x;\n}\n\ntry {\n    // cette ligne est executée\n    echo inverse(5) . \"\\n\";\n\n    // cette ligne va lever une exception\n    echo inverse(0) . \"\\n\";\n\n    // cette ligne ne sera pas executée suite\n    // à l'exception levée à la ligne précédente\n    echo inverse(10) . \"\\n\";\n    \n} catch (Exception $e) {\n    echo 'Exception reçue : ',  $e->getMessage(), \"\\n\";\n}\n\n// Continue l'exécution\necho \"Bonjour le monde !\\n\";\n```","tags":"$:/code/php","title":"$:/code/php/exception","modified":"20241015133345137","type":"text/markdown"},
2677{"created":"20241015114541755","text":"Déclaration d'une fonction\n---\n\nJavaScript\n```js\n// Le mot clé function indique la déclaration\n// de la fonction nommée addition.\n// Cette fonction a 2 paramètres.\n// Les instructions de la fonction sont entre les 2 accolades.\n// Le mot clé return permet de retourner une valeur \n// suite à l'exécution de la fonction\nfunction addition(premierTerme, deuxiemeTerme) {\n    const resultAddition = premierTerme + deuxiemeTerme;\n    return resultAddition;\n}\n\n// voici une deuxième façon de créer une fonction\n// on appele ça une expression de fonction fléchée (arrow function)\nconst addition = (premierTerme, deuxiemeTerme) => {\n    const resultAddition = premierTerme + deuxiemeTerme;\n    return resultAddition;\n}\n```\n\nPHP\n\n```php\n\u003C?php\n// Le mot clé function indique la déclaration\n// de la fonction nommée addition.\n// Cette fonction a 2 paramètres.\n// Les instructions de la fonction sont entre les 2 accolades.\n// Le mot clé return permet de retourner une valeur \n// suite à l'exécution de la fonction\nfunction addition($premierTerme, $deuxiemeTerme) {\n    $resultAddition = $premierTerme + $deuxiemeTerme;\n    return $resultAddition;\n}\n```\n\nUtiliser la fonction\n\nJavaScript\n```js\n// appel de la fonction addition\n// et on stocke la valeur retournée\n// par la fonction dans la variable resultAddition\nconst resultAddition = addition(2, 5);\n\n// affichage du resultat\nconsole.log(resultAddition);\n```\n\nPHP\n```js\n\u003C?php\n// appel de la fonction addition\n// et on stocke la valeur retournée \n// par la fonction dans la variable $resultAddition\n$resultAddition = addition(2, 5);\n\n// affichage du resultat\necho $resultAddition;\n```\n\nParamètre(s) optionnel(s) sur la fonction\n---\n\nJavaScript\n```js\n// Le 2e paramètre n'est plus obligatoire.\n// Lors de l'appel de la fonction sans valeur \n// pour ce 2e paramètre ce sera la valeur \n// par defaut qui sera utiliser. \n// Cette valeur par défaut est définie \n// après le signe =\n// Dans notre exemple, ça sera la valeur 0\nfunction addition(premierTerme, deuxiemeTerme = 0) {\n    return premierTerme + deuxiemeTerme;\n}\nconsole.log(addition(6)); // affiche 6\nconsole.log(addition(6, 2)); // affiche 8\n\n// une fonction peut avoir plusieurs paramètres optionnels\n// on modifie notre function pour ajouter un 3e paramètre\nfunction addition(premierTerme, \n        deuxiemeTerme = 0, \n        troisiemeTerme = 0) {\n    return premierTerme + deuxiemeTerme + troisiemeTerme;\n}\nconsole.log(addition(6)); // affiche 6\nconsole.log(addition(6, 2)); // affiche 8\nconsole.log(addition(6, 2, 1)); // affiche 9\n```\n\nPHP\n\n```php\n\u003C?php\n// Le 2e paramètre n'est plus obligatoire.\n// Lors de l'appel de la fonction sans valeur \n// pour ce 2e paramètre ce sera la valeur \n// par defaut qui sera utiliser. \n// Cette valeur par défaut est définie \n// après le signe =\n// Dans notre exemple, ça sera la valeur 0\nfunction addition($premierTerme, $deuxiemeTerme = 0) {\n    return $premierTerme + $deuxiemeTerme;\n}\necho addition(6); // affiche 6\necho addition(6, 2); // affiche 8\n\n// une fonction peut avoir plusieurs paramètres optionnels\n// on modifie notre function pour ajouter un 3e paramètre\nfunction addition($premierTerme, \n        $deuxiemeTerme = 0, \n        $troisiemeTerme = 0) {\n    return $premierTerme + $deuxiemeTerme + $troisiemeTerme;\n}\necho addition(6); // affiche 6\necho addition(6, 2); // affiche 8\necho addition(6, 2, 1); // affiche 9\n```\n\nTypage sur la fonction\n---\n\nJavaScript\n```\n
2677// Javascript ne permet pas le typage.\n```\n\nPHP\n```php\n\u003C?php\n// Pour les paramètres, il faut indiquer les types \n// avant la définition de la variable.\n// Le type de la valeur est indiqué après les paramètres\n// en ajoutant deux-point et le type après la paranthèse\n// fermante de définition des paramètres\n// Information :\n// https://www.php.net/manual/fr/language.types.declarations.php\nfunction addition(float $premierTerme, float $deuxiemeTerme): float {\n    $resultAddition = $premierTerme + $deuxiemeTerme;\n    return $resultAddition;\n}\n```\n","tags":"$:/code/php","title":"$:/code/php/fonctions","modified":"20241015140423219","type":"text/markdown"},
2678{"created":"20241015134836576","text":"Les opérations arithmétiques\n---\n\nLes opérateurs arithmétiques sont pratiquement toujours les mêmes.\n\nJavaScript\n\n```js\n// On définit les deux nombres nécessaires pour les calculs\nconst number1 = 10;\nconst number2 = 4;\n\n// addition\nconst resultAdd = number1 + number2;\n\n// soustraction\nconst resultSubstraction = number1 - number2;\n\n// division\nconst resultDivision = number1 / number2;\n\n// multiplication\nconst resultMultiplication = number1 * number2;\n\n// modulo\nconst resultModulo = number1 % number2;\n\n// exposant\nconst resultExponent = number1 ** number2;\n```\n\nPHP\n\n```php\n\u003C?php\n// On définit les deux nombres nécessaires pour les calculs\n$number1 = 10;\n$number2 = 4;\n\n// addition\n$resultAdd = $number1 + $number2;\n\n// soustraction\n$resultSubstraction = $number1 - $number2;\n\n// division\n$resultDivision = $number1 / $number2;\n\n// multiplication\n$resultMultiplication = $number1 * $number2;\n\n// modulo\n$resultModulo = $number1 % $number2;\n\n// exposant\n$resultExponent = $number1 ** $number2;\n```","tags":"$:/code/php","title":"$:/code/php/operations","modified":"20241015134942700","type":"text/markdown"},
2679{"created":"20241015133643159","text":"Les chaines de caractères\n---\n\nJavaScript\n\n```js\n// initialisation d'une variable de type chaine de caractères\n// la chaîne est encadrée par un double quote\nlet userName = \"John\";\n\n// il est également possible d'ouvrir et fermer \n// une chaine avec un simple quote\nlet userName = 'John';\n\n// mais aussi plus récemment avec le backtick\n// qui permet d'ailleurs d'insérer plusieurs lignes\nlet userName = `John`;\nlet someText = `Blablabla\nBlablabla\nBlablabla`;\n\n// l'ouverture et la fermeture doivent être faites \n// avec le même symbole\n// soit un simple quote, un double quote ou un backtick\n\n// envoi d'une chaîne dans la console\nconsole.log(\"Bonjour\");\n```\n\nPHP\n\n```php\n\u003C?php\n// initialisation d'une variable de type chaine de caractères\n// la chaîne est encadrée par un double quote\n$userName = \"John\";\n\n// il est également possible d'ouvrir et fermer \n// une chaine avec un simple quote\n$userName = 'John';\n\n// l'ouverture et la fermeture doivent être faites \n// avec le même symbole\n// soit un simple quote ou un double quote\n\n// envoi d'une chaine de caractères vers le client\necho \"Bonjour\" ;\n// 2e possibilité\nprint \"Bonjour\" ;\n```\n\n### Concaténation\n\nLa concaténation de deux chaînes de caractères consiste à les mettre bout à bout pour en former une nouvelle.\n\nJavaScript\n```js\n// initialisation d'une première variable\nlet userName = 'John';\n\n// Initialisation d'une 2e variable avec concatenation\n// de la chaine \"Bonjour \" et de la première variable.\n// L'opérateur de concatenation est le plus\nconst welcomeString = `Bonjour ${userName}`;\n\n// opérateur de concaténation et affectation\nuserName += ' Doe';\n\n// affiche : John Doe\nconsole.log(userName);\n```\n\nPHP\n\n```php\n\u003C?php\n// initialisation d'une première variable\n$userName = \"John\";\n\n// initialisation d'une 2e variable avec concatenation\n// de la chaine \"Bonjour \" et de la première variable\n// l'opérateur de concatenation est le point\n$welcomeString = \"Bonjour \" . $userName;\n\n// en PHP, il est possible de mettre une variable \n// à l'intérieur d'une chaine de caractère \n// sous reserve que cette chaîne soit encadré \n// de double quote\n$welcomeStr
2679ing = \"Bonjour $userName\";\n\n// pour lever une ambiguïté par rapport au symbole $\n// on peut ajouter des accolades\n$welcomeString = \"Bonjour {$userName}\";\n\n// opérateur de concaténation et affectation\n$userName .= \" Doe\";\n\n// affiche : John Doe\necho $userName;\n```\n\n### Échappement des caractères\n\nJavaScript\n\n```js\n// Je veux afficher des ' alors j'utilise des \" pour créer ma string\n// Affiche : Il m'a dit que j'étais balèze !\nconsole.log(\"Il m'a dit que j'étais balèze !\");\n\n// Je veux afficher des \" alors j'utilise des ' pour créer ma string\n// Affiche : Je suis \"balèze\" !\nconsole.log('Je suis \"balèze\" !');\n\n// Je veux les deux ! Pas le choix, je dois échapper.\n// Affiche : Il m'a dit que j'étais \"balèze\" !\nconsole.log(\"Il m'a dit que j'étais \\\"balèze\\\" !\");\n\n// On aurait pu échapper les '\nconsole.log('Il m\\'a dit que j\\'étais \"balèze\" !');\n\n// pour éviter de se prendre la tête avec l'échappement des quotes\n// on peut choisir de délimiter sa chaine de caractères avec les backticks !\nconsole.log('Il m\\'a dit que j\\'étais \"balèze\" !');\n```\n\nPHP\n\n```php\n\u003C?php\n// Je veux afficher des ' alors j'utilise des \" pour créer ma string\n// Affiche : Il m'a dit que j'étais balèze !\necho \"Il m'a dit que j'étais balèze !\";\n\n// Je veux afficher des \" alors j'utilise des ' pour créer ma string\n// Affiche : Je suis \"balèze\" !\necho 'Je suis \"balèze\" !';\n\n// Je veux les deux ! Pas le choix, je dois échapper.\n// Affiche : Il m'a dit que j'étais \"balèze\" !\necho \"Il m'a dit que j'étais \\\"balèze\\\" !\";\n\n// On aurait pu échapper les '\necho 'Il m\\'a dit que j\\'étais \"balèze\" !';\n```\n\n","tags":"$:/code/php","title":"$:/code/php/string","modified":"20241015134427464","type":"text/markdown"},
2680{"created":"20241015120154540","text":"Les tableaux\n---\n\n### Les tableaux indexés\n\nJavaScript\n\n```js\n// Définition du tableau\n// les tableaux commencent à l'index 0\nconst array = [\n  'b', // index 0\n  'c', // 1\n  'd', // 2\n  'e', // 3\n];\n\n// Utilisation du tableau\n// Lecture du deuxième élément du tableau\n
2680array[1]; // c\n\n// Ajout d'un élément à la fin du tableau\narray.push('f');\n\n// Suppression d'un élément\narray.splice(3, 1); // supprime \"e\"\n\n// Ajout d'un élément au début du tableau\narray.unshift('a');\n```\n\nPHP\n\n```php\n\u003C?php \n// Définition du tableau\n// les tableaux commencent à l'index 0\n$array = [\n    'b', // index 0\n    'c', // 1\n    'd', // 2\n    'e'  // 3\n];\n\n// Lecture du deuxième élément du tableau\n$array[1]; // c\n\n// Ajout d'un élément à la fin du tableau\n$array[] = 'f';\n// ou\narray_push($array, 'f');\n\n// Suppression d'un élément\nunset($array[3]); // supprime \"e\"\n\n// Ajout d'un élément au début du tableau\narray_unshift($array, 'a');\n```\n\n### Les tableaux associatifs\n\nJavaScript\n\n```js\n// Définition du tableau associatif\n// C'est en réalité un objet, nous verrons ça dans les prochaines sections\nconst post = {\n  title: 'Le JS, un langage côté client et serveur',\n  // Cette notation est possible, mais on évite de le faire,\n  // on préferera le camelCase: subTitle\n  'sub-title': 'Sous-titre',\n  content: 'Le JS est un langage [...]',\n  year: 2022,\n};\n\n// Utilisation du tableau associatif (objet)\n// Lecture d'un élément\npost.title;\n// Cette alternative est utilisée si la clé\n// possède un caractère spécial\npost['sub-title'];\n\n// Ajout d'un élément\npost.author = 'Chuck';\n\n// Suppression d'un élément\ndelete post.year;\n```\n\nPHP\n\n```php\n\u003C?php \n// Définition du tableau\n$post = [\n    'title'   => \"Le PHP, un langage côté serveur\",\n    'content' => \"Le php est un langage [...]\" ,\n    'year'    => 2022\n];\n\n// Lecture d'un élément du tableau\n$post['title'];\n\n// Ajout d'un élément ayant pour clé author\n$post['author'] = 'Chuck';\n\n// Suppression d'un élément ayant pour clé year\nunset($post['year']);\n```\n\n### Les fonctions utiles\n\nJavaScript\n\n```js\n// array_unshift plus haut était déjà une fonction.\n\n// définition de 3 tableaux indexés et un associatif\nconst array = ['b', 'c', 'd', 'e' ];\nconst array2 = ['f', 'g', 'h', 'i', 'j'];\nconst array3 = ['u', 'x', 'm', 'k', 'c'];\nconst arrayAssoc = {title: 'JS', content: 'JS est un [...]'};\n\n// nombre d'élements d'un tableau\narray.length; // 4\narray2.length; // 5\n\n// fusion de deux tableaux pour constituer un nouveau tableau\nconst arrayMerged = array.concat(array2);\n// ou\nconst arrayMerged = [...array, ...array2];\n\n// vérifier si un élément est présent dans un tableau\narray.includes('f'); // false\narray.includes('c'); // true\n\n// vérifier si la variable $array est un tableau\nArray.isArray(array); // true\n// ou\narray instanceof Array; // true\n\n// récupérer les clés d'un tableau associatif\narrayAssoc.keys(); // ['title', 'content']\n\n// trier dans l'ordre croissant\n// pas besoin de stocker la valeur de retour \n// le tableau est directement modifié\narray3.sort(); // ['c', 'k', 'm', 'u', 'x']\n```\n\nPHP\n\n```php\n\u003C?php \n// array_unshift plus haut était déjà une fonction.\n\n// définition de 3 tableaux indexés et un associatif\n$array = ['b', 'c', 'd', 'e' ];\n$array2 = ['f', 'g', 'h', 'i', 'j'];\n$array3 = ['u', 'x', 'm', 'k', 'c'];\n$arrayAssoc = ['title' => 'PHP', 'content' => 'PHP est un [...]'];\n\n// nombre d'élements d'un tableau\ncount($array); // 4\ncount($array2); // 5\n\n// fusion de deux tableaux pour constituer un nouveau tableau\n$array_merged = array_merge($array, $array2);\n\n// vérifier si un élément est présent dans un tableau\nin_array('f', $array); // false\nin_array('c', $array); // true\n\n// vérifier si la variable $array est un tableau\nis_array($array); // true\n\n// récupérer les clés d'un tableau associatif\narray_keys($arrayAssoc); // ['title', 'content']\n\n// trier dans l'ordre croissant\n// pas besoin de stocker la valeur de retour\n// le tableau est passé par référence \n// il est directement modifié\nsort($array3); // ['c', 'k', 'm', 'u', 'x']\n```\n","tags":"$:/code/php","title":"$:/code/php/tableaux","modified":"20241015140830794","type":"text/markdown"},
2681{"created":"20241015113453292","text":"Les variables\n---\n\n### Initialisation d'une variable\n\n\nJavaScript\n```js\n// il faut utiliser le mot clé let\n// avant le nom de notre variable\nlet maVariable = 'Jean';\n\n// vous pouvez rencontrer parfois\n// le mot clé var\n// mais aujourd'hui, on evite de l'utiliser\nconst firstName = 'John';\n\n// la valeur de la variable peut changer en cours\n// d'exécution\n// on ne met pas le mot clé let devant\nmaVariable = 'Pierre';\n\n// la différence entre let et var concerne\n// la portée de la variable.\n// let aura une portée limité au bloc\n// d'instruction délimité par {}\n// var aura une portée globale mais peut créer\n// des effets de bord\n```\n\nPHP\n\n```php\n\u003C?php\n// une variable en PHP début toujours par le signe $\n// le nom d'une variable commence toujours par une lettre\n// jamais pas un chiffre ni un signe\n$maVariable = 'Jean' ;\n\n// la valeur de la variable peut changer en cours\n// d'exécution\n$maVariable = 'Pierre' ;\n```\n\n### Déclaration d'une constante\n\n\nLes constantes sont des valeurs qui ne pourront plus être changées après leur initialisation.\n\nJavaScript\n```js\n// il faut utiliser le mot clé const\n// avant le nom de notre variable\nconst tauxTva = 20;\n```\n\nPHP\n\n```php\n\u003C?php\n// pour déclarer une constante, on utilise define \n// avec comme 1er argument le nom de la constante\n// en 2e argument la valeur de la constante\n// voir : https://www.php.net/manual/fr/function.define.php\ndefine(\"TAUX_TVA\", 20);\n\n// par convention, la constante sont en capital \n// et les mots séparés par un \"_\"\n\n```\n\n### Le typage d'une variable\n\nJavaScript\n```js\n// En Javascript, les variables ne sont pas typées.\n// Vous pouvez vous intéresser à TypeScript\n// qui pourra être transpilé à JS.\n\n// une chaine de caractères (string)\nconst uneChaine = 'Bonjour';\n\n// un nombre entier (int)\nconst entier = 123;\n\n// nombre à virgule (float)\nconst nombreVirgule = 63.98;\n\n// booléen (boolean)\nconst valeurVrai = true;\nconst valeurFaux = false;\n```\n\nPHP\n\n```php\n\u003C?php\n// En PHP, les variables ne sont pas typées.\n// le typage est implicite.\n\n// une chaine de caractères (string)\n$uneChaine = \"Bonjour\" ;\n\n// un nombre entier (int)\n$entier = 123;\n\n// nombre à virgule (float)\n$nombreVirgule = 63.98;\n\n// booléen (boolean)\n$valeurVrai = true;\n$valeurFaux = false;\n```\n\n### Raccourcis\n\nJavaScript\n```js\ncompteur = 500;\n\n// incrémentation\ncompteur++;\n// équivalent à\n// $compteur = $compteur + 1;\n\n// Affiche : 501\nconsole.log(compteur);\n\n// décrémentation\ncompteur--;\n// équivalent à\n// $compteur = $compteur - 1;\n\n// Affiche : 500\nconsole.log(compteur);\n\n// opérateur d'addition et affectation\ncompteur += 30;\n// Affiche : 530\nconsole.log(compteur);\n\n// opérateur de sousctraction et affectation\ncompteur -= 20;\n// Affiche : 510\nconsole.log(compteur);\n\n// opérateur de multiplication et affectation\ncompteur *= 4;\n// Affiche : 2040\nconsole.log(compteur);\n\n// opérateur de multiplication et affectation\ncompteur /= 2;\n// Affiche : 1020\nconsole.log(compteur);\n```\n\nPHP\n```php\n\n\u003C?php\n$compteur = 500;\n\n// incrémentation \n$compteur++;\n// équivalent à\n// $compteur = $compteur + 1;\n\n// Affiche : 501\necho $compteur;\n\n\n// décrémentation \n$compteur--;\n// équivalent à\n// $compteur = $compteur - 1;\n\n// Affiche : 500\necho $compteur;\n\n\n// opérateur d'addition et affectation\n$compteur += 30;\n// Affiche : 530\necho $compteur;\n\n\n// opérateur de sousctraction et affectation\n$compteur -= 20;\n// Affiche : 510\necho $compteur;\n\n// opérateur de multiplication et affectation\n$compteur *= 4;\n// Affiche : 2040\necho $compteur;\n\n// opérateur de multiplication et affectation\n$compteur /= 2;\n// Affiche : 1020\necho $compteur;\n\n```\n\nLa fonction `var_dump($var)` sert à afficher des informations détaillées sur une variable, telles que son type de données et sa valeur. Elle est particulièrement utile pour le débogage, car elle fournit une vue exhaustive de la variable, y compris les valeurs des tableaux et des objets.\n\n\nLa fonction `isset($var)` vérifie si une variable est définie et non nulle. Elle renvoie true si la variable existe et n'est pas null, sinon elle renvoie false. C'est particulièrement utile pour éviter les erreurs liées aux variables non définies.\n\n\nLa fonction  `empty($var) `  sert à vérifier si une variable est vide. Elle renvoie true si la variable est considérée comme vide, et false sinon. Une variable est considérée comme vide si elle est :\n\nnull\n\nUne chaîne vide ''\n\n0 (zéro)\n\n0.0\n\nUne chaîne contenant un seul caractère zéro '0'\n\nUn tableau vide\n\nUn objet sans propriétés\n\nElle est très utile pour valider les données reçues et pour les vérifications conditionnelles.\n\n\nLa superglobale $_GET en PHP contient un tableau associatif des paramètres envoyés par l'URL lors d'une requête HTTP GET. \nEn d'autres termes, elle recueille et stocke les valeurs des paramètres passés dans l'URL, permettant ainsi d'accéder à ces données dans ton script PHP. Par exemple, si l'URL est example.com?page=2&sort=asc, tu pourras accéder à page et sort via $_GET['page'] et $_GET['sort'] respectivement.\n\nCette super globale $_GET contient : \n* Les paramètres d'url\n* les informations saisies dans un formulaire en méthode GET\n* un tableau","tags":"$:/code/php","title":"$:/code/php/variables","modified":"20241018084431416","type":"text/markdown"},
2682{"created":"20241017114333971","text":"\nFichiers utiles pour l'implentation d'un template personnalisé.\n\n\u003Cfieldset>\n\n\u003Cdetails>\n\u003Csummary>\nCréation de la page \u003Cstrong>index.php (header.php, footer.php) \u003C/strong> :\n\u003C/summary>\n\n```php\n\n\u003C?php \n// va chercher header.php\nget_header();\n\n?>\n\n\u003Ch2 class=\"right__title\">Latest News\u003C/h2>\n        \u003Cdiv class=\"posts\">\n          \u003Carticle class=\"post\">
2682\n            \u003Ca href=\"\" class=\"post__category post__category--color-team\">team\u003C/a>\n            \u003Ch3>Lorem ipsum dolor article 1\u003C/h3>\n            \u003Cdiv class=\"post__meta\">\n              \u003Cimg class=\"post__author-icon\" src=\"./wp-content/themes/onews/images/icon-dar.png\" alt=\"\">\n              \u003Cstrong class=\"post__author\">Darren Collison\u003C/strong>\n              \u003Ctime datetime=\"2018-02-10\">le 10 février 2018\u003C/time>\n            \u003C/div>\n            \u003Cp>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Pacers, perferendis, saepe.\u003C/p>\n            \u003Ca href=\"\" class=\"post__link\">Continue reading\u003C/a>\n          \u003C/article>\n          \u003Carticle class=\"post\">\n            \u003Ca href=\"\" class=\"post__category post__category--color-news\">news\u003C/a>\n            \u003Ch3>Lorem ipsum dolor article 2\u003C/h3>\n            \u003Cdiv class=\"post__meta\">\n              \u003Cimg class=\"post__author-icon\" src=\"./wp-content/themes/onews/images/icon-john.png\" alt=\"\">\n              \u003Cstrong class=\"post__author\">John Marchill\u003C/strong>\n              \u003Ctime datetime=\"2018-03-27\">le 27 mars 2018\u003C/time>\n            \u003C/div>\n            \u003Cp>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quos id impedit at quo, expedita iure, molestias error ullam distinctio vel.\u003C/p>\n            \u003Ca href=\"\" class=\"post__link\">Continue reading\u003C/a>\n          \u003C/article>\n          \u003Carticle class=\"post\">\n            \u003Ca href=\"\" class=\"post__category post__category--color-news\">news\u003C/a>\n            \u003Ch3>Lorem ipsum dolor article 3\u003C/h3>\n            \u003Cdiv class=\"post__meta\">\n              \u003Cimg class=\"post__author-icon\" src=\"./wp-content/themes/onews/images/icon-ohz.png\" alt=\"\">\n              \u003Cstrong class=\"post__author\">Olivier Hertz\u003C/strong>\n              \u003Ctime datetime=\"2018-05-05\">le 5 mai 2018\u003C/time>\n            \u003C/div>\n            \u003Cp>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Location magnam, distinctio! Vero blanditiis nisi veritatis id perferendis, quod quaerat necessitatibus ullam nobis quidem ipsam optio sit quibusdam ad quae voluptatibus doloremque!\u003C/p>\n            \u003Ca href=\"\" class=\"post__link\">Continue reading\u003C/a>\n          \u003C/article>\n          \u003Carticle class=\"post\">\n            \u003Ca href=\"\" class=\"post__category post__category--color-work\">work\u003C/a>\n            \u003Ch3>Lorem ipsum dolor article 4\u003C/h3>\n            \u003Cdiv class=\"post__meta\">\n              \u003Cimg class=\"post__author-icon\" src=\"./wp-content/themes/onews/images/icon-spr.png\" alt=\"\">\n              \u003Cstrong class=\"post__author\">Jack Sparrow\u003C/strong>\n              \u003Ctime datetime=\"2018-07-31\">le 31 juillet 2018\u003C/time>\n            \u003C/div>\n            \u003Cp>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Pirates molestias molestiae, obcaecati et. Veritatis, laudantium!\u003C/p>\n            \u003Ca href=\"\" class=\"post__link\">Continue reading\u003C/a>\n          \u003C/article>\n          \u003Carticle class=\"post\">\n            \u003Ca href=\"\" class=\"post__category post__category--color-team\">team\u003C/a>\n            \u003Ch3>Lorem ipsum dolor article 5\u003C/h3>\n            \u003Cdiv class=\"post__meta\">\n              \u003Cimg class=\"post__author-icon\" src=\"./wp-content/themes/onews/images/icon-tr.png\" alt=\"\">\n              \u003Cstrong class=\"post__author\">Terry Rozier\u003C/strong>\n              \u003Ctime datetime=\"2018-09-02\">le 2 septembre 2018\u003C/time>\n            \u003C/div>\n            \u003Cp>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Celtics nostrum obcaecati sit odit eveniet, unde hic animi molestiae, odio a quia aut perspiciatis dicta.\u003C/p>\n            \u003Ca href=\"\" class=\"post__link\">Continue reading\u003C/a>\n          \u003C/article>\n          \u003Carticle class=\"post\">
2682\n            \u003Ca href=\"\" class=\"post__category post__category--color-work\">work\u003C/a>\n            \u003Ch3>Lorem ipsum dolor article 6\u003C/h3>\n            \u003Cdiv class=\"post__meta\">\n              \u003Cimg class=\"post__author-icon\" src=\"./wp-content/themes/onews/images/icon-tre.png\" alt=\"\">\n              \u003Cstrong class=\"post__author\">Trevor Bayne\u003C/strong>\n              \u003Ctime datetime=\"2018-10-25\">le 25 octobre 2018\u003C/time>\n            \u003C/div>\n            \u003Cp>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nascar vitae assumenda reiciendis doloremque, quisquam.\u003C/p>\n            \u003Ca href=\"\" class=\"post__link\">Continue reading\u003C/a>\n          \u003C/article>\n        \u003C/div>\n\n\n\u003C?php\n\n// va chercher footer.php\nget_footer();\n\n```\n\u003C/details>\n\n\u003Cdetails>\n\u003Csummary>\nCréation de la vue erreur au nom normamlisé \u003Cstrong>404.php\u003C/strong> :\n\u003C/summary>\n\n\n```php\n\n\u003C?php \n// va chercher header.php\nget_header();\n\n?>\n\n//Vous vous êtes perdus, revenez à la page d'accueil.\n\n\u003C?php\n\n// va chercher footer.php\nget_footer();\n\n```\n\n\u003C/details>\n\n\n\n\u003Cdetails>\n\u003Csummary>\nCréation de la page d'accueil \u003Cstrong>home.php \u003C/strong> :\n\u003C/summary>\n\n```php\n\n\u003C?php\n// va chercher header.php\nget_header();\n\n?>\n\n\u003Ch2 class=\"right__title\">Latest News\u003C/h2>\n\n\u003C?php if (have_posts()) : ?>\n\n    \u003Cdiv class=\"posts\">\n\n        \u003C?php while (have_posts()) : the_post(); ?>\n\n            \u003C?php //var_dump(get_post()); ?>\n\n            \u003Carticle class=\"post\">\n                \u003Ca href=\"\" class=\"post__category post__category--color-team\">team\u003C/a>\n                \u003Ch3>\u003C?php the_title() ?>\u003C/h3>\n                \u003Cdiv class=\"post__meta\">\n                    \u003Cimg class=\"post__author-icon\" src=\"./wp-content/themes/onews/images/icon-dar.png\" alt=\"\">\n                    \u003Cstrong class=\"post__author\">\u003C?php the_author() ?>\u003C/strong>\n                    \u003Ctime datetime=\"\u003C?= get_the_date('Y-m-d') ?>\">le \u003C?= get_the_date() ?>\u003C/time>\n                \u003C/div>\n                \u003Cp>\u003C?php the_excerpt() ?>\u003C/p>\n                \u003Ca href=\"\u003C?php the_permalink() ?>\" class=\"post__link\">Continue reading\u003C/a>\n            \u003C/article>\n\n        \u003C?php endwhile; ?>\n\n    \u003C/div>\n\n\u003C?php else: ?>\n    Aucune donnée à afficher\n\u003C?php endif; ?>\n\n\u003C?php\n\n// va chercher footer.php\nget_footer();\n\n```\n\u003C/details>\n\n\n\u003Cdetails>\n\u003Csummary>\nCréation possible de la page d'accueil via \u003Cstrong>front-page.php \u003C/strong> :\n\u003C/summary>\n\n\u003C/details>\n\n front-page ou sinon `home.php` ou sinon `index.php`\n `404.php`\n \n\u003C/fieldset>\n\n\t\n### Les templates tags de WP\n\n` home_url() ` permet de récupérer la chaine de caractère qui est l'url de la page d'accueil du site\n\n` language_attributes() `  permet de récupérer la chaine de caractères qui donne l'attribut lang avec la valeur de la langue paramétrée pour le site\n\n","tags":"$:/doc/wordpress","title":"$:/code/php/wordpress/templates","modified":"20241017122618627","type":"text/markdown","icon":"$:/img/ico/wordpress.svg"},
2683{"created":"20240825131704148","text":"\n\n```sql\nSELECT\n  [ * | champs [ [ AS ] nom_sortie] [, ...] ]\n  [ FROM nom_table ]\n    [ [LEFT] JOIN nom_table ON condition ] \n    [ ... ]\n  [ WHERE condition ]\n  [ GROUP BY champ ]\n  [ ORDER BY champ [ASC | DESC] ]\n  [ LIMIT nombre [ OFFSET nombre ]];\n```\n\n\n- Création : [`INSERT INTO`](https://www.postgresql.org/docs/current/sql-insert.html)\n\n```sql\nINSERT INTO nom_table\n  [ ( nom_colonne [, ...] ) ]\n  [ VALUES ( nom_colonne [, ...] ) ];\n```\n\n- Modification : [`UPDATE`](https://www.postgresql.org/docs/current/sql-update.html)\n\n```sql\nUPDATE nom_table\nSET\n  nom_colonne = nouvelle_valeur\n  [, ...]\n[ WHERE condition ];\n```\n\n- Suppression : [`DELETE FROM`]((https://www.postgresql.org/docs/current/sql-delete.html))\n\n```sql\nDELETE FROM nom_table\n  [ WHERE condition ];\n```\n\n\n- SQL permet de détailler des opérations\n  - de comparaison avec `=`, `>`, `\u003C`, `>=`, `\u003C=`, `!=` et `LIKE` avec le `%` comme joker\n  - logiques avec `AND` et `OR`\n  - ordonnables avec des parenthèses\n- Il est possible d'aller très loin avec les requêtes `SELECT` en faisant\n  - des alias (`AS`),\n  - des conditions (`WHERE`),\n  - des groupes de lignes (`GROUP BY`),\n  - du tri `(ORDER BY`),\n  - de la limitation de résultats (`LIMIT`),\n  - ...\n- Pour aller chercher des informations de plusieurs tables en même temps, on doit les associer avec `JOIN` en fonction d'une colonne commune\n\n\n\n## La ligne de commande PSQL\n\n```bash\npsql -U postgres\n```\n\n```bash\n-h [hostname] // nom d'hôte du serveur PostgreSQL  - par défaut, psql utilisera localhost \n-U [username] // spécifie le nom d'utilisateur PostgreSQL  - par défaut le nom d'utilisateur de l'OS\n-d [databasename] // spécifie le nom de la base de données  - par défaut, psql utilisera le nom d'utilisateur\n```\n\nPour se connecter, sous windows, utilisez la commande :\n\n```bash\npsql -U postgres\n```\n\n\n## Créer une base de donnée et un user avec psql\n\nune fois connecté à votre Postgres avec le superuser `postgres`, on peut créer un nouvel utilisateur avec la syntaxe :\n\n```sql\n//CREATE USER name [ [ WITH ] option [ ... ] ]\n\nCREATE USER myuser WITH PASSWORD 'mon_super_mot_de_passe';\n\n```\n\n Pour modifier un élement déjà créé, on peut utiliser la commande `ALTER` soit\n\n```sql\nALTER USER myuser WITH PASSWORD 'mon_nouveau_mot_de_passe';\nALTER USER otorent WITH PASSWORD 'otorent';\nALTER USER otorent PASSWORD NULL;
2683\n```\n\n## Pour créer une base de données \n\n\n```sql\n//CREATE DATABASE name [ WITH ] [ OWNER [=] user_name ];\nCREATE DATABASE app_playlist WITH OWNER myuser;\n```\n\n\n## Se connecter avec un user\n\npour quitter psql on utilise \\q afin de se connecter avec notre nouvel utilisateur :\n\n```bash\npsql -d app_playlist -U myuser -h localhost\n\n# mais comme psql par défaut se connecte à localhost\npsql -d app_playlist -U myuser\n\n# psql se connecte par défaut  à la bdd qui porte le même nom que l'utilisateur (ce qui n'est pas le cas dans cet exemple mais si la base s'appelait myuser on aurait juste à saisir)\npsql -U myuser\n```\nla commande \\s  dans psql  affiche l'historique des commandes\n\n\n## Creation d'une table \n\n```sql\nCREATE TABLE \"user\" (\n    \"id\" INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, \n    \"email\" TEXT UNIQUE NOT NULL,\n    \"password\" TEXT NOT NULL,\n    \"firstname\" TEXT,\n    \"lastname\" TEXT\n);\n```\n\n## Executer un script psql\n\n```bash\npsql -U nomDuUser -d nomDeLaDB -f chemin/vers/leFichier.sql\n\nexemple\npsql -U myuser -d app_playlist -f db/migration.sql\n```\n\n## Créer un script\n\n```sql\nBEGIN;\n\nDROP TABLE IF EXISTS \"user\" CASCADE;\n\nCREATE TABLE \"user\" (\n    \"id\" INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, \n    \"email\" TEXT UNIQUE NOT NULL,\n    \"password\" TEXT NOT NULL,\n    \"firstname\" TEXT,\n    \"lastname\" TEXT\n);\nCOMMIT;\n```\n\n```sql\nBEGIN;\nDELETE FROM \"genre\" ;\nINSERT INTO \"genre\"\n  ( \"name\")\nVALUES\n  ( 'Pop'), -- on peut noter que pour échapper une quote on l'écrit deux fois\n  ('Rock'),\n  ('RnB'),\n  ('Soul'),\n  ('Metal'),\n  ('Rap'),\n  ('Electro') ;\n\nCOMMIT;\n```\nPour encoder la base au format utf8 :\n\n```sql\nSET CLIENT_ENCODING TO 'UTF-8';\n```\n\n[[https://www.postgresqltutorial.com/postgresql-tutorial/postgresql-like/]]","tags":"$:/doc/postgreSQL","title":"$:/code/postgreSQL","modified":"20240913105753754","type":"text/markdown"},
2684{"created":"20240924091702841","text":"[[https://www.linuxtricks.fr/wiki/postgresql-memo-des-commandes-sql]]\n\nInstallation\n---\n\n\u003Cdetails> \n\t\u003Csummary> Installation et configuration sur sur une VM de production pour un projet nodejs + postgresql\u003C/summary>\n\n\nPour verifier la version installée :\n\n```\npsql -V\n```\n\n```\nsudo apt install postgresql nodejs npm\n```\n\nLancez les commandes suivantes pour vous connecter à l'interface d'administration en ligne de commande de PostgreSQL :\n```\nsudo -i -u postgres\n```\npuis\n```\npsql\n```\nPuis, pour ajouter un nouvel utilisateur et créer une base de données pour notre application :\n\n```sql\nCREATE ROLE explorateur WITH LOGIN PASSWORD 'Ereul9Aeng';\nCREATE DATABASE pomodoro OWNER explorateur;\n```\npuis \n```\n\\q\nexit\n```\nPour que notre utilisateur puisse se connecter, on va devoir modifier le fichier de configuration pg_hba.conf avec nano :\n\n```\nsudo nano /etc/postgresql/14/main/pg_hba.conf\n```\n\nDans le fichier, rajouter la ligne suivante : \n\n`local   all     explorateur md5`\n\nPour obtenir \n```\nTYPE  DATABASE USER  ADDRESS METHOD\nlocal   all     explorateur md5\n```\nEnregistrez les modifications et quittez nano avec `Ctrl+X`, puis `Y` puis Entrée.\n\n\nRedémarrez le service PostgreSQL :\n\n```\nsudo systemctl restart postgresql\n```\n\nPour importer une strcture de base de données existantes, par exemple depuis un fichier DB.sql, à la racine du dépot\n\n```\nsudo -i -u postgres\npsql -U explorateur -d pomodoro -f /var/www/html/S09-Mise-En-Production-PSEUDOGH/DB.sql\nexit\n\n```\n__Autre méthode__\n\nmettre à jour la liste des dépôts pour y ajouter l'adresse d'un dépôt spécifique à PostgreSQL pour installer une version supérieure.\n\n```\nsudo sh -c 'echo \"deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main\" > /etc/apt/sources.list.d/pgdg.list'\nwget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -\nsudo apt-get update\n```\nPuis, selon la version que vous souhaitez installer :\n```\nsudo apt-get -y install postgresql-14\n```\nou bien\n```\nsudo apt-get -y install postgresql-16\n```\nSi besoin de désinstaller PostgreSQL :\n\n```\nsudo apt-get --purge remove postgresql postgresql-*\n```\nPour avoir les droits de se connecter avec le super user dans PostgreSQL, tel que vous l'avez vu en saison 7, nous allons éditer le fichier de configuration pg_hba.conf. Pour l'éditer, il faut utiliser sudo. Voici la commande :\n\n```\nsudo nano /etc/postgresql/14/main/pg_hba.conf\n```\nou bien, si vous avez installé la ver
2684sion 16 :\n```\nsudo nano /etc/postgresql/16/main/pg_hba.conf\n```\nUne fois le fichier ouvert, nous allons éditer la ligne qui concerne l'utilisateur postgre. Ainsi, nous pourrons nous connecter à notre gestionnaire de base de données, comme nous l'avons fait jusqu'à maintenant sur la VM Windows\n\n```\n Database administrative login by Unix domain socket\nlocal   all     postgres  trust\n```\n\n\n\u003C/details>\n\nAdminstration dans windows\n---\n\n\u003Cdetails> \n\t\u003Csummary> Commandes utiles pour une administration avec windows\u003C/summary>\n\t\n* Arréter le serveur : `pg_ctl stop -D /chemin/vers/votre/dossier_de_données -m fast`\n\n* Fichier de configuration pg_hba.conf dans : C:\\Program Files\\PostgreSQL\\\u003Cversion>\\data\\\n\n\tOn peut remplacer les méthodes d’authentification pour les connexions locales par `trust`. Cela permet de se connecter sans mot de passe. (on remplace l'option scram-sha-256 dans IPv4 local connections et IPv6 local connections).\n\n\tIl faut redemarrer le serveur : `pg_ctl -D \"C:\\Program Files\\PostgreSQL\\\u003Cversion>\\data\" restart`\n\n\u003C/details>\n\nCommande d'administration des bases dans psql\n---\n\n* Lister les bases\n\n  Une fois connecter avec psql\n\n\t```\n\t\\list\n\t```\n* se connecter à une base courante\n\t```\n\t\\c \u003Cnom_base_de_donnee>\n\t```\n\n* lister les tables \n\t```\n\t\\dt\n\t// ou pour plus d'information\n\t\\dt+\n\t```\n\n* voir le détail d'une table specfique\n\n\t```\n\t\\d \u003Cnom-table>\n\t\t// ou pour plus d'information\n\t\t\\d+\n\t```\n\n\t\n* Quitter psql (ou la vue psql  en cours de visualisation)\n\n\t```\n\t\\q\n\t```\n","tags":"$:/doc/postgreSQL","title":"$:/code/postgreSQL/administration","modified":"20241028180301542","type":"text/markdown"},
2685{"created":"20240825131320692","text":"\n## Suppression avec `DELETE FROM`\n\nAvec `DELETE FROM` ([voir la doc](https://www.postgresql.org/docs/current/sql-delete.html)  on supprime une ou plusieurs lignes dans une table.\n\n```sql\nDELETE FROM nom_table -- on indique DELETE FROM suivi du nom de la table\n  [ WHERE condition ]; -- suivi d'une condition pour déterminer quelles sont les lignes à supprimer\n```\n\nPar exemple\n\n```sql\n-- tous les films à la note inférieure à 4 seront supprimés\nDELETE FROM \"movie\"\nWHERE \"rate\" \u003C 4;\n```\n\nou encore\n\n```sql\n-- le film qui a l'id 2\nDELETE FROM \"movie\"\nWHERE \"id\" = 2;\n```\n\nBien qu'il soit possible de ne pas mettre de condition pour vider une table, on se tournera alors plutôt vers l'instruction [`TRUNCATE`](https://www.postgresql.org/docs/current/sql-truncate.html) prévue à cet effet. \n","tags":"","title":"$:/code/postgreSQL/DELETE","modified":"20241014124947011","type":"text/markdown"},
2686{"created":"20240825131116420","text":"\n## Création avec `INSERT INTO`\n\nAvec `INSERT INTO` ([voir la doc](https://www.postgresql.org/docs/current/sql-insert.html)  on ajoute une ou plusieurs lignes dans une table.\n\n```sql\nINSERT INTO nom_table -- on indique INSERT INTO suivi du nom de la table\n  [ ( nom_colonne [, ...] ) ] -- suivi de la liste entre parenthèses d'un ou plusieurs champs séparés par des virgules\n  [ VALUES ( nom_colonne [, ...] ) ]; -- suivi du mot VALUES puis entre parenthèses la liste des valeurs à donner aux chams dans le bon ordre\n```\n\nPar exemple\n\n```sql\n-- le nombre et l'ordre des valeurs correspond à la liste des champs\nINSERT INTO \"movie\"\n  (\"title\", \"rate\", \"country_name\")\nVALUES\n  ('Les vacances de Mr Bean', 1, 'Royaume-uni');\n```\n\nOn n'est pas obligé de lister tous les champs, ceux qui sont omis prendront leur valeur par défaut définissable à la création de la table (on verra plus tard) ou la valeur `NULL` en l'absence de valeur par défaut.\n\n```sql\n-- créera une ligne avec le titre Dumb & Dumber, le pays Etats-unis et la note NULL\nINSERT INTO \"movie\"\n  (\"title\", \"country_name\")\nVALUES\n  ('Dumb & Dumber', 'Etats-unis');\n```\n\nIl est possible d'insérer plusieurs lignes de valeurs séparées par des virgules\n\n```sql\n-- ici on insère 3 lignes\nINSERT INTO \"movie\"\n  (\"title\", \"country_name\")\nVALUES\n  ('La communauté de l''anneaux', 'Etats-unis'), -- on peut noter que pour échapper une quote on l'écrit deux fois\n  ('Les deux tours', 'Etats-unis'),\n  ('Le retour du roi', 'Etats-unis');\n```\n1. Insertion avec spécification des colonnes\n   \n```sql\nINSERT INTO table_name (column1, column2, column3)\nVALUES (value1, value2, value3);\n```\n\n2. Insertion sans spécification des colonnes\n```sql\nINSERT INTO table_name\nVALUES (value1, value2, value3, ...);\n```","tags":"","title":"$:/code/postgreSQL/INSERT INTO","modified":"20240826072033039","type":"text/markdown"},
2687{"created":"20240825130919062","text":"\n```sql\nSELECT\n  [ * | champs [ [ AS ] nom_sortie] [, ...] ]\n  [ FROM nom_table ]\n    [ [LEFT] JOIN nom_table ON condition ] \n    [ ... ]\n  [ WHERE condition ]\n  [ GROUP BY champ ]\n  [ ORDER BY champ [ASC | DESC] ]\n  [ LIMIT nombre [ OFFSET nombre ]];\n```\n\n## Lecture avec `SELECT`\n\nAvec `SELECT` ([voir la doc](https://www.postgresql.org/docs/current/sql-select.html)) on va lire des valeurs, principalement issues des colonnes des enregistrements de nos tables.\n\nOn verra qu'il y a beaucoup de possibilités, commençons avec l'essentiel déjà :\n\n```sql\nSELECT -- on indique SELECT ...\n  [ * | champs ] -- ... pour cibler un champ, plusieurs ou tous les champs\n  [ FROM nom_de_table ] -- ... suivi du nom de la table contenant les champs\n  [ WHERE condition ]; -- on peut mettre des conditions pour ne pas avoir toutes les lignes\n  -- on termine une requête SQL par un point virgule\n```\n\nMême si ça n'a pas grand intérêt ici, on peut sélectionner une valeur en dur sans cibler de table.\n\n```sql\nSELECT 'test'; -- on demande la valeur 'test', le serveur PostgreSQL va nous répondre la valeur 'test'\n```\n\n**Attention** les string s'écrivent _uniquement_ entre simple quote `'`, les doubles quotes `\"` sont réservées pour délimiter le nom des champs et des tables ; on va voir ça.\n\nLes mots clés SQL peuvent s'écrire aussi bien en majuscule qu'en minuscule mais habituellement on les met plutôt en majuscule pour la lisibilité.\n\n```sql\nselect 'test'; -- fonctionne aussi mais moins conventionnel\n```\n\nOn aura différents types de valeurs, ici un nombre\n\n```sql\nSELECT 123;\n```\n\nIl existe même des fonctions SQL, on a le temps pour tout découvrir le moment venu...\n\n```sql\nSELECT NOW(); -- la fonction now retourne la date actuelle\n```\n\nBon sélectionner une valeur en dur c'est pas ce qu'il y a de plus utile.  \nVoici une première requête hyper utile, elle permet de sélectionner toutes les colonnes de toutes les lignes de la table movie grâce au mot clé `FROM`.\n\n```sql\nSELECT * FROM \"movie\"; \n-- l'étoile signifie qu'on veut toutes les colonnes\n-- tant qu'on ne précise pas de conditions on obtient toutes les lignes\n-- attention l'ordre des mots clés est à respecter : FROM \"movie\" SELECT *; ne fonctionne pas\n```\n\nOn peut ajouter des retours à la ligne et des tabulations si on le souhaite pour la lisibilité, ça ne change rien\n\n```sql\nSELECT *\n  FROM \"movie\";\n```\n\nLes `\"` ne sont pas obligatoires, la plupart du temps on pourrait les omettre. Mais si une table ou un champ s'appelle comme un mot clé réservé par SQL on pourra avoir de mauvaises surprises. A nos risques et périls.\n\n```sql\nSELECT title FROM movie; -- fonctionne aussi la plupart du temps mais attention aux mots clés sql\n```\n\nSi on ne veut pas tous les champs, on peut lister seulement ceux qui nous intéressent.\n\nIci un champ\n\n```sql\nSELECT \"title\" FROM \"movie\";\n```\n\nIci plusieurs séparés par des virgules\n\n```sql\nSELECT \"id\", \"title\" FROM \"movie\";\n```\n\nOn va pouvoir limiter les lignes de résultats avec une condition avec `WHERE`\n\n```sql\nSELECT *\nFROM \"movie\"\nWHERE \"id\" = 2; -- l'opérateur de comparaison d'égalité est un simple égal \n```\n\nOn retrouvera des opérateurs de comparaison habituels `>`, `\u003C`, `>=`, `\u003C=` et `!=` pour la différence (un seul égal en SQL).\n\nLes possibilités sont vastes, on y reviendra lors de la prochaine journée. Restons sur les opérations de base pour aujourd'hui.\n","tags":"$:/doc/postgreSQL","title":"$:/code/postgreSQL/SELECT","modified":"20240913105741499","type":"text/markdown"},
2688{"created":"20240725121214328","text":"## CRUD\n\n> CRUD désigne les opérations de base dans une BDD. \n> Il s'agit d'un acronyme pour dire _Create Read Update Delete_ soit la création, la lecture, la mise à jour et la suppression. On veut pouvoir créer, lire, modifier et supprimer des lignes dans nos tables.\n\nComme toujours on ira voir la documentation, par exemple celle de [SELECT](https://www.postgresql.org/docs/current/sql-select.html).\n\nPour lire cette documentation on a besoin de savoir que :\n\n- on y indique entre `[]` ce qui est optionnel\n- on y indique un `|` pour dire \"ou\"\n- `[, ...]` veut dire qu'on peut lister plusieurs choses séparées par des virgules\n\n\n## Création avec `INSERT INTO`\n\nAvec `INSERT INTO` ([voir la doc](https://www.postgresql.org/docs/current/sql-insert.html) - _ne pas hésiter à défiler pour voir les exemples précieux en bas de page_) on ajoute une ou plusieurs lignes dans une table.\n\n```sql\nINSERT INTO nom_table -- on indique INSERT INTO suivi du nom de la table\n  [ ( nom_colonne [, ...] ) ] -- suivi de la liste entre parenthèses d'un ou plusieurs champs séparés par des virgules\n  [ VALUES ( nom_colonne [, ...] ) ]; -- suivi du mot VALUES puis entre parenthèses la liste des valeurs à donner aux chams dans le bon ordre\
2688n```\n\nPar exemple\n\n```sql\n-- le nombre et l'ordre des valeurs correspond à la liste des champs\nINSERT INTO \"movie\"\n  (\"title\", \"rate\", \"country_name\")\nVALUES\n  ('Les vacances de Mr Bean', 1, 'Royaume-uni');\n```\n\nOn n'est pas obligé de lister tous les champs, ceux qui sont omis prendront leur valeur par défaut définissable à la création de la table (on verra plus tard) ou la valeur `NULL` en l'absence de valeur par défaut.\n\n```sql\n-- créera une ligne avec le titre Dumb & Dumber, le pays Etats-unis et la note NULL\nINSERT INTO \"movie\"\n  (\"title\", \"country_name\")\nVALUES\n  ('Dumb & Dumber', 'Etats-unis');\n```\n\nIl est possible d'insérer plusieurs lignes de valeurs séparées par des virgules\n\n```sql\n-- ici on insère 3 lignes\nINSERT INTO \"movie\"\n  (\"title\", \"country_name\")\nVALUES\n  ('La communauté de l''anneaux', 'Etats-unis'), -- on peut noter que pour échapper une quote on l'écrit deux fois\n  ('Les deux tours', 'Etats-unis'),\n  ('Le retour du roi', 'Etats-unis');\n```\n\n\n## Mise à jour avec `UPDATE`\n\n```sql\nUPDATE nom_table -- on indique UPDATE suivi du nom de la table\nSET -- on indique ensuite SET avant de lister les valeurs à mettre à jour\n  nom_colonne = nouvelle_valeur\n  [, ...] -- on peut en mettre plusieurs séparées par des virgules\n[ WHERE condition ]; -- on mettra une condition si on veut limiter la mise à jour à certaines lignes de la table\n```\n\nPar exemple\n\n```sql\n-- met à jour toutes les lignes de la table movie pour passer tous les pays à Belgique\nUPDATE \"movie\"\nSET \"country_name\" = 'Belgique';\n```\n\nOn peut même mettre des expression en valeur\n\n```sql\n-- met à jour toutes les lignes de la table movie pour multiplier leur note par 2\nUPDATE \"movie\"\nSET \"rate\" = \"rate\" * 2;\n```\n\nLe plus souvent on voudra une condition pour n'affecter que certaines lignes\n\n```sql\n-- met à jour la note du film possédant l'id 1\nUPDATE \"movie\"\nSET \"rate\" = 3\nWHERE \"id\" = 1; -- d'ailleurs on se basera le plus souvent sur un id pour cibler une ligne, c'est ce qu'il y a de plus précis\n```\n\nOn peut mettre à jour plusieurs colonnes séparées par des virgules\n\n```sql\n-- met à jour la note du film à l'id 1 et son titre\nUPDATE \"movie\"\nSET \n  \"rate\" = 4,\n  \"title\" = 'Les bronzés font du ski'\nWHERE \"id\" = 1; \n```\n\n## Suppression avec `DELETE FROM`\n\nAvec `DELETE FROM` ([voir la doc](https://www.postgresql.org/docs/current/sql-delete.html) - _ne pas hésiter à défiler pour voir les exemples précieux en bas de page_) on supprime une ou plusieurs lignes dans une table.\n\n```sql\nDELETE FROM nom_table -- on indique DELETE FROM suivi du nom de la table\n  [ WHERE condition ]; -- suivi d'une condition pour déterminer quelles sont les lignes à supprimer\n```\n\nPar exemple\n\n```sql\n-- tous les films à la note inférieure à 4 seront supprimés\nDELETE FROM \"movie\"\nWHERE \"rate\" \u003C 4;\n```\n\nou encore\n\n```sql\n-- le film qui a l'id 2\nDELETE FROM \"movie\"\nWHERE \"id\" = 2;\n```\n\nBien qu'il soit possible de ne pas mettre de condition pour vider une table, on se tournera alors plutôt vers l'instruction [`TRUNCATE`](https://www.postgresql.org/docs/current/sql-truncate.html) prévue à cet effet. Encore une fois on en découvrira davantage en fonction de nos besoins, restons pour l'instant sur l'essentiel\n","tags":"$:/doc/postgreSQL","title":"$:/code/postgreSQL/sql/CRUD","modified":"20241022062404344","type":"text/markdown"},
2689{"created":"20241022062406357","text":"[[https://tapoueh.org/blog/2018/08/geolocation-with-postgresql/]]\n\n[[https://dev.to/dm8ry/postgresql-how-to-calculate-the-distance-between-two-cities-based-on-their-corresponding-gps-data-23cm]]\n\n\n\n###  Chargement des données geolocalisées\n\n```sql\ncreate extension if not exists ip4r;\ncreate schema if not exists geolite;\n\ncreate table if not exists geolite.location\n(\n   locid      integer primary key,\n   country    text,\n   region     text,\n   city       text,\n   postalcode text,\n   location   point,\n   metrocode  text,\n   areacode   text\n);\n       \ncreate table if not exists geolite.blocks\n(\n   iprange    ip4r,\n   locid      integer\n);\n\ncreate index blocks_ip4r_idx on geolite.blocks using gist(iprange);\n```\n\n```sql\nLOAD ARCHIVE\n   FROM http://geolite.maxmind.com/download/geoip/database/GeoLiteCity_CSV/GeoLiteCity-latest.zip\n   INTO postgresql://appdev@/appdev\n\n   BEFORE LOAD EXECUTE 'geolite.sql'\n\n   LOAD CSV\n        FROM FILENAME MATCHING ~/GeoLiteCity-Location.csv/\n             WITH ENCODING iso-8859-1\n             (\n                locId,\n                country,\n                region     [ null if blanks ],\n                city       [ null if blanks ],\n                postalCode [ null if blanks ],\n                latitude,\n                longitude,\n                metroCode  [ null if blanks ],\n                areaCode   [ null if blanks ]\n             )\n        INTO postgresql://appdev@/appdev\n        TARGET TABLE geolite.location\n             (\n                locid,country,region,city,postalCode,\n                location point using (format nil \"(~a,~a)\" longitude latitude),\n                metroCode,areaCode\n             )\n        WITH skip header = 2,\n             drop indexes,\
2689n             fields optionally enclosed by '\"',\n             fields escaped by double-quote,\n             fields terminated by ','\n\n  AND LOAD CSV\n        FROM FILENAME MATCHING ~/GeoLiteCity-Blocks.csv/\n             WITH ENCODING iso-8859-1\n             (\n                startIpNum, endIpNum, locId\n             )\n        INTO postgresql://appdev@/appdev\n        TARGET TABLE geolite.blocks\n             (\n                iprange ip4r using (ip-range startIpNum endIpNum),\n                locId\n             )\n        WITH skip header = 2,\n             drop indexes,\n             fields optionally enclosed by '\"',\n             fields escaped by double-quote,\n             fields terminated by ',';\n```\n\n### Trouver la géolocalisation à partir de l'IP\n\n\nThe ip4r extension provides several operators to work with the dataset we have, some of those operators are supported by the index we just created. And just for the fun of it here’s a catalog query to inquire about them:\n\n```sql\nselect amopopr::regoperator\n  from pg_opclass c\n       join pg_am am on am.oid = c.opcmethod\n       join pg_amop amop on amop.amopfamily = c.opcfamily\n where opcintype = 'ip4r'::regtype and am.amname = 'gist';\n```\n\n#### Calcul de distance entre deux points geolocalisés :\n\n[[https://stackoverflow.com/questions/24624257/postgis-distance-calculation#:~:text=If%20you%20want%20the%20distance%20in%20meters%20between,SELECT%20ST_Distance_Sphere%28ST_MakePoint%28103.776047%2C%201.292149%29%2CST_MakePoint%28103.77607%2C%201.292212%29%29%3B%20which%20gives%207.457%20meters.]]\n\nYour coordinate reference system (CRS) is 4326, lat/lon. This is a common source of confusion with Google Maps: 3857 is the CRS used by Google Maps for its tiles, and is projected meters based on a spherical globe. Vector sources that are added to Google Maps (KML data, GPS dumps, etc) tend to be in lat/lon, 4326, which is measures in degrees and converted on the fly.\n\nIf you want the distance in meters between two lat/lon points, use ST_Distance_Sphere. For example, for your first set of points,\n\n```sql\nSELECT ST_Distance_Sphere(ST_MakePoint(103.776047, 1.292149),ST_MakePoint(103.77607, 1.292212));\n\n```\n\nwhich gives 7.457 meters. Your second set of points are 62.74 meters away from each other, based on the same query.\n\nNote there is also ST_Distance_Spheroid which takes a third parameter, the measurement spheroid, ie, an approximation of the earth's shape. This will potentially be more accurate, but probably not significant over small distances.\n\n\n```sql\n\nSELECT ST_DistanceSphere(\n    ST_MakePoint(city1.longitude, city1.latitude),\n    ST_MakePoint(city2.longitude, city2.latitude)\n) / 1000 AS distance_in_km\nFROM cities AS city1\nCROSS JOIN cities AS city2\nWHERE city1.name = 'Lisbon'\n  AND city2.name = 'Porto';\n distance_in_km  \n-----------------\n 274.07008450859\n\n```","tags":"","title":"$:/code/postgreSQL/sql/géolocalisation","modified":"20241022063450720","type":"text/markdown"},
2690{"created":"20240825131147631","text":"\n## Mise à jour avec `UPDATE`\n\nAvec `UPDATE` ([voir la doc](https://www.postgresql.org/docs/current/sql-update.html) - _ne pas hésiter à défiler pour voir les exemples précieux en bas de page_) on modifie des colonnes d'une ou plusieurs lignes dans une table.\n\n```sql\nUPDATE nom_table -- on indique UPDATE suivi du nom de la table\nSET -- on indique ensuite SET avant de lister les valeurs à mettre à jour\n  nom_colonne = nouvelle_valeur\n  [, ...] -- on peut en mettre plusieurs séparées par des virgules\n[ WHERE condition ]; -- on mettra une condition si on veut limiter la mise à jour à certaines lignes de la table\n```\n\nPar exemple\n\n```sql\n-- met à jour toutes les lignes de la table movie pour passer tous les pays à Belgique\nUPDATE \"movie\"\nSET \"country_name\" = 'Belgique';\n```\n\nOn peut même mettre des expression en valeur\n\n```sql\n-- met à jour toutes les lignes de la table movie pour multiplier leur note par 2\nUPDATE \"movie\"\nSET \"rate\" = \"rate\" * 2;\n```\n\nLe plus souvent on voudra une condition pour n'affecter que certaines lignes\n\n```sql\n-- met à jour la note du film possédant l'id 1\nUPDATE \"movie\"\nSET \"rate\" = 3\nWHERE \"id\" = 1; -- d'ailleurs on se basera le plus souvent sur un id pour cibler une ligne, c'est ce qu'il y a de plus précis\n```\n\nOn peut mettre à jour plusieurs colonnes séparées par des virgules\n\n```sql\n-- met à jour la note du film à l'id 1 et son titre\nUPDATE \"movie\"\nSET \n  \"rate\" = 4,\n  \"title\" = 'Les bronzés font du ski'\nWHERE \"id\" = 1; \n```\n","tags":"","title":"$:/code/postgreSQL/UPDATE","modified":"20240825131611809","type":"text/markdown"},
2691{"created":"20240829080627973","text":"","tags":"","title":"$:/code/referencement/sitemap.xml","modified":"20240829080708471"},
2692{"created":"20241017124626145","text":"* Téléchargement de la dernière version : [[https://github.com/hakimel/reveal.js/archive/master.zip]]\n\n\n* Reveal avec les markDown : [[https://revealjs.com/markdown/]]","tags":"","title":"$:/code/reveal/md","modified":"20241017125147688"},
2693{"created":"20240729064619913","text":"__Commandes usuelles d'administration d'un système d'exploitation linux__\n\n```shell\n\ncd .. \t// cette exemple illustre le principe \u003Ccommande> \u003CArgument>\ncd ~    // retour au dossier home\nls \t    // lister\nls -lsa\t// lister\nmkdir   // Creation d'un répertoire\ntouch   // Creation d'un fichier\ncat     // lire un fichier\nrm \t    // supprimer un fichier\nrm - R  // Supprimer un repertoire\nrm - f  // supprimer de force un fichier \nrm -rf  // supprimer de force un dossier\npwd     // emplacement de l'utilisateur ou dossier courant\n\ncp chemin/source chemin/desetination // copier un fichier\nmv chemin/source chemin/destination // déplacer un fichier \n```\n[[https://explainshell.com/]]\n\n\n\u003Cfieldset>\n\t\n`.`  :  repertoire courant\n\n`..` : repertoire parent\n\n\u003C/fieldset>\n\n---\n\n__Gestion des processus__\n---\n\n```\nps aux | grep node\n```\n\n\n__Lister les PID en écoute sur un port de la machine__\n\n```ksh\nsudo lsof -i :3000. //this will list all PID listening on this port\n\n```\n---\n\n__Gestion des droits__\n---\n\n\n`chown` : \"change owner\" Changer de propriétaires\nsudo chown student:student foo.js : Change à la fois le propriétaire et le groupe du fichier en \"student\".\n\n\n`chmod` : changer les droits\n(modifie les permissions du fichier, pas le propriétaire.)\n\n* voir [[$:/code/apache2]]\n\n* Pour visualiser les permissions du dossier /var/www/html, on peut utiliser la commande \u003Cb>`ls -l`  \u003C/b> \n\n\nPour donner les droits en écriture et en exécution au groupe propriétaire du répertoire toto/ ainsi qu'à son contenu, tu devrais utiliser la commande sudo chmod -R g+wx toto.\n\nVoici ce que chacune des commandes fait :\n\nsudo chmod g+wx toto : Modifie les permissions du répertoire toto, mais pas de son contenu.\n\nsudo chmod -R g+wx toto : Modifie les permissions du répertoire toto et de tout son contenu de manière récursive.\n\nsudo chmod -R g+rx toto : Ajoute les droits de lecture et d'exécution, mais pas d'écriture.\n\nsudo chmod o+rx toto : Donne les droits de lecture et d'exécution aux autres utilisateurs, pas au groupe propriétaire.\n\nsudo chmod -R u-rx toto : Enlève les droits de lecture et d'exécution pour l'utilisateur propriétaire de manière récursive.\n\n__sudo__ : \u003Ccite> superuser do \u003C/cite>\n\n`sudo chown -R student themes`\n\n```\n// Pour consulter les droits de `ls -alh /var/www/html`\n\n\n// changement des droits sur un répertoire pour l'utilisateur student\n\nsudo chown -R student themes\n\n```\n\nLa commande `ls -al` en UNIX/Linux permet d'afficher une liste détaillée des fichiers et répertoires dans le répertoire courant. Les informations incluent :\n\n* Permissions : Indiquent les droits d'accès (lecture, écriture, exécution) pour le propriétaire, le groupe et les autres utilisateurs.\n* Nombre de liens : Montre combien de liens pointent vers ce fichier.\n* Propriétaire : L'utilisateur qui possède le fichier.\n* Groupe : Le groupe propriétaire du fichier.\n* Taille : La taille du fichier en octets.\n* Date et heure de modification : Quand le fichier a été modifié pour la dernière fois.\n* Nom : Le nom du fichier ou du répertoire.\n\n\n---\n* \u003Cstrong>Commandes d'audit de la machine \u003C/strong>\n\n\n\u003Cfieldset>\n\t\n__lister les stockages physiques__ : `sudo fdisk -l`\n\n__lister les stockages logiques__ : `df -h`\n\n\u003C/fieldset>\n\n---","tags":"","title":"$:/code/system/bash","modified":"20241018075505316","type":"text/markdown"},
2694{"created":"20241008072837673","text":"apt : permet d'effectuer l'installation et la désinstallation de paquets en provenance d'un dépôt APT.\n\n```\napt-get install [package_name]=[version_number]\n//ou\napt install\n```\n\nMise à jour de la distribution\n---\n\n`lsb_release -a` : La commande lsb-release est un simple outil pour aider à identifier la distribution Linux utilisée et sa conformité avec le Linux Standard Base.\n\nBien qu'elle soit conçue pour être utilisée par les paquets LSB, cette c
2694ommande peut aussi être utile pour distinguer une distribution Debian d'une version dérivée.\n\n\n```\nsudo apt update\nsudo apt upgrade\n```\n\n* En savoir plus sur un paquet: exemple  Git\n\n```\napt show GitHub\n```\n\n* Pour l'installation\n```\nsudo apt install git\n```\n* Pour la desinstallation\n\n`sudo apt remove git`\n\n* Pour oter les packages devenues inutiles\n  `sudo apt remove git`","tags":"","title":"$:/code/system/bash/apt","modified":"20241008092405037","type":"text/markdown"},
2695{"created":"20241008125851655","text":"","tags":"","title":"$:/code/system/bash/scp","modified":"20241008125902901"},
2696{"created":"20241008125905180","text":"* On se peostionne sur le répertoire home\n\n```bash\ncd ~\n```\n\n* On récupère un script\n\n```bash\nwget https://gist.githubusercontent.com/bdelphin/b5fbddbe2d86789a920dd2a9d9e5c4ce/raw/29d30954fc0575033fa92c04ca0feafadfa5ee1d/install-ftp.sh\nchmod +x ./install-ftp.sh\n./install-ftp.sh\n```\n\nSource du script: https://gist.github.com/bdelphin\n\ncontenu :\n\n```bash\n//install-ftp.sh\n\n#!/bin/bash\n\nRED='\\033[0;31m'\nNC='\\033[0m'\n\necho -e \"${RED}\"\necho -e \"*******************************************************\"\necho -e \"*  Bienvenue dans le script d'install du serveur FTP  *\"\necho -e \"*  Ce script installe et configure ProFTPD avec SSL.  *\"\necho -e \"*******************************************************\"\n```","tags":"","title":"$:/code/system/bash/sftp","modified":"20241008130233774"},
2697{"created":"20241018075753743","text":"","tags":"","title":"$:/code/system/ssh","modified":"20241018075801912"},
2698{"created":"20241018075803421","text":"\nPour transférer un répertoire foo/ d'une machine A à une machine B en utilisant SSH tout en étant sur le terminal d'une machine C, \n\nil faut  utiliser \n\n`scp -r nom@A:/foo/ nom@B:/foo/bar.`\n\nscp -r signifie que tu utilises secure copy en mode récursif, ce qui est nécessaire pour copier des répertoires et leur contenu. La commande transfère le répertoire foo/ de la machine A vers le chemin spécifié sur la machine B.","tags":"","title":"$:/code/system/ssh/scp","modified":"20241018075932483"},
2699{"created":"20240903030102357","text":"\n__planification des taches__\n\ntaskschd.msc\n\n__Lancer le panneau de controle des services__\n\nservices.msc\n\n__lister les ports__\n\n```\nnetstat -ano | findstr :\u003Cport> //this will list all PID listening on this port\n```\n\n","tags":"","title":"$:/code/system/windows","modified":"20241008093420434","type":"text/markdown"},
2700{"created":"20240606184924848","text":"---\n  * CMS avec tiddlywiki : [[Tddlyjam|https://tiddlyjam.com/]] \n\n---\n* Gestion des variables\n\n```js\n\u003C$set name=variable value=\"Ma Variable est déclarée\">\n\u003C\u003Cvariable>>\n\u003C/$set>\n```\n\n* Scripts utiles : \n\n```js\n// Script pour renommer tout les tags des tiddlers correspondants :\n(function() {\n    // Nom de l'ancien tag et du nouveau tag\n    var ancienTag = \"ancienTag\";\n    var nouveauTag = \"nouveauTag\";\n\n    // Parcourir tous les tiddlers\n    $tw.wiki.each(function(tiddler, title) {\n        var tags = tiddler.fields.tags;\n        if(tags && tags.indexOf(ancienTag) !== -1) {\n            // Remplacer l'ancien tag par le nouveau\n            var newTags = tags.map(tag => tag === ancienTag ? nouveauTag : tag);\n            // Mettre à jour le tiddler avec les nouveaux tags\n            $tw.wiki.addTiddler(new $tw.Tiddler(tiddler, {tags: newTags}));\n        }\n    });\n})();\n\n//\n//Étapes pour utiliser ce script :\n\n- Ouvrez votre TiddlyWiki et créez un nouveau tiddler.\n- Ajoutez le code JavaScript ci-dessus dans le tiddler.\n- Enregistrez et exécutez le tiddler pour appliquer les changements.\n```\n\n---\n\n```\n[InternetShortcut]\nURL=https://dynalist.io/d/zUP-nIWu2FFoXH-oM7L7d9DM#z=UKD0GOT6RZB93jgtEqeFCeR5\n```\n\n---\nFiltre sur catégorie : [[https://tobibeer.github.io/tw/filters/#Filter%20Examples]]\n\n Ce code va créer une liste de liens vers tous les tiddlers qui ont la propriété category définie à projet\n\n```js\n\u003C$list filter=\"[all[tiddlers]field:category[projet]]\">\n  \u003C$link to=\u003C\u003CcurrentTiddler>>>\n    \u003C\u003CcurrentTiddler>>\n  \u003C/$link>\n\u003C/$list>\n```\n\nCe code va créer une liste de liens vers tous les tiddlers qui ont le tag important et la propriété category définie à projet.\n\n```js\n\u003C$list filter=\"[tag[important]field:category[projet]]\">\n  \u003C$link to=\u003C\u003CcurrentTiddler>>>\n    \u003C\u003CcurrentTiddler>>\n  \u003C/$link>\n\u003C/$list>\n\n// ou avec un secont=d filtre sur les porpriétés \n\n\u003C$list filter=\"[tag[important]field:category[projet]field:status[en cours]]\">\n  \u003C$link to=\u003C\u003CcurrentTiddler>>>\n    \u003C\u003CcurrentTiddler>>\n  \u003C/$link>\n\u003C/$list>\n\n\n```\n\nAvec retraitement des sorties du filtre :\n\n\nUtiliser des widgets pour la mise en forme : Vous pouvez utiliser différents widgets pour personnaliser l’affichage de chaque tiddler dans la liste. Par exemple, pour afficher chaque tiddler dans un bloc avec un titre et un extrait, vous pouvez utiliser le widget ViewWidget :\n\n```js\n\u003C$list filter=\"[tag[important]field:category[projet]]\">\n  \u003Cdiv class=\"tiddler-item\">\n    \u003Ch3>\u003C$link to=\u003C\u003CcurrentTiddler>>>\u003C$view field=\"title\"/>\u003C/$link>\u003C/h3>\n    \u003Cp>\u003C$view field=\"text\" format=\"excerpt\" length=\"100\"/>\u003C/p>\n  \u003C/div>\n\u003C/$list>\n\n```\n\nAjouter des styles CSS : Vous pouvez ajouter des styles CSS pour personnaliser l’apparence des éléments de la liste. Par exemple, pour styliser les blocs de tiddlers, vous pouvez ajouter ce CSS dans un tiddler de style :\n\n```CSS\n\n.tiddler-item {\n  border: 1px solid #ccc;\n  padding: 10px;\n  margin-bottom: 10px;\n  background-color: #f9f9f9;\n}\n\n.tiddler-item h3 {\n  margin: 0;\n  font-size: 1.2em;\n}\n\n.tiddler-item p {\n  margin: 5px 0 0;\n  color: #555;\n}\n```\n\nCe code va créer un tableau où chaque ligne représente un tiddler filtré, avec des colonnes pour le titre, la catégorie et le statut.\n\n```js\n\n|!Titre|!Catégorie|!Statut|\n\u003C$list filter=\"[tag[important]field:category[projet]]\">\n  |\u003C$link to=\u003C\u003CcurrentTiddler>>>\u003C$view field=\"title\"/>\u003C/$link>|\u003C$view field=\"category\"/>|\u003C$view field=\"status\"/>|\n\u003C/$list>\n```\n\n\n```js\n\\define select-existing-values(fieldname)\n\u003C$select field=\"$fieldname$\" default={{!!$fieldname$}}>\n\u003C$list filter=\"[each[$fieldname$]get[$fieldname$]]\" variable=\"choice\">\n\u003Coption value=\u003C\u003Cchoice>>>\u003C\u003Cchoice>>\u003C/option>\n\u003C/$list>\n\u003C/$select>\n\\end\n\nJust call it with a field name \u003C\u003Cselect-existing-values fieldname>>\n```\n","tags":"","title":"$:/code/tw","modified":"20241018103900959","type":"text/vnd.tiddlywiki"},
2701{"created":"20240921205635888","text":"### Solution 1 - Temporaire\n\n[[Lien utile|https://tobibeer.github.io/tw/enable-js/#script]]\n\n```js\n$tw.config.htmlUnsafeElements = [];
2701\n```\n\n### Solution 2 - Permanente\n\n[[$:/.tb/macros/script]]\n\n```\n$:/tags/PageTemplate\n\n\n; enable script tags\n: `\u003C\u003Cscript>>`\n; disable script tags\n: `\u003C\u003Cscript 0>>` / `\u003C\u003Cscript false>>` / `\u003C\u003Cscript no>>` / `\u003C\u003Cscript off>>`\n```\n\n```js\n\n\n\u003C\u003Cscript>>\n\u003Cscript>confirm(\"Caution: Do not use lightly!\");\u003C/script>\n\u003C\u003Cscript 0>>\n{{error}} => see [[error]]\n```\n\u003C\u003Cscript>>\n\u003Cscript>confirm(\"Caution: Do not use lightly!\");\u003C/script>\n\u003C\u003Cscript 0>>","tags":"","title":"$:/code/tw/enable-js","modified":"20240921213837512","type":"text/markdown"},
2702{"created":"20241005095725627","text":"```html\n\n\u003Cdiv style.color={{!!color}}>Hello\n\u003C!-- This comment will not appear in the wikified output -->\n\u003C/div>\n```\n\nRésultat : \n\n\u003Cdiv style.color={{!!color}}>Hello\n\u003C!-- This comment will not appear in the wikified output -->\n\u003C/div>","tags":"","title":"$:/code/tw/variable","modified":"20241005100824459","type":"text/markdown","color":"#c1b61a"},
2703{"created":"20241010071237855","text":"{{$:/doc/VirtualHost}}\n\nChaque VirtualHost du serveur (pour rappel, un site = un VirtualHost) graçe au fichier nom_site.conf.\n\nCe fichier devra être placé dans le dossier /etc/apache2/sites-available/.\n\nPar défaut, il y en a deux, 000-default.conf et default-ssl.conf qui peuvent servir d'exemple.\n\nLe virtual host 000-default.conf est celui qui permet d'accéder aux projets dans le dossier /var/www/html depuis http://localhost sur notre téléporteur.\n\nLa création d'un virtual host nécessite de créer un nouveau fichier, par exemple :\n\n```\nsudo nano nouveusite-front.conf\n```\n\nVoici un exemple de paramètre :\n\n```\n\u003CVirtualHost *:80>\n    # Adresse (nom de domaine) sur laquelle on va aller pour accéder à l'application\n    # ATTENTION, bien remplacer {{PSEUDO-GITHUB}} par votre pseudo GitHub !\n    ServerName {{PSEUDO-GITHUB}}-server.eddi.cloud\n    # Chemin de l'application (racine du serveur web)\n    # ATTENTION, bien remplacer {{PSEUDO-GITHUB}} par votre pseudo GitHub !\n    DocumentRoot /var/www/html/S09-Mise-En-Production-{{PSEUDO-GITHUB}}/front\n\n    # Emplacement logs Apache\n    ErrorLog ${APACHE_LOG_DIR}/error.log\n    CustomLog ${APACHE_LOG_DIR}/access.log combined\n\u003C/VirtualHost>\n```\n\nCette configuration permet d'associer un dossier (DocumentRoot) à un nom de domaine (ServerName). Le nom de domaine utilisé doit avoir été configuré au préalable pour pointer vers notre serveur via un enregistrement DNS, (se référer à la documentation de l'hébergeur).\n\nPour vérifier le bon fonctionnement :\n\n```\ncat /etc/apache2/sites-available/pomodoro-front.conf\n```\n\nPour activer le site, on utiliser `a2ensite`\n\na2 : apache 2\nen : enable\nsite : site\n\n```\nsudo a2ensite pomodoro-front\nsudo systemctl reload apache2\n```\n\nSi tout s'est bien passé, le site/VirtualHost est maintenant activé.\n\nPour vérifier, il est possible d'utiliser la commande suivante :\n\n```\ncat /etc/apache2/sites-enabled/pomodoro-front.conf\n```\n\nPour desactivé le site on utilise la commande :\n`a2dissite`\n\n On va d'ailleurs s'en servir pour désactiver le virtual host par défaut, dont nous n'avons plus besoin :\n\n```\nsudo a2dissite 000-default\nsudo systemctl reload apache2\n```\n\nLa commande `sudo systemctl reload apache2` permet de recharger Apache afin qu'il prenne en compte les modifications.\n\n* Pour le back-end\n\n```\nsudo nano /etc/apache2/sites-available/siteweb-back.conf\n```\n\navec l'ajout du contenu :\n\n```\n\u003CVirtualHost *:80>\n    # Adresse (nom de domaine) sur laquelle on va aller pour accéder à l'application\n    # ATTENTION, bien remplacer {{PSEUDO-GITHUB}} par votre pseudo GitHub !\n    ServerName backend.{{PSEUDO-GITHUB}}-server.eddi.cloud\n    \n    # Pas de DocumentRoot ce coup-ci, on va utiliser le mode Reverse Proxy d'Apache !\n    ProxyRequests Off\n    ProxyPreserveHost On\n    ProxyVia Full\n\n    \u003CProxy *>\n        Require all granted\n    \u003C/Proxy>\n\n    ProxyPass / http://127.0.0.1:8000/\n    ProxyPassReverse / http://127.0.0.1:8000/\n\n    # Emplacement logs Apache\n    ErrorLog ${APACHE_LOG_DIR}/error.log\n    CustomLog ${APACHE_LOG_DIR}/access.log combined\n\u003C/VirtualHost>\n```\n💡 Un Reverse Proxy, ou serveur mandataire inverse en Français, est un type de serveur, habituellement placé en frontal de serveurs web. Le proxy inverse permet de rediriger les requêtes reçues sur backend.{{PSEUDO-GITHUB}}-server.eddi.cloud vers {{PSEUDO-GITHUB}}-server.eddi.cloud:8000.\n\n\nActivez les modules proxy et proxy_http d'Apache, puis activez le nouveau virtual host et relancez Apache avec les commandes :\n\n```\nsudo a2enmod proxy proxy_http rewrite headers expires\nsudo a2ensite pomodoro-back\nsudo systemctl reload apache2\n```","tags":"","title":"$:/code/VirtualHost","modified":"20241010072756996"},
2704{"created":"20240617124905346","text":"[[https://docs.emmet.io/cheat-sheet/]]\n\nRappel: CTRL+Espace pour valider le raccourci emmet\n\n## Structure html de base \n\n* commande emmet `!` like mais avec notion d'accessibilité (attention à la langue fr):\n\n```\n// DOCHTML avec accessibilité\nhtml:5>(div.sr-only.sr-only-focusable>a[href=\"#content\"]{accéder au contenu textuel de la page active})+header+main[id=\"content\"]+footer\n\ndiv.sr-only.sr-only-focusable:focus[aria-label=\"menu d'evitement\"][role=\"navigation\"]>a[href=\"#\"].{contenu textuel de la page active}\n\n// balise de lien\nlink[rel=\"stylesheet\"][href=\"./style.css\"]\n\n \nhtml:5>header>
2704(img+nav.navbar[role=\"navigation\"][aria-label=\"navigation-principale\"]>(ul.menu>li*5>a)+(form>input[type=\"search\"][placeholder=\"Recherche\"][role=\"search\"]))+main#main+footer\n```\n// site fictif accessible\n```\nhtml:5>(div[aria-label=\"menu d'evitement\"][role=\"navigation\"]>a[href=\"#\"].sr-only.sr-only-focusable:focus{contenu textuel de la page active})+header>(img+nav.navbar[aria-label=\"navigation-principale\"]>(ul.menu>li*5>a{monlien})+(form>input[type=\"search\"][placeholder=\"Recherche\"][role=\"search\"]))+(main#main>(section>p+aside[role=\"complementary\"]>p))+footer\n\n\n```\n[[$:/code/css/sr-only]]\n\n* Strcture de base pour un fichier react\n\n```\nhtml:5>div[id=\"app\"]+script[type=\"module\"][src=\"./index.js\"]\n```\n\n## Exemple de structure de `main` :\n\n```\n\n(section[role=\"region\"]>(h2+(h3+div>(p+(div.section-link>a))))+(div>img[src=\"./images/03.jpg\"]))*2\n\nsection[role=\"region\"]>((div.section-gras>p)+ aside[role=\"complementary\"](img[src=\"./images/04.jpg\"])\n\nfigure>(img[role=\"img\"][focusable=\"false\"]+figcaption)\n```\n\n\nAttention :\n- `\u003Cspan>` peut être imbriqué dans `\u003Cdiv>`\n- `\u003Cdiv>` **ne peut pas** être imbriqué dans `\u003Cspan>`\n\n```html\n//header>nav>ul>li*9>a:link{Citation_#}\n//main>figure>(blockquote>p)+(figcaption>cite)\n//footer>a\n\n```\n\n\n* structure de footer :\n\n```\n\n```\n\n* structure d'un formulaire\n\n```shell\n  \n//formulaire de contact\n\nform[method=\"post\"][aria-label=\"formulaire de contact]\">((label[for=\"nom\"]{Nom}>input[id=\"nom\"][name=\"nom\"])+br+(label[for=\"email\"]{Email}>input[type=\"email\"][id=\"email\"][name=\"email\"])+br+(label[for=\"message\"]{Message}>textarea[id=\"message\"][name=\"message\"])+br+(label[for=\"submit\"]{Soumettre les données du formulaire}>input[id=\"submit\"][type=\"submit\"])) \n\n//formulaire de réservation\n\nform[method=\"post\"][aria-label=\"formulaire de réservation]>((fieldset>legend>{Informations personnelles}+(((label[for=\"nom\"]{Nom}>input[id=\"nom\"][name=\"nom\" placeholder=\"exemple: Roger Moore\"])+br+(label[for=\"email\"]{Email}>input[type=\"email\"][id=\"email\"][placeholder=\"[email protected]\"][name=\"email\"])+br+(label[for=\"tel\"]{Téléphone}>input[type=\"tel\"][id=\"tel\"][placeholder=\"+33 01 02 03 04 05 \"][name=\"tel\"]))))+br+(fieldset>(legend{Informations de réservation}+((label[for=\"date_debut\"]{Date d'arrivée}>input[id=\"date_debut\"][id=\"date_debut\"][type=\"date\"][placeholder=\"01/02/2024\"])+(label[for=\"date_fin\"]{Date de fin}>input[id=\"date_fin\"][id=\"date_fin\"][type=\"date\"][placeholder=\"01/02/2024\"])+(label[for=\"nb_personne\"]{Nombre de personne(s)}>input[id=\"nb_personne\"][id=\"nb_personne\"][type=\"number\"][placeholder=\"1\"])))))\n\n//formulaire de recherche\n\nform[method=\"get\"][aria-label=\"Formulaire de recherche\"][role=\"search\"]>label[for=\"search\"]{Formulaire de recherche}>br+input[type=\"search\"][id=\"search\"][role=\"search\"][name=\"texttosearch\"][placeholder=\"Saisir une chaîne de caracteres à rechercher...\"][aria-label=\"formulaire de recherche Rechercher par mot clé\"][title=\"formulaire de recherche - Rechercher par mot clé\"]+button\n\n//formulaire de recherche avec label caché\nform[method=\"get\"][aria-label=\"Formulaire de recherche\"][role=\"search\"]>label.sr-only[for=\"search\"]{Formulaire de recherche}>input[type=\"search\"][id=\"search\"][name=\"texttosearch\"][placeholder=\"Saisir une chaîne de caracteres à rechercher...\"][aria-label=\"formulaire de recherche Rechercher par mot clé\"][title=\"formulaire de recherche - Rechercher par mot clé\"]\n```\n\n## Exemple de structure de tableau :\n\n```html\n table>((caption+thead>tr>th*2)+(tbody>tr*8>td*2))\n\n // tableau accessible\n\n  table>((caption+thead>tr>th[scope=\"col\"]*2)+(tbody>tr*8>td[scope=\"row\"]*2))\n```","tags":"","title":"$:/code/vscode/emmet","modified":"20240912121052667","type":"text/markdown"},
2705{"created":"20240914094531877","text":"yes","title":"$:/config/codemirror-6/autocompleteIcons","caption":"{{$:/language/codemirror6/autocompleteIcons/caption}}","caption-zh":"{{$:/language/codemirror6/zh/autocompleteIcons/caption}}
2705","description":"{{$:/language/codemirror6/autocompleteIcons/description}}","description-zh":"{{$:/language/codemirror6/zh/autocompleteIcons/description}}","settings-template":"$:/plugins/oeyoews/tiddlywiki-codemirror-6/ui/templates/settings/input-switch","modified":"20240914094531877"},
2706{"created":"20240528073340737","title":"$:/config/EditorTypeMappings/text/markdown","text":"codemirror-6","modified":"20241010124847019"},
2707{"created":"20240528074817727","title":"$:/config/EditorTypeMappings/text/vnd.tiddlywiki","text":"codemirror-6","modified":"20240618084124461"},
2708{"created":"20241006181827135","text":"[[$:/core/ui/EditTemplate/fieldEditor/default]]","title":"$:/config/FieldEditorFilters/default","tags":"$:/tags/FieldEditorFilter","modified":"20241006182245215"},
2709{"created":"20240528085439161","title":"$:/config/Manager/Filter","text":"","modified":"20240528085453105"},
2710{"created":"20240528085413986","title":"$:/config/Manager/Show","text":"tiddlers","modified":"20240528085422078"},
2711{"created":"20240528085426513","title":"$:/config/Manager/Sort","text":"color","modified":"20240528085426513"},
2712{"created":"20240313160600678","title":"$:/config/Navigation/UpdateAddressBar","text":"permalink","modified":"20240313160600678"},
2713{"created":"20231211144111841","title":"$:/config/NewJournal/Title","text":"YYYY MM DD","modified":"20231211144759087"},
2714{"created":"20241008120343167","text":"title: $:/config/NewTiddlerTemplate\ntype: text/x-markdown","tags":"","title":"$:/config/NewTiddlerTemplate","modified":"20241008120404917"},
2715{"created":"20231211140141525","text":"show","title":"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/home","modified":"20231211140141525"},
2716{"created":"20231211140159534","text":"hide","title":"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/more-page-actions","modified":"20241108142012389"},
2717{"created":"20241108142003658","text":"hide","title":"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-tiddler","modified":"20241108142003658"},
2718{"created":"20240401210612658","text":"show","title":"$:/config/PageControlButtons/Visibility/$:/plugins/Gk0Wk/drawio/new-drawio-diagram","modified":"20240829195840069"},
2719{"created":"20231211140150954","text":"hide","title":"$:/config/PageControlButtons/Visibility/$:/plugins/kookma/shiraz/ui/Buttons/SwitchPalette","modified":"20231211140150954"},
2720{"created":"20231211140209228","text":"show","title":"$:/config/PageControlButtons/Visibility/$:/plugins/tiddlywiki/markdown/new-markdown-button","modified":"20241108142004668"},
2721{"created":"20231211140149138","text":"hide","title":"$:/config/PageControlButtons/Visibility/$:/themes/nico/notebook/ui/Buttons/SwitchPalette","modified":"20240825123743352"},
2722{"created":"20240606185619143","title":"$:/config/Plugins/Disabled/$:/plugins/tiddlywiki/xlsx-utils","text":"yes","modified":"20240606185619143"},
2723{"created":"20240402201833748","text":"yes","title":"$:/config/RelinkOnRename","modified":"20240402201833748"},
2724{"created":"20240530185857148","title":"$:/config/TextEditor/EditorHeight/Mode","text":"fixed","modified":"20240530185857148"},
2725{"created":"20240319113105051","title":"$:/config/TiddlyTools/TagCloud","taglist":"","modified":"20240319113448856","sortorder":"name"},
2726{"created":"20211210064945704","title":"$:/config/TiddlyWiki-CPL/GitHub","caption":"\u003C$list filter=\"[[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]]\" variable=\"lang\">\u003C$list filter=\"[\u003Clang>search:title[zh]]\">太微中文社区插件源(~GitHub版)\u003C/$list>\u003C$list filter=\"[\u003Clang>!search:title[zh]]\">TiddlyWiki CPL(~GitHub Host)\u003C/$list>\u003C/$list>","creator":"Sttot","modified":"20221112155101127","modifier":"Sttot","tags":"$:/tags/PluginLibrary","type":"text/vnd.tiddlywiki","url":"https://tiddly-gittly.github.io/TiddlyWiki-CPL/library/index.html","text":"\u003C!-- lang变量就是当前语言 -->\n\u003C$list filter=\"[[$:/language]get[text]removeprefix[$:/languages/]else[en-GB]]\" variable=\"lang\">\n\u003C$list filter=\"[\u003Clang>search:title[zh]]\" variable=\"lang\">\n\n欢迎使用''【太微中文社区插件源】''!\n\n本插件源是由[[太微(TiddlyWiki)中文社区|https://github.com/tiddly-gittly]]维护的、致力于搜集网络上所有与 ~TiddlyWiki5 有关插件的、希望为中国以及全世界的太微用户提供一键安装、更新插件体验的公开插件源。\n\n如果还不了解该如何使用太微和本插件源,欢迎阅读[[中文社区共建的太微(TiddlyWiki)教程|https://tw-cn.netlify.app]]里插件相关的部分。如上提到的插件源和教程皆为开源项目,你可以在 [[GitHub|https://github.com/tiddly-gittly]] 中找到并参与贡献!如果乐意,可以通过QQ群等方式加入我们,详情请见如上提到的中文教程。\n\n要添加这个插件库到你的 Wiki 中,只需鼠标拖动这个链接到你的 Wiki 里即可:\u003C$link to=\u003C\u003CcurrentTiddler>>>{{!!caption}}\u003C/$link>\n\n注意:本插件源版本为 ~GitHub Page 的版本,更新更快,但是可能需要科学上网手段。如果你在国内,而且不清楚什么是“科学上网”,请选用另一个经过 netlify.app 加速的[[版本|$:/config/TiddlyWiki-CPL/Netlify]],虽然更新有一定的延迟,但对国内用户更加友好。\n\n@@color:red;''安装任何插件前,请记得备份你的Wiki,本插件源无法为插件造成的个人损失负责!''@@\n\n\u003C/$list>\n\n\u003C$list filter=\"[\u003Clang>!search:title[zh]]\" variable=\"lang\">\n\nWelcome to the ''[TiddlyWiki Chinese Community Plugin Source]''!\n\nThis plugin source is maintained by the [[TiddlyWiki Chinese Community]] and is dedicated to collecting all TiddlyWiki5 related plugins on the web, hoping to provide a one-click installation and update plugin experience for TiddlyWiki users in China and around the world.\n\nIf you don't know how to use TiddlyWiki and this source, you are welcome to read the plugins related section in the [[TiddlyWiki Tutorials for Chinese Communities|https://tw-cn.netlify.app]]. As mentioned above, both the plugin source and the tutorial are open source projects, you can find them in [[GitHub|https://github.com/tiddly-gittly]] and participate in contributing! If you like, you can join us through QQ groups and other means, see the Chinese tutorials mentioned above for details.\n\nTo add this plugin library to your Wiki, just drag this link with your mouse into your Wiki: \u003C$link to=\u003C\u003CcurrentTiddler>>>{{!!caption}}\u003C/$link>\n\nNote: The source version of this plugin is the ~GitHub Page version, which is faster to update, but may require scientific Internet access. If you are in China and are not sure what GFW is, please use another [[version|$:/config/TiddlyWiki-CPL/Netlify]] that is accelerated by netlify.app, although there is a certain delay in updating, but it is more friendly to domestic users more friendly.\n\n@@color:red;''Please remember to back up your Wiki before installing any plugins, this plugin source cannot be held responsible for personal losses caused by plugins!''@@\n\n\u003C/$list>\n\u003C/$list>
2726","revision":"0","bag":"default","year":"2000","month":"6"},
2727{"created":"20231211140019715","text":"show","title":"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-bar","modified":"20231211140019715"},
2728{"created":"20210128111811458","text":"hide","title":"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/info","modified":"20231211135943638","type":"text/vnd.tiddlywiki"},
2729{"created":"20240401210627547","text":"hide","title":"$:/config/ViewToolbarButtons/Visibility/$:/plugins/Gk0Wk/drawio/new-drawio-diagram","modified":"20240401210627547"},
2730{"created":"20241108153115672","text":"\\whitespace trim\n\u003Cdiv class=\"tc-control-panel\">\n\u003C$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/Info\" explicitState=\"$:/state/tab-1749438307\"/>\n\u003C/div>\n","title":"$:/ControlPanel","icon":"$:/core/images/options-button","color":"#bbb","modified":"20241108153115672"},
2731{"title":"$:/core","name":"Core","description":"TiddlyWiki5 core","author":"JeremyRuston","core-version":">=5.0.0","plugin-priority":"0","list":"readme","version":"5.3.1","plugin-type":"plugin","dependents":"","type":"application/json","text":"{\"tiddlers\":{\"$:/Acknowledgements\":{\"title\":\"$:/Acknowledgements\",\"text\":\"TiddlyWiki incorporates code from these fine OpenSource projects:\\n\\n* [[The Stanford Javascript Crypto Library|http://bitwiseshiftleft.github.io/sjcl/]]\\n* [[The Jasmine JavaScript Test Framework|https://jasmine.github.io/]]\\n* [[Normalize.css by Nicolas Gallagher|http://necolas.github.io/normalize.css/]]\\n\\nAnd media from these projects:\\n\\n* World flag icons from [[Wikipedia|http://commons.wikimedia.org/wiki/Category:SVG_flags_by_country]]\\n\"},\"$:/core/copyright.txt\":{\"title\":\"$:/core/copyright.txt\",\"type\":\"text/plain\",\"text\":\"TiddlyWiki created by Jeremy Ruston, (jeremy [at] jermolene [dot] com)\\n\\nCopyright (c) 2004-2007, Jeremy Ruston\\nCopyright (c) 2007-2023, UnaMesa Association\\nAll rights reserved.\\n\\nRedistribution and use in source and binary forms, with or without\\nmodification, are permitted provided that the following conditions are met:\\n\\n* Redistributions of source code must retain the above copyright notice, this\\n  list of conditions and the following disclaimer.\\n\\n* Redistributions in binary form must reproduce the above copyright notice,\\n  this list of conditions and the following disclaimer in the documentation\\n  and/or other materials provided with the distribution.\\n\\n* Neither the name of the copyright holder nor the names of its\\n  contributors may be used to endorse or promote products derived from\\n  this software without specific prior written permission.\\n\\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'\\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\"},\"$:/core/icon\":{\"title\":\"$:/core/icon\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> viewBox=\\\"0 0 128 128\\\">\u003Cpath d=\\\"M64 0l54.56 32v64L64 128 9.44 96V32L64 0zm21.127 95.408c-3.578-.103-5.15-.094-6.974-3.152l-1.42.042c-1.653-.075-.964-.04-2.067-.097-1.844-.07-1.548-1.86-1.873-2.8-.52-3.202.687-6.43.65-9.632-.014-1.14-1.593-5.17-2.157-6.61-1.768.34-3.546.406-5.34.497-4.134-.01-8.24-.527-12.317-1.183-.8 3.35-3.16 8.036-1.21 11.44 2.37 3.52 4.03 4.495 6.61 4.707 2.572.212 3.16 3.18 2.53 4.242-.55.73-1.52.864-2.346 1.04l-1.65.08c-1.296-.046-2.455-.404-3.61-.955-1.93-1.097-3.925-3.383-5.406-5.024.345.658.55 1.938.24 2.53-.878 1.27-4.665 1.26-6.4.47-1.97-.89-6.73-7.162-7.468
2731-11.86 1.96-3.78 4.812-7.07 6.255-11.186-3.146-2.05-4.83-5.384-4.61-9.16l.08-.44c-3.097.59-1.49.37-4.82.628-10.608-.032-19.935-7.37-14.68-18.774.34-.673.664-1.287 1.243-.994.466.237.4 1.18.166 2.227-3.005 13.627 11.67 13.732 20.69 11.21.89-.25 2.67-1.936 3.905-2.495 2.016-.91 4.205-1.282 6.376-1.55 5.4-.63 11.893 2.276 15.19 2.37 3.3.096 7.99-.805 10.87-.615 2.09.098 4.143.483 6.16 1.03 1.306-6.49 1.4-11.27 4.492-12.38 1.814.293 3.213 2.818 4.25 4.167 2.112-.086 4.12.46 6.115 1.066 3.61-.522 6.642-2.593 9.833-4.203-3.234 2.69-3.673 7.075-3.303 11.127.138 2.103-.444 4.386-1.164 6.54-1.348 3.507-3.95 7.204-6.97 7.014-1.14-.036-1.805-.695-2.653-1.4-.164 1.427-.81 2.7-1.434 3.96-1.44 2.797-5.203 4.03-8.687 7.016-3.484 2.985 1.114 13.65 2.23 15.594 1.114 1.94 4.226 2.652 3.02 4.406-.37.58-.936.785-1.54 1.01l-.82.11zm-40.097-8.85l.553.14c.694-.27 2.09.15 2.83.353-1.363-1.31-3.417-3.24-4.897-4.46-.485-1.47-.278-2.96-.174-4.46l.02-.123c-.582 1.205-1.322 2.376-1.72 3.645-.465 1.71 2.07 3.557 3.052 4.615l.336.3z\\\" fill-rule=\\\"evenodd\\\"/>\u003C/svg>\"},\"$:/core/images/add-comment\":{\"title\":\"$:/core/images/add-comment\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-add-comment tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M56 56H36a8 8 0 100 16h20v20a8 8 0 1016 0V72h20a8 8 0 100-16H72V36a8 8 0 10-16 0v20zm-12.595 58.362c-6.683 7.659-20.297 12.903-36.006 12.903-2.196 0-4.35-.102-6.451-.3 9.652-3.836 17.356-12.24 21.01-22.874C8.516 94.28 0 79.734 0 63.5 0 33.953 28.206 10 63 10s63 23.953 63 53.5S97.794 117 63 117c-6.841 0-13.428-.926-19.595-2.638z\\\"/>\u003C/svg>\"},\"$:/core/images/advanced-search-button\":{\"title\":\"$:/core/images/advanced-search-button\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-advanced-search-button tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cg fill-rule=\\\"evenodd\\\">\u003Cpath d=\\\"M74.565 87.985A47.776 47.776 0 0148 96C21.49 96 0 74.51 0 48S21.49 0 48 0s48 21.49 48 48c0 9.854-2.97 19.015-8.062 26.636l34.347 34.347a9.443 9.443 0 010 13.36 9.446 9.446 0 01-13.36 0l-34.36-34.358zM48 80c17.673 0 32-14.327 32-32 0-17.673-14.327-32-32-32-17.673 0-32 14.327-32 32 0 17.673 14.327 32 32 32z\\\"/>\u003Ccircle cx=\\\"48\\\" cy=\\\"48\\\" r=\\\"8\\\"/>\u003Ccircle cx=\\\"28\\\" cy=\\\"48\\\" r=\\\"8\\\"/>\u003Ccircle cx=\\\"68\\\" cy=\\\"48\\\" r=\\\"8\\\"/>\u003C/g>\u003C/svg>\"},\"$:/core/images/auto-height\":{\"title\":\"$:/core/images/auto-height\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-auto-height tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath d=\\\"M67.987 114.356l-.029-14.477a4 4 0 00-2.067-3.494l-15.966-8.813-1.933 7.502H79.9c4.222 0 5.564-5.693 1.786-7.58L49.797 71.572 48.01 79.15h31.982c4.217 0 5.564-5.682 1.795-7.575L49.805 55.517l-1.795 7.575h31.982c4.212 0 5.563-5.67 1.805-7.57l-16.034-8.105 2.195 3.57V35.614l9.214 9.213a4 4 0 105.656-5.656l-16-16a4 4 0 00-5.656 0l-16 16a4 4 0 105.656 5.656l9.13-9.13v15.288a4 4 0 002.195 3.57l16.035 8.106 1.804-7.57H48.01c-4.217 0-5.564 5.682-1.795 7.574l31.982 16.059 1.795-7.575H48.01c-4.222 0-5.564 5.693-1.787 7.579l31.89 15.923 1.787-7.578H47.992c-4.133 0-5.552 5.504-1.933 7.501l15.966 8.813-2.067-3.494.029 14.436-9.159-9.158a4 4 0 00-5.656 5.656l16 16a4 4 0 005.656 0l16-16a4 4 0 10-5.656-5.656l-9.185 9.184zM16 20h96a4 4 0 100-8H16a4 4 0 100 8z\\\"/>\u003C/svg>\"},\"$:/core/images/blank\":{\"title\":\"$:/core/images/blank\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-blank tc-image-button\\\" viewBox=\\\"0 0 128 128\\\"/>\"},\"$:/core/images/bold\":{\"title\":\"$:/core/images/bold\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-bold tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M41.146 51.81V21.87h26.353c2.51 0 4.93.21 7.26.628 2.33.418 4.392 1.165 6.185 2.24 1.793 1.076 3.227 2.57 4.302 4.482 1.076 1.913 1.614 4.363 1.614 7.35 0 5.379-1.613 9.263-4.84 11.653-3.227 2.39-7.35 3.586-12.37 3.586H41.146zM13 0v128h62.028a65.45 65.45 0 0016.762-2.151c5.438-1.434 10.278-3.645 14.52-6.633 4.244-2.988 7.62-6.842 10.13-11.563 2.51-4.721 3.764-10.308 3.764-16.762 0-8.008-1.942-14.85-5.826-20.527-3.884-5.677-9.77-9.65-17.658-11.921 5.737-2.75 10.069-6.275 12.997-10.577 2.928-4.303 4.392-9.681 4.392-16.135 0-5.976-.986-10.995-2.958-15.059-1.972-4.063-4.75-7.32
2731-8.336-9.77-3.585-2.45-7.888-4.213-12.907-5.289C84.888.538 79.33 0 73.235 0H13zm28.146 106.129V70.992H71.8c6.095 0 10.995 1.404 14.7 4.212 3.705 2.81 5.558 7.5 5.558 14.073 0 3.347-.568 6.096-1.703 8.247-1.136 2.151-2.66 3.854-4.572 5.11-1.912 1.254-4.123 2.15-6.633 2.688-2.51.538-5.139.807-7.888.807H41.146z\\\"/>\u003C/svg>\"},\"$:/core/images/cancel-button\":{\"title\":\"$:/core/images/cancel-button\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-cancel-button tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M64 76.314l-16.97 16.97a7.999 7.999 0 01-11.314 0c-3.118-3.118-3.124-8.19 0-11.313L52.686 65l-16.97-16.97a7.999 7.999 0 010-11.314c3.118-3.118 8.19-3.124 11.313 0L64 53.686l16.97-16.97a7.999 7.999 0 0111.314 0c3.118 3.118 3.124 8.19 0 11.313L75.314 65l16.97 16.97a7.999 7.999 0 010 11.314c-3.118 3.118-8.19 3.124-11.313 0L64 76.314zM64 129c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 1 0 29.654 0 65c0 35.346 28.654 64 64 64zm0-16c26.51 0 48-21.49 48-48S90.51 17 64 17 16 38.49 16 65s21.49 48 48 48z\\\"/>\u003C/svg>\"},\"$:/core/images/chevron-down\":{\"title\":\"$:/core/images/chevron-down\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-chevron-down tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cg fill-rule=\\\"evenodd\\\">\u003Cpath d=\\\"M64.053 85.456a7.889 7.889 0 01-5.6-2.316L2.473 27.16a7.92 7.92 0 010-11.196c3.086-3.085 8.105-3.092 11.196 0L64.05 66.344l50.382-50.382a7.92 7.92 0 0111.195 0c3.085 3.086 3.092 8.105 0 11.196l-55.98 55.98a7.892 7.892 0 01-5.595 2.317z\\\"/>\u003Cpath d=\\\"M64.053 124.069a7.889 7.889 0 01-5.6-2.316l-55.98-55.98a7.92 7.92 0 010-11.196c3.086-3.085 8.105-3.092 11.196 0l50.382 50.382 50.382-50.382a7.92 7.92 0 0111.195 0c3.085 3.086 3.092 8.104 0 11.196l-55.98 55.98a7.892 7.892 0 01-5.595 2.316z\\\"/>\u003C/g>\u003C/svg>\"},\"$:/core/images/chevron-left\":{\"title\":\"$:/core/images/chevron-left\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-chevron-left tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cg fill-rule=\\\"evenodd\\\">\u003Cpath d=\\\"M47.544 64.053c0-2.027.77-4.054 2.316-5.6l55.98-55.98a7.92 7.92 0 0111.196 0c3.085 3.086 3.092 8.105 0 11.196L66.656 64.05l50.382 50.382a7.92 7.92 0 010 11.195c-3.086 3.085-8.105 3.092-11.196 0l-55.98-55.98a7.892 7.892 0 01-2.317-5.595z\\\"/>\u003Cpath d=\\\"M8.931 64.053c0-2.027.77-4.054 2.316-5.6l55.98-55.98a7.92 7.92 0 0111.196 0c3.085 3.086 3.092 8.105 0 11.196L28.041 64.05l50.382 50.382a7.92 7.92 0 010 11.195c-3.086 3.085-8.104 3.092-11.196 0l-55.98-55.98a7.892 7.892 0 01-2.316-5.595z\\\"/>\u003C/g>\u003C/svg>\"},\"$:/core/images/chevron-right\":{\"title\":\"$:/core/images/chevron-right\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-chevron-right tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cg fill-rule=\\\"evenodd\\\">\u003Cpath d=\\\"M83.456 63.947c0 2.027-.77 4.054-2.316 5.6l-55.98 55.98a7.92 7.92 0 01-11.196 0c-3.085-3.086-3.092-8.105 0-11.196L64.344 63.95 13.963 13.567a7.92 7.92 0 010-11.195c3.086-3.085 8.105-3.092 11.196 0l55.98 55.98a7.892 7.892 0 012.317 5.595z\\\"/>\u003Cpath d=\\\"M122.069 63.947c0 2.027-.77 4.054-2.316 5.6l-55.98 55.98a7.92 7.92 0 01-11.196 0c-3.085-3.086-3.092-8.105 0-11.196l50.382-50.382-50.382-50.382a7.92 7.92 0 010-11.195c3.086-3.085 8.104-3.092 11.196 0l55.98 55.98a7.892 7.892 0 012.316 5.595z\\\"/>\u003C/g>\u003C/svg>\"},\"$:/core/images/chevron-up\":{\"title\":\"$:/core/images/chevron-up\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-chevron-up tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cg fill-rule=\\\"evenodd\\\">\u003Cpath d=\\\"M63.947 44.544c2.027 0 4.054.77 5.6 2.316l55.98 55.98a7.92 7.92 0 010 11.196c-3.086 3.085-8.105 3.092-11.196 0L63.95 63.656l-50.382 50.382a7.92 7.92 0 01-11.195 0c-3.085-3.086-3.092-8.105 0-11.196l55.98-55.98a7.892 7.892 0 015.595-2.317z\\\"/>\u003Cpath d=\\\"M63.947 5.931c2.027 0 4.054.77 5.6 2.316l55.98 55.98a7.92 7.92 0 010 11.196c-3.086 3.085-8.105 3.092-11.196 0L63.95 25.041 13.567 75.423a7.92 7.92 0 01-11.195 0c-3.085-3.086-3.092-8.104 0-11.196l55.98-55.98a7.892 7.892 0 015.595-2.316z\\\"/>\u003C/g>\u003C/svg>\"},\"$:/core/images/clone-button\":{\"title\":\"$:/core/images/clone-button\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-clone-button tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cg fill-rule=\\\"evenodd\\\">
2731\u003Cpath d=\\\"M32.265 96v24.002A7.996 7.996 0 0040.263 128h79.74a7.996 7.996 0 007.997-7.998v-79.74a7.996 7.996 0 00-7.998-7.997H96V48h12.859a2.99 2.99 0 012.994 2.994v57.865a2.99 2.99 0 01-2.994 2.994H50.994A2.99 2.99 0 0148 108.859V96H32.265z\\\"/>\u003Cpath d=\\\"M40 56h-7.993C27.588 56 24 52.418 24 48c0-4.41 3.585-8 8.007-8H40v-7.993C40 27.588 43.582 24 48 24c4.41 0 8 3.585 8 8.007V40h7.993C68.412 40 72 43.582 72 48c0 4.41-3.585 8-8.007 8H56v7.993C56 68.412 52.418 72 48 72c-4.41 0-8-3.585-8-8.007V56zM8 0C3.58 0 0 3.588 0 8v80c0 4.419 3.588 8 8 8h80c4.419 0 8-3.588 8-8V8c0-4.419-3.588-8-8-8H8zM19 16A2.997 2.997 0 0016 19.001v57.998A2.997 2.997 0 0019.001 80h57.998A2.997 2.997 0 0080 76.999V19.001A2.997 2.997 0 0076.999 16H19.001z\\\"/>\u003C/g>\u003C/svg>\"},\"$:/core/images/close-all-button\":{\"title\":\"$:/core/images/close-all-button\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-close-all-button tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cg fill-rule=\\\"evenodd\\\">\u003Cpath d=\\\"M28 111.314l-14.144 14.143a8 8 0 01-11.313-11.313L16.686 100 2.543 85.856a8 8 0 0111.313-11.313L28 88.686l14.144-14.143a8 8 0 0111.313 
273111.313L39.314 100l14.143 14.144a8 8 0 01-11.313 11.313L28 111.314zM28 39.314L13.856 53.457A8 8 0 012.543 42.144L16.686 28 2.543 13.856A8 8 0 0113.856 2.543L28 16.686 42.144 2.543a8 8 0 0111.313 11.313L39.314 28l14.143 14.144a8 8 0 01-11.313 11.313L28 39.314zM100 39.314L85.856 53.457a8 8 0 01-11.313-11.313L88.686 28 74.543 13.856A8 8 0 0185.856 2.543L100 16.686l14.144-14.143a8 8 0 0111.313 11.313L111.314 28l14.143 14.144a8 8 0 01-11.313 11.313L100 39.314zM100 111.314l-14.144 14.143a8 8 0 01-11.313-11.313L88.686 100 74.543 85.856a8 8 0 0111.313-11.313L100 88.686l14.144-14.143a8 8 0 0111.313 11.313L111.314 100l14.143 14.144a8 8 0 01-11.313 11.313L100 111.314z\\\"/>\u003C/g>\u003C/svg>\"},\"$:/core/images/close-button\":{\"title\":\"$:/core/images/close-button\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-close-button tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M65.086 75.41l-50.113 50.113c-3.121 3.121-8.192 3.126-11.316.002-3.118-3.118-3.123-8.19.002-11.316l50.114-50.114L3.659 13.982C.538 10.86.533 5.79 3.657 2.666c3.118-3.118 8.19-3.123 11.316.002l50.113 50.114L115.2 2.668c3.121-3.121 8.192-3.126 11.316-.002 3.118 3.118 3.123 8.19-.002 11.316L76.4 64.095l50.114 50.114c3.121 3.121 3.126 8.192.002 11.316-3.118 3.118-8.19 3.123-11.316-.002L65.086 75.409z\\\"/>\u003C/svg>\"},\"$:/core/images/close-others-button\":{\"title\":\"$:/core/images/close-others-button\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-close-others-button tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M64 128c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 0 0 28.654 0 64c0 35.346 28.654 64 64 64zm0-16c26.51 0 48-21.49 48-48S90.51 16 64 16 16 37.49 16 64s21.49 48 48 48zm0-16c17.673 0 32-14.327 32-32 0-17.673-14.327-32-32-32-17.673 0-32 14.327-32 32 0 17.673 14.327 32 32 32zm0-16c8.837 0 16-7.163 16-16s-7.163-16-16-16-16 7.163-16 16 7.163 16 16 16z\\\"/>\u003C/svg>\"},\"$:/core/images/copy-clipboard\":{\"title\":\"$:/core/images/copy-clipboard\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-copy-clipboard tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cg fill-rule=\\\"evenodd\\\">\u003Crect width=\\\"33\\\" height=\\\"8\\\" x=\\\"40\\\" y=\\\"40\\\" rx=\\\"4\\\"/>\u003Crect width=\\\"17\\\" height=\\\"8\\\" x=\\\"40\\\" y=\\\"82\\\" rx=\\\"4\\\"/>\u003Crect width=\\\"17\\\" height=\\\"8\\\" x=\\\"40\\\" y=\\\"54\\\" rx=\\\"4\\\"/>\u003Crect width=\\\"33\\\" height=\\\"8\\\" x=\\\"40\\\" y=\\\"96\\\" rx=\\\"4\\\"/>\u003Crect width=\\\"12\\\" height=\\\"8\\\" x=\\\"40\\\" y=\\\"68\\\" rx=\\\"4\\\"/>\u003Cpath d=\\\"M40 16H24c-4.419 0-8 3.59-8 8a8.031 8.031 0 000 .01v95.98a8.03 8.03 0 000 .01c0 4.41 3.581 8 8 8h80a7.975 7.975 0 005.652-2.34 7.958 7.958 0 002.348-5.652v-16.016c0-4.414-3.582-7.992-8-7.992-4.41 0-8 3.578-8 7.992V112H32V32h64v8.008C96 44.422 99.582 48 104 48c4.41 0 8-3.578 8-7.992V23.992a7.963 7.963 0 00-2.343-5.651A7.995 7.995 0 00104.001 16H88c0-4.41-3.585-8-8.007-8H48.007C43.588 8 40 11.582 40 16zm4-1.004A4.001 4.001 0 0148 11h32c2.21 0 4 1.797 4 3.996v4.008A4.001 4.001 0 0180 23H48c-2.21 0-4-1.797-4-3.996v-4.008z\\\"/>\u003Crect width=\\\"66\\\" height=\\\"16\\\" x=\\\"62\\\" y=\\\"64\\\" rx=\\\"8\\\"/>\u003Cpath d=\\\"M84.657 82.343l-16-16v11.314l16-16a8 8 0 10-11.314-11.314l-16 16a8 8 0 000 11.314l16 16a8 8 0 1011.314-11.314z\\\"/>\u003C/g>\u003C/svg>\"},\"$:/core/images/delete-button\":{\"title\":\"$:/core/images/delete-button\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-delete-button tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cg fill-rule=\\\"evenodd\\\" transform=\\\"translate(12)\\\">\u003Crect width=\\\"105\\\" height=\\\"16\\\" y=\\\"11\\\" rx=\\\"8\\\"/>\u003Crect width=\\\"48\\\" height=\\\"16\\\" x=\\\"28\\\" rx=\\\"8\\\"/>\u003Crect width=\\\"16\\\" height=\\\"112\\\" x=\\\"8\\\" y=\\\"16\\\" rx=\\\"8\\\"/>\u003Crect width=\\\"88\\\" height=\\\"16\\\" x=\\\"8\\\" y=\\\"112\\\" rx=\\\"8\\\"/>\u003Crect width=\\\"16\\\" height=\\\"112\\\" x=\\\"80\\\" y=\\\"16\\\" rx=\\\"8\\\"/>\u003Crect width=\\\"16\\\" height=\\\"112\\\" x=\\\"56\\\" y=\\\"16\\\" rx=\\\"8\\\"/>\u003Crect width=\\\"16\\\" height=\\\"112\\\" x=\\\"32\\\" y=\\\"16\\\" rx=\\\"8\\\"/>\u003C/g>\u003C/svg>\"},\"$:/core/images/done-button\":{\"title\":\"$:/core/images/done-button\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-done-button tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M42.26 111.032c-2.051.001-4.103-.78-5.668-2.345L2.662 74.758a8 8 0 01-.005-11.32c3.118-3.117 8.192-3.12 11.32.007l28.278 28.278 72.124-72.124a8.002 8.002 0 0111.314-.001c3.118 3.118 3.124 8.19 0 11.315l-77.78 77.78a7.978 7.978 0 01-5.658 2.343z\\\"/>\u003C/svg>\"},\"$:/core/images/down-arrow\":{\"title\":\"$:/core/images/down-arrow\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-down-arrow tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath d=\\\"M64.177 100.069a7.889 7.889 0 01-5.6-2.316l-55.98-55.98a7.92 7.92 0 010-11.196c3.086-3.085 8.105-3.092 11.196 0l50.382 50.382 50.382-50.382a7.92 7.92 0 0111.195 0c3.086 3.086 3.092 8.104 0 11.196l-55.98 55.98a7.892 7.892 0 01-5.595 2.316z\\\"/>\u003C/svg>\"},\"$:/core/images/download-button\":{\"title\":\"$:/core/images/download-button\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-download-button tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cg fill-rule=\\\"evenodd\\\">\u003Cpath d=\\\"M64 128c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 0 0 28.654 0 64c0 35.346 28.654 64 64 64zm0-16c26.51 0 48-21.49 48-48S90.51 16 64 16 16 37.49 16 64s21.49 48 48 48z\\\" class=\\\"tc-image-download-button-ring\\\"/>\u003Cpath d=\\\"M34.35 66.43l26.892 27.205a4.57 4.57 0 006.516 0L94.65 66.43a4.7 4.7 0 000-6.593 4.581 4.581 0 00-3.258-1.365h-8.46c-2.545 0-4.608-2.087-4.608-4.661v-15.15c0-2.575-2.063-4.662-4.608-4.662H55.284c-2.545 0-4.608 2.087-4.608 4.662v15.15c0 2.574-2.063 4.661-4.608 4.661h-8.46c-2.545 0-4.608 2.087-4.608 4.662a4.69 4.69 0 001.35 3.296z\\\"/>\u003C/g>\u003C/svg>\"},\"$:/core/images/edit-button\":{\"title\":\"$:/core/images/edit-button\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-edit-button tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cg fill-rule=\\\"evenodd\\\">\u003Cpath d=\\\"M95.627 10.059l-5.656 5.657 11.313 11.313 5.657-5.656-11.314-11.314zm5.657-5.657l1.966-1.966c3.123-3.122 8.194-3.129 11.319-.005 3.117 3.118 3.122 8.192-.005 11.32l-1.966 1.965-11.314-11.314zm-16.97 16.97l-60.25 60.25a8.12 8.12 0 00-.322.342c-.1.087-.198.179-.295.275-5.735 5.735-10.702 22.016-10.702 22.016s16.405-5.09 22.016-10.702c.095-.096.186-.193.272-.292a8.12 8.12 0 00.345-.325l60.25-60.25-11.314-11.313zM35.171 124.19c6.788-.577 13.898-2.272 23.689-5.348 1.825-.573 3.57-1.136 6.336-2.04 16-5.226 21.877-6.807 28.745-7.146 8.358-.413 13.854 2.13 17.58 8.699a4 4 0 006.959-3.946c-5.334-9.406-13.745-13.296-24.933-12.744-7.875.39-14.057 2.052-30.835 7.533-2.739.894-4.46 1.45-6.25 2.012-19.46 6.112-30.77 7.072-39.597 1.747a4 4 0 10-4.132 6.85c6.333 3.82 13.754 5.12 22.438 4.383z\\\"/>\u003C/g>\u003C/svg>\"},\"$:/core/images/erase\":{\"title\":\"$:/core/images/erase\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-erase tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M60.087 127.996l63.015-63.015c6.535-6.535 6.528-17.115-.003-23.646L99.466 17.702c-6.539-6.538-17.11
27317-6.532-23.646-.003L4.898 88.62c-6.535 6.534-6.528 17.115.003 23.646l15.73 15.73h39.456zm-34.95-7.313l-14.324-14.325c-3.267-3.268-3.268-8.564-.008-11.824L46.269 59.07l35.462 35.462-26.15 26.15H25.137z\\\"/>\u003C/svg>\"},\"$:/core/images/excise\":{\"title\":\"$:/core/images/excise\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-excise tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M56 107.314l-2.343 2.343a8 8 0 11-11.314-11.314l16-16a8 8 0 0111.314 0l16 16a8 8 0 11-11.314 11.314L72 107.314v14.284c0 3.536-3.582 6.402-8 6.402s-8-2.866-8-6.402v-14.284zM0 40.007C0 35.585 3.59 32 8 32c4.418 0 8 3.588 8 8.007v31.986C16 76.415 12.41 80 8 80c-4.418 0-8-3.588-8-8.007V40.007zm32 0C32 35.585 35.59 32 40 32c4.418 0 8 3.588 8 8.007v31.986C48 76.415 44.41 80 40 80c-4.418 0-8-3.588-8-8.007V40.007zm48 0C80 35.585 83.59 32 88 32c4.418 0 8 3.588 8 8.007v31.986C96 76.415 92.41 80 88 80c-4.418 0-8-3.588-8-8.007V40.007zm-24-32C56 3.585 59.59 0 64 0c4.418 0 8 3.588 8 8.007v31.986C72 44.415 68.41 48 64 48c-4.418 0-8-3.588-8-8.007V8.007zm56 32c0-4.422 3.59-8.007 8-8.007 4.418 0 8 3.588 8 8.007v31.986c0 4.422-3.59 8.007-8 8.007-4.418 0-8-3.588-8-8.007V40.007z\\\"/>\u003C/svg>\"},\"$:/core/images/export-button\":{\"title\":\"$:/core/images/export-button\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-export-button tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M8.003 128H119.993a7.984 7.984 0 005.664-2.349v.007A7.975 7.975 0 00128 120V56c0-4.418-3.59-8-8-8-4.418 0-8 3.58-8 8v56H16V56c0-4.418-3.59-8-8-8-4.418 0-8 3.58-8 8v64c0 4.418 3.59 8 8 8h.003zm48.62-100.689l-8.965 8.966c-3.125 3.125-8.195 3.13-11.319.005-3.118-3.118-3.122-8.192.005-11.319L58.962 2.346A7.986 7.986 0 0164.625 0l-.006.002c2.05-.001 4.102.78 5.666 2.344l22.618 22.617c3.124 3.125 3.129 8.195.005 11.319-3.118 3.118-8.192 3.122-11.319-.005l-8.965-8.966v61.256c0 4.411-3.582 8-8 8-4.41 0-8-3.582-8-8V27.311z\\\"/>\u003C/svg>\"},\"$:/core/images/file\":{\"title\":\"$:/core/images/file\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-file tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath d=\\\"M111.968 30.5H112V120a8 8 0 01-8 8H24a8 8 0 01-8-8V8a8 8 0 018-8h57v.02a7.978 7.978 0 015.998 2.337l22.627 22.627a7.975 7.975 0 012.343 5.516zM81 8H24v112h80V30.5H89c-4.418 0-8-3.578-8-8V8z\\\"/>\u003Crect width=\\\"64\\\" height=\\\"8\\\" x=\\\"32\\\" y=\\\"36\\\" rx=\\\"4\\\"/>\u003Crect width=\\\"64\\\" height=\\\"8\\\" x=\\\"32\\\" y=\\\"52\\\" rx=\\\"4\\\"/>\u003Crect width=\\\"64\\\" height=\\\"8\\\" x=\\\"32\\\" y=\\\"68\\\" rx=\\\"4\\\"/>\u003Crect width=\\\"64\\\" height=\\\"8\\\" x=\\\"32\\\" y=\\\"84\\\" rx=\\\"4\\\"/>\u003Crect width=\\\"64\\\" height=\\\"8\\\" x=\\\"32\\\" y=\\\"100\\\" rx=\\\"4\\\"/>\u003Crect width=\\\"40\\\" height=\\\"8\\\" x=\\\"32\\\" y=\\\"20\\\" rx=\\\"4\\\"/>\u003C/svg>\"},\"$:/core/images/fixed-height\":{\"title\":\"$:/core/images/fixed-height\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-fixed-height tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M60 35.657l-9.172 9.171a4 4 0 11-5.656-5.656l16-16a4 4 0 015.656 0l16 16a4 4 0 01-5.656 5.656L68 35.657v57.686l9.172-9.171a4 4 0 115.656 5.656l-16 16a4 4 0 01-5.656 0l-16-16a4 4 0 115.656-5.656L60 93.343V35.657zM16 116h96a4 4 0 100-8H16a4 4 0 100 8zm0-96h96a4 4 0 100-8H16a4 4 0 100 8z\\\"/>\u003C/svg>\"},\"$:/core/images/fold-all-button\":{\"title\":\"$:/core/images/fold-all-button\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-fold-all tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cg fill-rule=\\\"evenodd\\\">\u003Crect width=\\\"128\\\" height=\\\"16\\\" rx=\\\"8\\\"/>\u003Crect width=\\\"128\\\" height=\\\"16\\\" y=\\\"64\\\" rx=\\\"8\\\"/>\u003Cpath d=\\\"M64.03 20.004c-2.05 0-4.102.78-5.667 2.344L35.746 44.966c-3.125 3.124-3.13 8.194-.005 11.318 3.118 3.118 8.192 3.122 11.319-.005l16.965-16.965 16.966 16.965c3.124 3.125 8.194 3.13 11.318.005 3.118-3.118 3.122-8.191-.005-11.318L69.687 22.348a7.986 7.986 0 00-5.663-2.346zM64.03 85.002c-2.05-.001-4.102.78-5.667 2.344l-22.617 22.617c-3.125 3.125-3.13 8.195-.005 11.319 3.118 3.118 8.192 3.122 11.319-.005l16.965-16.966 16.966 16.966c3.124 3.125 8.194 3.13 11.318.005 3.118-3.118 3.122-8.192-.005-11.319L69.687 87.346A7.986 7.986 0 0064.024 85z\\\"/>\u003C/g>\u003C/svg>\"},\"$:/core/images/fold-button\":{\"title\":\"$:/core/images/fold-button\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-fold tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cg fill-rule=\\\"evenodd\\\">\u003Crect width=\\\"128\\\" height=\\\"16\\\" rx=\\\"8\\\"/>\u003Cpath d=\\\"M64.03 25.004c-2.05 0-4.102.78-5.667 2.344L35.746 49.966c-3.125 3.124-3.13 8.194-.005 11.318 3.118 3.118 8.192 3.122 11.319-.005l16.965-16.965 16.966 16.965c3.124 3.125 8.194 3.13 11.318.005 3.118-3.118 3.122-8.191-.005-11.318L69.687 27.348a7.986 7.986 0 00-5.663-2.346zM64.005 67.379c-2.05 0-4.102.78-5.666 2.344L35.722 92.34c-3.125 3.125-3.13 8.195-.006 11.32 3.118 3.117 8.192 3.121 11.32-.006L64 86.69l16.965 16.965c3.125 3.125 8.195 3.13 11.319.005 3.118-3.118 3.122-8.192-.005-11.319L69.663 69.723A7.986 7.986 0 0064 67.377z\\\"/>\u003C/g>\u003C/svg>\"},\"$:/core/images/fold-others-button\":{\"title\":\"$:/core/images/fold-others-button\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-fold-others tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cg fill-rule=\\\"evenodd\\\">\u003Crect width=\\\"128\\\" height=\\\"16\\\" y=\\\"56.031\\\" rx=\\\"8\\\"/>\u003Cpath d=\\\"M86.632 79.976c-2.05 0-4.102.78-5.666 2.345L64 99.286 47.034 82.321a7.986 7.986 0 00-5.662-2.346l.005.001c-2.05 0-4.102.78-5.666 2.345l-22.618 22.617c-3.124 3.125-3.129 8.195-.005 11.319 3.118 3.118 8.192 3.122 11.319-.005l16.966-16.966 16.965 16.966a7.986 7.986 0 005.663 2.346l-.005-.002c2.05 0 4.102-.78 5.666-2.344l16.965-16.966 16.966 16.966c3.125 3.124 8.194 3.129 11.319.005 3.118-3.118 3.122-8.192-.005-11.319L92.289 82.321a7.986 7.986 0 00-5.663-2.346zM86.7 48.024c-2.05 0-4.102-.78-5.666-2.345L64.07 28.714 47.103 45.679a7.986 7.986 0 01-5.663 2.346l.005-.001c-2.05 0-4.101-.78-5.666-2.345L13.162 23.062c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.192-3.122 11.319.005L41.44 28.714l16.966-16.966a7.986 7.986 0 015.662-2.346l-.005.002c2.05 0 4.102.78 5.666 2.344l16.966 16.966 16.966-16.966c3.124-3.124 8.194-3.129 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319L92.358 45.679a7.986 7.986 0 01-5.663 2.346z\\\"/>\u003C/g>\u003C/svg>\"},\"$:/core/images/folder\":{\"title\":\"$:/core/images/folder\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-folder tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cg fill-rule=\\\"evenodd\\\">\u003Cpath d=\\\"M55.694 128H8C3.58 128 0 124.414 0 119.996V48.004C0 43.584 3.584 40 7.999 40H16v-8c0-4.418 3.578-8 8-8h32a8 8 0 018 8v8h40.001c4.418 0 7.999 3.586 7.999 8.004V59.83l-8-.082v-7.749A4 4 0 0099.997 48H56V36c0-2.21-1.793-4-4.004-4H28.004A4 4 0 0024 36v12H12.003A4 4 0 008 52v64a4 4 0 004.003 4h46.76l-3.069 8z\\\"/>\u003Cpath d=\\\"M23.873 55.5h96.003c4.417 0 7.004 4.053 5.774 9.063l-13.344 54.374c-1.228 5.005-5.808 9.063-10.223 9.063H6.08c-4.417 0-7.003-4.053-5.774-9.063L13.65 64.563c1.228-5.005 5.808-9.063 10.223-9.063zm1.78 8.5h87.994c2.211 0 3.504 2.093 2.891 4.666l-11.12 46.668c-.614 2.577-2.902 4.666-5.115 4.666H12.31c-2.211 0-3.504-2.093-2.891-4.666l11.12-46.668C21.152 66.09 23.44 64 25.653 64z\\\"/>\u003C/g>\u003C/svg>\"},\"$:/core/images/full-screen-button\":{\"title\":\"$:/core/images/full-screen-button\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-full-screen-button tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath d=\\\"M0 8a8 8 0 018-8h32a8 8 0 110 16H16v24a8 8 0 11-16 0V8zM128 120a8 8 0 01-8 8H88a8 8 0 110-16h24V88a8 8 0 1116 0v32zM8 128a8 8 0 01-8-8V88a8 8 0 1116 0v24h24a8 8 0 110 16H8zM120 0a8 8 0 018 8v32a8 8 0 11-16 0V16H88a8 8 0 110-16h32z\\\"/>\u003C/svg>\"},\"$:/core/images/github\":{\"title\":\"$:/core/images/github\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-github tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">
2731\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M63.938 1.607c-35.336 0-63.994 28.69-63.994 64.084 0 28.312 18.336 52.329 43.768 60.802 3.202.59 4.37-1.388 4.37-3.088 0-1.518-.056-5.55-.087-10.897-17.802 3.871-21.558-8.591-21.558-8.591-2.911-7.404-7.108-9.375-7.108-9.375-5.81-3.973.44-3.895.44-3.895 6.424.453 9.803 6.606 9.803 6.606 5.709 9.791 14.981 6.963 18.627 5.322.582-4.138 2.236-6.963 4.063-8.564-14.211-1.617-29.153-7.117-29.153-31.672 0-6.995 2.495-12.718 6.589-17.195-.66-1.621-2.856-8.14.629-16.96 0 0 5.37-1.722 17.597 6.57 5.104-1.424 10.58-2.132 16.022-2.16 5.438.028 10.91.736 16.022 2.16 12.22-8.292 17.582-6.57 17.582-6.57 3.493 8.82 1.297 15.339.64 16.96 4.102 4.477 6.578 10.2 6.578 17.195 0 24.618-14.966 30.035-29.22 31.62 2.295 1.98 4.342 5.89 4.342 11.87 0 8.564-.079 15.476-.079 17.576 0 1.715 1.155 3.71 4.4 3.084 25.413-8.493 43.733-32.494 43.733-60.798 0-35.394-28.657-64.084-64.006-64.084\\\"/>\u003C/svg>\"},\"$:/core/images/gitter\":{\"title\":\"$:/core/images/gitter\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-gitter tc-image-button\\\" viewBox=\\\"0 0 18 25\\\">\u003Cpath d=\\\"M15 5h2v10h-2zM10 5h2v20h-2zM5 5h2v20H5zM0 0h2v15H0z\\\"/>\u003C/svg>\"},\"$:/core/images/globe\":{\"title\":\"$:/core/images/globe\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-globe tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cg fill-rule=\\\"evenodd\\\">\u003Cpath d=\\\"M72.811 37.128v2.554c0 2.196.978 6.881 0 8.832-1.466 2.928-4.65 3.54-6.394 5.867-1.182 1.577-4.618 10.601-3.69 12.92 3.969 9.922 11.534 3.187 17.962 9.293.864.821 2.887 2.273 3.296 3.296 3.29 8.223-7.576 15.009 3.757 26.3 1.245 1.24 3.813-3.817 4.079-4.614.852-2.563 6.725-5.45 9.088-7.053 2.02-1.37 4.873-2.667 6.328-4.745 2.27-3.244 1.48-7.514 3.098-10.745 2.139-4.274 3.828-9.635 5.998-13.966 3.898-7.781 4.721 2.093 5.067 2.439.358.357 1.011 0 1.517 0 .094 0 1.447.099 1.516 0 .65-.935-1.043-17.92-1.318-19.297-1.404-7.01-6.944-15.781-11.865-20.5-6.274-6.015-7.09-16.197-18.259-14.954-.204.022-5.084 10.148-7.777 13.512-3.728 4.657-2.47-4.153-6.526-4.153-.081 0-1.183-.103-1.253 0-.586.88-1.44 3.896-2.306 4.417-.265.16-1.722-.239-1.846 0-2.243 4.3 8.256 2.212 5.792 7.952-2.352 5.481-6.328-1.997-6.328 8.56M44.467 7.01c9.685 6.13.682 12.198 2.694 16.215 1.655 3.303 4.241 5.395 1.714 9.814-2.063 3.608-6.87 3.966-9.623 6.723-3.04 3.044-5.464 8.94-6.79 12.911-1.617 4.843 14.547 6.866 12.063 11.008-1.386 2.311-6.746 1.466-8.437.198-1.165-.873-3.593-.546-4.417-1.78-2.613-3.915-2.26-8.023-3.625-12.128-.938-2.822-6.313-2.12-7.844-.593-.523.522-.33 1.792-.33 2.505 0 5.285 7.12 3.316 7.12 6.46 0 14.636 3.927 6.534 11.14 11.336 10.036 6.683 7.844 7.303 14.946 14.404 3.673 3.673 7.741 3.686 9.425 9.294 1.602 5.331-9.327 5.339-11.716 7.448-1.123.991-2.813 4.146-4.219 4.615-1.792.598-3.234.496-4.944 1.78-2.427 1.82-3.9 4.932-4.02 4.81-2.148-2.147-3.52-15.479-3.89-18.257-.588-4.42-5.59-5.54-6.986-9.03-1.57-3.927 1.524-9.52-1.129-13.761-6.52-10.424-11.821-14.5-15.35-26.292-.942-3.148 3.342-6.529 4.877-8.833 1.877-2.816 2.662-5.854 4.746-8.635C22.147 24.19 40.855 9.461 43.857 8.635l.61-1.625z\\\"/>\u003Cpath d=\\\"M64 126c34.242 0 62-27.758 62-62 0-34.242-27.758-62-62-62C29.758 2 2 29.758 2 64c0 34.242 27.758 62 62 62zm0-6c30.928 0 56-25.072 56-56S94.928 8 64 8 8 33.072 8 64s25.072 56 56 56z\\\"/>\u003C/g>\u003C/svg>\"},\"$:/core/images/heading-1\":{\"title\":\"$:/core/images/heading-1\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-heading-1 tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M14 30h13.25v30.104H61.7V30h13.25v75.684H61.7V71.552H27.25v34.132H14V30zm70.335 13.78c2.544 0 5.017-.212 7.42-.636 2.403-.424 4.576-1.13 6.52-2.12 1.942-.99 3.603-2.261 4.981-3.816 1.378-1.555 2.28-3.463 2.703-5.724h9.858v74.2h-13.25V53.32H84.335v-9.54z\\\"/>\u003C/svg>\"},\"$:/core/images/heading-2\":{\"title\":\"$:/core/images/heading-2\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-heading-2 tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M6 30h13.25v30.104H53.7V30h13.25v75.684H53.7V71.552H19.25v34.132H6V30zm119.52 75.684H74.85c.07-6.148 1.555-11.519 4.452-16.112 2.897-4.593 6.855-8.586 11.872-11.978a133.725 133.725 0 017.526-5.141 59.6 59.6 0 007.208-5.353c2.19-1.908 3.993-3.975 5.406-6.201 1.413-2.226 2.155-4.788 2.226-7.685 0-1.343-.159-2.774-.477-4.293a11.357 11.357 0 00-1.855-4.24c-.919-1.307-2.19-2.403-3.816-3.286-1.625-.883-3.745-1.325-6.36-1.325-2.403 0-4.399.477-5.989 1.431-1.59.954-2.862 2.261-3.816 3.922-.954 1.66-1.66 3.622-2.12 5.883-.46 2.261-.724 4.7-.795 7.314H76.23c0-4.099.548-7.897 1.643-11.395 1.095-3.498 2.738-6.519 4.93-9.063 2.19-2.544 4.857-4.54 8.002-5.989C93.95 30.724 97.606 30 101.775 30c4.523 0 8.303.742 11.342 2.226 3.039 1.484 5.494 3.357 7.367 5.618 1.873 2.261 3.198 4.717 3.975 7.367.777 2.65 1.166 5.176 1.166 7.579 0 2.968-.46 5.653-1.378 8.056a25.942 25.942 0 01-3.71 6.625 37.5 37.5 0 01-5.3 5.565 79.468 79.468 0 01-6.148 4.77 165.627 165.627 0 01-6.36 4.24 94.28 94.28 0 00-5.883 4.028c-1.802 1.343-3.374 2.738-4.717 4.187-1.343 1.449-2.261 2.986-2.756 4.611h36.146v10.812z\\\"/>\u003C/svg>\"},\"$:/core/images/heading-3\":{\"title\":\"$:/core/images/heading-3\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-heading-3 tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M6 30h13.25v30.104H53.7V30h13.25v75.684H53.7V71.552H19.25v34.132H6V30zm88.885 32.224c1.979.07 3.957-.07 5.936-.424 1.979-.353 3.745-.972 5.3-1.855a10.365 10.365 0 003.763-3.657c.954-1.555 1.431-3.463 1.431-5.724 0-3.18-1.078-5.724-3.233-7.632-2.155-1.908-4.929-2.862-8.32-2.862-2.12 0-3.958.424-5.513 1.272a11.318 11.318 0 00-3.869 3.445c-1.025 1.449-1.784 3.074-2.279 4.876a18.335 18.335 0 00-.636 5.56
27315H75.381c.141-3.604.813-6.943 2.014-10.017 1.201-3.074 2.844-5.742 4.93-8.003 2.084-2.261 4.61-4.028 7.578-5.3C92.871 30.636 96.228 30 99.973 30a29.2 29.2 0 018.533 1.272c2.791.848 5.3 2.085 7.526 3.71s4.01 3.692 5.353 6.201c1.343 2.509 2.014 5.388 2.014 8.639 0 3.745-.848 7.014-2.544 9.805-1.696 2.791-4.346 4.823-7.95 6.095v.212c4.24.848 7.544 2.95 9.911 6.307s3.551 7.438 3.551 12.243c0 3.533-.707 6.696-2.12 9.487a21.538 21.538 0 01-5.724 7.102c-2.403 1.943-5.194 3.445-8.374 4.505-3.18 1.06-6.537 1.59-10.07 1.59-4.31 0-8.074-.618-11.289-1.855s-5.9-2.986-8.056-5.247c-2.155-2.261-3.798-4.982-4.929-8.162-1.13-3.18-1.731-6.713-1.802-10.6h12.084c-.141 4.523.972 8.286 3.34 11.289 2.366 3.003 5.917 4.505 10.652 4.505 4.028 0 7.402-1.148 10.123-3.445 2.72-2.297 4.081-5.565 4.081-9.805 0-2.897-.565-5.194-1.696-6.89a10.97 10.97 0 00-4.452-3.869c-1.837-.883-3.904-1.431-6.2-1.643a58.067 58.067 0 00-7.05-.212v-9.01z\\\"/>\u003C/svg>\"},\"$:/core/images/heading-4\":{\"title\":\"$:/core/images/heading-4\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-heading-4 tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M8 30h13.25v30.104H55.7V30h13.25v75.684H55.7V71.552H21.25v34.132H8V30zm76.59 48.548h22.471V45.9h-.212L84.59 78.548zm43.46 9.54h-9.54v17.596H107.06V88.088h-31.8V76.11l31.8-44.626h11.448v47.064h9.54v9.54z\\\"/>\u003C/svg>\"},\"$:/core/images/heading-5\":{\"title\":\"$:/core/images/heading-5\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-heading-5 tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M6 30h13.25v30.104H53.7V30h13.25v75.684H53.7V71.552H19.25v34.132H6V30zm77.755 1.484h38.372v10.812H92.765L88.95 61.164l.212.212c1.625-1.837 3.692-3.233 6.201-4.187 2.509-.954 5-1.431 7.473-1.431 3.675 0 6.96.618 9.858 1.855 2.897 1.237 5.335 2.968 7.314 5.194s3.48 4.858 4.505 7.897c1.025 3.039 1.537 6.325 1.537 9.858 0 2.968-.477 6.024-1.43 9.169a25.161 25.161 0 01-4.559 8.586c-2.085 2.58-4.752 4.7-8.003 6.36-3.25 1.66-7.137 2.491-11.66 2.491-3.604 0-6.943-.477-10.017-1.431-3.074-.954-5.777-2.385-8.109-4.293-2.332-1.908-4.187-4.258-5.565-7.049-1.378-2.791-2.138-6.06-2.279-9.805h12.084c.353 4.028 1.731 7.12 4.134 9.275 2.403 2.155 5.583 3.233 9.54 3.233 2.544 0 4.7-.424 6.466-1.272 1.767-.848 3.198-2.014 4.293-3.498 1.095-1.484 1.873-3.215 2.332-5.194.46-1.979.69-4.099.69-6.36 0-2.05-.284-4.01-.849-5.883-.565-1.873-1.413-3.516-2.544-4.929-1.13-1.413-2.597-2.544-4.399-3.392-1.802-.848-3.904-1.272-6.307-1.272-2.544 0-4.929.477-7.155 1.431-2.226.954-3.834 2.738-4.823 5.353H75.805l7.95-40.598z\\\"/>\u003C/svg>\"},\"$:/core/images/heading-6\":{\"title\":\"$:/core/images/heading-6\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-heading-6 tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M6 30h13.25v30.104H53.7V30h13.25v75.684H53.7V71.552H19.25v34.132H6V30zm106.587 20.246c-.283-3.039-1.36-5.494-3.233-7.367-1.873-1.873-4.399-2.809-7.579-2.809-2.19 0-4.08.406-5.67 1.219a12.435 12.435 0 00-4.029 3.233c-1.095 1.343-1.979 2.88-2.65 4.611a37.696 37.696 0 00-1.643 5.459 46.08 46.08 0 00-.9 5.671 722.213 722.213 0 00-.478 5.247l.212.212c1.625-2.968 3.87-5.176 6.731-6.625 2.862-1.449 5.954-2.173 9.275-2.173 3.675 0 6.96.636 9.858 1.908 2.897 1.272 5.353 3.021 7.367 5.247 2.014 2.226 3.551 4.858 4.611 7.897 1.06 3.039 1.59 6.325 1.59 9.858 0 3.604-.583 6.943-1.749 10.017-1.166 3.074-2.844 5.76-5.035 8.056-2.19 2.297-4.805 4.081-7.844 5.353-3.039 1.272-6.395 1.908-10.07 1.908-5.441 0-9.91-1.007-13.409-3.021-3.498-2.014-6.254-4.77-8.268-8.268-2.014-3.498-3.41-7.597-4.187-12.296-.777-4.7-1.166-9.77-1.166-15.211 0-4.452.477-8.94 1.431-13.462.954-4.523 2.526-8.639 4.717-12.349 2.19-3.71 5.07-6.731 8.64-9.063C92.676 31.166 97.075 30 102.304 30c2.968 0 5.76.495 8.374 1.484 2.615.99 4.93 2.367 6.943 4.134 2.014 1.767 3.657 3.887 4.93 6.36 1.271 2.473 1.978 5.23 2.12 8.268h-12.085zm-11.66 46.852c2.19 0 4.099-.442 5.724-1.325a12.869 12.869 0 004.081-3.445c1.095-1.413 1.908-3.056 2.438-4.929.53-1.873.795-3.798.795-5.777s-.265-3.887-.795-5.724c-.53-1.837-1.343-3.445-2.438-4.823-1.095-1.378-2.456-2.491-4.08
2731-3.339-1.626-.848-3.534-1.272-5.725-1.272-2.19 0-4.116.406-5.777 1.219-1.66.813-3.056 1.908-4.187 3.286-1.13 1.378-1.979 2.986-2.544 4.823-.565 1.837-.848 3.78-.848 5.83 0 2.05.283 3.993.848 5.83.565 1.837 1.413 3.48 2.544 4.929a12.39 12.39 0 004.187 3.445c1.66.848 3.586 1.272 5.777 1.272z\\\"/>\u003C/svg>\"},\"$:/core/images/help\":{\"title\":\"$:/core/images/help\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-help tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M36.055 111.441c-5.24 4.396-15.168 7.362-26.555 7.362-1.635 0-3.24-.06-4.806-.179 7.919-2.64 14.062-8.6 16.367-16.014C8.747 92.845 1.05 78.936 1.05 63.5c0-29.547 28.206-53.5 63-53.5s63 23.953 63 53.5-28.206 53.5-63 53.5c-10.055 0-19.56-2-27.994-5.559zm35.35-33.843a536.471 536.471 0 00.018-4.682 199.02 199.02 0 00-.023-3.042c.008-1.357.595-2.087 3.727-4.235.112-.077 1.085-.74 1.386-.948 3.093-2.133 5.022-3.786 6.762-6.187 2.34-3.228 3.558-7.077 3.558-11.649 0-13.292-9.86-21.952-21.455-21.952-11.103 0-22.499 9.609-24.066 22.295a6.023 6.023 0 1011.956 1.477c.806-6.527 6.972-11.726 12.11-11.726 5.265 0 9.408 3.64 9.408 9.906 0 3.634-1.1 5.153-5.111 7.919l-1.362.93c-2.682 1.84-4.227 3.1-5.7 4.931-2.109 2.62-3.242 5.717-3.258 9.314.013.892.02 1.86.022 2.981a470.766 470.766 0 01-.022 4.943 6.023 6.023 0 1012.046.12l.003-.395zm-6.027 24.499a7.529 7.529 0 100-15.058 7.529 7.529 0 000 15.058z\\\"/>\u003C/svg>\"},\"$:/core/images/home-button\":{\"title\":\"$:/core/images/home-button\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-home-button tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M112.985 119.502c.01-.165.015-.331.015-.499V67.568c3.137 2.948 8.076 2.884 11.134-.174a7.999 7.999 0 00-.002-11.316L70.396 2.343A7.978 7.978 0 0064.734 0a7.957 7.957 0 00-5.656 2.343L33 28.42V8.007C33 3.585 29.41 0 25 0c-4.418 0-8 3.59-8 8.007V44.42L5.342 56.078c-3.125 3.125-3.12 8.198-.002 11.316a7.999 7.999 0 0011.316-.003l.344-.343v52.945a8.11 8.11 0 000 .007c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8a8.11 8.11 0 00-.015-.498zM97 112V51.574L64.737 19.31 33 51.048V112h64z\\\"/>\u003C/svg>\"},\"$:/core/images/import-button\":{\"title\":\"$:/core/images/import-button\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-import-button tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M114.832 60.436s3.235-3.27 6.921.417c3.686 3.686.231 7.14.231 7.14l-42.153 42.92s-30.765 32.367-58.798 4.333C-7 87.213 24.59 55.623 24.59 55.623L67.363 12.85s22.725-24.6 43.587-3.738c20.862 20.862-3.96 43.09-3.96 43.09l-35.04 35.04S49.903 112.546 36.426 99.07c-13.476-13.477 11.83-35.523 11.83-35.523l35.04-35.04s3.902-3.902 7.78-.023c3.879 3.878.118 7.921.118 7.921l-35.04 35.04s-13.212 13.212-8.872 17.551c4.34 4.34 16.77-9.653 16.77-9.653l35.04-35.04s16.668-14.598 3.966-27.3c-13.893-13.892-27.565 3.702-27.565 3.702l-42.91 42.91s-23.698 23.698-3.658 43.738 43.012-4.385 43.012-4.385l42.895-42.533z\\\"/>\u003C/svg>\"},\"$:/core/images/info-button\":{\"title\":\"$:/core/images/info-button\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-info-button tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cg fill-rule=\\\"evenodd\\\" transform=\\\"translate(.05)\\\">\u003Cpath d=\\\"M64 128c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 0 0 28.654 0 64c0 35.346 28.654 64 64 64zm0-16c26.51 0 48-21.49 48-48S90.51 16 64 16 16 37.49 16 64s21.49 48 48 48z\\\"/>\u003Ccircle cx=\\\"64\\\" cy=\\\"32\\\" r=\\\"8\\\"/>\u003Crect width=\\\"16\\\" height=\\\"56\\\" x=\\\"56\\\" y=\\\"48\\\" rx=\\\"8\\\"/>\u003C/g>\u003C/svg>\"}
2731,\"$:/core/images/italic\":{\"title\":\"$:/core/images/italic\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-italic tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M66.711 0h22.41L62.408 128H40z\\\"/>\u003C/svg>\"},\"$:/core/images/layout-button\":{\"title\":\"$:/core/images/layout-button\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-layout-button tc-image-button\\\" viewBox=\\\"0 0 24 24\\\" stroke-width=\\\"1\\\" stroke=\\\"none\\\">\u003Cpath d=\\\"M0 0h24v24H0z\\\" fill=\\\"none\\\"/>\u003Crect x=\\\"2\\\" y=\\\"2\\\" width=\\\"7\\\" height=\\\"7\\\" rx=\\\"2\\\"/>\u003Crect x=\\\"2\\\" y=\\\"13\\\" width=\\\"7\\\" height=\\\"9\\\" rx=\\\"2\\\"/>\u003Crect x=\\\"12\\\" y=\\\"2\\\" width=\\\"10\\\" height=\\\"20\\\" rx=\\\"2\\\"/>\u003C/svg>\"},\"$:/core/images/left-arrow\":{\"title\":\"$:/core/images/left-arrow\",\"created\":\"20150315234410875\",\"modified\":\"20150315235324760\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-left-arrow tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath d=\\\"M0 64.177c0-2.026.771-4.054 2.317-5.6l55.98-55.98a7.92 7.92 0 0111.195.001c3.086 3.085 3.092 8.104.001 11.195L19.111 64.175l50.382 50.382a7.92 7.92 0 010 11.195c-3.086 3.086-8.105 3.092-11.196.001l-55.98-55.98A7.892 7.892 0 010 64.177z\\\"/>\u003C/svg>\"},\"$:/core/images/line-width\":{\"title\":\"$:/core/images/line-width\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-line-width tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M16 18h96a2 2 0 000-4H16a2 2 0 100 4zm0 17h96a4 4 0 100-8H16a4 4 0 100 8zm0 21h96a6 6 0 000-12H16a6 6 0 100 12zm0 29h96c5.523 0 10-4.477 10-10s-4.477-10-10-10H16c-5.523 0-10 4.477-10 10s4.477 10 10 10zm0 43h96c8.837 0 16-7.163 16-16s-7.163-16-16-16H16c-8.837 0-16 7.163-16 16s7.163 16 16 16z\\\"/>\u003C/svg>\"},\"$:/core/images/link\":{\"title\":\"$:/core/images/link\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-link tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cg fill-rule=\\\"evenodd\\\">\u003Cpath d=\\\"M42.263 69.38a31.919 31.919 0 006.841 10.13c12.5 12.5 32.758 12.496 45.255 0l22.627-22.628c12.502-12.501 12.497-32.758 0-45.255-12.5-12.5-32.758-12.496-45.254 0L49.104 34.255a32.333 32.333 0 00-2.666 3.019 36.156 36.156 0 0121.94.334l14.663-14.663c6.25-6.25 16.382-6.254 22.632-.004 6.248 6.249 6.254 16.373-.004 22.631l-22.62 22.62c-6.25 6.25-16.381 6.254-22.631.004a15.93 15.93 0 01-4.428-8.433 11.948 11.948 0 00-7.59 3.48l-6.137 6.137z\\\"/>\u003Cpath d=\\\"M86.35 59.234a31.919 31.919 0 00-6.84-10.13c-12.5-12.5-32.758-12.497-45.255 0L11.627 71.732c-12.501 12.5-12.496 32.758 0 45.254 12.5 12.5 32.758 12.497 45.255 0L79.51 94.36a32.333 32.333 0 002.665-3.02 36.156 36.156 0 01-21.94-.333l-14.663 14.663c-6.25 6.25-16.381 6.253-22.63.004-6.25-6.249-6.255-16.374.003-22.632l22.62-22.62c6.25-6.25 16.381-6.253 22.631-.003a15.93 15.93 0 014.428 8.432 11.948 11.948 0 007.59-3.48l6.137-6.136z\\\"/>\u003C/g>\u003C/svg>\"},\"$:/core/images/linkify\":{\"title\":\"$:/core/images/linkify\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-linkify-button tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M17.031 31.919H9.048V96.85h7.983v6.92H0V25h17.031v6.919zm24.66 0h-7.983V96.85h7.983v6.92H24.66V25h17.03v6.919zM67.77 56.422l11.975-3.903 2.306 7.096-12.063 3.903 7.628 10.379-6.12 4.435-7.63-10.467-7.45 10.2-5.943-4.523L58.1 63.518 45.95 59.35l2.306-7.096 12.064 4.17V43.825h7.45v12.596zM86.31 96.85h7.982V31.92H86.31V25h17.031v78.77H86.31v-6.92zm24.659 0h7.983V31.92h-7.983V25H128v78.77h-17.031v-6.92z\\\"/>\u003C/svg>\"},\"$:/core/images/list-bullet\":{\"title\":\"$:/core/images/list-bullet\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-list-bullet tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M11.636 40.273c6.427 0 11.637-5.21 11.637-11.637C23.273 22.21 18.063 17 11.636 17 5.21 17 0 22.21 0 28.636c0 6.427 5.21 11.637 11.636 11.637zm0 34.909c6.427 0 11.637-5.21 11.637-11.637 0-6.426-5.21-11.636-11.637-11.636C5.21 51.91 0 57.12 0 63.545c0 6.427 5.21 11.637 11.636 11.637zm0 34.909c6.427 0 11.637-5.21 11.637-11.636 0-6.427-5.21-11.637-11.637-11.637C5.21 86.818 0 92.028 0 98.455c0 6.426 5.21 11.636 11.636 11.636zM34.91 22.818H128v11.637H34.91V22.818zm0 34.91H128v11.636H34.91V57.727zm0 34.908H128v11.637H34.91V92.636z\\\"/>\u003C/svg>\"},\"$:/core/images/list-number\":{\"title\":\"$:/core/images/list-number\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-list-number tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M33.84 22.356H128v11.77H33.84v-11.77zm0 35.31H128v11.77H33.84v-11.77zm0 35.311H128v11.77H33.84v-11.77zM.38 42.631v-2.223h.998c.826 0 1.445-.14 1.858-.42.413-.28.619-.948.619-2.002V22.769c0-1.442-.193-2.336-.58-2.683-.385-.347-1.477-.52-3.275-.52v-2.143c3.502-.147 6.252-.955 8.25-2.423h2.117v22.865c0 .921.15 1.575.449 1.963.3.387.949.58 1.948.58h.998v2.223H.38zm-.3 35.356v-1.902c7.19-6.554 10.786-12.58 10.786-18.08 0-1.562-.326-2.81-.979-3.744-.652-.934-1.524-1.402-2.616-1.402-.893 0-1.655.317-2.287.952-.633.634-.95 1.364-.95 2.192 0 .974.247 1.829.74 2.563.106.16.16.28.16.36 0 .147-.16.28-.48.4-.213.08-.752.308-1.618.681-.839.374-1.358.561-1.558.561-.24 0-.512-.37-.819-1.111A6.2 6.2 0 010 57.064c0-1.949.849-3.544 2.547-4.785 1.698-1.242 3.798-1.862 6.302-1.862 2.463 0 4.53.67 6.202 2.012 1.67 1.341 2.506 3.093 2.506 5.256a8.644 8.644 0 01-.849 3.724c-.566 1.201-1.92 3.053-4.064 5.556a165.471 165.471 0 01-6.272 6.938h11.445l-1.019 5.726h-2.117c.08-.28.12-.534.12-.76 0-.388-.1-.631-.3-.731-.2-.1-.599-.15-1.198-.15H.08zm12.124 19.207c1.745.04 3.236.637 4.474 1.792 1.239 1.154 1.858 2.773 1.858 4.855 0 2.99-1.132 5.393-3.396 7.208-2.263 1.815-5 2.723-8.209 2.723-2.01 0-3.669-.384-4.974-1.151C.652 111.853 0 110.849 0 109.607c0-.774.27-1.398.809-1.872.54-.474 1.128-.71 1.768-.71.639 0 1.162.2 1.568.6.406.4.782 1.055 1.128 1.962.466 1.268 1.239 1.902 2.317 1.902 1.265 0 2.287-.477 3.066-1.431.78-.955 1.169-2.686 1.169-5.196 0-1.709-.12-3.023-.36-3.944-.24-.921-.792-1.382-1.658-1.382-.586 0-1.185.307-1.797.921-.493.494-.932.741-1.319.741-.333 0-.602-.147-.809-.44-.206-.294-.31-.574-.31-.841 0-.32.104-.594.31-.821.207-.227.69-.594 1.449-1.102 2.876-1.922 4.314-4.017 4.3
273114-6.287 0-1.188-.306-2.092-.919-2.713a3.001 3.001 0 00-2.217-.93c-.799 0-1.525.263-2.177.79-.653.528-.979 1.158-.979 1.892 0 .641.253 1.235.76 1.782.172.2.259.367.259.5 0 .121-.57.428-1.708.922-1.139.494-1.854.74-2.147.74-.413 0-.75-.333-1.009-1-.26-.668-.39-1.282-.39-1.842 0-1.749.93-3.224 2.787-4.425 1.858-1.202 3.965-1.802 6.322-1.802 2.064 0 3.851.447 5.363 1.341 1.511.895 2.267 2.116 2.267 3.664 0 1.362-.57 2.623-1.708 3.784a13.387 13.387 0 01-3.945 2.784z\\\"/>\u003C/svg>\"},\"$:/core/images/list\":{\"title\":\"$:/core/images/list\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-list tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M87.748 128H23.999c-4.418 0-7.999-3.59-7.999-8.007V8.007C16 3.585 19.588 0 24 0h80c4.419 0 8 3.59 8 8.007V104H91.25c-.965 0-1.84.392-2.473 1.025a3.476 3.476 0 00-1.029 2.476V128zm8-.12l15.88-15.88h-15.88v15.88zM40 15.508A3.502 3.502 0 0143.5 12h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 20h-55a3.498 3.498 0 01-3.5-3.509v-.982zM32 22a6 6 0 100-12 6 6 0 000 12zm8 9.509A3.502 3.502 0 0143.5 28h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 36h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 44h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 52h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 60h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 68h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 76h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 84h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 92h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 100h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.505 3.505 0 0143.497 108h33.006A3.497 3.497 0 0180 111.509v.982A3.505 3.505 0 0176.503 116H43.497A3.497 3.497 0 0140 112.491v-.982zM32 38a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12z\\\"/>\u003C/svg>\"},\"$:/core/images/locked-padlock\":{\"title\":\"$:/core/images/locked-padlock\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-locked-padlock tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M96.472 64H105v32.01C105 113.674 90.674 128 73.001 128H56C38.318 128 24 113.677 24 96.01V64h8c.003-15.723.303-47.731 32.16-47.731 31.794 0 32.305 32.057 32.312 47.731zm-15.897 0H48.44c.002-16.287.142-32 15.719-32 15.684 0 16.977 16.136 16.415 32zM67.732 92.364A8.503 8.503 0 0064.5 76a8.5 8.5 0 00-3.498 16.25l-5.095 22.77H72.8l-5.07-22.656z\\\"/>\u003C/svg>\"},\"$:/core/images/mail\":{\"title\":\"$:/core/images/mail\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-mail tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M122.827 104.894a7.986 7.986 0 01-2.834.516H8.007c-.812 0-1.597-.12-2.335-.345l34.163-34.163 20.842 20.842a3.998 3.998 0 003.418 1.134 4.003 4.003 0 003.395-1.134L88.594 70.64c.075.09.155.176.24.26l33.993 33.994zm5.076-6.237c.064-.406.097-.823.097-1.247v-64c0-.669-.082-1.318-.237-1.94L94.23 65.006c.09.075.177.154.261.239l33.413 33.413zm-127.698.56A8.023 8.023 0 010 97.41v-64c0-.716.094-1.41.271-2.071l33.907 33.906L.205 99.218zM5.93 25.684a8.012 8.012 0 012.078-.273h111.986c.766 0 1.507.108 2.209.308L64.083 83.837 5.93 25.683z\\\"/>\u003C/svg>\"},\"$:/core/images/mastodon\":{\"title\":\"$:/core/images/mastodon\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-mastodon tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\\n  \u003Cpath d=\\\"M112.716,76.735C111.231,85.764 99.411,95.646 85.836,97.561C78.757,98.559 71.787,99.476 64.355,99.073C52.201,98.415 42.61,95.646 42.61,95.646C42.61,97.044 42.683,98.374 42.829,99.619C44.409,113.79 54.723,114.639 64.493,115.035C74.354,115.434 83.134,112.163 83.134,112.163L83.539,122.695C83.539,122.695 76.642,127.071 64.355,127.875C57.58,128.315 49.167,127.674 39.369,124.61C18.118,117.965 14.463,91.202 13.904,64.048C13.733,55.985 13.839,48.383 13.839,42.024C13.839,14.257 29.238,6.118 29.238,6.118C37.002,1.905 50.326,0.134 64.177,-0L64.517,-0C78.369,0.134 91.701,1.905 99.465,6.118C99.465,6.118 114.864,14.257 114.864,42.024C114.864,42.024 115.057,62.511 112.716,76.735ZM96.7,44.179C96.7,37.307 95.219,31.847 92.245,27.807C89.177,23.767 85.16,21.696 80.174,21.696C74.403,21.696 70.034,24.316 67.146,29.556L64.337,35.118L61.529,29.556C58.64,24.316 54.271,21.696 48.501,21.696C43.514,21.696 39.497,23.767 36.43,27.807C33.455,31.847 31.974,37.307 31.974,44.179L31.974,77.8L43.249,77.8L43.249,45.16
27317C43.249,38.288 45.699,34.796 50.599,34.796C56.017,34.796 58.733,38.938 58.733,47.128L58.733,64.99L69.941,64.99L69.941,47.128C69.941,38.938 72.657,34.796 78.075,34.796C82.975,34.796 85.425,38.288 85.425,45.167L85.425,77.8L96.7,77.8L96.7,44.179Z\\\"/>\\n\u003C/svg>\\n\"},\"$:/core/images/menu-button\":{\"title\":\"$:/core/images/menu-button\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-menu-button tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Crect width=\\\"128\\\" height=\\\"16\\\" y=\\\"16\\\" rx=\\\"8\\\"/>\u003Crect width=\\\"128\\\" height=\\\"16\\\" y=\\\"56\\\" rx=\\\"8\\\"/>\u003Crect width=\\\"128\\\" height=\\\"16\\\" y=\\\"96\\\" rx=\\\"8\\\"/>\u003C/svg>\"},\"$:/core/images/minus-button\":{\"title\":\"$:/core/images/minus-button\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-minus-button tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath d=\\\"M64 0c35.346 0 64 28.654 64 64 0 35.346-28.654 64-64 64-35.346 0-64-28.654-64-64C0 28.654 28.654 0 64 0zm.332 16c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.49-48-48-48z\\\"/>\u003Crect width=\\\"80\\\" height=\\\"16\\\" x=\\\"24\\\" y=\\\"56\\\" rx=\\\"8\\\"/>\u003C/svg>\"},\"$:/core/images/mono-block\":{\"title\":\"$:/core/images/mono-block\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-mono-block tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M23.965 32.967h.357c.755 0 1.328.192 1.72.577.39.384.586.947.586 1.688 0 .824-.206 1.418-.618 1.782-.413.363-1.094.545-2.045.545h-6.31c-.965 0-1.65-.178-2.056-.535-.405-.356-.608-.954-.608-1.792 0-.811.203-1.391.608-1.74.406-.35 1.09-.525 2.055-.525h.734l-.86-2.453H8.471l-.902 2.453h.734c.95 0 1.632.178 2.044.535.413.356.619.933.619 1.73 0 .824-.206 1.418-.619 1.782-.412.363-1.094.545-2.044.545h-5.41c-.964 0-1.649-.182-2.054-.545-.406-.364-.608-.958-.608-1.782 0-.741.195-1.304.587-1.688.391-.385.964-.577 1.719-.577h.356l5.62-15.641H6.835c-.95 0-1.632-.182-2.044-.546-.412-.363-.619-.95-.619-1.76 0-.825.207-1.42.619-1.783.412-.363 1.094-.545 2.044-.545h7.863c1.244 0 2.118.67 2.62 2.013v.063l6.647 18.2zM12.98 17.326l-3.04 8.848h6.08l-3.04-8.848zm22.402 9.372v6.395h3.145c2.223 0 3.788-.245 4.697-.734.908-.49 1.362-1.307 1.362-2.453 0-1.16-.433-1.985-1.3-2.474-.866-.49-2.383-.734-4.55-.734h-3.354zm10.693-2.327c1.524.559 2.642 1.324 3.355 2.295.713.972 1.07 2.212 1.07 3.722 0 1.272-.308 2.432-.923 3.48-.615 1.049-1.496 1.909-2.642 2.58a7.499 7.499 0 01-2.254.849c-.832.174-2.01.262-3.533.262H30.202c-.922 0-1.583-.182-1.981-.545-.399-.364-.598-.958-.598-1.782 0-.741.189-1.304.566-1.688.378-.385.93-.577 1.657-.577h.356V17.326h-.356c-.727 0-1.28-.196-1.657-.587-.377-.392-.566-.965-.566-1.72 0-.81.203-1.401.608-1.771.406-.37 1.062-.556 1.971-.556h9.645c2.95 0 5.19.573 6.72 1.72 1.53 1.145 2.296 2.823 2.296 5.031 0 1.09-.234 2.052-.703 2.883-.468.832-1.163 1.513-2.086 2.045zM35.381 17.2v5.284h2.83c1.72 0 2.932-.203 3.638-.609.706-.405 1.06-1.09 1.06-2.054 0-.909-.319-1.573-.955-1.992-.636-.42-1.667-.63-3.093-.63h-3.48zm35.863-3.816c.28-.503.566-.86.86-1.07.293-.21.664-.314 1.111-.314.685 0 1.17.182 1.457.545.287.364.43.986.43 1.866l.042 5.452c0 .964-.157 1.614-.472 1.95-.314.335-.884.503-1.709.503-.587 0-1.037-.14-1.352-.42-.314-.28-.584-.796-.807-1.551-.364-1.328-.944-2.282-1.74-2.862-.797-.58-1.901-.87-3.313-.87-2.153 0-3.802.727-4.948 2.18-1.147 1.454-1.72 3.558-1.72 6.311 0 2.74.58 4.844 1.74 6.311 1.16 1.468 2.817 2.202 4.97 2.202 1.467 0 3.085-.49 4.854-1.468 1.768-.978 2.883-1.467 3.344-1.467.545 0 1.003.23 1.373.692.37.46.556 1.034.556 1.719 0 1.23-1.084 2.39-3.25 3.48-2.167 1.09-4.606 1.636-7.318 1.636-3.662 0-6.625-1.21-8.89-3.627-2.264-2.419-3.396-5.578-3.396-9.478 0-3.76 1.146-6.884 3.438-9.372 2.293-2.488 5.2-3.732 8.723-3.732.992 0 1.97.112 2.935.335.964.224 1.992.574 3.082 1.049zm10.22 19.583V17.326h-.356c-.755 0-1.328-.196-1.72-.587-.39-.392-.586-.965-.586-1.72 0-.81.21-1.401.629-1.771.42-.37 1.097-.556 2.034-.556h5.178c2.922 0 5.06.126 6.416.377 1.356.252 2.51.671 3.46 1.258 1.691 1.007 2.988 2.443 3.89 4.31.9 1.865 1.352 4.021 1.352 6.467 0 2.586-.514 4.847-1.541 6.783-1.028 1.936-2.485 3.4-4.372 4.393-.853.447-1.852.772-2.998.975-1.147.203-2.852.304-5.116.304h-6.269c-.965 0-1.65-.178-2.055-.535-.406-.356-.608-.954-.608-1.792 0-.741.195-1.304.587-1.688.391-.385.964-.577 1.72-.577h.356zm5.41-15.725v15.725h1.195c2.642 0 4.592-.646 5.85-1.94 1.258-1.292 1.887-3.28 1.887-5.965 0-2.641-.64-4.612-1.918-5.912-1.28-1.3-3.205-1.95-5.777-1.95-.335 0-.59.003-.765.01a7.992 7.992 0 00-.472.032zm35.067-.126h-9.75v5.368h3.69v-.252c0-.797.175-1.39.524-1.782.35-.392.88-.587 1.594
2731-.587.629 0 1.142.178 1.54.534.4.357.598.808.598 1.353 0 .028.007.118.021.272.014.154.021.308.021.462v4.34c0 .936-.167 1.607-.503 2.013-.335.405-.88.608-1.635.608-.713 0-1.251-.19-1.615-.567-.363-.377-.545-.936-.545-1.677v-.377h-3.69v6.269h9.75v-2.495c0-.937.178-1.608.534-2.013.357-.405.94-.608 1.75-.608.798 0 1.367.2 1.71.597.342.399.513 1.073.513 2.024v5.074c0 .755-.146 1.258-.44 1.51-.293.251-.873.377-1.74.377h-17.172c-.923 0-1.583-.182-1.982-.545-.398-.364-.597-.958-.597-1.782 0-.741.189-1.304.566-1.688.377-.385.93-.577 1.656-.577h.357V17.326h-.357c-.712 0-1.261-.2-1.646-.598-.384-.398-.576-.968-.576-1.709 0-.81.203-1.401.608-1.771.405-.37 1.062-.556 1.97-.556h17.173c.853 0 1.43.13 1.73.388.3.258.45.772.45 1.54v4.698c0 .95-.174 1.631-.524 2.044-.35.412-.915.618-1.698.618-.81 0-1.394-.21-1.75-.629-.357-.419-.535-1.097-.535-2.033v-2.202zM19.77 47.641c.267-.504.55-.86.85-1.07.3-.21.675-.314 1.122-.314.685 0 1.17.181 1.457.545.287.363.43.985.43 1.866l.042 5.451c0 .965-.157 1.615-.472 1.95-.314.336-.891.504-1.73.504-.587 0-1.045-.144-1.373-.43-.329-.287-.598-.8-.807-1.541-.378-1.342-.958-2.3-1.74-2.873-.783-.573-1.88-.86-3.292-.86-2.153 0-3.799.727-4.938 2.181-1.14 1.454-1.709 3.557-1.709 6.311s.598 4.882 1.793 6.385C10.599 67.248 12.294 68 14.488 68c.503 0 1.077-.06 1.72-.179a23.809 23.809 0 002.264-.555v-3.313h-2.37c-.95 0-1.624-.175-2.023-.524-.398-.35-.597-.93-.597-1.74 0-.84.199-1.437.597-1.793.399-.357 1.073-.535 2.024-.535h7.569c.978 0 1.667.175 2.065.524.398.35.598.937.598 1.762 0 .74-.2 1.31-.598 1.708-.398.399-.975.598-1.73.598h-.335v5.242c0 .447-.05.758-.147.933-.098.174-.293.353-.587.534-.797.476-2.062.895-3.795 1.258a25.576 25.576 0 01-5.263.546c-3.662 0-6.625-1.21-8.89-3.628-2.264-2.418-3.397-5.577-3.397-9.477 0-3.76 1.147-6.884 3.44-9.372 2.292-2.488 5.199-3.732 8.721-3.732.979 0 1.954.112 2.925.335.972.224 2.003.573 3.093 1.049zm15.84 3.941v4.823h6.857v-4.823h-.336c-.754 0-1.331-.195-1.73-.587-.398-.391-.597-.964-.597-1.719 0-.825.206-1.419.619-1.782.412-.364 1.093-.545 2.044-.545h5.41c.95 0 1.624.181 2.023.545.398.363.597.957.597 1.782 0 .755-.192 1.328-.576 1.72-.385.39-.947.586-1.688.586h-.357v15.642h.357c.755 0 1.328.192 1.719.576.391.385.587.947.587 1.688 0 .825-.203 1.419-.608 1.782-.405.364-1.09.546-2.055.546h-5.41c-.964 0-1.649-.179-2.054-.535-.405-.357-.608-.954-.608-1.793 0-.74.2-1.303.598-1.688.398-.384.975-.576 1.73-.576h.335v-6.186h-6.856v6.186h.335c.755 0 1.331.192 1.73.576.398.385.597.947.597 1.688 0 .825-.206 1.419-.618 1.782-.412.364-1.094.546-2.044.546h-5.41c-.964 0-1.65-.179-2.055-.535-.405-.357-.608-.954-.608-1.793 0-.74.196-1.303.587-1.688.392-.384.965-.576 1.72-.576h.356V51.582h-.356c-.741 0-1.304-.195-1.688-.587-.385-.391-.577-.964-.577-1.719 0-.825.2-1.419.598-1.782.398-.364 1.073-.545 2.023-.545h5.41c.936 0 1.614.181 2.033.545.42.363.63.957.63 1.782 0 .755-.2 1.328-.598 1.72-.399.39-.975.586-1.73.586h-.335zm31.754 0v15.642h3.523c.95 0 1.632.178 2.044.534.412.357.618.933.618 1.73 0 .811-.21 1.402-.629 1.772-.419.37-1.097.556-2.033.556H58.433c-.95 0-1.632-.182-2.044-.546-.412-.363-.619-.957-.619-1.782 0-.81.203-1.39.608-1.74.406-.35 1.09-.524 2.055-.524h3.523V51.582h-3.523c-.95 0-1.632-.181-2.044-.545-.412-.363-.619-.95-.619-1.761 0-.825.203-1.412.608-1.761.406-.35 1.09-.524 2.055-.524h12.455c.992 0 1.684.174 2.075.524.392.35.587.936.587 1.761 0 .81-.202 1.398-.608 1.761-.405.364-1.09.545-2.054.545h-3.523zm30.496 0v11.994c0 1.873-.122 3.228-.367 4.067a5.876 5.876 0 01-1.227 2.244c-.74.852-1.768 1.495-3.082 1.929-1.314.433-2.893.65-4.738.65-1.3 0-2.555-.126-3.764-.378a16.843 16.843 0 01-3.491-1.132c-.615-.28-1.017-.643-1.206-1.09-.188-.448-.283-1.175-.283-2.18v-4.32c0-1.202.175-2.04.525-2.516.349-.475.957-.713 1.824-.713 1.244 0 1.929.915 2.054 2.747.014.321.035.566.063.733.168 1.622.545 2.73 1.133 3.324.587.594 1.523.89 2.81.89 1.593 0 2.714-.422 3.364-1.268.65-.845.975-2.386.975-4.623V51.582H88.93c-.95 0-1.632-.181-2.044-.545-.413-.363-.619-.95-.619-1.761 0-.825.2-1.412.598-1.761.398-.35 1.086-.524 2.065-.524h10.693c.979 0 1.667.174 2.065.524.399.35.598.936.598 1.761 0 .81-.206 1.398-.619 1.761-.412.364-1.093.545-2.044.545h-1.761zm14.644 0v6.353l6.48-6.478c-.728-.084-1.238-.29-1.531-.619-.294-.328-.44-.85-.44-1.562 0-.825.198-1.419.597-1.782.398-.364 1.073-.545 2.023-.545h5.137c.95 0 1.625.181 2.023.545.399.363.598.957.598 1.782 0 .769-.2 1.345-.598 1.73-.398.384-.982.576-1.75.576h-.483l-6.101 6.06c1.132.839 2.167 1.94 3.103 3.302.937 1.363 2.034 3.456 3.292 6.28h.692c.825 0 1.44.188 1.845.566.405.377.608.943.608 1.698 0 .825-.206 1.419-.619 1.782-.412.364-1.093.546-2.044.546h-2.579c-1.132 0-2.048-.762-2.746-2.286-.126-.28-.224-.503-.294-.67-.923-1.958-1.768-3.467-2.537-4.53a16.616 16.616 0 00-2.705-2.914l-1.97 1.887v3.92h.335c.755 0 1.331.193 1.73.577.398.385.597.947.597 1.688 0 .825-.206 1.419-.618 1.782-.413.364-1.094.546-2.045.546h-5.41c-.964 0-1.649-.179-2.054-.535-.405-.357-.608-.954-.608-1.793 0-.74.196-1.303.587-1.688.391-.384.965-.576 1.72-.576h.356V51.582h-.357c-.74 0-1.303-.195-1.687-.587-.385-.391-.577-.964-.577-1.719 0-.825.2-1.419.598-1.782.398-.364 1.072-.545 2.023-.545h5.41c.936 0 1.614.181 2.033.545.42.363.63.957.63 1.782 0 .755-.2 1.328-.598 1.72-.399.39-.975.586-1.73.586h-.336zM13.44 96.326l4.005-11.889c.251-.782.6-1.352 1.048-1.709.447-.356 1.041-.534 1.782-.534h3.271c.95 0 1.632.182 2.044.545.413.363.619.957.619 1.782 0 .755-.2 1.328-.598 1.72-.398.39-.975.587-1.73.587h-.335l.587 15.641h.357c.754 0 1.32.192 1.698.577.377.384.566.947.566 1.687 0 .825-.2 1.42-.598 1.783-.398.363-1.072.545-2.023.545h-4.718c-.95 0-1.624-.178-2.023-.535-.398-.356-.597-.954-.597-1.793 0-.74.192-1.303.576-1.687.385-.385.954-.577 1.709-.577h.335l-.293-12.79-3.061 9.52c-.224.712-.542 1.226-.954 1.54-.413.315-.982.472-1.709.472-.727 0-1.303-.157-1.73-.472-.426-.314-.751-.828-.975-1.54l-3.04-9.52-.294 12.79h.336c.755 0 1.324.192 1.709.577.384.384.576.947.576 1.687 0 .825-.202 1.42-.608 1.783-.405.363-1.076.545-2.013.545H2.621c-.937 0-1.608-.182-2.013-.545-.405-.364-.608-.958-.608-1.783 0-.74.192-1.303.577-1.687.384-.385.954-.577 1.708-.577h.336l.608-15.641h-.336c-.754 0-1.331-.196-1.73-.588-.398-.39-.597-.964-.597-1.719 0-.825.206-1.419.619-1.782.412-.363 1.093-.545 2.044-.545h3.27c.728 0 1.311.175 1.752.524.44.35.8.923 1.08 1.72l4.109 11.888zm30.454 2.054V86.828H42.74c-.922 0-1.583-.182-1.981-.546-.398-.363-.598-.95-.598-1.76 0-.812.2-1.402.598-1.773.398-.37 1.059-.555 1.981-.555h5.955c.909 0 1.566.185 1.97.555.406.37.609.961.609 1.772 0 .741-.192 1.31-.577 1.709-.384.398-.933.598-1.646.598h-.356v19.038c0 .657-.07 1.069-.21 1.237-.14.167-.454.251-.943.251h-2.097c-.67 0-1.143-.07-1.415-.21-.273-.14-.507-.384-.703-.733l-8.722-15.327v11.385h1.216c.909 0 1.559.175 1.95.524.392.35.587.93.587 1.74 0 .825-.199 1.42-.597 1.783-.399.363-1.045.545-1.94.545h-6.017c-.909 0-1.566-.182-1.971-.545-.406-.364-.608-.958-.608-1.783 0-.74.188-1.303.566-1.687.377-.385.936-.577 1.677-.577h.336V86.828h-.336c-.713 0-1.265-.2-1.656-.598-.392-.398-.587-.968-.587-1.709 0-.81.206-1.401.618-1.772.413-.37 1.066-.555 1.96-.555h3.44c.824 0 1.383.108 1.677.325.293.216.622.653.985 1.31l7.989 14.551zM64.66 86.366c-1.803 0-3.218.727-4.245 2.18-1.028 1.455-1.541 3.474-1.541 6.06 0 2.586.517 4.613 1.551 6.08 1.034 1.468 2.446 2.202 4.235 2.202 1.804 0 3.222-.73 4.257-2.19 1.034-1.461 1.551-3.492 1.551-6.092 0-2.586-.513-4.605-1.54-6.06-1.028-1.453-2.45-2.18-4.268-2.18zm0-4.864c3.44 0 6.27 1.23 8.492 3.69 2.223 2.46 3.334 5.598 3.334 9.414 0 3.844-1.104 6.99-3.313 9.436-2.208 2.446-5.046 3.669-8.513 3.669-3.424 0-6.255-1.234-8.491-3.701-2.237-2.467-3.355-5.602-3.355-9.404 0-3.83 1.108-6.971 3.323-9.424 2.216-2.454 5.057-3.68 8.523-3.68zM87.461 98.17v4.298h2.16c.908 0 1.555.175 1.94.524.384.35.576.93.576 1.74 0 .825-.196 1.42-.587 1.783-.392.363-1.035.545-1.93.545h-7.254c-.922 0-1.583-.182-1.981-.545-.399-.364-.598-.958-.598-1.783 0-.74.189-1.303.566-1.687.378-.385.93-.577 1.657-.577h.356V86.828h-.356c-.713 0-1.262-.2-1.646-.598-.385-.398-.577-.968-.577-1.709 0-.81.203-1.401.608-1.772.406-.37 1.063-.555 1.971-.555h8.66c3.424 0 6.014.657 7.768 1.97 1.754 1.315 2.631 3.25 2.631 5.809 0 2.697-.873 4.738-2.62 6.122-1.748 1.384-4.34 2.076-7.78 2.076h-3.564zm0-11.343v6.625h2.977c1.65 0 2.89-.28 3.722-.839.832-.559 1.248-1.397 1.248-2.516 0-1.048-.43-1.855-1.29-2.421-.86-.566-2.086-.85-3.68-.85h-2.977zm27.267 20.568l-1.636 1.636a12.37 12.37 0 011.772-.44c.58-.098 1.15-.147 1.709-.147 1.104 0 2.268.164 3.491.492 1.223.329 1.967.493 2.233.493.447 0 1.03-.15 1.75-.45.72-.301 1.206-.452 1.458-.452.517 0 .947.2 1.29.598.342.398.513.898.513 1.5 0 .796-.472 1.474-1.415 2.033-.944.56-2.1.839-3.47.839-.937 0-2.139-.22-3.607-.66-1.467-.441-2.53-.661-3.187-.661-.992 0-2.11.272-3.354.817-1.244.54
27316-2.013.818-2.307.818a2.14 2.14 0 01-1.53-.597c-.42-.399-.63-.878-.63-1.437 0-.391.134-.807.4-1.247.265-.44.733-1.01 1.404-1.709l2.118-2.139c-2.335-.852-4.194-2.386-5.578-4.602-1.384-2.215-2.075-4.763-2.075-7.642 0-3.802 1.104-6.909 3.312-9.32 2.209-2.411 5.053-3.617 8.534-3.617 3.467 0 6.304 1.209 8.513 3.627 2.208 2.418 3.312 5.522 3.312 9.31 0 3.774-1.097 6.884-3.291 9.33-2.195 2.446-4.977 3.67-8.345 3.67a22.5 22.5 0 01-1.384-.043zm1.195-21.03c-1.803 0-3.218.727-4.246 2.18-1.027 1.455-1.54 3.474-1.54 6.06 0 2.586.516 4.613 1.55 6.08 1.035 1.468 2.447 2.202 4.236 2.202 1.803 0 3.222-.73 4.256-2.19 1.035-1.461 1.552-3.492 1.552-6.092 0-2.586-.514-4.605-1.541-6.06-1.028-1.453-2.45-2.18-4.267-2.18z\\\"/>\u003C/svg>\"},\"$:/core/images/mono-line\":{\"title\":\"$:/core/images/mono-line\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-mono-line tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M60.437 84.523h.908c1.922 0 3.381.489 4.378 1.468.997.979 1.495 2.411 1.495 4.298 0 2.1-.525 3.612-1.575 4.538-1.05.925-2.785 1.388-5.206 1.388h-16.07c-2.456 0-4.2-.454-5.232-1.361-1.032-.908-1.548-2.43-1.548-4.565 0-2.065.516-3.542 1.548-4.432 1.032-.89 2.776-1.334 5.232-1.334h1.869l-2.19-6.247H20.983l-2.296 6.247h1.87c2.42 0 4.155.453 5.205 1.361 1.05.908 1.575 2.376 1.575 4.405 0 2.1-.525 3.612-1.575 4.538-1.05.925-2.785 1.388-5.206 1.388H6.781c-2.456 0-4.2-.463-5.233-1.388C.516 93.9 0 92.389 0 90.289c0-1.887.498-3.32 1.495-4.298.997-.979 2.456-1.468 4.378-1.468h.908l14.308-39.83h-4.271c-2.42 0-4.156-.462-5.206-1.387-1.05-.926-1.575-2.42-1.575-4.485 0-2.1.525-3.613 1.575-4.538 1.05-.926 2.785-1.388 5.206-1.388h20.021c3.168 0 5.392 1.708 6.674 5.125v.16l16.924 46.343zm-27.976-39.83L24.72 67.225h15.483l-7.742-22.53zM89.506 68.56v16.284h8.008c5.66 0 9.646-.623 11.96-1.869 2.313-1.245 3.47-3.328 3.47-6.246 0-2.955-1.103-5.055-3.31-6.3-2.207-1.246-6.069-1.869-11.586-1.869h-8.542zm27.229-5.926c3.88 1.423 6.727 3.372 8.542 5.846 1.815 2.474 2.723 5.633 2.723 9.477 0 3.239-.783 6.193-2.35 8.862-1.565 2.67-3.808 4.859-6.726 6.567-1.709.997-3.622 1.718-5.74 2.163-2.118.445-5.116.667-8.996.667h-27.87c-2.349 0-4.03-.463-5.045-1.388-1.014-.926-1.521-2.438-1.521-4.538 0-1.887.48-3.32 1.441-4.298.961-.979 2.367-1.468 4.218-1.468h.907v-39.83h-.907c-1.851 0-3.257-.498-4.218-1.494-.961-.997-1.441-2.456-1.441-4.378 0-2.065.516-3.568 1.548-4.512 1.032-.943 2.705-1.414 5.018-1.414h24.56c7.51 0 13.214 1.459 17.111 4.377 3.898 2.92 5.847 7.19 5.847 12.814 0 2.776-.597 5.223-1.789 7.341-1.192 2.118-2.963 3.853-5.312 5.206zm-27.23-18.26v13.455h7.208c4.378 0 7.466-.516 9.264-1.549 1.797-1.032 2.696-2.776 2.696-5.232 0-2.313-.81-4.004-2.43-5.072-1.619-1.068-4.244-1.602-7.874-1.602h-8.863z\\\"/>\u003C/svg>\"},\"$:/core/images/network-activity\":{\"title\":\"$:/core/images/network-activity\",\"tags\":\"$:/tags/Image\",\"text\":\"\u003Csvg width=\\\"22pt\\\" height=\\\"22pt\\\" class=\\\"tc-image-network-activity tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cg class={{{ [{$:/state/http-requests}match[0]then[]else[tc-network-activity-background]] }}}>\\n\u003C$list filter=\\\"[{$:/state/http-requests}match[0]]\\\" variable=\\\"ignore\\\">\\n\u003Cpath d=\\\"M64.043 45.153a4.002 4.002 0 0 1 4.367 2.21l.084.188 30.403 73.4a4 4 0 0 1-7.307 3.25l-.084-.188-3.103-7.49-8.898 8.899a3.985 3.985 0 0 1-2.624 1.166l-.205.005a3.987 3.987 0 0 1-2.828-1.171l-9.849-9.848-9.847 9.848a3.985 3.985 0 0 1-2.624 1.166l-.204.005a3.987 3.987 0 0 1-2.829-1.171l-8.899-8.9-3.102 7.491a4 4 0 1 1-7.391-3.062l30.403-73.4a4.001 4.001 0 0 1 4.495-2.39l.042-.008Zm13.636 56.74-8.023 8.024 7.02 7.019 8.023-8.022-7.02-7.02Zm-27.353.008-7.019 7.019 8.016 8.016 7.019-7.02-8.016-8.015Zm13.68-13.68-8.023 8.023 8.016 8.016 8.023-8.023-8.016-8.016Zm-8.971-8.971-4.687 11.315 8.001-8.001-3.314-3.314Zm17.933.009-3.305 3.305 7.979 7.979-4.674-11.284ZM64 57.607l-5.666 13.68c.096.072.188.15.278.232l.133.126 5.261 5.262 5.262-5.262c.128-.127.261-.244.4-.35L64 57.607Zm0-34.69a8 8 0 1 1 0 16 8 8 0 0 1 0-16Z\\\"/>\\n\u003C/$list>\\n\u003C$list filter=\\\"[{$:/state/http-requests}!match[0]]\\\" variable=\\\"ignore\\\">\\n\u003Cpath d=\\\"M109.395.952a4.002 4.002 0 0 1 3.787 2.708C117.529 11.62 120 20.753 120 30.462c0 15.186-6.044 28.96-15.858 39.047a4 4 0 1 1-6.47-4.626l-.12-.094C106.466 56.074 112 43.914 112 30.462c0-8.492-2.205-16.469-6.074-23.39l.054-.036a4 4 0 0 1 3.415-6.084Zm-90.762 0a4 4 0 0 1 3.072 6.562l.093.06A47.786 47.786 0 0 0 16 30.463c0 13.315 5.42 25.363 14.176 34.058l-.01.007a4 4 0 1 1-6.312 4.863l-.063.05C14.017 59.359 8 45.613 8 30.462c0-9.77 2.502-18.956 6.9-26.952A4.002 4.002 0 0 1 18.634.952Z\\\"/>\u003Cpath d=\\\"M64.043 44.698a4.002 4.002 0 0 1 4.367 2.21l.084.188 30.403 73.4a4 4 0 0 1-7.307 3.25l-.084-.188-3.103-7.49-8.898 8.9a3.985 3.985 0 0 1-2.624 1.166l-.205.005a3.987 3.987 0 0 1-2.828-1.172l-9.849-9.848-9.847 9.848a3.985 3.985 0 0 1-2.624 1.167l-.204.005a3.987 3.987 0 0 1-2.829-1.172l-8.899-8.899-3.102 7.49a4 4 0 0 1-7.391-3.061l30.403-73.4a4.001 4.001 0 0 1 4.495-2.39l.042-.009ZM77.68 101.44l-8.023 8.023 7.02 7.019 8.023-8.022-7.02-7.02Zm-27.353.007-7.019 7.019 8.016 8.016 7.019-7.019-8.016-8.016Zm13.68-13.68-8.023 8.023 8.016 8.016 8.023-8.023-8.016-8.016Zm-8.971-8.971L50.348 90.11l8.001-8.001-3.314-3.314Zm17.933.009-3.305 3.305 7.979 7.979-4.674-11.284ZM64 57.152l-5.666 13.68c.096.073.188.15.278.232l.133.127 5.261 5.261 5.262-5.261c.128-.128.261-.244.4-.351L64 57.152ZM38.503 1.058a4 4 0 0 1 2.7 6.952l.17-.175C35.582 13.625 32 21.625 32 30.462c0 8.838 3.582 16.838 9.374 22.629a4 4 0 0 1-5.659 5.658l-.01.01C28.473 51.52 24 41.526 24 30.485 24 19.567 28.374 9.67 35.466 2.453a3.995 3.995 0 0 1 3.037-1.395ZM89.369.952c1.14 0 2.17.478 2.899 1.244l.005-.006C99.518 9.43 104 19.434 104 30.485c0 10.826-4.3 20.648-11.287 27.85a4 4 0 1 1-6.054-5.213l-.032-.032C92.418 47.299 96 39.299 96 30.462c0-8.73-3.496-16.643-9.164-22.416A4 4 0 0 1 89.368.952Zm-39.282 11.14a4 4 0 0 1 2.59 7.048l.01.009A15.95 15.95 0 0 0 48 30.462a15.95 15.95 0 0 0 4.687 11.315l-.01.01a4 4 0 1 1-5.82 5.47l.173.177A23.925 23.925 0 0 1 40 30.462a23.925 23.925 0 0 1 7.03-16.97l.01.01a3.991 3.991 0 0 1 3.047-1.41Zm27.895.07a3.99 3.99 0 0 1 2.984 1.336l.006-.005A23.925 23.925 0 0 1 88 30.463a23.92 23.92 0 0 1-6.707 16.642l-.3.305a4 4 0 1 1-5.679-5.632v-.002A15.95 15.95 0 0 0 80 30.462a15.95 15.95 0 0 0-4.685-11.312 4.012 4.012 0 0 1-1.333-2.987 4 4 0 0 1 4-4ZM64 22.463a8 8 0 1 1 0 16 8 8 0 0 1 0-16Z\\\"/>\\n\u003C/$list>\\n\u003C/g>\u003C/svg>\"},\"$:/core/images/new-button\":{\"title\":\"$:/core/images/new-button\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-new-button tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M56 72H8.007C3.591 72 0 68.418 0 64c0-4.41 3.585-8 8.007-8H56V8.007C56 3.591 59.582 0 64 0c4.41 0 8 3.585 8 8.007V56h47.993c4.416 0 8.007 3.582 8.007 8 0 4.41-3.585 8-8.007 8H72v47.993c0 4.416-3.582 8.007-8 8.007-4.41 0-8-3.585-8-8.007V72z\\\"/>\u003C/svg>\"},\"$:/core/images/new-here-button\":{\"title\":\"$:/core/images/new-here-button\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-new-here-button tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cg fill-rule=\\\"evenodd\\\">\u003Cpath d=\\\"M55.838 20.935l-3.572.938c-3.688.968-8.23 4.43-10.136 7.731L3.37 96.738c-1.905 3.3-.771 7.524 2.534 9.432l33.717 19.466c3.297 1.904 7.53.78 9.435-2.521l38.76-67.134c1.9
273105-3.3 2.632-8.963 1.623-12.646L83.285 20.88c-1.009-3.68-4.821-5.884-8.513-4.915l-7.603 1.995.043.287c.524 3.394 2.053 7.498 4.18 11.55.418.163.829.36 1.23.59a8.864 8.864 0 014.438 8.169c.104.132.21.264.316.395l-.386.318a8.663 8.663 0 01-1.082 3.137c-2.42 4.192-7.816 5.608-12.051 3.163-4.12-2.379-5.624-7.534-3.476-11.671-2.177-4.394-3.788-8.874-4.543-12.964z\\\"/>\u003Cpath d=\\\"M69.554 44.76c-5.944-7.476-10.74-17.196-11.955-25.059-1.68-10.875 3.503-18.216 15.082-18.04 10.407.158 19.975 5.851 24.728 13.785 5.208 8.695 2.95 17.868-6.855 20.496l-2.037-7.601c4.232-1.134 4.999-4.248 2.24-8.853-3.37-5.626-10.465-9.848-18.146-9.965-6.392-.097-8.31 2.62-7.323 9.01.999 6.465 5.318 15.138 10.582 21.65l-.072.06c.559 1.553-4.17 6.44-5.938 4.888l-.005.004-.028-.034a1.323 1.323 0 01-.124-.135 2.618 2.618 0 01-.149-.205z\\\"/>\u003Crect width=\\\"16\\\" height=\\\"48\\\" x=\\\"96\\\" y=\\\"80\\\" rx=\\\"8\\\"/>\u003Crect width=\\\"48\\\" height=\\\"16\\\" x=\\\"80\\\" y=\\\"96\\\" rx=\\\"8\\\"/>\u003C/g>\u003C/svg>\"},\"$:/core/images/new-image-button\":{\"title\":\"$:/core/images/new-image-button\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-new-image-button tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M81.362 73.627l15.826-27.41a2.626 2.626 0 00-.962-3.59l-50.01-28.872a2.626 2.626 0 00-3.588.961L30.058 36.49l10.04-5.261c3.042-1.595 6.771.114 7.55 3.46l3.607 17.702 9.88.85a5.25 5.25 0 014.571 3.77c.034.115.1.344.199.671.165.553.353 1.172.562 1.843.595 1.914 1.23 3.85 1.872 5.678.207.588.412 1.156.614 1.701.625 1.685 1.209 3.114 1.725 4.207.255.54.485.977.726 1.427.214.212.547.425 1.011.622 1.141.482 2.784.74 4.657.758.864.008 1.71-.034 2.492-.11.448-.043.753-.085.871-.104.315-.053.625-.077.927-.076zM37.47 2.649A5.257 5.257 0 0144.649.725l63.645 36.746a5.257 5.257 0 011.923 7.178L73.47 108.294a5.257 5.257 0 01-7.177 1.923L2.649 73.47a5.257 5.257 0 01-1.924-7.177L37.471 2.649zm42.837 50.49a5.25 5.25 0 105.25-9.092 5.25 5.25 0 00-5.25 9.093zM96 112h-7.993c-4.419 0-8.007-3.582-8.007-8 0-4.41 3.585-8 8.007-8H96v-7.993C96 83.588 99.582 80 104 80c4.41 0 8 3.585 8 8.007V96h7.993c4.419 0 8.007 3.582 8.007 8 0 4.41-3.585 8-8.007 8H112v7.993c0 4.419-3.582 8.007-8 8.007-4.41 0-8-3.585-8-8.007V112zM33.347 51.791c7.428 7.948 9.01 10.69 7.449 13.394-1.56 2.703-13.838-2.328-16.094 1.58-2.256 3.908-.907 3.258-2.437 5.908l19.73 11.39s-5.605-8.255-4.235-10.628c2.515-4.356 8.77-1.256 10.365-4.019 2.414-4.181-5.103-9.639-14.778-17.625z\\\"/>\u003C/svg>\"},\"$:/core/images/new-journal-button\":{\"title\":\"$:/core/images/new-journal-button\",\"tags\":\"$:/tags/Image\",\"text\":\"\u003C$parameters size=\\\"22pt\\\" day=\u003C\u003Cnow \\\"DD\\\">>>\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-new-journal-button tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cg fill-rule=\\\"evenodd\\\">\u003Cpath d=\\\"M102.545 112.818v11.818c0 1.306 1.086 2.364 2.425 2.364h6.06c1.34 0 2.425-1.058 2.425-2.364v-11.818h12.12c1.34 0 2.425-1.058 2.425-2.363v-5.91c0-1.305-1.085-2.363-2.424-2.363h-12.121V90.364c0-1.306-1.086-2.364-2.425-2.364h-6.06c-1.34 0-2.425 1.058-2.425 2.364v11.818h-12.12c-1.34 0-2.425 1.058-2.425 2.363v5.91c0 1.305 1.085 2.363 2.424 2.363h12.121zM60.016 4.965c-4.781-2.76-10.897-1.118-13.656 3.66L5.553 79.305A9.993 9.993 0 009.21 92.963l51.04 29.468c4.78 2.76 10.897 1.118 13.655-3.66l40.808-70.681a9.993 9.993 0 00-3.658-13.656L60.016 4.965zm-3.567 27.963a6 6 0 106-10.393 6 6 0 00-6 10.393zm31.697 17.928a6 6 0 106-10.392 6 6 0 00-6 10.392z\\\"/>\u003Ctext class=\\\"tc-fill-background\\\" font-family=\\\"Helvetica\\\" font-size=\\\"47.172\\\" font-weight=\\\"bold\\\" transform=\\\"rotate(30 25.742 95.82)\\\">\u003Ctspan x=\\\"42\\\" y=\\\"77.485\\\" text-anchor=\\\"middle\\\">\u003C$text text=\u003C\u003Cday>>/>\u003C/tspan>\u003C/text>\u003C/g>\u003C/svg>\u003C/$parameters>\"},\"$:/core/images/opacity\":{\"title\":\"$:/core/images/opacity\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-opacity tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cg fill-rule=\\\"evenodd\\\">\u003Cpath d=\\\"M102.362 65a51.595 51.595 0 01-1.942 6H82.584a35.867 35.867 0 002.997-6h16.78zm.472-2c.423-1.961.734-3.963.929-6H87.656a35.78 35.78 0 01-1.368 6h16.546zm-3.249 10a51.847 51.847 0 01-3.135 6H75.812a36.205 36.205 0 005.432-6h18.341zm-4.416 8c-1.424 2.116-3 4.12-4.71 6H60.46a35.843 35.843 0 0012.874-6h21.834zm-7.513-34h16.107C101.247 20.627 79.033 0 52 0 23.281 0 0 23.281 0 52c0 25.228 17.965 46.26 41.8 51h20.4a51.66 51.66 0 0015.875-6H39v-2h42.25a52.257 52.257 0 007.288-6H39v-2h4.539C27.739 83.194 16 68.968 16 52c0-19.882 16.118-36 36-36 18.186 0 33.222 13.484 35.656 31zm.22 2h16.039a52.823 52.823 0 010 6H87.877a36.483 36.483 0 000-6z\\\"/>\u003Cpath d=\\\"M76 128c28.719 0 52-23.281 52-52s-23.281-52-52-52-52 23.281-52 52 23.281 52 52 52zm0-16c19.882 0 36-16.118 36-36S95.882 40 76 40 40 56.118 40 76s16.118 36 36 36z\\\"/>\u003Cpath d=\\\"M37 58h53v4H37v-4zm3-8h53v4H40v-4zm0-8h53v4H40v-4zm-8 24h53v4H32v-4zm-2 8h53v4H30v-4zm-3 8h53v4H27v-4z\\\"/>\u003C/g>\u003C/svg>\"},\"$:/core/images/open-window\":{\"title\":\"$:/core/images/open-window\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-open-window tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cg fill-rule=\\\"evenodd\\\">\u003Cpath d=\\\"M16 112h88.994c3.87 0 7.006 3.59 7.006 8 0 4.418-3.142 8-7.006 8H7.006C3.136 128 0 124.41 0 120a9.321 9.321 0 010-.01V24.01C0 19.586 3.59 16 8 16c4.418 0 8 3.584 8 8.01V112z\\\"/>\u003Cpath d=\\\"M96 43.196V56a8 8 0 1016 0V24c0-4.41-3.585-8-8.007-8H72.007C67.588 16 64 19.582 64 24c0 4.41 3.585 8 8.007 8H84.57l-36.3 36.299a8 8 0 00-.001 11.316c3.117 3.117 8.19 3.123 11.316-.003L96 43.196zM32 7.999C32 3.581 35.588 0 40 0h80c4.419 0 8 3.588 8 8v80c0 4.419-3.588 8-8 8H40c-4.419 0-8-3.588-8-8V8z\\\"/>\u003C/g>\u003C/svg>\"},\"$:/core/images/options-button\":{\"title\":\"$:/core/images/options-button\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-options-button tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M110.488 76a47.712 47.712 0 01-5.134 12.384l6.724 6.724c3.123 3.123 3.132 8.192.011 11.313l-5.668 5.668c-3.12 3.12-8.186 3.117-11.313-.01l-6.724-6.725c-3.82 2.258-7.98 4-12.384 5.134v9.505c0 4.417-3.578 8.007-7.992 8.007h-8.016C55.58 128 52 124.415 52 119.993v-9.505a47.712 47.712 0 01-12.384-5.134l-6.724 6.725c-3.123 3.122-8.192 3.131-11.313.01l-5.668-5.668c-3.12-3.12-3.116-8.186.01-11.313l6.725-6.724c-2.257-3.82-4-7.98-5.134-12.384H8.007C3.591 76 0 72.422 0 68.01v-8.017C0 55.58 3.585 52 8.007 52h9.505a47.712 47.712 0 015.134-12.383l-6.724-6.725c-3.123-3.122-3.132-8.191-.011-11.312l5.668-5.669c3.12-3.12 8.186-3.116 11.313.01l6.724 
27316.725c3.82-2.257 7.98-4 12.384-5.134V8.007C52 3.591 55.578 0 59.992 0h8.016C72.42 0 76 3.585 76 8.007v9.505a47.712 47.712 0 0112.384 5.134l6.724-6.724c3.123-3.123 8.192-3.132 11.313-.01l5.668 5.668c3.12 3.12 3.116 8.186-.01 11.312l-6.725 6.725c2.257 3.82 4 7.979 5.134 12.383h9.505c4.416 0 8.007 3.578 8.007 7.992v8.017c0 4.411-3.585 7.991-8.007 7.991h-9.505zM64 96c17.673 0 32-14.327 32-32 0-17.673-14.327-32-32-32-17.673 0-32 14.327-32 32 0 17.673 14.327 32 32 32z\\\"/>\u003C/svg>\"},\"$:/core/images/paint\":{\"title\":\"$:/core/images/paint\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-paint tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M83.527 76.19C90.43 69.287 91.892 59 87.91 50.665l37.903-37.902c2.919-2.92 2.913-7.659 0-10.572a7.474 7.474 0 00-10.572 0L77.338 40.093c-8.335-3.982-18.622-2.521-25.526 4.383l31.715 31.715zm-2.643 2.644L49.169 47.119S8.506 81.243 0 80.282c0 0 3.782 5.592 6.827 8.039 14.024-5.69 37.326-24.6 37.326-24.6l.661.66S19.45 90.222 9.18 92.047c1.222 1.44 4.354 4.053 6.247 5.776 5.417-1.488 34.733-28.57 34.733-28.57l.661.66-32.407 31.022 5.285 5.286L56.106 75.2l.662.66s-27.864 30.536-28.684 32.432c0 0 6.032 6.853 7.569 7.824.702-2.836 27.884-33.485 27.884-33.485l.661.66s-20.597 23.755-24.964 36.732c3.21 3.549 7.5 5.137 10.926 6.298-2.19-11.817 30.724-47.487 30.724-47.487z\\\"/>\u003C/svg>\"},\"$:/core/images/palette\":{\"title\":\"$:/core/images/palette\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-palette tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M80.247 39.182a93.52 93.52 0 00-16.228-1.4C28.662 37.781 0 57.131 0 81.002c0 9.642 4.676 18.546 12.58 25.735C23.504 91.19 26.34 72.395 36.89 63.562c15.183-12.713 26.538-7.828 26.538-7.828l16.82-16.552zm26.535 9.655c13.049 7.913 21.257 19.392 21.257 32.166 0 9.35.519 17.411-11.874 25.08-10.797 6.681-3.824-6.536-11.844-10.898s-19.946 1.308-18.213 7.906c3.2 12.181 19.422 11.455 6.314 16.658-13.107 5.202-18.202 4.476-28.403 4.476-7.821 0-15.315-.947-22.243-2.68 9.844-4.197 27.88-12.539 33.354-19.456C82.788 92.409 87.37 80 83.324 72.484c-.194-.359 11.215-11.668 23.458-23.647zM1.134 123.867l-.66.002c33.479-14.94 22.161-64.226 58.818-64.226.317 1.418.644 2.944 1.062 4.494-25.907-4.166-23.567 48.031-59.22 59.73zm.713-.007c38.872-.506 78.152-22.347 78.152-44.813-9.27 0-14.073-3.48-16.816-7.942-16.597-7.003-30.365 45.715-61.336 52.755zm65.351-64.008c-4.45 4.115 4.886 16.433 11.318 11.318l45.27-45.27c11.317-11.318 0-22.635-11.318-11.318-11.317 11.318-33.518 34.405-45.27 45.27z\\\"/>\u003C/svg>\"},\"$:/core/images/permalink-button\":{\"title\":\"$:/core/images/permalink-button\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-permalink-button tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M80.483 48l-7.387 32h-25.58l7.388-32h25.58zm3.694-16l5.624-24.358c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L100.598 32h3.403c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8h-7.096l-7.387 32H104c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8H85.824l-5.624 24.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L69.402 96h-25.58L38.2 120.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L27.402 96h-3.403C19.59 96 16 92.418 16 88c0-4.41 3.581-8 8-8h7.096l7.387-32H24C19.59 48 16 44.418 16 40c0-4.41 3.581-8 8-8h18.177l5.624-24.358c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L58.598 32h25.58z\\\"/>\u003C/svg>\"},\"$:/core/images/permaview-button\":{\"title\":\"$:/core/images/permaview-button\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-permaview-button tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M81.483 48l-1.846 8h-5.58l1.847-8h5.58zm3.694-16l5.624-24.358c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L101.598 32h2.403c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8h-6.096l-1.847 8h7.944c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8H92.364l-1.846 8H104c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8H86.824l-5.624 24.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L70.402 96h-5.58L59.2 120.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L48.402 96h-5.58L37.2 120.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L26.402 9
27316h-2.403C19.59 96 16 92.418 16 88c0-4.41 3.581-8 8-8h6.096l1.847-8h-7.944C19.59 72 16 68.418 16 64c0-4.41 3.581-8 8-8h11.637l1.846-8H24C19.59 48 16 44.418 16 40c0-4.41 3.581-8 8-8h17.177l5.624-24.358c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L57.598 32h5.58L68.8 7.642c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L79.598 32h5.58zM53.904 48l-1.847 8h5.58l1.846-8h-5.579zm22.039 24l-1.847 8h-5.58l1.847-8h5.58zm-27.58 0l-1.846 8h5.579l1.847-8h-5.58z\\\"/>\u003C/svg>\"},\"$:/core/images/picture\":{\"title\":\"$:/core/images/picture\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-picture tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M112 68.233v-48.23A4.001 4.001 0 00107.997 16H20.003A4.001 4.001 0 0016 20.003v38.31l9.241-14.593c2.8-4.422 9.023-5.008 12.6-1.186l18.247 20.613 13.687-6.407a8 8 0 018.903 1.492 264.97 264.97 0 002.92 2.739 249.44 249.44 0 006.798 6.066 166.5 166.5 0 002.106 1.778c2.108 1.747 3.967 3.188 5.482 4.237.748.518 1.383.92 2.044 1.33.444.117 1.046.144 1.809.05 1.873-.233 4.238-1.144 6.723-2.547a36.016 36.016 0 003.205-2.044c.558-.4.93-.686 1.07-.802.376-.31.765-.577 1.165-.806zM0 8.007A8.01 8.01 0 018.007 0h111.986A8.01 8.01 0 01128 8.007v111.986a8.01 8.01 0 01-8.007 8.007H8.007A8.01 8.01 0 010 119.993V8.007zM95 42a8 8 0 100-16 8 8 0 000 16zM32 76c15.859 4.83 20.035 7.244 20.035 12S32 95.471 32 102.347c0 6.876 1.285 4.99 1.285 9.653H68s-13.685-6.625-13.685-10.8c0-7.665 10.615-8.34 10.615-13.2 0-7.357-14.078-8.833-32.93-12z\\\"/>\u003C/svg>\"},\"$:/core/images/plugin-generic-language\":{\"title\":\"$:/core/images/plugin-generic-language\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> viewBox=\\\"0 0 128 128\\\" class=\\\"tc-image-plugin-generic-language tc-image-button\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M61.207 68.137c-4.324 2.795-6.999 6.656-6.999 10.921 0 7.906 9.19 14.424 21.042 15.336 2.162 3.902 8.598 6.785 16.318 7.01-5.126-1.125-9.117-3.742-10.62-7.01C92.805 93.487 102 86.967 102 79.059c0-8.53-10.699-15.445-23.896-15.445-6.599 0-12.572 1.729-16.897 4.524zm12.794-14.158c-4.324 2.795-10.298 4.524-16.897 4.524-2.619 0-5.14-.272-7.497-.775-3.312 2.25-8.383 3.69-14.067 3.69l-.255-.002c4.119-.892 7.511-2.747 9.478-5.13-6.925-2.704-11.555-7.617-11.555-13.228 0-8.53 10.699-15.445 23.896-15.445C70.301 27.613 81 34.528 81 43.058c0 4.265-2.675 8.126-6.999 10.921zM64 0l54.56 32v64L64 128 9.44 96V32L64 0z\\\"/>\u003C/svg>\"},\"$:/core/images/plugin-generic-plugin\":{\"title\":\"$:/core/images/plugin-generic-plugin\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> viewBox=\\\"0 0 128 128\\\" class=\\\"tc-image-plugin-generic-plugin tc-image-button\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M40.397 76.446V95.34h14.12l-.001-.005a6.912 6.912 0 005.364-11.593l.046-.023a6.912 6.912 0 119.979.526l.086.055a6.914 6.914 0 004.408 10.948l-.023.092h21.32V75.568l-.15.038a6.912 6.912 0 00-11.593-5.364l-.022-.046a6.912 6.912 0 11.526-9.979l.055-.086a6.914 6.914 0 0010.948-4.408c.079.018.158.038.236.059v-15.74h-21.32l.023-.094a6.914 6.914 0 01-4.408-10.947 10.23 10.23 0 00-.086-.055 6.912 6.912 0 10-9.979-.526l-.046.023a6.912 6.912 0 01-5.364 11.593l.001.005h-14.12v12.847A6.912 6.912 0 0129.5 59.843l-.054.086a6.912 6.912 0 10-.526 9.979l.023.046a6.912 6.912 0 0111.455 6.492zM64 0l54.56 32v64L64 128 9.44 96V32L64 0z\\\"/>\u003C/svg>\"},\"$:/core/images/plugin-generic-theme\":{\"title\":\"$:/core/images/plugin-generic-theme\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> viewBox=\\\"0 0 128 128\\\" class=\\\"tc-image-plugin-generic-theme tc-image-button\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M29.408 91.472L51.469 69.41l-.004-.005a2.22 2.22 0 01.004-3.146c.87-.87 2.281-.872 3.147-.005l9.465 9.464a2.22 2.22 0 01-.005 3.147c-.87.87-2.28.871-3.147.005l-.005-.005-22.061 22.062a6.686 6.686 0 11-9.455-9.455zM60.802 66.38c-2.436-2.704-4.465-5.091-5.817-6.869-6.855-9.014-10.313-4.268-14.226 0-3.913 4.268 1.03 7.726-2.683 10.741-3.713 3.015-3.484 4.06-9.752-1.455-6.267-5.516-6.7-7.034-3.823-10.181 2.877-3.147 5.281 1.808 11.159-3.785 5.877-5.593.94-10.55.94-10.55s12.237-25.014 28.588-23.167c16.351 1.848-6.186-2.392-11.792 17.226-2.4 8.4.447 6.42 4.998 9.968 1.394 1.086 6.03 4.401 11.794 8.685l20.677-20.676 1.615-4.766 7.84-4.689 3.151 3.152-4.688 7.84-4.766 1.615-20.224 20.223c12.663 9.547 28.312 22.146 28.312 26.709 
27310 7.217-3.071 11.526-9.535 9.164-4.693-1.715-18.768-15.192-28.753-25.897l-2.893 2.893-3.151-3.152 3.029-3.029zM63.953 0l54.56 32v64l-54.56 32-54.56-32V32l54.56-32z\\\"/>\u003C/svg>\"},\"$:/core/images/plus-button\":{\"title\":\"$:/core/images/plus-button\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-plus-button tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath d=\\\"M64-.333c35.346 0 64 28.654 64 64 0 35.346-28.654 64-64 64-35.346 0-64-28.654-64-64 0-35.346 28.654-64 64-64zM64 16c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.49-48-48-48z\\\"/>\u003Crect width=\\\"80\\\" height=\\\"16\\\" x=\\\"24\\\" y=\\\"56\\\" rx=\\\"8\\\"/>\u003Crect width=\\\"16\\\" height=\\\"80\\\" x=\\\"56\\\" y=\\\"24\\\" rx=\\\"8\\\"/>\u003C/svg>\"},\"$:/core/images/preview-closed\":{\"title\":\"$:/core/images/preview-closed\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-preview-closed tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cg fill-rule=\\\"evenodd\\\">\u003Cpath d=\\\"M.088 64a7.144 7.144 0 001.378 5.458C16.246 88.818 39.17 100.414 64 100.414c24.83 0 47.753-11.596 62.534-30.956A7.144 7.144 0 00127.912 64C110.582 78.416 88.304 87.086 64 87.086 39.696 87.086 17.418 78.416.088 64z\\\"/>\u003Crect width=\\\"4\\\" height=\\\"16\\\" x=\\\"62\\\" y=\\\"96\\\" rx=\\\"4\\\"/>\u003Crect width=\\\"4\\\" height=\\\"16\\\" x=\\\"78\\\" y=\\\"93\\\" rx=\\\"4\\\" transform=\\\"rotate(-5 80 101)\\\"/>\u003Crect width=\\\"4\\\" height=\\\"16\\\" x=\\\"46\\\" y=\\\"93\\\" rx=\\\"4\\\" transform=\\\"rotate(5 48 101)\\\"/>\u003Crect width=\\\"4\\\" height=\\\"16\\\" x=\\\"30\\\" y=\\\"88\\\" rx=\\\"4\\\" transform=\\\"rotate(10 32 96)\\\"/>\u003Crect width=\\\"4\\\" height=\\\"16\\\" x=\\\"94\\\" y=\\\"88\\\" rx=\\\"4\\\" transform=\\\"rotate(-10 96 96)\\\"/>\u003Crect width=\\\"4\\\" height=\\\"16\\\" x=\\\"110\\\" y=\\\"80\\\" rx=\\\"4\\\" transform=\\\"rotate(-20 112 88)\\\"/>\u003Crect width=\\\"4\\\" height=\\\"16\\\" x=\\\"14\\\" y=\\\"80\\\" rx=\\\"4\\\" transform=\\\"rotate(20 16 88)\\\"/>\u003C/g>\u003C/svg>\"},\"$:/core/images/preview-open\":{\"title\":\"$:/core/images/preview-open\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-preview-open tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cg fill-rule=\\\"evenodd\\\">\u003Cpath d=\\\"M64.11 99.588c-24.83 0-47.754-11.596-62.534-30.957a7.148 7.148 0 010-8.675C16.356 40.596 39.28 29 64.11 29c24.83 0 47.753 11.596 62.534 30.956a7.148 7.148 0 010 8.675c-14.78 19.36-37.703 30.957-62.534 30.957zm46.104-32.007c1.44-1.524 1.44-3.638 0-5.162C99.326 50.9 82.439 44 64.147 44S28.968 50.9 18.08 62.42c-1.44 1.523-1.44 3.637 0 5.16C28.968 79.1 45.855 86 64.147 86s35.179-6.9 46.067-18.42z\\\"/>\u003Cpath d=\\\"M63.5 88C76.479 88 87 77.479 87 64.5S76.479 41 63.5 41 40 51.521 40 64.5 50.521 88 63.5 88z\\\"/>\u003C/g>\u003C/svg>\"},\"$:/core/images/print-button\":{\"title\":\"$:/core/images/print-button\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-print-button tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cg fill-rule=\\\"evenodd\\\">\u003Cpath d=\\\"M112 71V30.5h-.032c-.035-2-.816-3.99-2.343-5.516L86.998 2.357A7.978 7.978 0 0081 .02V0H24a8 8 0 00-8 8v63h8V8h57v14.5c0 4.422 3.582 8 8 8h15V71h8z\\\"/>\u003Crect width=\\\"64\\\" height=\\\"8\\\" x=\\\"32\\\" y=\\\"36\\\" rx=\\\"4\\\"/>\u003Crect width=\\\"64\\\" height=\\\"8\\\" x=\\\"32\\\" y=\\\"52\\\" rx=\\\"4\\\"/>\u003Crect width=\\\"40\\\" height=\\\"8\\\" x=\\\"32\\\" y=\\\"20\\\" rx=\\\"4\\\"/>\u003Cpath d=\\\"M0 80.005C0 71.165 7.156 64 16 64h96c8.836 0 16 7.155 16 16.005v31.99c0 8.84-7.156 16.005-16 16.005H16c-8.836 0-16-7.155-16-16.005v-31.99zM104 96a8 8 0 100-16 8 8 0 000 16z\\\"/>\u003C/g>\u003C/svg>\"},\"$:/core/images/quote\":{\"title\":\"$:/core/images/quote\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-quote tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M51.219 117.713V62.199H27.427c0-8.891 1.683-16.401 5.047-22.53 3.365-6.127 9.613-10.754 18.745-13.878V2c-7.45.961-14.36 3.184-20.728 6.669-6.368 3.484-11.835 7.87-16.401 13.157C9.524 27.113 5.98 33.241 3.456 40.21.933 47.18-.21 54.63.03 62.56v55.153H51.22zm76.781 0V62.199h-23.791c0-8.891 1.682-16.401 5.046-22.53 3.365-6.127 9.613-10.754 18.745-13.878V2c-7.45.961-14.359 3.184-2
27310.727 6.669-6.369 3.484-11.836 7.87-16.402 13.157-4.566 5.287-8.11 11.415-10.634 18.384-2.523 6.97-3.665 14.42-3.424 22.35v55.153H128z\\\"/>\u003C/svg>\"},\"$:/core/images/refresh-button\":{\"title\":\"$:/core/images/refresh-button\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-refresh-button tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M106.369 39.433c10.16 20.879 6.57 46.764-10.771 64.106-21.87 21.87-57.327 21.87-79.196 0-21.87-21.87-21.87-57.326 0-79.196a8 8 0 1111.314 11.314c-15.621 15.62-15.621 40.947 0 56.568 15.62 15.621 40.947 15.621 56.568 0C97.72 78.79 99.6 58.175 89.924 42.73l-6.44 12.264a8 8 0 11-14.166-7.437L84.435 18.76a8 8 0 0110.838-3.345l28.873 15.345a8 8 0 11-7.51 14.129l-10.267-5.457zm-8.222-12.368c-.167-.19-.336-.38-.506-.57l.96-.296-.454.866z\\\"/>\u003C/svg>\"},\"$:/core/images/right-arrow\":{\"title\":\"$:/core/images/right-arrow\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-right-arrow tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath d=\\\"M99.069 64.173c0 2.027-.77 4.054-2.316 5.6l-55.98 55.98a7.92 7.92 0 01-11.196 0c-3.085-3.086-3.092-8.105 0-11.196l50.382-50.382-50.382-50.382a7.92 7.92 0 010-11.195c3.086-3.085 8.104-3.092 11.196 0l55.98 55.98a7.892 7.892 0 012.316 5.595z\\\"/>\u003C/svg>\"},\"$:/core/images/rotate-left\":{\"title\":\"$:/core/images/rotate-left\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-rotate-left tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cg fill-rule=\\\"evenodd\\\">\u003Crect width=\\\"32\\\" height=\\\"80\\\" rx=\\\"8\\\"/>\u003Crect width=\\\"80\\\" height=\\\"32\\\" x=\\\"48\\\" y=\\\"96\\\" rx=\\\"8\\\"/>\u003Cpath d=\\\"M61.32 36.65c19.743 2.45 35.023 19.287 35.023 39.693a4 4 0 01-8 0c0-15.663-11.254-28.698-26.117-31.46l3.916 3.916a4 4 0 11-5.657 5.657L49.172 43.142a4 4 0 010-5.657l11.313-11.313a4 4 0 115.657 5.656l-4.821 4.822z\\\"/>\u003C/g>\u003C/svg>\"},\"$:/core/images/save-button-dynamic\":{\"title\":\"$:/core/images/save-button-dynamic\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-save-button-dynamic tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\\n\u003Cg class=\\\"tc-image-save-button-dynamic-clean\\\">\\n\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M120.783 34.33c4.641 8.862 7.266 18.948 7.266 29.646 0 35.347-28.653 64-64 64-35.346 0-64-28.653-64-64 0-35.346 28.654-64 64-64 18.808 0 35.72 8.113 47.43 21.03l2.68-2.68c3.13-3.13 8.197-3.132 11.321-.008 3.118 3.118 3.121 8.193-.007 11.32l-4.69 4.691zm-12.058 12.058a47.876 47.876 0 013.324 17.588c0 26.51-21.49 48-48 48s-48-21.49-48-48 21.49-48 48-48c14.39 0 27.3 6.332 36.098 16.362L58.941 73.544 41.976 56.578c-3.127-3.127-8.201-3.123-11.32-.005-3.123 3.124-3.119 8.194.006 11.319l22.617 22.617a7.992 7.992 0 005.659 2.347c2.05 0 4.101-.783 5.667-2.349l44.12-44.12z\\\"/>\\n\u003C/g>\\n\u003Cg class=\\\"tc-image-save-button-dynamic-dirty\\\">\\n\u003Cpath d=\\\"M64.856912,0 C100.203136,0 128.856912,28.653776 128.856912,64 C128.856912,99.346224 100.203136,128 64.856912,128 C29.510688,128 0.856911958,99.346224 0.856911958,64 C0.856911958,28.653776 29.510688,0 64.856912,0 Z M64.856912,16 C38.347244,16 16.856912,37.490332 16.856912,64 C16.856912,90.509668 38.347244,112 64.856912,112 C91.3665799,112 112.856912,90.509668 112.856912,64 C112.856912,37.490332 91.3665799,16 64.856912,16 Z\\\">\u003C/path>\\n\u003Ccircle cx=\\\"65\\\" cy=\\\"64\\\" r=\\\"32\\\">\u003C/circle>\\n\u003C/g>\\n\u003C/svg>\"},\"$:/core/images/save-button\":{\"title\":\"$:/core/images/save-button\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-save-button tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M120.783 34.33c4.641 8.862 7.266 18.948 7.266 29.646 0 35.347-28.653 64-64 64-35.346 0-64-28.653-64-64 0-35.346 28.654-64 64-64 18.808 
27310 35.72 8.113 47.43 21.03l2.68-2.68c3.13-3.13 8.197-3.132 11.321-.008 3.118 3.118 3.121 8.193-.007 11.32l-4.69 4.691zm-12.058 12.058a47.876 47.876 0 013.324 17.588c0 26.51-21.49 48-48 48s-48-21.49-48-48 21.49-48 48-48c14.39 0 27.3 6.332 36.098 16.362L58.941 73.544 41.976 56.578c-3.127-3.127-8.201-3.123-11.32-.005-3.123 3.124-3.119 8.194.006 11.319l22.617 22.617a7.992 7.992 0 005.659 2.347c2.05 0 4.101-.783 5.667-2.349l44.12-44.12z\\\"/>\u003C/svg>\"},\"$:/core/images/size\":{\"title\":\"$:/core/images/size\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-size tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath d=\\\"M92.343 26l-9.171 9.172a4 4 0 105.656 5.656l16-16a4 4 0 000-5.656l-16-16a4 4 0 10-5.656 5.656L92.343 18H22a4 4 0 00-4 4v70.343l-9.172-9.171a4 4 0 10-5.656 5.656l16 16a4 4 0 005.656 0l16-16a4 4 0 10-5.656-5.656L26 92.343V22l-4 4h70.343zM112 52v64l4-4H52a4 4 0 100 8h64a4 4 0 004-4V52a4 4 0 10-8 0z\\\"/>\u003C/svg>\"},\"$:/core/images/spiral\":{\"title\":\"$:/core/images/spiral\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-spiral tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath d=\\\"M64.534 68.348c3.39 0 6.097-2.62 6.476-5.968l-4.755-.538 4.75.583c.377-3.07-1.194-6.054-3.89-7.78-2.757-1.773-6.34-2.01-9.566-.7-3.46 1.403-6.14 4.392-7.35 8.148l-.01.026c-1.3 4.08-.72 8.64 1.58 12.52 2.5 4.2 6.77 7.2 11.76 8.27 5.37 1.15 11.11-.05 15.83-3.31 5.04-3.51 8.46-9.02 9.45-15.3 1.05-6.7-.72-13.63-4.92-19.19l.02.02c-4.42-5.93-11.2-9.82-18.78-10.78-7.96-1.01-16.13 1.31-22.59 6.43-6.81 5.39-11.18 13.41-12.11 22.26-.98 9.27 1.87 18.65 7.93 26.02 6.32 7.69 15.6 12.56 25.74 13.48 10.54.96 21.15-2.42 29.45-9.4l.01-.01c8.58-7.25 13.94-17.78 14.86-29.21.94-11.84-2.96-23.69-10.86-32.9-8.19-9.5-19.95-15.36-32.69-16.27-13.16-.94-26.24 3.49-36.34 12.34l.01-.01c-10.41 9.08-16.78 22.1-17.68 36.15-.93 14.44 4.03 28.77 13.79 39.78 10.03 11.32 24.28 18.2 39.6 19.09 15.73.92 31.31-4.56 43.24-15.234 12.23-10.954 19.61-26.44 20.5-43.074a4.785 4.785 0 00-4.52-5.03 4.778 4.778 0 00-5.03 4.52c-.75 14.1-7 27.2-17.33 36.45-10.03 8.98-23.11 13.58-36.3 12.81-12.79-.75-24.67-6.48-33-15.89-8.07-9.11-12.17-20.94-11.41-32.827.74-11.52 5.942-22.15 14.43-29.54l.01-.01c8.18-7.17 18.74-10.75 29.35-9.998 10.21.726 19.6 5.41 26.11 12.96 6.24 7.273 9.32 16.61 8.573 25.894-.718 8.9-4.88 17.064-11.504 22.66l.01-.007c-6.36 5.342-14.44 7.92-22.425 7.19-7.604-.68-14.52-4.314-19.21-10.027-4.44-5.4-6.517-12.23-5.806-18.94.67-6.3 3.76-11.977 8.54-15.766 4.46-3.54 10.05-5.128 15.44-4.44 5.03.63 9.46 3.18 12.32 7.01l.02.024c2.65 3.5 3.75 7.814 3.1 11.92-.59 3.71-2.58 6.925-5.45 8.924-2.56 1.767-5.61 2.403-8.38 1.81-2.42-.516-4.42-1.92-5.53-3.79-.93-1.56-1.15-3.3-.69-4.75l-4.56-1.446L59.325 65c.36-1.12 1.068-1.905 1.84-2.22.25-.103.48-.14.668-.13.06.006.11.015.14.025.01 0 .01 0-.01-.01a1.047 1.047 0 01-.264-.332c-.15-.29-.23-.678-.18-1.11l-.005.04c.15-1.332 1.38-2.523 3.035-2.523-2.65 0-4.79 2.144-4.79 4.787s2.14 4.785 4.78 4.785z\\\"/>\u003C/svg>\"},\"$:/core/images/stamp\":{\"title\":\"$:/core/images/stamp\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-stamp tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M49.733 64H16.01C11.584 64 8 67.583 8 72.003V97h112V72.003A8 8 0 00111.99 64H78.267A22.813 22.813 0 0175.5 53.077c0-6.475 2.687-12.324 7.009-16.497A22.818 22.818 0 0087 22.952C87 10.276 76.703 0 64 0S41 10.276 41 22.952c0 5.103 1.669 9.817 4.491 13.628 4.322 4.173 7.009 10.022 7.009 16.497 0 3.954-1.002 7.675-2.767 10.923zM8 104h112v8H8v-8z\\\"/>\u003C/svg>\"},\"$:/core/images/star-filled\":{\"title\":\"$:/core/images/star-filled\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-star-filled tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath d=\\\"M61.836 96.823l37.327 27.287c2.72 1.99 6.379-.69 5.343-3.912L90.29 75.988l-1.26 3.91 37.285-27.345c2.718-1.993 1.32-6.327-2.041-6.33l-46.113-.036 3.3 2.416L67.176 4.416c-1.04-3.221-5.563-3.221-6.604 0L46.29 48.603l3.3-2.416-46.113.036c-3.362.003-4.759 4.337-2.04 6.33L38.72 79.898l-1.26-3.91-14.216 44.21c-1.036 3.223 2.622 5.901 5.343 3.912l37.326-27.287h-4.078z\\\"/>\u003C/svg>\"},\"$:/core/images/storyview-classic\":{\"title\":\"$:/core/images/storyview-classic\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-storyview-classic tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M8.007 0A8.01 8.01 0 000 8.007v111.986A8.01 8.01 0 008.007 128h111.986a8.01 8.01 0 008.007-8.007V8.007A8.01 8.01 0 00119.993 0H8.007zm15.992 16C19.581 16 16 19.578 16 23.992v16.016C16 44.422 19.588 48 24 48h80c4.419 0 8-3.578 8-7.992V23.992c0-4.414-3.588-7.992-8-7.992H24zm0 48C19.581 64 16 67.59 16 72c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8 0-4.418-3.588-8-8-8H24zm0 32C19.581 96 16 99.59 16 104c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8 0-4.418-3.588-8-8-8H24z\\\"/>\u003C/svg>\"},\"$:/core/images/storyview-pop\":{\"title\":\"$:/core/images/storyview-pop\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-storyview-pop tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M8.007 0A8.01 8.01 0 000 8.007v111.986A8.01 8.01 0 008.007 128h111.986a8.01 8.01 0 008.007-8.007V8.007A8.01 8.01 0 00119.993 0H8.007zm15.992 16C19.581 16 16 19.578 16 23.992v16.016C16 44.422 19.588 48 24 48h80c4.419 0 8-3.578 8-7.992V23.992c0-4.414-3.588-7.992-8-7.992H24zm-7.99 40C11.587 56 8 59.578 8 63.992v16.016C8 84.422 11.584 88 16.01 88h95.98c4.424 0 8.01-3.578 8.01-7.992V63.992c0-4.414-3.584-7.992-8.01-7.992H16.01zM24 96C19.581 96 16 99.59 16 104c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8 0-4.418-3.588-8-8-8H24zm0-32C19.581 64 16 67.59 16 72c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8 0-4.418-3.588-8-8-8H24z\\\"/>\u003C/svg>\"},\"$:/core/images/storyview-zoomin\":{\"title\":\"$:/core/images/storyview-zoomin\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-storyview-zoomin tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M8.007 0A8.01 8.01 0 000 8.007v111.986A8.01 8.01 0 008.007 128h111.986a8.01 8.01 0 008.007-8.007V8.007A8.01 8.01 0 00119.993 0H8.007zm15.992 16A8 8 0 0016 24.009V71.99C16 76.414 19.588 80 24 80h80a8 8 0 008-8.009V24.01c0-4.423-3.588-8.009-8-8.009H24z\\\"/>\u003C/svg>\"},\"$:/core/images/strikethrough\":{\"title\":\"$:/core/images/strikethrough\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-strikethrough tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cg fill-rule=\\\"evenodd\\\">\u003Cpath d=\\\"M92.794 38.726h15.422c-.229-6.74-1.514-12.538-3.856-17.393-2.342-4.855-5.54-8.881-9.596-12.08-4.055-3.199-8.767-5.54-14.136-7.025C75.258.743 69.433 0 63.15 0a62.76 62.76 0 00-16.364 2.142C41.474 3.57 36.733 5.74 32.564 8.653c-4.17 2.913-7.511 6.626-10.025 11.138-2.513 4.512-3.77 9.853-3.77 16.022 0 5.597 1.115 10.252 3.342 13.965 2.228 3.712 5.198 6.74 8.91 9.081 3.713 2.342 7.911 4.227 12.595 5.655a194.641 194.641 0 0014.308 3.77c4.855 1.085 9.624 2.142 14.308 3.17 4.683 1.028 8.881 2.37 12.594 4.027 3.713 1.656 6.683 3.798 8.91 6.425 2.228 2.628 3.342 6.055 3.342 10.281 0 4.456-.914 8.111-2.742 10.967a19.953 19.953 0 01-7.197 6.768c-2.97 1.657-6.311 2.828-10.024 3.513a60.771 60.771 0 01-11.052 1.028c-4.57 0-9.025-.571-13.366-1.713-4.34-1.143-8.139-2.913-11.394-5.312-3.256-2.4-5.884-5.455-7.883-9.168-1.999-3.712-2.998-8.139-2.998-13.28H15c0 7.426 1.342 13.852 4.027 19.278 2.684 5.426 6.34 9.881 10.966 13.365 4.627 3.484 9.996 6.083 16.107 7.797 6.112 1.713 12.595 2.57 19.449 2.57 5.597 0 11.223-.657 16.878-1.97 5.655-1.314 10.767-3.428 15.336-6.34 4.57-2.914 8.31-6.683 11.224-11.31 2.913-4.626 4.37-10.195 4.37-16.707 0-6.054-1.115-11.08-3.342-15.079-2.228-3.998-5.198-7.31-8.91-9.938-3.713-2.627-7.911-4.712-12.595-6.254a170.83 170.83 0 00-14.308-4.027 549.669 549.669 0 00-14.308-3.17c-4.683-.971-8.881-2.2-12.594-3.684-3.713-1.485-6.683-3.399-8.91-5.74-2.228-2.342-3.342-5.398-3.342-9.168 0-3.998.771-7.34 2.313-10.024 1.543-2.685 3.599-4.826 6.17-6.426 2.57-1.599 5.51-2.741 8.824-3.427a49.767 49.767 0 0110.11-1.028c8.453 0 15.393 1.97 20.819 5.912 5.426 3.94 8.596 10.31 9.51 19.106z\\\"/>\u003Cpath d=\\\"M5 54h118v16H5z\\\"/>\u003C/g>\u003C/svg>\"},\"$:/core/images/subscript\":{\"title\":\"$:/core/images/subscript\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-subscript tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M2.272 16h19.91l21.649 33.675L66.414 16h18.708L53.585 61.969l33.809 49.443H67.082L43.296 74.93l-24.187 36.48H0L33.808 61.97 2.272 16zM127.91 128.412H85.328c.059-5.168 1.306-9.681 3.741-13.542 2.435-3.86 5.761-7.216 9.978-10.066a112.388 112.388 0 016.325-4.321 50.09 50.09 0 006.058-4.499c1.841-1.603 3.356-3.34 4.543-5.211 1.188-1.871 1.812-4.024 1.871-6.46 0-1.128-.133-2.33-.4-3.607a9.545 9.545 0 00-1.56-3.564c-.772-1.098-1.84-2.019-3.207-2.761-1.366-.743-3.148-1.114-5.345-1.114-2.02 0-3.697.4-5.033 1.203-1.337.801-2.406 1.9-3.208 3.296-.801 1.396-1.395 3.044-1.781 4.944-.386 1.9-.609 3.95-.668 6.147H86.486c0-3.445.46-6.637 1.38-9.577.921-2.94 2.302-5.478 4.143-7.617 1.841-2.138 4.083-3.815 6.726-5.033 2.643-1.217 5.716-1.826 9.22-1.826 3.802 0 6.979.623 9.533 1.87 2.554 1.248 4.617 2.822 6.191 4.722 1.574 1.9 2.688 3.965 3.341 6.192.653 2.227.98 4.35.98 6.37 0 2.494-.386 4.75-1.158 6.77a21.803 21.803 0 01-3.118 5.568 31.516 31.516 0 01-4.454 4.677 66.788 66.788 0 01-5.167 4.009 139.198 139.198 0 01-5.346 3.563 79.237 79.237 0 00-4.944 3.386c-1.514 1.128-2.836 2.3-3.964 3.518-1.129 1.218-1.9 2.51-2.317 3.876h30.379v9.087z\\\"/>\u003C/svg>\"},\"$:/core/images/superscript\":{\"title\":\"$:/core/images/superscript\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-superscript tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M2.272 16h19.91l21.649 33.675L66.414 16h18.708L53.585 61.969l33.809 49.443H67.082L43.296 74.93l-24.187 36.48H0L33.808 61.97 2.272 16zM127.91 63.412H85.328c.059-5.168 1.306-9.681 3.741-13.542 2.435-3.86 5.761-7.216 9.978-10.066a112.388 112.388 0 016.325-4.321 50.09 50.09 0 006.058-4.499c1.841-1.603 3.356-3.34 4.543-5.211 1.188-1.871 1.812-4.024 1.871-6.46 0-1.128-.133-2.33-.4-3.607a9.545 9.545 0 00-1.56-3.564c-.772-1.098-1.84-2.019-3.207-2.761-1.366-.743-3.148-1.114-5.345-1.114-2.02 0-3.697.4-5.033 1.203-1.337.801-2.406 1.9-3.208 3.296-.801 1.396-1.395 3.044-1.781 4.944-.386 1.9-.609 3.95-.668 6.147H86.486c0-3.445.46-6.637 1.38-9.577.921-2.94 2.302-5.478 4.143-7.617 1.841-2.138 4.083-3.815 6.726-5.033 2.643-1.217 5.716-1.826 9.22-1.826 3.802 0 6.979.623 9.533 1.87 2.554 1.248 4.617 2.822 6.191 4.722 1.574 1.9 2.688 3.965 3.341 6.192.653 2.227.98 4.35.98 6.37 0 2.494-.386 4.75-1.158 6.77a21.803 21.803 0 01-3.118 5.568 31.516 31.516 0 01-4.454 4.677 66.788 66.788 0 01-5.167 4.009 139.198 139.198 0 01-5.346 3.563 79.237 79.237 0 00-4.944 3.386c-1.514 1.128-2.836 2.3-3.964 3.518-1.129 1.218-1.9 2.51-2.317 3.876h30.379v9.087z\\\"/>\u003C/svg>\"},\"$:/core/images/tag-button\":{\"title\":\"$:/core/images/tag-button\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-tag-button tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cg fill-rule=\\\"evenodd\\\">
2731\u003Cpath d=\\\"M18.164 47.66l.004 4.105c.003 3.823 2.19 9.097 4.885 11.792l61.85 61.85c2.697 2.697 7.068 2.69 9.769-.01L125.767 94.3a6.903 6.903 0 00.01-9.77L63.928 22.683c-2.697-2.697-7.976-4.88-11.796-4.881l-27.076-.007a6.902 6.902 0 00-6.91 6.91l.008 9.96.287.033c3.73.411 8.489-.044 13.365-1.153a9.702 9.702 0 0111.14-3.662l.291-.13.128.285a9.7 9.7 0 013.3 2.17c3.796 3.796 3.801 9.945.012 13.734-3.618 3.618-9.386 3.777-13.204.482-5.365 1.122-10.674 1.596-15.309 1.237z\\\"/>\u003Cpath d=\\\"M47.633 39.532l.023.051c-9.689 4.356-21.584 6.799-30.396 5.828C5.273 44.089-1.028 36.43 2.443 24.078 5.562 12.976 14.3 4.361 24.047 1.548c10.68-3.083 19.749 1.968 19.749 13.225h-8.623c0-4.859-3.078-6.573-8.735-4.94-6.91 1.995-13.392 8.383-15.694 16.577-1.915 6.818.417 9.653 7.46 10.43 7.126.785 17.531-1.352 25.917-5.121l.027.06.036-.017c1.76-.758 6.266 6.549 3.524 7.74a2.8 2.8 0 01-.075.03z\\\"/>\u003C/g>\u003C/svg>\"},\"$:/core/images/theme-button\":{\"title\":\"$:/core/images/theme-button\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-theme-button tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cg fill-rule=\\\"evenodd\\\">\u003Cpath d=\\\"M55.854 66.945a122.626 122.626 0 01-3.9-4.819c-11.064-14.548-16.645-6.888-22.96 0-6.315 6.888 1.664 12.47-4.33 17.335-5.993 4.866-5.623 6.552-15.737-2.35-10.115-8.9-10.815-11.351-6.172-16.43 4.644-5.08 8.524 2.918 18.01-6.108 9.485-9.026 1.517-17.026 1.517-17.026S42.03-2.824 68.42.157c26.39 2.982-9.984-3.86-19.031 27.801-3.874 13.556.72 10.362 8.066 16.087 1.707 1.33 6.428 4.732 12.671 9.318-6.129 5.879-11.157 10.669-14.273 13.582zm11.641 12.947c16.013 17.036 37.742 37.726 45.117 40.42 10.432 3.813 15.388-3.141 15.388-14.79 0-7.151-23.83-26.542-43.924-41.769-7.408 7.156-13.376 12.953-16.58 16.139z\\\"/>\u003Cpath d=\\\"M11.069 109.828L46.31 74.587a3.56 3.56 0 115.037-5.032l15.098 15.098a3.56 3.56 0 11-5.032 5.037l-35.24 35.241c-4.171 4.17-10.933 4.17-15.104 0-4.17-4.17-4.17-10.933 0-15.103zM124.344 6.622l5.034 5.034-7.49 12.524-7.613 2.58L61.413 79.62l-5.034-5.034 52.861-52.862 2.58-7.614 12.524-7.49z\\\"/>\u003C/g>\u003C/svg>\"},\"$:/core/images/timestamp-off\":{\"title\":\"$:/core/images/timestamp-off\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-timestamp-off tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cg fill-rule=\\\"evenodd\\\">\u003Cpath d=\\\"M58.25 11C26.08 11 0 37.082 0 69.25s26.08 58.25 58.25 58.25c32.175 0 58.25-26.082 58.25-58.25S90.425 11 58.25 11zm0 100.5C34.914 111.5 16 92.586 16 69.25 16 45.92 34.914 27 58.25 27s42.25 18.92 42.25 42.25c0 23.336-18.914 42.25-42.25 42.25zM49.704 10a5 5 0 010-10H66.69a5 5 0 015 5c.006 2.757-2.238 5-5 5H49.705z\\\"/>\u003Cpath d=\\\"M58.25 35.88c-18.777 0-33.998 15.224-33.998 33.998 0 18.773 15.22 34.002 33.998 34.002 18.784 0 34.002-15.23 34.002-34.002 0-18.774-15.218-33.998-34.002-33.998zm-3.03 50.123H44.196v-34H55.22v34zm16.976 0H61.17v-34h11.025v34z\\\"/>\u003C/g>\u003C/svg>\"},\"$:/core/images/timestamp-on\":{\"title\":\"$:/core/images/timestamp-on\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-timestamp-on tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cg fill-rule=\\\"evenodd\\\">\u003Cpath d=\\\"M58.25 11C26.08 11 0 37.082 0 69.25s26.08 58.25 58.25 58.25c32.175 0 58.25-26.082 58.25-58.25S90.425 11 58.25 11zm0 100.5C34.914 111.5 16 92.586 16 69.25 16 45.92 34.914 27 58.25 27s42.25 18.92 42.25 42.25c0 23.336-18.914 42.25-42.25 42.25zM49.704 10a5 5 0 010-10H66.69a5 5 0 015 5c.006 2.757-2.238 5-5 5H49.705z\\\"/>\u003Cpath d=\\\"M13.41 27.178a5.005 5.005 0 01-7.045-.613 5.008 5.008 0 01.616-7.047l9.95-8.348a5 5 0 016.429 7.661l-9.95 8.348zm89.573 0a5.005 5.005 0 007.045-.613 5.008 5.008 0 00-.616-7.047l-9.95-8.348a5 5 0 00-6.428 7.661l9.95 8.348zM65.097 71.072c0 3.826-3.09 6.928-6.897 6.928-3.804.006-6.9-3.102-6.903-6.928 0 0 4.76-39.072 6.903-39.072s6.897 39.072 6.897 39.072z\\\"/>\u003C/g>\u003C/svg>\"},\"$:/core/images/tip\":{\"title\":\"$:/core/images/tip\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-tip tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M64 128.242c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64-35.346 0-64 28.654-64 64 0 35.346 28.654 64 64 64zm11.936-36.789c-.624 4.129-5.73 7.349-11.936 7.349-6.206 0-11.312-3.22-11.936-7.349C54.33 94.05 58.824 95.82 64 95.82c5.175 0 9.67-1.769 11.936-4.366zm0 4.492c-.624 4.13-5.73 7.349-11.936 7.349-6.206 0-11.312-3.22-11.936-7.349 2.266 2.597 6.76 4.366 11.936 4.366 5.175 0 9.67-1.769 11.936-4.366zm0 4.456c-.624 4.129-5.73 7.349-11.936 7.349-6.206 0-11.312-3.22-11.936-7.349 2.266 2.597 6.76 4.366 11.936 4.366 5.175 0 9.67-1.769 11.936-4.366zm0 4.492c-.624 4.13-5.73 7.349-11.936 7.349-6.206 0-11.312-3.22-11.936-7.349 2.266 2.597 6.76 4.366 11.936 4.366 5.175 0 9.67-1.769 11.936-4.366zM64.3 24.242c11.618 0 23.699 7.82 23.699 24.2S75.92 71.754 75.92 83.576c0 5.873-5.868 9.26-11.92 9.26s-12.027-3.006-12.027-9.26C51.973 71.147 40 65.47 40 48.442s12.683-24.2 24.301-24.2z\\\"/>\u003C/svg>\"},\"$:/core/images/transcludify\":{\"title\":\"$:/core/images/transcludify\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-transcludify-button tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M0 59.482c.591 0 1.36-.089 2.306-.266a10.417 10.417 0 002.75-.932 6.762 6.762 0 002.306-1.907c.651-.828.976-1.863.976-3.104V35.709c0-2.01.414-3.74 1.242-5.19.828-1.448 1.833-2.66 3.016-3.636s2.425-1.7 3.726-2.173c1.3-.473 2.424-.71 3.37-.71h8.073v7.451h-4.88c-1.241 0-2.232.207-2.97.621-.74.414-1.302.932-1.686 1.552a4.909 4.909 0 00-.71 1.996c-.089.71-.133 1.39-.133 2.04v16.677c0 1.715-.325 3.134-.976 4.258-.65 1.123-1.434 2.025-2.35 2.705-.917.68-1.863 1.168-2.839 1.464-.976.296-1.818.473-2.528.532v.178c.71.059 1.552.207 2.528.443.976.237 1.922.68 2.839 1.33.916.651 1.7 1.583 2.35 2.795.65 1.212.976 2.853.976 4.923v16.144c0 .65.044 1.33.133 2.04.089.71.325 1.375.71 1.996.384.621.946 1.139 1.685 1.553.74.414 1.73.62 2.972.62h4.879v7.452h-8.073c-.946 0-2.07-.237-3.37-.71-1.301-.473-2.543-1.197-3.726-2.173-1.183-.976-2.188-2.188-3.016-3.637-.828-1.449-1.242-3.179-1.242-5.19V74.119c0-1.42-.325-2.572-.976-3.46-.65-.886-1.419-1.581-2.306-2.084a8.8
273168 8.868 0 00-2.75-1.02C1.36 67.377.591 67.288 0 67.288v-7.806zm24.66 0c.591 0 1.36-.089 2.306-.266a10.417 10.417 0 002.75-.932 6.762 6.762 0 002.306-1.907c.65-.828.976-1.863.976-3.104V35.709c0-2.01.414-3.74 1.242-5.19.828-1.448 1.833-2.66 3.016-3.636s2.425-1.7 3.726-2.173c1.3-.473 2.424-.71 3.37-.71h8.073v7.451h-4.88c-1.241 0-2.232.207-2.97.621-.74.414-1.302.932-1.686 1.552a4.909 4.909 0 00-.71 1.996c-.089.71-.133 1.39-.133 2.04v16.677c0 1.715-.325 3.134-.976 4.258-.65 1.123-1.434 2.025-2.35 2.705-.917.68-1.863 1.168-2.839 1.464-.976.296-1.818.473-2.528.532v.178c.71.059 1.552.207 2.528.443.976.237 1.922.68 2.839 1.33.916.651 1.7 1.583 2.35 2.795.65 1.212.976 2.853.976 4.923v16.144c0 .65.044 1.33.133 2.04.089.71.325 1.375.71 1.996.384.621.946 1.139 1.685 1.553.74.414 1.73.62 2.972.62h4.879v7.452h-8.073c-.946 0-2.07-.237-3.37-.71-1.301-.473-2.543-1.197-3.726-2.173-1.183-.976-2.188-2.188-3.016-3.637-.828-1.449-1.242-3.179-1.242-5.19V74.119c0-1.42-.325-2.572-.976-3.46-.65-.886-1.419-1.581-2.306-2.084a8.868 8.868 0 00-2.75-1.02c-.946-.177-1.715-.266-2.306-.266v-7.806zm43.965-3.538L80.6 52.041l2.306 7.097-12.063 3.903 7.628 10.378-6.12 4.435-7.63-10.467-7.45 10.201-5.943-4.524 7.628-10.023-12.152-4.17 2.306-7.096 12.064 4.17V43.347h7.451v12.596zm34.425 11.344c-.65 0-1.449.089-2.395.266-.946.177-1.863.488-2.75.931a6.356 6.356 0 00-2.262 1.908c-.62.828-.931 1.862-.931 3.104v17.564c0 2.01-.414 3.74-1.242 5.189-.828 1.449-1.833 2.661-3.016 3.637s-2.425 1.7-3.726 2.173c-1.3.473-2.424.71-3.37.71h-8.073v-7.451h4.88c1.241 0 2.232-.207 2.97-.621.74-.414 1.302-.932 1.686-1.553a4.9 4.9 0 00.71-1.995c.089-.71.133-1.39.133-2.04V72.432c0-1.715.325-3.134.976-4.258.65-1.124 1.434-2.01 2.35-2.661.917-.65 1.863-1.124 2.839-1.42.976-.295 1.818-.502 2.528-.62v-.178c-.71-.059-1.552-.207-2.528-.443-.976-.237-1.922-.68-2.839-1.33-.916-.651-1.7-1.583-2.35-2.795-.65-1.212-.976-2.853-.976-4.923V37.66c0-.651-.044-1.331-.133-2.04a4.909 4.909 0 00-.71-1.997c-.384-.62-.946-1.138-1.685-1.552-.74-.414-1.73-.62-2.972-.62h-4.879V24h8.073c.946 0 2.07.237 3.37.71 1.301.473 2.543 1.197 3.726 2.173 1.183.976 2.188 2.188 3.016 3.637.828 1.449 1.242 3.178 1.242 5.189v16.943c0 1.419.31 2.572.931 3.46a6.897 6.897 0 002.262 2.084 8.868 8.868 0 002.75 1.02c.946.177 1.745.266 2.395.266v7.806zm24.66 0c-.65 0-1.449.089-2.395.266-.946.177-1.863.488-2.75.931a6.356 6.356 0 00-2.262 1.908c-.62.828-.931 1.862-.931 3.104v17.564c0 2.01-.414 3.74-1.242 5.189-.828 1.449-1.833 2.661-3.016 3.637s-2.425 1.7-3.726 2.173c-1.3.473-2.424.71-3.37.71h-8.073v-7.451h4.88c1.241 0 2.232-.207 2.97-.621.74-.414 1.302-.932 1.686-1.553a4.9 4.9 0 00.71-1.995c.089-.71.133-1.39.133-2.04V72.432c0-1.715.325-3.134.976-4.258.65-1.124 1.434-2.01 2.35-2.661.917-.65 1.863-1.124 2.839-1.42.976-.295 1.818-.502 2.528-.62v-.178c-.71-.059-1.552-.207-2.528-.443-.976-.237-1.922-.68-2.839-1.33-.916-.651-1.7-1.583-2.35-2.795-.65-1.212-.976-2.853-.976-4.923V37.66c0-.651-.044-1.331-.133-2.04a4.909 4.909 0 00-.71-1.997c-.384-.62-.946-1.138-1.685-1.552-.74-.414-1.73-.62-2.972-.62h-4.879V24h8.073c.946 0 2.07.237 3.37.71 1.301.473 2.543 1.197 3.726 2.173 1.183.976 2.188 2.188 3.016 3.637.828 1.449 1.242 3.178 1.242 5.189v16.943c0 1.419.31 2.572.931 3.46a6.897 6.897 0 002.262 2.084 8.868 8.868 0 002.75 1.02c.946.177 1.745.266 2.395.266v7.806z\\\"/>\u003C/svg>\"},\"$:/core/images/twitter\":{\"title\":\"$:/core/images/twitter\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-twitter tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M41.626 115.803A73.376 73.376 0 012 104.235c2.022.238 4.08.36 6.166.36 12.111 0 23.258-4.117 32.105-11.023-11.312-.208-20.859-7.653-24.148-17.883a25.98 25.98 0 0011.674-.441C15.971 72.881 7.061 62.474 7.061 49.997c0-.108 0-.216.002-.323a25.824 25.824 0 0011.709 3.22c-6.936-4.617-11.5-12.5-11.5-21.433 0-4.719 1.274-9.142 3.5-12.945 12.75 15.579 31.797 25.83 53.281 26.904-.44-1.884-.67-3.85-.67-5.868 0-14.22 11.575-25.75 25.852-25.75a25.865 25.865 0 0118.869 8.132 51.892 51.892 0 0016.415-6.248c-1.93 6.012-6.029 11.
2731059-11.366 14.246A51.844 51.844 0 00128 25.878a52.428 52.428 0 01-12.9 13.33c.05 1.104.075 2.214.075 3.33 0 34.028-26 73.265-73.549 73.265\\\"/>\u003C/svg>\"},\"$:/core/images/underline\":{\"title\":\"$:/core/images/underline\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-underline tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M7 117.421h114.248V128H7v-10.579zm97.871-18.525V0h-16.26v55.856c0 4.463-.605 8.576-1.816 12.338-1.212 3.762-3.03 7.046-5.452 9.851-2.423 2.806-5.452 4.974-9.086 6.504-3.635 1.53-7.939 2.296-12.912 2.296-6.25 0-11.159-1.786-14.73-5.356-3.57-3.571-5.356-8.417-5.356-14.538V0H23v65.038c0 5.356.542 10.234 1.626 14.633 1.084 4.4 2.965 8.194 5.643 11.382 2.678 3.188 6.185 5.643 10.52 7.365 4.337 1.721 9.756 2.582 16.26 2.582 7.27 0 13.582-1.435 18.938-4.304 5.356-2.87 9.755-7.365 13.199-13.486h.382v15.686h15.303z\\\"/>\u003C/svg>\"},\"$:/core/images/unfold-all-button\":{\"title\":\"$:/core/images/unfold-all-button\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-unfold-all tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cg fill-rule=\\\"evenodd\\\">\u003Crect width=\\\"128\\\" height=\\\"16\\\" rx=\\\"8\\\"/>\u003Crect width=\\\"128\\\" height=\\\"16\\\" y=\\\"64\\\" rx=\\\"8\\\"/>\u003Cpath d=\\\"M63.945 60.624c-2.05 0-4.101-.78-5.666-2.345L35.662 35.662c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.192-3.122 11.319.005L63.94 41.314l16.966-16.966c3.124-3.124 8.194-3.129 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319L69.603 58.279a7.986 7.986 0 01-5.663 2.346zM64.004 124.565c-2.05 0-4.102-.78-5.666-2.345L35.721 99.603c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.191-3.122 11.318.005L64 105.255l16.966-16.966c3.124-3.124 8.194-3.129 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319L69.662 122.22a7.986 7.986 0 01-5.663 2.346z\\\"/>\u003C/g>\u003C/svg>\"},\"$:/core/images/unfold-button\":{\"title\":\"$:/core/images/unfold-button\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-unfold tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cg fill-rule=\\\"evenodd\\\">\u003Crect width=\\\"128\\\" height=\\\"16\\\" rx=\\\"8\\\"/>\u003Cpath d=\\\"M63.945 63.624c-2.05 0-4.101-.78-5.666-2.345L35.662 38.662c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.192-3.122 11.319.005L63.94 44.314l16.966-16.966c3.124-3.124 8.194-3.129 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319L69.603 61.279a7.986 7.986 0 01-5.663 2.346zM64.004 105.682c-2.05.001-4.102-.78-5.666-2.344L35.721 80.721c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.191-3.122 11.318.005L64 86.373l16.966-16.966c3.124-3.125 8.194-3.13 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319l-22.617 22.617a7.986 7.986 0 01-5.663 2.346z\\\"/>\u003C/g>\u003C/svg>\"},\"$:/core/images/unlocked-padlock\":{\"title\":\"$:/core/images/unlocked-padlock\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-unlocked-padlock tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M48.627 64H105v32.01C105 113.674 90.674 128 73.001 128H56C38.318 128 24 113.677 24 96.01V64h6.136c-10.455-12.651-27.364-35.788-4.3-55.142 24.636-20.672 45.835 4.353 55.777 16.201 9.943 11.85-2.676 22.437-12.457 9.892-9.78-12.545-21.167-24.146-33.207-14.043-12.041 10.104-1.757 22.36 8.813 34.958 2.467 2.94 3.641 5.732 3.865 8.134zm19.105 28.364A8.503 8.503 0 0064.5 76a8.5 8.5 0 00-3.498 16.25l-5.095 22.77H72.8l-5.07-22.656z\\\"/>\u003C/svg>\"},\"$:/core/images/up-arrow\":{\"title\":\"$:/core/images/up-arrow\",\"created\":\"20150316000544368\",\"modified\":\"20150316000831867\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-up-arrow tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath d=\\\"M63.892.281c2.027 0 4.054.77 5.6 2.316l55.98 55.98a7.92 7.92 0 010 11.196c-3.086 3.085-8.104 3.092-11.196 0L63.894 19.393 13.513 69.774a7.92 7.92 0 01-11.196 0c-3.085-3.086-3.092-8.105 0-11.196l55.98-55.98A7.892 7.892 0 0163.893.28z\\\"/>\u003C/svg>\"},\"$:/core/images/video\":{\"title\":\"$:/core/images/video\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-video tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M64 12c-34.91 0-55.273 2.917-58.182 5.833C2.91 20.75 0 41.167 0 64.5c0 23.333 2.91 43.75 5.818 46.667C8.728 114.083 29.091 117 64 117c34.91 0 55.273-2.917 58.182-5.833C125.09 108.25 128 87.833 128 64.5c0-23.333-2.91-43.75-5.818-46.667C119.272 14.917 98.909 12 64 12zm-9.084 32.618c-3.813-2.542-6.905-.879-6.905 3.698v31.368c0 4.585 3.099 6.235 6.905 3.698l22.168-14.779c3.813-2.542 3.806-6.669 0-9.206L54.916 44.618z\\\"/>\u003C/svg>\"},\"$:/core/images/warning\":{\"title\":\"$:/core/images/warning\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\\\"tc-image-warning tc-image-button\\\" viewBox=\\\"0 0 128 128\\\">\u003Cpath fill-rule=\\\"evenodd\\\" d=\\\"M57.072 11c3.079-5.333 10.777-5.333 13.856 0l55.426 96c3.079 5.333-.77 12-6.928 12H8.574c-6.158 0-10.007-6.667-6.928-12l55.426-96zM64 37c-4.418 0-8 3.582-8 7.994v28.012C56 77.421 59.59 81 64 81c4.418 0 8-3.582 8-7.994V44.994C72 40.579 68.41 37 64 37zm0 67a8 8 0 100-16 8 8 0 000 16z\\\"/>\u003C/svg>\"},\"$:/language/Buttons/AdvancedSearch/Caption\":{\"title\":\"$:/language/Buttons/AdvancedSearch/Caption\",\"text\":\"advanced search\"},\"$:/language/Buttons/AdvancedSearch/Hint\":{\"title\":\"$:/language/Buttons/AdvancedSearch/Hint\",\"text\":\"Advanced search\"},\"$:/language/Buttons/Cancel/Caption\":{\"title\":\"$:/language/Buttons/Cancel/Caption\",\"text\":\"cancel\"}
2731,\"$:/language/Buttons/Cancel/Hint\":{\"title\":\"$:/language/Buttons/Cancel/Hint\",\"text\":\"Discard changes to this tiddler\"},\"$:/language/Buttons/Clone/Caption\":{\"title\":\"$:/language/Buttons/Clone/Caption\",\"text\":\"clone\"},\"$:/language/Buttons/Clone/Hint\":{\"title\":\"$:/language/Buttons/Clone/Hint\",\"text\":\"Clone this tiddler\"},\"$:/language/Buttons/Close/Caption\":{\"title\":\"$:/language/Buttons/Close/Caption\",\"text\":\"close\"},\"$:/language/Buttons/Close/Hint\":{\"title\":\"$:/language/Buttons/Close/Hint\",\"text\":\"Close this tiddler\"},\"$:/language/Buttons/CloseAll/Caption\":{\"title\":\"$:/language/Buttons/CloseAll/Caption\",\"text\":\"close all\"},\"$:/language/Buttons/CloseAll/Hint\":{\"title\":\"$:/language/Buttons/CloseAll/Hint\",\"text\":\"Close all tiddlers\"},\"$:/language/Buttons/CloseOthers/Caption\":{\"title\":\"$:/language/Buttons/CloseOthers/Caption\",\"text\":\"close others\"},\"$:/language/Buttons/CloseOthers/Hint\":{\"title\":\"$:/language/Buttons/CloseOthers/Hint\",\"text\":\"Close other tiddlers\"},\"$:/language/Buttons/ControlPanel/Caption\":{\"title\":\"$:/language/Buttons/ControlPanel/Caption\",\"text\":\"control panel\"},\"$:/language/Buttons/ControlPanel/Hint\":{\"title\":\"$:/language/Buttons/ControlPanel/Hint\",\"text\":\"Open control panel\"},\"$:/language/Buttons/CopyToClipboard/Caption\":{\"title\":\"$:/language/Buttons/CopyToClipboard/Caption\",\"text\":\"copy to clipboard\"},\"$:/language/Buttons/CopyToClipboard/Hint\":{\"title\":\"$:/language/Buttons/CopyToClipboard/Hint\",\"text\":\"Copy this text to the clipboard\"},\"$:/language/Buttons/Delete/Caption\":{\"title\":\"$:/language/Buttons/Delete/Caption\",\"text\":\"delete\"},\"$:/language/Buttons/Delete/Hint\":{\"title\":\"$:/language/Buttons/Delete/Hint\",\"text\":\"Delete this tiddler\"},\"$:/language/Buttons/DeleteTiddlers/Caption\":{\"title\":\"$:/language/Buttons/DeleteTiddlers/Caption\",\"text\":\"delete tiddlers\"},\"$:/language/Buttons/DeleteTiddlers/Hint\":{\"title\":\"$:/language/Buttons/DeleteTiddlers/Hint\",\"text\":\"Delete tiddlers\"},\"$:/language/Buttons/Edit/Caption\":{\"title\":\"$:/language/Buttons/Edit/Caption\",\"text\":\"edit\"},\"$:/language/Buttons/Edit/Hint\":{\"title\":\"$:/language/Buttons/Edit/Hint\",\"text\":\"Edit this tiddler\"},\"$:/language/Buttons/Encryption/Caption\":{\"title\":\"$:/language/Buttons/Encryption/Caption\",\"text\":\"encryption\"},\"$:/language/Buttons/Encryption/Hint\":{\"title\":\"$:/language/Buttons/Encryption/Hint\",\"text\":\"Set or clear a password for saving this wiki\"},\"$:/language/Buttons/Encryption/ClearPassword/Caption\":{\"title\":\"$:/language/Buttons/Encryption/ClearPassword/Caption\",\"text\":\"clear password\"},\"$:/language/Buttons/Encryption/ClearPassword/Hint\":{\"title\":\"$:/language/Buttons/Encryption/ClearPassword/Hint\",\"text\":\"Clear the password and save this wiki without encryption\"},\"$:/language/Buttons/Encryption/SetPassword/Caption\":{\"title\":\"$:/language/Buttons/Encryption/SetPassword/Caption\",\"text\":\"set password\"},\"$:/language/Buttons/Encryption/SetPassword/Hint\":{\"title\":\"$:/language/Buttons/Encryption/SetPassword/Hint\",\"text\":\"Set a password for saving this wiki with encryption\"},\"$:/language/Buttons/ExportPage/Caption\":{\"title\":\"$:/language/Buttons/ExportPage/Caption\",\"text\":\"export all\"},\"$:/language/Buttons/ExportPage/Hint\":{\"title\":\"$:/language/Buttons/ExportPage/Hint\",\"text\":\"Export all tiddlers\"},\"$:/language/Buttons/ExportTiddler/Caption\":{\"title\":\"$:/language/Buttons/ExportTiddler/Caption\",\"text\":\"export tiddler\"},\"$:/language/Buttons/ExportTiddler/Hint\":{\"title\":\"$:/language/Buttons/ExportTiddler/Hint\",\"text\":\"Export tiddler\"},\"$:/language/Buttons/ExportTiddlers/Caption\":{\"title\":\"$:/language/Buttons/ExportTiddlers/Caption\",\"text\":\"export tiddlers\"},\"$:/language/Buttons/ExportTiddlers/Hint\":{\"title\":\"$:/language/Buttons/ExportTiddlers/Hint\",\"text\":\"Export tiddlers\"},\"$:/language/Buttons/SidebarSearch/Hint\":{\"title\":\"$:/language/Buttons/SidebarSearch/Hint\",\"text\":\"Select the sidebar search f
2731ield\"},\"$:/language/Buttons/Fold/Caption\":{\"title\":\"$:/language/Buttons/Fold/Caption\",\"text\":\"fold tiddler\"},\"$:/language/Buttons/Fold/Hint\":{\"title\":\"$:/language/Buttons/Fold/Hint\",\"text\":\"Fold the body of this tiddler\"},\"$:/language/Buttons/Fold/FoldBar/Caption\":{\"title\":\"$:/language/Buttons/Fold/FoldBar/Caption\",\"text\":\"fold-bar\"},\"$:/language/Buttons/Fold/FoldBar/Hint\":{\"title\":\"$:/language/Buttons/Fold/FoldBar/Hint\",\"text\":\"Optional bars to fold and unfold tiddlers\"},\"$:/language/Buttons/Unfold/Caption\":{\"title\":\"$:/language/Buttons/Unfold/Caption\",\"text\":\"unfold tiddler\"},\"$:/language/Buttons/Unfold/Hint\":{\"title\":\"$:/language/Buttons/Unfold/Hint\",\"text\":\"Unfold the body of this tiddler\"},\"$:/language/Buttons/FoldOthers/Caption\":{\"title\":\"$:/language/Buttons/FoldOthers/Caption\",\"text\":\"fold other tiddlers\"},\"$:/language/Buttons/FoldOthers/Hint\":{\"title\":\"$:/language/Buttons/FoldOthers/Hint\",\"text\":\"Fold the bodies of other opened tiddlers\"},\"$:/language/Buttons/FoldAll/Caption\":{\"title\":\"$:/language/Buttons/FoldAll/Caption\",\"text\":\"fold all tiddlers\"},\"$:/language/Buttons/FoldAll/Hint\":{\"title\":\"$:/language/Buttons/FoldAll/Hint\",\"text\":\"Fold the bodies of all opened tiddlers\"},\"$:/language/Buttons/UnfoldAll/Caption\":{\"title\":\"$:/language/Buttons/UnfoldAll/Caption\",\"text\":\"unfold all tiddlers\"},\"$:/language/Buttons/UnfoldAll/Hint\":{\"title\":\"$:/language/Buttons/UnfoldAll/Hint\",\"text\":\"Unfold the bodies of all opened tiddlers\"},\"$:/language/Buttons/FullScreen/Caption\":{\"title\":\"$:/language/Buttons/FullScreen/Caption\",\"text\":\"full-screen\"},\"$:/language/Buttons/FullScreen/Hint\":{\"title\":\"$:/language/Buttons/FullScreen/Hint\",\"text\":\"Enter or leave full-screen mode\"},\"$:/language/Buttons/Help/Caption\":{\"title\":\"$:/language/Buttons/Help/Caption\",\"text\":\"help\"},\"$:/language/Buttons/Help/Hint\":{\"title\":\"$:/language/Buttons/Help/Hint\",\"text\":\"Show help panel\"},\"$:/language/Buttons/Import/Caption\":{\"title\":\"$:/language/Buttons/Import/Caption\",\"text\":\"import\"},\"$:/language/Buttons/Import/Hint\":{\"title\":\"$:/language/Buttons/Import/Hint\",\"text\":\"Import many types of file including text, image, TiddlyWiki or JSON\"},\"$:/language/Buttons/Info/Caption\":{\"title\":\"$:/language/Buttons/Info/Caption\",\"text\":\"info\"},\"$:/language/Buttons/Info/Hint\":{\"title\":\"$:/language/Buttons/Info/Hint\",\"text\":\"Show information for this tiddler\"},\"$:/language/Buttons/Home/Caption\":{\"title\":\"$:/language/Buttons/Home/Caption\",\"text\":\"home\"}
2731,\"$:/language/Buttons/Home/Hint\":{\"title\":\"$:/language/Buttons/Home/Hint\",\"text\":\"Open the default tiddlers\"},\"$:/language/Buttons/Language/Caption\":{\"title\":\"$:/language/Buttons/Language/Caption\",\"text\":\"language\"},\"$:/language/Buttons/Language/Hint\":{\"title\":\"$:/language/Buttons/Language/Hint\",\"text\":\"Choose the user interface language\"},\"$:/language/Buttons/LayoutSwitcher/Hint\":{\"title\":\"$:/language/Buttons/LayoutSwitcher/Hint\",\"text\":\"Open layout switcher\"},\"$:/language/Buttons/LayoutSwitcher/Caption\":{\"title\":\"$:/language/Buttons/LayoutSwitcher/Caption\",\"text\":\"layout\"},\"$:/language/Buttons/Manager/Caption\":{\"title\":\"$:/language/Buttons/Manager/Caption\",\"text\":\"tiddler manager\"},\"$:/language/Buttons/Manager/Hint\":{\"title\":\"$:/language/Buttons/Manager/Hint\",\"text\":\"Open tiddler manager\"},\"$:/language/Buttons/More/Caption\":{\"title\":\"$:/language/Buttons/More/Caption\",\"text\":\"more\"},\"$:/language/Buttons/More/Hint\":{\"title\":\"$:/language/Buttons/More/Hint\",\"text\":\"More actions\"},\"$:/language/Buttons/NewHere/Caption\":{\"title\":\"$:/language/Buttons/NewHere/Caption\",\"text\":\"new here\"}
2731,\"$:/language/Buttons/NewHere/Hint\":{\"title\":\"$:/language/Buttons/NewHere/Hint\",\"text\":\"Create a new tiddler tagged with this one\"},\"$:/language/Buttons/NetworkActivity/Caption\":{\"title\":\"$:/language/Buttons/NetworkActivity/Caption\",\"text\":\"network activity\"},\"$:/language/Buttons/NetworkActivity/Hint\":{\"title\":\"$:/language/Buttons/NetworkActivity/Hint\",\"text\":\"Cancel all network activity\"},\"$:/language/Buttons/NewJournal/Caption\":{\"title\":\"$:/language/Buttons/NewJournal/Caption\",\"text\":\"new journal\"},\"$:/language/Buttons/NewJournal/Hint\":{\"title\":\"$:/language/Buttons/NewJournal/Hint\",\"text\":\"Create a new journal tiddler\"},\"$:/language/Buttons/NewJournalHere/Caption\":{\"title\":\"$:/language/Buttons/NewJournalHere/Caption\",\"text\":\"new journal here\"},\"$:/language/Buttons/NewJournalHere/Hint\":{\"title\":\"$:/language/Buttons/NewJournalHere/Hint\",\"text\":\"Create a new journal tiddler tagged with this one\"},\"$:/language/Buttons/NewImage/Caption\":{\"title\":\"$:/language/Buttons/NewImage/Caption\",\"text\":\"new image\"},\"$:/language/Buttons/NewImage/Hint\":{\"title\":\"$:/language/Buttons/NewImage/Hint\",\"text\":\"Create a new image tiddler\"},\"$:/language/Buttons/NewMarkdown/Caption\":{\"title\":\"$:/language/Buttons/NewMarkdown/Caption\",\"text\":\"new Markdown tiddler\"},\"$:/language/Buttons/NewMarkdown/Hint\":{\"title\":\"$:/language/Buttons/NewMarkdown/Hint\",\"text\":\"Create a new Markdown tiddler\"},\"$:/language/Buttons/NewTiddler/Caption\":{\"title\":\"$:/language/Buttons/NewTiddler/Caption\",\"text\":\"new tiddler\"},\"$:/language/Buttons/NewTiddler/Hint\":{\"title\":\"$:/language/Buttons/NewTiddler/Hint\",\"text\":\"Create a new tiddler\"},\"$:/language/Buttons/OpenWindow/Caption\":{\"title\":\"$:/language/Buttons/OpenWindow/Caption\",\"text\":\"open in new window\"},\"$:/language/Buttons/OpenWindow/Hint\":{\"title\":\"$:/language/Buttons/OpenWindow/Hint\",\"text\":\"Open tiddler in new window\"},\"$:/language/Buttons/Palette/Caption\":{\"title\":\"$:/language/Buttons/Palette/Caption\",\"text\":\"palette\"},\"$:/language/Buttons/Palette/Hint\":{\"title\":\"$:/language/Buttons/Palette/Hint\",\"text\":\"Choose the colour palette\"},\"$:/language/Buttons/Permalink/Caption\":{\"title\":\"$:/language/Buttons/Permalink/Caption\",\"text\":\"permalink\"},\"$:/language/Buttons/Permalink/Hint\":{\"title\":\"$:/language/Buttons/Permalink/Hint\",\"text\":\"Set browser address bar to a direct link to this tiddler\"},\"$:/language/Buttons/Permaview/Caption\":{\"title\":\"$:/language/Buttons/Permaview/Caption\",\"text\":\"permaview\"},\"$:/language/Buttons/Permaview/Hint\":{\"title\":\"$:/language/Buttons/Permaview/Hint\",\"text\":\"Set browser address bar to a direct link to all the tiddlers in this story\"},\"$:/language/Buttons/Print/Caption\":{\"title\":\"$:/language/Buttons/Print/Caption\",\"text\":\"print page\"},\"$:/language/Buttons/Print/Hint\":{\"title\":\"$:/language/Buttons/Print/Hint\",\"text\":\"Print the current page\"},\"$:/language/Buttons/Refresh/Caption\":{\"title\":\"$:/language/Buttons/Refresh/Caption\",\"text\":\"refresh\"},\"$:/language/Buttons/Refresh/Hint\":{\"title\":\"$:/language/Buttons/Refresh/Hint\",\"text\":\"Perform a full refresh of the wiki\"},\"$:/language/Buttons/Save/Caption\":{\"title\":\"$:/language/Buttons/Save/Caption\",\"text\":\"ok\"}
2731,\"$:/language/Buttons/Save/Hint\":{\"title\":\"$:/language/Buttons/Save/Hint\",\"text\":\"Confirm changes to this tiddler\"},\"$:/language/Buttons/SaveWiki/Caption\":{\"title\":\"$:/language/Buttons/SaveWiki/Caption\",\"text\":\"save changes\"},\"$:/language/Buttons/SaveWiki/Hint\":{\"title\":\"$:/language/Buttons/SaveWiki/Hint\",\"text\":\"Save changes\"},\"$:/language/Buttons/StoryView/Caption\":{\"title\":\"$:/language/Buttons/StoryView/Caption\",\"text\":\"storyview\"},\"$:/language/Buttons/StoryView/Hint\":{\"title\":\"$:/language/Buttons/StoryView/Hint\",\"text\":\"Choose the story visualisation\"},\"$:/language/Buttons/HideSideBar/Caption\":{\"title\":\"$:/language/Buttons/HideSideBar/Caption\",\"text\":\"hide sidebar\"},\"$:/language/Buttons/HideSideBar/Hint\":{\"title\":\"$:/language/Buttons/HideSideBar/Hint\",\"text\":\"Hide sidebar\"},\"$:/language/Buttons/ShowSideBar/Caption\":{\"title\":\"$:/language/Buttons/ShowSideBar/Caption\",\"text\":\"show sidebar\"},\"$:/language/Buttons/ShowSideBar/Hint\":{\"title\":\"$:/language/Buttons/ShowSideBar/Hint\",\"text\":\"Show sidebar\"},\"$:/language/Buttons/TagManager/Caption\":{\"title\":\"$:/language/Buttons/TagManager/Caption\",\"text\":\"tag manager\"},\"$:/language/Buttons/TagManager/Hint\":{\"title\":\"$:/language/Buttons/TagManager/Hint\",\"text\":\"Open tag manager\"},\"$:/language/Buttons/Timestamp/Caption\":{\"title\":\"$:/language/Buttons/Timestamp/Caption\",\"text\":\"timestamps\"},\"$:/language/Buttons/Timestamp/Hint\":{\"title\":\"$:/language/Buttons/Timestamp/Hint\",\"text\":\"Choose whether modifications update timestamps\"},\"$:/language/Buttons/Timestamp/On/Caption\":{\"title\":\"$:/language/Buttons/Timestamp/On/Caption\",\"text\":\"timestamps are on\"},\"$:/language/Buttons/Timestamp/On/Hint\":{\"title\":\"$:/language/Buttons/Timestamp/On/Hint\",\"text\":\"Update timestamps when tiddlers are modified\"},\"$:/language/Buttons/Timestamp/Off/Caption\":{\"title\":\"$:/language/Buttons/Timestamp/Off/Caption\",\"text\":\"timestamps are off\"},\"$:/language/Buttons/Timestamp/Off/Hint\":{\"title\":\"$:/language/Buttons/Timestamp/Off/Hint\",\"text\":\"Don't update timestamps when tiddlers are modified\"},\"$:/language/Buttons/Theme/Caption\":{\"title\":\"$:/language/Buttons/Theme/Caption\",\"text\":\"theme\"},\"$:/language/Buttons/Theme/Hint\":{\"title\":\"$:/language/Buttons/Theme/Hint\",\"text\":\"Choose the display theme\"},\"$:/language/Buttons/Bold/Caption\":{\"title\":\"$:/language/Buttons/Bold/Caption\",\"text\":\"bold\"},\"$:/language/Buttons/Bold/Hint\":{\"title\":\"$:/language/Buttons/Bold/Hint\",\"text\":\"Apply bold formatting to selection\"},\"$:/language/Buttons/Clear/Caption\":{\"title\":\"$:/language/Buttons/Clear/Caption\",\"text\":\"clear\"}
2731,\"$:/language/Buttons/Clear/Hint\":{\"title\":\"$:/language/Buttons/Clear/Hint\",\"text\":\"Clear image to solid colour\"},\"$:/language/Buttons/EditorHeight/Caption\":{\"title\":\"$:/language/Buttons/EditorHeight/Caption\",\"text\":\"editor height\"},\"$:/language/Buttons/EditorHeight/Caption/Auto\":{\"title\":\"$:/language/Buttons/EditorHeight/Caption/Auto\",\"text\":\"Automatically adjust height to fit content\"},\"$:/language/Buttons/EditorHeight/Caption/Fixed\":{\"title\":\"$:/language/Buttons/EditorHeight/Caption/Fixed\",\"text\":\"Fixed height:\"},\"$:/language/Buttons/EditorHeight/Hint\":{\"title\":\"$:/language/Buttons/EditorHeight/Hint\",\"text\":\"Choose the height of the text editor\"},\"$:/language/Buttons/Excise/Caption\":{\"title\":\"$:/language/Buttons/Excise/Caption\",\"text\":\"excise\"},\"$:/language/Buttons/Excise/Caption/Excise\":{\"title\":\"$:/language/Buttons/Excise/Caption/Excise\",\"text\":\"Perform excision\"},\"$:/language/Buttons/Excise/Caption/MacroName\":{\"title\":\"$:/language/Buttons/Excise/Caption/MacroName\",\"text\":\"Macro name:\"},\"$:/language/Buttons/Excise/Caption/NewTitle\":{\"title\":\"$:/language/Buttons/Excise/Caption/NewTitle\",\"text\":\"Title of new tiddler:\"},\"$:/language/Buttons/Excise/Caption/Replace\":{\"title\":\"$:/language/Buttons/Excise/Caption/Replace\",\"text\":\"Replace excised text with:\"},\"$:/language/Buttons/Excise/Caption/Replace/Macro\":{\"title\":\"$:/language/Buttons/Excise/Caption/Replace/Macro\",\"text\":\"macro\"},\"$:/language/Buttons/Excise/Caption/Replace/Link\":{\"title\":\"$:/language/Buttons/Excise/Caption/Replace/Link\",\"text\":\"link\"},\"$:/language/Buttons/Excise/Caption/Replace/Transclusion\":{\"title\":\"$:/language/Buttons/Excise/Caption/Replace/Transclusion\",\"text\":\"transclusion\"},\"$:/language/Buttons/Excise/Caption/Tag\":{\"title\":\"$:/language/Buttons/Excise/Caption/Tag\",\"text\":\"Tag new tiddler with the title of this tiddler\"},\"$:/language/Buttons/Excise/Caption/TiddlerExists\":{\"title\":\"$:/language/Buttons/Excise/Caption/TiddlerExists\",\"text\":\"Warning: tiddler already exists\"},\"$:/language/Buttons/Excise/Hint\":{\"title\":\"$:/language/Buttons/Excise/Hint\",\"text\":\"Excise the selected text into a 
2731new tiddler\"},\"$:/language/Buttons/Heading1/Caption\":{\"title\":\"$:/language/Buttons/Heading1/Caption\",\"text\":\"heading 1\"},\"$:/language/Buttons/Heading1/Hint\":{\"title\":\"$:/language/Buttons/Heading1/Hint\",\"text\":\"Apply heading level 1 formatting to lines containing selection\"},\"$:/language/Buttons/Heading2/Caption\":{\"title\":\"$:/language/Buttons/Heading2/Caption\",\"text\":\"heading 2\"},\"$:/language/Buttons/Heading2/Hint\":{\"title\":\"$:/language/Buttons/Heading2/Hint\",\"text\":\"Apply heading level 2 formatting to lines containing selection\"},\"$:/language/Buttons/Heading3/Caption\":{\"title\":\"$:/language/Buttons/Heading3/Caption\",\"text\":\"heading 3\"},\"$:/language/Buttons/Heading3/Hint\":{\"title\":\"$:/language/Buttons/Heading3/Hint\",\"text\":\"Apply heading level 3 formatting to lines containing selection\"},\"$:/language/Buttons/Heading4/Caption\":{\"title\":\"$:/language/Buttons/Heading4/Caption\",\"text\":\"heading 4\"},\"$:/language/Buttons/Heading4/Hint\":{\"title\":\"$:/language/Buttons/Heading4/Hint\",\"text\":\"Apply heading level 4 formatting to lines containing selection\"},\"$:/language/Buttons/Heading5/Caption\":{\"title\":\"$:/language/Buttons/Heading5/Caption\",\"text\":\"heading 5\"},\"$:/language/Buttons/Heading5/Hint\":{\"title\":\"$:/language/Buttons/Heading5/Hint\",\"text\":\"Apply heading level 5 formatting to lines containing selection\"},\"$:/language/Buttons/Heading6/Caption\":{\"title\":\"$:/language/Buttons/Heading6/Caption\",\"text\":\"heading 6\"},\"$:/language/Buttons/Heading6/Hint\":{\"title\":\"$:/language/Buttons/Heading6/Hint\",\"text\":\"Apply heading level 6 formatting to lines containing selection\"},\"$:/language/Buttons/Italic/Caption\":{\"title\":\"$:/language/Buttons/Italic/Caption\",\"text\":\"italic\"},\"$:/language/Buttons/Italic/Hint\":{\"title\":\"$:/language/Buttons/Italic/Hint\",\"text\":\"Apply italic formatting to selection\"},\"$:/language/Buttons/LineWidth/Caption\":{\"title\":\"$:/language/Buttons/LineWidth/Caption\",\"text\":\"line width\"},\"$:/language/Buttons/LineWidth/Hint\":{\"title\":\"$:/language/Buttons/LineWidth/Hint\",\"text\":\"Set line width for painting\"},\"$:/language/Buttons/Link/Caption\":{\"title\":\"$:/language/Buttons/Link/Caption\",\"text\":\"link\"},\"$:/language/Buttons/Link/Hint\":{\"title\":\"$:/language/Buttons/Link/Hint\",\"text\":\"Create wikitext link\"},\"$:/language/Buttons/Linkify/Caption\":{\"title\":\"$:/language/Buttons/Linkify/Caption\",\"text\":\"wikilink\"},\"$:/language/Buttons/Linkify/Hint\":{\"title\":\"$:/language/Buttons/Linkify/Hint\",\"text\":\"Wrap selection in square brackets\"},\"$:/language/Buttons/ListBullet/Caption\":{\"title\":\"$:/language/Buttons/ListBullet/Caption\",\"text\":\"bulleted list\"},\"$:/language/Buttons/ListBullet/Hint\":{\"title\":\"$:/language/Buttons/ListBullet/Hint\",\"text\":\"Apply bulleted list formatting to lines containing selection\"},\"$:/language/Buttons/ListNumber/Caption\":{\"title\":\"$:/language/Buttons/ListNumber/Caption\",\"text\":\"numbered list\"},\"$:/language/Buttons/ListNumber/Hint\":{\"title\":\"$:/language/Buttons/ListNumber/Hint\",\"text\":\"Apply numbered list formatting to lines containing selection\"},\"$:/language/Buttons/MonoBlock/Caption\":{\"title\":\"$:/language/Buttons/MonoBlock/Caption\",\"text\":\"monospaced block\"},\"$:/language/Buttons/MonoBlock/Hint\":{\"title\":\"$:/language/Buttons/MonoBlock/Hint\",\"text\":\"Apply monospaced block formatting to lines containing selection\"},\"$:/language/Buttons/MonoLine/Caption\":{\"title\":\"$:/language/Buttons/MonoLine/Caption\",\"text\":\"monospaced\"},\"$:/language/Buttons/MonoLine/Hint\":{\"title\":\"$:/language/Buttons/MonoLine/Hint\",\"text\":\"Apply monospaced character formatting to selection\"},\"$:/language/Buttons/Opacity/Caption\":{\"title\":\"$:/language/Buttons/Opacity/Caption\",\"text\":\"opacity\"},\"$:/language/Buttons/Opacity/Hint\":{\"title\":\"$:/language/Buttons/Opacity/Hint\",\"text\":\"Set painting opacity\"},\"$:/language/Buttons/Paint/Caption\":{\"title\":\"$:/language/Buttons/Paint/Caption\",\"text\":\"paint colour\"}
2731,\"$:/language/Buttons/Paint/Hint\":{\"title\":\"$:/language/Buttons/Paint/Hint\",\"text\":\"Set painting colour\"},\"$:/language/Buttons/Picture/Caption\":{\"title\":\"$:/language/Buttons/Picture/Caption\",\"text\":\"picture\"},\"$:/language/Buttons/Picture/Hint\":{\"title\":\"$:/language/Buttons/Picture/Hint\",\"text\":\"Insert picture\"},\"$:/language/Buttons/Preview/Caption\":{\"title\":\"$:/language/Buttons/Preview/Caption\",\"text\":\"preview\"},\"$:/language/Buttons/Preview/Hint\":{\"title\":\"$:/language/Buttons/Preview/Hint\",\"text\":\"Show preview pane\"},\"$:/language/Buttons/PreviewType/Caption\":{\"title\":\"$:/language/Buttons/PreviewType/Caption\",\"text\":\"preview type\"},\"$:/language/Buttons/PreviewType/Hint\":{\"title\":\"$:/language/Buttons/PreviewType/Hint\",\"text\":\"Choose preview type\"},\"$:/language/Buttons/Quote/Caption\":{\"title\":\"$:/language/Buttons/Quote/Caption\",\"text\":\"quote\"},\"$:/language/Buttons/Quote/Hint\":{\"title\":\"$:/language/Buttons/Quote/Hint\",\"text\":\"Apply quoted text formatting to lines containing selection\"},\"$:/language/Buttons/RotateLeft/Caption\":{\"title\":\"$:/language/Buttons/RotateLeft/Caption\",\"text\":\"rotate left\"},\"$:/language/Buttons/RotateLeft/Hint\":{\"title\":\"$:/language/Buttons/RotateLeft/Hint\",\"text\":\"Rotate image left by 90 degrees\"},\"$:/language/Buttons/Size/Caption\":{\"title\":\"$:/language/Buttons/Size/Caption\",\"text\":\"image size\"},\"$:/language/Buttons/Size/Caption/Height\":{\"title\":\"$:/language/Buttons/Size/Caption/Height\",\"text\":\"Height:\"},\"$:/language/Buttons/Size/Caption/Resize\":{\"title\":\"$:/language/Buttons/Size/Caption/Resize\",\"text\":\"Resize image\"},\"$:/language/Buttons/Size/Caption/Width\":{\"title\":\"$:/language/Buttons/Size/Caption/Width\",\"text\":\"Width:\"},\"$:/language/Buttons/Size/Hint\":{\"title\":\"$:/language/Buttons/Size/Hint\",\"text\":\"Set image size\"},\"$:/language/Buttons/Stamp/Caption\":{\"title\":\"$:/language/Buttons/Stamp/Caption\",\"text\":\"stamp\"},\"$:/language/Buttons/Stamp/Caption/New\":{\"title\":\"$:/language/Buttons/Stamp/Caption/New\",\"text\":\"Add your own\"},\"$:/language/Buttons/Stamp/Hint\":{\"title\":\"$:/language/Buttons/Stamp/Hint\",\"text\":\"Insert a preconfigured snippet of text\"},\"$:/language/Buttons/Stamp/New/Title\":{\"title\":\"$:/language/Buttons/Stamp/New/Title\",\"text\":\"Name as shown in menu\"},\"$:/language/Buttons/Stamp/New/Text\":{\"title\":\"$:/language/Buttons/Stamp/New/Text\",\"text\":\"Text of snippet. (Remember to add a descriptive title in the caption field).\"},\"$:/language/Buttons/Strikethrough/Caption\":{\"title\":\"$:/language/Buttons/Strikethrough/Caption\",\"text\":\"strikethrough\"},\"$:/language/Buttons/Strikethrough/Hint\":{\"title\":\"$:/language/Buttons/Strikethrough/Hint\",\"text\":\"Apply strikethrough formatting to selection\"},\"$:/language/Buttons/Subscript/Caption\":{\"title\":\"$:/language/Buttons/Subscript/Caption\",\"text\":\"subscript\"},\"$:/language/Buttons/Subscript/Hint\":{\"title\":\"$:/language/Buttons/Subscript/Hint\",\"text\":\"Apply subscript formatting to selection\"},\"$:/language/Buttons/Superscript/Caption\":{\"title\":\"$:/language/Buttons/Superscript/Caption\",\"text\":\"superscript\"},\"$:/language/Buttons/Superscript/Hint\":{\"title\":\"$:/language/Buttons/Superscript/Hint\",\"text\":\"Apply superscript formatting to selection\"},\"$:/language/Buttons/ToggleSidebar/Hint\":{\"title\":\"$:/language/Buttons/ToggleSidebar/Hint\",\"text\":\"Toggle the sidebar visibility\"},\"$:/language/Buttons/Transcludify/Caption\":{\"title\":\"$:/language/Buttons/Transcludify/Caption\",\"text\":\"transclusion\"},\"$:/language/Buttons/Transcludify/Hint\":{\"title\":\"$:/language/Buttons/Transcludify/Hint\",\"text\":\"Wrap selection in curly brackets\"},\"$:/language/Buttons/Underline/Caption\":{\"title\":\"$:/language/Buttons/Underline/Caption\",\"text\":\"underline\"},\"$:/language/Buttons/Underline/Hint\":{\"title\":\"$:/language/Buttons/Underline/Hint\",\"text\":\"Apply underline formatting to selection\"},\"$:/language/ControlPanel/Advanced/Caption\":{\"title\":\"$:/language/ControlPanel/Advanced/Caption\",\"text\":\"Advanced\"},\"$:/language/ControlPanel/Advanced/Hint\":{\"title\":\"$:/language/ControlPanel/Advanced/Hint\",\"text\":\"Internal information about this TiddlyWiki\"},\"$:/language/ControlPanel/Appearance/Caption\":{\"title\":\"$:/language/ControlPanel/Appearance/Caption\",\"text\":\"Appearance\"},\"$:/language/ControlPanel/Appearance/Hint\":{\"title\":\"$:/language/ControlPanel/Appearance/Hint\",\"text\":\"Ways to customise the appearance of your TiddlyWiki.\"},\"$:/language/ControlPanel/Basics/AnimDuration/Prompt\":{\"title\":\"$:/language/ControlPanel/Basics/AnimDuration/Prompt\",\"text\":\"Animation duration\"},\"$:/language/ControlPanel/Basics/AutoFocus/Prompt\":{\"title\":\"$:/language/ControlPanel/Basics/AutoFocus/Prompt\",\"text\":\"Default focus field for new tiddlers\"},\"$:/language/ControlPanel/Basics/Caption\":{\"title\":\"$:/language/ControlPanel/Basics/Caption\",\"text\":\"Basics\"},\"$:/language/ControlPanel/Basics/DefaultTiddlers/BottomHint\":{\"title\":\"$:/language/ControlPanel/Basics/DefaultTiddlers/BottomHint\",\"text\":\"Use &#91;&#91;double square brackets&#93;&#93; for titles with spaces. Or you can choose to {{retain story ordering||$:/snippets/retain-story-ordering-button}}\"},\"$:/language/ControlPanel/Basics/DefaultTiddlers/Prompt\":{\"title\":\"$:/language/ControlPanel/Basics/DefaultTiddlers/Prompt\",\"text\":\"Default tiddlers\"},\"$:/language/ControlPanel/Basics/DefaultTiddlers/TopHint\":{\"title\":\"$:/language/ControlPanel/Basics/DefaultTiddlers/TopHint\",\"text\":\"Choose which tiddlers are displayed at startup\"},\"$:/language/ControlPanel/Basics/Language/Prompt\":{\"title\":\"$:/language/ControlPanel/Basics/Language/Prompt\",\"text\":\"Hello! Current language:\"},\"$:/language/ControlPanel/Basics/NewJournal/Title/Prompt\":{\"title\":\"$:/language/ControlPanel/Basics/NewJournal/Title/Prompt\",\"text\":\"Title of new journal tiddlers\"},\"$:/language/ControlPanel/Basics/NewJournal/Text/Prompt\":{\"title\":\"$:/language/ControlPanel/Basics/NewJournal/Text/Prompt\",\"text\":\"Text for new journal tiddlers\"},\"$:/language/ControlPanel/Basics/NewJournal/Tags/Prompt\":{\"title\":\"$:/language/ControlPanel/Basics/NewJournal/Tags/Prompt\",\"text\":\"Tags for new journal tiddlers\"},\"$:/language/ControlPanel/Basics/NewTiddler/Title/Prompt\":{\"title\":\"$:/language/ControlPanel/Basics/NewTiddler/Title/Prompt\",\"text\":\"Title of new tiddlers\"},\"$:/language/ControlPanel/Basics/NewTiddler/Tags/Prompt\":{\"title\":\"$:/language/ControlPanel/Basics/NewTiddler/Tags/Prompt\",\"text\":\"Tags for new tiddlers\"},\"$:/language/ControlPanel/Basics/OverriddenShadowTiddlers/Prompt\":{\"title\":\"$:/language/ControlPanel/Basics/OverriddenShadowTiddlers/Prompt\",\"text\":\"Number of overridden shadow tiddlers\"},\"$:/language/ControlPanel/Basics/RemoveTags\":{\"title\":\"$:/language/ControlPanel/Basics/RemoveTags\",\"text\":\"Update to current format\"},\"$:/language/ControlPanel/Basics/RemoveTags/Hint\":{\"title\":\"$:/language/ControlPanel/Basics/RemoveTags/Hint\",\"text\":\"Update the tags configuration to the latest format\"},\"$:/language/ControlPanel/Basics/ShadowTiddlers/Prompt\":{\"title\":\"$:/language/ControlPanel/Basics/ShadowTiddlers/Prompt\",\"text\":\"Number of shadow tiddlers\"},\"$:/language/ControlPanel/Basics/Subtitle/Prompt\":{\"title\":\"$:/language/ControlPanel/Basics/Subtitle/Prompt\",\"text\":\"Subtitle\"},\"$:/language/ControlPanel/Basics/SystemTiddlers/Prompt\":{\"title\":\"$:/language/ControlPanel/Basics/SystemTiddlers/Prompt\",\"text\":\"Number of system tiddlers\"},\"$:/language/ControlPanel/Basics/Tags/Prompt\":{\"title\":\"$:/language/ControlPanel/Basics/Tags/Prompt\",\"text\":\"Number of tags\"},\"$:/language/ControlPanel/Basics/Tiddlers/Prompt\":{\"title\":\"$:/language/ControlPanel/Basics/Tiddlers/Prompt\",\"text\":\"Number of tiddlers\"},\"$:/language/ControlPanel/Basics/Title/Prompt\":{\"title\":\"$:/language/ControlPanel/Basics/Title/Prompt\",\"text\":\"Title of this ~TiddlyWiki\"},\"$:/language/ControlPanel/Basics/Username/Prompt\":{\"title\":\"$:/language/ControlPanel/Basics/Username/Prompt\",\"text\":\"Username for signing edits\"},\"$:/language/ControlPanel/Basics/Version/Prompt\":{\"title\":\"$:/language/ControlPanel/Basics/Version/Prompt\",\"text\":\"~TiddlyWiki version\"},\"$:/language/ControlPanel/Cascades/Caption\":{\"title\":\"$:/language/ControlPanel/Cascades/Caption\",\"text\":\"Cascades\"},\"$:/language/ControlPanel/Cascades/Hint\":{\"title\":\"$:/language/ControlPanel/Cascades/Hint\",\"text\":\"These global rules are used to dynamically choose certain templates. The result of the cascade is the result of the first filter in the sequence that returns a result\"},\"$:/language/ControlPanel/Cascades/TagPrompt\":{\"title\":\"$:/language/ControlPanel/Cascades/TagPrompt\",\"text\":\"Filters tagged \u003C$macrocall $name=\\\"tag\\\" tag=\u003C\u003CcurrentTiddler>>/>\"},\"$:/language/ControlPanel/EditorTypes/Caption\":{\"title\":\"$:/language/ControlPanel/EditorTypes/Caption\",\"text\":\"Editor Types\"},\"$:/language/ControlPanel/EditorTypes/Editor/Caption\":{\"title\":\"$:/language/ControlPanel/EditorTypes/Editor/Caption\",\"text\":\"Editor\"},\"$:/language/ControlPanel/EditorTypes/Hint\":{\"title\":\"$:/language/ControlPanel/EditorTypes/Hint\",\"text\":\"These tiddlers determine which editor is used to edit specific tiddler types.\"},\"$:/language/ControlPanel/EditorTypes/Type/Caption\":{\"title\":\"$:/language/ControlPanel/EditorTypes/Type/Caption\",\"text\":\"Type\"},\"$:/language/ControlPanel/EditTemplateBody/Caption\":{\"title\":\"$:/language/ControlPanel/EditTemplateBody/Caption\",\"text\":\"Edit Template Body\"},\"$:/language/ControlPanel/EditTemplateBody/Hint\":{\"title\":\"$:/language/ControlPanel/EditTemplateBody/Hint\",\"text\":\"This rule c
2731ascade is used by the default edit template to dynamically choose the template for editing the body of a tiddler.\"},\"$:/language/ControlPanel/FieldEditor/Caption\":{\"title\":\"$:/language/ControlPanel/FieldEditor/Caption\",\"text\":\"Field Editor\"},\"$:/language/ControlPanel/FieldEditor/Hint\":{\"title\":\"$:/language/ControlPanel/FieldEditor/Hint\",\"text\":\"This rules cascade is used to dynamically choose the template for rendering a tiddler field based on its name. It is used within the Edit Template.\"},\"$:/language/ControlPanel/Info/Caption\":{\"title\":\"$:/language/ControlPanel/Info/Caption\",\"text\":\"Info\"},\"$:/language/ControlPanel/Info/Hint\":{\"title\":\"$:/language/ControlPanel/Info/Hint\",\"text\":\"Information about this TiddlyWiki\"},\"$:/language/ControlPanel/KeyboardShortcuts/Add/Prompt\":{\"title\":\"$:/language/ControlPanel/KeyboardShortcuts/Add/Prompt\",\"text\":\"Type shortcut here\"},\"$:/language/ControlPanel/KeyboardShortcuts/Add/Caption\":{\"title\":\"$:/language/ControlPanel/KeyboardShortcuts/Add/Caption\",\"text\":\"add shortcut\"},\"$:/language/ControlPanel/KeyboardShortcuts/Caption\":{\"title\":\"$:/language/ControlPanel/KeyboardShortcuts/Caption\",\"text\":\"Keyboard Shortcuts\"},\"$:/language/ControlPanel/KeyboardShortcuts/Hint\":{\"title\":\"$:/language/ControlPanel/KeyboardShortcuts/Hint\",\"text\":\"Manage keyboard shortcut assignments\"},\"$:/language/ControlPanel/KeyboardShortcuts/NoShortcuts/Caption\":{\"title\":\"$:/language/ControlPanel/KeyboardShortcuts/NoShortcuts/Caption\",\"text\":\"No keyboard shortcuts assigned\"},\"$:/language/ControlPanel/KeyboardShortcuts/Remove/Hint\":{\"title\":\"$:/language/ControlPanel/KeyboardShortcuts/Remove/Hint\",\"text\":\"remove keyboard shortcut\"},\"$:/language/ControlPanel/KeyboardShortcuts/Platform/All\":{\"title\":\"$:/language/ControlPanel/KeyboardShortcuts/Platform/All\",\"text\":\"All platforms\"},\"$:/language/ControlPanel/KeyboardShortcuts/Platform/Mac\":{\"title\":\"$:/language/ControlPanel/KeyboardShortcuts/Platform/Mac\",\"text\":\"Macintosh platform only\"},\"$:/language/ControlPanel/KeyboardShortcuts/Platform/NonMac\":{\"title\":\"$:/language/ControlPanel/KeyboardShortcuts/Platform/NonMac\",\"text\":\"Non-Macintosh platforms only\"},\"$:/language/ControlPanel/KeyboardShortcuts/Platform/Linux\":{\"title\":\"$:/language/ControlPanel/KeyboardShortcuts/Platform/Linux\",\"text\":\"Linux platform only\"},\"$:/language/ControlPanel/KeyboardShortcuts/Platform/NonLinux\":{\"title\":\"$:/language/ControlPanel/KeyboardShortcuts/Platform/NonLinux\",\"text\":\"Non-Linux platforms only\"},\"$:/language/ControlPanel/KeyboardShortcuts/Platform/Windows\":{\"title\":\"$:/language/ControlPanel/KeyboardShortcuts/Platform/Windows\",\"text\":\"Windows platform only\"},\"$:/language/ControlPanel/KeyboardShortcuts/Platform/NonWindows\":{\"title\":\"$:/language/ControlPanel/KeyboardShortcuts/Platform/NonWindows\",\"text\":\"Non-Windows platforms only\"},\"$:/language/ControlPanel/LayoutSwitcher/Caption\":{\"title\":\"$:/language/ControlPanel/LayoutSwitcher/Caption\",\"text\":\"Layout\"},\"$:/language/ControlPanel/LoadedModules/Caption\":{\"title\":\"$:/language/ControlPanel/LoadedModules/Caption\",\"text\":\"Loaded Modules\"},\"$:/language/ControlPanel/LoadedModules/Hint\":{\"title\":\"$:/language/ControlPanel/LoadedModules/Hint\",\"text\":\"These are the currently loaded tiddler modules linked to their source tiddlers. Any italicised modules lack a source tiddler, typically because they were setup during the boot process.\"},\"$:/language/ControlPanel/Palette/Caption\":{\"title\":\"$:/language/ControlPanel/Palette/Caption\",\"text\":\"Palette\"},\"$:/language/ControlPanel/Palette/Editor/Clone/Caption\":{\"title\":\"$:/language/ControlPanel/Palette/Editor/Clone/Caption\",\"text\":\"clone\"},\"$:/language/ControlPanel/Palette/Editor/Clone/Prompt\":{\"title\":\"$:/language/ControlPanel/Palette/Editor/Clone/Prompt\",\"text\":\"It is recommended that you clone this shadow palette before editing it\"}
2731,\"$:/language/ControlPanel/Palette/Editor/Delete/Hint\":{\"title\":\"$:/language/ControlPanel/Palette/Editor/Delete/Hint\",\"text\":\"delete this entry from the current palette\"},\"$:/language/ControlPanel/Palette/Editor/Names/External/Show\":{\"title\":\"$:/language/ControlPanel/Palette/Editor/Names/External/Show\",\"text\":\"Show color names that are not part of the current palette\"},\"$:/language/ControlPanel/Palette/Editor/Prompt/Modified\":{\"title\":\"$:/language/ControlPanel/Palette/Editor/Prompt/Modified\",\"text\":\"This shadow palette has been modified\"},\"$:/language/ControlPanel/Palette/Editor/Prompt\":{\"title\":\"$:/language/ControlPanel/Palette/Editor/Prompt\",\"text\":\"Editing\"},\"$:/language/ControlPanel/Palette/Editor/Reset/Caption\":{\"title\":\"$:/language/ControlPanel/Palette/Editor/Reset/Caption\",\"text\":\"reset\"},\"$:/language/ControlPanel/Palette/HideEditor/Caption\":{\"title\":\"$:/language/ControlPanel/Palette/HideEditor/Caption\",\"text\":\"hide editor\"},\"$:/language/ControlPanel/Palette/Prompt\":{\"title\":\"$:/language/ControlPanel/Palette/Prompt\",\"text\":\"Current palette:\"},\"$:/language/ControlPanel/Palette/ShowEditor/Caption\":{\"title\":\"$:/language/ControlPanel/Palette/ShowEditor/Caption\",\"text\":\"show editor\"},\"$:/language/ControlPanel/Parsing/Caption\":{\"title\":\"$:/language/ControlPanel/Parsing/Caption\",\"text\":\"Parsing\"},\"$:/language/ControlPanel/Parsing/Hint\":{\"title\":\"$:/language/ControlPanel/Parsing/Hint\",\"text\":\"Here you can globally disable/enable wiki parser rules. For changes to take effect, save and reload your wiki. Disabling certain parser rules can prevent \u003C$text text=\\\"TiddlyWiki\\\"/> from functioning correctly. Use [[safe mode|https://tiddlywiki.com/#SafeMode]] to restore normal operation.\"},\"$:/language/ControlPanel/Parsing/Block/Caption\":{\"title\":\"$:/language/ControlPanel/Parsing/Block/Caption\",\"text\":\"Block Parse Rules\"},\"$:/language/ControlPanel/Parsing/Inline/Caption\":{\"title\":\"$:/language/ControlPanel/Parsing/Inline/Caption\",\"text\":\"Inline Parse Rules\"},\"$:/language/ControlPanel/Parsing/Pragma/Caption\":{\"title\":\"$:/language/ControlPanel/Parsing/Pragma/Caption\",\"text\":\"Pragma Parse Rules\"},\"$:/language/ControlPanel/Plugins/Add/Caption\":{\"title\":\"$:/language/ControlPanel/Plugins/Add/Caption\",\"text\":\"Get more plugins\"},\"$:/language/ControlPanel/Plugins/Add/Hint\":{\"title\":\"$:/language/ControlPanel/Plugins/Add/Hint\",\"text\":\"Install plugins from the official library\"},\"$:/language/ControlPanel/Plugins/AlreadyInstalled/Hint\":{\"title\":\"$:/language/ControlPanel/Plugins/AlreadyInstalled/Hint\",\"text\":\"This plugin is already installed at version \u003C$text text=\u003C\u003CinstalledVersion>>/>\"},\"$:/language/ControlPanel/Plugins/AlsoRequires\":{\"title\":\"$:/language/ControlPanel/Plugins/AlsoRequires\",\"text\":\"Also requires:\"},\"$:/language/ControlPanel/Plugins/Caption\":{\"title\":\"$:/language/ControlPanel/Plugins/Caption\",\"text\":\"Plugins\"},\"$:/language/ControlPanel/Plugins/Disable/Caption\":{\"title\":\"$:/language/ControlPanel/Plugins/Disable/Caption\",\"text\":\"disable\"},\"$:/language/ControlPanel/Plugins/Disable/Hint\":{\"title\":\"$:/language/ControlPanel/Plugins/Disable/Hint\",\"text\":\"Disable this plugin when reloading page\"},\"$:/language/ControlPanel/Plugins/Disabled/Status\":{\"title\":\"$:/language/ControlPanel/Plugins/Disabled/Status\",\"text\":\"(disabled)\"},\"$:/language/ControlPanel/Plugins/Downgrade/Caption\":{\"title\":\"$:/language/ControlPanel/Plugins/Downgrade/Caption\",\"text\":\"downgrade\"},\"$:/language/ControlPanel/Plugins/Empty/Hint\":{\"title\":\"$:/language/ControlPanel/Plugins/Empty/Hint\",\"text\":\"None\"},\"$:/language/ControlPanel/Plugins/Enable/Caption\":{\"title\":\"$:/language/ControlPanel/Plugins/Enable/Caption\",\"text\":\"enable\"},\"$:/language/ControlPanel/Plugins/Enable/Hint\":{\"title\":\"$:/language/ControlPanel/Plugins/Enable/Hint\",\"text\":\"Enable this plugin when reloading page\"},\"$:/language/ControlPanel/Plugins/Install/Caption\":{\"title\":\"$:/language/ControlPanel/Plugins/Install/Caption\",\"text\":\"install\"},\"$:/language/ControlPanel/Plugins/Installed/Hint\":{\"title\":\"$:/language/ControlPanel/Plugins/Installed/Hint\",\"text\":\"Currently installed plugins:\"},\"$:/language/ControlPanel/Plugins/Languages/Caption\":{\"title\":\"$:/language/ControlPanel/Plugins/Languages/Caption\",\"text\":\"Languages\"},\"$:/language/ControlPanel/Plugins/Languages/Hint\":{\"title\":\"$:/language/ControlPanel/Plugins/Languages/Hint\",\"text\":\"Language pack plugins\"},\"$:/language/ControlPanel/Plugins/NoInfoFound/Hint\":{\"title\":\"$:/language/ControlPanel/Plugins/NoInfoFound/Hint\",\"text\":\"No ''\\\"\u003C$text text=\u003C\u003CcurrentTab>>/>\\\"'' found\"},\"$:/language/ControlPanel/Plugins/NotInstalled/Hint\":{\"title\":\"$:/language/ControlPanel/Plugins/NotInstalled/Hint\",\"text\":\"This plugin is not currently installed\"},\"$:/language/ControlPanel/Plugins/OpenPluginLibrary\":{\"title\":\"$:/language/ControlPanel/Plugins/OpenPluginLibrary\",\"text\":\"Open plugin library\"},\"$:/language/ControlPanel/Plugins/ClosePluginLibrary\":{\"title\":\"$:/language/ControlPanel/Plugins/ClosePluginLibrary\",\"text\":\"Close plugin library\"},\"$:/language/ControlPanel/Plugins/PluginWillRequireReload\":{\"title\":\"$:/language/ControlPanel/Plugins/PluginWillRequireReload\",\"text\":\"(requires reload)\"},\"$:/language/ControlPanel/Plugins/Plugins/Caption\":{\"title\":\"$:/language/ControlPanel/Plugins/Plugins/Caption\",\"text\":\"Plugins\"},\"$:/language/ControlPanel/Plugins/Plugins/Hint\":{\"title\":\"$:/language/ControlPanel/Plugins/Plugins/Hint\",\"text\":\"Plugins\"},\"$:/language/ControlPanel/Plugins/Reinstall/Caption\":{\"title\":\"$:/language/ControlPanel/Plugins/Reinstall/Caption\",\"text\":\"reinstall\"},\"$:/language/ControlPanel/Plugins/Themes/Caption\":{\"title\":\"$:/language/ControlPanel/Plugins/Themes/Caption\",\"text\":\"Themes\"},\"$:/language/ControlPanel/Plugins/Themes/Hint\":{\"title\":\"$:/language/ControlPanel/Plugins/Themes/Hint\",\"text\":\"Theme plugins\"},\"$:/language/ControlPanel/Plugins/Update/Caption\":{\"title\":\"$:/language/ControlPanel/Plugins/Update/Caption\",\"text\":\"update\"},\"$:/language/ControlPanel/Plugins/Updates/Caption\":{\"title\":\"$:/language/ControlPanel/Plugins/Updates/Caption\",\"text\":\"Updates\"},\"$:/language/ControlPanel/Plugins/Updates/Hint\":{\"title\":\"$:/language/ControlPanel/Plugins/Updates/Hint\",\"text\":\"Available updates to installed plugins\"},\"$:/language/ControlPanel/Plugins/Updates/UpdateAll/Caption\":{\"title\":\"$:/language/ControlPanel/Plugins/Updates/UpdateAll/Caption\",\"text\":\"Update \u003C\u003Cupdate-count>> plugins\"},\"$:/language/ControlPanel/Plugins/SubPluginPrompt\":{\"title\":\"$:/language/ControlPanel/Plugins/SubPluginPrompt\",\"text\":\"With \u003C\u003Ccount>> sub-plugins available\"},\"$:/language/ControlPanel/Saving/Caption\":{\"title\":\"$:/language/ControlPanel/Saving/Caption\",\"text\":\"Saving\"},\"$:/language/ControlPanel/Saving/DownloadSaver/AutoSave/Description\":{\"title\":\"$:/language/ControlPanel/Saving/DownloadSaver/AutoSave/Description\",\"text\":\"Permit automatic saving for the download saver\"},\"$:/language/ControlPanel/Saving/DownloadSaver/AutoSave/Hint\"
2731:{\"title\":\"$:/language/ControlPanel/Saving/DownloadSaver/AutoSave/Hint\",\"text\":\"Enable Autosave for Download Saver\"},\"$:/language/ControlPanel/Saving/DownloadSaver/Caption\":{\"title\":\"$:/language/ControlPanel/Saving/DownloadSaver/Caption\",\"text\":\"Download Saver\"},\"$:/language/ControlPanel/Saving/DownloadSaver/Hint\":{\"title\":\"$:/language/ControlPanel/Saving/DownloadSaver/Hint\",\"text\":\"These settings apply to the HTML5-compatible download saver\"},\"$:/language/ControlPanel/Saving/General/Caption\":{\"title\":\"$:/language/ControlPanel/Saving/General/Caption\",\"text\":\"General\"},\"$:/language/ControlPanel/Saving/General/Hint\":{\"title\":\"$:/language/ControlPanel/Saving/General/Hint\",\"text\":\"These settings apply to all the loaded savers\"},\"$:/language/ControlPanel/Saving/Hint\":{\"title\":\"$:/language/ControlPanel/Saving/Hint\",\"text\":\"Settings used for saving the entire TiddlyWiki as a single file via a saver module\"},\"$:/language/ControlPanel/Saving/GitService/Branch\":{\"title\":\"$:/language/ControlPanel/Saving/GitService/Branch\",\"text\":\"Target branch for saving\"},\"$:/language/ControlPanel/Saving/GitService/CommitMessage\":{\"title\":\"$:/language/ControlPanel/Saving/GitService/CommitMessage\",\"text\":\"Saved by TiddlyWiki\"},\"$:/language/ControlPanel/Saving/GitService/Description\":{\"title\":\"$:/language/ControlPanel/Saving/GitService/Description\",\"text\":\"These settings are only used when saving to \u003C\u003Cservice-name>>\"},\"$:/language/ControlPanel/Saving/GitService/Filename\":{\"title\":\"$:/language/ControlPanel/Saving/GitService/Filename\",\"text\":\"Filename of target file (e.g. `index.html`)\"},\"$:/language/ControlPanel/Saving/GitService/Path\":{\"title\":\"$:/language/ControlPanel/Saving/GitService/Path\",\"text\":\"Path to target file (e.g. `/wiki/`)\"},\"$:/language/ControlPanel/Saving/GitService/Repo\":{\"title\":\"$:/language/ControlPanel/Saving/GitService/Repo\",\"text\":\"Target repository (e.g. `Jermolene/TiddlyWiki5`)\"},\"$:/language/ControlPanel/Saving/GitService/ServerURL\":{\"title\":\"$:/language/ControlPanel/Saving/GitService/ServerURL\",\"text\":\"Server API URL\"},\"$:/language/ControlPanel/Saving/GitService/UserName\":{\"title\":\"$:/language/ControlPanel/Saving/GitService/UserName\",\"text\":\"Username\"},\"$:/language/ControlPanel/Saving/GitService/GitHub/Caption\":{\"title\":\"$:/language/ControlPanel/Saving/GitService/GitHub/Caption\",\"text\":\"~GitHub Saver\"},\"$:/language/ControlPanel/Saving/GitService/GitHub/Password\":{\"title\":\"$:/language/ControlPanel/Saving/GitService/GitHub/Password\",\"text\":\"Password, OAUTH token, or personal access token (see [[GitHub help page|https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line]] for details)\"},\"$:/language/ControlPanel/Saving/GitService/GitLab/Caption\":{\"title\":\"$:/language/ControlPanel/Saving/GitService/GitLab/Caption\",\"text\":\"~GitLab Saver\"},\"$:/language/ControlPanel/Saving/GitService/GitLab/Password\":{\"title\":\"$:/language/ControlPanel/Saving/GitService/GitLab/Password\",\"text\":\"Personal access token for API (see [[GitLab help page|https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html]] for details)\"},\"$:/language/ControlPanel/Saving/GitService/Gitea/Caption\":{\"title\":\"$:/language/ControlPanel/Saving/GitService/Gitea/Caption\",\"text\":\"Gitea Saver\"},\"$:/language/ControlPanel/Saving/GitService/Gitea/Password\":{\"title\":\"$:/language/ControlPanel/Saving/GitService/Gitea/Password\",\"text\":\"Personal access token for API (via Gitea’s web interface: `Settings | Applications | Generate New Token`)\"},\"$:/language/ControlPanel/Saving/TiddlySpot/Advanced/Heading\":{\"title\":\"$:/language/ControlPanel/Saving/TiddlySpot/Advanced/Heading\",\"text\":\"Advanced Settings\"},\"$:/language/ControlPanel/Saving/TiddlySpot/BackupDir\":{\"title\":\"$:/language/ControlPanel/Saving/TiddlySpot/BackupDir\",\"text\":\"Backup Directory\"},\"$:/language/ControlPanel/Saving/TiddlySpot/ControlPanel\":{\"title\":\"$:/language/ControlPanel/Saving/TiddlySpot/ControlPanel\",\"text\":\"~TiddlySpot Control Panel\"},\"$:/language/ControlPanel/Saving/TiddlySpot/Backups\":{\"title\":\"$:/language/ControlPanel/Saving/TiddlySpot/Backups\",\"text\":\"Backups\"},\"$:/language/ControlPanel/Saving/TiddlySpot/Caption\":{\"title\":\"$:/language/ControlPanel/Saving/TiddlySpot/Caption\",\"text\":\"~TiddlySpot Saver\"},\"$:/language/ControlPanel/Saving/TiddlySpot/Description\":{\"title\":\"$:/language/ControlPanel/Saving/TiddlySpot/Description\",\"text\":\"These settings are only used when saving to [[TiddlySpot|http://tiddlyspot.com]], [[TiddlyHost|https://tiddlyhost.com]], or a compatible remote server. See [[here|https://github.com/simonbaird/tiddlyhost/wiki/TiddlySpot-Saver-configuration-for-Tiddlyhost-and-Tiddlyspot]] for information on ~TiddlySpot and ~TiddlyHost saving configuration.\"},\"$:/language/ControlPanel/Saving/TiddlySpot/Filename\":{\"title\":\"$:/language/ControlPanel/Saving/TiddlySpot/Filename\",\"text\":\"Upload Filename\"},\"$:/language/ControlPanel/Saving/TiddlySpot/Heading\":{\"title\":\"$:/language/ControlPanel/Saving/TiddlySpot/Heading\",\"text\":\"~TiddlySpot\"}
2731,\"$:/language/ControlPanel/Saving/TiddlySpot/Hint\":{\"title\":\"$:/language/ControlPanel/Saving/TiddlySpot/Hint\",\"text\":\"//The server URL defaults to `http://\u003Cwikiname>.tiddlyspot.com/store.cgi` and can be changed to use a custom server address, e.g. `http://example.com/store.php`.//\"},\"$:/language/ControlPanel/Saving/TiddlySpot/Password\":{\"title\":\"$:/language/ControlPanel/Saving/TiddlySpot/Password\",\"text\":\"Password\"},\"$:/language/ControlPanel/Saving/TiddlySpot/ReadOnly\":{\"title\":\"$:/language/ControlPanel/Saving/TiddlySpot/ReadOnly\",\"text\":\"Note that [[TiddlySpot|http://tiddlyspot.com]] no longer allows the creation of new sites. For new sites, you can use [[TiddlyHost|https://tiddlyhost.com]], a new hosting service that replaces ~TiddlySpot.\"},\"$:/language/ControlPanel/Saving/TiddlySpot/ServerURL\":{\"title\":\"$:/language/ControlPanel/Saving/TiddlySpot/ServerURL\",\"text\":\"Server URL\"},\"$:/language/ControlPanel/Saving/TiddlySpot/UploadDir\":{\"title\":\"$:/language/ControlPanel/Saving/TiddlySpot/UploadDir\",\"text\":\"Upload Directory\"},\"$:/language/ControlPanel/Saving/TiddlySpot/UserName\":{\"title\":\"$:/language/ControlPanel/Saving/TiddlySpot/UserName\",\"text\":\"Wiki Name\"},\"$:/language/ControlPanel/Settings/AutoSave/Caption\":{\"title\":\"$:/language/ControlPanel/Settings/AutoSave/Caption\",\"text\":\"Autosave\"},\"$:/language/ControlPanel/Settings/AutoSave/Disabled/Description\":{\"title\":\"$:/language/ControlPanel/Settings/AutoSave/Disabled/Description\",\"text\":\"Do not save changes automatically\"},\"$:/language/ControlPanel/Settings/AutoSave/Enabled/Description\":{\"title\":\"$:/language/ControlPanel/Settings/AutoSave/Enabled/Description\",\"text\":\"Save changes automatically\"},\"$:/language/ControlPanel/Settings/AutoSave/Hint\":{\"title\":\"$:/language/ControlPanel/Settings/AutoSave/Hint\",\"text\":\"Attempt to automatically save changes during editing when using a supporting saver\"},\"$:/language/ControlPanel/Settings/CamelCase/Caption\":{\"title\":\"$:/language/ControlPanel/Settings/CamelCase/Caption\",\"text\":\"Camel Case Wiki Links\"},\"$:/language/ControlPanel/Settings/CamelCase/Hint\":{\"title\":\"$:/language/ControlPanel/Settings/CamelCase/Hint\",\"text\":\"You can globally disable automatic linking of ~CamelCase phrases. Requires reload to take effect\"},\"$:/language/ControlPanel/Settings/CamelCase/Description\":{\"title\":\"$:/language/ControlPanel/Settings/CamelCase/Description\",\"text\":\"Enable automatic ~CamelCase linking\"},\"$:/language/ControlPanel/Settings/Caption\":{\"title\":\"$:/language/ControlPanel/Settings/Caption\",\"text\":\"Settings\"},\"$:/language/ControlPanel/Settings/EditorToolbar/Caption\":{\"title\":\"$:/language/ControlPanel/Settings/EditorToolbar/Caption\",\"text\":\"Editor Toolbar\"},\"$:/language/ControlPanel/Settings/EditorToolbar/Hint\":{\"title\":\"$:/language/ControlPanel/Settings/EditorToolbar/Hint\",\"text\":\"Enable or disable the editor toolbar:\"},\"$:/language/ControlPanel/Settings/EditorToolbar/Description\":{\"title\":\"$:/language/ControlPanel/Settings/EditorToolbar/Description\",\"text\":\"Show editor toolbar\"},\"$:/language/ControlPanel/Settings/InfoPanelMode/Caption\":{\"title\":\"$:/language/ControlPanel/Settings/InfoPanelMode/Caption\",\"text\":\"Tiddler Info Panel Mode\"},\"$:/language/ControlPanel/Settings/InfoPanelMode/Hint\":{\"title\":\"$:/language/ControlPanel/Settings/InfoPanelMode/Hint\",\"text\":\"Control when the tiddler info panel closes:\"},\"$:/language/ControlPanel/Settings/InfoPanelMode/Popup/Description\":{\"title\":\"$:/language/ControlPanel/Settings/InfoPanelMode/Popup/Description\",\"text\":\"Tiddler info panel closes automatically\"},\"$:/language/ControlPanel/Settings/InfoPanelMode/Sticky/Description\":{\"title\":\"$:/language/ControlPanel/Settings/InfoPanelMode/Sticky/Description\",\"text\":\"Tiddler info panel stays open until explicitly closed\"},\"$:/language/ControlPanel/Settings/Hint\":{\"title\":\"$:/language/ControlPanel/Settings/Hint\",\"text\":\"These settings let you customise the behaviour of TiddlyWiki.\"},\"$:/language/ControlPanel/Settings/NavigationAddressBar/Caption\":{\"title\":\"$:/language/ControlPanel/Settings/NavigationAddressBar/Caption\",\"text\":\"Navigation Address Bar\"},\"$:/language/ControlPanel/Settings/NavigationAddressBar/Hint\"
2731:{\"title\":\"$:/language/ControlPanel/Settings/NavigationAddressBar/Hint\",\"text\":\"Behaviour of the browser address bar when navigating to a tiddler:\"},\"$:/language/ControlPanel/Settings/NavigationAddressBar/No/Description\":{\"title\":\"$:/language/ControlPanel/Settings/NavigationAddressBar/No/Description\",\"text\":\"Do not update the address bar\"},\"$:/language/ControlPanel/Settings/NavigationAddressBar/Permalink/Description\":{\"title\":\"$:/language/ControlPanel/Settings/NavigationAddressBar/Permalink/Description\",\"text\":\"Include the target tiddler\"},\"$:/language/ControlPanel/Settings/NavigationAddressBar/Permaview/Description\":{\"title\":\"$:/language/ControlPanel/Settings/NavigationAddressBar/Permaview/Description\",\"text\":\"Include the target tiddler and the current story sequence\"},\"$:/language/ControlPanel/Settings/NavigationHistory/Caption\":{\"title\":\"$:/language/ControlPanel/Settings/NavigationHistory/Caption\",\"text\":\"Navigation History\"},\"$:/language/ControlPanel/Settings/NavigationHistory/Hint\":{\"title\":\"$:/language/ControlPanel/Settings/NavigationHistory/Hint\",\"text\":\"Update browser history when navigating to a tiddler:\"},\"$:/language/ControlPanel/Settings/NavigationHistory/No/Description\":{\"title\":\"$:/language/ControlPanel/Settings/NavigationHistory/No/Description\",\"text\":\"Do not update history\"},\"$:/language/ControlPanel/Settings/NavigationHistory/Yes/Description\":{\"title\":\"$:/language/ControlPanel/Settings/NavigationHistory/Yes/Description\",\"text\":\"Update history\"},\"$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Caption\":{\"title\":\"$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Caption\",\"text\":\"Permalink/permaview Mode\"},\"$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Hint\":{\"title\":\"$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Hint\",\"text\":\"Choose how permalink/permaview is handled:\"},\"$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/CopyToClipboard/Description\":{\"title\":\"$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/CopyToClipboard/Description\",\"text\":\"Copy permalink/permaview URL to clipboard\"},\"$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/UpdateAddressBar/Description\":{\"title\":\"$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/UpdateAddressBar/Description\",\"text\":\"Update address bar with permalink/permaview URL\"},\"$:/language/ControlPanel/Settings/PerformanceInstrumentation/Caption\":{\"title\":\"$:/language/ControlPanel/Settings/PerformanceInstrumentation/Caption\",\"text\":\"Performance Instrumentation\"},\"$:/language/ControlPanel/Settings/PerformanceInstrumentation/Hint\":{\"title\":\"$:/language/ControlPanel/Settings/PerformanceInstrumentation/Hint\",\"text\":\"Displays performance statistics in the browser developer console. Requires reload to take effect\"},\"$:/language/ControlPanel/Settings/PerformanceInstrumentation/Description\":{\"title\":\"$:/language/ControlPanel/Settings/PerformanceInstrumentation/Description\",\"text\":\"Enable performance instrumentation\"},\"$:/language/ControlPanel/Settings/ToolbarButtonStyle/Caption\":{\"title\":\"$:/language/ControlPanel/Settings/ToolbarButtonStyle/Caption\",\"text\":\"Toolbar Button Style\"}
2731,\"$:/language/ControlPanel/Settings/ToolbarButtonStyle/Hint\":{\"title\":\"$:/language/ControlPanel/Settings/ToolbarButtonStyle/Hint\",\"text\":\"Choose the style for toolbar buttons:\"},\"$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Borderless\":{\"title\":\"$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Borderless\",\"text\":\"Borderless\"},\"$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Boxed\":{\"title\":\"$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Boxed\",\"text\":\"Boxed\"},\"$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Rounded\":{\"title\":\"$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Rounded\",\"text\":\"Rounded\"},\"$:/language/ControlPanel/Settings/ToolbarButtons/Caption\":{\"title\":\"$:/language/ControlPanel/Settings/ToolbarButtons/Caption\",\"text\":\"Toolbar Buttons\"},\"$:/language/ControlPanel/Settings/ToolbarButtons/Hint\":{\"title\":\"$:/language/ControlPanel/Settings/ToolbarButtons/Hint\",\"text\":\"Default toolbar button appearance:\"},\"$:/language/ControlPanel/Settings/ToolbarButtons/Icons/Description\":{\"title\":\"$:/language/ControlPanel/Settings/ToolbarButtons/Icons/Description\",\"text\":\"Include icon\"},\"$:/language/ControlPanel/Settings/ToolbarButtons/Text/Description\":{\"title\":\"$:/language/ControlPanel/Settings/ToolbarButtons/Text/Description\",\"text\":\"Include text\"},\"$:/language/ControlPanel/Settings/DefaultSidebarTab/Caption\":{\"title\":\"$:/language/ControlPanel/Settings/DefaultSidebarTab/Caption\",\"text\":\"Default Sidebar Tab\"},\"$:/language/ControlPanel/Settings/DefaultSidebarTab/Hint\":{\"title\":\"$:/language/ControlPanel/Settings/DefaultSidebarTab/Hint\",\"text\":\"Specify which sidebar tab is displayed by default\"},\"$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Caption\":{\"title\":\"$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Caption\",\"text\":\"Default More Sidebar Tab\"},\"$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Hint\":{\"title\":\"$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Hint\",\"text\":\"Specify which More sidebar tab is displayed by default\"},\"$:/language/ControlPanel/Settings/LinkToBehaviour/Caption\":{\"title\":\"$:/language/ControlPanel/Settings/LinkToBehaviour/Caption\",\"text\":\"Tiddler Opening Behaviour\"},\"$:/language/ControlPanel/Settings/LinkToBehaviour/InsideRiver/Hint\":{\"title\":\"$:/language/ControlPanel/Settings/LinkToBehaviour/InsideRiver/Hint\",\"text\":\"Navigation from //within// the story river\"},\"$:/language/ControlPanel/Settings/LinkToBehaviour/OutsideRiver/Hint\":{\"title\":\"$:/language/ControlPanel/Settings/LinkToBehaviour/OutsideRiver/Hint\",\"text\":\"Navigation from //outside// the story river\"},\"$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAbove\":{\"title\":\"$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAbove\",\"text\":\"Open above the current tiddler\"},\"$:/language/ControlPanel/Settings/LinkToBehaviour/OpenBelow\":{\"title\":\"$:/language/ControlPanel/Settings/LinkToBehaviour/OpenBelow\",\"text\":\"Open below the current tiddler\"},\"$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtTop\":{\"title\":\"$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtTop\",\"text\":\"Open at the top of the story river\"},\"$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtBottom\":{\"title\":\"$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtBottom\",\"text\":\"Open at the bottom of the story river\"},\"$:/language/ControlPanel/Settings/TitleLinks/Caption\":{\"title\":\"$:/language/ControlPanel/Settings/TitleLinks/Caption\",\"text\":\"Tiddler Titles\"},\"$:/language/ControlPanel/Settings/TitleLinks/Hint\":{\"title\":\"$:/language/ControlPanel/Settings/TitleLinks/Hint\",\"text\":\"Optionally display tiddler titles as links\"},\"$:/language/ControlPanel/Settings/TitleLinks/No/Description\":{\"title\":\"$:/language/ControlPanel/Settings/TitleLinks/No/Description\",\"text\":\"Do not display tiddler titles as links\"},\"$:/language/ControlPanel/Settings/TitleLinks/Yes/Description\":{\"title\":\"$:/language/ControlPanel/Settings/TitleLinks/Yes/Description\",\"text\":\"Display tiddler titles as links\"},\"$:/language/ControlPanel/Settings/MissingLinks/Caption\":{\"title\":\"$:/language/ControlPanel/Settings/MissingLinks/Caption\",\"text\":\"Wiki Links\"},\"$:/language/ControlPanel/Settings/MissingLinks/Hint\":{\"title\":\"$:/language/ControlPanel/Settings/MissingLinks/Hint\",\"text\":\"Choose whether to link to tiddlers that do not exist yet\"},\"$:/language/ControlPanel/Settings/MissingLinks/Description\":{\"title\":\"$:/language/ControlPanel/Settings/MissingLinks/Description\",\"text\":\"Enable links to missing tiddlers\"},\"$:/language/ControlPanel/StoryTiddler/Caption\":{\"title\":\"$:/language/ControlPanel/StoryTiddler/Caption\",\"text\":\"Story Tiddler\"},\"$:/language/ControlPanel/StoryTiddler/Hint\":{\"title\":\"$:/language/ControlPanel/StoryTiddler/Hint\",\"text\":\"This rule c
2731ascade is used to dynamically choose the template for displaying a tiddler in the story river.\"},\"$:/language/ControlPanel/StoryView/Caption\":{\"title\":\"$:/language/ControlPanel/StoryView/Caption\",\"text\":\"Story View\"},\"$:/language/ControlPanel/StoryView/Prompt\":{\"title\":\"$:/language/ControlPanel/StoryView/Prompt\",\"text\":\"Current view:\"},\"$:/language/ControlPanel/Stylesheets/Caption\":{\"title\":\"$:/language/ControlPanel/Stylesheets/Caption\",\"text\":\"Stylesheets\"},\"$:/language/ControlPanel/Stylesheets/Expand/Caption\":{\"title\":\"$:/language/ControlPanel/Stylesheets/Expand/Caption\",\"text\":\"Expand All\"},\"$:/language/ControlPanel/Stylesheets/Hint\":{\"title\":\"$:/language/ControlPanel/Stylesheets/Hint\",\"text\":\"This is the rendered CSS of the current stylesheet tiddlers tagged with \u003C\u003Ctag \\\"$:/tags/Stylesheet\\\">>\"},\"$:/language/ControlPanel/Stylesheets/Restore/Caption\":{\"title\":\"$:/language/ControlPanel/Stylesheets/Restore/Caption\",\"text\":\"Restore\"},\"$:/language/ControlPanel/Theme/Caption\":{\"title\":\"$:/language/ControlPanel/Theme/Caption\",\"text\":\"Theme\"},\"$:/language/ControlPanel/Theme/Prompt\":{\"title\":\"$:/language/ControlPanel/Theme/Prompt\",\"text\":\"Current theme:\"},\"$:/language/ControlPanel/TiddlerFields/Caption\":{\"title\":\"$:/language/ControlPanel/TiddlerFields/Caption\",\"text\":\"Tiddler Fields\"},\"$:/language/ControlPanel/TiddlerFields/Hint\":{\"title\":\"$:/language/ControlPanel/TiddlerFields/Hint\",\"text\":\"This is the full set of TiddlerFields in use in this wiki (including system tiddlers but excluding shadow tiddlers).\"},\"$:/language/ControlPanel/TiddlerColour/Caption\":{\"title\":\"$:/language/ControlPanel/TiddlerColour/Caption\",\"text\":\"Tiddler C
2731olour\"},\"$:/language/ControlPanel/TiddlerColour/Hint\":{\"title\":\"$:/language/ControlPanel/TiddlerColour/Hint\",\"text\":\"This rules cascade is used to dynamically choose the colour for a tiddler (used for the icon and the associated tag pill).\"},\"$:/language/ControlPanel/TiddlerIcon/Caption\":{\"title\":\"$:/language/ControlPanel/TiddlerIcon/Caption\",\"text\":\"Tiddler Icon\"},\"$:/language/ControlPanel/TiddlerIcon/Hint\":{\"title\":\"$:/language/ControlPanel/TiddlerIcon/Hint\",\"text\":\"This rules cascade is used to dynamically choose the icon for a tiddler.\"},\"$:/language/ControlPanel/Toolbars/Caption\":{\"title\":\"$:/language/ControlPanel/Toolbars/Caption\",\"text\":\"Toolbars\"},\"$:/language/ControlPanel/Toolbars/EditToolbar/Caption\":{\"title\":\"$:/language/ControlPanel/Toolbars/EditToolbar/Caption\",\"text\":\"Edit Toolbar\"},\"$:/language/ControlPanel/Toolbars/EditToolbar/Hint\":{\"title\":\"$:/language/ControlPanel/Toolbars/EditToolbar/Hint\",\"text\":\"Choose which buttons are displayed for tiddlers in edit mode. Drag and drop to change the ordering\"},\"$:/language/ControlPanel/Toolbars/Hint\":{\"title\":\"$:/language/ControlPanel/Toolbars/Hint\",\"text\":\"Select which toolbar buttons are displayed\"},\"$:/language/ControlPanel/Toolbars/PageControls/Caption\":{\"title\":\"$:/language/ControlPanel/Toolbars/PageControls/Caption\",\"text\":\"Page Toolbar\"},\"$:/language/ControlPanel/Toolbars/PageControls/Hint\":{\"title\":\"$:/language/ControlPanel/Toolbars/PageControls/Hint\",\"text\":\"Choose which buttons are displayed on the main page toolbar. Drag and drop to change the ordering\"},\"$:/language/ControlPanel/Toolbars/EditorToolbar/Caption\":{\"title\":\"$:/language/ControlPanel/Toolbars/EditorToolbar/Caption\",\"text\":\"Editor Toolbar\"},\"$:/language/ControlPanel/Toolbars/EditorToolbar/Hint\":{\"title\":\"$:/language/ControlPanel/Toolbars/EditorToolbar/Hint\",\"text\":\"Choose which buttons are displayed in the editor toolbar. Note that some buttons will only appear when editing tiddlers of a certain type. Drag and drop to change the ordering\"},\"$:/language/ControlPanel/Toolbars/ViewToolbar/Caption\":{\"title\":\"$:/language/ControlPanel/Toolbars/ViewToolbar/Caption\",\"text\":\"View Toolbar\"},\"$:/language/ControlPanel/Toolbars/ViewToolbar/Hint\":{\"title\":\"$:/language/ControlPanel/Toolbars/ViewToolbar/Hint\",\"text\":\"Choose which buttons are displayed for tiddlers in view mode. Drag and drop to change the ordering\"},\"$:/language/ControlPanel/Tools/Download/Full/Caption\":{\"title\":\"$:/language/ControlPanel/Tools/Download/Full/Caption\",\"text\":\"Download full wiki\"},\"$:/language/ControlPanel/ViewTemplateBody/Caption\":{\"title\":\"$:/language/ControlPanel/ViewTemplateBody/Caption\",\"text\":\"View Template Body\"},\"$:/language/ControlPanel/ViewTemplateBody/Hint\":{\"title\":\"$:/language/ControlPanel/ViewTemplateBody/Hint\",\"text\":\"This rule cascade is used by the default view template to dynamically choose the template for displaying the body of a tiddler.\"},\"$:/language/ControlPanel/ViewTemplateTitle/Caption\":{\"title\":\"$:/language/ControlPanel/ViewTemplateTitle/Caption\",\"text\":\"View Template Title\"},\"$:/language/ControlPanel/ViewTemplateTitle/Hint\":{\"title\":\"$:/language/ControlPanel/ViewTemplateTitle/Hint\",\"text\":\"This rule cascade is used by the default view template to dynamically choose the template for displaying the title of a tiddler.\"},\"$:/language/Date/DaySuffix/1\":{\"title\":\"$:/language/Date/DaySuffix/1\",\"text\":\"st\"},\"$:/language/Date/DaySuffix/2\":{\"title\":\"$:/language/Date/DaySuffix/2\",\"text\":\"nd\"},\"$:/language/Date/DaySuffix/3\":{\"title\":\"$:/language/Date/DaySuffix/3\",\"text\":\"rd\"},\"$:/language/Date/DaySuffix/4\":{\"title\":\"$:/language/Date/DaySuffix/4\",\"text\":\"th\"},\"$:/language/Date/DaySuffix/5\":{\"title\":\"$:/language/Date/DaySuffix/5\",\"text\":\"th\"},\"$:/language/Date/DaySuffix/6\":{\"title\":\"$:/language/Date/DaySuffix/6\",\"text\":\"th\"},\"$:/language/Date/DaySuffix/7\":{\"title\":\"$:/language/Date/DaySuffix/7\",\"text\":\"th\"},\"$:/language/Date/DaySuffix/8\":{\"title\":\"$:/language/Date/DaySuffix/8\",\"text\":\"th\"},\"$:/language/Date/DaySuffix/9\":{\"title\":\"$:/language/Date/DaySuffix/9\",\"text\":\"th\"},\"$:/language/Date/DaySuffix/10\":{\"title\":\"$:/language/Date/DaySuffix/10\",\"text\":\"th\"},\"$:/language/Date/DaySuffix/11\":{\"title\":\"$:/language/Date/DaySuffix/11\",\"text\":\"th\"},\"$:/language/Date/DaySuffix/12\":{\"title\":\"$:/language/Date/DaySuffix/12\",\"text\":\"th\"},\"$:/language/Date/DaySuffix/13\":{\"title\":\"$:/language/Date/DaySuffix/13\",\"text\":\"th\"},\"$:/language/Date/DaySuffix/14\":{\"title\":\"$:/language/Date/DaySuffix/14\",\"text\":\"th\"},\"$:/language/Date/DaySuffix/15\":{\"title\":\"$:/language/Date/DaySuffix/15\",\"text\":\"th\"},\"$:/language/Date/DaySuffix/16\":{\"title\":\"$:/language/Date/DaySuffix/16\",\"text\":\"th\"},\"$:/language/Date/DaySuffix/17\":{\"title\":\"$:/language/Date/DaySuffix/17\",\"text\":\"th\"},\"$:/language/Date/DaySuffix/18\":{\"title\":\"$:/language/Date/DaySuffix/18\",\"text\":\"th\"},\"$:/language/Date/DaySuffix/19\":{\"title\":\"$:/language/Date/DaySuffix/19\",\"text\":\"th\"},\"$:/language/Date/DaySuffix/20\":{\"title\":\"$:/language/Date/DaySuffix/20\",\"text\":\"th\"},\"$:/language/Date/DaySuffix/21\":{\"title\":\"$:/language/Date/DaySuffix/21\",\"text\":\"st\"},\"$:/language/Date/DaySuffix/22\":{\"title\":\"$:/language/Date/DaySuffix/22\",\"text\":\"nd\"},\"$:/language/Date/DaySuffix/23\":{\"title\":\"$:/language/Date/DaySuffix/23\",\"text\":\"rd\"},\"$:/language/Date/DaySuffix/24\":{\"title\":\"$:/language/Date/DaySuffix/24\",\"text\":\"th\"},\"$:/language/Date/DaySuffix/25\":{\"title\":\"$:/language/Date/DaySuffix/25\",\"text\":\"th\"},\"$:/language/Date/DaySuffix/26\":{\"title\":\"$:/language/Date/DaySuffix/26\",\"text\":\"th\"},\"$:/language/Date/DaySuffix/27\":{\"title\":\"$:/language/Date/DaySuffix/27\",\"text\":\"th\"},\"$:/language/Date/DaySuffix/28\":{\"title\":\"$:/language/Date/DaySuffix/28\",\"text\":\"th\"},\"$:/language/Date/DaySuffix/29\":{\"title\":\"$:/language/Date/DaySuffix/29\",\"text\":\"th\"},\"$:/language/Date/DaySuffix/30\":{\"title\":\"$:/language/Date/DaySuffix/30\",\"text\":\"th\"},\"$:/language/Date/DaySuffix/31\":{\"title\":\"$:/language/Date/DaySuffix/31\",\"text\":\"st\"},\"$:/language/Date/Long/Day/0\":{\"title\":\"$:/language/Date/Long/Day/0\",\"text\":\"Sunday\"},\"$:/language/Date/Long/Day/1\":{\"title\":\"$:/language/Date/Long/Day/1\",\"text\":\"Monday\"},\"$:/language/Date/Long/Day/2\":{\"title\":\"$:/language/Date/Long/Day/2\",\"text\":\"Tuesday\"},\"$:/language/Date/Long/Day/3\":{\"title\":\"$:/language/Date/Long/Day/3\",\"text\":\"Wednesday\"}
2731,\"$:/language/Date/Long/Day/4\":{\"title\":\"$:/language/Date/Long/Day/4\",\"text\":\"Thursday\"},\"$:/language/Date/Long/Day/5\":{\"title\":\"$:/language/Date/Long/Day/5\",\"text\":\"Friday\"},\"$:/language/Date/Long/Day/6\":{\"title\":\"$:/language/Date/Long/Day/6\",\"text\":\"Saturday\"},\"$:/language/Date/Long/Month/1\":{\"title\":\"$:/language/Date/Long/Month/1\",\"text\":\"January\"},\"$:/language/Date/Long/Month/2\":{\"title\":\"$:/language/Date/Long/Month/2\",\"text\":\"February\"},\"$:/language/Date/Long/Month/3\":{\"title\":\"$:/language/Date/Long/Month/3\",\"text\":\"March\"},\"$:/language/Date/Long/Month/4\":{\"title\":\"$:/language/Date/Long/Month/4\",\"text\":\"April\"},\"$:/language/Date/Long/Month/5\":{\"title\":\"$:/language/Date/Long/Month/5\",\"text\":\"May\"},\"$:/language/Date/Long/Month/6\":{\"title\":\"$:/language/Date/Long/Month/6\",\"text\":\"June\"},\"$:/language/Date/Long/Month/7\":{\"title\":\"$:/language/Date/Long/Month/7\",\"text\":\"July\"},\"$:/language/Date/Long/Month/8\":{\"title\":\"$:/language/Date/Long/Month/8\",\"text\":\"August\"},\"$:/language/Date/Long/Month/9\":{\"title\":\"$:/language/Date/Long/Month/9\",\"text\":\"September\"},\"$:/language/Date/Long/Month/10\":{\"title\":\"$:/language/Date/Long/Month/10\",\"text\":\"October\"},\"$:/language/Date/Long/Month/11\":{\"title\":\"$:/language/Date/Long/Month/11\",\"text\":\"November\"},\"$:/language/Date/Long/Month/12\":{\"title\":\"$:/language/Date/Long/Month/12\",\"text\":\"December\"},\"$:/language/Date/Period/am\":{\"title\":\"$:/language/Date/Period/am\",\"text\":\"am\"},\"$:/language/Date/Period/pm\":{\"title\":\"$:/language/Date/Period/pm\",\"text\":\"pm\"},\"$:/language/Date/Short/Day/0\":{\"title\":\"$:/language/Date/Short/Day/0\",\"text\":\"Sun\"},\"$:/language/Date/Short/Day/1\":{\"title\":\"$:/language/Date/Short/Day/1\",\"text\":\"Mon\"},\"$:/language/Date/Short/Day/2\":{\"title\":\"$:/language/Date/Short/Day/2\",\"text\":\"Tue\"},\"$:/language/Date/Short/Day/3\":{\"title\":\"$:/language/Date/Short/Day/3\",\"text\":\"Wed\"},\"$:/language/Date/Short/Day/4\":{\"title\":\"$:/language/Date/Short/Day/4\",\"text\":\"Thu\"},\"$:/language/Date/Short/Day/5\":{\"title\":\"$:/language/Date/Short/Day/5\",\"text\":\"Fri\"},\"$:/language/Date/Short/Day/6\":{\"title\":\"$:/language/Date/Short/Day/6\",\"text\":\"Sat\"},\"$:/language/Date/Short/Month/1\":{\"title\":\"$:/language/Date/Short/Month/1\",\"text\":\"Jan\"},\"$:/language/Date/Short/Month/2\":{\"title\":\"$:/language/Date/Short/Month/2\",\"text\":\"Feb\"},\"$:/language/Date/Short/Month/3\":{\"title\":\"$:/language/Date/Short/Month/3\",\"text\":\"Mar\"},\"$:/language/Date/Short/Month/4\":{\"title\":\"$:/language/Date/Short/Month/4\",\"text\":\"Apr\"},\"$:/language/Date/Short/Month/5\":{\"title\":\"$:/language/Date/Short/Month/5\",\"text\":\"May\"},\"$:/language/Date/Short/Month/6\":{\"title\":\"$:/language/Date/Short/Month/6\",\"text\":\"Jun\"},\"$:/language/Date/Short/Month/7\":{\"title\":\"$:/language/Date/Short/Month/7\",\"text\":\"Jul\"},\"$:/language/Date/Short/Month/8\":{\"title\":\"$:/language/Date/Short/Month/8\",\"text\":\"Aug\"},\"$:/language/Date/Short/Month/9\":{\"title\":\"$:/language/Date/Short/Month/9\",\"text\":\"Sep\"},\"$:/language/Date/Short/Month/10\":{\"title\":\"$:/language/Date/Short/Month/10\",\"text\":\"Oct\"},\"$:/language/Date/Short/Month/11\":{\"title\":\"$:/language/Date/Short/Month/11\",\"text\":\"Nov\"},\"$:/language/Date/Short/Month/12\":{\"title\":\"$:/language/Date/Short/Month/12\",\"text\":\"Dec\"},\"$:/language/RelativeDate/Future/Days\":{\"title\":\"$:/language/RelativeDate/Future/Days\",\"text\":\"\u003C\u003Cperiod>> days from now\"},\"$:/language/RelativeDate/Future/Hours\":{\"title\":\"$:/language/RelativeDate/Future/Hours\",\"text\":\"\u003C\u003Cperiod>> hours from now\"},\"$:/language/RelativeDate/Future/Minutes\":{\"title\":\"$:/language/RelativeDate/Future/Minutes\",\"text\":\"\u003C\u003Cperiod>> minutes from now\"},\"$:/language/RelativeDate/Future/Months\":{\"title\":\"$:/language/RelativeDate/Future/Months\",\"text\":\"\u003C\u003Cperiod>> months from now\"},\"$:/language/RelativeDate/Future/Second\":{\"title\":\"$:/language/RelativeDate/Future/Second\",\"text\":\"1 second from now\"},\"$:/language/RelativeDate/Future/Seconds\":{\"title\":\"$:/language/RelativeDate/Future/Seconds\",\"text\":\"\u003C\u003Cperiod>> seconds from now\"},\"$:/language/RelativeDate/Future/Years\":{\"title\":\"$:/language/RelativeDate/Future/Years\",\"text\":\"\u003C\u003Cperiod>> years from now\"},\"$:/language/RelativeDate/Past/Days\":{\"title\":\"$:/language/RelativeDate/Past/Days\",\"text\":\"\u003C\u003Cperiod>> days ago\"},\"$:/language/RelativeDate/Past/Hours\":{\"title\":\"$:/language/RelativeDate/Past/Hours\",\"text\":\"\u003C\u003Cperiod>> hours ago\"},\"$:/language/RelativeDate/Past/Minutes\":{\"title\":\"$:/language/RelativeDate/Past/Minutes\",\"text\":\"\u003C\u003Cperiod>> minutes ago\"},\"$:/language/RelativeDate/Past/Months\":{\"title\":\"$:/language/RelativeDate/Past/Months\",\"text\":\"\u003C\u003Cperiod>> months ago\"},\"$:/language/RelativeDate/Past/Second\":{\"title\":\"$:/language/RelativeDate/Past/Second\",\"text\":\"1 second ago\"},\"$:/language/RelativeDate/Past/Seconds\":{\"title\":\"$:/language/RelativeDate/Past/Seconds\",\"text\":\"\u003C\u003Cperiod>> seconds ago\"},\"$:/language/RelativeDate/Past/Years\":{\"title\":\"$:/language/RelativeDate/Past/Years\",\"text\":\"\u003C\u003Cperiod>> years ago\"},\"$:/language/Docs/ModuleTypes/allfilteroperator\":{\"title\":\"$:/language/Docs/ModuleTypes/allfilteroperator\",\"text\":\"A sub-operator for the ''all'' filter operator.\"},\"$:/language/Docs/ModuleTypes/animation\":{\"title\":\"$:/language/Docs/ModuleTypes/animation\",\"text\":\"Animations that may be used with the RevealWidget.\"},\"$:/language/Docs/ModuleTypes/authenticator\":{\"title\":\"$:/language/Docs/ModuleTypes/authenticator\",\"text\":\"Defines how requests are authenticated by the built-in HTTP server.\"},\"$:/language/Docs/ModuleTypes/bitmapeditoroperation\":{\"title\":\"$:/language/Docs/ModuleTypes/bitmapeditoroperation\",\"text\":\"A bitmap editor toolbar operation.\"},\"$:/language/Docs/ModuleTypes/command\":{\"title\":\"$:/language/Docs/ModuleTypes/command\",\"text\":\"Commands that can be executed under Node.js.\"},\"$:/language/Docs/ModuleTypes/config\":{\"title\":\"$:/language/Docs/ModuleTypes/config\",\"text\":\"Data to be inserted into `$tw.config`.\"},\"$:/language/Docs/ModuleTypes/filteroperator\":{\"title\":\"$:/language/Docs/ModuleTypes/filteroperator\",\"text\":\"Individual filter operator methods.\"},\"$:/language/Docs/ModuleTypes/global\":{\"title\":\"$:/language/Docs/ModuleTypes/global\",\"text\":\"Global data to be inserted into `$tw`.\"},\"$:/language/Docs/ModuleTypes/info\":{\"title\":\"$:/language/Docs/ModuleTypes/info\",\"text\":\"Publishes system information via the [[$:/temp/info-plugin]] pseudo-plugin.\"},\"$:/language/Docs/ModuleTypes/isfilteroperator\":{\"title\":\"$:/language/Docs/ModuleTypes/isfilteroperator\",\"text\":\"Operands for the ''is'' filter operator.\"},\"$:/language/Docs/ModuleTypes/library\":{\"title\":\"$:/language/Docs/ModuleTypes/library\",\"text\":\"Generic module type for general purpose JavaScript modules.\"},\"$:/language/Docs/ModuleTypes/macro\":{\"title\":\"$:/language/Docs/ModuleTypes/macro\",\"text\":\"JavaScript macro definitions.\"},\"$:/language/Docs/ModuleTypes/parser\":{\"title\":\"$:/language/Docs/ModuleTypes/parser\",\"text\":\"Parsers for different c
2731ontent types.\"},\"$:/language/Docs/ModuleTypes/route\":{\"title\":\"$:/language/Docs/ModuleTypes/route\",\"text\":\"Defines how individual URL patterns are handled by the built-in HTTP server.\"},\"$:/language/Docs/ModuleTypes/saver\":{\"title\":\"$:/language/Docs/ModuleTypes/saver\",\"text\":\"Savers handle different methods for saving files from the browser.\"},\"$:/language/Docs/ModuleTypes/startup\":{\"title\":\"$:/language/Docs/ModuleTypes/startup\",\"text\":\"Startup functions.\"},\"$:/language/Docs/ModuleTypes/storyview\":{\"title\":\"$:/language/Docs/ModuleTypes/storyview\",\"text\":\"Story views customise the animation and behaviour of list widgets.\"},\"$:/language/Docs/ModuleTypes/texteditoroperation\":{\"title\":\"$:/language/Docs/ModuleTypes/texteditoroperation\",\"text\":\"A text editor toolbar operation.\"},\"$:/language/Docs/ModuleTypes/tiddlerdeserializer\":{\"title\":\"$:/language/Docs/ModuleTypes/tiddlerdeserializer\",\"text\":\"Converts different content types into tiddlers.\"},\"$:/language/Docs/ModuleTypes/tiddlerfield\":{\"title\":\"$:/language/Docs/ModuleTypes/tiddlerfield\",\"text\":\"Defines the behaviour of an individual tiddler field.\"},\"$:/language/Docs/ModuleTypes/tiddlermethod\":{\"title\":\"$:/language/Docs/ModuleTypes/tiddlermethod\",\"text\":\"Adds methods to the `$tw.Tiddler` prototype.\"},\"$:/language/Docs/ModuleTypes/upgrader\":{\"title\":\"$:/language/Docs/ModuleTypes/upgrader\",\"text\":\"Applies upgrade processing to tiddlers during an upgrade/import.\"},\"$:/language/Docs/ModuleTypes/utils\":{\"title\":\"$:/language/Docs/ModuleTypes/utils\",\"text\":\"Adds methods to `$tw.utils`.\"},\"$:/language/Docs/ModuleTypes/utils-browser\":{\"title\":\"$:/language/Docs/ModuleTypes/utils-browser\",\"text\":\"Adds browser-specific methods to `$tw.utils`.\"},\"$:/language/Docs/ModuleTypes/utils-node\":{\"title\":\"$:/language/Docs/ModuleTypes/utils-node\",\"text\":\"Adds Node.js-specific methods to `$tw.utils`.\"},\"$:/language/Docs/ModuleTypes/widget\":{\"title\":\"$:/language/Docs/ModuleTypes/widget\",\"text\":\"Widgets encapsulate DOM rendering and refreshing.\"},\"$:/language/Docs/ModuleTypes/wikimethod\":{\"title\":\"$:/language/Docs/ModuleTypes/wikimethod\",\"text\":\"Adds methods to `$tw.Wiki`.\"},\"$:/language/Docs/ModuleTypes/wikirule\":{\"title\":\"$:/language/Docs/ModuleTypes/wikirule\",\"text\":\"Individual parser rules for the main WikiText parser.\"},\"$:/language/Docs/PaletteColours/alert-background\":{\"title\":\"$:/language/Docs/PaletteColours/alert-background\",\"text\":\"Alert background\"},\"$:/language/Docs/PaletteColours/alert-border\":{\"title\":\"$:/language/Docs/PaletteColours/alert-border\",\"text\":\"Alert border\"},\"$:/language/Docs/PaletteColours/alert-highlight\":{\"title\":\"$:/language/Docs/PaletteColours/alert-highlight\",\"text\":\"Alert highlight\"},\"$:/language/Docs/PaletteColours/alert-muted-foreground\":{\"title\":\"$:/language/Docs/PaletteColours/alert-muted-foreground\",\"text\":\"Alert muted foreground\"},\"$:/language/Docs/PaletteColours/background\":{\"title\":\"$:/language/Docs/PaletteColours/background\",\"text\":\"General background\"},\"$:/language/Docs/PaletteColours/blockquote-bar\":{\"title\":\"$:/language/Docs/PaletteColours/blockquote-bar\",\"text\":\"Blockquote bar\"},\"$:/language/Docs/PaletteColours/button-background\":{\"title\":\"$:/language/Docs/PaletteColours/button-background\",\"text\":\"Default button background\"},\"$:/language/Docs/PaletteColours/button-border\":{\"title\":\"$:/language/Docs/PaletteColours/button-border\",\"text\":\"Default button border\"},\"$:/language/Docs/PaletteColours/button-foreground\":{\"title\":\"$:/language/Docs/PaletteColours/button-foreground\",\"text\":\"Default button foreground\"},\"$:/language/Docs/PaletteColours/dirty-indicator\":{\"title\":\"$:/language/Docs/PaletteColours/dirty-indicator\",\"text\":\"Unsaved changes indicator\"},\"$:/language/Docs/PaletteColours/code-background\":{\"title\":\"$:/language/Docs/PaletteColours/code-background\",\"text\":\"Code background\"},\"$:/language/Docs/PaletteColours/code-border\":{\"title\":\"$:/language/Docs/PaletteColours/code-border\",\"text\":\"Code border\"},\"$:/language/Docs/PaletteColours/code-foreground\":{\"title\":\"$:/language/Docs/PaletteColours/code-foreground\",\"text\":\"Code foreground\"},\"$:/language/Docs/PaletteColours/download-background\":{\"title\":\"$:/language/Docs/PaletteColours/download-background\",\"text\":\"Download button background\"},\"$:/language/Docs/PaletteColours/download-foreground\":{\"title\":\"$:/language/Docs/PaletteColours/download-foreground\",\"text\":\"Download button foreground\"},\"$:/language/Docs/PaletteColours/dragger-background\":{\"title\":\"$:/language/Docs/PaletteColours/dragger-background\",\"text\":\"Dragger background\"},\"$:/language/Docs/PaletteColours/dragger-foreground\":{\"title\":\"$:/language/Docs/PaletteColours/dragger-foreground\",\"text\":\"Dragger foreground\"},\"$:/language/Docs/PaletteColours/dropdown-background\":{\"title\":\"$:/language/Docs/PaletteColours/dropdown-background\",\"text\":\"Dropdown background\"},\"$:/language/Docs/PaletteColours/dropdown-border\":{\"title\":\"$:/language/Docs/PaletteColours/dropdown-border\",\"text\":\"Dropdown border\"},\"$:/language/Docs/PaletteColours/dropdown-tab-background-selected\":{\"title\":\"$:/language/Docs/PaletteColours/dropdown-tab-background-selected\",\"text\":\"Dropdown tab background for selected tabs\"},\"$:/language/Docs/PaletteColours/dropdown-tab-background\":{\"title\":\"$:/language/Docs/PaletteColours/dropdown-tab-background\",\"text\":\"Dropdown tab background\"},\"$:/language/Docs/PaletteColours/dropzone-background\":{\"title\":\"$:/language/Docs/PaletteColours/dropzone-background\",\"text\":\"Dropzone background\"},\"$:/language/Docs/PaletteColours/external-link-background-hover\":{\"title\":\"$:/language/Docs/PaletteColours/external-link-background-hover\",\"text\":\"External link background hover\"},\"$:/language/Docs/PaletteColours/external-link-background-visited\":{\"title\":\"$:/language/Docs/PaletteColours/external-link-background-visited\",\"text\":\"External link background visited\"},\"$:/language/Docs/PaletteColours/external-link-background\":{\"title\":\"$:/language/Docs/PaletteColours/external-link-background\",\"text\":\"External link background\"},\"$:/language/Docs/PaletteColours/external-link-foreground-hover\":{\"title\":\"$:/language/Docs/PaletteColours/external-link-foreground-hover\",\"text\":\"External link foreground hover\"},\"$:/language/Docs/PaletteColours/external-link-foreground-visited\":{\"title\":\"$:/language/Docs/PaletteColours/external-link-foreground-visited\",\"text\":\"External link foreground visited\"},\"$:/language/Docs/PaletteColours/external-link-foreground\":{\"title\":\"$:/language/Docs/PaletteColours/external-link-foreground\",\"text\":\"External link foreground\"},\"$:/language/Docs/PaletteColours/foreground\":{\"title\":\"$:/language/Docs/PaletteColours/foreground\",\"text\":\"General foreground\"},\"$:/language/Docs/PaletteColours/menubar-background\":{\"title\":\"$:/language/Docs/PaletteColours/menubar-background\",\"text\":\"Menu bar background\"},\"$:/language/Docs/PaletteColours/menubar-foreground\":{\"title\":\"$:/language/Docs/PaletteColours/menubar-foreground\",\"text\":\"Menu bar foreground\"},\"$:/language/Docs/PaletteColours/message-background\":{\"title\":\"$:/language/Docs/PaletteColours/message-background\",\"text\":\"Message box background\"},\"$:/language/Docs/PaletteColours/message-border\":{\"title\":\"$:/language/Docs/PaletteColours/message-border\",\"text\":\"Message box border\"},\"$:/language/Docs/PaletteColours/message-foreground\":{\"title\":\"$:/language/Docs/PaletteColours/message-foreground\",\"text\":\"Message box foreground\"},\"$:/language/Docs/PaletteColours/modal-backdrop\":{\"title\":\"$:/language/Docs/PaletteColours/modal-backdrop\",\"text\":\"Modal backdrop\"},\"$:/language/Docs/PaletteColours/modal-background\":{\"title\":\"$:/language/Docs/PaletteColours/modal-background\",\"text\":\"Modal background\"},\"$:/language/Docs/PaletteColours/modal-border\":{\"title\":\"$:/language/Docs/PaletteColours/modal-border\",\"text\":\"Modal border\"},\"$:/language/Docs/PaletteColours/modal-footer-background\":{\"title\":\"$:/language/Docs/PaletteColours/modal-footer-background\",\"text\":\"Modal footer background\"},\"$:/language/Docs/PaletteColours/modal-footer-border\":{\"title\":\"$:/language/Docs/PaletteColours/modal-footer-border\",\"text\":\"Modal footer border\"},\"$:/language/Docs/PaletteColours/modal-header-border\":{\"title\":\"$:/language/Docs/PaletteColours/modal-header-border\",\"text\":\"Modal header border\"},\"$:/language/Docs/PaletteColours/muted-foreground\":{\"title\":\"$:/language/Docs/PaletteColours/muted-foreground\",\"text\":\"General muted foreground\"},\"$:/language/Docs/PaletteColours/notification-background\":{\"title\":\"$:/language/Docs/PaletteColours/notification-background\",\"text\":\"Notification background\"},\"$:/language/Docs/PaletteColours/notification-border\":{\"title\":\"$:/language/Docs/PaletteColours/notification-border\",\"text\":\"Notification border\"},\"$:/language/Docs/PaletteColours/page-background\":{\"title\":\"$:/language/Docs/PaletteColours/page-background\",\"text\":\"Page background\"},\"$:/language/Docs/PaletteColours/pre-background\":{\"title\":\"$:/language/Docs/PaletteColours/pre-background\",\"text\":\"Preformatted code background\"},\"$:/language/Docs/PaletteColours/pre-border\":{\"title\":\"$:/language/Docs/PaletteColours/pre-border\",\"text\":\"Preformatted code border\"},\"$:/language/Docs/PaletteColours/primary\":{\"title\":\"$:/language/Docs/PaletteColours/primary\",\"text\":\"General primary\"},\"$:/language/Docs/PaletteColours/select-tag-background\":{\"title\":\"$:/language/Docs/PaletteColours/select-tag-background\",\"text\":\"`\u003Cselect>` element background\"},\"$:/language/Docs/PaletteColours/select-tag-foreground\":{\"title\":\"$:/language/Docs/PaletteColours/select-tag-foreground\",\"text\":\"`\u003Cselect>` element text\"},\"$:/language/Docs/PaletteColours/sidebar-button-foreground\":{\"title\":\"$:/language/Docs/PaletteColours/sidebar-button-foreground\",\"text\":\"Sidebar button foreground\"}
2731,\"$:/language/Docs/PaletteColours/sidebar-controls-foreground-hover\":{\"title\":\"$:/language/Docs/PaletteColours/sidebar-controls-foreground-hover\",\"text\":\"Sidebar controls foreground hover\"},\"$:/language/Docs/PaletteColours/sidebar-controls-foreground\":{\"title\":\"$:/language/Docs/PaletteColours/sidebar-controls-foreground\",\"text\":\"Sidebar controls foreground\"},\"$:/language/Docs/PaletteColours/sidebar-foreground-shadow\":{\"title\":\"$:/language/Docs/PaletteColours/sidebar-foreground-shadow\",\"text\":\"Sidebar foreground shadow\"},\"$:/language/Docs/PaletteColours/sidebar-foreground\":{\"title\":\"$:/language/Docs/PaletteColours/sidebar-foreground\",\"text\":\"Sidebar foreground\"},\"$:/language/Docs/PaletteColours/sidebar-muted-foreground-hover\":{\"title\":\"$:/language/Docs/PaletteColours/sidebar-muted-foreground-hover\",\"text\":\"Sidebar muted foreground hover\"},\"$:/language/Docs/PaletteColours/sidebar-muted-foreground\":{\"title\":\"$:/language/Docs/PaletteColours/sidebar-muted-foreground\",\"text\":\"Sidebar muted foreground\"},\"$:/language/Docs/PaletteColours/sidebar-tab-background-selected\":{\"title\":\"$:/language/Docs/PaletteColours/sidebar-tab-background-selected\",\"text\":\"Sidebar tab background for selected tabs\"},\"$:/language/Docs/PaletteColours/sidebar-tab-background\":{\"title\":\"$:/language/Docs/PaletteColours/sidebar-tab-background\",\"text\":\"Sidebar tab background\"},\"$:/language/Docs/PaletteColours/sidebar-tab-border-selected\":{\"title\":\"$:/language/Docs/PaletteColours/sidebar-tab-border-selected\",\"text\":\"Sidebar tab border for selected tabs\"},\"$:/language/Docs/PaletteColours/sidebar-tab-border\":{\"title\":\"$:/language/Docs/PaletteColours/sidebar-tab-border\",\"text\":\"Sidebar tab border\"},\"$:/language/Docs/PaletteColours/sidebar-tab-divider\":{\"title\":\"$:/language/Docs/PaletteColours/sidebar-tab-divider\",\"text\":\"Sidebar tab divider\"},\"$:/language/Docs/PaletteColours/sidebar-tab-foreground-selected\":{\"title\":\"$:/language/Docs/PaletteColours/sidebar-tab-foreground-selected\",\"text\":\"Sidebar tab foreground for selected tabs\"},\"$:/language/Docs/PaletteColours/sidebar-tab-foreground\":{\"title\":\"$:/language/Docs/PaletteColours/sidebar-tab-foreground\",\"text\":\"Sidebar tab foreground\"},\"$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground-hover\":{\"title\":\"$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground-hover\",\"text\":\"Sidebar tiddler link foreground hover\"},\"$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground\":{\"title\":\"$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground\",\"text\":\"Sidebar tiddler link foreground\"},\"$:/language/Docs/PaletteColours/site-title-foreground\":{\"title\":\"$:/language/Docs/PaletteColours/site-title-foreground\",\"text\":\"Site title foreground\"},\"$:/language/Docs/PaletteColours/static-alert-foreground\":{\"title\":\"$:/language/Docs/PaletteColours/static-alert-foreground\",\"text\":\"Static alert foreground\"},\"$:/language/Docs/PaletteColours/tab-background-selected\":{\"title\":\"$:/language/Docs/PaletteColours/tab-background-selected\",\"text\":\"Tab background for selected tabs\"},\"$:/language/Docs/PaletteColours/tab-background\":{\"title\":\"$:/language/Docs/PaletteColours/tab-background\",\"text\":\"Tab background\"},\"$:/language/Docs/PaletteColours/tab-border-selected\":{\"title\":\"$:/language/Docs/PaletteColours/tab-border-selected\",\"text\":\"Tab border for selected tabs\"},\"$:/language/Docs/PaletteColours/tab-border\":{\"title\":\"$:/language/Docs/PaletteColours/tab-border\",\"text\":\"Tab border\"},\"$:/language/Docs/PaletteColours/tab-divider\":{\"title\":\"$:/language/Docs/PaletteColours/tab-divider\",\"text\":\"Tab divider\"},\"$:/language/Docs/PaletteColours/tab-foreground-selected\":{\"title\":\"$:/language/Docs/PaletteColours/tab-foreground-selected\",\"text\":\"Tab foreground for selected tabs\"},\"$:/language/Docs/PaletteColours/tab-foreground\":{\"title\":\"$:/language/Docs/PaletteColours/tab-foreground\",\"text\":\"Tab foreground\"},\"$:/language/Docs/PaletteColours/table-border\":{\"title\":\"$:/language/Docs/PaletteColours/table-border\",\"text\":\"Table border\"},\"$:/language/Docs/PaletteColours/table-footer-background\":{\"title\":\"$:/language/Docs/PaletteColours/table-footer-background\",\"text\":\"Table footer background\"},\"$:/language/Docs/PaletteColours/table-header-background\":{\"title\":\"$:/language/Docs/PaletteColours/table-header-background\",\"text\":\"Table header background\"},\"$:/language/Docs/PaletteColours/tag-background\":{\"title\":\"$:/language/Docs/PaletteColours/tag-background\",\"text\":\"Tag background\"},\"$:/language/Docs/PaletteColours/tag-foreground\":{\"title\":\"$:/language/Docs/PaletteColours/tag-foreground\",\"text\":\"Tag foreground\"},\"$:/language/Docs/PaletteColours/tiddler-background\":{\"title\":\"$:/language/Docs/PaletteColours/tiddler-background\",\"text\":\"Tiddler background\"},\"$:/language/Docs/PaletteColours/tiddler-border\":{\"title\":\"$:/language/Docs/PaletteColours/tiddler-border\",\"text\":\"Tiddler border\"}
2731,\"$:/language/Docs/PaletteColours/tiddler-controls-foreground-hover\":{\"title\":\"$:/language/Docs/PaletteColours/tiddler-controls-foreground-hover\",\"text\":\"Tiddler controls foreground hover\"},\"$:/language/Docs/PaletteColours/tiddler-controls-foreground-selected\":{\"title\":\"$:/language/Docs/PaletteColours/tiddler-controls-foreground-selected\",\"text\":\"Tiddler controls foreground for selected controls\"},\"$:/language/Docs/PaletteColours/tiddler-controls-foreground\":{\"title\":\"$:/language/Docs/PaletteColours/tiddler-controls-foreground\",\"text\":\"Tiddler controls foreground\"},\"$:/language/Docs/PaletteColours/tiddler-editor-background\":{\"title\":\"$:/language/Docs/PaletteColours/tiddler-editor-background\",\"text\":\"Tiddler editor background\"},\"$:/language/Docs/PaletteColours/tiddler-editor-border-image\":{\"title\":\"$:/language/Docs/PaletteColours/tiddler-editor-border-image\",\"text\":\"Tiddler editor border image\"},\"$:/language/Docs/PaletteColours/tiddler-editor-border\":{\"title\":\"$:/language/Docs/PaletteColours/tiddler-editor-border\",\"text\":\"Tiddler editor border\"},\"$:/language/Docs/PaletteColours/tiddler-editor-fields-even\":{\"title\":\"$:/language/Docs/PaletteColours/tiddler-editor-fields-even\",\"text\":\"Tiddler editor background for even fields\"},\"$:/language/Docs/PaletteColours/tiddler-editor-fields-odd\":{\"title\":\"$:/language/Docs/PaletteColours/tiddler-editor-fields-odd\",\"text\":\"Tiddler editor background for odd fields\"},\"$:/language/Docs/PaletteColours/tiddler-info-background\":{\"title\":\"$:/language/Docs/PaletteColours/tiddler-info-background\",\"text\":\"Tiddler info panel background\"},\"$:/language/Docs/PaletteColours/tiddler-info-border\":{\"title\":\"$:/language/Docs/PaletteColours/tiddler-info-border\",\"text\":\"Tiddler info panel border\"},\"$:/language/Docs/PaletteColours/tiddler-info-tab-background\":{\"title\":\"$:/language/Docs/PaletteColours/tiddler-info-tab-background\",\"text\":\"Tiddler info panel tab background\"},\"$:/language/Docs/PaletteColours/tiddler-link-background\":{\"title\":\"$:/language/Docs/PaletteColours/tiddler-link-background\",\"text\":\"Tiddler link background\"},\"$:/language/Docs/PaletteColours/tiddler-link-foreground\":{\"title\":\"$:/language/Docs/PaletteColours/tiddler-link-foreground\",\"text\":\"Tiddler link foreground\"},\"$:/language/Docs/PaletteColours/tiddler-subtitle-foreground\":{\"title\":\"$:/language/Docs/PaletteColours/tiddler-subtitle-foreground\",\"text\":\"Tiddler subtitle foreground\"},\"$:/language/Docs/PaletteColours/tiddler-title-foreground\":{\"title\":\"$:/language/Docs/PaletteColours/tiddler-title-foreground\",\"text\":\"Tiddler title foreground\"},\"$:/language/Docs/PaletteColours/toolbar-new-button\":{\"title\":\"$:/language/Docs/PaletteColours/toolbar-new-button\",\"text\":\"Toolbar 'new tiddler' button foreground\"},\"$:/language/Docs/PaletteColours/toolbar-options-button\":{\"title\":\"$:/language/Docs/PaletteColours/toolbar-options-button\",\"text\":\"Toolbar 'options' button foreground\"},\"$:/language/Docs/PaletteColours/toolbar-save-button\":{\"title\":\"$:/language/Docs/PaletteColours/toolbar-save-button\",\"text\":\"Toolbar 'save' button foreground\"},\"$:/language/Docs/PaletteColours/toolbar-info-button\":{\"title\":\"$:/language/Docs/PaletteColours/toolbar-info-button\",\"text\":\"Toolbar 'info' button foreground\"},\"$:/language/Docs/PaletteColours/toolbar-edit-button\":{\"title\":\"$:/language/Docs/PaletteColours/toolbar-edit-button\",\"text\":\"Toolbar 'edit' button foreground\"},\"$:/language/Docs/PaletteColours/toolbar-close-button\":{\"title\":\"$:/language/Docs/PaletteColours/toolbar-close-button\",\"text\":\"Toolbar 'close' button foreground\"},\"$:/language/Docs/PaletteColours/toolbar-delete-button\":{\"title\":\"$:/language/Docs/PaletteColours/toolbar-delete-button\",\"text\":\"Toolbar 'delete' button foreground\"},\"$:/language/Docs/PaletteColours/toolbar-cancel-button\":{\"title\":\"$:/language/Docs/PaletteColours/toolbar-cancel-button\",\"text\":\"Toolbar 'cancel' button foreground\"},\"$:/language/Docs/PaletteColours/toolbar-done-button\":{\"title\":\"$:/language/Docs/PaletteColours/toolbar-done-button\",\"text\":\"Toolbar 'done' button foreground\"},\"$:/language/Docs/PaletteColours/untagged-background\":{\"title\":\"$:/language/Docs/PaletteColours/untagged-background\",\"text\":\"Untagged pill background\"},\"$:/language/Docs/PaletteColours/very-muted-foreground\":{\"title\":\"$:/language/Docs/PaletteColours/very-muted-foreground\",\"text\":\"Very muted foreground\"},\"$:/language/EditTemplate/Caption\":{\"title\":\"$:/language/EditTemplate/Caption\",\"text\":\"Editor\"},\"$:/language/EditTemplate/Body/External/Hint\":{\"title\":\"$:/language/EditTemplate/Body/External/Hint\",\"text\":\"This tiddler shows content stored outside of the main TiddlyWiki file. You can edit the tags and fields but cannot directly edit the content itself\"},\"$:/language/EditTemplate/Body/Placeholder\":{\"title\":\"$:/language/EditTemplate/Body/Placeholder\",\"text\":\"Type the text for this tiddler\"},\"$:/language/EditTemplate/Body/Preview/Type/Output\":{\"title\":\"$:/language/EditTemplate/Body/Preview/Type/Output\",\"text\":\"output\"},\"$:/language/EditTemplate/Body/Preview/Type/DiffShadow\":{\"title\":\"$:/language/EditTemplate/Body/Preview/Type/DiffShadow\",\"text\":\"differences from shadow (if any)\"},\"$:/language/EditTemplate/Body/Preview/Type/DiffCurrent\":{\"title\":\"$:/language/EditTemplate/Body/Preview/Type/DiffCurrent\",\"text\":\"differences from current\"},\"$:/language/EditTemplate/Field/Remove/Caption\":{\"title\":\"$:/language/EditTemplate/Field/Remove/Caption\",\"text\":\"remove field\"}
2731,\"$:/language/EditTemplate/Field/Remove/Hint\":{\"title\":\"$:/language/EditTemplate/Field/Remove/Hint\",\"text\":\"Remove field\"},\"$:/language/EditTemplate/Field/Dropdown/Caption\":{\"title\":\"$:/language/EditTemplate/Field/Dropdown/Caption\",\"text\":\"field list\"},\"$:/language/EditTemplate/Field/Dropdown/Hint\":{\"title\":\"$:/language/EditTemplate/Field/Dropdown/Hint\",\"text\":\"Show field list\"},\"$:/language/EditTemplate/Fields/Add/Button\":{\"title\":\"$:/language/EditTemplate/Fields/Add/Button\",\"text\":\"add\"},\"$:/language/EditTemplate/Fields/Add/Button/Hint\":{\"title\":\"$:/language/EditTemplate/Fields/Add/Button/Hint\",\"text\":\"Add the new field to the tiddler\"},\"$:/language/EditTemplate/Fields/Add/Name/Placeholder\":{\"title\":\"$:/language/EditTemplate/Fields/Add/Name/Placeholder\",\"text\":\"field name\"},\"$:/language/EditTemplate/Fields/Add/Prompt\":{\"title\":\"$:/language/EditTemplate/Fields/Add/Prompt\",\"text\":\"Add a new field:\"},\"$:/language/EditTemplate/Fields/Add/Value/Placeholder\":{\"title\":\"$:/language/EditTemplate/Fields/Add/Value/Placeholder\",\"text\":\"field value\"},\"$:/language/EditTemplate/Fields/Add/Dropdown/System\":{\"title\":\"$:/language/EditTemplate/Fields/Add/Dropdown/System\",\"text\":\"System fields\"},\"$:/language/EditTemplate/Fields/Add/Dropdown/User\":{\"title\":\"$:/language/EditTemplate/Fields/Add/Dropdown/User\",\"text\":\"User fields\"},\"$:/language/EditTemplate/Shadow/Warning\":{\"title\":\"$:/language/EditTemplate/Shadow/Warning\",\"text\":\"This is a shadow tiddler. Any changes you make will override the default version from the plugin \u003C\u003CpluginLink>>\"},\"$:/language/EditTemplate/Shadow/OverriddenWarning\":{\"title\":\"$:/language/EditTemplate/Shadow/OverriddenWarning\",\"text\":\"This is a modified shadow tiddler. You can revert to the default version in the plugin \u003C\u003CpluginLink>> by deleting this tiddler\"},\"$:/language/EditTemplate/Tags/Add/Button\":{\"title\":\"$:/language/EditTemplate/Tags/Add/Button\",\"text\":\"add\"},\"$:/language/EditTemplate/Tags/Add/Button/Hint\":{\"title\":\"$:/language/EditTemplate/Tags/Add/Button/Hint\",\"text\":\"add tag\"},\"$:/language/EditTemplate/Tags/Add/Placeholder\":{\"title\":\"$:/language/EditTemplate/Tags/Add/Placeholder\",\"text\":\"tag name\"},\"$:/language/EditTemplate/Tags/ClearInput/Caption\":{\"title\":\"$:/language/EditTemplate/Tags/ClearInput/Caption\",\"text\":\"clear input\"},\"$:/language/EditTemplate/Tags/ClearInput/Hint\":{\"title\":\"$:/language/EditTemplate/Tags/ClearInput/Hint\",\"text\":\"Clear tag input\"},\"$:/language/EditTemplate/Tags/Dropdown/Caption\":{\"title\":\"$:/language/EditTemplate/Tags/Dropdown/Caption\",\"text\":\"tag list\"},\"$:/language/EditTemplate/Tags/Dropdown/Hint\":{\"title\":\"$:/language/EditTemplate/Tags/Dropdown/Hint\",\"text\":\"Show tag list\"},\"$:/language/EditTemplate/Title/BadCharacterWarning\":{\"title\":\"$:/language/EditTemplate/Title/BadCharacterWarning\",\"text\":\"Warning: avoid using any of the characters \u003C\u003Cbad-chars>> in tiddler titles\"},\"$:/language/EditTemplate/Title/Exists/Prompt\":{\"title\":\"$:/language/EditTemplate/Title/Exists/Prompt\",\"text\":\"Target tiddler already exists\"},\"$:/language/EditTemplate/Title/Relink/Prompt\":{\"title\":\"$:/language/EditTemplate/Title/Relink/Prompt\",\"text\":\"Update ''\u003C$text text=\u003C\u003CfromTitle>>/>'' to ''\u003C$text text=\u003C\u003CtoTitle>>/>'' in the //tags// and //list// fields of other tiddlers\"},\"$:/language/EditTemplate/Title/References/Prompt\":{\"title\":\"$:/language/EditTemplate/Title/References/Prompt\",\"text\":\"The following references to this tiddler will not be automatically updated:\"},\"$:/language/EditTemplate/Type/Dropdown/Caption\":{\"title\":\"$:/language/EditTemplate/Type/Dropdown/Caption\",\"text\":\"content type list\"},\"$:/language/EditTemplate/Type/Dropdown/Hint\":{\"title\":\"$:/language/EditTemplate/Type/Dropdown/Hint\",\"text\":\"Show content type list\"},\"$:/language/EditTemplate/Type/Delete/Caption\":{\"title\":\"$:/language/EditTemplate/Type/Delete/Caption\",\"text\":\"delete content type\"}
2731,\"$:/language/EditTemplate/Type/Delete/Hint\":{\"title\":\"$:/language/EditTemplate/Type/Delete/Hint\",\"text\":\"Delete content type\"},\"$:/language/EditTemplate/Type/Placeholder\":{\"title\":\"$:/language/EditTemplate/Type/Placeholder\",\"text\":\"content type\"},\"$:/language/EditTemplate/Type/Prompt\":{\"title\":\"$:/language/EditTemplate/Type/Prompt\",\"text\":\"Type:\"},\"$:/language/Exporters/StaticRiver\":{\"title\":\"$:/language/Exporters/StaticRiver\",\"text\":\"Static HTML\"},\"$:/language/Exporters/JsonFile\":{\"title\":\"$:/language/Exporters/JsonFile\",\"text\":\"JSON file\"},\"$:/language/Exporters/CsvFile\":{\"title\":\"$:/language/Exporters/CsvFile\",\"text\":\"CSV file\"},\"$:/language/Exporters/TidFile\":{\"title\":\"$:/language/Exporters/TidFile\",\"text\":\"\\\".tid\\\" file\"},\"$:/language/Docs/Fields/_canonical_uri\":{\"title\":\"$:/language/Docs/Fields/_canonical_uri\",\"text\":\"The full URI of an external image tiddler\"},\"$:/language/Docs/Fields/author\":{\"title\":\"$:/language/Docs/Fields/author\",\"text\":\"Name of the author of a plugin\"},\"$:/language/Docs/Fields/bag\":{\"title\":\"$:/language/Docs/Fields/bag\",\"text\":\"The name of the bag from which a tiddler came\"},\"$:/language/Docs/Fields/caption\":{\"title\":\"$:/language/Docs/Fields/caption\",\"text\":\"The text to be displayed on a tab or button\"},\"$:/language/Docs/Fields/code-body\":{\"title\":\"$:/language/Docs/Fields/code-body\",\"text\":\"The view template will display the tiddler as code if set to ''yes''\"},\"$:/language/Docs/Fields/color\":{\"title\":\"$:/language/Docs/Fields/color\",\"text\":\"The CSS color value associated with a tiddler\"},\"$:/language/Docs/Fields/component\":{\"title\":\"$:/language/Docs/Fields/component\",\"text\":\"The name of the component responsible for an [[alert tiddler|AlertMechanism]]\"},\"$:/language/Docs/Fields/core-version\":{\"title\":\"$:/language/Docs/Fields/core-version\",\"text\":\"For a plugin, indicates what version of TiddlyWiki with which it is compatible\"},\"$:/language/Docs/Fields/current-tiddler\":{\"title\":\"$:/language/Docs/Fields/current-tiddler\",\"text\":\"Used to cache the top tiddler in a [[history list|HistoryMechanism]]\"},\"$:/language/Docs/Fields/created\":{\"title\":\"$:/language/Docs/Fields/created\",\"text\":\"The date a tiddler was created\"},\"$:/language/Docs/Fields/creator\":{\"title\":\"$:/language/Docs/Fields/creator\",\"text\":\"The name of the person who created a tiddler\"},\"$:/language/Docs/Fields/dependents\":{\"title\":\"$:/language/Docs/Fields/dependents\",\"text\":\"For a plugin, lists the dependent plugin titles\"},\"$:/language/Docs/Fields/description\":{\"title\":\"$:/language/Docs/Fields/description\",\"text\":\"The descriptive text for a plugin, or a modal dialogue\"},\"$:/language/Docs/Fields/draft.of\":{\"title\":\"$:/language/Docs/Fields/draft.of\",\"text\":\"For draft tiddlers, contains the title of the tiddler of which this is a draft\"},\"$:/language/Docs/Fields/draft.title\":{\"title\":\"$:/language/Docs/Fields/draft.title\",\"text\":\"For draft tiddlers, contains the proposed new title of the tiddler\"},\"$:/language/Docs/Fields/footer\":{\"title\":\"$:/language/Docs/Fields/footer\",\"text\":\"The footer text for a modal\"},\"$:/language/Docs/Fields/hide-body\":{\"title\":\"$:/language/Docs/Fields/hide-body\",\"text\":\"The view template will hide bodies of tiddlers if set to ''yes''\"},\"$:/language/Docs/Fields/icon\":{\"title\":\"$:/language/Docs/Fields/icon\",\"text\":\"The title of the tiddler containing the icon associated with a tiddler\"},\"$:/language/Docs/Fields/library\":{\"title\":\"$:/language/Docs/Fields/library\",\"text\":\"Indicates that a tiddler should be saved as a JavaScript library if set to ''yes''\"},\"$:/language/Docs/Fields/list\":{\"title\":\"$:/language/Docs/Fields/list\",\"text\":\"An ordered list of tiddler titles associated with a tiddler\"},\"$:/language/Docs/Fields/list-before\":{\"title\":\"$:/language/Docs/Fields/list-before\",\"text\":\"If set, the title of a tiddler before which this tiddler should be added to the ordered list of tiddler titles, or at the start of the list if this field is present but empty\"},\"$:/language/Docs/Fields/list-after\":{\"title\":\"$:/language/Docs/Fields/list-after\",\"text\":\"If set, the title of the tiddler after which this tiddler should be added to the ordered list of tiddler titles, or at the end of the list if this field is present but empty\"},\"$:/language/Docs/Fields/modified\":{\"title\":\"$:/language/Docs/Fields/modified\",\"text\":\"The date and time at which a tiddler was last modified\"},\"$:/language/Docs/Fields/modifier\":{\"title\":\"$:/language/Docs/Fields/modifier\",\"text\":\"The tiddler title associated with the person who last modified a tiddler\"},\"$:/language/Docs/Fields/module-type\":{\"title\":\"$:/language/Docs/Fields/module-type\",\"text\":\"For javascript tid
2731dlers, specifies what kind of module it is\"},\"$:/language/Docs/Fields/name\":{\"title\":\"$:/language/Docs/Fields/name\",\"text\":\"The human readable name associated with a plugin tiddler\"},\"$:/language/Docs/Fields/parent-plugin\":{\"title\":\"$:/language/Docs/Fields/parent-plugin\",\"text\":\"For a plugin, specifies which plugin of which it is a sub-plugin\"},\"$:/language/Docs/Fields/plugin-priority\":{\"title\":\"$:/language/Docs/Fields/plugin-priority\",\"text\":\"A numerical value indicating the priority of a plugin tiddler\"},\"$:/language/Docs/Fields/plugin-type\":{\"title\":\"$:/language/Docs/Fields/plugin-type\",\"text\":\"The type of plugin in a plugin tiddler\"},\"$:/language/Docs/Fields/revision\":{\"title\":\"$:/language/Docs/Fields/revision\",\"text\":\"The revision of the tiddler held at the server\"},\"$:/language/Docs/Fields/released\":{\"title\":\"$:/language/Docs/Fields/released\",\"text\":\"Date of a TiddlyWiki release\"},\"$:/language/Docs/Fields/source\":{\"title\":\"$:/language/Docs/Fields/source\",\"text\":\"The source URL associated with a tiddler\"},\"$:/language/Docs/Fields/subtitle\":{\"title\":\"$:/language/Docs/Fields/subtitle\",\"text\":\"The subtitle text for a modal\"},\"$:/language/Docs/Fields/tags\":{\"title\":\"$:/language/Docs/Fields/tags\",\"text\":\"A list of tags associated with a tiddler\"},\"$:/language/Docs/Fields/text\":{\"title\":\"$:/language/Docs/Fields/text\",\"text\":\"The body text of a tiddler\"},\"$:/language/Docs/Fields/throttle.refresh\":{\"title\":\"$:/language/Docs/Fields/throttle.refresh\",\"text\":\"If present, throttles refreshes of this tiddler\"},\"$:/language/Docs/Fields/title\":{\"title\":\"$:/language/Docs/Fields/title\",\"text\":\"The unique name of a tiddler\"},\"$:/language/Docs/Fields/toc-link\":{\"title\":\"$:/language/Docs/Fields/toc-link\",\"text\":\"Suppresses the tiddler's link in a Table of Contents tree if set to ''no''\"},\"$:/language/Docs/Fields/type\":{\"title\":\"$:/language/Docs/Fields/type\",\"text\":\"The content type of a tiddler\"},\"$:/language/Docs/Fields/version\":{\"title\":\"$:/language/Docs/Fields/version\",\"text\":\"Version information for a plugin\"},\"$:/language/Docs/Fields/_is_skinny\":{\"title\":\"$:/language/Docs/Fields/_is_skinny\",\"text\":\"If present, indicates that the tiddler text field must be loaded from the server\"},\"$:/language/Filters/AllTiddlers\":{\"title\":\"$:/language/Filters/AllTiddlers\",\"text\":\"All tiddlers except system tiddlers\"},\"$:/language/Filters/RecentSystemTiddlers\":{\"title\":\"$:/language/Filters/RecentSystemTiddlers\",\"text\":\"Recently modified tiddlers, including system tiddlers\"},\"$:/language/Filters/RecentTiddlers\":{\"title\":\"$:/language/Filters/RecentTiddlers\",\"text\":\"Recently modified tiddlers\"},\"$:/language/Filters/AllTags\":{\"title\":\"$:/language/Filters/AllTags\",\"text\":\"All tags except system tags\"},\"$:/language/Filters/Missing\":{\"title\":\"$:/language/Filters/Missing\",\"text\":\"Missing tiddlers\"},\"$:/language/Filters/Drafts\":{\"title\":\"$:/language/Filters/Drafts\",\"text\":\"Draft tiddlers\"},\"$:/language/Filters/Orphans\":{\"title\":\"$:/language/Filters/Orphans\",\"text\":\"Orphan tiddlers\"},\"$:/language/Filters/SystemTiddlers\":{\"title\":\"$:/language/Filters/SystemTiddlers\",\"text\":\"System tiddlers\"},\"$:/language/Filters/ShadowTiddlers\":{\"title\":\"$:/language/Filters/ShadowTiddlers\",\"text\":\"Shadow tiddlers\"},\"$:/language/Filters/OverriddenShadowTiddlers\":{\"title\":\"$:/language/Filters/OverriddenShadowTiddlers\",\"text\":\"Overridden shadow tiddlers\"},\"$:/language/Filters/SessionTiddlers\":{\"title\":\"$:/language/Filters/SessionTiddlers\",\"text\":\"Tiddlers modified since the wiki was loaded\"},\"$:/language/Filters/SystemTags\":{\"title\":\"$:/language/Filters/SystemTags\",\"text\":\"System tags\"},\"$:/language/Filters/StoryList\":{\"title\":\"$:/language/Filters/StoryList\",\"text\":\"Tiddlers in the story river, excluding \u003C$text text=\\\"$:/AdvancedSearch\\\"/>\"},\"$:/language/Filters/TypedTiddlers\":{\"title\":\"$:/language/Filters/TypedTiddlers\",\"text\":\"Non wiki-text tiddlers\"},\"GettingStarted\":{\"title\":\"GettingStarted\",\"text\":\"\\\\define lingo-base() $:/language/ControlPanel/Basics/\\nWelcome to ~TiddlyWiki and the ~TiddlyWiki community\\n\\nBefore you start storing important information in ~TiddlyWiki it is vital to make sure that you can reliably save changes. See https://tiddlywiki.com/#GettingStarted for details\\n\\n!! Set up this ~TiddlyWiki\\n\\n\u003Cdiv class=\\\"tc-control-panel\\\">\\n\\n|tc-table-no-border tc-first-col-min-width tc-first-link-nowrap|k\\n| \u003C$link to=\\\"$:/SiteTitle\\\">\u003C\u003Clingo Title/Prompt>>\u003C/$link>|\u003C$edit-text tiddler=\\\"$:/SiteTitle\\\" default=\\\"\\\" tag=\\\"input\\\"/> |\\n| \u003C$link to=\\\"$:/SiteSubtitle\\\">\u003C\u003Clingo Subtitle/Prompt>>\u003C/$link>|\u003C$edit-text tiddler=\\\"$:/SiteSubtitle\\\" default=\\\"\\\" tag=\\\"input\\\"/> |\\n|^ \u003C$link to=\\\"$:/DefaultTiddlers\\\">\u003C\u003Clingo DefaultTiddlers/Prompt>>\u003C/$link>\u003Cbr>\u003C\u003Clingo DefaultTiddlers/TopHint>>|\u003C$edit tag=\\\"textarea\\\" tiddler=\\\"$:/DefaultTiddlers\\\"/>\u003Cbr>//\u003C\u003Clingo DefaultTiddlers/BottomHint>>// |\\n\u003C/div>\\n\\nSee the [[control panel|$:/ControlPanel]] for more options.\\n\"},\"$:/language/Help/build\":{\"title\":\"$:/language/Help/build\",\"description\":\"Automatically run configured commands\",\"text\":\"Build the specified build targets for the current wiki. If no build targets are specified then all available targets will be built.\\n\\n```\\n--build \u003Ctarget> [\u003Ctarget> ...]\\n```\\n\\nBuild targets are defined in the `tiddlywiki.info` file of a wiki folder.\\n\\n\"},\"$:/language/Help/clearpassword\":{\"title\":\"$:/language/Help/clearpassword\",\"description\":\"Clear a password for subsequent crypto operations\",\"text\":\"Clear the password for subsequent crypto operations\\n\\n```\\n--clearpassword\\n```\\n\"},\"$:/language/Help/commands\":{\"title\":\"$:/language/Help/commands\",\"description\":\"Run commands returned from a filter\",\"text\":\"Sequentially run the command tokens returned from a filter\\n\\n```\\n--commands \u003Cfilter>\\n```\\n\\nExamples\\n\\n```\\n--commands \\\"[enlist{$:/build-commands-as-text}]\\\"\\n```\\n\\n```\\n--commands \\\"[{$:/build-commands-as-json}
2731jsonindexes[]] :map[{$:/build-commands-as-json}jsonget\u003CcurrentTiddler>]\\\"\\n```\\n\"},\"$:/language/Help/default\":{\"title\":\"$:/language/Help/default\",\"text\":\"\\\\define commandTitle()\\n$:/language/Help/$(command)$\\n\\\\end\\n\\\\whitespace trim\\n```\\nusage: tiddlywiki [\u003Cwikifolder>] [--\u003Ccommand> [\u003Cargs>...]...]\\n```\\n\\nAvailable commands:\\n\\n\u003Cul>\\n\u003C$list filter=\\\"[commands[]sort[title]]\\\" variable=\\\"command\\\">\\n\u003Cli>\u003C$link to=\u003C\u003CcommandTitle>>>\u003C$macrocall $name=\\\"command\\\" $type=\\\"text/plain\\\" $output=\\\"text/plain\\\"/>\u003C/$link>:\\n&#32;\\n\u003C$transclude tiddler=\u003C\u003CcommandTitle>> field=\\\"description\\\"/>\u003C/li>\\n\u003C/$list>\\n\u003C/ul>\\n\\nTo get detailed help on a command:\\n\\n```\\ntiddlywiki --help \u003Ccommand>\\n```\\n\"},\"$:/language/Help/deletetiddlers\":{\"title\":\"$:/language/Help/deletetiddlers\",\"description\":\"Deletes a group of tiddlers\",\"text\":\"\u003C\u003C.from-version \\\"5.1.20\\\">> Deletes a group of tiddlers identified by a filter.\\n\\n```\\n--deletetiddlers \u003Cfilter>\\n```\\n\"},\"$:/language/Help/editions\":{\"title\":\"$:/language/Help/editions\",\"description\":\"Lists the available editions of TiddlyWiki\",\"text\":\"Lists the names and descriptions of the available editions. You can create a new wiki of a specified edition with the `--init` command.\\n\\n```\\n--editions\\n```\\n\"},\"$:/language/Help/fetch\":{\"title\":\"$:/language/Help/fetch\",\"description\":\"Fetch tiddlers from wiki by URL\",\"text\":\"Fetch one or more files over HTTP/HTTPS, and import the tiddlers matching a filter, optionally transforming the incoming titles.\\n\\n```\\n--fetch file \u003Curl> \u003Cimport-filter> \u003Ctransform-filter>\\n--fetch files \u003Curl-filter> \u003Cimport-filter> \u003Ctransform-filter>\\n--fetch raw-file \u003Curl> \u003Ctransform-filter>\\n--fetch raw-files \u003Curl-filter> \u003Ctransform-filter>\\n```\\n\\nThe \\\"file\\\" and \\\"files\\\" variants fetch the specified files and attempt to import the tiddlers within them (the same processing as if the files were dragged into the browser window). The \\\"raw-file\\\" and \\\"raw-files\\\" variants fetch the specified files and then store the raw file data in tiddlers, without applying the import logic.\\n\\nWith the \\\"file\\\" and \\\"raw-file\\\" variants only a single file is fetched and the first parameter is the URL of the file to read.\\n\\nWith the \\\"files\\\" and \\\"raw-files\\\" variants, multiple files are fetched and the first parameter is a filter yielding a list of URLs of the files to read. For example, given a set of tiddlers tagged \\\"remote-server\\\" that have a field \\\"url\\\" the filter `[tag[remote-server]get[url]]` will retrieve all the available URLs.\\n\\nFor the \\\"file\\\" and \\\"files\\\" variants, the `\u003Cimport-filter>` parameter specifies a filter determining which tiddlers are imported. It defaults to `[all[tiddlers]]` if not provided.\\n\\nFor all variants, the `\u003Ctransform-filter>` parameter specifies an optional filter that transforms the titles of the imported tiddlers. For example, `[addprefix[$:/myimports/]]` would add the prefix `$:/myimports/` to each title.\\n\\nPreceding the `--fetch` command with `--verbose` will output progress information during the import.\\n\\nNote that TiddlyWiki will not fetch an older version of an already loaded plugin.\\n\\nThe following example retrieves all the non-system tiddlers from https://tiddlywiki.com and saves them to a JSON file:\\n\\n```\\ntiddlywiki --verbose --fetch file \\\"https://tiddlywiki.com/\\\" \\\"[!is[system]]\\\" \\\"\\\" --rendertiddler \\\"$:/core/templates/exporters/JsonFile\\\" output.json text/plain \\\"\\\" exportFilter \\\"[!is[system]]\\\"\\n```\\n\\nThe following example retrieves the \\\"favicon\\\" file from tiddlywiki.com and saves it in a file called \\\"output.ico\\\". Note that the intermediate tiddler \\\"Icon Tiddler\\\" is quoted in the \\\"--fetch\\\" command because it is being used as a transformation filter to replace the default title, while there are no quotes for the \\\"--savetiddler\\\" command because it is being used directly as a title.\\n\\n```\\ntiddlywiki --verbose --fetch raw-file \\\"https://tiddlywiki.com/favicon.ico\\\" \\\"[[Icon Tiddler]]\\\" --savetiddler \\\"Icon Tiddler\\\" output.ico\\n```\\n\\n\"},\"$:/language/Help/help\":{\"title\":\"$:/language/Help/help\",\"description\":\"Display help for TiddlyWiki commands\",\"text\":\"Displays help text for a command:\\n\\n```\\n--help [\u003Ccommand>]\\n```\\n\\nIf the command name is omitted then a list of available commands is displayed.\\n\"},\"$:/language/Help/import\":{\"title\":\"$:/language/Help/import\",\"description\":\"Import tiddlers from a file\",\"text\":\"Import tiddlers from TiddlyWiki (`.html`), `.tiddler`, `.tid`, `.json` or other local files. The deserializer must be explicitly specified, unlike the `load` command which infers the deserializer from the file extension.\\n\\n```\\n--import \u003Cfilepath> \u003Cdeserializer> [\u003Ctitle>] [\u003Cencoding>]\\n```\\n\\nThe deserializers in the core include:\\n\\n* application/javascript\\n* application/json\\n* application/x-tiddler\\n* application/x-tiddler-html-div\\n* application/x-tiddlers\\n* text/html\\n* text/plain\\n\\nThe title of the imported tiddler defaults to the filename.\\n\\nThe encoding defaults to \\\"utf8\\\", but can be \\\"base64\\\" for importing binary files.\\n\\nNote that TiddlyWiki will not import an older version of an already loaded plugin.\\n\"},\"$:/language/Help/init\":{\"title\":\"$:/language/Help/init\",\"description\":\"Initialise a new wiki folder\",\"text\":\"Initialise an empty [[WikiFolder|WikiFolders]] with a copy of the specified edition.\\n\\n```\\n--init \u003Cedition> [\u003Cedition> ...]\\n```\\n\\nFor example:\\n\\n```\\ntiddlywiki ./MyWikiFolder --init empty\\n```\\n\\nNote:\\n\\n* The wiki folder directory will be created if necessary\\n* The \\\"edition\\\" defaults to ''empty''\\n* The init command will fail if the wiki folder is not empty\\n* The init command removes any `includeWikis` definitions in the edition's `tiddlywiki.info` file\\n* When multiple editions are specified, editions initialised later will over
2731write any files shared with earlier editions (so, the final `tiddlywiki.info` file will be copied from the last edition)\\n* `--editions` returns a list of available editions\\n\"},\"$:/language/Help/listen\":{\"title\":\"$:/language/Help/listen\",\"description\":\"Provides an HTTP server interface to TiddlyWiki\",\"text\":\"Serves a wiki over HTTP.\\n\\nThe listen command uses NamedCommandParameters:\\n\\n```\\n--listen [\u003Cname>=\u003Cvalue>]...\\n```\\n\\nAll parameters are optional with safe defaults, and can be specified in any order. The recognised parameters are:\\n\\n* ''host'' - optional hostname to serve from (defaults to \\\"127.0.0.1\\\" aka \\\"localhost\\\")\\n* ''path-prefix'' - optional prefix for paths\\n* ''port'' - port number on which to listen; non-numeric values are interpreted as a system environment variable from which the port number is extracted (defaults to \\\"8080\\\")\\n* ''credentials'' - pathname of credentials CSV file (relative to wiki folder)\\n* ''anon-username'' - the username for signing edits for anonymous users\\n* ''username'' - optional username for basic authentication\\n* ''password'' - optional password for basic authentication\\n* ''authenticated-user-header'' - optional name of request header to be used for trusted authentication.\\n* ''readers'' - comma-separated list of principals allowed to read from this wiki\\n* ''writers'' - comma-separated list of principals allowed to write to this wiki\\n* ''csrf-disable'' - set to \\\"yes\\\" to disable CSRF checks (defaults to \\\"no\\\")\\n* ''root-tiddler'' - the tiddler to serve at the root (defaults to \\\"$:/core/save/all\\\")\\n* ''root-render-type'' - the content type to which the root tiddler should be rendered (defaults to \\\"text/plain\\\")\\n* ''root-serve-type'' - the content type with which the root tiddler should be served (defaults to \\\"text/html\\\")\\n* ''tls-cert'' - pathname of TLS certificate file (relative to wiki folder)\\n* ''tls-key'' - pathname of TLS key file (relative to wiki folder)\\n* ''debug-level'' - optional debug level; set to \\\"debug\\\" to view request details (defaults to \\\"none\\\")\\n* ''gzip'' - set to \\\"yes\\\" to enable gzip compression for some http endpoints (defaults to \\\"no\\\")\\n* ''use-browser-cache'' - set to \\\"yes\\\" to allow the browser to cache responses to save bandwidth (defaults to \\\"no\\\")\\n\\nFor information on opening up your instance to the entire local network, and possible security concerns, see the WebServer tiddler at TiddlyWiki.com.\\n\\n\"},\"$:/language/Help/load\":{\"title\":\"$:/language/Help/load\",\"description\":\"Load tiddlers from a file\",\"text\":\"Load tiddlers from TiddlyWiki (`.html`), `.tiddler`, `.tid`, `.json` or other local files. The processing applied to incoming files is determined by the file extension. Use the alternative `import` command if you need to specify the deserializer and encoding explicitly.\\n\\n```\\n--load \u003Cfilepath> [noerror]\\n--load \u003Cdirpath> [noerror]\\n```\\n\\nBy default, the load command raises an error if no tiddlers are found. The error can be suppressed by providing the optional \\\"noerror\\\" parameter.\\n\\nTo load tiddlers from an encrypted TiddlyWiki file you should first specify the password with the PasswordCommand. For example:\\n\\n```\\ntiddlywiki ./MyWiki --password pa55w0rd --load my_encrypted_wiki.html\\n```\\n\\nNote that TiddlyWiki will not load an older version of an already loaded plugin.\\n\"},\"$:/language/Help/makelibrary\":{\"title\":\"$:/language/Help/makelibrary\",\"description\":\"Construct library plugin required by upgrade process\",\"text\":\"Constructs the `$:/UpgradeLibrary` tiddler for the upgrade process.\\n\\nThe upgrade library is formatted as an ordinary plugin tiddler with the plugin type `library`. It contains a copy of each of the plugins, themes and language packs available within the TiddlyWiki5 repository.\\n\\nThis command is intended for internal use; it is only relevant to users constructing a custom upgrade procedure.\\n\\n```\\n--makelibrary \u003Ctitle>\\n```\\n\\nThe title argument defaults to `$:/UpgradeLibrary`.\\n\"},\"$:/language/Help/notfound\":{\"title\":\"$:/language/Help/notfound\",\"text\":\"No such help item\"},\"$:/language/Help/output\":{\"title\":\"$:/language/Help/output\",\"description\":\"Set the base output directory for subsequent commands\",\"text\":\"Sets the base output directory for subsequent commands. The default output directory is the `output` subdirectory of the edition directory.\\n\\n```\\n--output \u003Cpathname>\\n```\\n\\nIf the specified pathname is relative then it is resolved relative to the current working directory. For example `--output .` sets the output directory to the current working directory.\\n\\n\"},\"$:/language/Help/password\":{\"title\":\"$:/language/Help/password\",\"description\":\"Set a password for subsequent crypto operations\",\"text\":\"Set a password for subsequent crypto operations\\n\\n```\\n--password \u003Cpassword>\\n```\\n\\n''Note'': This should not be used for serving TiddlyWiki with password protection. Instead, see the password o
2731ption under the [[ServerCommand]].\\n\"},\"$:/language/Help/render\":{\"title\":\"$:/language/Help/render\",\"description\":\"Renders individual tiddlers to files\",\"text\":\"Render individual tiddlers identified by a filter and save the results to the specified files.\\n\\nOptionally, the title of a template tiddler can be specified. In this case, instead of directly rendering each tiddler, the template tiddler is rendered with the \\\"currentTiddler\\\" variable set to the title of the tiddler that is being rendered.\\n\\nA name and value for an additional variable may optionally also be specified.\\n\\n```\\n--render \u003Ctiddler-filter> [\u003Cfilename-filter>] [\u003Crender-type>] [\u003Ctemplate>] [ [\u003Cname>] [\u003Cvalue>] ]*\\n```\\n\\n* ''tiddler-filter'': A filter identifying the tiddler(s) to be rendered\\n* ''filename-filter'': Optional filter transforming tiddler titles into pathnames. If omitted, defaults to `[is[tiddler]addsuffix[.html]]`, which uses the unchanged tiddler title as the filename\\n* ''render-type'': Optional render type: `text/html` (the default) returns the full HTML text and `text/plain` just returns the text content (ie it ignores HTML tags and other unprintable material)\\n* ''template'': Optional template through which each tiddler is rendered\\n* ''name'': Name of optional variables\\n* ''value'': Value of optional variables\\n\\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\\n\\nNotes:\\n\\n* The output directory is not cleared of any existing files\\n* Any missing directories in the path to the filename are automatically created.\\n* When referring to a tiddler with spaces in its title, take care to use both the quotes required by your shell and also TiddlyWiki's double square brackets: `--render \\\"[[Motovun Jack.jpg]]\\\"`\\n* The filename filter is evaluated with the selected items being set to the title of the tiddler currently being rendered, allowing the title to be used as the basis for computing the filename. For example `[encodeuricomponent[]addprefix[static/]]` applies URI encoding to each title, and then adds the prefix `static/`\\n* Multiple ''name''/''value'' pairs can be used to pass more than one variable\\n* The `--render` command is a more flexible replacement for both the `--rendertiddler` and `--rendertiddlers` commands, which are deprecated\\n\\nExamples:\\n\\n* `--render '[!is[system]]' '[encodeuricomponent[]addprefix[tiddlers/]addsuffix[.html]]'` -- renders all non-system tiddlers as files in the subdirectory \\\"tiddlers\\\" with URL-encoded titles and the extension HTML\\n* `--render '.' 'tiddlers.json' 'text/plain' '$:/core/templates/exporters/JsonFile' 'exportFilter' '[tag[HelloThere]]'` -- renders the tiddlers tagged \\\"HelloThere\\\" to a JSON file named \\\"tiddlers.json\\\"\\n\"},\"$:/language/Help/rendertiddler\":{\"title\":\"$:/language/Help/rendertiddler\",\"description\":\"Render an individual tiddler as a specified ContentType\",\"text\":\"(Note: The `--rendertiddler` command is deprecated in favour of the new, more flexible `--render` command)\\n\\nRender an individual tiddler as a specified ContentType, defaulting to `text/html` and save it to the specified filename.\\n\\nOptionally the title of a template tiddler can be specified, in which case the template tiddler is rendered with the \\\"currentTiddler\\\" variable set to the tiddler that is being rendered (the first parameter value).\\n\\nA name and value for an additional variable may optionally also be specified.\\n\\n```\\n--rendertiddler \u003Ctitle> \u003Cfilename> [\u003Ctype>] [\u003Ctemplate>] [\u003Cname>] [\u003Cvalue>]\\n```\\n\\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\\n\\nAny missing directories in the path to the filename are automatically created.\\n\\nFor example, the following command saves all tiddlers matching the filter `[tag[done]]` to a JSON file titled `output.json` by employing the core template `$:/core/templates/exporters/JsonFile`.\\n\\n```\\n--rendertiddler \\\"$:/core/templates/exporters/JsonFile\\\" output.json text/plain \\\"\\\" exportFilter \\\"[tag[done]]\\\"\\n```\\n\"},\"$:/language/Help/rendertiddlers\":{\"title\":\"$:/language/Help/rendertiddlers\",\"description\":\"Render tiddlers matching a filter to a specified ContentType\",\"text\":\"(Note: The `--rendertiddlers` command is deprecated 
2731in favour of the new, more flexible `--render` command)\\n\\nRender a set of tiddlers matching a filter to separate files of a specified ContentType (defaults to `text/html`) and extension (defaults to `.html`).\\n\\n```\\n--rendertiddlers '\u003Cfilter>' \u003Ctemplate> \u003Cpathname> [\u003Ctype>] [\u003Cextension>] [\\\"noclean\\\"]\\n```\\n\\nFor example:\\n\\n```\\n--rendertiddlers '[!is[system]]' $:/core/templates/static.tiddler.html ./static text/plain\\n```\\n\\nBy default, the pathname is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\\n\\nAny files in the target directory are deleted unless the ''noclean'' flag is specified. The target directory is recursively created if it is missing.\\n\"},\"$:/language/Help/save\":{\"title\":\"$:/language/Help/save\",\"description\":\"Saves individual raw tiddlers to files\",\"text\":\"Saves individual tiddlers identified by a filter in their raw text or binary format to the specified files.\\n\\n```\\n--save \u003Ctiddler-filter> \u003Cfilename-filter>\\n```\\n\\n* ''tiddler-filter'': A filter identifying the tiddler(s) to be saved\\n* ''filename-filter'': Optional filter transforming tiddler titles into pathnames. If omitted, defaults to `[is[tiddler]]`, which uses the unchanged tiddler title as the filename\\n\\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\\n\\nNotes:\\n\\n* The output directory is not cleared of any existing files\\n* Any missing directories in the path to the filename are automatically created.\\n* When saving a tiddler with spaces in its title, take care to use both the quotes required by your shell and also TiddlyWiki's double square brackets: `--save \\\"[[Motovun Jack.jpg]]\\\"`\\n* The filename filter is evaluated with the selected items being set to the title of the tiddler currently being saved, allowing the title to be used as the basis for computing the filename. For example `[encodeuricomponent[]addprefix[static/]]` applies URI encoding to each title, and then adds the prefix `static/`\\n* The `--save` command is a more flexible replacement for both the `--savetiddler` and `--savetiddlers` commands, which are deprecated\\n\\nExamples:\\n\\n* `--save \\\"[!is[system]is[image]]\\\" \\\"[encodeuricomponent[]addprefix[tiddlers/]]\\\"` -- saves all non-system image tiddlers as files in the subdirectory \\\"tiddlers\\\" with URL-encoded titles\\n\"},\"$:/language/Help/savetiddler\":{\"title\":\"$:/language/Help/savetiddler\",\"description\":\"Saves a raw tiddler to a file\",\"text\":\"(Note: The `--savetiddler` command is deprecated in favour of the new, more flexible `--save` command)\\n\\nSaves an individual tiddler in its raw text or binary format to the specified filename.\\n\\n```\\n--savetiddler \u003Ctitle> \u003Cfilename>\\n```\\n\\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\\n\\nAny missing directories in the path to the filename are automatically created.\\n\"},\"$:/language/Help/savetiddlers\":{\"title\":\"$:/language/Help/savetiddlers\",\"description\":\"Saves a group of raw tiddlers to a directory\",\"text\":\"(Note: The `--savetiddlers` command is deprecated in favour of the new, more flexible `--save` command)\\n\\nSaves a group of tiddlers in their raw text or binary format to the specified directory.\\n\\n```\\n--savetiddlers \u003Cfilter> \u003Cpathname> [\\\"noclean\\\"]\\n```\\n\\nBy default, the pathname is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\\n\\nThe output directory is cleared of existing files before saving the specified files. The deletion can be disabled by specifying the ''noclean'' flag.\\n\\nAny missing directories in the pathname are automatically created.\\n\"},\"$:/language/Help/savewikifolder\":{\"title\":\"$:/language/Help/savewikifolder\",\"description\":\"Saves a wiki to a new wiki folder\",\"text\":\"\u003C\u003C.from-version \\\"5.1.20\\\">> Saves the current wiki as a wiki folder, including tiddlers, plugins and configuration:\\n\\n```\\n--savewikifolder \u003Cwikifolderpath> [\u003Cfilter>] [ [\u003Cname>=\u003Cvalue>] ]*\\n```\\n\\n* The target wiki folder must be empty or non-existent\\n* The filter specifies which tiddlers should be included. It is optional, defaulting to `[all[tiddlers]]`\\n* Plugins from the official plugin library are replaced with references to those plugins in the `tiddlywiki.info` file\\n* Custom plugins are unpacked into their own folder\\n\\nThe following options are supported:\\n\\n* ''filter'': a filter expression that defines the tiddlers to include in the output.\\n* ''explodePlugins'': defaults to \\\"yes\\\"\\n** ''yes'' will \\\"explode\\\" plugins into separate tiddler files and save them to the plugin directory within the wiki folder\\n** ''no'' will suppress exploding plugins into their constituent tid
2731dler files. It will save the plugin as a single JSON tiddler in the tiddlers folder\\n\\nNote that both ''explodePlugins'' options will produce wiki folders that build the same exact same original wiki. The difference lies in how plugins are represented in the wiki folder.\\n\\nA common usage is to convert a TiddlyWiki HTML file into a wiki folder:\\n\\n```\\ntiddlywiki --load ./mywiki.html --savewikifolder ./mywikifolder\\n```\\n\\nSave the plugin to the tiddlers directory of the target wiki folder:\\n\\n```\\ntiddlywiki --load ./mywiki.html --savewikifolder ./mywikifolder explodePlugins=no\\n```\"},\"$:/language/Help/server\":{\"title\":\"$:/language/Help/server\",\"description\":\"Provides an HTTP server interface to TiddlyWiki (deprecated in favour of the new listen command)\",\"text\":\"Legacy command to serve a wiki over HTTP.\\n\\n```\\n--server \u003Cport> \u003Croot-tiddler> \u003Croot-render-type> \u003Croot-serve-type> \u003Cusername> \u003Cpassword> \u003Chost> \u003Cpath-prefix> \u003Cdebug-level>\\n```\\n\\nThe parameters are:\\n\\n* ''port'' - port number on which to listen; non-numeric values are interpreted as a system environment variable from which the port number is extracted (defaults to \\\"8080\\\")\\n* ''root-tiddler'' - the tiddler to serve at the root (defaults to \\\"$:/core/save/all\\\")\\n* ''root-render-type'' - the content type to which the root tiddler should be rendered (defaults to \\\"text/plain\\\")\\n* ''root-serve-type'' - the content type with which the root tiddler should be served (defaults to \\\"text/html\\\")\\n* ''username'' - the default username for signing edits\\n* ''password'' - optional password for basic authentication\\n* ''host'' - optional hostname to serve from (defaults to \\\"127.0.0.1\\\" aka \\\"localhost\\\")\\n* ''path-prefix'' - optional prefix for paths\\n* ''debug-level'' - optional debug level; set to \\\"debug\\\" to view request details (defaults to \\\"none\\\")\\n\\nIf the password parameter is specified then the browser will prompt the user for the username and password. Note that the password is transmitted in plain text so this implementation should only be used on a trusted network or over HTTPS.\\n\\nFor example:\\n\\n```\\n--server 8080 $:/core/save/all text/plain text/html MyUserName passw0rd\\n```\\n\\nThe username and password can be specified as empty strings if you need to set the hostname or pathprefix and don't want to require a password.\\n\\n\\n```\\n--server 8080 $:/core/save/all text/plain text/html \\\"\\\" \\\"\\\" 192.168.0.245\\n```\\n\\nUsing an address like this exposes your system to the local network. For information on opening up your instance to the entire local network, and possible security concerns, see the WebServer tiddler at TiddlyWiki.com.\\n\\nTo run multiple TiddlyWiki servers at the same time you'll need to put each one on a different port. It can be useful to use an environment variable to pass the port number to the Node.js process. This example references an environment variable called \\\"MY_PORT_NUMBER\\\":\\n\\n```\\n--server MY_PORT_NUMBER $:/core/save/all text/plain text/html MyUserName passw0rd\\n```\\n\"},\"$:/language/Help/setfield\":{\"title\":\"$:/language/Help/setfield\",\"description\":\"Prepares external tiddlers for use\",\"text\":\"//Note that this command is experimental and may change or be replaced before being finalised//\\n\\nSets the specified field of a group of tiddlers to the result of wikifying a template tiddler with the `currentTiddler` variable set to the tiddler.\\n\\n```\\n--setfield \u003Cfilter> \u003Cfieldname> \u003Ctemplatetitle> \u003Crendertype>\\n```\\n\\nThe parameters are:\\n\\n* ''filter'' - filter identifying the tiddlers to be affected\\n* ''fieldname'' - the field to modify (defaults to \\\"text\\\")\\n* ''templatetitle'' - the tiddler to wikify into the specified field. If blank or missing then the specified field is deleted\\n* ''rendertype'' - the text type to render (defaults to \\\"text/plain\\\"; \\\"text/html\\\" can be used to include HTML tags)\\n\"},\"$:/language/Help/unpackplugin\":{\"title\":\"$:/language/Help/unpackplugin\",\"description\":\"Unpack the payload tiddlers from a plugin\",\"text\":\"Extract the payload tiddlers from a plugin, creating them as ordinary tiddlers:\\n\\n```\\n--unpackplugin \u003Ctitle>\\n```\\n\"},\"$:/language/Help/verbose\":{\"title\":\"$:/language/Help/verbose\",\"description\":\"Triggers verbose output mode\",\"text\":\"Tr
2731iggers verbose output, useful for debugging\\n\\n```\\n--verbose\\n```\\n\"},\"$:/language/Help/version\":{\"title\":\"$:/language/Help/version\",\"description\":\"Displays the version number of TiddlyWiki\",\"text\":\"Displays the version number of TiddlyWiki.\\n\\n```\\n--version\\n```\\n\"},\"$:/language/Import/Editor/Import/Heading\":{\"title\":\"$:/language/Import/Editor/Import/Heading\",\"text\":\"Import images and insert them into the editor.\"},\"$:/language/Import/Imported/Hint\":{\"title\":\"$:/language/Import/Imported/Hint\",\"text\":\"The following tiddlers were imported:\"},\"$:/language/Import/Listing/Cancel/Caption\":{\"title\":\"$:/language/Import/Listing/Cancel/Caption\",\"text\":\"Cancel\"},\"$:/language/Import/Listing/Cancel/Warning\":{\"title\":\"$:/language/Import/Listing/Cancel/Warning\",\"text\":\"Do you wish to cancel the import?\"},\"$:/language/Import/Listing/Hint\":{\"title\":\"$:/language/Import/Listing/Hint\",\"text\":\"These tiddlers are ready to import:\"},\"$:/language/Import/Listing/Import/Caption\":{\"title\":\"$:/language/Import/Listing/Import/Caption\",\"text\":\"Import\"},\"$:/language/Import/Listing/Select/Caption\":{\"title\":\"$:/language/Import/Listing/Select/Caption\",\"text\":\"Select\"},\"$:/language/Import/Listing/Status/Caption\":{\"title\":\"$:/language/Import/Listing/Status/Caption\",\"text\":\"Status\"},\"$:/language/Import/Listing/Title/Caption\":{\"title\":\"$:/language/Import/Listing/Title/Caption\",\"text\":\"Title\"},\"$:/language/Import/Listing/Preview\":{\"title\":\"$:/language/Import/Listing/Preview\",\"text\":\"Preview:\"},\"$:/language/Import/Listing/Preview/Text\":{\"title\":\"$:/language/Import/Listing/Preview/Text\",\"text\":\"Text\"},\"$:/language/Import/Listing/Preview/TextRaw\":{\"title\":\"$:/language/Import/Listing/Preview/TextRaw\",\"text\":\"Text (Raw)\"},\"$:/language/Import/Listing/Preview/Fields\":{\"title\":\"$:/language/Import/Listing/Preview/Fields\",\"text\":\"Fields\"},\"$:/language/Import/Listing/Preview/Diff\":{\"title\":\"$:/language/Import/Listing/Preview/Diff\",\"text\":\"Diff\"},\"$:/language/Import/Listing/Preview/DiffFields\":{\"title\":\"$:/language/Import/Listing/Preview/DiffFields\",\"text\":\"Diff (Fields)\"},\"$:/language/Import/Listing/Rename/Tooltip\":{\"title\":\"$:/language/Import/Listing/Rename/Tooltip\",\"text\":\"Rename tiddler before importing\"},\"$:/language/Import/Listing/Rename/Prompt\":{\"title\":\"$:/language/Import/Listing/Rename/Prompt\",\"text\":\"Rename to:\"},\"$:/language/Import/Listing/Rename/ConfirmRename\":{\"title\":\"$:/language/Import/Listing/Rename/ConfirmRename\",\"text\":\"Rename tiddler\"},\"$:/language/Import/Listing/Rename/CancelRename\":{\"title\":\"$:/language/Import/Listing/Rename/CancelRename\",\"text\":\"Cancel\"},\"$:/language/Import/Listing/Rename/OverwriteWarning\":{\"title\":\"$:/language/Import/Listing/Rename/OverwriteWarning\",\"text\":\"A tiddler with this title already exists.\"},\"$:/language/Import/Upgrader/Plugins/Suppressed/Incompatible\":{\"title\":\"$:/language/Import/Upgrader/Plugins/Suppressed/Incompatible\",\"text\":\"Blocked incompatible or obsolete plugin.\"},\"$:/language/Import/Upgrader/Plugins/Suppressed/Version\":{\"title\":\"$:/language/Import/Upgrader/Plugins/Suppressed/Version\",\"text\":\"Blocked plugin (due to incoming \u003C\u003Cincoming>> not being newer than existing \u003C\u003Cexisting>>).\"},\"$:/language/Import/Upgrader/Plugins/Upgraded\":{\"title\":\"$:/language/Import/Upgrader/Plugins/Upgraded\",\"text\":\"Upgraded plugin from \u003C\u003Cincoming>> to \u003C\u003Cupgraded>>.\"},\"$:/language/Import/Upgrader/State/Suppressed\":{\"title\":\"$:/language/Import/Upgrader/State/Suppressed\",\"text\":\"Blocked temporary state tiddler.\"},\"$:/language/Import/Upgrader/System/Disabled\":{\"title\":\"$:/language/Import/Upgrader/System/Disabled\",\"text\":\"Disabled system tiddler.\"},\"$:/language/Import/Upgrader/System/Suppressed\":{\"title\":\"$:/language/Import/Upgrader/System/Suppressed\",\"text\":\"Blocked system tiddler.\"},\"$:/language/Import/Upgrader/System/Warning\":{\"title\":\"$:/language/Import/Upgrader/System/Warning\",\"text\":\"Core module tiddler.\"},\"$:/language/Import/Upgrader/System/Alert\":{\"title\":\"$:/language/Import/Upgrader/System/Alert\",\"text\":\"You are about to import a tiddler that will over
2731write a core module tiddler. This is not recommended as it may make the system unstable.\"},\"$:/language/Import/Upgrader/ThemeTweaks/Created\":{\"title\":\"$:/language/Import/Upgrader/ThemeTweaks/Created\",\"text\":\"Migrated theme tweak from \u003C$text text=\u003C\u003Cfrom>>/>.\"},\"$:/language/Import/Upgrader/Tiddler/Disabled\":{\"title\":\"$:/language/Import/Upgrader/Tiddler/Disabled\",\"text\":\"Disabled tiddler.\"},\"$:/language/Import/Upgrader/Tiddler/Selected\":{\"title\":\"$:/language/Import/Upgrader/Tiddler/Selected\",\"text\":\"Selected tiddler.\"},\"$:/language/Import/Upgrader/Tiddler/Unselected\":{\"title\":\"$:/language/Import/Upgrader/Tiddler/Unselected\",\"text\":\"Unselected tiddler.\"},\"$:/language/AboveStory/ClassicPlugin/Warning\":{\"title\":\"$:/language/AboveStory/ClassicPlugin/Warning\",\"text\":\"It looks like you are trying to load a plugin designed for ~TiddlyWiki Classic. Please note that [[these plugins do not work with TiddlyWiki version 5.x.x|https://tiddlywiki.com/#TiddlyWikiClassic]]. ~TiddlyWiki Classic plugins detected:\"},\"$:/language/BinaryWarning/Prompt\":{\"title\":\"$:/language/BinaryWarning/Prompt\",\"text\":\"This tiddler contains binary data\"},\"$:/language/ClassicWarning/Hint\":{\"title\":\"$:/language/ClassicWarning/Hint\",\"text\":\"This tiddler is written in TiddlyWiki Classic wiki text format, which is not fully compatible with TiddlyWiki version 5. See https://tiddlywiki.com/static/Upgrading.html for more details.\"},\"$:/language/ClassicWarning/Upgrade/Caption\":{\"title\":\"$:/language/ClassicWarning/Upgrade/Caption\",\"text\":\"upgrade\"},\"$:/language/CloseAll/Button\":{\"title\":\"$:/language/CloseAll/Button\",\"text\":\"close all\"},\"$:/language/ColourPicker/Recent\":{\"title\":\"$:/language/ColourPicker/Recent\",\"text\":\"Recent:\"},\"$:/language/ConfirmCancelTiddler\":{\"title\":\"$:/language/ConfirmCancelTiddler\",\"text\":\"Do you wish to discard changes to the tiddler \\\"\u003C$text text=\u003C\u003Ctitle>>/>\\\"?\"},\"$:/language/ConfirmDeleteTiddler\":{\"title\":\"$:/language/ConfirmDeleteTiddler\",\"text\":\"Do you wish to delete the tiddler \\\"\u003C$text text=\u003C\u003Ctitle>>/>\\\"?\"},\"$:/language/ConfirmDeleteTiddlers\":{\"title\":\"$:/language/ConfirmDeleteTiddlers\",\"text\":\"Are you sure you wish to delete \u003C\u003CresultCount>> tiddler(s)?\"},\"$:/language/ConfirmOverwriteTiddler\":{\"title\":\"$:/language/ConfirmOverwriteTiddler\",\"text\":\"Do you wish to overwrite the tiddler \\\"\u003C$text text=\u003C\u003Ctitle>>/>\\\"?\"},\"$:/language/ConfirmEditShadowTiddler\":{\"title\":\"$:/language/ConfirmEditShadowTiddler\",\"text\":\"You are about to edit a ShadowTiddler. Any changes will override the default system making future upgrades non-trivial. Are you sure you want to edit \\\"\u003C$text text=\u003C\u003Ctitle>>/>\\\"?\"},\"$:/language/ConfirmAction\":{\"title\":\"$:/language/ConfirmAction\",\"text\":\"Do you wish to proceed?\"},\"$:/language/Count\":{\"title\":\"$:/language/Count\",\"text\":\"count\"},\"$:/language/DefaultNewTiddlerTitle\":{\"title\":\"$:/language/DefaultNewTiddlerTitle\",\"text\":\"New Tiddler\"},\"$:/language/Diffs/CountMessage\":{\"title\":\"$:/language/Diffs/CountMessage\",\"text\":\"\u003C\u003Cdiff-count>> differences\"},\"$:/language/DropMessage\":{\"title\":\"$:/language/DropMessage\",\"text\":\"Drop now (or use the 'Escape' key to cancel)\"},\"$:/language/Encryption/Cancel\":{\"title\":\"$:/language/Encryption/Cancel\",\"text\":\"Cancel\"},\"$:/language/Encryption/ConfirmClearPassword\":{\"title\":\"$:/language/Encryption/ConfirmClearPassword\",\"text\":\"Do you wish to clear the password? This will remove the encryption applied when saving this wiki\"},\"$:/language/Encryption/PromptSetPassword\":{\"title\":\"$:/language/Encryption/PromptSetPassword\",\"text\":\"Set a new password for this TiddlyWiki\"},\"$:/language/Encryption/Username\":{\"title\":\"$:/language/Encryption/Username\",\"text\":\"Username\"},\"$:/language/Encryption/Password\":{\"title\":\"$:/language/Encryption/Password\",\"text\":\"Password\"},\"$:/language/Encryption/RepeatPassword\":{\"title\":\"$:/language/Encryption/RepeatPassword\",\"text\":\"Repeat password\"},\"$:/language/Encryption/PasswordNoMatch\":{\"title\":\"$:/language/Encryption/PasswordNoMatch\",\"text\":\"Passwords do not match\"},\"$:/language/Encryption/SetPassword\":{\"title\":\"$:/language/Encryption/SetPassword\",\"text\":\"Set password\"},\"$:/language/Error/Caption\":{\"title\":\"$:/language/Error/Caption\",\"text\":\"Error\"},\"$:/language/Error/DeserializeOperator/MissingOperand\":{\"title\":\"$:/language/Error/DeserializeOperator/MissingOperand\",\"text\":\"Filter Error: Missing operand for 'deserialize' operator\"},\"$:/language/Error/DeserializeOperator/UnknownDeserializer\":{\"title\":\"$:/language/Error/DeserializeOperator/UnknownDeserializer\",\"text\":\"Filter Error: Unknown de
2731serializer provided as operand for the 'deserialize' operator\"},\"$:/language/Error/Filter\":{\"title\":\"$:/language/Error/Filter\",\"text\":\"Filter error\"},\"$:/language/Error/FilterSyntax\":{\"title\":\"$:/language/Error/FilterSyntax\",\"text\":\"Syntax error in filter expression\"},\"$:/language/Error/FilterRunPrefix\":{\"title\":\"$:/language/Error/FilterRunPrefix\",\"text\":\"Filter Error: Unknown prefix for filter run\"},\"$:/language/Error/IsFilterOperator\":{\"title\":\"$:/language/Error/IsFilterOperator\",\"text\":\"Filter Error: Unknown operand for the 'is' filter operator\"},\"$:/language/Error/FormatFilterOperator\":{\"title\":\"$:/language/Error/FormatFilterOperator\",\"text\":\"Filter Error: Unknown suffix for the 'format' filter operator\"},\"$:/language/Error/LoadingPluginLibrary\":{\"title\":\"$:/language/Error/LoadingPluginLibrary\",\"text\":\"Error loading plugin library\"},\"$:/language/Error/NetworkErrorAlert\":{\"title\":\"$:/language/Error/NetworkErrorAlert\",\"text\":\"`\u003Ch2>''Network Error''\u003C/h2>It looks like the connection to the server has been lost. This may indicate a problem with your network connection. Please attempt to restore network connectivity before continuing.\u003Cbr>\u003Cbr>''Any unsaved changes will be automatically synchronised when connectivity is restored''.`\"},\"$:/language/Error/PutEditConflict\":{\"title\":\"$:/language/Error/PutEditConflict\",\"text\":\"File changed on server\"},\"$:/language/Error/PutForbidden\":{\"title\":\"$:/language/Error/PutForbidden\",\"text\":\"Permission denied\"},\"$:/language/Error/PutUnauthorized\":{\"title\":\"$:/language/Error/PutUnauthorized\",\"text\":\"Authentication required\"},\"$:/language/Error/RecursiveTransclusion\":{\"title\":\"$:/language/Error/RecursiveTransclusion\",\"text\":\"Recursive transclusion error in transclude widget\"},\"$:/language/Error/RetrievingSkinny\":{\"title\":\"$:/language/Error/RetrievingSkinny\",\"text\":\"Error retrieving skinny tiddler list\"},\"$:/language/Error/SavingToTWEdit\":{\"title\":\"$:/language/Error/SavingToTWEdit\",\"text\":\"Error saving to TWEdit\"},\"$:/language/Error/WhileSaving\":{\"title\":\"$:/language/Error/WhileSaving\",\"text\":\"Error while saving\"},\"$:/language/Error/XMLHttpRequest\":{\"title\":\"$:/language/Error/XMLHttpRequest\",\"text\":\"XMLHttpRequest error code\"},\"$:/language/Error/ZoominTextNode\":{\"title\":\"$:/language/Error/ZoominTextNode\",\"text\":\"Story View Error: It appears you tried to interact with a tiddler that displays in a custom container. This is most likely caused by using `$:/tags/StoryTiddlerTemplateFilter` with a template that contains text or whitespace at the start. Please use the pragma `\\\\whitespace trim` and ensure the whole contents of the tiddler is wrapped in a single HTML element. The text that caused this issue:\"},\"$:/language/InternalJavaScriptError/Title\":{\"title\":\"$:/language/InternalJavaScriptError/Title\",\"text\":\"Internal JavaScript Error\"},\"$:/language/InternalJavaScriptError/Hint\":{\"title\":\"$:/language/InternalJavaScriptError/Hint\",\"text\":\"Well, this is embarrassing. It is recommended that you restart TiddlyWiki by refreshing your browser\"},\"$:/language/LayoutSwitcher/Description\":{\"title\":\"$:/language/LayoutSwitcher/Description\",\"text\":\"Open the layout switcher\"},\"$:/language/LazyLoadingWarning\":{\"title\":\"$:/language/LazyLoadingWarning\",\"text\":\"\u003Cp>Trying to load external content from ''\u003C$text text={{!!_canonical_uri}}/>''\u003C/p>\u003Cp>If this message doesn't disappear, either the tiddler content type doesn't match the type of the external content, or you may be using a browser that doesn't support external content for wikis loaded as standalone files. See https://tiddlywiki.com/#ExternalText\u003C/p>\"},\"$:/language/LoginToTiddlySpace\":{\"title\":\"$:/language/LoginToTiddlySpace\",\"text\":\"Login to TiddlySpace\"},\"$:/language/Manager/Controls/FilterByTag/None\":{\"title\":\"$:/language/Manager/Controls/FilterByTag/None\",\"text\":\"(none)\"},\"$:/language/Manager/Controls/FilterByTag/Prompt\":{\"title\":\"$:/language/Manager/Controls/FilterByTag/Prompt\",\"text\":\"Filter by tag:\"},\"$:/language/Manager/Controls/Order/Prompt\":{\"title\":\"$:/language/Manager/Controls/Order/Prompt\",\"text\":\"Reverse order\"},\"$:/language/Manager/Controls/Search/Placeholder\":{\"title\":\"$:/language/Manager/Controls/Search/Placeholder\",\"text\":\"Search\"},\"$:/language/Manager/Controls/Search/Prompt\":{\"title\":\"$:/language/Manager/Controls/Search/Prompt\",\"text\":\"Search:\"},\"$:/language/Manager/Controls/Show/Option/Tags\":{\"title\":\"$:/language/Manager/Controls/Show/Option/Tags\",\"text\":\"tags\"},\"$:/language/Manager/Controls/Show/Option/Tiddlers\":{\"title\":\"$:/language/Manager/Controls/Show/Option/Tiddlers\",\"text\":\"tiddlers\"},\"$:/language/Manager/Controls/Show/Prompt\":{\"title\":\"$:/language/Manager/Controls/Show/Prompt\",\"text\":\"Show:\"},\"$:/language/Manager/Controls/Sort/Prompt\":{\"title\":\"$:/language/Manager/Controls/Sort/Prompt\",\"text\":\"Sort by:\"},\"$:/language/Manager/Item/Colour\":{\"title\":\"$:/language/Manager/Item/Colour\",\"text\":\"Colour\"},\"$:/language/Manager/Item/Fields\":{\"title\":\"$:/language/Manager/Item/Fields\",\"text\":\"Fields\"},\"$:/language/Manager/Item/Icon/None\":{\"title\":\"$:/language/Manager/Item/Icon/None\",\"text\":\"(none)\"},\"$:/language/Manager/Item/Icon\":{\"title\":\"$:/language/Manager/Item/Icon\",\"text\":\"Icon\"},\"$:/language/Manager/Item/RawText\":{\"title\":\"$:/language/Manager/Item/RawText\",\"text\":\"Raw text\"},\"$:/language/Manager/Item/Tags\":{\"title\":\"$:/language/Manager/Item/Tags\",\"text\":\"Tags\"},\"$:/language/Manager/Item/Tools\":{\"title\":\"$:/language/Manager/Item/Tools\",\"text\":\"Tools\"},\"$:/language/Manager/Item/WikifiedText\":{\"title\":\"$:/language/Manager/Item/WikifiedText\",\"text\":\"Wikified text\"},\"$:/language/MissingTiddler/Hint\":{\"title\":\"$:/language/MissingTiddler/Hint\",\"text\":\"Missing tiddler \\\"\u003C$text text=\u003C\u003CcurrentTiddler>>/>\\\" -- click {{||$:/core/ui/Buttons/edit}} to create\"},\"$:/language/No\":{\"title\":\"$:/language/No\",\"text\":\"No\"},\"$:/language/OfficialPluginLibrary\":{\"title\":\"$:/language/OfficialPluginLibrary\",\"text\":\"Official ~TiddlyWiki Plugin Library\"},\"$:/language/OfficialPluginLibrary/Hint\":{\"title\":\"$:/language/OfficialPluginLibrary/Hint\",\"text\":\"The official ~TiddlyWiki plugin library at tiddlywiki.com. Plugins, themes and language packs are maintained by the core team.\"},\"$:/language/PageTemplate/Description\":{\"title\":\"$:/language/PageTemplate/Description\",\"text\":\"the default ~TiddlyWiki layout\"},\"$:/language/PageTemplate/Name\":{\"title\":\"$:/language/PageTemplate/Name\",\"text\":\"Default ~PageTemplate\"},\"$:/language/PluginReloadWarning\":{\"title\":\"$:/language/PluginReloadWarning\",\"text\":\"Please save {{$:/core/ui/Buttons/save-wiki}} and reload {{$:/core/ui/Buttons/refresh}} to allow changes to ~JavaScript plugins to take effect\"},\"$:/language/RecentChanges/DateFormat\":{\"title\":\"$:/language/RecentChanges/DateFormat\",\"text\":\"DDth MMM YYYY\"},\"$:/language/Shortcuts/Input/AdvancedSearch/Hint\":{\"title\":\"$:/language/Shortcuts/Input/AdvancedSearch/Hint\",\"text\":\"Open the ~AdvancedSearch panel from within the sidebar search f
2731ield\"},\"$:/language/Shortcuts/Input/Accept/Hint\":{\"title\":\"$:/language/Shortcuts/Input/Accept/Hint\",\"text\":\"Accept the selected item\"},\"$:/language/Shortcuts/Input/AcceptVariant/Hint\":{\"title\":\"$:/language/Shortcuts/Input/AcceptVariant/Hint\",\"text\":\"Accept the selected item (variant)\"},\"$:/language/Shortcuts/Input/Cancel/Hint\":{\"title\":\"$:/language/Shortcuts/Input/Cancel/Hint\",\"text\":\"Clear the input field\"},\"$:/language/Shortcuts/Input/Down/Hint\":{\"title\":\"$:/language/Shortcuts/Input/Down/Hint\",\"text\":\"Select the next item\"},\"$:/language/Shortcuts/Input/Tab-Left/Hint\":{\"title\":\"$:/language/Shortcuts/Input/Tab-Left/Hint\",\"text\":\"Select the previous Tab\"},\"$:/language/Shortcuts/Input/Tab-Right/Hint\":{\"title\":\"$:/language/Shortcuts/Input/Tab-Right/Hint\",\"text\":\"Select the next Tab\"},\"$:/language/Shortcuts/Input/Up/Hint\":{\"title\":\"$:/language/Shortcuts/Input/Up/Hint\",\"text\":\"Select the previous item\"},\"$:/language/Shortcuts/SidebarLayout/Hint\":{\"title\":\"$:/language/Shortcuts/SidebarLayout/Hint\",\"text\":\"Change the sidebar layout\"},\"$:/language/Switcher/Subtitle/theme\":{\"title\":\"$:/language/Switcher/Subtitle/theme\",\"text\":\"Switch Theme\"},\"$:/language/Switcher/Subtitle/layout\":{\"title\":\"$:/language/Switcher/Subtitle/layout\",\"text\":\"Switch Layout\"},\"$:/language/Switcher/Subtitle/language\":{\"title\":\"$:/language/Switcher/Subtitle/language\",\"text\":\"Switch Language\"},\"$:/language/Switcher/Subtitle/palette\":{\"title\":\"$:/language/Switcher/Subtitle/palette\",\"text\":\"Switch Palette\"},\"$:/language/SystemTiddler/Tooltip\":{\"title\":\"$:/language/SystemTiddler/Tooltip\",\"text\":\"This is a system tiddler\"},\"$:/language/SystemTiddlers/Include/Prompt\":{\"title\":\"$:/language/SystemTiddlers/Include/Prompt\",\"text\":\"Include system tiddlers\"},\"$:/language/TagManager/Colour/Heading\":{\"title\":\"$:/language/TagManager/Colour/Heading\",\"text\":\"Colour\"},\"$:/language/TagManager/Count/Heading\":{\"title\":\"$:/language/TagManager/Count/Heading\",\"text\":\"Count\"},\"$:/language/TagManager/Icon/Heading\":{\"title\":\"$:/language/TagManager/Icon/Heading\",\"text\":\"Icon\"},\"$:/language/TagManager/Icons/None\":{\"title\":\"$:/language/TagManager/Icons/None\",\"text\":\"None\"},\"$:/language/TagManager/Info/Heading\":{\"title\":\"$:/language/TagManager/Info/Heading\",\"text\":\"Info\"},\"$:/language/TagManager/Tag/Heading\":{\"title\":\"$:/language/TagManager/Tag/Heading\",\"text\":\"Tag\"},\"$:/language/Tiddler/DateFormat\":{\"title\":\"$:/language/Tiddler/DateFormat\",\"text\":\"DDth MMM YYYY at hh12:0mmam\"},\"$:/language/UnsavedChangesWarning\":{\"title\":\"$:/language/UnsavedChangesWarning\",\"text\":\"You have unsaved changes in TiddlyWiki\"},\"$:/language/Yes\":{\"title\":\"$:/language/Yes\",\"text\":\"Yes\"},\"$:/language/Modals/Download\":{\"title\":\"$:/language/Modals/Download\",\"subtitle\":\"Download changes\",\"footer\":\"\u003C$button message=\\\"tm-close-tiddler\\\">Close\u003C/$button>\",\"help\":\"https://tiddlywiki.com/static/DownloadingChanges.html\",\"text\":\"Your browser only supports manual saving.\\n\\nTo save your modified wiki, right click on the download link below and select \\\"Download file\\\" or \\\"Save file\\\", and then choose the folder and filename.\\n\\n//You can marginally speed things up by clicking the link with the control key (Windows) or the options/alt key (Mac OS X). You will not be prompted for the folder or filename, but your browser is likely to give it an unrecognisable name -- you may need to rename the file to include an `.html` extension before you can do anything useful with it.//\\n\\nOn smartphones that do not allow files to be downloaded you can instead bookmark the link, and then sync your bookmarks to a desktop computer from where the wiki can be saved normally.\\n\"},\"$:/config/NewJournal/Title\":{\"title\":\"$:/config/NewJournal/Title\",\"text\":\"DDth MMM YYYY\"},\"$:/config/NewJournal/Text\":{\"title\":\"$:/config/NewJournal/Text\",\"text\":\"\"},\"$:/config/NewJournal/Tags\":{\"title\":\"$:/config/NewJournal/Tags\",\"text\":\"Journal\\n\"},\"$:/language/Notifications/Save/Done\":{\"title\":\"$:/language/Notifications/Save/Done\",\"text\":\"Saved wiki\"},\"$:/language/Notifications/Save/Starting\":{\"title\":\"$:/language/Notifications/Save/Starting\",\"text\":\"Starting to save wiki\"},\"$:/language/Notifications/CopiedToClipboard/Succeeded\":{\"title\":\"$:/language/Notifications/CopiedToClipboard/Succeeded\",\"text\":\"Copied to clipboard!\"},\"$:/language/Notifications/CopiedToClipboard/Failed\":{\"title\":\"$:/language/Notifications/CopiedToClipboard/Failed\",\"text\":\"Failed to copy to clipboard!\"},\"$:/language/Search/DefaultResults/Caption\":{\"title\":\"$:/language/Search/DefaultResults/Caption\",\"text\":\"List\"},\"$:/language/Search/Filter/Caption\":{\"title\":\"$:/language/Search/Filter/Caption\",\"text\":\"Filter\"},\"$:/language/Search/Filter/Hint\":{\"title\":\"$:/language/Search/Filter/Hint\",\"text\":\"Search via a [[filter expression|https://tiddlywiki.com/static/Filters.html]]\"},\"$:/language/Search/Filter/Matches\":{\"title\":\"$:/language/Search/Filter/Matches\",\"text\":\"//\u003Csmall>\u003C\u003CresultCount>> matches\u003C/small>//\"},\"$:/language/Search/Matches\":{\"title\":\"$:/language/Search/Matches\",\"text\":\"//\u003Csmall>\u003C\u003CresultCount>> matches\u003C/small>//\"}
2731,\"$:/language/Search/Matches/All\":{\"title\":\"$:/language/Search/Matches/All\",\"text\":\"All matches:\"},\"$:/language/Search/Matches/Title\":{\"title\":\"$:/language/Search/Matches/Title\",\"text\":\"Title matches:\"},\"$:/language/Search/Search\":{\"title\":\"$:/language/Search/Search\",\"text\":\"Search\"},\"$:/language/Search/Search/TooShort\":{\"title\":\"$:/language/Search/Search/TooShort\",\"text\":\"Search text too short\"},\"$:/language/Search/Shadows/Caption\":{\"title\":\"$:/language/Search/Shadows/Caption\",\"text\":\"Shadows\"},\"$:/language/Search/Shadows/Hint\":{\"title\":\"$:/language/Search/Shadows/Hint\",\"text\":\"Search for shadow tiddlers\"},\"$:/language/Search/Shadows/Matches\":{\"title\":\"$:/language/Search/Shadows/Matches\",\"text\":\"//\u003Csmall>\u003C\u003CresultCount>> matches\u003C/small>//\"},\"$:/language/Search/Standard/Caption\":{\"title\":\"$:/language/Search/Standard/Caption\",\"text\":\"Standard\"},\"$:/language/Search/Standard/Hint\":{\"title\":\"$:/language/Search/Standard/Hint\",\"text\":\"Search for standard tiddlers\"},\"$:/language/Search/Standard/Matches\":{\"title\":\"$:/language/Search/Standard/Matches\",\"text\":\"//\u003Csmall>\u003C\u003CresultCount>> matches\u003C/small>//\"},\"$:/language/Search/System/Caption\":{\"title\":\"$:/language/Search/System/Caption\",\"text\":\"System\"},\"$:/language/Search/System/Hint\":{\"title\":\"$:/language/Search/System/Hint\",\"text\":\"Search for system tiddlers\"},\"$:/language/Search/System/Matches\":{\"title\":\"$:/language/Search/System/Matches\",\"text\":\"//\u003Csmall>\u003C\u003CresultCount>> matches\u003C/small>//\"},\"$:/language/SideBar/Caption\":{\"title\":\"$:/language/SideBar/Caption\",\"text\":\"Sidebar\"},\"$:/language/SideBar/All/Caption\":{\"title\":\"$:/language/SideBar/All/Caption\",\"text\":\"All\"},\"$:/language/SideBar/Contents/Caption\":{\"title\":\"$:/language/SideBar/Contents/Caption\",\"text\":\"Contents\"},\"$:/language/SideBar/Drafts/Caption\":{\"title\":\"$:/language/SideBar/Drafts/Caption\",\"text\":\"Drafts\"},\"$:/language/SideBar/Explorer/Caption\":{\"title\":\"$:/language/SideBar/Explorer/Caption\",\"text\":\"Explorer\"},\"$:/language/SideBar/Missing/Caption\":{\"title\":\"$:/language/SideBar/Missing/Caption\",\"text\":\"Missing\"},\"$:/language/SideBar/More/Caption\":{\"title\":\"$:/language/SideBar/More/Caption\",\"text\":\"More\"},\"$:/language/SideBar/Open/Caption\":{\"title\":\"$:/language/SideBar/Open/Caption\",\"text\":\"Open\"},\"$:/language/SideBar/Orphans/Caption\":{\"title\":\"$:/language/SideBar/Orphans/Caption\",\"text\":\"Orphans\"},\"$:/language/SideBar/Recent/Caption\":{\"title\":\"$:/language/SideBar/Recent/Caption\",\"text\":\"Recent\"},\"$:/language/SideBar/Shadows/Caption\":{\"title\":\"$:/language/SideBar/Shadows/Caption\",\"text\":\"Shadows\"},\"$:/language/SideBar/System/Caption\":{\"title\":\"$:/language/SideBar/System/Caption\",\"text\":\"System\"},\"$:/language/SideBar/Tags/Caption\":{\"title\":\"$:/language/SideBar/Tags/Caption\",\"text\":\"Tags\"},\"$:/language/SideBar/Tags/Untagged/Caption\":{\"title\":\"$:/language/SideBar/Tags/Untagged/Caption\",\"text\":\"untagged\"},\"$:/language/SideBar/Tools/Caption\":{\"title\":\"$:/language/SideBar/Tools/Caption\",\"text\":\"Tools\"},\"$:/language/SideBar/Types/Caption\":{\"title\":\"$:/language/SideBar/Types/Caption\",\"text\":\"Types\"},\"$:/SiteSubtitle\":{\"title\":\"$:/SiteSubtitle\",\"text\":\"a non-linear personal web notebook\"},\"$:/SiteTitle\":{\"title\":\"$:/SiteTitle\",\"text\":\"My TiddlyWiki\"},\"$:/language/Snippets/ListByTag\":{\"title\":\"$:/language/Snippets/ListByTag\",\"tags\":\"$:/tags/TextEditor/Snippet\",\"caption\":\"List of tiddlers by tag\",\"text\":\"\u003C\u003Clist-links \\\"[tag[task]sort[title]]\\\">>\\n\"},\"$:/language/Snippets/MacroDefinition\":{\"title\":\"$:/language/Snippets/MacroDefinition\",\"tags\":\"$:/tags/TextEditor/Snippet\",\"caption\":\"Macro definition\",\"text\":\"\\\\define macroName(param1:\\\"default value\\\",param2)\\nText of the macro\\n\\\\end\\n\"},\"$:/language/Snippets/Table4x3\":{\"title\":\"$:/language/Snippets/Table4x3\",\"tags\":\"$:/tags/TextEditor/Snippet\",\"caption\":\"Table with 4 columns by 3 rows\",\"text\":\"|! |!Alpha |!Beta |!Gamma |!Delta |\\n|!One | | | | |\\n|!Two | | | | |\\n|!Three | | | | |\\n\"},\"$:/language/Snippets/TableOfContents\":{\"title\":\"$:/language/Snippets/TableOfContents\",\"tags\":\"$:/tags/TextEditor/Snippet\",\"caption\":\"Table of Contents\",\"text\":\"\u003Cdiv class=\\\"tc-table-of-contents\\\">\\n\\n\u003C\u003Ctoc-selective-expandable 'TableOfContents'>>\\n\\n\u003C/div>\"},\"$:/language/ThemeTweaks/ThemeTweaks\":{\"title\":\"$:/language/ThemeTweaks/ThemeTweaks\",\"text\":\"Theme Tweaks\"},\"$:/language/ThemeTweaks/ThemeTweaks/Hint\":{\"title\":\"$:/language/ThemeTweaks/ThemeTweaks/Hint\",\"text\":\"You can tweak certain aspects of the ''Vanilla'' theme.\"},\"$:/language/ThemeTweaks/Options\":{\"title\":\"$:/language/ThemeTweaks/Options\",\"text\":\"Options\"},\"$:/language/ThemeTweaks/Options/SidebarLayout\":{\"title\":\"$:/language/ThemeTweaks/Options/SidebarLayout\",\"text\":\"Sidebar layout\"},\"$:/language/ThemeTweaks/Options/SidebarLayout/Fixed-Fluid\":{\"title\":\"$:/language/ThemeTweaks/Options/SidebarLayout/Fixed-Fluid\",\"text\":\"Fixed story, fluid sidebar\"},\"$:/language/ThemeTweaks/Options/SidebarLayout/Fluid-Fixed\":{\"title\":\"$:/language/ThemeTweaks/Options/SidebarLayout/Fluid-Fixed\",\"text\":\"Fluid story, fixed sidebar\"},\"$:/language/ThemeTweaks/Options/StickyTitles\":{\"title\":\"$:/language/ThemeTweaks/Options/StickyTitles\",\"text\":\"Sticky titles\"},\"$:/language/ThemeTweaks/Options/StickyTitles/Hint\":{\"title\":\"$:/language/ThemeTweaks/Options/StickyTitles/Hint\",\"text\":\"Causes tiddler titles to \\\"stick\\\" to the top of the browser window\"},\"$:/language/ThemeTweaks/Options/CodeWrapping\":{\"title\":\"$:/language/ThemeTweaks/Options/CodeWrapping\",\"text\":\"Wrap long lines in code blocks\"},\"$:/language/ThemeTweaks/Settings\":{\"title\":\"$:/language/ThemeTweaks/Settings\",\"text\":\"Settings\"},\"$:/language/ThemeTweaks/Settings/FontFamily\":{\"title\":\"$:/language/ThemeTweaks/Settings/FontFamily\",\"text\":\"Font family\"},\"$:/language/ThemeTweaks/Settings/CodeFontFamily\":{\"title\":\"$:/language/ThemeTweaks/Settings/CodeFontFamily\",\"text\":\"Code font family\"},\"$:/language/ThemeTweaks/Settings/EditorFontFamily\":{\"title\":\"$:/language/ThemeTweaks/Settings/EditorFontFamily\",\"text\":\"Editor font family\"}
2731,\"$:/language/ThemeTweaks/Settings/BackgroundImage\":{\"title\":\"$:/language/ThemeTweaks/Settings/BackgroundImage\",\"text\":\"Page background image\"},\"$:/language/ThemeTweaks/Settings/BackgroundImageAttachment\":{\"title\":\"$:/language/ThemeTweaks/Settings/BackgroundImageAttachment\",\"text\":\"Page background image attachment\"},\"$:/language/ThemeTweaks/Settings/BackgroundImageAttachment/Scroll\":{\"title\":\"$:/language/ThemeTweaks/Settings/BackgroundImageAttachment/Scroll\",\"text\":\"Scroll with tiddlers\"},\"$:/language/ThemeTweaks/Settings/BackgroundImageAttachment/Fixed\":{\"title\":\"$:/language/ThemeTweaks/Settings/BackgroundImageAttachment/Fixed\",\"text\":\"Fixed to window\"},\"$:/language/ThemeTweaks/Settings/BackgroundImageSize\":{\"title\":\"$:/language/ThemeTweaks/Settings/BackgroundImageSize\",\"text\":\"Page background image size\"},\"$:/language/ThemeTweaks/Settings/BackgroundImageSize/Auto\":{\"title\":\"$:/language/ThemeTweaks/Settings/BackgroundImageSize/Auto\",\"text\":\"Auto\"},\"$:/language/ThemeTweaks/Settings/BackgroundImageSize/Cover\":{\"title\":\"$:/language/ThemeTweaks/Settings/BackgroundImageSize/Cover\",\"text\":\"Cover\"},\"$:/language/ThemeTweaks/Settings/BackgroundImageSize/Contain\":{\"title\":\"$:/language/ThemeTweaks/Settings/BackgroundImageSize/Contain\",\"text\":\"Contain\"},\"$:/language/ThemeTweaks/Metrics\":{\"title\":\"$:/language/ThemeTweaks/Metrics\",\"text\":\"Sizes\"},\"$:/language/ThemeTweaks/Metrics/FontSize\":{\"title\":\"$:/language/ThemeTweaks/Metrics/FontSize\",\"text\":\"Font size\"},\"$:/language/ThemeTweaks/Metrics/LineHeight\":{\"title\":\"$:/language/ThemeTweaks/Metrics/LineHeight\",\"text\":\"Line height\"},\"$:/language/ThemeTweaks/Metrics/BodyFontSize\":{\"title\":\"$:/language/ThemeTweaks/Metrics/BodyFontSize\",\"text\":\"Font size for tiddler body\"},\"$:/language/ThemeTweaks/Metrics/BodyLineHeight\":{\"title\":\"$:/language/ThemeTweaks/Metrics/BodyLineHeight\",\"text\":\"Line height for tiddler body\"},\"$:/language/ThemeTweaks/Metrics/StoryLeft\":{\"title\":\"$:/language/ThemeTweaks/Metrics/StoryLeft\",\"text\":\"Story left position\"},\"$:/language/ThemeTweaks/Metrics/StoryLeft/Hint\":{\"title\":\"$:/language/ThemeTweaks/Metrics/StoryLeft/Hint\",\"text\":\"how far the left margin of the story river\u003Cbr>(tiddler area) is from the left of the page\"},\"$:/language/ThemeTweaks/Metrics/StoryTop\":{\"title\":\"$:/language/ThemeTweaks/Metrics/StoryTop\",\"text\":\"Story top position\"},\"$:/language/ThemeTweaks/Metrics/StoryTop/Hint\":{\"title\":\"$:/language/ThemeTweaks/Metrics/StoryTop/Hint\",\"text\":\"how far the top margin of the story river\u003Cbr>is from the top of the page\"},\"$:/language/ThemeTweaks/Metrics/StoryRight\":{\"title\":\"$:/language/ThemeTweaks/Metrics/StoryRight\",\"text\":\"Story right\"},\"$:/language/ThemeTweaks/Metrics/StoryRight/Hint\":{\"title\":\"$:/language/ThemeTweaks/Metrics/StoryRight/Hint\",\"text\":\"how far the left margin of the sidebar \u003Cbr>is from the left of the page\"},\"$:/language/ThemeTweaks/Metrics/StoryWidth\":{\"title\":\"$:/language/ThemeTweaks/Metrics/StoryWidth\",\"text\":\"Story width\"},\"$:/language/ThemeTweaks/Metrics/StoryWidth/Hint\":{\"title\":\"$:/language/ThemeTweaks/Metrics/StoryWidth/Hint\",\"text\":\"the overall width of the story river\"},\"$:/language/ThemeTweaks/Metrics/TiddlerWidth\":{\"title\":\"$:/language/ThemeTweaks/Metrics/TiddlerWidth\",\"text\":\"Tiddler width\"},\"$:/language/ThemeTweaks/Metrics/TiddlerWidth/Hint\":{\"title\":\"$:/language/ThemeTweaks/Metrics/TiddlerWidth/Hint\",\"text\":\"within the story river\"},\"$:/language/ThemeTweaks/Metrics/SidebarBreakpoint\":{\"title\":\"$:/language/ThemeTweaks/Metrics/SidebarBreakpoint\",\"text\":\"Sidebar breakpoint\"},\"$:/language/ThemeTweaks/Metrics/SidebarBreakpoint/Hint\":{\"title\":\"$:/language/ThemeTweaks/Metrics/SidebarBreakpoint/Hint\",\"text\":\"the minimum page width at which the story\u003Cbr>river and sidebar will appear side by side\"},\"$:/language/ThemeTweaks/Metrics/SidebarWidth\":{\"title\":\"$:/language/ThemeTweaks/
2731Metrics/SidebarWidth\",\"text\":\"Sidebar width\"},\"$:/language/ThemeTweaks/Metrics/SidebarWidth/Hint\":{\"title\":\"$:/language/ThemeTweaks/Metrics/SidebarWidth/Hint\",\"text\":\"the width of the sidebar in fluid-fixed layout\"},\"$:/language/TiddlerInfo/Advanced/Caption\":{\"title\":\"$:/language/TiddlerInfo/Advanced/Caption\",\"text\":\"Advanced\"},\"$:/language/TiddlerInfo/Advanced/PluginInfo/Empty/Hint\":{\"title\":\"$:/language/TiddlerInfo/Advanced/PluginInfo/Empty/Hint\",\"text\":\"none\"},\"$:/language/TiddlerInfo/Advanced/PluginInfo/Heading\":{\"title\":\"$:/language/TiddlerInfo/Advanced/PluginInfo/Heading\",\"text\":\"Plugin Details\"},\"$:/language/TiddlerInfo/Advanced/PluginInfo/Hint\":{\"title\":\"$:/language/TiddlerInfo/Advanced/PluginInfo/Hint\",\"text\":\"This plugin contains the following shadow tiddlers:\"},\"$:/language/TiddlerInfo/Advanced/ShadowInfo/Heading\":{\"title\":\"$:/language/TiddlerInfo/Advanced/ShadowInfo/Heading\",\"text\":\"Shadow Status\"},\"$:/language/TiddlerInfo/Advanced/ShadowInfo/NotShadow/Hint\":{\"title\":\"$:/language/TiddlerInfo/Advanced/ShadowInfo/NotShadow/Hint\",\"text\":\"The tiddler \u003C$link to=\u003C\u003CinfoTiddler>>>\u003C$text text=\u003C\u003CinfoTiddler>>/>\u003C/$link> is not a shadow tiddler\"},\"$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Hint\":{\"title\":\"$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Hint\",\"text\":\"The tiddler \u003C$link to=\u003C\u003CinfoTiddler>>>\u003C$text text=\u003C\u003CinfoTiddler>>/>\u003C/$link> is a shadow tiddler\"},\"$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Source\":{\"title\":\"$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Source\",\"text\":\"It is defined in the plugin \u003C$link to=\u003C\u003CpluginTiddler>>>\u003C$text text=\u003C\u003CpluginTiddler>>/>\u003C/$link>\"},\"$:/language/TiddlerInfo/Advanced/ShadowInfo/OverriddenShadow/Hint\":{\"title\":\"$:/language/TiddlerInfo/Advanced/ShadowInfo/OverriddenShadow/Hint\",\"text\":\"It is overridden by an ordinary tiddler\"},\"$:/language/TiddlerInfo/Fields/Caption\":{\"title\":\"$:/language/TiddlerInfo/Fields/Caption\",\"text\":\"Fields\"},\"$:/language/TiddlerInfo/List/Caption\":{\"title\":\"$:/language/TiddlerInfo/List/Caption\",\"text\":\"List\"},\"$:/language/TiddlerInfo/List/Empty\":{\"title\":\"$:/language/TiddlerInfo/List/Empty\",\"text\":\"This tiddler does not have a list\"},\"$:/language/TiddlerInfo/Listed/Caption\":{\"title\":\"$:/language/TiddlerInfo/Listed/Caption\",\"text\":\"Listed\"},\"$:/language/TiddlerInfo/Listed/Empty\":{\"title\":\"$:/language/TiddlerInfo/Listed/Empty\",\"text\":\"This tiddler is not listed by any others\"},\"$:/language/TiddlerInfo/References/Caption\":{\"title\":\"$:/language/TiddlerInfo/References/Caption\",\"text\":\"Backlinks\"},\"$:/language/TiddlerInfo/References/Empty\":{\"title\":\"$:/language/TiddlerInfo/References/Empty\",\"text\":\"No tiddlers link to this one\"},\"$:/language/TiddlerInfo/Tagging/Caption\":{\"title\":\"$:/language/TiddlerInfo/Tagging/Caption\",\"text\":\"Tagging\"},\"$:/language/TiddlerInfo/Tagging/Empty\":{\"title\":\"$:/language/TiddlerInfo/Tagging/Empty\",\"text\":\"No tiddlers are tagged with this one\"},\"$:/language/TiddlerInfo/Tools/Caption\":{\"title\":\"$:/language/TiddlerInfo/Tools/Caption\",\"text\":\"Tools\"},\"$:/language/Docs/Types/application/javascript\":{\"title\":\"$:/language/Docs/Types/application/javascript\",\"description\":\"JavaScript code\",\"name\":\"application/javascript\",\"group\":\"Developer\",\"group-sort\":\"2\"},\"$:/language/Docs/Types/application/json\":{\"title\":\"$:/language/Docs/Types/application/json\",\"description\":\"JSON data\",\"name\":\"application/json\",\"group\":\"Developer\",\"group-sort\":\"2\"},\"$:/language/Docs/Types/application/x-tiddler-dictionary\":{\"title\":\"$:/language/Docs/Types/application/x-tiddler-dictionary\",\"description\":\"Data dictionary\",\"name\":\"application/x-tiddler-dictionary\",\"group\":\"Developer\",\"group-sort\":\"2\"},\"$:/language/Docs/Types/image/gif\":{\"title\":\"$:/language/Docs/Types/image/gif\",\"description\":\"GIF image\",\"name\":\"image/gif\",\"group\":\"Image\",\"group-sort\":\"1\"},\"$:/language/Docs/Types/image/jpeg\":{\"title\":\"$:/language/Docs/Types/image/jpeg\",\"description\":\"JPEG image\",\"name\":\"image/jpeg\",\"group\":\"Image\",\"group-sort\":\"1\"},\"$:/language/Docs/Types/image/png\":{\"title\":\"$:/language/Docs/Types/image/png\",\"description\":\"PNG image\",\"name\":\"image/png\",\"group\":\"Image\",\"group-sort\":\"1\"},\"$:/language/Docs/Types/image/svg+xml\":{\"title\":\"$:/language/Docs/Types/image/svg+xml\",\"description\":\"Structured Vector Graphics image\",\"name\":\"image/svg+xml\",\"group\":\"Image\",\"group-sort\":\"1\"},\"$:/language/Docs/Types/image/x-icon\":{\"title\":\"$:/language/Docs/Types/image/x-icon\",\"description\":\"ICO format icon file\",\"name\":\"image/x-icon\",\"group\":\"Image\",\"group-sort\":\"1\"},\"$:/language/Docs/Types/text/css\":{\"title\":\"$:/language/Docs/Types/text/css\",\"description\":\"Static stylesheet\",\"name\":\"text/css\",\"group\":\"Developer\",\"group-sort\":\"2\"},\"$:/language/Docs/Types/text/html\":{\"title\":\"$:/language/Docs/Types/text/html\",\"description\":\"HTML markup\",\"name\":\"text/html\",\"group\":\"Text\",\"group-sort\":\"0\"},\"$:/language/Docs/Types/text/plain\":{\"title\":\"$:/language/Docs/Types/text/plain\",\"description\":\"Plain text\",\"name\":\"text/plain\",\"group\":\"Text\",\"group-sort\":\"0\"},\"$:/language/Docs/Types/text/vnd.tiddlywiki\":{\"title\":\"$:/language/Docs/Types/text/vnd.tiddlywiki\",\"description\":\"TiddlyWiki 5\",\"name\":\"text/vnd.tiddlywiki\",\"group\":\"Text\",\"group-sort\":\"0\"},\"$:/language/Docs/Types/text/x-tiddlywiki\":{\"title\":\"$:/language/Docs/Types/text/x-tiddlywiki\",\"description\":\"TiddlyWiki Classic\",\"name\":\"text/x-tiddlywiki\",\"group\":\"Text\",\"group-sort\":\"0\"},\"$:/languages/en-GB/icon\":{\"title\":\"$:/languages/en-GB/icon\",\"type\":\"image/svg+xml\",\"text\":\"\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 60 30\\\" width=\\\"1200\\\" height=\\\"600\\\">\\n\u003CclipPath id=\\\"t\\\">\\n\\t\u003Cpath d=\\\"M30,15 h30 v15 z v15 h-30 z h-30 v-15 z v-15 h30 z\\\"/>\\n\u003C/clipPath>\\n\u003Cpath d=\\\"M0,0 v30 h60 v-30 z\\\" fill=\\\"#00247d\\\"/>\\n\u003Cpath d=\\\"M0,0 L60,30 M60,0 L0,30\\\" stroke=\\\"#fff\\\" stroke-width=\\\"6\\\"/>\\n\u003Cpath d=\\\"M0,0 L60,30 M60,0 L0,30\\\" clip-path=\\\"url(#t)\\\" stroke=\\\"#cf142b\\\" stroke-width=\\\"4\\\"/>\\n\u003Cpath d=\\\"M30,0 v30 M0,15 h60\\\" stroke=\\\"#fff\\\" stroke-width=\\\"10\\\"/>\\n\u003Cpath d=\\\"M30,0 v30 M0,15 h60\\\" stroke=\\\"#cf142b\\\" stroke-width=\\\"6\\\"/>\\n\u003C/svg>\\n\"},\"$:/languages/en-GB\":{\"title\":\"$:/languages/en-GB\",\"name\":\"en-GB\",\"description\":\"English (British)\",\"author\":\"JeremyRuston\",\"core-version\":\">=5.0.0\\\"\",\"text\":\"Stub pseudo-plugin for the default language\"},\"$:/core/modules/commander.js\":{\"title\":\"$:/core/modules/commander.js\",\"text\":\"/*\\\\\\ntitle: $
2731:/core/modules/commander.js\\ntype: application/javascript\\nmodule-type: global\\n\\nThe $tw.Commander class is a command interpreter\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nParse a sequence of commands\\n\\tcommandTokens: an array of command string tokens\\n\\twiki: reference to the wiki store object\\n\\tstreams: {output:, error:}, each of which has a write(string) method\\n\\tcallback: a callback invoked as callback(err) where err is null if there was no error\\n*/\\nvar Commander = function(commandTokens,callback,wiki,streams) {\\n\\tvar path = require(\\\"path\\\");\\n\\tthis.commandTokens = commandTokens;\\n\\tthis.nextToken = 0;\\n\\tthis.callback = callback;\\n\\tthis.wiki = wiki;\\n\\tthis.streams = streams;\\n\\tthis.outputPath = path.resolve($tw.boot.wikiPath,$tw.config.wikiOutputSubDir);\\n};\\n\\n/*\\nLog a string if verbose flag is set\\n*/\\nCommander.prototype.log = function(str) {\\n\\tif(this.verbose) {\\n\\t\\tthis.streams.output.write(str + \\\"\\\\n\\\");\\n\\t}\\n};\\n\\n/*\\nWrite a string if verbose flag is set\\n*/\\nCommander.prototype.write = function(str) {\\n\\tif(this.verbose) {\\n\\t\\tthis.streams.output.write(str);\\n\\t}\\n};\\n\\n/*\\nAdd a string of tokens to the command queue\\n*/\\nCommander.prototype.addCommandTokens = function(commandTokens) {\\n\\tvar params = commandTokens.slice(0);\\n\\tparams.unshift(0);\\n\\tparams.unshift(this.nextToken);\\n\\tArray.prototype.splice.apply(this.commandTokens,params);\\n};\\n\\n/*\\nExecute the sequence of commands and invoke a callback on completion\\n*/\\nCommander.prototype.execute = function() {\\n\\tthis.executeNextCommand();\\n};\\n\\n/*\\nExecute the next command in the sequence\\n*/\\nCommander.prototype.executeNextCommand = function() {\\n\\tvar self = this;\\n\\t// Invoke the callback if there are no more commands\\n\\tif(this.nextToken >= this.commandTokens.length) {\\n\\t\\tthis.callback(null);\\n\\t} else {\\n\\t\\t// Get and check the command token\\n\\t\\tvar commandName = this.commandTokens[this.nextToken++];\\n\\t\\tif(commandName.substr(0,2) !== \\\"--\\\") {\\n\\t\\t\\tthis.callback(\\\"Missing command: \\\" + commandName);\\n\\t\\t} else {\\n\\t\\t\\tcommandName = commandName.substr(2); // Trim off the --\\n\\t\\t\\t// Accumulate the parameters to the command\\n\\t\\t\\tvar params = [];\\n\\t\\t\\twhile(this.nextToken \u003C this.commandTokens.length && \\n\\t\\t\\t\\tthis.commandTokens[this.nextToken].substr(0,2) !== \\\"--\\\") {\\n\\t\\t\\t\\tparams.push(this.commandTokens[this.nextToken++]);\\n\\t\\t\\t}\\n\\t\\t\\t// Get the command info\\n\\t\\t\\tvar command = $tw.commands[commandName],\\n\\t\\t\\t\\tc,err;\\n\\t\\t\\tif(!command) {\\n\\t\\t\\t\\tthis.callback(\\\"Unknown command: \\\" + commandName);\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tif(this.verbose) {\\n\\t\\t\\t\\t\\tthis.streams.output.write(\\\"Executing command: \\\" + commandName + \\\" \\\" + params.join(\\\" \\\") + \\\"\\\\n\\\");\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t// Parse named parameters if required\\n\\t\\t\\t\\tif(command.info.namedParameterMode) {\\n\\t\\t\\t\\t\\tparams = this.extractNamedParameters(params,command.info.mandatoryParameters);\\n\\t\\t\\t\\t\\tif(typeof params === \\\"string\\\") {\\n\\t\\t\\t\\t\\t\\treturn this.callback(params);\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tif(command.info.synchronous) {\\n\\t\\t\\t\\t\\t// Synchronous command\\n\\t\\t\\t\\t\\tc = new command.Command(params,this);\\n\\t\\t\\t\\t\\terr = c.execute();\\n\\t\\t\\t\\t\\tif(err) {\\n\\t\\t\\t\\t\\t\\tthis.callback(err);\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\tthis.executeNextCommand();\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t// Asynchronous command\\n\\t\\t\\t\\t\\tc = new command.Command(params,this,function(err) {\\n\\t\\t\\t\\t\\t\\tif(err) {\\n\\t\\t\\t\\t\\t\\t\\tself.callback(err);\\n\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\tself.executeNextCommand();\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t});\\n\\t\\t\\t\\t\\terr = c.execute();\\n\\t\\t\\t\\t\\tif(err) {\\n\\t\\t\\t\\t\\t\\tthis.callback(err);\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n};
2731\\n\\n/*\\nGiven an array of parameter strings `params` in name:value format, and an array of mandatory parameter names in `mandatoryParameters`, returns a hashmap of values or a string if error\\n*/\\nCommander.prototype.extractNamedParameters = function(params,mandatoryParameters) {\\n\\tmandatoryParameters = mandatoryParameters || [];\\n\\tvar errors = [],\\n\\t\\tparamsByName = Object.create(null);\\n\\t// Extract the parameters\\n\\t$tw.utils.each(params,function(param) {\\n\\t\\tvar index = param.indexOf(\\\"=\\\");\\n\\t\\tif(index \u003C 1) {\\n\\t\\t\\terrors.push(\\\"malformed named parameter: '\\\" + param + \\\"'\\\");\\n\\t\\t}\\n\\t\\tparamsByName[param.slice(0,index)] = $tw.utils.trim(param.slice(index+1));\\n\\t});\\n\\t// Check the mandatory parameters are present\\n\\t$tw.utils.each(mandatoryParameters,function(mandatoryParameter) {\\n\\t\\tif(!$tw.utils.hop(paramsByName,mandatoryParameter)) {\\n\\t\\t\\terrors.push(\\\"missing mandatory parameter: '\\\" + mandatoryParameter + \\\"'\\\");\\n\\t\\t}\\n\\t});\\n\\t// Return any errors\\n\\tif(errors.length > 0) {\\n\\t\\treturn errors.join(\\\" and\\\\n\\\");\\n\\t} else {\\n\\t\\treturn paramsByName;\\n\\t}\\n};\\n\\nCommander.initCommands = function(moduleType) {\\n\\tmoduleType = moduleType || \\\"command\\\";\\n\\t$tw.commands = {};\\n\\t$tw.modules.forEachModuleOfType(moduleType,function(title,module) {\\n\\t\\tvar c = $tw.commands[module.info.name] = {};\\n\\t\\t// Add the methods defined by the module\\n\\t\\tfor(var f in module) {\\n\\t\\t\\tif($tw.utils.hop(module,f)) {\\n\\t\\t\\t\\tc[f] = module[f];\\n\\t\\t\\t}\\n\\t\\t}\\n\\t});\\n};\\n\\nexports.Commander = Commander;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"global\"},\"$:/core/modules/commands/build.js\":{\"title\":\"$:/core/modules/commands/build.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/commands/build.js\\ntype: application/javascript\\nmodule-type: command\\n\\nCommand to build a build target\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.info = {\\n\\tname: \\\"build\\\",\\n\\tsynchronous: true\\n};\\n\\nvar Command = function(params,commander) {\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n};\\n\\nCommand.prototype.execute = function() {\\n\\t// Get the build targets defined in the wiki\\n\\tvar buildTargets = $tw.boot.wikiInfo.build;\\n\\tif(!buildTargets) {\\n\\t\\treturn \\\"No build targets defined\\\";\\n\\t}\\n\\t// Loop through each of the specified targets\\n\\tvar targets;\\n\\tif(this.params.length > 0) {\\n\\t\\ttargets = this.params;\\n\\t} else {\\n\\t\\ttargets = Object.keys(buildTargets);\\n\\t}\\n\\tfor(var targetIndex=0; targetIndex\u003Ctargets.length; targetIndex++) {\\n\\t\\tvar target = targets[targetIndex],\\n\\t\\t\\tcommands = buildTargets[target];\\n\\t\\tif(!commands) {\\n\\t\\t\\treturn \\\"Build target '\\\" + target + \\\"' not found\\\";\\n\\t\\t}\\n\\t\\t// Add the commands to the queue\\n\\t\\tthis.commander.addCommandTokens(commands);\\n\\t}\\n\\treturn null;\\n};\\n\\nexports.Command = Command;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/clearpassword.js\":{\"title\":\"$:/core/modules/commands/clearpassword.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/commands/clearpassword.js\\ntype: application/javascript\\nmodule-type: command\\n\\nClear password for crypto operations\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.info = {\\n\\tname: \\\"clearpassword\\\",\\n\\tsynchronous: true\\n};\\n\\nvar Command = function(params,commander,callback) {\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n\\tthis.callback = callback;\\n};\\n\\nCommand.prototype.execute = function() {\\n\\t$tw.crypto.setPassword(null);\\n\\treturn null;\\n};\\n\\nexports.Command = Command;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/commands.js\":{\"title\":\"$:/core/modules/commands/commands.js\",\"text\":\"/*\\\\\\ntitle: $
2731:/core/modules/commands/commands.js\\ntype: application/javascript\\nmodule-type: command\\n\\nRuns the commands returned from a filter\\n\\n\\\\*/\\n\\n(function() {\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.info = {\\n\\tname: \\\"commands\\\",\\n\\tsynchronous: true\\n};\\n\\nvar Command = function(params, commander) {\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n};\\n\\nCommand.prototype.execute = function() {\\n\\t// Parse the filter\\n\\tvar filter = this.params[0];\\n\\tif(!filter) {\\n\\t\\treturn \\\"No filter specified\\\";\\n\\t}\\n\\tvar commands = this.commander.wiki.filterTiddlers(filter)\\n\\tif(commands.length === 0) {\\n\\t\\treturn \\\"No tiddlers found for filter '\\\" + filter + \\\"'\\\";\\n\\t}\\n\\tthis.commander.addCommandTokens(commands);\\n\\treturn null;\\n};\\n\\nexports.Command = Command;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/deletetiddlers.js\":{\"title\":\"$:/core/modules/commands/deletetiddlers.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/commands/deletetiddlers.js\\ntype: application/javascript\\nmodule-type: command\\n\\nCommand to delete tiddlers\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.info = {\\n\\tname: \\\"deletetiddlers\\\",\\n\\tsynchronous: true\\n};\\n\\nvar Command = function(params,commander,callback) {\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n\\tthis.callback = callback;\\n};\\n\\nCommand.prototype.execute = function() {\\n\\tif(this.params.length \u003C 1) {\\n\\t\\treturn \\\"Missing filter\\\";\\n\\t}\\n\\tvar self = this,\\n\\t\\twiki = this.commander.wiki,\\n\\t\\tfilter = this.params[0],\\n\\t\\ttiddlers = wiki.filterTiddlers(filter);\\n\\t$tw.utils.each(tiddlers,function(title) {\\n\\t\\twiki.deleteTiddler(title);\\n\\t});\\n\\treturn null;\\n};\\n\\nexports.Command = Command;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/editions.js\":{\"title\":\"$:/core/modules/commands/editions.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/commands/editions.js\\ntype: application/javascript\\nmodule-type: command\\n\\nCommand to list the available editions\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.info = {\\n\\tname: \\\"editions\\\",\\n\\tsynchronous: true\\n};\\n\\nvar Command = function(params,commander) {\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n};\\n\\nCommand.prototype.execute = function() {\\n\\tvar self = this;\\n\\t// Output the list\\n\\tthis.commander.streams.output.write(\\\"Available editions:\\\\n\\\\n\\\");\\n\\tvar editionInfo = $tw.utils.getEditionInfo();\\n\\t$tw.utils.each(editionInfo,function(info,name) {\\n\\t\\tself.commander.streams.output.write(\\\"    \\\" + name + \\\": \\\" + info.description + \\\"\\\\n\\\");\\n\\t});\\n\\tthis.commander.streams.output.write(\\\"\\\\n\\\");\\n\\treturn null;\\n};\\n\\nexports.Command = Command;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/fetch.js\":{\"title\":\"$:/core/modules/commands/fetch.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/commands/fetch.js\\ntype: application/javascript\\nmodule-type: command\\n\\nCommands to fetch external tiddlers\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.info = {\\n\\tname: \\\"fetch\\\",\\n\\tsynchronous: false\\n};\\n\\nvar Command = function(params,commander,callback) {\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n\\tthis.callback = callback;\\n};\\n\\nCommand.prototype.execute = function() {\\n\\tif(this.params.length \u003C 2) {\\n\\t\\treturn \\\"Missing subcommand and url\\\";\\n\\t}\\n\\tswitch(this.params[0]) {\\n\\t\\tcase \\\"raw-file\\\":\\n\\t\\t\\treturn this.fetchFiles({\\n\\t\\t\\t\\traw: true,\\n\\t\\t\\t\\turl: this.params[1],\\n\\t\\t\\t\\ttransformFilter: this.params[2] || \\\"\\\",\\n\\t\\t\\t\\tcallback: this.callback\\n\\t\\t\\t});\\n\\t\\t\\tbreak;\\n\\t\\tcase \\\"file\\\":\\n\\t\\t\\treturn this.fetchFiles({\\n\\t\\t\\t\\turl: this.params[1],\\n\\t\\t\\t\\timportFilter: this.params[2],\\n\\t\\t\\t\\ttransformFilter: this.params[3] || \\\"\\\",\\n\\t\\t\\t\\tcallback: this.callback\\n\\t\\t\\t});\\n\\t\\t\\tbreak;\\n\\t\\tcase \\\"raw-files\\\":\\n\\t\\t\\treturn this.fetchFiles({\\n\\t\\t\\t\\traw: true,\\n\\t\\t\\t\\turlFilter: this.params[1],\\n\\t\\t\\t\\ttransformFilter: this.params[2] || \\\"\\\",\\n\\t\\t\\t\\tcallback: this.callback\\n\\t\\t\\t});\\n\\t\\t\\tbreak;\\n\\t\\tcase \\\"files\\\":\\n\\t\\t\\treturn this.fetchFiles({\\n\\t\\t\\t\\turlFilter: this.params[1],\\n\\t\\t\\t\\timportFilter: this.params[2],\\n\\t\\t\\t\\ttransformFilter: this.params[3] || \\\"\\\",\\n\\t\\t\\t\\tcallback: this.callback\\n\\t\\t\\t});\\n\\t\\t\\tbreak;\\n\\t}\\n\\treturn null;\\n};\\n\\nCommand.prototype.fetchFiles = function(options) {\\n\\tvar self = this;\\n\\t// Get the list of URLs\\n\\tvar urls;\\n\\tif(options.url) {\\n\\t\\turls = [options.url]\\n\\t} else if(options.urlFilter) {\\n\\t\\turls = this.commander.wiki.filterTiddlers(options.urlFilter);\\n\\t} else {\\n\\t\\treturn \\\"Missing URL\\\";\\n\\t}\\n\\t// Process each URL in turn\\n\\tvar next = 0;\\n\\tvar getNextFile = function(err) {\\n\\t\\tif(err) {\\n\\t\\t\\treturn options.callback(err);\\n\\t\\t}\\n\\t\\tif(next \u003C urls.length) {\\n\\t\\t\\tself.fetchFile(urls[next++],options,getNextFile);\\n\\t\\t} else {\\n\\t\\t\\toptions.callback(null);\\n\\t\\t}\\n\\t};\\n\\tgetNextFile(null);\\n\\t// Success\\n\\treturn null;\\n};\\n\\nCommand.prototype.fetchFile = function(url,options,callback,redirectCount) {\\n\\tif(redirectCount > 10) {\\n\\t\\treturn callback(\\\"Error too many redirects retrieving \\\" + url);\\n\\t}\\n\\tvar self = this,\\n\\t\\tlib = url.substr(0,8) === \\\"https://\\\" ? require(\\\"https\\\") : require(\\\"http\\\");\\n\\tlib.get(url).on(\\\"response\\\",function(response) {\\n\\t    var type = (response.headers[\\\"content-type\\\"] || \\\"\\\").split(\\\";\\\")[0],\\n\\t    \\tdata = [];\\n\\t    self.commander.write(\\\"Reading \\\" + url + \\\": \\\");\\n\\t    response.on(\\\"data\\\",function(chunk) {\\n\\t        data.push(chunk);\\n\\t        self.commander.write(\\\".\\\");\\n\\t    });\\n\\t    response.on(\\\"end\\\",function() {\\n\\t        self.commander.write(\\\"\\\\n\\\");\\n\\t        if(response.statusCode === 200) {\\n\\t\\t        self.processBody(Buffer.concat(data),type,options,url);\\n\\t\\t        callback(null);\\n\\t        } else {\\n\\t        \\tif(response.statusCode === 302 || response.statusCode === 303 || response.statusCode === 307) {\\n\\t        \\t\\treturn self.fetchFile(response.headers.location,options,callback,redirectCount + 1);\\n\\t        \\t} else {\\n\\t\\t        \\treturn callback(\\\"Error \\\" + response.statusCode + \\\" retrieving \\\" + url)\\n\\t        \\t}\\n\\t        }\\n\\t   \\t});\\n\\t   \\tresponse.on(\\\"error\\\",function(e) {\\n\\t\\t\\tconsole.log(\\\"Error on GET request: \\\" + e);\\n\\t\\t\\tcallback(e);\\n\\t   \\t});\\n\\t});\\n\\treturn null;\\n};\\n\\nCommand.prototype.processBody = function(body,type,options,url) {\\n\\tvar self = this;\\n\\t// Collect the tiddlers in a wiki\\n\\tvar incomingWiki = new $tw.Wiki();\\n\\tif(options.raw) {\\n\\t\\tvar typeInfo = type ? $tw.config.contentTypeInfo[type] : null,\\n\\t\\t\\tencoding = typeInfo ? typeInfo.encoding : \\\"utf8\\\";\\n\\t\\tincomingWiki.addTiddler(new $tw.Tiddler({\\n\\t\\t\\ttitle: url,\\n\\t\\t\\ttype: type,\\n\\t\\t\\ttext: body.toString(encoding)\\n\\t\\t}));\\n\\t} else {\\n\\t\\t// Deserialise the file to extract the tiddlers\\n\\t\\tvar tiddlers = this.commander.wiki.deserializeTiddlers(type || \\\"text/html\\\",body.toString(\\\"utf8\\\"),{});\\n\\t\\t$tw.utils.each(tiddlers,function(tiddler) {\\n\\t\\t\\tincomingWiki.addTiddler(new $tw.Tiddler(tiddler));\\n\\t\\t});\\n\\t}
2731\\n\\t// Filter the tiddlers to select the ones we want\\n\\tvar filteredTitles = incomingWiki.filterTiddlers(options.importFilter || \\\"[all[tiddlers]]\\\");\\n\\t// Import the selected tiddlers\\n\\tvar count = 0;\\n\\tincomingWiki.each(function(tiddler,title) {\\n\\t\\tif(filteredTitles.indexOf(title) !== -1) {\\n\\t\\t\\tvar newTiddler;\\n\\t\\t\\tif(options.transformFilter) {\\n\\t\\t\\t\\tvar transformedTitle = (incomingWiki.filterTiddlers(options.transformFilter,null,self.commander.wiki.makeTiddlerIterator([title])) || [\\\"\\\"])[0];\\n\\t\\t\\t\\tif(transformedTitle) {\\n\\t\\t\\t\\t\\tself.commander.log(\\\"Importing \\\" + title + \\\" as \\\" + transformedTitle)\\n\\t\\t\\t\\t\\tnewTiddler = new $tw.Tiddler(tiddler,{title: transformedTitle});\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tself.commander.log(\\\"Importing \\\" + title)\\n\\t\\t\\t\\tnewTiddler = tiddler;\\n\\t\\t\\t}\\n\\t\\t\\tself.commander.wiki.importTiddler(newTiddler);\\n\\t\\t\\tcount++;\\n\\t\\t}\\n\\t});\\n\\tself.commander.log(\\\"Imported \\\" + count + \\\" tiddlers\\\")\\n};\\n\\nexports.Command = Command;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/help.js\":{\"title\":\"$:/core/modules/commands/help.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/commands/help.js\\ntype: application/javascript\\nmodule-type: command\\n\\nHelp command\\n\\n\\\\*/\\n(function(){\\n\\n/*jshint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.info = {\\n\\tname: \\\"help\\\",\\n\\tsynchronous: true\\n};\\n\\nvar Command = function(params,commander) {\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n};\\n\\nCommand.prototype.execute = function() {\\n\\tvar subhelp = this.params[0] || \\\"default\\\",\\n\\t\\thelpBase = \\\"$:/language/Help/\\\",\\n\\t\\ttext;\\n\\tif(!this.commander.wiki.getTiddler(helpBase + subhelp)) {\\n\\t\\tsubhelp = \\\"notfound\\\";\\n\\t}\\n\\t// Wikify the help as formatted text (ie block elements generate newlines)\\n\\ttext = this.commander.wiki.renderTiddler(\\\"text/plain-formatted\\\",helpBase + subhelp);\\n\\t// Remove any leading linebreaks\\n\\ttext = text.replace(/^(\\\\r?\\\\n)*/g,\\\"\\\");\\n\\tthis.commander.streams.output.write(text);\\n};\\n\\nexports.Command = Command;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/import.js\":{\"title\":\"$:/core/modules/commands/import.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/commands/import.js\\ntype: application/javascript\\nmodule-type: command\\n\\nCommand to import tiddlers from a file\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.info = {\\n\\tname: \\\"import\\\",\\n\\tsynchronous: true\\n};\\n\\nvar Command = function(params,commander,callback) {\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n\\tthis.callback = callback;\\n};\\n\\nCommand.prototype.execute = function() {\\n\\tvar self = this,\\n\\t\\tfs = require(\\\"fs\\\"),\\n\\t\\tpath = require(\\\"path\\\");\\n\\tif(this.params.length \u003C 2) {\\n\\t\\treturn \\\"Missing parameters\\\";\\n\\t}\\n\\tvar filename = self.params[0],\\n\\t\\tdeserializer = self.params[1],\\n\\t\\ttitle = self.params[2] || filename,\\n\\t\\tencoding = self.params[3] || \\\"utf8\\\",\\n\\t\\ttext = fs.readFileSync(filename,encoding),\\n\\t\\ttiddlers = this.commander.wiki.deserializeTiddlers(null,text,{title: title},{deserializer: deserializer});\\n\\t$tw.utils.each(tiddlers,function(tiddler) {\\n\\t\\tself.commander.wiki.importTiddler(new $tw.Tiddler(tiddler));\\n\\t});\\n\\tthis.commander.log(tiddlers.length + \\\" tiddler(s) imported\\\");\\n\\treturn null;\\n};\\n\\nexports.Command = Command;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/init.js\":{\"title\":\"$:/core/modules/commands/init.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/commands/init.js\\ntype: application/javascript\\nmodule-type: command\\n\\nCommand to initialise an empty wiki folder\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.info = {\\n\\tname: \\\"init\\\",\\n\\tsynchronous: true\\n};\\n\\nvar Command = function(params,commander) {\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n};\\n\\nCommand.prototype.execute = function() {\\n\\tvar fs = require(\\\"fs\\\"),\\n\\t\\tpath = require(\\\"path\\\");\\n\\t// Check that we don't already have a valid wiki folder\\n\\tif($tw.boot.wikiTiddlersPath || ($tw.utils.isDirectory($tw.boot.wikiPath) && !$tw.utils.isDirectoryEmpty($tw.boot.wikiPath))) {\\n\\t\\treturn \\\"Wiki folder is not empty\\\";\\n\\t}\\n\\t// Loop through each of the specified editions\\n\\tvar editions = this.params.length > 0 ? this.params : [\\\"empty\\\"];\\n\\tfor(var editionIndex=0; editionIndex\u003Ceditions.length; editionIndex++) {\\n\\t\\tvar editionName = editions[editionIndex];\\n\\t\\t// Check the edition exists\\n\\t\\tvar editionPath = $tw.findLibraryItem(editionName,$tw.getLibraryItemSearchPaths($tw.config.editionsPath,$tw.config.editionsEnvVar));\\n\\t\\tif(!$tw.utils.isDirectory(editionPath)) {\\n\\t\\t\\treturn \\\"Edition '\\\" + editionName + \\\"' not found\\\";\\n\\t\\t}\\n\\t\\t// Copy the edition content\\n\\t\\tvar err = $tw.utils.copyDirectory(editionPath,$tw.boot.wikiPath);\\n\\t\\tif(!err) {\\n\\t\\t\\tthis.commander.streams.output.write(\\\"Copied edition '\\\" + editionName + \\\"' to \\\" + $tw.boot.wikiPath + \\\"\\\\n\\\");\\n\\t\\t} else {\\n\\t\\t\\treturn err;\\n\\t\\t}\\n\\t}\\n\\t// Tweak the tiddlywiki.info to remove any included wikis\\n\\tvar packagePath 
2731= $tw.boot.wikiPath + \\\"/tiddlywiki.info\\\",\\n\\t\\tpackageJson = $tw.utils.parseJSONSafe(fs.readFileSync(packagePath));\\n\\tdelete packageJson.includeWikis;\\n\\tfs.writeFileSync(packagePath,JSON.stringify(packageJson,null,$tw.config.preferences.jsonSpaces));\\n\\treturn null;\\n};\\n\\nexports.Command = Command;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/listen.js\":{\"title\":\"$:/core/modules/commands/listen.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/commands/listen.js\\ntype: application/javascript\\nmodule-type: command\\n\\nListen for HTTP requests and serve tiddlers\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Server = require(\\\"$:/core/modules/server/server.js\\\").Server;\\n\\nexports.info = {\\n\\tname: \\\"listen\\\",\\n\\tsynchronous: true,\\n\\tnamedParameterMode: true,\\n\\tmandatoryParameters: [],\\n};\\n\\nvar Command = function(params,commander,callback) {\\n\\tvar self = this;\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n\\tthis.callback = callback;\\n};\\n\\nCommand.prototype.execute = function() {\\n\\tvar self = this;\\n\\tif(!$tw.boot.wikiTiddlersPath) {\\n\\t\\t$tw.utils.warning(\\\"Warning: Wiki folder '\\\" + $tw.boot.wikiPath + \\\"' does not exist or is missing a tiddlywiki.info file\\\");\\n\\t}\\n\\t// Set up server\\n\\tthis.server = new Server({\\n\\t\\twiki: this.commander.wiki,\\n\\t\\tvariables: self.params\\n\\t});\\n\\tvar nodeServer = this.server.listen();\\n\\t$tw.hooks.invokeHook(\\\"th-server-command-post-start\\\",this.server,nodeServer,\\\"tiddlywiki\\\");\\n\\treturn null;\\n};\\n\\nexports.Command = Command;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/load.js\":{\"title\":\"$:/core/modules/commands/load.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/commands/load.js\\ntype: application/javascript\\nmodule-type: command\\n\\nCommand to load tiddlers from a file or directory\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.info = {\\n\\tname: \\\"load\\\",\\n\\tsynchronous: false\\n};\\n\\nvar Command = function(params,commander,callback) {\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n\\tthis.callback = callback;\\n};\\n\\nCommand.prototype.execute = function() {\\n\\tvar self = this,\\n\\t\\tfs = require(\\\"fs\\\"),\\n\\t\\tpath = require(\\\"path\\\");\\n\\tif(this.params.length \u003C 1) {\\n\\t\\treturn \\\"Missing filename\\\";\\n\\t}\\n\\tvar tiddlers = $tw.loadTiddlersFromPath(self.params[0]),\\n\\t\\tcount = 0;\\n\\t$tw.utils.each(tiddlers,function(tiddlerInfo) {\\n\\t\\t$tw.utils.each(tiddlerInfo.tiddlers,function(tiddler) {\\n\\t\\t\\tself.commander.wiki.importTiddler(new $tw.Tiddler(tiddler));\\n\\t\\t\\tcount++;\\n\\t\\t});\\n\\t});\\n\\tif(!count && self.params[1] !== \\\"noerror\\\") {\\n\\t\\tself.callback(\\\"No tiddlers found in file \\\\\\\"\\\" + self.params[0] + \\\"\\\\\\\"\\\");\\n\\t} else {\\n\\t\\tself.callback(null);\\n\\t}\\n\\treturn null;\\n};\\n\\nexports.Command = Command;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/makelibrary.js\":{\"title\":\"$:/core/modules/commands/makelibrary.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/commands/makelibrary.js\\ntype: application/javascript\\nmodule-type: command\\n\\nCommand to pack all of the plugins in the library into a plugin tiddler of type \\\"library\\\"\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.info = {\\n\\tname: \\\"makelibrary\\\",\\n\\tsynchronous: true\\n};\\n\\nvar UPGRADE_LIBRARY_TITLE = \\\"$:/UpgradeLibrary\\\";\\n\\nvar Command = function(params,commander,callback) {\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n\\tthis.callback = callback;\\n};\\n\\nCommand.prototype.execute = function() {\\n\\tvar wiki = this.commander.wiki,\\n\\t\\tfs = require(\\\"fs\\\"),\\n\\t\\tpath = require(\\\"path\\\"),\\n\\t\\tupgradeLibraryTitle = this.params[0] || UPGRADE_LIBRARY_TITLE,\\n\\t\\ttiddlers = {};\\n\\t// Collect up the library plugins\\n\\tvar collectPlugins = function(folder) {\\n\\t\\t\\tvar pluginFolders = $tw.utils.getSubdirectories(folder) || [];\\n\\t\\t\\tfor(var p=0; p\u003CpluginFolders.length; p++) {\\n\\t\\t\\t\\tif(!$tw.boot.excludeRegExp.test(pluginFolders[p])) {\\n\\t\\t\\t\\t\\tpluginFields = $tw.loadPluginFolder(path.resolve(folder,\\\"./\\\" + pluginFolders[p]));\\n\\t\\t\\t\\t\\tif(pluginFields && pluginFields.title) {\\n\\t\\t\\t\\t\\t\\ttiddlers[pluginFields.title] = pluginFields;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t},\\n\\t\\tcollectPublisherPlugins = function(folder) {\\n\\t\\t\\tvar publisherFolders = $tw.utils.getSubdirectories(folder) || [];\\n\\t\\t\\tfor(var t=0; t\u003CpublisherFolders.length; t++) {\\n\\t\\t\\t\\tif(!$tw.boot.excludeRegExp.test(publisherFolders[t])) {\\n\\t\\t\\t\\t\\tcollectPlugins(path.resolve(folder,\\\"./\\\" + publisherFolders[t]));\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t};\\n\\t$tw.utils.each($tw.getLibraryItemSearchPaths($tw.config.pluginsPath,$tw.config.pluginsEnvVar),collectPublisherPlugins);\\n\\t$tw.utils.each($tw.getLibraryItemSearchPaths($tw.config.themesPath,$tw.config.themesEnvVar),collectPublisherPlugins);\\n\\t$tw.utils.each($tw.getLibraryItemSearchPaths($tw.config.languagesPath,$tw.config.languagesEnvVar),collectPlugins);\\n\\t// Save the upgrade library tiddler\\n\\tvar pluginFields = {\\n\\t\\ttitle: upgradeLibraryTitle,\\n\\t\\ttype: \\\"application/json\\\",\\n\\t\\t\\\"plugin-type\\\": \\\"library\\\",\\n\\t\\t\\\"text\\\": JSON.stringify({tiddlers: tiddlers})\\n\\t};\\n\\twiki.addTiddler(new $tw.Tiddler(pluginFields));\\n\\treturn null;\\n};\\n\\nexports.Command = Command;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/output.js\":{\"title\":\"$:/core/modules/commands/output.js\",\"text\":\"/*\\\\\\ntitle: $
2731:/core/modules/commands/output.js\\ntype: application/javascript\\nmodule-type: command\\n\\nCommand to set the default output location (defaults to current working directory)\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.info = {\\n\\tname: \\\"output\\\",\\n\\tsynchronous: true\\n};\\n\\nvar Command = function(params,commander,callback) {\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n\\tthis.callback = callback;\\n};\\n\\nCommand.prototype.execute = function() {\\n\\tvar fs = require(\\\"fs\\\"),\\n\\t\\tpath = require(\\\"path\\\");\\n\\tif(this.params.length \u003C 1) {\\n\\t\\treturn \\\"Missing output path\\\";\\n\\t}\\n\\tthis.commander.outputPath = path.resolve(process.cwd(),this.params[0]);\\n\\treturn null;\\n};\\n\\nexports.Command = Command;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/password.js\":{\"title\":\"$:/core/modules/commands/password.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/commands/password.js\\ntype: application/javascript\\nmodule-type: command\\n\\nSave password for crypto operations\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.info = {\\n\\tname: \\\"password\\\",\\n\\tsynchronous: true\\n};\\n\\nvar Command = function(params,commander,callback) {\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n\\tthis.callback = callback;\\n};\\n\\nCommand.prototype.execute = function() {\\n\\tif(this.params.length \u003C 1) {\\n\\t\\treturn \\\"Missing password\\\";\\n\\t}\\n\\t$tw.crypto.setPassword(this.params[0]);\\n\\treturn null;\\n};\\n\\nexports.Command = Command;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/render.js\":{\"title\":\"$:/core/modules/commands/render.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/commands/render.js\\ntype: application/javascript\\nmodule-type: command\\n\\nRender individual tiddlers and save the results to the specified files\\n\\n\\\\*/\\n(function(){\\n\\n\\t/*jslint node: true, browser: true */\\n\\t/*global $tw: false */\\n\\t\\\"use strict\\\";\\n\\t\\n\\tvar widget = require(\\\"$:/core/modules/widgets/widget.js\\\");\\n\\t\\n\\texports.info = {\\n\\t\\tname: \\\"render\\\",\\n\\t\\tsynchronous: true\\n\\t};\\n\\t\\n\\tvar Command = function(params,commander,callback) {\\n\\t\\tthis.params = params;\\n\\t\\tthis.commander = commander;\\n\\t\\tthis.callback = callback;\\n\\t};\\n\\t\\n\\tCommand.prototype.execute = function() {\\n\\t\\tif(this.params.length \u003C 1) {\\n\\t\\t\\treturn \\\"Missing tiddler filter\\\";\\n\\t\\t}\\n\\t\\tvar self = this,\\n\\t\\t\\tfs = require(\\\"fs\\\"),\\n\\t\\t\\tpath = require(\\\"path\\\"),\\n\\t\\t\\twiki = this.commander.wiki,\\n\\t\\t\\ttiddlerFilter = this.params[0],\\n\\t\\t\\tfilenameFilter = this.params[1] || \\\"[is[tiddler]addsuffix[.html]]\\\",\\n\\t\\t\\ttype = this.params[2] || \\\"text/html\\\",\\n\\t\\t\\ttemplate = this.params[3],\\n\\t\\t\\tvariableList = this.params.slice(4),\\n\\t\\t\\ttiddlers = wiki.filterTiddlers(tiddlerFilter),\\n\\t\\t\\tvariables =  Object.create(null);\\n\\t\\t\\twhile(variableList.length >= 2) {\\n\\t\\t\\t\\tvariables[variableList[0]] = variableList[1];\\n\\t\\t\\t\\tvariableList = variableList.slice(2);\\n\\t\\t\\t}\\n\\t\\t$tw.utils.each(tiddlers,function(title) {\\n\\t\\t\\tvar filepath = path.resolve(self.commander.outputPath,wiki.filterTiddlers(filenameFilter,$tw.rootWidget,wiki.makeTiddlerIterator([title]))[0]);\\n\\t\\t\\tif(self.commander.verbose) {\\n\\t\\t\\t\\tconsole.log(\\\"Rendering \\\\\\\"\\\" + title + \\\"\\\\\\\" to \\\\\\\"\\\" + filepath + \\\"\\\\\\\"\\\");\\n\\t\\t\\t}\\n\\t\\t\\tvar parser = wiki.parseTiddler(template || title),\\n\\t\\t\\t\\twidgetNode = wiki.makeWidget(parser,{variables: $tw.utils.extend({},variables,{currentTiddler: title,storyTiddler: title})}),\\n\\t\\t\\t\\tcontainer = $tw.fakeDocument.createElement(\\\"div\\\");\\n\\t\\t\\twidgetNode.render(container,null);\\n\\t\\t\\tvar text = type === \\\"text/html\\\" ? container.innerHTML : container.textContent;
2731\\n\\t\\t\\t$tw.utils.createFileDirectories(filepath);\\n\\t\\t\\tfs.writeFileSync(filepath,text,\\\"utf8\\\");\\n\\t\\t});\\n\\t\\treturn null;\\n\\t};\\n\\t\\n\\texports.Command = Command;\\n\\t\\n\\t})();\\n\\t\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/rendertiddler.js\":{\"title\":\"$:/core/modules/commands/rendertiddler.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/commands/rendertiddler.js\\ntype: application/javascript\\nmodule-type: command\\n\\nCommand to render a tiddler and save it to a file\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.info = {\\n\\tname: \\\"rendertiddler\\\",\\n\\tsynchronous: false\\n};\\n\\nvar Command = function(params,commander,callback) {\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n\\tthis.callback = callback;\\n};\\n\\nCommand.prototype.execute = function() {\\n\\tif(this.params.length \u003C 2) {\\n\\t\\treturn \\\"Missing filename\\\";\\n\\t}\\n\\tvar self = this,\\n\\t\\tfs = require(\\\"fs\\\"),\\n\\t\\tpath = require(\\\"path\\\"),\\n\\t\\ttitle = this.params[0],\\n\\t\\tfilename = path.resolve(this.commander.outputPath,this.params[1]),\\n\\t\\ttype = this.params[2] || \\\"text/html\\\",\\n\\t\\ttemplate = this.params[3],\\n\\t\\tname = this.params[4],\\n\\t\\tvalue = this.params[5],\\n\\t\\tvariables = {};\\n\\t$tw.utils.createFileDirectories(filename);\\n\\tif(template) {\\n\\t\\tvariables.currentTiddler = title;\\n\\t\\tvariables.storyTiddler = title;\\n\\t\\ttitle = template;\\n\\t}\\n\\tif(name && value) {\\n\\t\\tvariables[name] = value;\\n\\t}\\n\\tfs.writeFile(filename,this.commander.wiki.renderTiddler(type,title,{variables: variables}),\\\"utf8\\\",function(err) {\\n\\t\\tself.callback(err);\\n\\t});\\n\\treturn null;\\n};\\n\\nexports.Command = Command;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/rendertiddlers.js\":{\"title\":\"$:/core/modules/commands/rendertiddlers.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/commands/rendertiddlers.js\\ntype: application/javascript\\nmodule-type: command\\n\\nCommand to render several tiddlers to a folder of files\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar widget = require(\\\"$:/core/modules/widgets/widget.js\\\");\\n\\nexports.info = {\\n\\tname: \\\"rendertiddlers\\\",\\n\\tsynchronous: true\\n};\\n\\nvar Command = function(params,commander,callback) {\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n\\tthis.callback = callback;\\n};\\n\\nCommand.prototype.execute = function() {\\n\\tif(this.params.length \u003C 2) {\\n\\t\\treturn \\\"Missing filename\\\";\\n\\t}\\n\\tvar self = this,\\n\\t\\tfs = require(\\\"fs\\\"),\\n\\t\\tpath = require(\\\"path\\\"),\\n\\t\\twiki = this.commander.wiki,\\n\\t\\tfilter = this.params[0],\\n\\t\\ttemplate = this.params[1],\\n\\t\\toutputPath = this.commander.outputPath,\\n\\t\\tpathname = path.resolve(outputPath,this.params[2]),\\n\\t\\ttype = this.params[3] || \\\"text/html\\\",\\n\\t\\textension = this.params[4] || \\\".html\\\",\\n\\t\\tdeleteDirectory = (this.params[5] || \\\"\\\").toLowerCase() !== \\\"noclean\\\",\\n\\t\\ttiddlers = wiki.filterTiddlers(filter);\\n\\tif(deleteDirectory) {\\n\\t\\t$tw.utils.deleteDirectory(pathname);\\n\\t}\\n\\t$tw.utils.each(tiddlers,function(title) {\\n\\t\\tvar parser = wiki.parseTiddler(template),\\n\\t\\t\\twidgetNode = wiki.makeWidget(parser,{variables: {currentTiddler: title, storyTiddler: title}}),\\n\\t\\t\\tcontainer = $tw.fakeDocument.createElement(\\\"div\\\");\\n\\t\\twidgetNode.render(container,null);\\n\\t\\tvar text = type === \\\"text/html\\\" ? container.innerHTML : container.textContent,\\n\\t\\t\\texportPath = null;\\n\\t\\tif($tw.utils.hop($tw.macros,\\\"tv-get-export-path\\\")) {\\n\\t\\t\\tvar macroPath = $tw.macros[\\\"tv-get-export-path\\\"].run.apply(self,[title]);\\n\\t\\t\\tif(macroPath) {\\n\\t\\t\\t\\texportPath = path.resolve(outputPath,macroPath + extension);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tvar finalPath = exportPath || path.resolve(pathname,$tw.utils.encodeURIComponentExtended(title) + extension);\\n\\t\\t$tw.utils.createFileDirectories(finalPath);\\n\\t\\tfs.writeFileSync(finalPath,text,\\\"utf8\\\");\\n\\t});\\n\\treturn null;\\n};\\n\\nexports.Command = Command;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/save.js\":{\"title\":\"$:/core/modules/commands/save.js\",\"text\":\"/*\\\\\\ntitle: $
2731:/core/modules/commands/save.js\\ntype: application/javascript\\nmodule-type: command\\n\\nSaves individual tiddlers in their raw text or binary format to the specified files\\n\\n\\\\*/\\n(function(){\\n\\n\\t/*jslint node: true, browser: true */\\n\\t/*global $tw: false */\\n\\t\\\"use strict\\\";\\n\\t\\n\\texports.info = {\\n\\t\\tname: \\\"save\\\",\\n\\t\\tsynchronous: true\\n\\t};\\n\\t\\n\\tvar Command = function(params,commander,callback) {\\n\\t\\tthis.params = params;\\n\\t\\tthis.commander = commander;\\n\\t\\tthis.callback = callback;\\n\\t};\\n\\t\\n\\tCommand.prototype.execute = function() {\\n\\t\\tif(this.params.length \u003C 1) {\\n\\t\\t\\treturn \\\"Missing filename filter\\\";\\n\\t\\t}\\n\\t\\tvar self = this,\\n\\t\\t\\tfs = require(\\\"fs\\\"),\\n\\t\\t\\tpath = require(\\\"path\\\"),\\n\\t\\t\\tresult = null,\\n\\t\\t\\twiki = this.commander.wiki,\\n\\t\\t\\ttiddlerFilter = this.params[0],\\n\\t\\t\\tfilenameFilter = this.params[1] || \\\"[is[tiddler]]\\\",\\n\\t\\t\\ttiddlers = wiki.filterTiddlers(tiddlerFilter);\\n\\t\\t$tw.utils.each(tiddlers,function(title) {\\n\\t\\t\\tif(!result) {\\n\\t\\t\\t\\tvar tiddler = self.commander.wiki.getTiddler(title);\\n\\t\\t\\t\\tif(tiddler) {\\n\\t\\t\\t\\t\\tvar fileInfo = $tw.utils.generateTiddlerFileInfo(tiddler,{\\n\\t\\t\\t\\t\\t\\tdirectory: path.resolve(self.commander.outputPath),\\n\\t\\t\\t\\t\\t\\tpathFilters: [filenameFilter],\\n\\t\\t\\t\\t\\t\\twiki: wiki,\\n\\t\\t\\t\\t\\t\\tfileInfo: {}\\n\\t\\t\\t\\t\\t});\\n\\t\\t\\t\\t\\tif(self.commander.verbose) {\\n\\t\\t\\t\\t\\t\\tconsole.log(\\\"Saving \\\\\\\"\\\" + title + \\\"\\\\\\\" to \\\\\\\"\\\" + fileInfo.filepath + \\\"\\\\\\\"\\\");\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\ttry {\\n\\t\\t\\t\\t\\t\\t$tw.utils.saveTiddlerToFileSync(tiddler,fileInfo);\\n\\t\\t\\t\\t\\t} catch (err) {\\n\\t\\t\\t\\t\\t\\tresult = \\\"Error saving tiddler \\\\\\\"\\\" + title + \\\"\\\\\\\", to file: \\\\\\\"\\\" + fileInfo.filepath + \\\"\\\\\\\"\\\";\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tresult = \\\"Tiddler '\\\" + title + \\\"' not found\\\";\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t});\\n\\t\\treturn result;\\n\\t};\\n\\t\\n\\texports.Command = Command;\\n\\t\\n\\t})();\\n\\t\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/savelibrarytiddlers.js\":{\"title\":\"$:/core/modules/commands/savelibrarytiddlers.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/commands/savelibrarytiddlers.js\\ntype: application/javascript\\nmodule-type: command\\n\\nCommand to save the subtiddlers of a bundle tiddler as a series of JSON files\\n\\n--savelibrarytiddlers \u003Ctiddler> \u003Ctiddler-filter> \u003Cpathname> \u003Cskinnylisting>\\n\\nThe tiddler identifies the bundle tiddler that contains the subtiddlers.\\n\\nThe tiddler filter specifies the plugins to be included.\\n\\nThe pathname specifies the pathname to the folder in which the JSON files should be saved. The filename is the URL encoded title of the subtiddler.\\n\\nThe skinnylisting specifies the title of the tiddler to which a JSON catalogue of the subtiddlers will be saved. The JSON file contains the same data as the bundle tiddler but with the `text` field removed.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.info = {\\n\\tname: \\\"savelibrarytiddlers\\\",\\n\\tsynchronous: true\\n};\\n\\nvar Command = function(params,commander,callback) {\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n\\tthis.callback = callback;\\n};\\n\\nCommand.prototype.execute = function() {\\n\\tif(this.params.length \u003C 2) {\\n\\t\\treturn \\\"Missing filename\\\";\\n\\t}\\n\\tvar self = this,\\n\\t\\tfs = require(\\\"fs\\\"),\\n\\t\\tpath = require(\\\"path\\\"),\\n\\t\\tcontainerTitle = this.params[0],\\n\\t\\tfilter = this.params[1],\\n\\t\\tbasepath = this.params[2],\\n\\t\\tskinnyListTitle = this.params[3];\\n\\t// Get the container tiddler as data\\n\\tvar containerData = self.commander.wiki.getTiddlerDataCached(containerTitle,undefined);\\n\\tif(!containerData) {\\n\\t\\treturn \\\"'\\\" + containerTitle + \\\"' is not a t
2731iddler bundle\\\";\\n\\t}\\n\\t// Filter the list of plugins\\n\\tvar pluginList = [];\\n\\t$tw.utils.each(containerData.tiddlers,function(tiddler,title) {\\n\\t\\tpluginList.push(title);\\n\\t});\\n\\tvar filteredPluginList;\\n\\tif(filter) {\\n\\t\\tfilteredPluginList = self.commander.wiki.filterTiddlers(filter,null,self.commander.wiki.makeTiddlerIterator(pluginList));\\n\\t} else {\\n\\t\\tfilteredPluginList = pluginList;\\n\\t}\\n\\t// Iterate through the plugins\\n\\tvar skinnyList = [];\\n\\t$tw.utils.each(filteredPluginList,function(title) {\\n\\t\\tvar tiddler = containerData.tiddlers[title];\\n\\t\\t// Save each JSON file and collect the skinny data\\n\\t\\tvar pathname = path.resolve(self.commander.outputPath,basepath + $tw.utils.encodeURIComponentExtended(title) + \\\".json\\\");\\n\\t\\t$tw.utils.createFileDirectories(pathname);\\n\\t\\tfs.writeFileSync(pathname,JSON.stringify(tiddler),\\\"utf8\\\");\\n\\t\\t// Collect the skinny list data\\n\\t\\tvar pluginTiddlers = $tw.utils.parseJSONSafe(tiddler.text),\\n\\t\\t\\treadmeContent = (pluginTiddlers.tiddlers[title + \\\"/readme\\\"] || {}).text,\\n\\t\\t\\tdoesRequireReload = !!self.commander.wiki.doesPluginInfoRequireReload(pluginTiddlers),\\n\\t\\t\\ticonTiddler = pluginTiddlers.tiddlers[title + \\\"/icon\\\"] || {},\\n\\t\\t\\ticonType = iconTiddler.type,\\n\\t\\t\\ticonText = iconTiddler.text,\\n\\t\\t\\ticonContent;\\n\\t\\tif(iconType && iconText) {\\n\\t\\t\\ticonContent = $tw.utils.makeDataUri(iconText,iconType);\\n\\t\\t}\\n\\t\\tskinnyList.push($tw.utils.extend({},tiddler,{\\n\\t\\t\\ttext: undefined,\\n\\t\\t\\treadme: readmeContent,\\n\\t\\t\\t\\\"requires-reload\\\": doesRequireReload ? \\\"yes\\\" : \\\"no\\\",\\n\\t\\t\\ticon: iconContent\\n\\t\\t}));\\n\\t});\\n\\t// Save the catalogue tiddler\\n\\tif(skinnyListTitle) {\\n\\t\\tself.commander.wiki.setTiddlerData(skinnyListTitle,skinnyList);\\n\\t}\\n\\treturn null;\\n};\\n\\nexports.Command = Command;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/savetiddler.js\":{\"title\":\"$:/core/modules/commands/savetiddler.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/commands/savetiddler.js\\ntype: application/javascript\\nmodule-type: command\\n\\nCommand to save the content of a tiddler to a file\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.info = {\\n\\tname: \\\"savetiddler\\\",\\n\\tsynchronous: false\\n};\\n\\nvar Command = function(params,commander,callback) {\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n\\tthis.callback = callback;\\n};\\n\\nCommand.prototype.execute = function() {\\n\\tif(this.params.length \u003C 2) {\\n\\t\\treturn \\\"Missing filename\\\";\\n\\t}\\n\\tvar self = this,\\n\\t\\tfs = require(\\\"fs\\\"),\\n\\t\\tpath = require(\\\"path\\\"),\\n\\t\\ttitle = this.params[0],\\n\\t\\tfilename = path.resolve(this.commander.outputPath,this.params[1]),\\n\\t\\ttiddler = this.commander.wiki.getTiddler(title);\\n\\tif(tiddler) {\\n\\t\\tvar type = tiddler.fields.type || \\\"text/vnd.tiddlywiki\\\",\\n\\t\\t\\tcontentTypeInfo = $tw.config.contentTypeInfo[type] || {encoding: \\\"utf8\\\"};\\n\\t\\t$tw.utils.createFileDirectories(filename);\\n\\t\\tfs.writeFile(filename,tiddler.fields.text,contentTypeInfo.encoding,function(err) {\\n\\t\\t\\tself.callback(err);\\n\\t\\t});\\n\\t} else {\\n\\t\\treturn \\\"Missing tiddler: \\\" + title;\\n\\t}\\n\\treturn null;\\n};\\n\\nexports.Command = Command;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/savetiddlers.js\":{\"title\":\"$:/core/modules/commands/savetiddlers.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/commands/savetiddlers.js\\ntype: application/javascript\\nmodule-type: command\\n\\nCommand to save several tiddlers to a folder of files\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar widget = require(\\\"$:/core/modules/widgets/widget.js\\\");\\n\\nexports.info = {\\n\\tname: \\\"savetiddlers\\\",\\n\\tsynchronous: true\\n};\\n\\nvar Command = function(params,commander,callback) {\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n\\tthis.callback = callback;\\n};\\n\\nCommand.prototype.execute = function() {\\n\\tif(this.params.length \u003C 1) {\\n\\t\\treturn \\\"Missing filename\\\";\\n\\t}\\n\\tvar self = this,\\n\\t\\tfs = require(\\\"fs\\\"),\\n\\t\\tpath = require(\\\"path\\\"),\\n\\t\\twiki = this.commander.wiki,\\n\\t\\tfilter = this.params[0],\\n\\t\\tpathname = path.resolve(this.commander.outputPath,this.params[1]),\\n\\t\\tdeleteDirectory = (this.params[2] || \\\"\\\").toLowerCase() !== \\\"noclean\\\",\\n\\t\\ttiddlers = wiki.filterTiddlers(filter);\\n\\tif(deleteDirectory) {\\n\\t\\t$tw.utils.deleteDirectory(pathname);\\n\\t}\\n\\t$tw.utils.createDirectory(pathname);\\n\\t$tw.utils.each(tiddlers,function(title) {\\n\\t\\tvar tiddler = self.commander.wiki.getTiddler(title),\\n\\t\\t\\ttype = ti
2731ddler.fields.type || \\\"text/vnd.tiddlywiki\\\",\\n\\t\\t\\tcontentTypeInfo = $tw.config.contentTypeInfo[type] || {encoding: \\\"utf8\\\"},\\n\\t\\t\\tfilename = path.resolve(pathname,$tw.utils.encodeURIComponentExtended(title));\\n\\t\\tfs.writeFileSync(filename,tiddler.fields.text,contentTypeInfo.encoding);\\n\\t});\\n\\treturn null;\\n};\\n\\nexports.Command = Command;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/savewikifolder.js\":{\"title\":\"$:/core/modules/commands/savewikifolder.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/commands/savewikifolder.js\\ntype: application/javascript\\nmodule-type: command\\n\\nCommand to save the current wiki as a wiki folder\\n\\n--savewikifolder \u003Cwikifolderpath> [ [\u003Cname>=\u003Cvalue>] ]*\\n\\nThe following options are supported:\\n\\n* ''filter'': a filter expression defining the tiddlers to be included in the output\\n* ''explodePlugins'': set to \\\"no\\\" to suppress exploding plugins into their constituent shadow tiddlers (defaults to \\\"yes\\\")\\n\\nSupports backward compatibility with --savewikifolder \u003Cwikifolderpath> [\u003Cfilter>] [ [\u003Cname>=\u003Cvalue>] ]*\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.info = {\\n\\tname: \\\"savewikifolder\\\",\\n\\tsynchronous: true\\n};\\n\\nvar fs,path;\\nif($tw.node) {\\n\\tfs = require(\\\"fs\\\");\\n\\tpath = require(\\\"path\\\");\\n}\\n\\nvar Command = function(params,commander,callback) {\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n\\tthis.callback = callback;\\n};\\n\\nCommand.prototype.execute = function() {\\n\\tif(this.params.length \u003C 1) {\\n\\t\\treturn \\\"Missing wiki folder path\\\";\\n\\t}\\n\\tvar regFilter = /^[a-zA-Z0-9\\\\.\\\\-_]+=/g,  // dynamic parameters\\n\\t\\tnamedParames,\\n\\t\\ttiddlerFilter,\\n\\t\\toptions = {};\\n\\tif (regFilter.test(this.params[1])) {  \\n\\t\\tnamedParames = this.commander.extractNamedParameters(this.params.slice(1));\\n\\t\\ttiddlerFilter = namedParames.filter || \\\"[all[tiddlers]]\\\";\\n\\t} else {\\n\\t\\tnamedParames = this.commander.extractNamedParameters(this.params.slice(2));\\n\\t\\ttiddlerFilter = this.params[1];\\n\\t}\\n\\ttiddlerFilter = tiddlerFilter || \\\"[all[tiddlers]]\\\";\\n\\toptions.explodePlugins = namedParames.explodePlugins || \\\"yes\\\";\\n\\tvar wikifoldermaker = new WikiFolderMaker(this.params[0],tiddlerFilter,this.commander,options);\\n\\treturn wikifoldermaker.save();\\n};\\n\\nfunction WikiFolderMaker(wikiFolderPath,wikiFilter,commander,options) {\\n\\tthis.wikiFolderPath = wikiFolderPath;\\n\\tthis.wikiFilter = wikiFilter;\\n\\tthis.commander = commander;\\n\\tthis.explodePlugins = options.explodePlugins;\\n\\tthis.wiki = commander.wiki;\\n\\tthis.savedPaths = []; // So that we can detect filename clashes\\n}\\n\\nWikiFolderMaker.prototype.log = function(str) {\\n\\tif(this.commander.verbose) {\\n\\t\\tconsole.log(str);\\n\\t}\\n};\\n\\nWikiFolderMaker.prototype.tiddlersToIgnore = [\\n\\t\\\"$:/boot/boot.css\\\",\\n\\t\\\"$:/boot/boot.js\\\",\\n\\t\\\"$:/boot/bootprefix.js\\\",\\n\\t\\\"$:/core\\\",\\n\\t\\\"$:/library/sjcl.js\\\",\\n\\t\\\"$:/temp/info-plugin\\\"\\n];\\n\\n/*\\nReturns null if successful, or an error string if there was an error\\n*/\\nWikiFolderMaker.prototype.save = function() {\\n\\tvar self = this;\\n\\t// Check that the output directory doesn't exist\\n\\tif(fs.existsSync(this.wikiFolderPath) && !$tw.utils.isDirectoryEmpty(this.wikiFolderPath)) {\\n\\t\\treturn \\\"The unpackwiki command requires that the output wiki folder be empty\\\";\\n\\t}\\n\\t// Get the tiddlers from the source wiki\\n\\tvar tiddlerTitles = this.wiki.filterTiddlers(this.wikiFilter);\\n\\t// Initialise a new tiddlwiki.info file\\n\\tvar newWikiInfo = {};\\n\\t// Process each incoming tiddler in turn\\n\\t$tw.utils.each(tiddlerTitles,function(title) {\\n\\t\\tvar tiddler = self.wiki.getTiddler(title);\\n\\t\\tif(tiddler) {\\n\\t\\t\\tif(self.tiddlersToIgnore.indexOf(title) !== -1) {\\n\\t\\t\\t\\t// Ignore the core plugin and the ephemeral info plugin\\n\\t\\t\\t\\tself.log(\\\"Ignoring tiddler: \\\" + title);\\n\\t\\t\\t}
2731 else {\\n\\t\\t\\t\\tvar type = tiddler.fields.type,\\n\\t\\t\\t\\t\\tpluginType = tiddler.fields[\\\"plugin-type\\\"];\\n\\t\\t\\t\\tif(type === \\\"application/json\\\" && pluginType) {\\n\\t\\t\\t\\t\\t// Plugin tiddler\\n\\t\\t\\t\\t\\tvar libraryDetails = self.findPluginInLibrary(title);\\n\\t\\t\\t\\t\\tif(libraryDetails) {\\n\\t\\t\\t\\t\\t\\t// A plugin from the core library\\n\\t\\t\\t\\t\\t\\tself.log(\\\"Adding built-in plugin: \\\" + libraryDetails.name);\\n\\t\\t\\t\\t\\t\\tnewWikiInfo[libraryDetails.type] = newWikiInfo[libraryDetails.type]  || [];\\n\\t\\t\\t\\t\\t\\t$tw.utils.pushTop(newWikiInfo[libraryDetails.type],libraryDetails.name);\\n\\t\\t\\t\\t\\t} else if(self.explodePlugins !== \\\"no\\\") {\\n\\t\\t\\t\\t\\t\\t// A custom plugin\\n\\t\\t\\t\\t\\t\\tself.log(\\\"Processing custom plugin: \\\" + title);\\n\\t\\t\\t\\t\\t\\tself.saveCustomPlugin(tiddler);\\n\\t\\t\\t\\t\\t} else if(self.explodePlugins === \\\"no\\\") {\\n\\t\\t\\t\\t\\t\\tself.log(\\\"Processing custom plugin to tiddlders folder: \\\" + title);\\n\\t\\t\\t\\t\\t\\tself.saveTiddler(\\\"tiddlers\\\", tiddler);\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t// Ordinary tiddler\\n\\t\\t\\t\\t\\tself.saveTiddler(\\\"tiddlers\\\",tiddler);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t});\\n\\t// Save the tiddlywiki.info file\\n\\tthis.saveJSONFile(\\\"tiddlywiki.info\\\",newWikiInfo);\\n\\tself.log(\\\"Writing tiddlywiki.info: \\\" + JSON.stringify(newWikiInfo,null,$tw.config.preferences.jsonSpaces));\\n\\treturn null;\\n};
2731\\n\\n/*\\nTest whether the specified tiddler is a plugin in the plugin library\\n*/\\nWikiFolderMaker.prototype.findPluginInLibrary = function(title) {\\n\\tvar parts = title.split(\\\"/\\\"),\\n\\t\\tpluginPath, type, name;\\n\\tif(parts[0] === \\\"$:\\\") {\\n\\t\\tif(parts[1] === \\\"languages\\\" && parts.length === 3) {\\n\\t\\t\\tpluginPath = \\\"languages\\\" + path.sep + parts[2];\\n\\t\\t\\ttype = parts[1];\\n\\t\\t\\tname = parts[2];\\n\\t\\t} else if(parts[1] === \\\"plugins\\\" || parts[1] === \\\"themes\\\" && parts.length === 4) {\\n\\t\\t\\tpluginPath = parts[1] + path.sep + parts[2] + path.sep + parts[3];\\n\\t\\t\\ttype = parts[1];\\n\\t\\t\\tname = parts[2] + \\\"/\\\" + parts[3];\\n\\t\\t}\\n\\t}\\n\\tif(pluginPath && type && name) {\\n\\t\\tpluginPath = path.resolve($tw.boot.bootPath,\\\"..\\\",pluginPath);\\n\\t\\tif(fs.existsSync(pluginPath)) {\\n\\t\\t\\treturn {\\n\\t\\t\\t\\tpluginPath: pluginPath,\\n\\t\\t\\t\\ttype: type,\\n\\t\\t\\t\\tname: name\\n\\t\\t\\t};\\n\\t\\t}\\n\\t}\\n\\treturn false;\\n};\\n\\nWikiFolderMaker.prototype.saveCustomPlugin = function(pluginTiddler) {\\n\\tvar self = this,\\n\\t\\tpluginTitle = pluginTiddler.fields.title,\\n\\t\\ttitleParts = pluginTitle.split(\\\"/\\\"),\\n\\t\\tdirectory = $tw.utils.generateTiddlerFilepath(titleParts[titleParts.length - 1],{\\n\\t\\t\\tdirectory: path.resolve(this.wikiFolderPath,pluginTiddler.fields[\\\"plugin-type\\\"] + \\\"s\\\")\\n\\t\\t}),\\n\\t\\tpluginInfo = pluginTiddler.getFieldStrings({exclude: [\\\"text\\\",\\\"type\\\"]});\\n\\tthis.saveJSONFile(directory + path.sep + \\\"plugin.info\\\",pluginInfo);\\n\\tself.log(\\\"Writing \\\" + directory + path.sep + \\\"plugin.info: \\\" + JSON.stringify(pluginInfo,null,$tw.config.preferences.jsonSpaces));\\n\\tvar pluginTiddlers = $tw.utils.parseJSONSafe(pluginTiddler.fields.text).tiddlers; // A hashmap of tiddlers in the plugin\\n\\t$tw.utils.each(pluginTiddlers,function(tiddler) {\\n\\t\\tself.saveTiddler(directory,new $tw.Tiddler(tiddler));\\n\\t});\\n};\\n\\nWikiFolderMaker.prototype.saveTiddler = function(directory,tiddler) {\\n\\tvar title = tiddler.fields.title, fileInfo, pathFilters, extFilters;\\n\\tif(this.wiki.tiddlerExists(\\\"$:/config/FileSystemPaths\\\")) {\\n\\t\\tpathFilters = this.wiki.getTiddlerText(\\\"$:/config/FileSystemPaths\\\",\\\"\\\").split(\\\"\\\\n\\\");\\n\\t}\\n\\tif(this.wiki.tiddlerExists(\\\"$:/config/FileSystemExtensions\\\")) {\\n\\t\\textFilters = this.wiki.getTiddlerText(\\\"$:/config/FileSystemExtensions\\\",\\\"\\\").split(\\\"\\\\n\\\");\\n\\t}\\n\\tvar fileInfo = $tw.utils.generateTiddlerFileInfo(tiddler,{\\n\\t\\tdirectory: path.resolve(this.wikiFolderPath,directory),\\n\\t\\tpathFilters: pathFilters,\\n\\t\\textFilters: extFilters,\\n\\t\\twiki: this.wiki,\\n\\t\\tfileInfo: {}\\n\\t});\\n\\ttry {\\n\\t\\t$tw.utils.saveTiddlerToFileSync(tiddler,fileInfo);\\n\\t} catch (err) {\\n\\t\\tconsole.log(\\\"SaveWikiFolder: Error saving file '\\\" + fileInfo.filepath + \\\"', tiddler: '\\\" + tiddler.fields.title);\\n\\t}\\n};\\n\\nWikiFolderMaker.prototype.saveJSONFile = function(filename,json) {\\n\\tthis.saveTextFile(filename,JSON.stringify(json,null,$tw.config.preferences.jsonSpaces));\\n};\\n\\nWikiFolderMaker.prototype.saveTextFile = function(filename,data) {\\n\\tthis.saveFile(filename,\\\"utf8\\\",data);\\n};\\n\\nWikiFolderMaker.prototype.saveFile = function(filename,encoding,data) {\\n\\tvar filepath = path.resolve(this.wikiFolderPath,filename);\\n\\t$tw.utils.createFileDirectories(filepath);\\n\\tfs.writeFileSync(filepath,data,encoding);\\n};\\n\\nexports.Command = Command;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/server.js\":{\"title\":\"$:/core/modules/commands/server.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/commands/server.js\\ntype: application/javascript\\nmodule-type: command\\n\\nDeprecated legacy command for serving tiddlers\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Server = require(\\\"$:/core/modules/server/server.js\\\").Server;\\n\\nexports.info = {\\n\\tname: \\\"server\\\",\\n\\tsynchronous: true\\n};\\n\\nvar Command = function(params,commander,callback) {\\n\\tvar self = this;\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n\\tthis.callback = callback;\\n};\\n\\nCommand.prototype.execute = function() {\\n\\tif(!$tw.boot.wikiTiddlersPath) {\\n\\t\\t$tw.utils.warning(\\\"Warning: Wiki folder '\\\" + $tw.boot.wikiPath + \\\"' does not exist or is missing a tiddlywiki.info file\\\");\\n\\t}\\n\\t// Set up server\\n\\tthis.server = new Server({\\n\\t\\twiki: this.commander.wiki,\\n\\t\\tvariables: {\\n\\t\\t\\tport: this.params[0],\\n\\t\\t\\thost: this.params[6],\\n\\t\\t\\t\\\"root-tiddler\\\": this.params[1],\\n\\t\\t\\t\\\"root-render-type\\\": this.params[2],\\n\\t\\t\\t\\\"root-serve-type\\\": this.params[3],\\n\\t\\t\\tusername: this.params[4],\\n\\t\\t\\tpassword: this.params[5],\\n\\t\\t\\t\\\"path-prefix\\\": this.params[7],\\n\\t\\t\\t\\\"debug-level\\\": this.params[8]\\n\\t\\t}\\n\\t});\\n\\tvar nodeServer = this.server.listen();\\n\\t$tw.hooks.invokeHook(\\\"th-server-command-post-start\\\",this.server,nodeServer,\\\"tiddlywiki\\\");\\n\\treturn null;\\n};\\n\\nexports.Command = Command;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/setfield.js\":{\"title\":\"$:/core/modules/commands/setfield.js\",\"text\":\"/*\\\\\\ntitle: $
2731:/core/modules/commands/setfield.js\\ntype: application/javascript\\nmodule-type: command\\n\\nCommand to modify selected tiddlers to set a field to the text of a template tiddler that has been wikified with the selected tiddler as the current tiddler.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar widget = require(\\\"$:/core/modules/widgets/widget.js\\\");\\n\\nexports.info = {\\n\\tname: \\\"setfield\\\",\\n\\tsynchronous: true\\n};\\n\\nvar Command = function(params,commander,callback) {\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n\\tthis.callback = callback;\\n};\\n\\nCommand.prototype.execute = function() {\\n\\tif(this.params.length \u003C 4) {\\n\\t\\treturn \\\"Missing parameters\\\";\\n\\t}\\n\\tvar self = this,\\n\\t\\twiki = this.commander.wiki,\\n\\t\\tfilter = this.params[0],\\n\\t\\tfieldname = this.params[1] || \\\"text\\\",\\n\\t\\ttemplatetitle = this.params[2],\\n\\t\\trendertype = this.params[3] || \\\"text/plain\\\",\\n\\t\\ttiddlers = wiki.filterTiddlers(filter);\\n\\t$tw.utils.each(tiddlers,function(title) {\\n\\t\\tvar parser = wiki.parseTiddler(templatetitle),\\n\\t\\t\\tnewFields = {},\\n\\t\\t\\ttiddler = wiki.getTiddler(title);\\n\\t\\tif(parser) {\\n\\t\\t\\tvar widgetNode = wiki.makeWidget(parser,{variables: {currentTiddler: title}});\\n\\t\\t\\tvar container = $tw.fakeDocument.createElement(\\\"div\\\");\\n\\t\\t\\twidgetNode.render(container,null);\\n\\t\\t\\tnewFields[fieldname] = rendertype === \\\"text/html\\\" ? container.innerHTML : container.textContent;\\n\\t\\t} else {\\n\\t\\t\\tnewFields[fieldname] = undefined;\\n\\t\\t}\\n\\t\\twiki.addTiddler(new $tw.Tiddler(tiddler,newFields));\\n\\t});\\n\\treturn null;\\n};\\n\\nexports.Command = Command;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/unpackplugin.js\":{\"title\":\"$:/core/modules/commands/unpackplugin.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/commands/unpackplugin.js\\ntype: application/javascript\\nmodule-type: command\\n\\nCommand to extract the shadow tiddlers from within a plugin\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.info = {\\n\\tname: \\\"unpackplugin\\\",\\n\\tsynchronous: true\\n};\\n\\nvar Command = function(params,commander,callback) {\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n\\tthis.callback = callback;\\n};\\n\\nCommand.prototype.execute = function() {\\n\\tif(this.params.length \u003C 1) {\\n\\t\\treturn \\\"Missing plugin name\\\";\\n\\t}\\n\\tvar self = this,\\n\\t\\ttitle = this.params[0],\\n\\t\\tpluginData = this.commander.wiki.getTiddlerDataCached(title);\\n\\tif(!pluginData) {\\n\\t\\treturn \\\"Plugin '\\\" + title + \\\"' not found\\\";\\n\\t}\\n\\t$tw.utils.each(pluginData.tiddlers,function(tiddler) {\\n\\t\\tself.commander.wiki.addTiddler(new $tw.Tiddler(tiddler));\\n\\t});\\n\\treturn null;\\n};\\n\\nexports.Command = Command;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/verbose.js\":{\"title\":\"$:/core/modules/commands/verbose.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/commands/verbose.js\\ntype: application/javascript\\nmodule-type: command\\n\\nVerbose command\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.info = {\\n\\tname: \\\"verbose\\\",\\n\\tsynchronous: true\\n};\\n\\nvar Command = function(params,commander) {\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n};\\n\\nCommand.prototype.execute = function() {\\n\\tthis.commander.verbose = true;\\n\\t// Output the boot message log\\n\\tthis.commander.streams.output.write(\\\"Boot log:\\\\n  \\\" + $tw.boot.logMessages.join(\\\"\\\\n  \\\") + \\\"\\\\n\\\");\\n\\treturn null; // No error\\n};\\n\\nexports.Command = Command;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/commands/version.js\":{\"title\":\"$:/core/modules/commands/version.js\",\"text\":\"/*\\\\\\ntitle: $
2731:/core/modules/commands/version.js\\ntype: application/javascript\\nmodule-type: command\\n\\nVersion command\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.info = {\\n\\tname: \\\"version\\\",\\n\\tsynchronous: true\\n};\\n\\nvar Command = function(params,commander) {\\n\\tthis.params = params;\\n\\tthis.commander = commander;\\n};\\n\\nCommand.prototype.execute = function() {\\n\\tthis.commander.streams.output.write($tw.version + \\\"\\\\n\\\");\\n\\treturn null; // No error\\n};\\n\\nexports.Command = Command;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"command\"},\"$:/core/modules/config.js\":{\"title\":\"$:/core/modules/config.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/config.js\\ntype: application/javascript\\nmodule-type: config\\n\\nCore configuration constants\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.preferences = {};\\n\\nexports.preferences.notificationDuration = 3 * 1000;\\nexports.preferences.jsonSpaces = 4;\\n\\nexports.textPrimitives = {\\n\\tupperLetter: \\\"[A-Z\\\\u00c0-\\\\u00d6\\\\u00d8-\\\\u00de\\\\u0150\\\\u0170]\\\",\\n\\tlowerLetter: \\\"[a-z\\\\u00df-\\\\u00f6\\\\u00f8-\\\\u00ff\\\\u0151\\\\u0171]\\\",\\n\\tanyLetter:   \\\"[A-Za-z0-9\\\\u00c0-\\\\u00d6\\\\u00d8-\\\\u00de\\\\u00df-\\\\u00f6\\\\u00f8-\\\\u00ff\\\\u0150\\\\u0170\\\\u0151\\\\u0171]\\\",\\n\\tblockPrefixLetters:\\t\\\"[A-Za-z0-9-_\\\\u00c0-\\\\u00d6\\\\u00d8-\\\\u00de\\\\u00df-\\\\u00f6\\\\u00f8-\\\\u00ff\\\\u0150\\\\u0170\\\\u0151\\\\u0171]\\\"\\n};\\n\\nexports.textPrimitives.unWikiLink = \\\"~\\\";\\nexports.textPrimitives.wikiLink = exports.textPrimitives.upperLetter + \\\"+\\\" +\\n\\texports.textPrimitives.lowerLetter + \\\"+\\\" +\\n\\texports.textPrimitives.upperLetter +\\n\\texports.textPrimitives.anyLetter + \\\"*\\\";\\n\\nexports.htmlEntities = {quot:34, dollar:36, amp:38, apos:39, lt:60, gt:62, nbsp:160, iexcl:161, cent:162, pound:163, curren:164, yen:165, brvbar:166, sect:167, uml:168, copy:169, ordf:170, laquo:171, not:172, shy:173, reg:174, macr:175, deg:176, plusmn:177, sup2:178, sup3:179, acute:180, micro:181, para:182, middot:183, cedil:184, sup1:185, ordm:186, raquo:187, frac14:188, frac12:189, frac34:190, iquest:191, Agrave:192, Aacute:193, Acirc:194, Atilde:195, Auml:196, Aring:197, AElig:198, Ccedil:199, Egrave:200, Eacute:201, Ecirc:202, Euml:203, Igrave:204, Iacute:205, Icirc:206, Iuml:207, ETH:208, Ntilde:209, Ograve:210, Oacute:211, Ocirc:212, Otilde:213, Ouml:214, times:215, Oslash:216, Ugrave:217, Uacute:218, Ucirc:219, Uuml:220, Yacute:221, THORN:222, szlig:223, agrave:224, aacute:225, acirc:226, atilde:227, auml:228, aring:229, aelig:230, ccedil:231, egrave:232, eacute:233, ecirc:234, euml:235, igrave:236, iacute:237, icirc:238, iuml:239, eth:240, ntilde:241, ograve:242, oacute:243, ocirc:244, otilde:245, ouml:246, divide:247, oslash:248, ugrave:249, uacute:250, ucirc:251, uuml:252, yacute:253, thorn:254, yuml:255, OElig:338, oelig:339, Scaron:352, scaron:353, Yuml:376, fnof:402, circ:710, tilde:732, Alpha:913, Beta:914, Gamma:915, Delta:916, Epsilon:917, Zeta:918, Eta:919, Theta:920, Iota:921, Kappa:922, Lambda:923, Mu:924, Nu:925, Xi:926, Omicron:927, Pi:928, Rho:929, Sigma:931, Tau:932, Upsilon:933, Phi:934, Chi:935, Psi:936, Omega:937, alpha:945, beta:946, gamma:947, delta:948, epsilon:949, zeta:950, eta:951, theta:952, iota:953, kappa:954, lambda:955, mu:956, nu:957, xi:958, omicron:959, pi:960, rho:961, sigmaf:962, sigma:963, tau:964, upsilon:965, phi:966, chi:967, psi:968, omega:969, thetasym:977, upsih:978, piv:982, ensp:8194, emsp:8195, thinsp:8201, zwnj:8204, zwj:8205, lrm:8206, rlm:8207, ndash:8211, mdash:8212, lsquo:8216, rsquo:8217, sbquo:8218, ldquo:8220, rdquo:8221, bdquo:8222, dagger:8224, Dagger:8225, bull:8226, hellip:8230, permil:8240, prime:8242, Prime:8243, lsaquo:8249, rsaquo:8250, oline:8254, frasl:8260, euro:8364, image:8465, weierp:8472, real:8476, trade:8482, alefsym:8501, larr:8592, uarr:8593, rarr:8594, darr:8595, harr:8596, crarr:8629, lArr:8656, uArr:8657, rArr:8658, dArr:8659, hArr:8660, forall:8704, part:8706, exist:8707, empty:8709, nabla:8711, isin:8712, notin:8713, ni:8715, prod:8719, sum:8721, minus:8722, lowast:8727, radic:8730, prop:8733, infin:8734, ang:8736, and:8743, or:8744, cap:8745, cup:8746, int:8747, there4
2731:8756, sim:8764, cong:8773, asymp:8776, ne:8800, equiv:8801, le:8804, ge:8805, sub:8834, sup:8835, nsub:8836, sube:8838, supe:8839, oplus:8853, otimes:8855, perp:8869, sdot:8901, lceil:8968, rceil:8969, lfloor:8970, rfloor:8971, lang:9001, rang:9002, loz:9674, spades:9824, clubs:9827, hearts:9829, diams:9830 };\\n\\nexports.htmlVoidElements = \\\"area,base,br,col,command,embed,hr,img,input,keygen,link,meta,param,source,track,wbr\\\".split(\\\",\\\");\\n\\nexports.htmlBlockElements = \\\"address,article,aside,audio,blockquote,canvas,dd,details,div,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,hr,li,nav,ol,p,pre,section,summary,table,tfoot,ul,video\\\".split(\\\",\\\");\\n\\nexports.htmlUnsafeElements = \\\"script\\\".split(\\\",\\\");\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"config\"},\"$:/core/modules/deserializers.js\":{\"title\":\"$:/core/modules/deserializers.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/deserializers.js\\ntype: application/javascript\\nmodule-type: tiddlerdeserializer\\n\\nFunctions to deserialise tiddlers from a block of text\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports[\\\"application/x-tiddler-html-div\\\"] = function(text,fields) {\\n\\treturn [deserializeTiddlerDiv(text,fields)];\\n};\\n\\nexports[\\\"application/json\\\"] = function(text,fields) {\\n\\tvar results = [],\\n\\t\\tincoming = $tw.utils.parseJSONSafe(text,function(err) {\\n\\t\\t\\treturn [{\\n\\t\\t\\t\\ttitle: \\\"JSON error: \\\" + err,\\n\\t\\t\\t\\ttext: \\\"\\\"\\n\\t\\t\\t}];\\n\\t\\t});\\n\\tif(!$tw.utils.isArray(incoming)) {\\n\\t\\tincoming = [incoming];\\n\\t}\\n\\tfor(var t=0; t\u003Cincoming.length; t++) {\\n\\t\\tvar incomingFields = incoming[t],\\n\\t\\t\\tfields = {};\\n\\t\\tfor(var f in incomingFields) {\\n\\t\\t\\tif(typeof incomingFields[f] === \\\"string\\\") {\\n\\t\\t\\t\\tfields[f] = incomingFields[f];\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tresults.push(fields);\\n\\t}\\n\\treturn results;\\n};\\n\\n/*\\nParse an HTML file into tiddlers. There are three possibilities:\\n# A TiddlyWiki classic HTML file containing `text/x-tiddlywiki` tiddlers\\n# A TiddlyWiki5 HTML file containing `text/vnd.tiddlywiki` tiddlers\\n# An ordinary HTML file\\n*/\\nexports[\\\"text/html\\\"] = function(text,fields) {\\n\\tvar results = [];\\n\\t// Check if we've got an old-style store area\\n\\tvar storeAreaMarkerRegExp = /\u003Cdiv id=[\\\"']?storeArea['\\\"]?( style=[\\\"']?display:none;[\\\"']?)?>/gi,\\n\\t\\tstoreAreaMatch = storeAreaMarkerRegExp.exec(text);\\n\\tif(storeAreaMatch) {\\n\\t\\t// If so, we've got tiddlers in classic TiddlyWiki format or unencrypted old-style TW5 format\\n\\t\\tresults.push.apply(results,deserializeStoreArea(text,storeAreaMarkerRegExp.lastIndex,!!storeAreaMatch[1],fields));\\n\\t}\\n\\t// Check for new-style store areas\\n\\tvar newStoreAreaMarkerRegExp = /\u003Cscript class=\\\"tiddlywiki-tiddler-store\\\" type=\\\"([^\\\"]*)\\\">/gi,\\n\\t\\tnewStoreAreaMatch = newStoreAreaMarkerRegExp.exec(text),\\n\\t\\thaveHadNewStoreArea = !!newStoreAreaMatch;\\n\\twhile(newStoreAreaMatch) {\\n\\t\\tresults.push.apply(results,deserializeNewStoreArea(text,newStoreAreaMarkerRegExp.lastIndex,newStoreAreaMatch[1],fields));\\n\\t\\tnewStoreAreaMatch = newStoreAreaMarkerRegExp.exec(text);\\n\\t}\\n\\t// Return if we had either an old-style or a new-style store area\\n\\tif(storeAreaMatch || haveHadNewStoreArea) {\\n\\t\\treturn results;\\n\\t}\\n\\t// Otherwise, check whether we've got an encrypted file\\n\\tvar encryptedStoreArea = $tw.utils.extractEncryptedStoreArea(text);\\n\\tif(encryptedStoreArea) {\\n\\t\\t// If so, attempt to decrypt it using the current password\\n\\t\\treturn $tw.utils.decryptStoreArea(encryptedStoreArea);\\n\\t} else {\\n\\t\\t// It's not a TiddlyWiki so we'll return the entire HTML file as a tiddler\\n\\t\\treturn deserializeHtmlFile(text,fields);\\n\\t}\\n};\\n\\nfunction deserializeHtmlFile(text,fields) {\\n\\tvar result = {};\\n\\t$tw.utils.each(fields,function(value,name) {\\n\\t\\tresult[name] = value;\\n\\t});\\n\\tresult.text = text;\\n\\tresult.type = \\\"text/html\\\";\\n\\treturn [result];\\n}\\n\\nfunction deserializeNewStoreArea(text,storeAreaEnd,type,fields) {\\n\\tvar endOfScriptRegExp = /\u003C\\\\/script>/gi;\\n\\tendOfScriptRegExp.lastIndex = storeAreaEnd;\\n\\tvar match = endOfScriptRegExp.exec(text);\\n\\tif(match) {\\n\\t\\tvar scriptContent = text.substring(storeAreaEnd,match.index);\\n\\t\\treturn $tw.wiki.deserializeTiddlers(type,scriptContent);\\n\\t} else {\\n\\t\\treturn [];\\n\\t}\\n}\\n\\nfunction deserializeStoreArea(text,storeAreaEnd,isTiddlyWiki5,fields) {\\n\\tvar results = [],\\n\\t\\tendOfDivRegExp = /(\u003C\\\\/div>
2731\\\\s*)/gi,\\n\\t\\tstartPos = storeAreaEnd,\\n\\t\\tdefaultType = isTiddlyWiki5 ? undefined : \\\"text/x-tiddlywiki\\\";\\n\\tendOfDivRegExp.lastIndex = startPos;\\n\\tvar match = endOfDivRegExp.exec(text);\\n\\twhile(match) {\\n\\t\\tvar endPos = endOfDivRegExp.lastIndex,\\n\\t\\t\\ttiddlerFields = deserializeTiddlerDiv(text.substring(startPos,endPos),fields,{type: defaultType});\\n\\t\\tif(!tiddlerFields) {\\n\\t\\t\\tbreak;\\n\\t\\t}\\n\\t\\t$tw.utils.each(tiddlerFields,function(value,name) {\\n\\t\\t\\tif(typeof value === \\\"string\\\") {\\n\\t\\t\\t\\ttiddlerFields[name] = $tw.utils.htmlDecode(value);\\n\\t\\t\\t}\\n\\t\\t});\\n\\t\\tif(tiddlerFields.text !== null) {\\n\\t\\t\\tresults.push(tiddlerFields);\\n\\t\\t}\\n\\t\\tstartPos = endPos;\\n\\t\\tmatch = endOfDivRegExp.exec(text);\\n\\t}\\n\\treturn results;\\n}\\n\\n/*\\nUtility function to parse an old-style tiddler DIV in a *.tid file. It looks like this:\\n\\n\u003Cdiv title=\\\"Title\\\" creator=\\\"JoeBloggs\\\" modifier=\\\"JoeBloggs\\\" created=\\\"201102111106\\\" modified=\\\"201102111310\\\" tags=\\\"myTag [[my long tag]]\\\">\\n\u003Cpre>The text of the tiddler (without the expected HTML encoding).\\n\u003C/pre>\\n\u003C/div>\\n\\nNote that the field attributes are HTML encoded, but that the body of the \u003CPRE> tag is not encoded.\\n\\nWhen these tiddler DIVs are encountered within a TiddlyWiki HTML file then the body is encoded in the usual way.\\n*/\\nvar deserializeTiddlerDiv = function(text /* [,fields] */) {\\n\\t// Slot together the default results\\n\\tvar result = {};\\n\\tif(arguments.length > 1) {\\n\\t\\tfor(var f=1; f\u003Carguments.length; f++) {\\n\\t\\t\\tvar fields = arguments[f];\\n\\t\\t\\tfor(var t in fields) {\\n\\t\\t\\t\\tresult[t] = fields[t];\\t\\t\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\t// Parse the DIV body\\n\\tvar startRegExp = /^\\\\s*\u003Cdiv\\\\s+([^>]*)>(\\\\s*\u003Cpre>)?/gi,\\n\\t\\tendRegExp,\\n\\t\\tmatch = startRegExp.exec(text);\\n\\tif(match) {\\n\\t\\t// Old-style DIVs don't have the \u003Cpre> tag\\n\\t\\tif(match[2]) {\\n\\t\\t\\tendRegExp = /\u003C\\\\/pre>\\\\s*\u003C\\\\/div>\\\\s*$/gi;\\n\\t\\t} else {\\n\\t\\t\\tendRegExp = /\u003C\\\\/div>\\\\s*$/gi;\\n\\t\\t}\\n\\t\\tvar endMatch = endRegExp.exec(text);\\n\\t\\tif(endMatch) {\\n\\t\\t\\t// Extract the text\\n\\t\\t\\tresult.text = text.substring(match.index + match[0].length,endMatch.index);\\n\\t\\t\\t// Process the attributes\\n\\t\\t\\tvar attrRegExp = /\\\\s*([^=\\\\s]+)\\\\s*=\\\\s*(?:\\\"([^\\\"]*)\\\"|'([^']*)')/gi,\\n\\t\\t\\t\\tattrMatch;\\n\\t\\t\\tdo {\\n\\t\\t\\t\\tattrMatch = attrRegExp.exec(match[1]);\\n\\t\\t\\t\\tif(attrMatch) {\\n\\t\\t\\t\\t\\tvar name = attrMatch[1];\\n\\t\\t\\t\\t\\tvar value = attrMatch[2] !== undefined ? attrMatch[2] : attrMatch[3];\\n\\t\\t\\t\\t\\tresult[name] = value;\\n\\t\\t\\t\\t}\\n\\t\\t\\t} while(attrMatch);\\n\\t\\t\\treturn result;\\n\\t\\t}\\n\\t}\\n\\treturn undefined;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"tiddlerdeserializer\"},\"$:/core/modules/editor/engines/framed.js\":{\"title\":\"$:/core/modules/editor/engines/framed.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/editor/engines/framed.js\\ntype: application/javascript\\nmodule-type: library\\n\\nText editor engine based on a simple input or textarea within an iframe. This is done so that the selection is preserved even when clicking away from the textarea\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true,browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar HEIGHT_VALUE_TITLE = \\\"$:/config/TextEditor/EditorHeight/Height\\\";\\n\\nfunction FramedEngine(options) {\\n\\t// Save our options\\n\\toptions = options || {};\\n\\tthis.widget = options.widget;\\n\\tthis.value = options.value;\\n\\tthis.parentNode = options.parentNode;\\n\\tthis.nextSibling = options.nextSibling;\\n\\t// Create our hidden dummy text area for reading styles\\n\\tthis.dummyTextArea = this.widget.document.createElement(\\\"textarea\\\");\\n\\tif(this.widget.editClass) {\\n\\t\\tthis.dummyTextArea.className = this.widget.editClass;\\n\\t}\\n\\tthis.dummyTextArea.setAttribute(\\\"hidden\\\",\\\"true\\\");\\n\\tthis.parentNode.insertBefore(this.dummyTextArea,this.nextSibling);\\n\\tthis.widget.domNodes.push(this.dummyTextArea);\\n\\t// Create the iframe\\n\\tthis.iframeNode = this.widget.document.createElement(\\\"iframe\\\");\\n\\tthis.parentNode.insertBefore(this.iframeNode,this.nextSibling);\\n\\tthis.iframeDoc = this.iframeNode.contentWindow.document;\\n\\t// (Firefox requires us to put some empty content in the iframe)\\n\\tvar paletteTitle = this.widget.wiki.getTiddlerText(\\\"$:/palette\\\");\\n\\tvar colorScheme = (this.widget.wiki.getTiddler(paletteTitle) || {fields: {}}).fields[\\\"color-scheme\\\"] || \\\"light\\\";\\n\\tthis.iframeDoc.open();\\n\\tthis.iframeDoc.write(\\\"\u003Cmeta name='color-scheme' content='\\\" + colorScheme + \\\"'>\\\");\\n\\tthis.iframeDoc.close();\\n\\t// Style the iframe\\n\\tthis.iframeNode.className = this.dummyTextArea.className;\\n\\tthis.iframeNode.style.border = \\\"none\\\";\\n\\tthis.iframeNode.style.padding = \\\"0\\\";\\n\\tthis.iframeNode.style.resize = \\\"none\\\";\\n\\tthis.iframeDoc.body.style.margin = \\\"0\\\";\\n\\tthis.iframeDoc.body.style.padding = \\\"0\\\";\\n\\tthis.widget.domNodes.push(this.iframeNode);\\n\\t// Construct the textarea or input node\\n\\tvar tag = this.widget.editTag;\\n\\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\\n\\t\\ttag = \\\"input\\\";\\n\\t}\\n\\tthis.domNode = this.iframeDoc.createElement(tag);\\n\\t// Set the text\\n\\tif(this.widget.editTag === \\\"textarea\\\") {\\n\\t\\tthis.domNode.appendChild(this.iframeDoc.createTextNode(this.value));\\n\\t} else {\\n\\t\\tthis.domNode.value = this.value;\\n\\t}\\n\\t// Set the attributes\\n\\tif(this.widget.editType) {\\n\\t\\tthis.domNode.setAttribute(\\\"type\\\",this.widget.editType);\\n\\t}\\n\\tif(this.widget.editPlaceholder) {\\n\\t\\tthis.domNode.setAttribute(\\\"placeholder\\\",this.widget.editPlaceholder);\\n\\t}\\n\\tif(this.widget.editSize) {\\n\\t\\tthis.domNode.setAttribute(\\\"size\\\",this.widget.editSize);\\n\\t}\\n\\tif(this.widget.editRows) {\\n\\t\\tthis.domNode.setAttribute(\\\"rows\\\",this.widget.editRows);\\n\\t}\\n\\tif(this.widget.editTabIndex) {\\n\\t\\tthis.iframeNode.setAttribute(\\\"tabindex\\\",this.widget.editTabIndex);\\n\\t}\\n\\tif(this.widget.editAutoComplete) {\\n\\t\\tthis.domNode.setAttribute(\\\"autocomplete\\\",this.widget.editAutoComplete);\\n\\t}\\n\\tif(this.widget.isDisabled === \\\"yes\\\") {\\n\\t\\tthis.domNode.setAttribute(\\\"disabled\\\",true);\\n\\t}\\n\\t// Copy the styles from the dummy textarea\\n\\tthis.copyStyles();\\n\\t// Add event listeners\\n\\t$tw.utils.addEventListeners(this.domNode,[\\n\\t\\t{name: \\\"click\\\",handlerObject: this,handlerMethod: \\\"handleClickEvent\\\"},\\n\\t\\t{name: \\\"input\\\",handlerObject: this,handlerMethod: \\\"handleInputEvent\\\"},\\n\\t\\t{name: \\\"keydown\\\",handlerObject: this,handlerMethod: \\\"handleKeydownEvent\\\"},\\n\\t\\t{name: \\\"focus\\\",handlerObject: this,handlerMethod: \\\"handleFocusEvent\\\"}\\n\\t]);\\n\\t// Add drag and drop event listeners if fileDrop is enabled\\n\\tif(this.widget.isFileDropEnabled) {\\n\\t\\t$tw.utils.addEventListeners(this.domNode,[\\n\\t\\t\\t{name: \\\"dragenter\\\",handlerObject: this.widget,handlerMethod: \\\"handleDragEnterEvent\\\"},\\n\\t\\t\\t{name: \\\"dragover\\\",handlerObject: this.widget,handlerMethod: \\\"handleDragOverEvent\\\"},\\n\\t\\t\\t{name: \\\"dragleave\\\",handlerObject: this.widget,handlerMethod: \\\"handleDragLeaveEvent\\\"},\\n\\t\\t\\t{name: \\\"dragend\\\",handlerObject: this.widget,handlerMethod: \\\"handleDragEndEvent\\\"},\\n\\t\\t\\t{name: \\\"drop\\\", handlerObject: this.widget,handlerMethod: \\\"handleDropEvent\\\"},\\n\\t\\t\\t{name: \\\"paste\\\", handlerObject: this.widget,handlerMethod: \\\"handlePasteEvent\\\"},\\n\\t\\t\\t{name: \\\"click\\\",handlerObject: this.widget,handlerMethod: \\\"handleClickEvent\\\"}\\n\\t\\t]);\\n\\t}\\n\\t// Insert the element into the DOM\\n\\tthis.iframeDoc.body.appendChild(this.domNode);\\n}\\n\\n/*\\nCopy styles from the dummy text area to the textarea in the iframe\\n*/\\nFramedEngine.prototype.copyStyles = function() {\\n\\t// Copy all styles\\n\\t$tw.utils.copyStyles(this.dummyTextArea,this.domNode);\\n\\t// Override the ones that should not be set the same as the dummy textarea\\n\\tthis.domNode.style.display = \\\"block\\\";\\n\\tthis.domNode.style.width = \\\"100%\\\";\\n\\tthis.domNode.style.margin = \\\"0\\\";\\n\\t// In Chrome setting -webkit-text-fill-color overrides the placeholder text colour\\n\\tthis.domNode.style[\\\"-webkit-text-fill-color\\\"] = \\\"currentcolor\\\";\\n\\t// Ensure we don't force text direction to LTR\\n\\tthis.domNode.style.removeProperty(\\\"direction\\\");\\n};
2731\\n\\n/*\\nSet the text of the engine if it doesn't currently have focus\\n*/\\nFramedEngine.prototype.setText = function(text,type) {\\n\\tif(!this.domNode.isTiddlyWikiFakeDom) {\\n\\t\\tif(this.domNode.ownerDocument.activeElement !== this.domNode) {\\n\\t\\t\\tthis.updateDomNodeText(text);\\n\\t\\t}\\n\\t\\t// Fix the height if needed\\n\\t\\tthis.fixHeight();\\n\\t}\\n};\\n\\n/*\\nUpdate the DomNode with the new text\\n*/\\nFramedEngine.prototype.updateDomNodeText = function(text) {\\n\\ttry {\\n\\t\\tthis.domNode.value = text;\\n\\t} catch(e) {\\n\\t\\t// Ignore\\n\\t}\\n};\\n\\n/*\\nGet the text of the engine\\n*/\\nFramedEngine.prototype.getText = function() {\\n\\treturn this.domNode.value;\\n};\\n\\n/*\\nFix the height of textarea to fit content\\n*/\\nFramedEngine.prototype.fixHeight = function() {\\n\\t// Make sure styles are updated\\n\\tthis.copyStyles();\\n\\t// Adjust height\\n\\tif(this.widget.editTag === \\\"textarea\\\") {\\n\\t\\tif(this.widget.editAutoHeight) {\\n\\t\\t\\tif(this.domNode && !this.domNode.isTiddlyWikiFakeDom) {\\n\\t\\t\\t\\tvar newHeight = $tw.utils.resizeTextAreaToFit(this.domNode,this.widget.editMinHeight);\\n\\t\\t\\t\\tthis.iframeNode.style.height = newHeight + \\\"px\\\";\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\t\\t\\tvar fixedHeight = parseInt(this.widget.wiki.getTiddlerText(HEIGHT_VALUE_TITLE,\\\"400px\\\"),10);\\n\\t\\t\\tfixedHeight = Math.max(fixedHeight,20);\\n\\t\\t\\tthis.domNode.style.height = fixedHeight + \\\"px\\\";\\n\\t\\t\\tthis.iframeNode.style.height = fixedHeight + \\\"px\\\";\\n\\t\\t}\\n\\t}\\n};\\n\\n/*\\nFocus the engine node\\n*/\\nFramedEngine.prototype.focus  = function() {\\n\\tif(this.domNode.focus) {\\n\\t\\tthis.domNode.focus();\\n\\t}\\n\\tif(this.domNode.select) {\\n\\t\\t$tw.utils.setSelectionByPosition(this.domNode,this.widget.editFocusSelectFromStart,this.widget.editFocusSelectFromEnd);\\n\\t}\\n};\\n\\n/*\\nHandle a focus event\\n*/\\nFramedEngine.prototype.handleFocusEvent = function(event) {\\n\\tif(this.widget.editCancelPopups) {\\n\\t\\t$tw.popup.cancel(0);\\n\\t}\\n};\\n\\n/*\\nHandle a keydown event\\n */\\nFramedEngine.prototype.handleKeydownEvent = function(event) {\\n\\tif ($tw.keyboardManager.handleKeydownEvent(event, {onlyPriority: true})) {\\n\\t\\treturn true;\\n\\t}\\n\\n\\treturn this.widget.handleKeydownEvent(event);\\n};\\n\\n/*\\nHandle a click\\n*/\\nFramedEngine.prototype.handleClickEvent = function(event) {\\n\\tthis.fixHeight();\\n\\treturn true;\\n};
2731\\n\\n/*\\nHandle a dom \\\"input\\\" event which occurs when the text has changed\\n*/\\nFramedEngine.prototype.handleInputEvent = function(event) {\\n\\tthis.widget.saveChanges(this.getText());\\n\\tthis.fixHeight();\\n\\tif(this.widget.editInputActions) {\\n\\t\\tthis.widget.invokeActionString(this.widget.editInputActions,this,event,{actionValue: this.getText()});\\n\\t}\\n\\treturn true;\\n};\\n\\n/*\\nCreate a blank structure representing a text operation\\n*/\\nFramedEngine.prototype.createTextOperation = function() {\\n\\tvar operation = {\\n\\t\\ttext: this.domNode.value,\\n\\t\\tselStart: this.domNode.selectionStart,\\n\\t\\tselEnd: this.domNode.selectionEnd,\\n\\t\\tcutStart: null,\\n\\t\\tcutEnd: null,\\n\\t\\treplacement: null,\\n\\t\\tnewSelStart: null,\\n\\t\\tnewSelEnd: null\\n\\t};\\n\\toperation.selection = operation.text.substring(operation.selStart,operation.selEnd);\\n\\treturn operation;\\n};\\n\\n/*\\nExecute a text operation\\n*/\\nFramedEngine.prototype.executeTextOperation = function(operation) {\\n\\t// Perform the required changes to the text area and the underlying tiddler\\n\\tvar newText = operation.text;\\n\\tif(operation.replacement !== null) {\\n\\t\\tnewText = operation.text.substring(0,operation.cutStart) + operation.replacement + operation.text.substring(operation.cutEnd);\\n\\t\\t// Attempt to use a execCommand to modify the value of the control\\n\\t\\tif(this.iframeDoc.queryCommandSupported(\\\"insertText\\\") && this.iframeDoc.queryCommandSupported(\\\"delete\\\") && !$tw.browser.isFirefox) {\\n\\t\\t\\tthis.domNode.focus();\\n\\t\\t\\tthis.domNode.setSelectionRange(operation.cutStart,operation.cutEnd);\\n\\t\\t\\tif(operation.replacement === \\\"\\\") {\\n\\t\\t\\t\\tthis.iframeDoc.execCommand(\\\"delete\\\",false,\\\"\\\");\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tthis.iframeDoc.execCommand(\\\"insertText\\\",false,operation.replacement);\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\t\\t\\tthis.domNode.value = newText;\\n\\t\\t}\\n\\t\\tthis.domNode.focus();\\n\\t\\tthis.domNode.setSelectionRange(operation.newSelStart,operation.newSelEnd);\\n\\t}\\n\\tthis.domNode.focus();\\n\\treturn newText;\\n};\\n\\nexports.FramedEngine = FramedEngine;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"library\"},\"$:/core/modules/editor/engines/simple.js\":{\"title\":\"$:/core/modules/editor/engines/simple.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/editor/engines/simple.js\\ntype: application/javascript\\nmodule-type: library\\n\\nText editor engine based on a simple input or textarea tag\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar HEIGHT_VALUE_TITLE = \\\"$:/config/TextEditor/EditorHeight/Height\\\";\\n\\nfunction SimpleEngine(options) {\\n\\t// Save our options\\n\\toptions = options || {};\\n\\tthis.widget = options.widget;\\n\\tthis.value = options.value;\\n\\tthis.parentNode = options.parentNode;\\n\\tthis.nextSibling = options.nextSibling;\\n\\t// Construct the textarea or input node\\n\\tvar tag = this.widget.editTag;\\n\\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\\n\\t\\ttag = \\\"input\\\";\\n\\t}\\n\\tthis.domNode = this.widget.document.createElement(tag);\\n\\t// Set the text\\n\\tif(this.widget.editTag === \\\"textarea\\\") {\\n\\t\\tthis.domNode.appendChild(this.widget.document.createTextNode(this.value));\\n\\t} else {\\n\\t\\tthis.domNode.value = this.value;\\n\\t}\\n\\t// Set the attributes\\n\\tif(this.widget.editType) {\\n\\t\\tthis.domNode.setAttribute(\\\"type\\\",this.widget.editType);\\n\\t}\\n\\tif(this.widget.editPlaceholder) {\\n\\t\\tthis.domNode.setAttribute(\\\"placeholder\\\",this.widget.editPlaceholder);\\n\\t}\\n\\tif(this.widget.editSize) {\\n\\t\\tthis.domNode.setAttribute(\\\"size\\\",this.widget.editSize);\\n\\t}\\n\\tif(this.widget.editRows) {\\n\\t\\tthis.domNode.setAttribute(\\\"rows\\\",this.widget.editRows);\\n\\t}\\n\\tif(this.widget.editClass) {\\n\\t\\tthis.domNode.className = this.widget.editClass;\\n\\t}\\n\\tif(this.widget.editTabIndex) {\\n\\t\\tthis.domNode.setAttribute(\\\"tabindex\\\",this.widget.editTabIndex);\\n\\t}\\n\\tif(this.widget.editAutoComplete) {\\n\\t\\tthis.domNode.setAttribute(\\\"autocomplete\\\",this.widget.editAutoComplete);\\n\\t}\\n\\tif(this.widget.isDisabled === \\\"yes\\\") {\\n\\t\\tthis.domNode.setAttribute(\\\"disabled\\\",true);\\n\\t}\\n\\t// Add an input event handler\\n\\t$tw.utils.addEventListeners(this.domNode,[\\n\\t\\t{name: \\\"focus\\\", handlerObject: this, handlerMethod: \\\"handleFocusEvent\\\"},\\n\\t\\t{name: \\\"input\\\", handlerObject: this, handlerMethod: \\\"handleInputEvent\\\"}\\n\\t]);\\n\\t// Insert the element into the DOM\\n\\tthis.parentNode.insertBefore(this.domNode,this.nextSibling);\\n\\tthis.widget.domNodes.push(this.domNode);\\n}\\n\\n/*\\nSet the text of the engine if it doesn't currently have focus\\
2731n*/\\nSimpleEngine.prototype.setText = function(text,type) {\\n\\tif(!this.domNode.isTiddlyWikiFakeDom) {\\n\\t\\tif(this.domNode.ownerDocument.activeElement !== this.domNode || text === \\\"\\\") {\\n\\t\\t\\tthis.updateDomNodeText(text);\\n\\t\\t}\\n\\t\\t// Fix the height if needed\\n\\t\\tthis.fixHeight();\\n\\t}\\n};\\n\\n/*\\nUpdate the DomNode with the new text\\n*/\\nSimpleEngine.prototype.updateDomNodeText = function(text) {\\n\\ttry {\\n\\t\\tthis.domNode.value = text;\\n\\t} catch(e) {\\n\\t\\t// Ignore\\n\\t}\\n};\\n\\n/*\\nGet the text of the engine\\n*/\\nSimpleEngine.prototype.getText = function() {\\n\\treturn this.domNode.value;\\n};\\n\\n/*\\nFix the height of textarea to fit content\\n*/\\nSimpleEngine.prototype.fixHeight = function() {\\n\\tif(this.widget.editTag === \\\"textarea\\\") {\\n\\t\\tif(this.widget.editAutoHeight) {\\n\\t\\t\\tif(this.domNode && !this.domNode.isTiddlyWikiFakeDom) {\\n\\t\\t\\t\\t$tw.utils.resizeTextAreaToFit(this.domNode,this.widget.editMinHeight);\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\t\\t\\tvar fixedHeight = parseInt(this.widget.wiki.getTiddlerText(HEIGHT_VALUE_TITLE,\\\"400px\\\"),10);\\n\\t\\t\\tfixedHeight = Math.max(fixedHeight,20);\\n\\t\\t\\tthis.domNode.style.height = fixedHeight + \\\"px\\\";\\n\\t\\t}\\n\\t}\\n};\\n\\n/*\\nFocus the engine node\\n*/\\nSimpleEngine.prototype.focus = function() {\\n\\tif(this.domNode.focus) {\\n\\t\\tthis.domNode.focus();\\n\\t}\\n\\tif(this.domNode.select) {\\n\\t\\t$tw.utils.setSelectionByPosition(this.domNode,this.widget.editFocusSelectFromStart,this.widget.editFocusSelectFromEnd);\\n\\t}\\n};\\n\\n/*\\nHandle a dom \\\"input\\\" event which occurs when the text has changed\\n*/\\nSimpleEngine.prototype.handleInputEvent = function(event) {\\n\\tthis.widget.saveChanges(this.getText());\\n\\tthis.fixHeight();\\n\\tif(this.widget.editInputActions) {\\n\\t\\tthis.widget.invokeActionString(this.widget.editInputActions,this,event,{actionValue: this.getText()});\\n\\t}\\n\\treturn true;\\n};
2731\\n\\n/*\\nHandle a dom \\\"focus\\\" event\\n*/\\nSimpleEngine.prototype.handleFocusEvent = function(event) {\\n\\tif(this.widget.editCancelPopups) {\\n\\t\\t$tw.popup.cancel(0);\\n\\t}\\n\\tif(this.widget.editFocusPopup) {\\n\\t\\t$tw.popup.triggerPopup({\\n\\t\\t\\tdomNode: this.domNode,\\n\\t\\t\\ttitle: this.widget.editFocusPopup,\\n\\t\\t\\twiki: this.widget.wiki,\\n\\t\\t\\tforce: true\\n\\t\\t});\\n\\t}\\n\\treturn true;\\n};\\n\\n/*\\nCreate a blank structure representing a text operation\\n*/\\nSimpleEngine.prototype.createTextOperation = function() {\\n\\treturn null;\\n};\\n\\n/*\\nExecute a text operation\\n*/\\nSimpleEngine.prototype.executeTextOperation = function(operation) {\\n};\\n\\nexports.SimpleEngine = SimpleEngine;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"library\"},\"$:/core/modules/editor/factory.js\":{\"title\":\"$:/core/modules/editor/factory.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/editor/factory.js\\ntype: application/javascript\\nmodule-type: library\\n\\nFactory for constructing text editor widgets with specified engines for the toolbar and non-toolbar cases\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar DEFAULT_MIN_TEXT_AREA_HEIGHT = \\\"100px\\\"; // Minimum height of textareas in pixels\\n\\n// Configuration tiddlers\\nvar HEIGHT_MODE_TITLE = \\\"$:/config/TextEditor/EditorHeight/Mode\\\";\\nvar ENABLE_TOOLBAR_TITLE = \\\"$:/config/TextEditor/EnableToolbar\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nfunction editTextWidgetFactory(toolbarEngine,nonToolbarEngine) {\\n\\n\\tvar EditTextWidget = function(parseTreeNode,options) {\\n\\t\\t// Initialise the editor operations if they've not been done already\\n\\t\\tif(!this.editorOperations) {\\n\\t\\t\\tEditTextWidget.prototype.editorOperations = {};\\n\\t\\t\\t$tw.modules.applyMethods(\\\"texteditoroperation\\\",this.editorOperations);\\n\\t\\t}\\n\\t\\tthis.initialise(parseTreeNode,options);\\n\\t};\\n\\n\\t/*\\n\\tInherit from the base widget class\\n\\t*/\\n\\tEditTextWidget.prototype = new Widget();\\n\\n\\t/*\\n\\tRender this widget into the DOM\\n\\t*/\\n\\tEditTextWidget.prototype.render = function(parent,nextSibling) {\\n\\t\\t// Save the parent dom node\\n\\t\\tthis.parentDomNode = parent;\\n\\t\\t// Compute our attributes\\n\\t\\tthis.computeAttributes();\\n\\t\\t// Execute our logic\\n\\t\\tthis.execute();\\n\\t\\t// Create the wrapper for the toolbar and render its content\\n\\t\\tif(this.editShowToolbar) {\\n\\t\\t\\tthis.toolbarNode = this.document.createElement(\\\"div\\\");\\n\\t\\t\\tthis.toolbarNode.className = \\\"tc-editor-toolbar\\\";\\n\\t\\t\\tparent.insertBefore(this.toolbarNode,nextSibling);\\n\\t\\t\\tthis.renderChildren(this.toolbarNode,null);\\n\\t\\t\\tthis.domNodes.push(this.toolbarNode);\\n\\t\\t}\\n\\t\\t// Create our element\\n\\t\\tvar editInfo = this.getEditInfo(),\\n\\t\\t\\tEngine = this.editShowToolbar ? toolbarEngine : nonToolbarEngine;\\n\\t\\tthis.engine = new Engine({\\n\\t\\t\\t\\twidget: this,\\n\\t\\t\\t\\tvalue: editInfo.value,\\n\\t\\t\\t\\ttype: editInfo.type,\\n\\t\\t\\t\\tparentNode: parent,\\n\\t\\t\\t\\tnextSibling: nextSibling\\n\\t\\t\\t});\\n\\t\\t// Call the postRender hook\\n\\t\\tif(this.postRender) {\\n\\t\\t\\tthis.postRender();\\n\\t\\t}\\n\\t\\t// Fix height\\n\\t\\tthis.engine.fixHeight();\\n\\t\\t// Focus if required\\n\\t\\tif(this.editFocus === \\\"true\\\" || this.editFocus === \\\"yes\\\") {\\n\\t\\t\\tthis.engine.focus();\\n\\t\\t}\\n\\t\\t// Add widget message listeners\\n\\t\\tthis.addEventListeners([\\n\\t\\t\\t{type: \\\"tm-edit-text-operation\\\", handler: \\\"handleEditTextOperationMessage\\\"}\\n\\t\\t]);\\n\\t};\\n\\n\\t/*\\n\\tGet the tiddler being edited and current value\\n\\t*/\\n\\tEditTextWidget.prototype.getEditInfo = function() {\\n\\t\\t// Get the edit value\\n\\t\\tvar self = this,\\n\\t\\t\\tvalue,\\n\\t\\t\\ttype = \\\"text/plain\\\",\\n\\t\\t\\tupdate;\\n\\t\\tif(this.editIndex) {\\n\\t\\t\\tvalue = this.wiki.extractTiddlerDataItem(this.editTitle,this.editIndex,this.editDefault);\\n\\t\\t\\tupdate = function(value) {\\n\\t\\t\\t\\tvar data = self.wiki.getTiddlerData(self.editTitle,{});\\n\\t\\t\\t\\tif(data[self.editIndex] !== value) {\\n\\t\\t\\t\\t\\tdata[self.editIndex] = value;\\n\\t\\t\\t\\t\\tself.wiki.setTiddlerData(self.editTitle,data);\\n\\t\\t\\t\\t}\\n\\t\\t\\t};\\n\\t\\t} else {\\n\\t\\t\\t// Get the current tiddler and the field name\\n\\t\\t\\tvar tiddler = this.wiki.getTiddler(this.editTitle);\\n\\t\\t\\tif(tiddler) {\\n\\t\\t\\t\\t// If we've got a tiddler, the value to display is the field string value\\n\\t\\t\\t\\tif(tiddler.hasField(this.editField)) {\\n\\t\\t\\t\\t\\tvalue = tiddler.getFieldString(this.editField);\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tvalue = this.editDefault || \\\"\\\";\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tif(this.editField === \\\"text\\\") {\\n\\t\\t\\t\\t\\ttype = ti
2731ddler.fields.type || \\\"text/vnd.tiddlywiki\\\";\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else {\\n\\t\\t\\t\\t// Otherwise, we need to construct a default value for the editor\\n\\t\\t\\t\\tswitch(this.editField) {\\n\\t\\t\\t\\t\\tcase \\\"text\\\":\\n\\t\\t\\t\\t\\t\\tvalue = \\\"\\\";\\n\\t\\t\\t\\t\\t\\ttype = \\\"text/vnd.tiddlywiki\\\";\\n\\t\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t\\tcase \\\"title\\\":\\n\\t\\t\\t\\t\\t\\tvalue = this.editTitle;\\n\\t\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t\\tdefault:\\n\\t\\t\\t\\t\\t\\tvalue = \\\"\\\";\\n\\t\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tif(this.editDefault !== undefined) {\\n\\t\\t\\t\\t\\tvalue = this.editDefault;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\tupdate = function(value) {\\n\\t\\t\\t\\tvar tiddler = self.wiki.getTiddler(self.editTitle),\\n\\t\\t\\t\\t\\tupdateFields = {\\n\\t\\t\\t\\t\\t\\ttitle: self.editTitle\\n\\t\\t\\t\\t\\t};\\n\\t\\t\\t\\tupdateFields[self.editField] = value;\\n\\t\\t\\t\\tself.wiki.addTiddler(new $tw.Tiddler(self.wiki.getCreationFields(),tiddler,updateFields,self.wiki.getModificationFields()));\\n\\t\\t\\t};\\n\\t\\t}\\n\\t\\tif(this.editType) {\\n\\t\\t\\ttype = this.editType;\\n\\t\\t}\\n\\t\\treturn {value: value || \\\"\\\", type: type, update: update};\\n\\t};\\n\\n\\t/*\\n\\tHandle an edit text operation message from the toolbar\\n\\t*/\\n\\tEditTextWidget.prototype.handleEditTextOperationMessage = function(event) {\\n\\t\\t// Prepare information about the operation\\n\\t\\tvar operation = this.engine.createTextOperation();\\n\\t\\t// Invoke the handler for the selected operation\\n\\t\\tvar handler = this.editorOperations[event.param];\\n\\t\\tif(handler) {\\n\\t\\t\\thandler.call(this,event,operation);\\n\\t\\t}\\n\\t\\t// Execute the operation via the engine\\n\\t\\tvar newText = this.engine.executeTextOperation(operation);\\n\\t\\t// Fix the tiddler height and save changes\\n\\t\\tthis.engine.fixHeight();\\n\\t\\tthis.saveChanges(newText);\\n\\t};\\n\\n\\t/*\\n\\tCompute the internal state of the widget\\n\\t*/\\n\\tEditTextWidget.prototype.execute = function() {\\n\\t\\t// Get our parameters\\n\\t\\tthis.editTitle = this.getAttribute(\\\"tiddler\\\",this.getVariable(\\\"currentTiddler\\\"));\\n\\t\\tthis.editField = this.getAttribute(\\\"field\\\",\\\"text\\\");\\n\\t\\tthis.editIndex = this.getAttribute(\\\"index\\\");\\n\\t\\tthis.editDefault = this.getAttribute(\\\"default\\\");\\n\\t\\tthis.editClass = this.getAttribute(\\\"class\\\");\\n\\t\\tthis.editPlaceholder = this.getAttribute(\\\"placeholder\\\");\\n\\t\\tthis.editSize = this.getAttribute(\\\"size\\\");\\n\\t\\tthis.editRows = this.getAttribute(\\\"rows\\\");\\n\\t\\tthis.editAutoHeight = this.wiki.getTiddlerText(HEIGHT_MODE_TITLE,\\\"auto\\\");\\n\\t\\tthis.editAutoHeight = this.getAttribute(\\\"autoHeight\\\",this.editAutoHeight === \\\"auto\\\" ? \\\"yes\\\" : \\\"no\\\") === \\\"yes\\\";\\n\\t\\tthis.editMinHeight = this.getAttribute(\\\"minHeight\\\",DEFAULT_MIN_TEXT_AREA_HEIGHT);\\n\\t\\tthis.editFocusPopup = this.getAttribute(\\\"focusPopup\\\");\\n\\t\\tthis.editFocus = this.getAttribute(\\\"focus\\\");\\n\\t\\tthis.editFocusSelectFromStart = $tw.utils.parseNumber(this.getAttribute(\\\"focusSelectFromStart\\\",\\\"0\\\"));\\n\\t\\tthis.editFocusSelectFromEnd = $tw.utils.parseNumber(this.getAttribute(\\\"focusSelectFromEnd\\\",\\\"0\\\"));\\n\\t\\tthis.editTabIndex = this.getAttribute(\\\"tabindex\\\");\\n\\t\\tthis.editCancelPopups = this.getAttribute(\\\"cancelPopups\\\",\\\"\\\") === \\\"yes\\\";\\n\\t\\tthis.editInputActions = this.getAttribute(\\\"inputActions\\\");\\n\\t\\tthis.editRefreshTitle = this.getAttribute(\\\"refreshTitle\\\");\\n\\t\\tthis.editAutoComplete = this.getAttribute(\\\"autocomplete\\\");\\n\\t\\tthis.isDisabled = this.getAttribute(\\\"disabled\\\",\\\"no\\\");\\n\\t\\tthis.isFileDropEnabled = this.getAttribute(\\\"fileDrop\\\",\\\"no\\\") === \\\"yes\\\";\\n\\t\\t// Get the default editor element tag and type\\n\\t\\tvar tag,type;\\n\\t\\tif(this.editField === \\\"text\\\") {\\n\\t\\t\\ttag = \\\"textarea\\\";\\n\\t\\t} else {\\n\\t\\t\\ttag = \\\"input\\\";\\n\\t\\t\\tvar fieldModule = $tw.Tiddler.fieldModules[this.editField];\\n\\t\\t\\tif(fieldModule && fieldModule.editTag) {\\n\\t\\t\\t\\ttag = fieldModule.editTag;\\n\\t\\t\\t}\\n\\t\\t\\tif(fieldModule && fieldModule.editType) {\\n\\t\\t\\t\\ttype = fieldModule.editType;\\n\\t\\t\\t}\\n\\t\\t\\ttype = type || \\\"text\\\";\\n\\t\\t}\\n\\t\\t// Get the rest of our parameters\\n\\t\\tthis.editTag = this.getAttribute(\\\"tag\\\",tag) || \\\"input\\\";\\n\\t\\tthis.editType = this.getAttribute(\\\"type\\\",type);\\n\\t\\t// Make the child widgets\\n\\t\\tthis.makeChildWidgets();\\n\\t\\t// Determine whether to show the toolbar\\n\\t\\tthis.editShowToolbar = this.wiki.getTiddlerText(ENABLE_TOOLBAR_TITLE,\\\"yes\\\");\\n\\t\\tthis.editShowToolbar = (this.editShowToolbar === \\\"yes\\\") && !!(this.children && this.children.length > 0) && (!this.document.isTiddlyWikiFakeDom);\\n\\t};\\n\\n\\t/*\\n\\tSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n\\t*/\\n\\tEditTextWidget.prototype.refresh = function(ch
2731angedTiddlers) {\\n\\t\\tvar changedAttributes = this.computeAttributes();\\n\\t\\t// Completely rerender if any of our attributes have changed\\n\\t\\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes[\\\"default\\\"] || changedAttributes[\\\"class\\\"] || changedAttributes.placeholder || changedAttributes.size || changedAttributes.autoHeight || changedAttributes.minHeight || changedAttributes.focusPopup ||  changedAttributes.rows || changedAttributes.tabindex || changedAttributes.cancelPopups || changedAttributes.inputActions || changedAttributes.refreshTitle || changedAttributes.autocomplete || changedTiddlers[HEIGHT_MODE_TITLE] || changedTiddlers[ENABLE_TOOLBAR_TITLE] || changedTiddlers[\\\"$:/palette\\\"] || changedAttributes.disabled || changedAttributes.fileDrop) {\\n\\t\\t\\tthis.refreshSelf();\\n\\t\\t\\treturn true;\\n\\t\\t} else if (changedTiddlers[this.editRefreshTitle]) {\\n\\t\\t\\tthis.engine.updateDomNodeText(this.getEditInfo().value);\\n\\t\\t} else if(changedTiddlers[this.editTitle]) {\\n\\t\\t\\tvar editInfo = this.getEditInfo();\\n\\t\\t\\tthis.updateEditor(editInfo.value,editInfo.type);\\n\\t\\t}\\n\\t\\tthis.engine.fixHeight();\\n\\t\\tif(this.editShowToolbar) {\\n\\t\\t\\treturn this.refreshChildren(changedTiddlers);\\n\\t\\t} else {\\n\\t\\t\\treturn false;\\n\\t\\t}\\n\\t};\\n\\n\\t/*\\n\\tUpdate the editor with new text. This method is separate from updateEditorDomNode()\\n\\tso that subclasses can override updateEditor() and still use updateEditorDomNode()\\n\\t*/\\n\\tEditTextWidget.prototype.updateEditor = function(text,type) {\\n\\t\\tthis.updateEditorDomNode(text,type);\\n\\t};\\n\\n\\t/*\\n\\tUpdate the editor dom node with new text\\n\\t*/\\n\\tEditTextWidget.prototype.updateEditorDomNode = function(text,type) {\\n\\t\\tthis.engine.setText(text,type);\\n\\t};\\n\\n\\t/*\\n\\tSave changes back to the tiddler store\\n\\t*/\\n\\tEditTextWidget.prototype.saveChanges = function(text) {\\n\\t\\tvar editInfo = this.getEditInfo();\\n\\t\\tif(text !== editInfo.value) {\\n\\t\\t\\teditInfo.update(text);\\n\\t\\t}\\n\\t};\\n\\n\\t/*\\n\\tHandle a dom \\\"keydown\\\" event, which we'll bubble up to our container for the keyboard widgets benefit\\n\\t*/\\n\\tEditTextWidget.prototype.handleKeydownEvent = function(event) {\\n\\t\\t// Check for a keyboard shortcut\\n\\t\\tif(this.toolbarNode) {\\n\\t\\t\\tvar shortcutElements = this.toolbarNode.querySelectorAll(\\\"[data-tw-keyboard-shortcut]\\\");\\n\\t\\t\\tfor(var index=0; index\u003CshortcutElements.length; index++) {\\n\\t\\t\\t\\tvar el = shortcutElements[index],\\n\\t\\t\\t\\t\\tshortcutData = el.getAttribute(\\\"data-tw-keyboard-shortcut\\\"),\\n\\t\\t\\t\\t\\tkeyInfoArray = $tw.keyboardManager.parseKeyDescriptors(shortcutData,{\\n\\t\\t\\t\\t\\t\\twiki: this.wiki\\n\\t\\t\\t\\t\\t});\\n\\t\\t\\t\\tif($tw.keyboardManager.checkKeyDescriptors(event,keyInfoArray)) {\\n\\t\\t\\t\\t\\tvar clickEvent = this.document.createEvent(\\\"Events\\\");\\n\\t\\t\\t\\t    clickEvent.initEvent(\\\"click\\\",true,false);\\n\\t\\t\\t\\t    el.dispatchEvent(clickEvent);\\n\\t\\t\\t\\t\\tevent.preventDefault();\\n\\t\\t\\t\\t\\tevent.stopPropagation();\\n\\t\\t\\t\\t\\treturn true;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\t// Propogate the event to the container\\n\\t\\tif(this.propogateKeydownEvent(event)) {\\n\\t\\t\\t// Ignore the keydown if it was already handled\\n\\t\\t\\tevent.preventDefault();\\n\\t\\t\\tevent.stopPropagation();\\n\\t\\t\\treturn true;\\n\\t\\t}\\n\\t\\t// Otherwise, process the keydown normally\\n\\t\\treturn false;\\n\\t};\\n\\n\\t/*\\n\\tPropogate keydown events to our container for the keyboard widgets benefit\\n\\t*/\\n\\tEditTextWidget.prototype.propogateKeydownEvent = function(event) {\\n\\t\\tvar newEvent = this.cloneEvent(event,[\\\"keyCode\\\",\\\"code\\\",\\\"which\\\",\\\"key\\\",\\\"metaKey\\\",\\\"ctrlKey\\\",\\\"altKey\\\",\\\"shiftKey\\\"]);\\n\\t\\treturn !this.parentDomNode.dispatchEvent(newEvent);\\n\\t};\\n\\n\\tEditTextWidget.prototype.cloneEvent = function(event,propertiesToCopy) {\\n\\t\\tvar propertiesToCopy = propertiesToCopy || [],\\n\\t\\t\\tnewEvent = this.document.createEventObject ? this.document.createEventObject() : this.document.createEvent(\\\"Events\\\");\\n\\t\\tif(newEvent.initEvent) {\\n\\t\\t\\tnewEvent.initEvent(event.type, true, true);\\n\\t\\t}\\n\\t\\t$tw.utils.each(propertiesToCopy,function(prop){\\n\\t\\t\\tnewEvent[prop] = event[prop];\\n\\t\\t});\\n\\t\\treturn newEvent;\\n\\t};\\n\\n\\tEditTextWidget.prototype.dispatchDOMEvent = function(newEvent) {\\n\\t\\tvar dispatchNode = this.engine.iframeNode || this.engine.parentNode;
2731\\n\\t\\treturn dispatchNode.dispatchEvent(newEvent);\\n\\t};\\n\\n\\t/*\\n\\tPropogate drag and drop events with File data to our container for the dropzone widgets benefit.\\n\\tIf there are no Files, let the browser handle it.\\n\\t*/\\n\\tEditTextWidget.prototype.handleDropEvent = function(event) {\\n\\t\\tif($tw.utils.dragEventContainsFiles(event)) {\\n\\t\\t\\tevent.preventDefault();\\n\\t\\t\\tevent.stopPropagation();\\n\\t\\t\\tthis.dispatchDOMEvent(this.cloneEvent(event,[\\\"dataTransfer\\\"]));\\n\\t\\t} \\n\\t};\\n\\n\\tEditTextWidget.prototype.handlePasteEvent = function(event) {\\n\\t\\tif(event.clipboardData && event.clipboardData.files && event.clipboardData.files.length) {\\n\\t\\t\\tevent.preventDefault();\\n\\t\\t\\tevent.stopPropagation();\\n\\t\\t\\tthis.dispatchDOMEvent(this.cloneEvent(event,[\\\"clipboardData\\\"]));\\n\\t\\t}\\n\\t};\\n\\n\\tEditTextWidget.prototype.handleDragEnterEvent = function(event) {\\n\\t\\tif($tw.utils.dragEventContainsFiles(event)) {\\n\\t\\t\\t// Ignore excessive events fired by FF when entering and leaving text nodes in a text area.\\n\\t\\t\\tif( event.relatedTarget && (event.relatedTarget.nodeType === 3 || event.target === event.relatedTarget)) {\\n\\t\\t\\t\\treturn true;\\n\\t\\t\\t}\\n\\t\\t\\tevent.preventDefault();\\n\\t\\t\\treturn this.dispatchDOMEvent(this.cloneEvent(event,[\\\"dataTransfer\\\"]));\\n\\t\\t}\\n\\t\\treturn true;\\n\\t};\\n\\n\\tEditTextWidget.prototype.handleDragOverEvent = function(event) {\\n\\t\\tif($tw.utils.dragEventContainsFiles(event)) {\\n\\t\\t\\t// Call preventDefault() in browsers that default to not allowing drop events on textarea\\n\\t\\t\\tif($tw.browser.isFirefox || $tw.browser.isIE) {\\n\\t\\t\\t\\tevent.preventDefault();\\n\\t\\t\\t}\\n\\t\\t\\tevent.dataTransfer.dropEffect = \\\"copy\\\";\\n\\t\\t\\treturn this.dispatchDOMEvent(this.cloneEvent(event,[\\\"dataTransfer\\\"]));\\n\\t\\t}\\n\\t\\treturn true;\\n\\t};\\n\\n\\tEditTextWidget.prototype.handleDragLeaveEvent = function(event) {\\n\\t\\t// Ignore excessive events fired by FF when entering and leaving text nodes in a text area.\\n\\t\\tif(event.relatedTarget && ((event.relatedTarget.nodeType === 3) || (event.target === event.relatedTarget))) {\\n\\t\\t\\treturn true;\\n\\t\\t}\\n\\t\\tevent.preventDefault();\\n\\t\\tthis.dispatchDOMEvent(this.cloneEvent(event,[\\\"dataTransfer\\\"]));\\n\\t};\\n\\n\\tEditTextWidget.prototype.handleDragEndEvent = function(event) {\\n\\t\\tthis.dispatchDOMEvent(this.cloneEvent(event));\\n\\t};\\n\\n\\tEditTextWidget.prototype.handleClickEvent = function(event) {\\n\\t\\treturn !this.dispatchDOMEvent(this.cloneEvent(event));\\n\\t};\\n\\n\\treturn EditTextWidget;\\n}\\n\\nexports.editTextWidgetFactory = editTextWidgetFactory;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"library\"},\"$:/core/modules/editor/operations/bitmap/clear.js\":{\"title\":\"$:/core/modules/editor/operations/bitmap/clear.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/editor/operations/bitmap/clear.js\\ntype: application/javascript\\nmodule-type: bitmapeditoroperation\\n\\nBitmap editor operation to clear the image\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports[\\\"clear\\\"] = function(event) {\\n\\tvar ctx = this.canvasDomNode.getContext(\\\"2d\\\");\\n\\tctx.globalAlpha = 1;\\n\\tctx.fillStyle = event.paramObject.colour || \\\"white\\\";\\n\\tctx.fillRect(0,0,this.canvasDomNode.width,this.canvasDomNode.height);\\n\\t// Save changes\\n\\tthis.strokeEnd();\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"bitmapeditoroperation\"},\"$:/core/modules/editor/operations/bitmap/resize.js\":{\"title\":\"$:/core/modules/editor/operations/bitmap/resize.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/editor/operations/bitmap/resize.js\\ntype: application/javascript\\nmodule-type: bitmapeditoroperation\\n\\nBitmap editor operation to resize the image\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports[\\\"resize\\\"] = function(event) {\\n\\t// Get the new width\\n\\tvar newWidth = parseInt(event.paramObject.width || this.canvasDomNode.width,10),\\n\\t\\tnewHeight = parseInt(event.paramObject.height || this.canvasDomNode.height,10);\\n\\t// Update if necessary\\n\\tif(newWidth > 0 && newHeight > 0 && !(newWidth === this.currCanvas.width && newHeight === this.currCanvas.height)) {\\n\\t\\tthis.changeCanvasSize(newWidth,newHeight);\\n\\t}\\n\\t// Update the input controls\\n\\tthis.refreshToolbar();\\n\\t// Save the image into the tiddler\\n\\tthis.saveChanges();\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"bitmapeditoroperation\"},\"$:/core/modules/editor/operations/bitmap/rotate-left.js\":{\"title\":\"$:/core/modules/editor/operations/bitmap/rotate-left.js\",\"text\":\"/*\\\\\\ntitle: $
2731:/core/modules/editor/operations/bitmap/rotate-left.js\\ntype: application/javascript\\nmodule-type: bitmapeditoroperation\\n\\nBitmap editor operation to rotate the image left by 90 degrees\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports[\\\"rotate-left\\\"] = function(event) {\\n\\t// Rotate the canvas left by 90 degrees\\n\\tthis.rotateCanvasLeft();\\n\\t// Update the input controls\\n\\tthis.refreshToolbar();\\n\\t// Save the image into the tiddler\\n\\tthis.saveChanges();\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"bitmapeditoroperation\"},\"$:/core/modules/editor/operations/text/excise.js\":{\"title\":\"$:/core/modules/editor/operations/text/excise.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/editor/operations/text/excise.js\\ntype: application/javascript\\nmodule-type: texteditoroperation\\n\\nText editor operation to excise the selection to a new tiddler\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports[\\\"excise\\\"] = function(event,operation) {\\n\\tvar editTiddler = this.wiki.getTiddler(this.editTitle),\\n\\t\\teditTiddlerTitle = this.editTitle;\\n\\tif(editTiddler && editTiddler.fields[\\\"draft.of\\\"]) {\\n\\t\\teditTiddlerTitle = editTiddler.fields[\\\"draft.of\\\"];\\n\\t}\\n\\tvar excisionTitle = event.paramObject.title || this.wiki.generateNewTitle(\\\"New Excision\\\");\\n\\tthis.wiki.addTiddler(new $tw.Tiddler(\\n\\t\\tthis.wiki.getCreationFields(),\\n\\t\\tthis.wiki.getModificationFields(),\\n\\t\\t{\\n\\t\\t\\ttitle: excisionTitle,\\n\\t\\t\\ttext: operation.selection,\\n\\t\\t\\ttags: event.paramObject.tagnew === \\\"yes\\\" ?  [editTiddlerTitle] : []\\n\\t\\t}\\n\\t));\\n\\toperation.replacement = excisionTitle;\\n\\tswitch(event.paramObject.type || \\\"transclude\\\") {\\n\\t\\tcase \\\"transclude\\\":\\n\\t\\t\\toperation.replacement = \\\"{{\\\" + operation.replacement+ \\\"}}\\\";\\n\\t\\t\\tbreak;\\n\\t\\tcase \\\"link\\\":\\n\\t\\t\\toperation.replacement = \\\"[[\\\" + operation.replacement+ \\\"]]\\\";\\n\\t\\t\\tbreak;\\n\\t\\tcase \\\"macro\\\":\\n\\t\\t\\toperation.replacement = \\\"\u003C\u003C\\\" + (event.paramObject.macro || \\\"translink\\\") + \\\" \\\\\\\"\\\\\\\"\\\\\\\"\\\" + operation.replacement + \\\"\\\\\\\"\\\\\\\"\\\\\\\">>\\\";\\n\\t\\t\\tbreak;\\n\\t}\\n\\toperation.cutStart = operation.selStart;\\n\\toperation.cutEnd = operation.selEnd;\\n\\toperation.newSelStart = operation.selStart;\\n\\toperation.newSelEnd = operation.selStart + operation.replacement.length;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"texteditoroperation\"},\"$:/core/modules/editor/operations/text/focus-editor.js\":{\"title\":\"$:/core/modules/editor/operations/text/focus-editor.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/editor/operations/text/focus-editor.js\\ntype: application/javascript\\nmodule-type: texteditoroperation\\nSimply focus the Text editor\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports[\\\"focus-editor\\\"] = function(event,operation) {\\n\\toperation = null;\\n};\\n\\n})();\",\"type\":\"application/javascript\",\"module-type\":\"texteditoroperation\"},\"$:/core/modules/editor/operations/text/insert-text.js\":{\"title\":\"$:/core/modules/editor/operations/text/insert-text.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/editor/operations/text/insert-text.js\\ntype: application/javascript\\nmodule-type: texteditoroperation\\n\\nText editor operation insert text at the caret position. If there is a selection it is replaced.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports[\\\"insert-text\\\"] = function(event,operation) {\\n\\toperation.replacement = event.paramObject.text;\\n\\toperation.cutStart = operation.selStart;\\n\\toperation.cutEnd = operation.selEnd;\\n\\toperation.newSelStart = operation.selStart + operation.replacement.length;\\n\\toperation.newSelEnd = operation.newSelStart;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"texteditoroperation\"},\"$:/core/modules/editor/operations/text/make-link.js\":{\"title\":\"$:/core/modules/editor/operations/text/make-link.js\",\"text\":\"/*\\\\\\ntitle: $
2731:/core/modules/editor/operations/text/make-link.js\\ntype: application/javascript\\nmodule-type: texteditoroperation\\n\\nText editor operation to make a link\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports[\\\"make-link\\\"] = function(event,operation) {\\n\\tif(operation.selection) {\\n\\t\\toperation.replacement = \\\"[[\\\" + operation.selection + \\\"|\\\" + event.paramObject.text + \\\"]]\\\";\\n\\t\\toperation.cutStart = operation.selStart;\\n\\t\\toperation.cutEnd = operation.selEnd;\\n\\t} else {\\n\\t\\toperation.replacement = \\\"[[\\\" + event.paramObject.text + \\\"]]\\\";\\n\\t\\toperation.cutStart = operation.selStart;\\n\\t\\toperation.cutEnd = operation.selEnd;\\n\\t}\\n\\toperation.newSelStart = operation.selStart + operation.replacement.length;\\n\\toperation.newSelEnd = operation.newSelStart;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"texteditoroperation\"},\"$:/core/modules/editor/operations/text/prefix-lines.js\":{\"title\":\"$:/core/modules/editor/operations/text/prefix-lines.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/editor/operations/text/prefix-lines.js\\ntype: application/javascript\\nmodule-type: texteditoroperation\\n\\nText editor operation to add a prefix to the selected lines\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports[\\\"prefix-lines\\\"] = function(event,operation) {\\n\\tvar targetCount = parseInt(event.paramObject.count + \\\"\\\",10);\\n\\t// Cut just past the preceding line break, or the start of the text\\n\\toperation.cutStart = $tw.utils.findPrecedingLineBreak(operation.text,operation.selStart);\\n\\t// Cut to just past the following line break, or to the end of the text\\n\\toperation.cutEnd = $tw.utils.findFollowingLineBreak(operation.text,operation.selEnd);\\n\\t// Compose the required prefix\\n\\tvar prefix = $tw.utils.repeat(event.paramObject.character,targetCount);\\n\\t// Process each line\\n\\tvar lines = operation.text.substring(operation.cutStart,operation.cutEnd).split(/\\\\r?\\\\n/mg);\\n\\t$tw.utils.each(lines,function(line,index) {\\n\\t\\t// Remove and count any existing prefix characters\\n\\t\\tvar count = 0;\\n\\t\\twhile($tw.utils.startsWith(line,event.paramObject.character)) {\\n\\t\\t\\tline = line.substring(event.paramObject.character.length);\\n\\t\\t\\tcount++;\\n\\t\\t}\\n\\t\\t// Remove any whitespace\\n\\t\\twhile(line.charAt(0) === \\\" \\\") {\\n\\t\\t\\tline = line.substring(1);\\n\\t\\t}\\n\\t\\t// We're done if we removed the exact required prefix, otherwise add it\\n\\t\\tif(count !== targetCount) {\\n\\t\\t\\t// Apply the prefix\\n\\t\\t\\tline =  prefix + \\\" \\\" + line;\\n\\t\\t}\\n\\t\\t// Save the modified line\\n\\t\\tlines[index] = line;\\n\\t});\\n\\t// Stitch the replacement text together and set the selection\\n\\toperation.replacement = lines.join(\\\"\\\\n\\\");\\n\\tif(lines.length === 1) {\\n\\t\\toperation.newSelStart = operation.cutStart + operation.replacement.length;\\n\\t\\toperation.newSelEnd = operation.newSelStart;\\n\\t} else {\\n\\t\\toperation.newSelStart = operation.cutStart;\\n\\t\\toperation.newSelEnd = operation.newSelStart + operation.replacement.length;\\n\\t}\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"texteditoroperation\"},\"$:/core/modules/editor/operations/text/replace-all.js\":{\"title\":\"$:/core/modules/editor/operations/text/replace-all.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/editor/operations/text/replace-all.js\\ntype: application/javascript\\nmodule-type: texteditoroperation\\n\\nText editor operation to replace the entire text\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports[\\\"replace-all\\\"] = function(event,operation) {\\n\\toperation.cutStart = 0;\\n\\toperation.cutEnd = operation.text.length;\\n\\toperation.replacement = event.paramObject.text;\\n\\toperation.newSelStart = 0;\\n\\toperation.newSelEnd = operation.replacement.length;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"texteditoroperation\"},\"$:/core/modules/editor/operations/text/replace-selection.js\":{\"title\":\"$:/core/modules/editor/operations/text/replace-selection.js\",\"text\":\"/*\\\\\\ntitle: $
2731:/core/modules/editor/operations/text/replace-selection.js\\ntype: application/javascript\\nmodule-type: texteditoroperation\\n\\nText editor operation to replace the selection\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports[\\\"replace-selection\\\"] = function(event,operation) {\\n\\toperation.replacement = event.paramObject.text;\\n\\toperation.cutStart = operation.selStart;\\n\\toperation.cutEnd = operation.selEnd;\\n\\toperation.newSelStart = operation.selStart;\\n\\toperation.newSelEnd = operation.selStart + operation.replacement.length;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"texteditoroperation\"},\"$:/core/modules/editor/operations/text/save-selection.js\":{\"title\":\"$:/core/modules/editor/operations/text/save-selection.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/editor/operations/text/save-selection.js\\ntype: application/javascript\\nmodule-type: texteditoroperation\\n\\nText editor operation to save the current selection in a specified tiddler\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports[\\\"save-selection\\\"] = function(event,operation) {\\n\\tvar tiddler = event.paramObject.tiddler,\\n\\t\\tfield = event.paramObject.field || \\\"text\\\";\\n\\tif(tiddler && field) {\\n\\t\\tthis.wiki.setText(tiddler,field,null,operation.text.substring(operation.selStart,operation.selEnd));\\n\\t}\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"texteditoroperation\"},\"$:/core/modules/editor/operations/text/wrap-lines.js\":{\"title\":\"$:/core/modules/editor/operations/text/wrap-lines.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/editor/operations/text/wrap-lines.js\\ntype: application/javascript\\nmodule-type: texteditoroperation\\n\\nText editor operation to wrap the selected lines with a prefix and suffix\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports[\\\"wrap-lines\\\"] = function(event,operation) {\\n\\tvar prefix = event.paramObject.prefix || \\\"\\\",\\n\\t\\tsuffix = event.paramObject.suffix || \\\"\\\";\\n\\tif($tw.utils.endsWith(operation.text.substring(0,operation.selStart), prefix + \\\"\\\\n\\\") &&\\n\\t\\t\\t$tw.utils.startsWith(operation.text.substring(operation.selEnd), \\\"\\\\n\\\" + suffix)) {\\n\\t\\t// Selected text is already surrounded by prefix and suffix: Remove them\\n\\t\\t// Cut selected text plus prefix and suffix\\n\\t\\toperation.cutStart = operation.selStart - (prefix.length + 1);\\n\\t\\toperation.cutEnd = operation.selEnd + suffix.length + 1;\\n\\t\\t// Also cut the following newline (if there is any)\\n\\t\\tif (operation.text[operation.cutEnd] === \\\"\\\\n\\\") {\\n\\t\\t\\toperation.cutEnd++;\\n\\t\\t}\\n\\t\\t// Replace with selection\\n\\t\\toperation.replacement = operation.text.substring(operation.selStart,operation.selEnd);\\n\\t\\t// Select text that was in between prefix and suffix\\n\\t\\toperation.newSelStart = operation.cutStart;\\n\\t\\toperation.newSelEnd = operation.selEnd - (prefix.length + 1);\\n\\t} else {\\n\\t\\t// Cut just past the preceding line break, or the start of the text\\n\\t\\toperation.cutStart = $tw.utils.findPrecedingLineBreak(operation.text,operation.selStart);\\n\\t\\t// Cut to just past the following line break, or to the end of the text\\n\\t\\toperation.cutEnd = $tw.utils.findFollowingLineBreak(operation.text,operation.selEnd);\\n\\t\\t// Add the prefix and suffix\\n\\t\\toperation.replacement = prefix + \\\"\\\\n\\\" +\\n\\t\\t\\t\\t\\toperation.text.substring(operation.cutStart,operation.cutEnd) + \\\"\\\\n\\\" +\\n\\t\\t\\t\\t\\tsuffix + \\\"\\\\n\\\";\\n\\t\\toperation.newSelStart = operation.cutStart + prefix.length + 1;\\n\\t\\toperation.newSelEnd = operation.newSelStart + (operation.cutEnd - operation.cutStart);\\n\\t}\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"texteditoroperation\"},\"$:/core/modules/editor/operations/text/wrap-selection.js\":{\"title\":\"$:/core/modules/editor/operations/text/wrap-selection.js\",\"text\":\"/*\\\\\\ntitle: $
2731:/core/modules/editor/operations/text/wrap-selection.js\\ntype: application/javascript\\nmodule-type: texteditoroperation\\n\\nText editor operation to wrap the selection with the specified prefix and suffix\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports[\\\"wrap-selection\\\"] = function(event,operation) {\\n\\tif(operation.selStart === operation.selEnd) {\\n\\t\\t// No selection; check if we're within the prefix/suffix\\n\\t\\tif(operation.text.substring(operation.selStart - event.paramObject.prefix.length,operation.selStart + event.paramObject.suffix.length) === event.paramObject.prefix + event.paramObject.suffix) {\\n\\t\\t\\t// Remove the prefix and suffix\\n\\t\\t\\toperation.cutStart = operation.selStart - event.paramObject.prefix.length;\\n\\t\\t\\toperation.cutEnd = operation.selEnd + event.paramObject.suffix.length;\\n\\t\\t\\toperation.replacement = \\\"\\\";\\n\\t\\t\\toperation.newSelStart = operation.cutStart;\\n\\t\\t\\toperation.newSelEnd = operation.newSelStart;\\n\\t\\t} else {\\n\\t\\t\\t// Wrap the cursor instead\\n\\t\\t\\toperation.cutStart = operation.selStart;\\n\\t\\t\\toperation.cutEnd = operation.selEnd;\\n\\t\\t\\toperation.replacement = event.paramObject.prefix + event.paramObject.suffix;\\n\\t\\t\\toperation.newSelStart = operation.selStart + event.paramObject.prefix.length;\\n\\t\\t\\toperation.newSelEnd = operation.newSelStart;\\n\\t\\t}\\n\\t} else if(operation.text.substring(operation.selStart,operation.selStart + event.paramObject.prefix.length) === event.paramObject.prefix && operation.text.substring(operation.selEnd - event.paramObject.suffix.length,operation.selEnd) === event.paramObject.suffix) {\\n\\t\\t// Prefix and suffix are already present, so remove them\\n\\t\\toperation.cutStart = operation.selStart;\\n\\t\\toperation.cutEnd = operation.selEnd;\\n\\t\\toperation.replacement = operation.selection.substring(event.paramObject.prefix.length,operation.selection.length - event.paramObject.suffix.length);\\n\\t\\toperation.newSelStart = operation.selStart;\\n\\t\\toperation.newSelEnd = operation.selStart + operation.replacement.length;\\n\\t} else {\\n\\t\\t// Add the prefix and suffix\\n\\t\\toperation.cutStart = operation.selStart;\\n\\t\\toperation.cutEnd = operation.selEnd;\\n\\t\\toperation.replacement = event.paramObject.prefix + operation.selection + event.paramObject.suffix;\\n\\t\\toperation.newSelStart = operation.selStart;\\n\\t\\toperation.newSelEnd = operation.selStart + operation.replacement.length;\\n\\t}\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"texteditoroperation\"},\"$:/core/modules/filterrunprefixes/all.js\":{\"title\":\"$:/core/modules/filterrunprefixes/all.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filterrunprefixes/all.js\\ntype: application/javascript\\nmodule-type: filterrunprefix\\n\\
2731nUnion of sets without de-duplication.\\nEquivalent to = filter run prefix.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter prefix function\\n*/\\nexports.all = function(operationSubFunction) {\\n\\treturn function(results,source,widget) {\\n\\t\\tresults.push.apply(results, operationSubFunction(source,widget));\\n\\t};\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filterrunprefix\"},\"$:/core/modules/filterrunprefixes/and.js\":{\"title\":\"$:/core/modules/filterrunprefixes/and.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filterrunprefixes/and.js\\ntype: application/javascript\\nmodule-type: filterrunprefix\\n\\nIntersection of sets.\\nEquivalent to + filter run prefix.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter prefix function\\n*/\\nexports.and = function(operationSubFunction,options) {\\n\\treturn function(results,source,widget) {\\n\\t\\t// This replaces all the elements of the array, but keeps the actual array so that references to it are preserved\\n\\t\\tsource = options.wiki.makeTiddlerIterator(results.toArray());\\n\\t\\tresults.clear();\\n\\t\\tresults.pushTop(operationSubFunction(source,widget));\\n\\t};\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filterrunprefix\"},\"$:/core/modules/filterrunprefixes/cascade.js\":{\"title\":\"$:/core/modules/filterrunprefixes/cascade.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filterrunprefixes/cascade.js\\ntype: application/javascript\\nmodule-type: filterrunprefix\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter prefix function\\n*/\\nexports.cascade = function(operationSubFunction,options) {\\n\\treturn function(results,source,widget) {\\n\\t\\tif(results.length !== 0) {\\n\\t\\t\\tvar filterList = operationSubFunction(source,widget),\\n\\t\\t\\t\\tfilterFnList = [];\\n\\t\\t\\tvar inputResults = results.toArray();\\n\\t\\t\\tresults.clear();\\n\\t\\t\\t$tw.utils.each(inputResults,function(title) {\\n\\t\\t\\t\\tvar result = \\\"\\\"; // If no filter matches, we return an empty string\\n\\t\\t\\t\\t$tw.utils.each(filterList,function(filter,index) {\\n\\t\\t\\t\\t\\tif(!filterFnList[index]) {\\n\\t\\t\\t\\t\\t\\tfilterFnList[index] = options.wiki.compileFilter(filter);\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tvar output = filterFnList[index](options.wiki.makeTiddlerIterator([title]),widget.makeFakeWidgetWithVariables({\\n\\t\\t\\t\\t\\t\\t\\\"currentTiddler\\\": \\\"\\\" + title,\\n\\t\\t\\t\\t\\t\\t\\\"..currentTiddler\\\": widget.getVariable(\\\"currentTiddler\\\",\\\"\\\")\\n\\t\\t\\t\\t\\t}));\\n\\t\\t\\t\\t\\tif(output.length !== 0) {\\n\\t\\t\\t\\t\\t\\tresult = output[0];\\n\\t\\t\\t\\t\\t\\treturn false;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t});\\n\\t\\t\\t\\tresults.push(result);\\n\\t\\t\\t});\\n\\t\\t}\\n\\t}\\n};\\n\\n})();\",\"type\":\"application/javascript\",\"module-type\":\"filterrunprefix\"},\"$:/core/modules/filterrunprefixes/else.js\":{\"title\":\"$:/core/modules/filterrunprefixes/else.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filterrunprefixes/else.js\\ntype: application/javascript\\nmodule-type: filterrunprefix\\n\\
2731nEquivalent to ~ filter run prefix.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter prefix function\\n*/\\nexports.else = function(operationSubFunction) {\\n\\treturn function(results,source,widget) {\\n\\t\\tif(results.length === 0) {\\n\\t\\t\\t// Main result so far is empty\\n\\t\\t\\tresults.pushTop(operationSubFunction(source,widget));\\n\\t\\t}\\n\\t};\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filterrunprefix\"},\"$:/core/modules/filterrunprefixes/except.js\":{\"title\":\"$:/core/modules/filterrunprefixes/except.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filterrunprefixes/except.js\\ntype: application/javascript\\nmodule-type: filterrunprefix\\n\\nDifference of sets.\\nEquivalent to - filter run prefix.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter prefix function\\n*/\\nexports.except = function(operationSubFunction) {\\n\\treturn function(results,source,widget) {\\n\\t\\tresults.remove(operationSubFunction(source,widget));\\n\\t};\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filterrunprefix\"},\"$:/core/modules/filterrunprefixes/filter.js\":{\"title\":\"$:/core/modules/filterrunprefixes/filter.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filterrunprefixes/filter.js\\ntype: application/javascript\\nmodule-type: filterrunprefix\\n\\
2731n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.filter = function(operationSubFunction,options) {\\n\\treturn function(results,source,widget) {\\n\\t\\tif(results.length > 0) {\\n\\t\\t\\tvar resultsToRemove = [],\\n\\t\\t\\t\\tindex = 0;\\n\\t\\t\\tresults.each(function(title) {\\n\\t\\t\\t\\tvar filtered = operationSubFunction(options.wiki.makeTiddlerIterator([title]),widget.makeFakeWidgetWithVariables({\\n\\t\\t\\t\\t\\t\\\"currentTiddler\\\": \\\"\\\" + title,\\n\\t\\t\\t\\t\\t\\\"..currentTiddler\\\": widget.getVariable(\\\"currentTiddler\\\",\\\"\\\"),\\n\\t\\t\\t\\t\\t\\\"index\\\": \\\"\\\" + index,\\n\\t\\t\\t\\t\\t\\\"revIndex\\\": \\\"\\\" +  (results.length - 1 - index),\\n\\t\\t\\t\\t\\t\\\"length\\\": \\\"\\\" + results.length\\n\\t\\t\\t\\t}));\\n\\t\\t\\t\\tif(filtered.length === 0) {\\n\\t\\t\\t\\t\\tresultsToRemove.push(title);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t++index;\\n\\t\\t\\t});\\n\\t\\t\\tresults.remove(resultsToRemove);\\n\\t\\t}\\n\\t}\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filterrunprefix\"},\"$:/core/modules/filterrunprefixes/intersection.js\":{\"title\":\"$:/core/modules/filterrunprefixes/intersection.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filterrunprefixes/intersection.js\\ntype: application/javascript\\nmodule-type: filterrunprefix\\n\\
2731n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter prefix function\\n*/\\nexports.intersection = function(operationSubFunction) {\\n\\treturn function(results,source,widget) {\\n\\t\\tif(results.length !== 0) {\\n\\t\\t\\tvar secondRunResults = operationSubFunction(source,widget);\\n\\t\\t\\tvar firstRunResults = results.toArray();\\n\\t\\t\\tresults.clear();\\n\\t\\t\\t$tw.utils.each(firstRunResults,function(title) {\\n\\t\\t\\t\\tif(secondRunResults.indexOf(title) !== -1) {\\n\\t\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t\\t}\\n\\t\\t\\t});\\n\\t\\t}\\n\\t};\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filterrunprefix\"},\"$:/core/modules/filterrunprefixes/map.js\":{\"title\":\"$:/core/modules/filterrunprefixes/map.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filterrunprefixes/map.js\\ntype: application/javascript\\nmodule-type: filterrunprefix\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter prefix function\\n*/\\nexports.map = function(operationSubFunction,options) {\\n\\treturn function(results,source,widget) {\\n\\t\\tif(results.length > 0) {\\n\\t\\t\\tvar inputTitles = results.toArray(),\\n\\t\\t\\t\\tindex = 0,\\n\\t\\t\\t\\tsuffixes = options.suffixes,\\n\\t\\t\\t\\tflatten = (suffixes[0] && suffixes[0][0] === \\\"flat\\\") ? true : false;\\n\\t\\t\\tresults.clear();\\n\\t\\t\\t$tw.utils.each(inputTitles,function(title) {\\n\\t\\t\\t\\tvar filtered = operationSubFunction(options.wiki.makeTiddlerIterator([title]),widget.makeFakeWidgetWithVariables({\\n\\t\\t\\t\\t\\t\\\"currentTiddler\\\": \\\"\\\" + title,\\n\\t\\t\\t\\t\\t\\\"..currentTiddler\\\": widget.getVariable(\\\"currentTiddler\\\",\\\"\\\"),\\n\\t\\t\\t\\t\\t\\\"index\\\": \\\"\\\" + index,\\n\\t\\t\\t\\t\\t\\\"revIndex\\\": \\\"\\\" +  (inputTitles.length - 1 - index),\\n\\t\\t\\t\\t\\t\\\"length\\\": \\\"\\\" + inputTitles.length\\n\\t\\t\\t\\t}));\\n\\t\\t\\t\\tif(filtered.length && flatten) {\\n\\t\\t\\t\\t\\t$tw.utils.each(filtered,function(value) {\\n\\t\\t\\t\\t\\t\\tresults.push(value);\\n\\t\\t\\t\\t\\t})\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tresults.push(filtered[0]||\\\"\\\");\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t++index;\\n\\t\\t\\t});\\n\\t\\t}\\n\\t}\\n};\\n\\n})();\",\"type\":\"application/javascript\",\"module-type\":\"filterrunprefix\"},\"$:/core/modules/filterrunprefixes/or.js\":{\"title\":\"$:/core/modules/filterrunprefixes/or.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filterrunprefixes/or.js\\ntype: application/javascript\\nmodule-type: filterrunprefix\\n\\
2731nEquivalent to a filter run with no prefix.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter prefix function\\n*/\\nexports.or = function(operationSubFunction) {\\n\\treturn function(results,source,widget) {\\n\\t\\tresults.pushTop(operationSubFunction(source,widget));\\n\\t};\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filterrunprefix\"},\"$:/core/modules/filterrunprefixes/reduce.js\":{\"title\":\"$:/core/modules/filterrunprefixes/reduce.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filterrunprefixes/reduce.js\\ntype: application/javascript\\nmodule-type: filterrunprefix\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter prefix function\\n*/\\nexports.reduce = function(operationSubFunction,options) {\\n\\treturn function(results,source,widget) {\\n\\t\\tif(results.length > 0) {\\n\\t\\t\\tvar accumulator = \\\"\\\",\\n\\t\\t\\t\\tindex = 0;\\n\\t\\t\\tresults.each(function(title) {\\n\\t\\t\\t\\tvar list = operationSubFunction(options.wiki.makeTiddlerIterator([title]),widget.makeFakeWidgetWithVariables({\\n\\t\\t\\t\\t\\t\\\"currentTiddler\\\": \\\"\\\" + title,\\n\\t\\t\\t\\t\\t\\\"..currentTiddler\\\": widget.getVariable(\\\"currentTiddler\\\"),\\n\\t\\t\\t\\t\\t\\\"index\\\": \\\"\\\" + index,\\n\\t\\t\\t\\t\\t\\\"revIndex\\\": \\\"\\\" +  (results.length - 1 - index),\\n\\t\\t\\t\\t\\t\\\"length\\\": \\\"\\\" + results.length,\\n\\t\\t\\t\\t\\t\\\"accumulator\\\": \\\"\\\" + accumulator\\n\\t\\t\\t\\t}));\\n\\t\\t\\t\\tif(list.length > 0) {\\n\\t\\t\\t\\t\\taccumulator = \\\"\\\" + list[0];\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t++index;\\n\\t\\t\\t});\\n\\t\\t\\tresults.clear();\\n\\t\\t\\tresults.push(accumulator);\\n\\t\\t}\\n\\t}\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filterrunprefix\"},\"$:/core/modules/filterrunprefixes/sort.js\":{\"title\":\"$:/core/modules/filterrunprefixes/sort.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filterrunprefixes/sort.js\\ntype: application/javascript\\nmodule-type: filterrunprefix\\n\\
2731n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter prefix function\\n*/\\nexports.sort = function(operationSubFunction,options) {\\n\\treturn function(results,source,widget) {\\n\\t\\tif(results.length > 0) {\\n\\t\\t\\tvar suffixes = options.suffixes,\\n\\t\\t\\t\\tsortType = (suffixes[0] && suffixes[0][0]) ? suffixes[0][0] : \\\"string\\\",\\n\\t\\t\\t\\tinvert = suffixes[1] ? (suffixes[1].indexOf(\\\"reverse\\\") !== -1) : false,\\n\\t\\t\\t\\tisCaseSensitive = suffixes[1] ? (suffixes[1].indexOf(\\\"casesensitive\\\") !== -1) : false,\\n\\t\\t\\t\\tinputTitles = results.toArray(),\\n\\t\\t\\t\\tsortKeys = [],\\n\\t\\t\\t\\tindexes = new Array(inputTitles.length),\\n\\t\\t\\t\\tcompareFn;\\n\\t\\t\\tresults.each(function(title) {\\n\\t\\t\\t\\tvar key = operationSubFunction(options.wiki.makeTiddlerIterator([title]),widget.makeFakeWidgetWithVariables({\\n\\t\\t\\t\\t\\t\\\"currentTiddler\\\": \\\"\\\" + title,\\n\\t\\t\\t\\t\\t\\\"..currentTiddler\\\": widget.getVariable(\\\"currentTiddler\\\")\\n\\t\\t\\t\\t}));\\n\\t\\t\\t\\tsortKeys.push(key[0] || \\\"\\\");\\n\\t\\t\\t});\\n\\t\\t\\tresults.clear();\\n\\t\\t\\t// Prepare an array of indexes to sort\\n\\t\\t\\tfor(var t=0; t\u003CinputTitles.length; t++) {\\n\\t\\t\\t\\tindexes[t] = t;\\n\\t\\t\\t}\\n\\t\\t\\t// Sort the indexes\\n\\t\\t\\tcompareFn = $tw.utils.makeCompareFunction(sortType,{defaultType: \\\"string\\\", invert:invert, isCaseSensitive:isCaseSensitive});\\n\\t\\t\\tindexes = indexes.sort(function(a,b) {\\n\\t\\t\\t\\t\\treturn compareFn(sortKeys[a],sortKeys[b]);\\n\\t\\t\\t});\\n\\t\\t\\t// Add to results in correct order\\n\\t\\t\\t$tw.utils.each(indexes,function(index) {\\n\\t\\t\\t\\tresults.push(inputTitles[index]);\\n\\t\\t\\t});\\n\\t\\t}\\n\\t}\\n};\\n\\n})();\",\"type\":\"application/javascript\",\"module-type\":\"filterrunprefix\"},\"$:/core/modules/filterrunprefixes/then.js\":{\"title\":\"$:/core/modules/filterrunprefixes/then.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filterrunprefixes/then.js\\ntype: application/javascript\\nmodule-type: filterrunprefix\\n\\
2731nReplace results of previous runs unless empty\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter prefix function\\n*/\\nexports.then = function(operationSubFunction) {\\n\\treturn function(results,source,widget) {\\n\\t\\tif(results.length !== 0) {\\n\\t\\t\\t// Only run if previous run(s) produced results\\n\\t\\t\\tvar thisRunResult = operationSubFunction(source,widget);\\n\\t\\t\\tif(thisRunResult.length !== 0) {\\n\\t\\t\\t\\t// Replace results only if this run actually produces a result\\n\\t\\t\\t\\tresults.clear();\\n\\t\\t\\t\\tresults.pushTop(thisRunResult);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t};\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filterrunprefix\"},\"$:/core/modules/filters/addprefix.js\":{\"title\":\"$:/core/modules/filters/addprefix.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/addprefix.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator for adding a prefix to each title in the list. This is\\nespecially useful in contexts where only a filter expression is allowed\\nand macro substitution isn't available.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.addprefix = function(source,operator,options) {\\n\\tvar results = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tresults.push(operator.operand + title);\\n\\t});\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/addsuffix.js\":{\"title\":\"$:/core/modules/filters/addsuffix.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/addsuffix.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator for adding a suffix to each title in the list. This is\\nespecially useful in contexts where only a filter expression is allowed\\nand macro substitution isn't available.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.addsuffix = function(source,operator,options) {\\n\\tvar results = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tresults.push(title + operator.operand);\\n\\t});\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/after.js\":{\"title\":\"$:/core/modules/filters/after.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/after.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator returning the tiddler from the current list that is after the tiddler named in the operand.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.after = function(source,operator,options) {\\n\\tvar results = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tresults.push(title);\\n\\t});\\n\\tvar index = results.indexOf(operator.operand);\\n\\tif(index === -1 || index > (results.length - 2)) {\\n\\t\\treturn [];\\n\\t} else {\\n\\t\\treturn [results[index + 1]];\\n\\t}\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/all/current.js\":{\"title\":\"$:/core/modules/filters/all/current.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/all/current.js\\ntype: application/javascript\\nmodule-type: allfilteroperator\\n\\nFilter function for [all[current]]\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.current = function(source,prefix,options) {\\n\\tvar currTiddlerTitle = options.widget && options.widget.getVariable(\\\"currentTiddler\\\");\\n\\tif(currTiddlerTitle) {\\n\\t\\treturn [currTiddlerTitle];\\n\\t} else {\\n\\t\\treturn [];\\n\\t}\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"allfilteroperator\"},\"$:/core/modules/filters/all/missing.js\":{\"title\":\"$:/core/modules/filters/all/missing.js\",\"text\":\"/*\\\\\\ntitle: $
2731:/core/modules/filters/all/missing.js\\ntype: application/javascript\\nmodule-type: allfilteroperator\\n\\nFilter function for [all[missing]]\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.missing = function(source,prefix,options) {\\n\\treturn options.wiki.getMissingTitles();\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"allfilteroperator\"},\"$:/core/modules/filters/all/orphans.js\":{\"title\":\"$:/core/modules/filters/all/orphans.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/all/orphans.js\\ntype: application/javascript\\nmodule-type: allfilteroperator\\n\\nFilter function for [all[orphans]]\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.orphans = function(source,prefix,options) {\\n\\treturn options.wiki.getOrphanTitles();\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"allfilteroperator\"},\"$:/core/modules/filters/all/shadows.js\":{\"title\":\"$:/core/modules/filters/all/shadows.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/all/shadows.js\\ntype: application/javascript\\nmodule-type: allfilteroperator\\n\\nFilter function for [all[shadows]]\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.shadows = function(source,prefix,options) {\\n\\treturn options.wiki.allShadowTitles();\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"allfilteroperator\"},\"$:/core/modules/filters/all/tags.js\":{\"title\":\"$:/core/modules/filters/all/tags.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/all/tags.js\\ntype: application/javascript\\nmodule-type: allfilteroperator\\n\\nFilter function for [all[tags]]\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.tags = function(source,prefix,options) {\\n\\treturn Object.keys(options.wiki.getTagMap());\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"allfilteroperator\"},\"$:/core/modules/filters/all/tiddlers.js\":{\"title\":\"$:/core/modules/filters/all/tiddlers.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/all/tiddlers.js\\ntype: application/javascript\\nmodule-type: allfilteroperator\\n\\nFilter function for [all[tiddlers]]\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.tiddlers = function(source,prefix,options) {\\n\\treturn options.wiki.allTitles();\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"allfilteroperator\"},\"$:/core/modules/filters/all.js\":{\"title\":\"$:/core/modules/filters/all.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/all.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator for selecting tiddlers\\n\\n[all[shadows+tiddlers]]\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar allFilterOperators;\\n\\nfunction getAllFilterOperators() {\\n\\tif(!allFilterOperators) {\\n\\t\\tallFilterOperators = {};\\n\\t\\t$tw.modules.applyMethods(\\\"allfilteroperator\\\",allFilterOperators);\\n\\t}\\n\\treturn allFilterOperators;\\n}\\n\\n/*\\nExport our filter function\\n*/\\nexports.all = function(source,operator,options) {\\n\\t// Get our suboperators\\n\\tvar allFilterOperators = getAllFilterOperators();\\n\\t// Cycle through the suboperators accumulating their results\\n\\tvar results = new $tw.utils.LinkedList(),\\n\\t\\tsubops = operator.operand.split(\\\"+\\\");
2731\\n\\t// Check for common optimisations\\n\\tif(subops.length === 1 && subops[0] === \\\"\\\") {\\n\\t\\treturn source;\\n\\t} else if(subops.length === 1 && subops[0] === \\\"tiddlers\\\") {\\n\\t\\treturn options.wiki.each;\\n\\t} else if(subops.length === 1 && subops[0] === \\\"shadows\\\") {\\n\\t\\treturn options.wiki.eachShadow;\\n\\t} else if(subops.length === 2 && subops[0] === \\\"tiddlers\\\" && subops[1] === \\\"shadows\\\") {\\n\\t\\treturn options.wiki.eachTiddlerPlusShadows;\\n\\t} else if(subops.length === 2 && subops[0] === \\\"shadows\\\" && subops[1] === \\\"tiddlers\\\") {\\n\\t\\treturn options.wiki.eachShadowPlusTiddlers;\\n\\t}\\n\\t// Do it the hard way\\n\\tfor(var t=0; t\u003Csubops.length; t++) {\\n\\t\\tvar subop = allFilterOperators[subops[t]];\\n\\t\\tif(subop) {\\n\\t\\t\\tresults.pushTop(subop(source,operator.prefix,options));\\n\\t\\t}\\n\\t}\\n\\treturn results.makeTiddlerIterator(options.wiki);\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/backlinks.js\":{\"title\":\"$:/core/modules/filters/backlinks.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/backlinks.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator for returning all the backlinks from a tiddler\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.backlinks = function(source,operator,options) {\\n\\tvar results = new $tw.utils.LinkedList();\\n\\tsource(function(tiddler,title) {\\n\\t\\tresults.pushTop(options.wiki.getTiddlerBacklinks(title));\\n\\t});\\n\\treturn results.makeTiddlerIterator(options.wiki);\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/before.js\":{\"title\":\"$:/core/modules/filters/before.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/before.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator returning the tiddler from the current list that is before the tiddler named in the operand.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.before = function(source,operator,options) {\\n\\tvar results = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tresults.push(title);\\n\\t});\\n\\tvar index = results.indexOf(operator.operand);\\n\\tif(index \u003C= 0) {\\n\\t\\treturn [];\\n\\t} else {\\n\\t\\treturn [results[index - 1]];\\n\\t}\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/commands.js\":{\"title\":\"$:/core/modules/filters/commands.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/commands.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator for returning the names of the commands available in this wiki\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.commands = function(source,operator,options) {\\n\\tvar results = [];\\n\\t$tw.utils.each($tw.commands,function(commandInfo,name) {\\n\\t\\tresults.push(name);\\n\\t});\\n\\tresults.sort();\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/compare.js\":{\"title\":\"$:/core/modules/filters/compare.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/compare.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nGeneral purpose comparison operator\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.compare = function(source,operator,options) {\\n\\tvar suffixes = operator.suffixes || [],\\n\\t\\ttype = (suffixes[0] || [])[0],\\n\\t\\tmode = (suffixes[1] || [])[0],\\n\\t\\ttypeFn = $tw.utils.makeCompareFunction(type,{defaultType: \\\"number\\\"}),\\n\\t\\tmodeFn = modes[mode] || modes.eq,\\n\\t\\tinvert = operator.prefix === \\\"!\\\",\\n\\t\\tresults = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tif(modeFn(typeFn(title,operator.operand)) !== invert) {\\n\\t\\t\\tresults.push(title);\\n\\t\\t}\\n\\t});\\n\\treturn results;\\n};\\n\\nvar modes = {\\n\\t\\\"eq\\\": function(value) {return value === 0;},\\n\\t\\\"ne\\\": function(value) {return value !== 0;},\\n\\t\\\"gteq\\\": function(value) {return value >= 0;},\\n\\t\\\"gt\\\": function(value) {return value > 0;},\\n\\t\\\"lteq\\\": function(value) {return value \u003C= 0;},\\n\\t\\\"lt\\\": function(value) {return value \u003C 0;}\\n}\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/contains.js\":{\"title\":\"$:/core/modules/filters/contains.js\",\"text\":\"/*\\\\\\ntitle: $
2731:/core/modules/filters/contains.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator for finding values in array fields\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.contains = function(source,operator,options) {\\n\\tvar results = [],\\n\\t\\tfieldname = operator.suffix || \\\"list\\\";\\n\\tif(operator.prefix === \\\"!\\\") {\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tif(tiddler) {\\n\\t\\t\\t\\tvar list = tiddler.getFieldList(fieldname);\\n\\t\\t\\t\\tif(list.indexOf(operator.operand) === -1) {\\n\\t\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t}\\n\\t\\t});\\n\\t} else {\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tif(tiddler) {\\n\\t\\t\\t\\tvar list = tiddler.getFieldList(fieldname);\\n\\t\\t\\t\\tif(list.indexOf(operator.operand) !== -1) {\\n\\t\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t});\\n\\t}\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/count.js\":{\"title\":\"$:/core/modules/filters/count.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/count.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator returning the number of entries in the current list.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.count = function(source,operator,options) {\\n\\tvar count = 0;\\n\\tsource(function(tiddler,title) {\\n\\t\\tcount++;\\n\\t});\\n\\treturn [count + \\\"\\\"];\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/crypto.js\":{\"title\":\"$:/core/modules/filters/crypto.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/crypto.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operators for cryptography, using the Stanford JavaScript library\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.sha256 = function(source,operator,options) {\\n\\tvar results = [],\\n\\t\\tlength = parseInt(operator.operand,10) || 20,\\n\\t\\tsha256 = function(text) {\\n\\t\\t\\treturn sjcl.codec.hex.fromBits(sjcl.hash.sha256.hash(text)).substr(0,length);\\n\\t\\t};\\n\\tsource(function(tiddler,title) {\\n\\t\\tresults.push(sha256(title));\\n\\t});\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/days.js\":{\"title\":\"$:/core/modules/filters/days.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/days.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator that selects tiddlers with a specified date field within a specified date interval.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.days = function(source,operator,options) {\\n\\tvar results = [],\\n\\t\\tfieldName = operator.suffix || \\\"modified\\\",\\n\\t\\tdayInterval = (parseInt(operator.operand,10)||0),\\n\\t\\tdayIntervalSign = $tw.utils.sign(dayInterval),\\n\\t\\ttargetTimeStamp = (new Date()).setHours(0,0,0,0) + 1000*60*60*24*dayInterval,\\n\\t\\tisWithinDays = function(dateField) {\\n\\t\\t\\tvar sign = $tw.utils.sign(targetTimeStamp - (new Date(dateField)).setHours(0,0,0,0));\\n\\t\\t\\treturn sign === 0 || sign === dayIntervalSign;\\n\\t\\t};\\n\\n\\tif(operator.prefix === \\\"!\\\") {\\n\\t\\ttargetTimeStamp = targetTimeStamp - 1000*60*60*24*dayIntervalSign;
2731\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tif(tiddler && tiddler.fields[fieldName]) {\\n\\t\\t\\t\\tif(!isWithinDays($tw.utils.parseDate(tiddler.fields[fieldName]))) {\\n\\t\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t});\\n\\t} else {\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tif(tiddler && tiddler.fields[fieldName]) {\\n\\t\\t\\t\\tif(isWithinDays($tw.utils.parseDate(tiddler.fields[fieldName]))) {\\n\\t\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t});\\n\\t}\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/deserialize.js\":{\"title\":\"$:/core/modules/filters/deserialize.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/deserialize.js\\ntype: application/javascript\\nmodule-type: filteroperator\\nFilter operator for deserializing string data into JSON representing tiddlers\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports[\\\"deserialize\\\"] = function(source,operator,options) {\\n\\tvar results = [],\\n\\t\\tdeserializer;\\n\\tif(operator.operand) {\\n\\t\\t// Get the deserializer identified by the operand\\n\\t\\tdeserializer = $tw.Wiki.tiddlerDeserializerModules[operator.operand];\\n\\t\\tif(deserializer) {\\n\\t\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\t\\tvar tiddlers;\\n\\t\\t\\t\\ttry {\\n\\t\\t\\t\\t\\ttiddlers = deserializer(title);\\n\\t\\t\\t\\t} catch(e) {\\n\\t\\t\\t\\t\\t// Return an empty array if we could not extract any tiddlers\\n\\t\\t\\t\\t\\ttiddlers = [];\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tresults.push(JSON.stringify(tiddlers));\\n\\t\\t\\t});\\n\\t\\t} else {\\n\\t\\t\\treturn [$tw.language.getString(\\\"Error/DeserializeOperator/UnknownDeserializer\\\")];\\n\\t\\t}\\n\\t} else {\\n\\t\\treturn [$tw.language.getString(\\\"Error/DeserializeOperator/MissingOperand\\\")];\\n\\t}\\n\\treturn results;\\n}\\n\\n})();\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/deserializers.js\":{\"title\":\"$:/core/modules/filters/deserializers.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/deserializers.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator for returning the names of the deserializers in this wiki\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.deserializers = function(source,operator,options) {\\n\\tvar results = [];\\n\\t$tw.utils.each($tw.Wiki.tiddlerDeserializerModules,function(deserializer,type) {\\n\\t\\tresults.push(type);\\n\\t});\\n\\tresults.sort();\\n\\treturn results;\\n};\\n\\n})();\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/duplicateslugs.js\":{\"title\":\"$:/core/modules/filters/duplicateslugs.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/duplicateslugs.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter function for [duplicateslugs[]]\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.duplicateslugs = function(source,operator,options) {\\n\\tvar slugs = Object.create(null), // Hashmap by slug of title, replaced with \\\"true\\\" if the duplicate title has already been output\\n\\t\\tresults = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tvar slug = options.wiki.slugify(title);\\n\\t\\tif(slug in slugs) {\\n\\t\\t\\tif(slugs[slug] !== true) {\\n\\t\\t\\t\\tresults.push(slugs[slug]);\\n\\t\\t\\t\\tslugs[slug] = true;\\n\\t\\t\\t}\\n\\t\\t\\tresults.push(title);\\n\\t\\t} else {\\n\\t\\t\\tslugs[slug] = title;\\n\\t\\t}\\n\\t});\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/each.js\":{\"title\":\"$:/core/modules/filters/each.js\",\"text\":\"/*\\\\\\ntitle: $
2731:/core/modules/filters/each.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator that selects one tiddler for each unique value of the specified field.\\nWith suffix \\\"list\\\", selects all tiddlers that are values in a specified list field.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.each = function(source,operator,options) {\\n\\tvar results =[] ,\\n\\tvalue,values = {},\\n\\tfield = operator.operand || \\\"title\\\";\\n\\tif(operator.suffix === \\\"value\\\" && field === \\\"title\\\") {\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tif(!$tw.utils.hop(values,title)) {\\n\\t\\t\\t\\tvalues[title] = true;\\n\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t}\\n\\t\\t});\\n\\t} else if(operator.suffix !== \\\"list-item\\\") {\\n\\t\\tif(field === \\\"title\\\") {\\n\\t\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\t\\tif(tiddler && !$tw.utils.hop(values,title)) {\\n\\t\\t\\t\\t\\tvalues[title] = true;\\n\\t\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t\\t}\\n\\t\\t\\t});\\n\\t\\t} else {\\n\\t\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\t\\tif(tiddler) {\\n\\t\\t\\t\\t\\tvalue = tiddler.getFieldString(field);\\n\\t\\t\\t\\t\\tif(!$tw.utils.hop(values,value)) {\\n\\t\\t\\t\\t\\t\\tvalues[value] = true;\\n\\t\\t\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t});\\n\\t\\t}\\n\\t} else {\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tif(tiddler) {\\n\\t\\t\\t\\t$tw.utils.each(\\n\\t\\t\\t\\t\\toptions.wiki.getTiddlerList(title,field),\\n\\t\\t\\t\\t\\tfunction(value) {\\n\\t\\t\\t\\t\\t\\tif(!$tw.utils.hop(values,value)) {\\n\\t\\t\\t\\t\\t\\t\\tvalues[value] = true;\\n\\t\\t\\t\\t\\t\\t\\tresults.push(value);\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t);\\n\\t\\t\\t}\\n\\t\\t});\\n\\t}\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/eachday.js\":{\"title\":\"$:/core/modules/filters/eachday.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/eachday.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator that selects one tiddler for each unique day covered by the specified date field\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.eachday = function(source,operator,options) {\\n\\tvar results = [],\\n\\t\\tvalues = [],\\n\\t\\tfieldName = operator.operand || \\\"modified\\\";\\n\\t// Function to convert a date/time to a date integer\\n\\tvar toDate = function(value) {\\n\\t\\tvalue = (new Date(value)).setHours(0,0,0,0);\\n\\t\\treturn value+0;\\n\\t};\\n\\tsource(function(tiddler,title) {\\n\\t\\tif(tiddler && tiddler.fields[fieldName]) {\\n\\t\\t\\tvar value = toDate($tw.utils.parseDate(tiddler.fields[fieldName]));\\n\\t\\t\\tif(values.indexOf(value) === -1) {\\n\\t\\t\\t\\tvalues.push(value);\\n\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t});\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/editiondescription.js\":{\"title\":\"$:/core/modules/filters/editiondescription.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/editiondescription.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator for returning the descriptions of the specified edition names\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.editiondescription = function(source,operator,options) {\\n\\tvar results = [];\\n\\tif($tw.node) {\\n\\t\\tvar editionInfo = $tw.utils.getEditionInfo();\\n\\t\\tif(editionInfo) {\\n\\t\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\t\\tif($tw.utils.hop(editionInfo,title)) {\\n\\t\\t\\t\\t\\tresults.push(editionInfo[title].description || \\\"\\\");\\n\\t\\t\\t\\t}\\n\\t\\t\\t});\\n\\t\\t}\\n\\t}\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/editions.js\":{\"title\":\"$:/core/modules/filters/editions.js\",\"text\":\"/*\\\\\\ntitle: $
2731:/core/modules/filters/editions.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator for returning the names of the available editions in this wiki\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.editions = function(source,operator,options) {\\n\\tvar results = [];\\n\\tif($tw.node) {\\n\\t\\tvar editionInfo = $tw.utils.getEditionInfo();\\n\\t\\tif(editionInfo) {\\n\\t\\t\\t$tw.utils.each(editionInfo,function(info,name) {\\n\\t\\t\\t\\tresults.push(name);\\n\\t\\t\\t});\\n\\t\\t}\\n\\t\\tresults.sort();\\n\\t}\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/else.js\":{\"title\":\"$:/core/modules/filters/else.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/else.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator for replacing an empty input list with a constant, passing a non-empty input list straight through\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.else = function(source,operator,options) {\\n\\tvar results = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tresults.push(title);\\n\\t});\\n\\tif(results.length === 0) {\\n\\t\\treturn [operator.operand];\\n\\t} else {\\n\\t\\treturn results;\\n\\t}\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/decodeuricomponent.js\":{\"title\":\"$:/core/modules/filters/decodeuricomponent.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/decodeuricomponent.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator for applying decodeURIComponent() to each item.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter functions\\n*/\\n\\nexports.decodebase64 = function(source,operator,options) {\\n\\tvar results = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tresults.push($tw.utils.base64Decode(title));\\n\\t});\\n\\treturn results;\\n};\\n\\nexports.encodebase64 = function(source,operator,options) {\\n\\tvar results = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tresults.push($tw.utils.base64Encode(title));\\n\\t});\\n\\treturn results;\\n};\\n\\nexports.decodeuricomponent = function(source,operator,options) {\\n\\tvar results = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tresults.push($tw.utils.decodeURIComponentSafe(title));\\n\\t});\\n\\treturn results;\\n};\\n\\nexports.encodeuricomponent = function(source,operator,options) {\\n\\tvar results = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tresults.push($tw.utils.encodeURIComponentExtended(title));\\n\\t});\\n\\treturn results;\\n};\\n\\nexports.decodeuri = function(source,operator,options) {\\n\\tvar results = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tresults.push($tw.utils.decodeURISafe(title));\\n\\t});\\n\\treturn results;\\n};\\n\\nexports.encodeuri = function(source,operator,options) {\\n\\tvar results = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tresults.push(encodeURI(title));\\n\\t});\\n\\treturn results;\\n};\\n\\nexports.decodehtml = function(source,operator,options) {\\n\\tvar results = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tresults.push($tw.utils.htmlDecode(title));\\n\\t});\\n\\treturn results;\\n};\\n\\nexports.encodehtml = function(source,operator,options) {\\n\\tvar results = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tresults.push($tw.utils.htmlEncode(title));\\n\\t});\\n\\treturn results;\\n};\\n\\nexports.stringify = function(source,operator,options) {\\n\\tvar results = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tresults.push($tw.utils.stringify(title,(operator.suffix === \\\"rawunicode\\\")));\\n\\t});\\n\\treturn results;\\n};\\n\\nexports.jsonstringify = function(source,operator,options) {\\n\\tvar results = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tresults.push($tw.utils.jsonStringify(title,(operator.suffix === \\\"rawunicode\\\")));\\n\\t});\\n\\treturn results;\\n};\\n\\nexports.escaperegexp = function(source,operator,options) {\\n\\tvar results = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tresults.push($tw.utils.escapeRegExp(title));\\n\\t});\\n\\treturn results;\\n};\\n\\nexports.escapecss = function(source,operator,options) {\\n\\tvar results = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\t// escape any character with a special meaning in CSS using CSS.escape()\\n\\t\\tresults.push($tw.utils.escapeCSS(title));\\n\\t});\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/enlist.js\":{\"title\":\"$:/core/modules/filters/enlist.js\",\"text\":\"/*\\\\\\ntitle: $
2731:/core/modules/filters/enlist.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator returning its operand parsed as a list\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.enlist = function(source,operator,options) {\\n\\tvar allowDuplicates = false;\\n\\tswitch(operator.suffix) {\\n\\t\\tcase \\\"raw\\\":\\n\\t\\t\\tallowDuplicates = true;\\n\\t\\t\\tbreak;\\n\\t\\tcase \\\"dedupe\\\":\\n\\t\\t\\tallowDuplicates = false;\\n\\t\\t\\tbreak;\\n\\t}\\n\\tvar list = $tw.utils.parseStringArray(operator.operand,allowDuplicates);\\n\\tif(operator.prefix === \\\"!\\\") {\\n\\t\\tvar results = [];\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tif(list.indexOf(title) === -1) {\\n\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t}\\n\\t\\t});\\n\\t\\treturn results;\\n\\t} else {\\n\\t\\treturn list;\\n\\t}\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/field.js\":{\"title\":\"$:/core/modules/filters/field.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/field.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator for comparing fields for equality\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.field = function(source,operator,options) {\\n\\tvar results = [],indexedResults,\\n\\t\\tfieldname = operator.suffix || operator.operator || \\\"title\\\";\\n\\tif(operator.prefix === \\\"!\\\") {\\n\\t\\tif(operator.regexp) {\\n\\t\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\t\\tif(tiddler) {\\n\\t\\t\\t\\t\\tvar text = tiddler.getFieldString(fieldname);\\n\\t\\t\\t\\t\\tif(text !== null && !operator.regexp.exec(text)) {\\n\\t\\t\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t\\t}\\n\\t\\t\\t});\\n\\t\\t} else {\\n\\t\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\t\\tif(tiddler) {\\n\\t\\t\\t\\t\\tvar text = tiddler.getFieldString(fieldname);\\n\\t\\t\\t\\t\\tif(text !== null && text !== operator.operand) {\\n\\t\\t\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t\\t}\\n\\t\\t\\t});\\n\\t\\t}\\n\\t} else {\\n\\t\\tif(operator.regexp) {\\n\\t\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\t\\tif(tiddler) {\\n\\t\\t\\t\\t\\tvar text = tiddler.getFieldString(fieldname);\\n\\t\\t\\t\\t\\tif(text !== null && !!operator.regexp.exec(text)) {\\n\\t\\t\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t});\\n\\t\\t} else {\\n\\t\\t\\tif(source.byField && operator.operand) {\\n\\t\\t\\t\\tindexedResults = source.byField(fieldname,operator.operand);\\n\\t\\t\\t\\tif(indexedResults) {\\n\\t\\t\\t\\t\\treturn indexedResults\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\t\\tif(tiddler) {\\n\\t\\t\\t\\t\\tvar text = tiddler.getFieldString(fieldname);\\n\\t\\t\\t\\t\\tif(text !== null && text === operator.operand) {\\n\\t\\t\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t});\\n\\t\\t}\\n\\t}\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/fields.js\":{\"title\":\"$:/core/modules/filters/fields.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/fields.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator for returning the names of the fields on the selected tiddlers\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.fields = function(source,operator,options) {\\n\\tvar results = [],\\n\\t\\tfieldName,\\n\\t\\tsuffixes = (operator.suffixes || [])[0] || [],\\n\\t\\toperand = $tw.utils.parseStringArray(operator.operand);\\n\\n\\tsource(function(tiddler,title) {\\n\\t\\tif(tiddler) {\\n\\t\\t\\tif(suffixes.indexOf(\\\"include\\\") !== -1) {\\n\\t\\t\\t\\tfor(fieldName in tiddler.fields) {\\n\\t\\t\\t\\t\\t(operand.indexOf(fieldName) !== -1) ? $tw.utils.pushTop(results,fieldName) : \\\"\\\";\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else if (suffixes.indexOf(\\\"exclude\\\") !== -1) {\\n\\t\\t\\t\\tfor(fieldName in tiddler.fields) {\\n\\t\\t\\t\\t\\t(operand.indexOf(fieldName) !== -1) ? \\\"\\\" : $tw.utils.pushTop(results,fieldName);\\n\\t\\t\\t\\t}\\n\\t\\t\\t} // else if\\n\\t\\t\\telse {\\n\\t\\t\\t\\tfor(fieldName in tiddler.fields) {\\n\\t\\t\\t\\t\\t$t
2731w.utils.pushTop(results,fieldName);\\n\\t\\t\\t\\t}\\n\\t\\t\\t} // else\\n\\t\\t} // if (tiddler)\\n\\t});\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/filter.js\":{\"title\":\"$:/core/modules/filters/filter.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/filter.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator returning those input titles that pass a subfilter\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.filter = function(source,operator,options) {\\n\\tvar filterFn = options.wiki.compileFilter(operator.operand),\\n\\t\\tresults = [],\\n\\t\\ttarget = operator.prefix !== \\\"!\\\";\\n\\tsource(function(tiddler,title) {\\n\\t\\tvar list = filterFn.call(options.wiki,options.wiki.makeTiddlerIterator([title]),options.widget.makeFakeWidgetWithVariables({\\n\\t\\t\\t\\\"currentTiddler\\\": \\\"\\\" + title,\\n\\t\\t\\t\\\"..currentTiddler\\\": options.widget.getVariable(\\\"currentTiddler\\\",\\\"\\\")\\n\\t\\t}));\\n\\t\\tif((list.length > 0) === target) {\\n\\t\\t\\tresults.push(title);\\n\\t\\t}\\n\\t});\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/format/date.js\":{\"title\":\"$:/core/modules/filters/format/date.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/format/date.js\\ntype: application/javascript\\nmodule-type: formatfilteroperator\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.date = function(source,operand,options) {\\n\\tvar results = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tvar value = $tw.utils.parseDate(title);\\n\\t\\tif(value && $tw.utils.isDate(value) && value.toString() !== \\\"Invalid Date\\\") {\\n\\t\\t\\tresults.push($tw.utils.formatDateString(value,operand || \\\"YYYY MM DD 0hh:0mm\\\"));\\n\\t\\t}\\n\\t});\\n\\treturn results;\\n};\\n\\n})();\",\"type\":\"application/javascript\",\"module-type\":\"formatfilteroperator\"},\"$:/core/modules/filters/format/json.js\":{\"title\":\"$:/core/modules/filters/format/json.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/format/json.js\\ntype: application/javascript\\nmodule-type: formatfilteroperator\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.json = function(source,operand,options) {\\n\\tvar results = [],\\n\\t\\tspaces = null;\\n\\tif(operand) {\\n\\t\\tspaces = /^\\\\d+$/.test(operand) ? parseInt(operand,10) : operand;\\n\\t}\\n\\tsource(function(tiddler,title) {\\n\\t\\tvar data = $tw.utils.parseJSONSafe(title);\\n\\t\\ttry {\\n\\t\\t\\tdata = JSON.parse(title);\\n\\t\\t} catch(e) {\\n\\t\\t\\tdata = undefined;\\n\\t\\t}\\n\\t\\tif(data !== undefined) {\\n\\t\\t\\tresults.push(JSON.stringify(data,null,spaces));\\n\\t\\t}\\n\\t});\\n\\treturn results;\\n};\\n\\n})();\",\"type\":\"application/javascript\",\"module-type\":\"formatfilteroperator\"},\"$:/core/modules/filters/format/relativedate.js\":{\"title\":\"$:/core/modules/filters/format/relativedate.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/format/relativedate.js\\ntype: application/javascript\\nmodule-type: formatfilteroperator\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.relativedate = function(source,operand,options) {\\n\\tvar results = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tvar value = $tw.utils.parseDate(title);\\n\\t\\tif(value && $tw.utils.isDate(value) && value.toString() !== \\\"Invalid Date\\\") {\\n\\t\\t\\tresults.push($tw.utils.getRelativeDate((new Date()) - (new Date(value))).description);\\n\\t\\t}\\n\\t});\\n\\treturn results;\\n};\\n\\n})();\",\"type\":\"application/javascript\",\"module-type\":\"formatfilteroperator\"},\"$:/core/modules/filters/format/timestamp.js\":{\"title\":\"$:/core/modules/filters/format/timestamp.js\",\"text\":\"/*\\\\\\ntitle: $
2731:/core/modules/filters/format/timestamp.js\\ntype: application/javascript\\nmodule-type: formatfilteroperator\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.timestamp = function(source,operand,options) {\\n\\tvar results = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tif (title.match(/^-?\\\\d+$/)) {\\n\\t\\t\\tvar value = new Date(Number(title));\\n\\t\\t\\tresults.push($tw.utils.formatDateString(value,operand || \\\"[UTC]YYYY0MM0DD0hh0mm0ss0XXX\\\"));\\n\\t\\t}\\n\\t});\\n\\treturn results;\\n};\\n})();\",\"type\":\"application/javascript\",\"module-type\":\"formatfilteroperator\"},\"$:/core/modules/filters/format/titlelist.js\":{\"title\":\"$:/core/modules/filters/format/titlelist.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/format/titlelist.js\\ntype: application/javascript\\nmodule-type: formatfilteroperator\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.titlelist = function(source,operand,options) {\\n\\tvar results = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tif(title && title.length) {\\n\\t\\t\\tresults.push($tw.utils.stringifyList([title]));\\n\\t\\t}\\n\\t});\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"formatfilteroperator\"},\"$:/core/modules/filters/format.js\":{\"title\":\"$:/core/modules/filters/format.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/format.js\\ntype: application/javascript\\nmodule-type: filteroperator\\nFilter operator for formatting strings\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar formatFilterOperators;\\n\\nfunction getFormatFilterOperators() {\\n\\tif(!formatFilterOperators) {\\n\\t\\tformatFilterOperators = {};\\n\\t\\t$tw.modules.applyMethods(\\\"formatfilteroperator\\\",formatFilterOperators);\\n\\t}\\n\\treturn formatFilterOperators;\\n}\\n\\n/*\\nExport our filter function\\n*/\\nexports.format = function(source,operator,options) {\\n\\t// Dispatch to the correct formatfilteroperator\\n\\tvar formatFilterOperators = getFormatFilterOperators();\\n\\tif(operator.suffix) {\\n\\t\\tvar formatFilterOperator = formatFilterOperators[operator.suffix];\\n\\t\\tif(formatFilterOperator) {\\n\\t\\t\\treturn formatFilterOperator(source,operator.operand,options);\\n\\t\\t} else {\\n\\t\\t\\treturn [$tw.language.getString(\\\"Error/FormatFilterOperator\\\")];\\n\\t\\t}\\n\\t} else {\\n\\t\\t// Return all unchanged if the suffix is missing\\n\\t\\tvar results = [];\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tresults.push(title);\\n\\t\\t});\\n\\t\\treturn results;\\n\\t}\\n};\\n\\n})();\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/function.js\":{\"title\":\"$:/core/modules/filters/function.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/function.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator returning those input titles that are returned from a function\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.function = function(source,operator,options) {\\n\\tvar functionName = operator.operands[0],\\n\\t\\tparams = [];\\n\\t$tw.utils.each(operator.operands.slice(1),function(param) {\\n\\t\\tparams.push({value: param});\\n\\t});\\n\\tvar variableInfo = options.widget && options.widget.getVariableInfo && options.widget.getVariableInfo(functionName,{params: params, source: source});\\n\\tif(variableInfo && variableInfo.srcVariable && variableInfo.srcVariable.isFunctionDefinition) {\\n\\t\\treturn variableInfo.resultList ? variableInfo.resultList : [variableInfo.text];\\n\\t}\\n\\t// Return the input list if the function wasn't found\\n\\tvar results = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tresults.push(title);\\n\\t});\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/get.js\":{\"title\":\"$:/core/modules/filters/get.js\",\"text\":\"/*\\\\\\ntitle: $
2731:/core/modules/filters/get.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator for replacing tiddler titles by the value of the field specified in the operand.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.get = function(source,operator,options) {\\n\\tvar results = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tif(tiddler) {\\n\\t\\t\\tvar value = tiddler.getFieldString(operator.operand);\\n\\t\\t\\tif(value) {\\n\\t\\t\\t\\tresults.push(value);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t});\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/getindex.js\":{\"title\":\"$:/core/modules/filters/getindex.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/getindex.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nreturns the value at a given index of datatiddlers\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.getindex = function(source,operator,options) {\\n\\tvar data,title,results = [];\\n\\tif(operator.operand){\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\ttitle = tiddler ? tiddler.fields.title : title;\\n\\t\\t\\tdata = options.wiki.extractTiddlerDataItem(tiddler,operator.operand);\\n\\t\\t\\tif(data) {\\n\\t\\t\\t\\tresults.push(data);\\n\\t\\t\\t}\\n\\t\\t});\\n\\t}\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/getvariable.js\":{\"title\":\"$:/core/modules/filters/getvariable.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/getvariable.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator for replacing input values by the value of the variable with the same name, or blank if the variable is missing\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.getvariable = function(source,operator,options) {\\n\\tvar results = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tresults.push(options.widget.getVariable(title) || \\\"\\\");\\n\\t});\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/has.js\":{\"title\":\"$:/core/modules/filters/has.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/has.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator for checking if a tiddler has the specified field or index\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.has = function(source,operator,options) {\\n\\tvar results = [],\\n\\t\\tinvert = operator.prefix === \\\"!\\\";\\n\\n\\tif(operator.suffix === \\\"field\\\") {\\n\\t\\tif(invert) {\\n\\t\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\t\\tif(!tiddler || (tiddler && (!$tw.utils.hop(tiddler.fields,operator.operand)))) {\\n\\t\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t\\t}\\n\\t\\t\\t});\\n\\t\\t} else {\\n\\t\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\t\\tif(tiddler && $tw.utils.hop(tiddler.fields,operator.operand)) {\\n\\t\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t\\t}\\n\\t\\t\\t});\\n\\t\\t}\\n\\t}\\n\\telse if(operator.suffix === \\\"index\\\") {\\n\\t\\tif(invert) {\\n\\t\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\t\\tif(!tiddler || (tiddler && (!$tw.utils.hop(options.wiki.getTiddlerDataCached(tiddler,Object.create(null)),operator.operand)))) {\\n\\t\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t\\t}\\n\\t\\t\\t});\\n\\t\\t} else {\\n\\t\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\t\\tif(tiddler && $tw.utils.hop(options.wiki.getTiddlerDataCached(tiddler,Object.create(null)),operator.operand)) {\\n\\t\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t\\t}\\n\\t\\t\\t});\\n\\t\\t}\\n\\t}\\n\\telse {\\n\\t\\tif(invert) {\\n\\t\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\t\\tif(!tiddler || !$tw.utils.hop(tiddler.fields,operator.operand) || (tiddler.fields[operator.operand].length === 0)) {\\n\\t\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t\\t}\\n\\t\\t\\t});\\n\\t\\t} else {\\n\\t\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\t\\tif(tiddler && $tw.utils.hop(tiddler.fields,operator.operand) && (tiddler.fields[operator.operand].length !== 0)) {\\n\\t\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t\\t}\\n\\t\\t\\t});\\n\\t\\t}\\n\\t}\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/haschanged.js\":{\"title\":\"$:/core/modules/filters/haschanged.js\",\"text\":\"/*\\\\\\ntitle: $
2731:/core/modules/filters/haschanged.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator returns tiddlers from the list that have a non-zero changecount.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.haschanged = function(source,operator,options) {\\n\\tvar results = [];\\n\\tif(operator.prefix === \\\"!\\\") {\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tif(options.wiki.getChangeCount(title) === 0) {\\n\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t}\\n\\t\\t});\\n\\t} else {\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tif(options.wiki.getChangeCount(title) > 0) {\\n\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t}\\n\\t\\t});\\n\\t}\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/indexes.js\":{\"title\":\"$:/core/modules/filters/indexes.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/indexes.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator for returning the indexes of a data tiddler\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.indexes = function(source,operator,options) {\\n\\tvar results = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tvar data = options.wiki.getTiddlerDataCached(title);\\n\\t\\tif(data) {\\n\\t\\t\\t$tw.utils.pushTop(results,Object.keys(data));\\n\\t\\t}\\n\\t});\\n\\tresults.sort();\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/insertafter.js\":{\"title\":\"$:/core/modules/filters/insertafter.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/insertafter.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nInsert an item after another item in a list\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nOrder a list\\n*/\\nexports.insertafter = function(source,operator,options) {\\n\\tvar results = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tresults.push(title);\\n\\t});\\n\\tvar target = operator.operands[1] || (options.widget && options.widget.getVariable(operator.suffix || \\\"currentTiddler\\\"));\\n\\tif(target !== operator.operand) {\\n\\t\\t// Remove the entry from the list if it is present\\n\\t\\tvar pos = results.indexOf(operator.operand);\\n\\t\\tif(pos !== -1) {\\n\\t\\t\\tresults.splice(pos,1);\\n\\t\\t}\\n\\t\\t// Insert the entry after the target marker\\n\\t\\tpos = results.indexOf(target);\\n\\t\\tif(pos !== -1) {\\n\\t\\t\\tresults.splice(pos+1,0,operator.operand);\\n\\t\\t} else {\\n\\t\\t\\tvar suffix = operator.operands.length > 1 ? operator.suffix : \\\"\\\";\\n\\t\\t\\tif(suffix === \\\"start\\\") {\\n\\t\\t\\t\\tresults.splice(0,0,operator.operand);\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tresults.push(operator.operand);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/insertbefore.js\":{\"title\":\"$:/core/modules/filters/insertbefore.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/insertbefore.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nInsert an item before another item in a list\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nOrder a list\\n*/\\nexports.insertbefore = function(source,operator,options) {\\n\\tvar results = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tresults.push(title);\\n\\t});\\n\\tvar target = operator.operands[1] || (options.widget && options.widget.getVariable(operator.suffix || \\\"currentTiddler\\\"));\\n\\tif(target !== operator.operand) {\\n\\t\\t// Remove the entry from the list if it is present\\n\\t\\tvar pos = results.indexOf(operator.operand);\\n\\t\\tif(pos !== -1) {\\n\\t\\t\\tresults.splice(pos,1);\\n\\t\\t}\\n\\t\\t// Insert the entry before the target marker\\n\\t\\tpos = results.indexOf(target);\\n\\t\\tif(pos !== -1) {\\n\\t\\t\\tresults.splice(pos,0,operator.operand);\\n\\t\\t} else {\\n\\t\\t\\tvar suffix = operator.operands.length > 1 ? operator.suffix : \\\"\\\";\\n\\t\\t\\tif(suffix == \\\"start\\\") {\\n\\t\\t\\t\\tresults.splice(0,0,operator.operand);\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tresults.push(operator.operand);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/is/binary.js\":{\"title\":\"$:/core/modules/filters/is/binary.js\",\"text\":\"/*\\\\\\ntitle: $
2731:/core/modules/filters/is/binary.js\\ntype: application/javascript\\nmodule-type: isfilteroperator\\n\\nFilter function for [is[binary]]\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.binary = function(source,prefix,options) {\\n\\tvar results = [];\\n\\tif(prefix === \\\"!\\\") {\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tif(!options.wiki.isBinaryTiddler(title)) {\\n\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t}\\n\\t\\t});\\n\\t} else {\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tif(options.wiki.isBinaryTiddler(title)) {\\n\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t}\\n\\t\\t});\\n\\t}\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"isfilteroperator\"},\"$:/core/modules/filters/is/blank.js\":{\"title\":\"$:/core/modules/filters/is/blank.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/is/blank.js\\ntype: application/javascript\\nmodule-type: isfilteroperator\\n\\nFilter function for [is[blank]]\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.blank = function(source,prefix,options) {\\n\\tvar results = [];\\n\\tif(prefix === \\\"!\\\") {\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tif(title) {\\n\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t}\\n\\t\\t});\\n\\t} else {\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tif(!title) {\\n\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t}\\n\\t\\t});\\n\\t}\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"isfilteroperator\"},\"$:/core/modules/filters/is/current.js\":{\"title\":\"$:/core/modules/filters/is/current.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/is/current.js\\ntype: application/javascript\\nmodule-type: isfilteroperator\\n\\nFilter function for [is[current]]\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.current = function(source,prefix,options) {\\n\\tvar results = [],\\n\\t\\tcurrTiddlerTitle = options.widget && options.widget.getVariable(\\\"currentTiddler\\\");\\n\\tif(prefix === \\\"!\\\") {\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tif(title !== currTiddlerTitle) {\\n\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t}\\n\\t\\t});\\n\\t} else {\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tif(title === currTiddlerTitle) {\\n\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t}\\n\\t\\t});\\n\\t}\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"isfilteroperator\"},\"$:/core/modules/filters/is/draft.js\":{\"title\":\"$:/core/modules/filters/is/draft.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/is/draft.js\\ntype: application/javascript\\nmodule-type: isfilteroperator\\n\\nFilter function for [is[draft]] analagous to [has[draft.of]]\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.draft = function(source,prefix,options) {\\n\\tvar results = [];\\n\\tif(prefix === \\\"!\\\") {\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tif(!tiddler || !tiddler.isDraft()) {\\n\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t}\\n\\t\\t});\\n\\t} else {\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tif(tiddler && tiddler.isDraft()) {\\n\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t}\\n\\t\\t});\\n\\t}\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"isfilteroperator\"},\"$:/core/modules/filters/is/image.js\":{\"title\":\"$:/core/modules/filters/is/image.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/is/image.js\\ntype: application/javascript\\nmodule-type: isfilteroperator\\n\\nFilter function for [is[image]]\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.image = function(source,prefix,options) {\\n\\tvar results = [];
2731\\n\\tif(prefix === \\\"!\\\") {\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tif(!options.wiki.isImageTiddler(title)) {\\n\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t}\\n\\t\\t});\\n\\t} else {\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tif(options.wiki.isImageTiddler(title)) {\\n\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t}\\n\\t\\t});\\n\\t}\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"isfilteroperator\"},\"$:/core/modules/filters/is/missing.js\":{\"title\":\"$:/core/modules/filters/is/missing.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/is/missing.js\\ntype: application/javascript\\nmodule-type: isfilteroperator\\n\\nFilter function for [is[missing]]\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.missing = function(source,prefix,options) {\\n\\tvar results = [];\\n\\tif(prefix === \\\"!\\\") {\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tif(options.wiki.tiddlerExists(title)) {\\n\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t}\\n\\t\\t});\\n\\t} else {\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tif(!options.wiki.tiddlerExists(title)) {\\n\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t}\\n\\t\\t});\\n\\t}\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"isfilteroperator\"},\"$:/core/modules/filters/is/orphan.js\":{\"title\":\"$:/core/modules/filters/is/orphan.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/is/orphan.js\\ntype: application/javascript\\nmodule-type: isfilteroperator\\n\\nFilter function for [is[orphan]]\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.orphan = function(source,prefix,options) {\\n\\tvar results = [],\\n\\t\\torphanTitles = options.wiki.getOrphanTitles();\\n\\tif(prefix === \\\"!\\\") {\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tif(orphanTitles.indexOf(title) === -1) {\\n\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t}\\n\\t\\t});\\n\\t} else {\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tif(orphanTitles.indexOf(title) !== -1) {\\n\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t}\\n\\t\\t});\\n\\t}\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"isfilteroperator\"},\"$:/core/modules/filters/is/shadow.js\":{\"title\":\"$:/core/modules/filters/is/shadow.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/is/shadow.js\\ntype: application/javascript\\nmodule-type: isfilteroperator\\n\\nFilter function for [is[shadow]]\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.shadow = function(source,prefix,options) {\\n\\tvar results = [];\\n\\tif(prefix === \\\"!\\\") {\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tif(!options.wiki.isShadowTiddler(title)) {\\n\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t}\\n\\t\\t});\\n\\t} else {\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tif(options.wiki.isShadowTiddler(title)) {\\n\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t}\\n\\t\\t});\\n\\t}\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"isfilteroperator\"},\"$:/core/modules/filters/is/system.js\":{\"title\":\"$:/core/modules/filters/is/system.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/is/system.js\\ntype: application/javascript\\nmodule-type: isfilteroperator\\n\\nFilter function for [is[system]]\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.system = function(source,prefix,options) {\\n\\tvar results = [];\\n\\tif(prefix === \\\"!\\\") {\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tif(!options.wiki.isSystemTiddler(title)) {\\n\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t}\\n\\t\\t});\\n\\t}
2731 else {\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tif(options.wiki.isSystemTiddler(title)) {\\n\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t}\\n\\t\\t});\\n\\t}\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"isfilteroperator\"},\"$:/core/modules/filters/is/tag.js\":{\"title\":\"$:/core/modules/filters/is/tag.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/is/tag.js\\ntype: application/javascript\\nmodule-type: isfilteroperator\\n\\nFilter function for [is[tag]]\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.tag = function(source,prefix,options) {\\n\\tvar results = [],\\n\\t\\ttagMap = options.wiki.getTagMap();\\n\\tif(prefix === \\\"!\\\") {\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tif(!$tw.utils.hop(tagMap,title)) {\\n\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t}\\n\\t\\t});\\n\\t} else {\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tif($tw.utils.hop(tagMap,title)) {\\n\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t}\\n\\t\\t});\\n\\t}\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"isfilteroperator\"},\"$:/core/modules/filters/is/tiddler.js\":{\"title\":\"$:/core/modules/filters/is/tiddler.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/is/tiddler.js\\ntype: application/javascript\\nmodule-type: isfilteroperator\\n\\nFilter function for [is[tiddler]]\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.tiddler = function(source,prefix,options) {\\n\\tvar results = [];\\n\\tif(prefix === \\\"!\\\") {\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tif(!options.wiki.tiddlerExists(title)) {\\n\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t}\\n\\t\\t});\\n\\t} else {\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tif(options.wiki.tiddlerExists(title)) {\\n\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t}\\n\\t\\t});\\n\\t}\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"isfilteroperator\"},\"$:/core/modules/filters/is/variable.js\":{\"title\":\"$:/core/modules/filters/is/variable.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/is/variable.js\\ntype: application/javascript\\nmodule-type: isfilteroperator\\n\\nFilter function for [is[variable]]\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.variable = function(source,prefix,options) {\\n\\tvar results = [];\\n\\tif(prefix === \\\"!\\\") {\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tif(options.widget.getVariable(title) === undefined) {\\n\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t}\\n\\t\\t});\\n\\t} else {\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tif(options.widget.getVariable(title) !== undefined) {\\n\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t}\\n\\t\\t});\\n\\t}\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"isfilteroperator\"},\"$:/core/modules/filters/is.js\":{\"title\":\"$:/core/modules/filters/is.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/is.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator for checking tiddler properties\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar isFilterOperators;\\n\\nfunction getIsFilterOperators() {\\n\\tif(!isFilterOperators) {\\n\\t\\tisFilterOperators = {};\\n\\t\\t$tw.modules.applyMethods(\\\"isfilteroperator\\\",isFilterOperators);\\n\\t}\\n\\treturn isFilterOperators;\\n}\\n\\n/*\\nExport our filter function\\n*/\\nexports.is = function(source,operator,options) {\\n\\t// Dispatch to the correct isfilteroperator\\n\\tvar isFilterOperators = getIsFilterOperators();\\n\\tif(operator.operand) {\\n\\t\\tvar isFilterOperator = isFilterOperators[operator.operand];\\n\\t\\tif(isFilterOperator) {\\n\\t\\t\\treturn isFilterOperator(source,operator.prefix,options);\\n\\t\\t}
2731 else {\\n\\t\\t\\treturn [$tw.language.getString(\\\"Error/IsFilterOperator\\\")];\\n\\t\\t}\\n\\t} else {\\n\\t\\t// Return all tiddlers if the operand is missing\\n\\t\\tvar results = [];\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tresults.push(title);\\n\\t\\t});\\n\\t\\treturn results;\\n\\t}\\n};\\n\\n})();\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/json-ops.js\":{\"title\":\"$:/core/modules/filters/json-ops.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/json-ops.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operators for JSON operations\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports[\\\"jsonget\\\"] = function(source,operator,options) {\\n\\tvar results = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tvar data = $tw.utils.parseJSONSafe(title,title);\\n\\t\\tif(data) {\\n\\t\\t\\tvar items = getDataItemValueAsStrings(data,operator.operands);\\n\\t\\t\\tif(items !== undefined) {\\n\\t\\t\\t\\tresults.push.apply(results,items);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t});\\n\\treturn results;\\n};\\n\\nexports[\\\"jsonextract\\\"] = function(source,operator,options) {\\n\\tvar results = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tvar data = $tw.utils.parseJSONSafe(title,title);\\n\\t\\tif(data) {\\n\\t\\t\\tvar item = getDataItem(data,operator.operands);\\n\\t\\t\\tif(item !== undefined) {\\n\\t\\t\\t\\tresults.push(JSON.stringify(item));\\n\\t\\t\\t}\\n\\t\\t}\\n\\t});\\n\\treturn results;\\n};\\n\\nexports[\\\"jsonindexes\\\"] = function(source,operator,options) {\\n\\tvar results = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tvar data = $tw.utils.parseJSONSafe(title,title);\\n\\t\\tif(data) {\\n\\t\\t\\tvar items = getDataItemKeysAsStrings(data,operator.operands);\\n\\t\\t\\tif(items !== undefined) {\\n\\t\\t\\t\\tresults.push.apply(results,items);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t});\\n\\treturn results;\\n};\\n\\nexports[\\\"jsontype\\\"] = function(source,operator,options) {\\n\\tvar results = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tvar data = $tw.utils.parseJSONSafe(title,title);\\n\\t\\tif(data) {\\n\\t\\t\\tvar item = getDataItemType(data,operator.operands);\\n\\t\\t\\tif(item !== undefined) {\\n\\t\\t\\t\\tresults.push(item);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t});\\n\\treturn results;\\n};\\n\\n/*\\nGiven a JSON data structure and an array of index strings, return an array of the string representation of the values at the end of the index chain, or \\\"undefined\\\" if any of the index strings are invalid\\n*/\\nfunction getDataItemValueAsStrings(data,indexes) {\\n\\t// Get the item\\n\\tvar item = getDataItem(data,indexes);\\n\\t// Return the item as a string list\\n\\treturn convertDataItemValueToStrings(item);\\n}\\n\\n/*\\nGiven a JSON data structure and an array of index strings, return an array of the string representation of the keys of the item at the end of the index chain, or \\\"undefined\\\" if any of the index strings are invalid\\n*/\\nfunction getDataItemKeysAsStrings(data,indexes) {\\n\\t// Get the item\\n\\tvar item = getDataItem(data,indexes);\\n\\t// Return the item keys as a string\\n\\treturn convertDataItemKeysToStrings(item);\\n}\\n\\n/*\\nReturn an array of the string representation of the values of a data item, or \\\"undefined\\\" if the item is undefined\\n*/\\nfunction convertDataItemValueToStrings(item) {\\n\\t// Return the item as a string\\n\\tif(item === undefined) {\\n\\t\\treturn undefined;\\n\\t} else if(item === null) {\\n\\t\\treturn [\\\"null\\\"]\\n\\t} else if(typeof item === \\\"object\\\") {\\n\\t\\tvar results = [],i,t;\\n\\t\\tif($tw.utils.isArray(item)) {\\n\\t\\t\\t// Return all the items in arrays recursively\\n\\t\\t\\tfor(i=0; i\u003Citem.length; i++) {\\n\\t\\t\\t\\tt = convertDataItemValueToStrings(item[i])\\n\\t\\t\\t\\tif(t !== undefined) {\\n\\t\\t\\t\\t\\tresults.push.apply(results,t);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\t\\t\\t// Return all the values in objects recursively\\n\\t\\t\\t$t
2731w.utils.each(Object.keys(item).sort(),function(key) {\\n\\t\\t\\t\\tt = convertDataItemValueToStrings(item[key]);\\n\\t\\t\\t\\tif(t !== undefined) {\\n\\t\\t\\t\\t\\tresults.push.apply(results,t);\\n\\t\\t\\t\\t}\\n\\t\\t\\t});\\n\\t\\t}\\n\\t\\treturn results;\\n\\t}\\n\\treturn [item.toString()];\\n}\\n\\n/*\\nReturn an array of the string representation of the keys of a data item, or \\\"undefined\\\" if the item is undefined\\n*/\\nfunction convertDataItemKeysToStrings(item) {\\n\\t// Return the item as a string\\n\\tif(item === undefined) {\\n\\t\\treturn item;\\n\\t} else if(typeof item === \\\"object\\\") {\\n\\t\\tif(item === null) {\\n\\t\\t\\treturn [];\\n\\t\\t}\\n\\t\\tvar results = [];\\n\\t\\tif($tw.utils.isArray(item)) {\\n\\t\\t\\tfor(var i=0; i\u003Citem.length; i++) {\\n\\t\\t\\t\\tresults.push(i.toString());\\n\\t\\t\\t}\\n\\t\\t\\treturn results;\\n\\t\\t} else {\\n\\t\\t\\t$tw.utils.each(Object.keys(item).sort(),function(key) {\\n\\t\\t\\t\\tresults.push(key);\\n\\t\\t\\t});\\n\\t\\t\\treturn results;\\n\\t\\t}\\n\\t}\\n\\treturn [];\\n}\\n\\nfunction getDataItemType(data,indexes) {\\n\\t// Get the item\\n\\tvar item = getDataItem(data,indexes);\\n\\t// Return the item type\\n\\tif(item === undefined) {\\n\\t\\treturn item;\\n\\t} else if(item === null) {\\n\\t\\treturn \\\"null\\\";\\n\\t} else if($tw.utils.isArray(item)) {\\n\\t\\treturn \\\"array\\\";\\n\\t} else if(typeof item === \\\"object\\\") {\\n\\t\\treturn \\\"object\\\";\\n\\t} else {\\n\\t\\treturn typeof item;\\n\\t}\\n}\\n\\n/*\\nGiven a JSON data structure and an array of index strings, return the value at the end of the index chain, or \\\"undefined\\\" if any of the index strings are invalid\\n*/\\nfunction getDataItem(data,indexes) {\\n\\tif(indexes.length === 0 || (indexes.length === 1 && indexes[0] === \\\"\\\")) {\\n\\t\\treturn data;\\n\\t}\\n\\t// Get the item\\n\\tvar item = data;\\n\\tfor(var i=0; i\u003Cindexes.length; i++) {\\n\\t\\tif(item !== undefined) {\\n\\t\\t\\tif(item !== null && [\\\"number\\\",\\\"string\\\",\\\"boolean\\\"].indexOf(typeof item) === -1) {\\n\\t\\t\\t\\titem = item[indexes[i]];\\n\\t\\t\\t} else {\\n\\t\\t\\t\\titem = undefined;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\treturn item;\\n}\\n\\n})();\\n\\t\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/limit.js\":{\"title\":\"$:/core/modules/filters/limit.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/limit.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator for chopping the results to a specified maximum number of entries\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.limit = function(source,operator,options) {\\n\\tvar results = [];\\n\\t// Convert to an array\\n\\tsource(function(tiddler,title) {\\n\\t\\tresults.push(title);\\n\\t});\\n\\t// Slice the array if necessary\\n\\tvar limit = Math.min(results.length,parseInt(operator.operand,10));\\n\\tif(operator.prefix === \\\"!\\\") {\\n\\t\\tresults = results.slice(-limit);\\n\\t} else {\\n\\t\\tresults = results.slice(0,limit);\\n\\t}\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/links.js\":{\"title\":\"$:/core/modules/filters/links.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/links.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator for returning all the links from a tiddler\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.links = function(source,operator,options) {\\n\\tvar results = new $tw.utils.LinkedList();\\n\\tsource(function(tiddler,title) {\\n\\t\\tresults.pushTop(options.wiki.getTiddlerLinks(title));\\n\\t});\\n\\treturn results.makeTiddlerIterator(options.wiki);\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/list.js\":{\"title\":\"$:/core/modules/filters/list.js\",\"text\":\"/*\\\\\\ntitle: $
2731:/core/modules/filters/list.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator returning the tiddlers whose title is listed in the operand tiddler\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.list = function(source,operator,options) {\\n\\tvar results = [],\\n\\t\\ttr = $tw.utils.parseTextReference(operator.operand),\\n\\t\\tcurrTiddlerTitle = options.widget && options.widget.getVariable(\\\"currentTiddler\\\"),\\n\\t\\tlist = options.wiki.getTiddlerList(tr.title || currTiddlerTitle,tr.field,tr.index);\\n\\tif(operator.prefix === \\\"!\\\") {\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tif(list.indexOf(title) === -1) {\\n\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t}\\n\\t\\t});\\n\\t} else {\\n\\t\\tresults = list;\\n\\t}\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/listed.js\":{\"title\":\"$:/core/modules/filters/listed.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/listed.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator returning all tiddlers that have the selected tiddlers in a list\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.listed = function(source,operator,options) {\\n\\tvar field = operator.operand || \\\"list\\\",\\n\\t\\tresults = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\t$tw.utils.pushTop(results,options.wiki.findListingsOfTiddler(title,field));\\n\\t});\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/listops.js\":{\"title\":\"$:/core/modules/filters/listops.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/listops.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operators for manipulating the current selection list\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nOrder a list\\n*/\\nexports.order = function(source,operator,options) {\\n\\tvar results = [];\\n\\tif(operator.operand.toLowerCase() === \\\"reverse\\\") {\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tresults.unshift(title);\\n\\t\\t});\\n\\t} else {\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tresults.push(title);\\n\\t\\t});\\n\\t}\\n\\treturn results;\\n};\\n\\n/*\\nReverse list\\n*/\\nexports.reverse = function(source,operator,options) {\\n\\tvar results = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tresults.unshift(title);\\n\\t});\\n\\treturn results;\\n};\\n\\n/*\\nFirst entry/entries in list\\n*/\\nexports.first = function(source,operator,options) {\\n\\tvar count = $tw.utils.getInt(operator.operand,1),\\n\\t\\tresults = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tresults.push(title);\\n\\t});\\n\\treturn results.slice(0,count);\\n};\\n\\n/*\\nLast entry/entries in list\\n*/\\nexports.last = function(source,operator,options) {\\n\\tvar count = $tw.utils.getInt(operator.operand,1),\\n\\t\\tresults = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tresults.push(title);\\n\\t});\\n\\treturn results.slice(-count);\\n};\\n\\n/*\\nAll but the first entry/entries of the list\\n*/\\nexports.rest = function(source,operator,options) {\\n\\tvar count = $tw.utils.getInt(operator.operand,1),\\n\\t\\tresults = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tresults.push(title);\\n\\t});\\n\\treturn results.slice(count);\\n};\\nexports.butfirst = exports.rest;\\nexports.bf = exports.rest;\\n\\n/*\\nAll but the last entry/entries of the list\\n*/\\nexports.butlast = function(source,operator,options) {\\n\\tvar count = $tw.utils.getInt(operator.operand,1),\\n\\t\\tresults = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tresults.push(title);\\n\\t});\\n\\tvar index = count === 0 ? results.length : -count;\\n\\treturn results.slice(0,index);\\n};\\nexports.bl = exports.butlast;\\n\\n/*\\nThe nth member of the list\\n*/\\nexports.nth = function(source,operator,options) {\\n\\tvar count = $tw.utils.getInt(operator.operand,1),\\n\\t\\tresults = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tresults.push(title);\\n\\t});\\n\\treturn results.slice(count - 1,count);\\n};
2731\\n\\n/*\\nThe zero based nth member of the list\\n*/\\nexports.zth = function(source,operator,options) {\\n\\tvar count = $tw.utils.getInt(operator.operand,0),\\n\\t\\tresults = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tresults.push(title);\\n\\t});\\n\\treturn results.slice(count,count + 1);\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/lookup.js\":{\"title\":\"$:/core/modules/filters/lookup.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/lookup.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator that looks up values via a title prefix\\n\\n[lookup:\u003Cdefaultvalue>:\u003Cfield OR index>[\u003Cprefix>],[\u003Cfield-name OR index-name>]]\\n\\nPrepends the prefix to the selected items and returns the specified \\nfield or index value. If the 2nd suffix does not exist, it defaults to field.\\nIf the second operand is missing it defaults to \\\"text\\\" for fields, and \\\"0\\\" for indexes\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.lookup = function(source,operator,options) {\\n\\tvar results = [],\\n\\t\\tsuffixes = operator.suffixes || [],\\n\\t\\tdefaultSuffix = suffixes[0] ? (suffixes[0][0] || \\\"\\\") : \\\"\\\",\\n\\t\\tindexSuffix = (suffixes[1] && suffixes[1][0] === \\\"index\\\") ? true : false,\\n\\t\\ttarget;\\n\\tif(operator.operands.length == 2) {\\n\\t\\ttarget = operator.operands[1]\\n\\t} else {\\n\\t\\ttarget = indexSuffix ? \\\"0\\\": \\\"text\\\";\\n\\t}\\n\\tif(indexSuffix) {\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tvar data = options.wiki.extractTiddlerDataItem(operator.operands[0]+title,target,defaultSuffix);\\n\\t\\t\\tresults.push(data);\\n\\t\\t});\\n\\t} else {\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tvar value = defaultSuffix;\\n\\t\\t\\tvar targetTiddler = options.wiki.getTiddler(operator.operands[0]+title);\\n\\t\\t\\tif(targetTiddler && targetTiddler.getFieldString(target)) {\\n\\t\\t\\t\\tvalue = targetTiddler.getFieldString(target);\\n\\t\\t\\t}\\n\\t\\t\\tresults.push(value);\\n\\t\\t});\\n\\t}\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/match.js\":{\"title\":\"$:/core/modules/filters/match.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/match.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator for checking if a title matches a string\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.match = function(source,operator,options) {\\n\\tvar results = [],\\n\\t\\tsuffixes = (operator.suffixes || [])[0] || [];\\n\\tif(suffixes.indexOf(\\\"caseinsensitive\\\") !== -1) {\\n\\t\\tif(operator.prefix === \\\"!\\\") {\\n\\t\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\t\\tif(title.toLowerCase() !== (operator.operand || \\\"\\\").toLowerCase()) {\\n\\t\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t\\t}\\n\\t\\t\\t});\\n\\t\\t} else {\\n\\t\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\t\\tif(title.toLowerCase() === (operator.operand || \\\"\\\").toLowerCase()) {\\n\\t\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t\\t}\\n\\t\\t\\t});\\n\\t\\t}\\n\\t} else {\\n\\t\\tif(operator.prefix === \\\"!\\\") {\\n\\t\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\t\\tif(title !== operator.operand) {\\n\\t\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t\\t}\\n\\t\\t\\t});\\n\\t\\t} else {\\n\\t\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\t\\tif(title === operator.operand) {\\n\\t\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t\\t}\\n\\t\\t\\t});\\n\\t\\t}\\n\\t}\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/math.js\":{\"title\":\"$:/core/modules/filters/math.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/math.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operators for math. Unary/binary operators work on each item in turn, and return a new item list.\\n\\nSum/product/maxall/minall operate on the entire list, returning a single item.\\n\\nNote that strings are converted to numbers automatically. Trailing non-digits are ignored.\\n\\n* \\\"\\\" converts to 0\\n* \\\"12kk\\\" converts to 12\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.negate = makeNumericBinaryOperator(\\n\\tfunction(a) {return -a}\\n);\\n\\nexports.abs = makeNumericBinaryOperator(\\n\\tfunction(a) {return Math.abs(a)}\\n);\\n\\nexports.ceil = makeNumericBinaryOperator(\\n\\tfunction(a) {return Math.ceil(a)}\\n);\\n\\nexports.floor = makeNumericBinaryOperator(\\n\\tfunction(a) {return Math.floor(a)}\\n);\\n\\nexports.round = makeNumericBinaryOperator(\\n\\tfunction(a) {return Math.round(a)}\\n);\\n\\nexports.trunc = makeNumericBinaryOperator(\\n\\tfunction(a) {return Math.trunc(a)}\\n);\\n\\nexports.untrunc = makeNumericBinaryOperator(\\n\\tfunction(a) {return Math.ceil(Math.abs(a)
2731) * Math.sign(a)}\\n);\\n\\nexports.sign = makeNumericBinaryOperator(\\n\\tfunction(a) {return Math.sign(a)}\\n);\\n\\nexports.add = makeNumericBinaryOperator(\\n\\tfunction(a,b) {return a + b;}\\n);\\n\\nexports.subtract = makeNumericBinaryOperator(\\n\\tfunction(a,b) {return a - b;}\\n);\\n\\nexports.multiply = makeNumericBinaryOperator(\\n\\tfunction(a,b) {return a * b;}\\n);\\n\\nexports.divide = makeNumericBinaryOperator(\\n\\tfunction(a,b) {return a / b;}\\n);\\n\\nexports.remainder = makeNumericBinaryOperator(\\n\\tfunction(a,b) {return a % b;}\\n);\\n\\nexports.max = makeNumericBinaryOperator(\\n\\tfunction(a,b) {return Math.max(a,b);}\\n);\\n\\nexports.min = makeNumericBinaryOperator(\\n\\tfunction(a,b) {return Math.min(a,b);}\\n);\\n\\nexports.fixed = makeNumericBinaryOperator(\\n\\tfunction(a,b) {return Number.prototype.toFixed.call(a,Math.min(Math.max(b,0),100));}\\n);\\n\\nexports.precision = makeNumericBinaryOperator(\\n\\tfunction(a,b) {return Number.prototype.toPrecision.call(a,Math.min(Math.max(b,1),100));}\\n);\\n\\nexports.exponential = makeNumericBinaryOperator(\\n\\tfunction(a,b) {return Number.prototype.toExponential.call(a,Math.min(Math.max(b,0),100));}\\n);\\n\\nexports.power = makeNumericBinaryOperator(\\n\\tfunction(a,b) {return Math.pow(a,b);}\\n);\\n\\nexports.log = makeNumericBinaryOperator(\\n\\tfunction(a,b) {\\n\\t\\tif(b) {\\n\\t\\t\\treturn Math.log(a)/Math.log(b);\\n\\t\\t} else {\\n\\t\\t\\treturn Math.log(a);\\n\\t\\t}\\n\\t}\\n);\\n\\nexports.sum = makeNumericReducingOperator(\\n\\tfunction(accumulator,value) {return accumulator + value},\\n\\t0 // Initial value\\n);\\n\\nexports.product = makeNumericReducingOperator(\\n\\tfunction(accumulator,value) {return accumulator * value},\\n\\t1 // Initial value\\n);\\n\\nexports.maxall = makeNumericReducingOperator(\\n\\tfunction(accumulator,value) {return Math.max(accumulator,value)},\\n\\t-Infinity // Initial value\\n);\\n\\nexports.minall = makeNumericReducingOperator(\\n\\tfunction(accumulator,value) {return Math.min(accumulator,value)},\\n\\tInfinity // Initial value\\n);\\n\\nexports.median = makeNumericArrayOperator(\\n\\tfunction(values) {\\n\\t\\tvar len = values.length, median;\\n\\t\\tvalues.sort();\\n\\t\\tif(len % 2) { \\n\\t\\t\\t// Odd, return the middle number\\n\\t\\t\\tmedian = values[(len - 1) / 2];\\n\\t\\t} else {\\n\\t\\t\\t// Even, return average of two middle numbers\\n\\t\\t\\tmedian = (values[len / 2 - 1] + values[len / 2]) / 2;\\n\\t\\t}\\n\\t\\treturn [median];\\n\\t}\\n);\\n\\nexports.average = makeNumericReducingOperator(\\n\\tfunction(accumulator,value) {return accumulator + value},\\n\\t0, // Initial value\\n\\tfunction(finalValue,numberOfValues) {\\n\\t\\treturn finalValue/numberOfValues;\\n\\t}\\n);\\n\\nexports.variance = makeNumericReducingOperator(\\n\\tfunction(accumulator,value) {return accumulator + value},\\n\\t0,\\n\\tfunction(finalValue,numberOfValues,originalValues) {\\n\\t\\treturn getVarianceFromArray(originalValues,finalValue/numberOfValues);\\n\\t}\\n);\\n\\nexports[\\\"standard-deviation\\\"] = makeNumericReducingOperator(\\n\\tfunction(accumulator,value) {return accumulator + value},\\n\\t0,\\n\\tfunction(finalValue,numberOfValues,originalValues) {\\n\\t\\tvar variance = getVarianceFromArray(originalValues,finalValue/numberOfValues);\\n\\t\\treturn Math.sqrt(variance);\\n\\t}\\n);\\n\\n//trigonometry\\nexports.cos = makeNumericBinaryOperator(\\n\\tfunction(a) {return Math.cos(a)}\\n);\\n\\nexports.sin = makeNumericBinaryOperator(\\n\\tfunction(a) {return Math.sin(a)}\\n);\\n\\nexports.tan = makeNumericBinaryOperator(\\n\\tfunction(a) {return Math.tan(a)}\\n);\\n\\nexports.acos = makeNumericBinaryOperator(\\n\\tfunction(a) {return Math.acos(a)}\\n);\\n\\nexports.asin = makeNumericBinaryOperator(\\n\\tfunction(a) {return Math.asin(a)}\\n);\\n\\nexports.atan = makeNumericBinaryOperator(\\n\\tfunction(a) {return Math.atan(a)}\\n);\\n\\nexports.atan2 = makeNumericBinaryOperator(\\n\\tfunction(a,b) {return Math.atan2(a,b)}\\n);\\n\\n//Calculate the variance of a population of numbers in an array given its mean\\nfunction getVarianceFromArray(values,mean) {\\n\\tvar deviationTotal = values.reduce(function(accumulator,value) {\\n\\t\\treturn accumulator + Math.pow(value - mean, 2);\\n\\t},0);\\n\\treturn deviationTotal/values.length;\\n};\\n\\nfunction makeNumericBinaryOperator(fnCalc) {\\n\\treturn function(source,operator,options) {\\n\\t\\tvar result = [],\\n\\t\\t\\tnumOperand = $tw.utils.parseNumber(operator.operand);
2731\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tresult.push($tw.utils.stringifyNumber(fnCalc($tw.utils.parseNumber(title),numOperand)));\\n\\t\\t});\\n\\t\\treturn result;\\n\\t};\\n};\\n\\nfunction makeNumericReducingOperator(fnCalc,initialValue,fnFinal) {\\n\\tinitialValue = initialValue || 0;\\n\\treturn function(source,operator,options) {\\n\\t\\tvar result = [];\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tresult.push($tw.utils.parseNumber(title));\\n\\t\\t});\\n\\t\\tvar value = result.reduce(function(accumulator,currentValue) {\\n\\t\\t\\t\\treturn fnCalc(accumulator,currentValue);\\n\\t\\t\\t},initialValue);\\n\\t\\tif(fnFinal) {\\n\\t\\t\\tvalue = fnFinal(value,result.length,result);\\n\\t\\t}\\n\\t\\treturn [$tw.utils.stringifyNumber(value)];\\n\\t};\\n};\\n\\nfunction makeNumericArrayOperator(fnCalc) {\\n\\treturn function(source,operator,options) {\\n\\t\\tvar results = [];\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tresults.push($tw.utils.parseNumber(title));\\n\\t\\t});\\n\\t\\tresults = fnCalc(results);\\n\\t\\t$tw.utils.each(results,function(value,index) {\\n\\t\\t\\tresults[index] = $tw.utils.stringifyNumber(value);\\n\\t\\t});\\n\\t\\treturn results;\\n\\t};\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/minlength.js\":{\"title\":\"$:/core/modules/filters/minlength.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/minlength.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator for filtering out titles that don't meet the minimum length in the operand\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.minlength = function(source,operator,options) {\\n\\tvar results = [],\\n\\t\\tminLength = parseInt(operator.operand || \\\"\\\",10) || 0;\\n\\tsource(function(tiddler,title) {\\n\\t\\tif(title.length >= minLength) {\\n\\t\\t\\tresults.push(title);\\n\\t\\t}\\n\\t});\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/moduleproperty.js\":{\"title\":\"$:/core/modules/filters/moduleproperty.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/moduleproperty.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter [[module-name]moduleproperty[name]] retrieve a module property\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.moduleproperty = function(source,operator,options) {\\n\\tvar results = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tvar value = require(title)[operator.operand || \\\"\\\"];\\n\\t\\tif(value !== undefined) {\\n\\t\\t\\tresults.push(value);\\n\\t\\t}\\n\\t});\\n\\tresults.sort();\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/modules.js\":{\"title\":\"$:/core/modules/filters/modules.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/modules.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator for returning the titles of the modules of a given type in this wiki\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.modules = function(source,operator,options) {\\n\\tvar results = [];\\n\\tif(operator.operands.length >= 2) {\\n\\t\\t// Return the modules that have the module property specified in the first operand with the value in the second operand\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\t$tw.utils.each($tw.modules.types[title],function(moduleInfo,moduleName) {\\n\\t\\t\\t\\tif(require(moduleName)[operator.operands[0]] === operator.operands[1]) {\\n\\t\\t\\t\\t\\tresults.push(moduleName);\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t}\\n\\t\\t\\t});\\n\\t\\t});\\n\\t} else {\\n\\t\\t// Return all the module names without filtering\\n\\t\\t
2731source(function(tiddler,title) {\\n\\t\\t\\t$tw.utils.each($tw.modules.types[title],function(moduleInfo,moduleName) {\\n\\t\\t\\t\\tresults.push(moduleName);\\n\\t\\t\\t});\\n\\t\\t});\\n\\t}\\n\\tresults.sort();\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/moduletypes.js\":{\"title\":\"$:/core/modules/filters/moduletypes.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/moduletypes.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator for returning the names of the module types in this wiki\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.moduletypes = function(source,operator,options) {\\n\\tvar results = [];\\n\\t$tw.utils.each($tw.modules.types,function(moduleInfo,type) {\\n\\t\\tresults.push(type);\\n\\t});\\n\\tresults.sort();\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/next.js\":{\"title\":\"$:/core/modules/filters/next.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/next.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator returning the tiddler whose title occurs next in the list supplied in the operand tiddler\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.next = function(source,operator,options) {\\n\\tvar results = [],\\n\\t\\tlist = options.wiki.getTiddlerList(operator.operand);\\n\\tsource(function(tiddler,title) {\\n\\t\\tvar match = list.indexOf(title);\\n\\t\\t// increment match and then test if result is in range\\n\\t\\tmatch++;\\n\\t\\tif(match > 0 && match \u003C list.length) {\\n\\t\\t\\tresults.push(list[match]);\\n\\t\\t}\\n\\t});\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/plugintiddlers.js\":{\"title\":\"$:/core/modules/filters/plugintiddlers.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/plugintiddlers.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator for returning the titles of the shadow tiddlers within a plugin\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.plugintiddlers = function(source,operator,options) {\\n\\tvar results = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tvar pluginInfo = options.wiki.getPluginInfo(title) || options.wiki.getTiddlerDataCached(title,{tiddlers:[]});\\n\\t\\tif(pluginInfo && pluginInfo.tiddlers) {\\n\\t\\t\\t$tw.utils.each(pluginInfo.tiddlers,function(fields,title) {\\n\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t});\\n\\t\\t}\\n\\t});\\n\\tresults.sort();\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/prefix.js\":{\"title\":\"$:/core/modules/filters/prefix.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/prefix.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator for checking if a title starts with a prefix\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.prefix = function(source,operator,options) {\\n\\tvar results = [],\\n\\t\\tsuffixes = (operator.suffixes || [])[0] || [];\\n\\tif(suffixes.indexOf(\\\"caseinsensitive\\\") !== -1) {\\n\\t\\tvar operand = operator.operand.toLowerCase();\\n\\t\\tif(operator.prefix === \\\"!\\\") {\\n\\t\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\t\\tif(title.toLowerCase().substr(0,operand.length) !== operand) {\\n\\t\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t\\t}\\n\\t\\t\\t});\\n\\t\\t} else {\\n\\t\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\t\\tif(title.toLowerCase().substr(0,operand.length) === operand) {\\n\\t\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t\\t}\\n\\t\\t\\t});\\n\\t\\t}\\n\\t} else {\\n\\t\\tif(operator.prefix === \\\"!\\\") {\\n\\t\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\t\\tif(title.substr(0,operator.operand.length) !== operator.operand) {\\n\\t\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t\\t}\\n\\t\\t\\t});\\n\\t\\t} else {\\n\\t\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\t\\tif(title.substr(0,operator.operand.length) === operator.operand) {\\n\\t\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t\\t}\\n\\t\\t\\t});\\n\\t\\t}\\n\\t}\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/previous.js\":{\"title\":\"$:/core/modules/filters/previous.js\",\"text\":\"/*\\\\\\ntitle: $
2731:/core/modules/filters/previous.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator returning the tiddler whose title occurs immediately prior in the list supplied in the operand tiddler\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.previous = function(source,operator,options) {\\n\\tvar results = [],\\n\\t\\tlist = options.wiki.getTiddlerList(operator.operand);\\n\\tsource(function(tiddler,title) {\\n\\t\\tvar match = list.indexOf(title);\\n\\t\\t// increment match and then test if result is in range\\n\\t\\tmatch--;\\n\\t\\tif(match >= 0) {\\n\\t\\t\\tresults.push(list[match]);\\n\\t\\t}\\n\\t});\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/range.js\":{\"title\":\"$:/core/modules/filters/range.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/range.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator for generating a numeric range.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.range = function(source,operator,options) {\\n\\tvar results = [];\\n\\t// For backwards compatibility, if there is only one operand, try to split it using one of the delimiters\\n\\tvar parts = operator.operands || [];\\n\\tif(parts.length === 1) {\\n\\t\\tparts = operator.operand.split(/[,:;]/g);\\n\\t}\\n\\t// Process the parts\\n\\tvar beg, end, inc, i, fixed = 0;\\n\\tfor (i=0; i\u003Cparts.length; i++) {\\n\\t\\t// Validate real number\\n\\t\\tif(!/^\\\\s*[+-]?((\\\\d+(\\\\.\\\\d*)?)|(\\\\.\\\\d+))\\\\s*$/.test(parts[i])) {\\n\\t\\t\\treturn [\\\"range: bad number \\\\\\\"\\\" + parts[i] + \\\"\\\\\\\"\\\"];\\n\\t\\t}\\n\\t\\t// Count digits; the most precise number determines decimal places in output.\\n\\t\\tvar frac = /\\\\.\\\\d+/.exec(parts[i]);\\n\\t\\tif(frac) {\\n\\t\\t\\tfixed = Math.max(fixed,frac[0].length-1);\\n\\t\\t}\\n\\t\\tparts[i] = parseFloat(parts[i]);\\n\\t}\\n\\tswitch(parts.length) {\\n\\t\\tcase 1:\\n\\t\\t\\tend = parts[0];\\n\\t\\t\\tif (end >= 1) {\\n\\t\\t\\t\\tbeg = 1;\\n\\t\\t\\t}\\n\\t\\t\\telse if (end \u003C= -1) {\\n\\t\\t\\t\\tbeg = -1;\\n\\t\\t\\t}\\n\\t\\t\\telse {\\n\\t\\t\\t\\treturn [];\\n\\t\\t\\t}\\n\\t\\t\\tinc = 1;\\n\\t\\t\\tbreak;\\n\\t\\tcase 2:\\n\\t\\t\\tbeg = parts[0];\\n\\t\\t\\tend = parts[1];\\n\\t\\t\\tinc = 1;\\n\\t\\t\\tbreak;\\n\\t\\tcase 3:\\n\\t\\t\\tbeg = parts[0];\\n\\t\\t\\tend = parts[1];\\n\\t\\t\\tinc = Math.abs(parts[2]);\\n\\t\\t\\tbreak;\\n\\t}\\n\\tif(inc === 0) {\\n\\t\\treturn [\\\"range: increment 0 causes infinite loop\\\"];\\n\\t}\\n\\t// May need to count backwards\\n\\tvar direction = ((end \u003C beg) ? -1 : 1);\\n\\tinc *= direction;\\n\\t// Estimate number of resulting elements\\n\\tif((end - beg) / inc > 10000) {\\n\\t\\treturn [\\\"range: too many steps (over 10K)\\\"];\\n\\t}\\n\\t// Avoid rounding error on last step\\n\\tend += direction * 0.5 * Math.pow(0.1,fixed);\\n\\tvar safety = 10010;\\n\\t// Enumerate the range\\n\\tif (end\u003Cbeg) {\\n\\t\\tfor(i=beg; i>end; i+=inc) {\\n\\t\\t\\tresults.push(i.toFixed(fixed));\\n\\t\\t\\tif(--safety\u003C0) {\\n\\t\\t\\t\\tbreak;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t} else {\\n\\t\\tfor(i=beg; i\u003Cend; i+=inc) {\\n\\t\\t\\tresults.push(i.toFixed(fixed));\\n\\t\\t\\tif(--safety\u003C0) {\\n\\t\\t\\t\\tbreak;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\tif(safety\u003C0) {\\n\\t\\treturn [\\\"range: unexpectedly large output\\\"];\\n\\t}\\n\\t// Reverse?\\n\\tif(operator.prefix === \\\"!\\\") {\\n\\t\\tresults.reverse();\\n\\t}\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/reduce.js\":{\"title\":\"$:/core/modules/filters/reduce.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/reduce.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator evaluates a subfilter for each item, making the running total available in the variable `accumulator`, and the current index available in the variable `index`\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.reduce = function(source,operator,options) {\\n\\t// Accumulate the list\\n\\tvar results = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tresults.push(title);\\n\\t});\\n\\t// Run the filter over each item\\n\\tvar filterFn = options.wiki.compileFilter(operator.operand),\\n\\t\\taccumulator = operator.operands[1] || \\\"\\\";\\n\\tfor(var index=0; index\u003Cresults.length; index++) {\\n\\t\\tvar title = results[index],\\n\\t\\t\\tlist = filterFn.call(options.wiki,options.wiki.makeTiddlerIterator([title]),options.widget.makeFakeWidgetWithVariables({\\n\\t\\t\\t\\t\\\"currentTiddler\\\": \\\"\\\" + title,\\n\\t\\t\\t\\t\\\"..currentTiddler\\\": options.widget.getVariable(\\\"currentTiddler\\\"),\\n\\t\\t\\t\\t\\\"accumulator\\\": \\\"\\\" + accumulator,\\n\\t\\t\\t\\t\\\"index\\\": \\\"\\\" + index,\\n\\t\\t\\t\\t\\\"revIndex\\\": \\\"\\\" + (results.length - 1 - index),\\n\\t\\t\\t\\t\\\"length\\\": \\\"\\\" + results.length\\n\\t\\t\\t}));\\n\\t\\tif(list.length > 0) {\\n\\t\\t\\taccumulator = \\\"\\\" +  list[0];\\n\\t\\t}\\n\\t}\\n\\tif(results.length > 0) {\\n\\t\\treturn [accumulator];\\n\\t} else {\\n\\t\\treturn [];\\n\\t}\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/regexp.js\":{\"title\":\"$:/core/modules/filters/regexp.js\",\"text\":\"/*\\\\\\ntitle: $
2731:/core/modules/filters/regexp.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator for regexp matching\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.regexp = function(source,operator,options) {\\n\\tvar results = [],\\n\\t\\tfieldname = operator.suffix || \\\"title\\\",\\n\\t\\tregexpString, regexp, flags = \\\"\\\", match,\\n\\t\\tgetFieldString = function(tiddler,title) {\\n\\t\\t\\tif(tiddler) {\\n\\t\\t\\t\\treturn tiddler.getFieldString(fieldname);\\n\\t\\t\\t} else if(fieldname === \\\"title\\\") {\\n\\t\\t\\t\\treturn title;\\n\\t\\t\\t} else {\\n\\t\\t\\t\\treturn null;\\n\\t\\t\\t}\\n\\t\\t};\\n\\t// Process flags and construct regexp\\n\\tregexpString = operator.operand;\\n\\tmatch = /^\\\\(\\\\?([gim]+)\\\\)/.exec(regexpString);\\n\\tif(match) {\\n\\t\\tflags = match[1];\\n\\t\\tregexpString = regexpString.substr(match[0].length);\\n\\t} else {\\n\\t\\tmatch = /\\\\(\\\\?([gim]+)\\\\)$/.exec(regexpString);\\n\\t\\tif(match) {\\n\\t\\t\\tflags = match[1];\\n\\t\\t\\tregexpString = regexpString.substr(0,regexpString.length - match[0].length);\\n\\t\\t}\\n\\t}\\n\\ttry {\\n\\t\\tregexp = new RegExp(regexpString,flags);\\n\\t} catch(e) {\\n\\t\\treturn [\\\"\\\" + e];\\n\\t}\\n\\t// Process the incoming tiddlers\\n\\tif(operator.prefix === \\\"!\\\") {\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tvar text = getFieldString(tiddler,title);\\n\\t\\t\\tif(text !== null) {\\n\\t\\t\\t\\tif(!regexp.exec(text)) {\\n\\t\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t});\\n\\t} else {\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tvar text = getFieldString(tiddler,title);\\n\\t\\t\\tif(text !== null) {\\n\\t\\t\\t\\tif(!!regexp.exec(text)) {\\n\\t\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t});\\n\\t}\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/removeprefix.js\":{\"title\":\"$:/core/modules/filters/removeprefix.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/removeprefix.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator for removing a prefix from each title in the list. Titles that do not start with the prefix are removed.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.removeprefix = function(source,operator,options) {\\n\\tvar results = [],\\n\\t\\tsuffixes = (operator.suffixes || [])[0] || [];\\n\\tif(suffixes.indexOf(\\\"caseinsensitive\\\") !== -1) {\\n\\t\\tvar operand = operator.operand.toLowerCase();\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tif(title.toLowerCase().substr(0,operand.length) === operand) {\\n\\t\\t\\t\\tresults.push(title.substr(operand.length));\\n\\t\\t\\t}\\n\\t\\t});\\n\\t} else {\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tif(title.substr(0,operator.operand.length) === operator.operand) {\\n\\t\\t\\t\\tresults.push(title.substr(operator.operand.length));\\n\\t\\t\\t}\\n\\t\\t});\\n\\t}\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/removesuffix.js\":{\"title\":\"$:/core/modules/filters/removesuffix.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/removesuffix.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator for removing a suffix from each title in the list. Titles that do not end with the suffix are removed.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.removesuffix = function(source,operator,options) {\\n\\tvar results = [],\\n\\t\\tsuffixes = (operator.suffixes || [])[0] || [];\\n\\tif (!operator.operand) {\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tresults.push(title);\\n\\t\\t});\\n\\t} else if(suffixes.indexOf(\\\"caseinsensitive\\\") !== -1) {\\n\\t\\tvar operand = operator.operand.toLowerCase();
2731\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tif(title && title.toLowerCase().substr(-operand.length) === operand) {\\n\\t\\t\\t\\tresults.push(title.substr(0,title.length - operand.length));\\n\\t\\t\\t}\\n\\t\\t});\\n\\t} else {\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tif(title && title.substr(-operator.operand.length) === operator.operand) {\\n\\t\\t\\t\\tresults.push(title.substr(0,title.length - operator.operand.length));\\n\\t\\t\\t}\\n\\t\\t});\\n\\t}\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/sameday.js\":{\"title\":\"$:/core/modules/filters/sameday.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/sameday.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator that selects tiddlers with a modified date field on the same day as the provided value.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.sameday = function(source,operator,options) {\\n\\tvar results = [],\\n\\t\\tfieldName = operator.suffix || \\\"modified\\\",\\n\\t\\ttargetDate = (new Date($tw.utils.parseDate(operator.operand))).setHours(0,0,0,0);\\n\\t// Function to convert a date/time to a date integer\\n\\tsource(function(tiddler,title) {\\n\\t\\tif(tiddler) {\\n\\t\\t\\tif(tiddler.getFieldDay(fieldName) === targetDate) {\\n\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t});\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/search.js\":{\"title\":\"$:/core/modules/filters/search.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/search.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator for searching for the text in the operand tiddler\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.search = function(source,operator,options) {\\n\\tvar invert = operator.prefix === \\\"!\\\";\\n\\tif(operator.suffixes) {\\n\\t\\tvar hasFlag = function(flag) {\\n\\t\\t\\t\\treturn (operator.suffixes[1] || []).indexOf(flag) !== -1;\\n\\t\\t\\t},\\n\\t\\t\\texcludeFields = false,\\n\\t\\t\\tfieldList = operator.suffixes[0] || [],\\n\\t\\t\\tfirstField = fieldList[0] || \\\"\\\", \\n\\t\\t\\tfirstChar = firstField.charAt(0),\\n\\t\\t\\tfields;\\n\\t\\tif(firstChar === \\\"-\\\") {\\n\\t\\t\\tfields = [firstField.slice(1)].concat(fieldList.slice(1));\\n\\t\\t\\texcludeFields = true;\\n\\t\\t} else if(fieldList[0] === \\\"*\\\"){\\n\\t\\t\\tfields = [];\\n\\t\\t\\texcludeFields = true;\\n\\t\\t} else {\\n\\t\\t\\tfields = fieldList.slice(0);\\n\\t\\t}\\n\\t\\treturn options.wiki.search(operator.operand,{\\n\\t\\t\\tsource: source,\\n\\t\\t\\tinvert: invert,\\n\\t\\t\\tfield: fields,\\n\\t\\t\\texcludeField: excludeFields,\\n\\t\\t\\tsome: hasFlag(\\\"some\\\"),\\n\\t\\t\\tcaseSensitive: hasFlag(\\\"casesensitive\\\"),\\n\\t\\t\\tliteral: hasFlag(\\\"literal\\\"),\\n\\t\\t\\twhitespace: hasFlag(\\\"whitespace\\\"),\\n\\t\\t\\tanchored: hasFlag(\\\"anchored\\\"),\\n\\t\\t\\tregexp: hasFlag(\\\"regexp\\\"),\\n\\t\\t\\twords: hasFlag(\\\"words\\\")\\n\\t\\t});\\n\\t} else {\\n\\t\\treturn options.wiki.search(operator.operand,{\\n\\t\\t\\tsource: source,\\n\\t\\t\\tinvert: invert\\n\\t\\t});\\n\\t}\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/shadowsource.js\":{\"title\":\"$:/core/modules/filters/shadowsource.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/shadowsource.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator for returning the source plugins for shadow tiddlers\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.shadowsource = function(source,operator,options) {\\n\\tvar results = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tvar source = options.wiki.getShadowSource(title);
2731\\n\\t\\tif(source) {\\n\\t\\t\\t$tw.utils.pushTop(results,source);\\n\\t\\t}\\n\\t});\\n\\tresults.sort();\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/slugify.js\":{\"title\":\"$:/core/modules/filters/slugify.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/slugify.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator for slugifying a tiddler title\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.slugify = function(source,operator,options) {\\n\\tvar results = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tresults.push(options.wiki.slugify(title));\\n\\t});\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/sort.js\":{\"title\":\"$:/core/modules/filters/sort.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/sort.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator for sorting\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.sort = function(source,operator,options) {\\n\\tvar results = prepare_results(source);\\n\\toptions.wiki.sortTiddlers(results,operator.operand || \\\"title\\\",operator.prefix === \\\"!\\\",false,false);\\n\\treturn results;\\n};\\n\\nexports.nsort = function(source,operator,options) {\\n\\tvar results = prepare_results(source);\\n\\toptions.wiki.sortTiddlers(results,operator.operand || \\\"title\\\",operator.prefix === \\\"!\\\",false,true);\\n\\treturn results;\\n};\\n\\nexports.sortan = function(source, operator, options) {\\n\\tvar results = prepare_results(source);\\n\\toptions.wiki.sortTiddlers(results, operator.operand || \\\"title\\\", operator.prefix === \\\"!\\\",false,false,true);\\n\\treturn results;\\n};\\n\\nexports.sortcs = function(source,operator,options) {\\n\\tvar results = prepare_results(source);\\n\\toptions.wiki.sortTiddlers(results,operator.operand || \\\"title\\\",operator.prefix === \\\"!\\\",true,false);\\n\\treturn results;\\n};\\n\\nexports.nsortcs = function(source,operator,options) {\\n\\tvar results = prepare_results(source);\\n\\toptions.wiki.sortTiddlers(results,operator.operand || \\\"title\\\",operator.prefix === \\\"!\\\",true,true);\\n\\treturn results;\\n};\\n\\nvar prepare_results = function (source) {\\n\\tvar results = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tresults.push(title);\\n\\t});\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/sortsub.js\":{\"title\":\"$:/core/modules/filters/sortsub.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/sortsub.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator for sorting by a subfilter\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.sortsub = function(source,operator,options) {\\n\\t// Compile the subfilter\\n\\tvar filterFn = options.wiki.compileFilter(operator.operand);\\n\\t// Collect the input titles and the corresponding sort keys\\n\\tvar inputTitles = [],\\n\\t\\tsortKeys = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tinputTitles.push(title);\\n\\t\\tvar r = filterFn.call(options.wiki,function(iterator) {\\n\\t\\t\\titerator(options.wiki.getTiddler(title),title);\\n\\t\\t},options.widget.makeFakeWidgetWithVariables({\\n\\t\\t\\t\\\"currentTiddler\\\": \\\"\\\" + title,\\n\\t\\t\\t\\\"..currentTiddler\\\": options.widget.getVariable(\\\"currentTiddler\\\")\\n\\t\\t}));\\n\\t\\tsortKeys.push(r[0] || \\\"\\\");\\n\\t});\\n\\t// Rather than sorting the titles array, we'll sort the indexes so that we can consult both arrays\\n\\tvar indexes = new Array(inputTitles.length);\\n\\tfor(var t=0; t\u003CinputTitles.length; t++) {\\n\\t\\tindexes[t] = t;\\n\\t}\\n\\t// Sort the indexes\\n\\tvar compareFn = $tw.utils.makeCompareFunction(operator.suffix,{defaultType: \\\"string\\\",invert: operator.prefix === \\\"!\\\"});\\n\\tindexes = indexes.sort(function(a,b) {\\n\\t\\treturn compareFn(sortKeys[a],sortKeys[b]);\\n\\t});\\n\\t// Make the results array in order\\n\\tvar results = [];\\n\\t$tw.utils.each(indexes,function(index) {\\n\\t\\tresults.push(inputTitles[index]);\\n\\t});\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/splitbefore.js\":{\"title\":\"$:/core/modules/filters/splitbefore.js\",\"text\":\"/*\\\\\\ntitle: $
2731:/core/modules/filters/splitbefore.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator that splits each result on the first occurance of the specified separator and returns the unique values.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.splitbefore = function(source,operator,options) {\\n\\tvar results = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tvar parts = title.split(operator.operand);\\n\\t\\tif(parts.length === 1) {\\n\\t\\t\\t$tw.utils.pushTop(results,parts[0]);\\n\\t\\t} else {\\n\\t\\t\\t$tw.utils.pushTop(results,parts[0] + operator.operand);\\n\\t\\t}\\n\\t});\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/storyviews.js\":{\"title\":\"$:/core/modules/filters/storyviews.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/storyviews.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator for returning the names of the story views in this wiki\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.storyviews = function(source,operator,options) {\\n\\tvar results = [],\\n\\t\\tstoryviews = {};\\n\\t$tw.modules.applyMethods(\\\"storyview\\\",storyviews);\\n\\t$tw.utils.each(storyviews,function(info,name) {\\n\\t\\tresults.push(name);\\n\\t});\\n\\tresults.sort();\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/strings.js\":{\"title\":\"$:/core/modules/filters/strings.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/strings.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operators for strings. Unary/binary operators work on each item in turn, and return a new item list.\\n\\nSum/product/maxall/minall operate on the entire list, returning a single item.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.length = makeStringBinaryOperator(\\n\\tfunction(a) {return [\\\"\\\" + (\\\"\\\" + a).length];}\\n);\\n\\nexports.uppercase = makeStringBinaryOperator(\\n\\tfunction(a) {return [(\\\"\\\" + a).toUpperCase()];}\\n);\\n\\nexports.lowercase = makeStringBinaryOperator(\\n\\tfunction(a) {return [(\\\"\\\" + a).toLowerCase()];}\\n);\\n\\nexports.sentencecase = makeStringBinaryOperator(\\n\\tfunction(a) {return [$tw.utils.toSentenceCase(a)];}\\n);\\n\\nexports.titlecase = makeStringBinaryOperator(\\n\\tfunction(a) {return [$tw.utils.toTitleCase(a)];}\\n);\\n\\nexports.trim = function(source,operator,options) {\\n\\tvar result = [],\\n\\t\\tsuffix = operator.suffix || \\\"\\\",\\n\\t\\toperand = (operator.operand || \\\"\\\"),\\n\\t\\tfnCalc;\\n\\tif(suffix === \\\"prefix\\\") {\\n\\t\\tfnCalc = function(a,b) {return [$tw.utils.trimPrefix(a,b)];}\\n\\t} else if(suffix === \\\"suffix\\\") {\\n\\t\\tfnCalc = function(a,b) {return [$tw.utils.trimSuffix(a,b)];}\\n\\t} else {\\n\\t\\tif(operand === \\\"\\\") {\\n\\t\\t\\tfnCalc = function(a) {return [$tw.utils.trim(a)];}\\n\\t\\t} else {\\n\\t\\t\\tfnCalc = function(a,b) {return [$tw.utils.trimSuffix($tw.utils.trimPrefix(a,b),b)];}\\n\\t\\t}\\n\\t}\\n\\tsource(function(tiddler,title) {\\n\\t\\tArray.prototype.push.apply(result,fnCalc(title,operand));\\n\\t});\\n\\treturn result;\\n};\\n\\nexports.split = makeStringBinaryOperator(\\n\\tfunction(a,b) {return (\\\"\\\" + a).split(b);}\\n);\\n\\nexports[\\\"enlist-input\\\"] = makeStringBinaryOperator(\\n\\tfunction(a,o,s) {return $tw.utils.parseStringArray(\\\"\\\" + a,(s === \\\"raw\\\"));}\\n);\\n\\nexports.join = makeStringReducingOperator(\\n\\tfunction(accumulator,value,operand) {\\n\\t\\tif(accumulator === null) {\\n\\t\\t\\treturn value;\\n\\t\\t} else {\\n\\t\\t\\treturn accumulator + operand + value;\\n\\t\\t}\\n\\t},null\\n);\\n\\nvar dmp = require(\\\"$:/core/modules/utils/diff-match-patch/diff_match_patch.js\\\");\\n\\nexports.levenshtein = makeStringBinaryOperator(\\n\\tfunction(a,b) {\\n\\t\\tvar dmpObject = new dmp.diff_match_patch(),\\n\\t\\t\\tdiffs = dmpObject.diff_main(a,b);\\n\\t\\treturn [dmpObject.diff_levenshtein(diffs) + \\\"\\\"];\\n\\t}\\n);
2731\\n\\n// these two functions are adapted from https://github.com/google/diff-match-patch/wiki/Line-or-Word-Diffs\\nfunction diffLineWordMode(text1,text2,mode) {\\n\\tvar dmpObject = new dmp.diff_match_patch();\\n\\tvar a = diffPartsToChars(text1,text2,mode);\\n\\tvar lineText1 = a.chars1;\\n\\tvar lineText2 = a.chars2;\\n\\tvar lineArray = a.lineArray;\\n\\tvar diffs = dmpObject.diff_main(lineText1,lineText2,false);\\n\\tdmpObject.diff_charsToLines_(diffs,lineArray);\\n\\treturn diffs;\\n}\\n\\nfunction diffPartsToChars(text1,text2,mode) {\\n\\tvar lineArray = [];\\n\\tvar lineHash = {};\\n\\tlineArray[0] = '';\\n\\n    function diff_linesToPartsMunge_(text,mode) {\\n        var chars = '';\\n        var lineStart = 0;\\n        var lineEnd = -1;\\n        var lineArrayLength = lineArray.length,\\n            regexpResult;\\n        var searchRegexp = /\\\\W+/g;\\n        while(lineEnd \u003C text.length - 1) {\\n\\t        if(mode === \\\"words\\\") {\\n                regexpResult = searchRegexp.exec(text);\\n                lineEnd = searchRegexp.lastIndex;\\n                if(regexpResult === null) {\\n                lineEnd = text.length;\\n                }\\n                lineEnd = --lineEnd;\\n            } else {\\n                lineEnd = text.indexOf('\\\\n', lineStart);\\n                if(lineEnd == -1) {\\n                    lineEnd = text.length - 1;\\n                }\\n            }\\n            var line = text.substring(lineStart, lineEnd + 1);\\n\\n            if(lineHash.hasOwnProperty ? lineHash.hasOwnProperty(line) : (lineHash[line] !== undefined)) {\\n\\t\\t\\t\\tchars += String.fromCharCode(lineHash[line]);\\n            } else {\\n                if (lineArrayLength == maxLines) {\\n                  line = text.substring(lineStart);\\n                  lineEnd = text.length;\\n                }\\n                chars += String.fromCharCode(lineArrayLength);\\n                lineHash[line] = lineArrayLength;\\n                lineArray[lineArrayLength++] = line;\\n            }\\n            lineStart = lineEnd + 1;\\n        }\\n        return chars;\\n    }\\n    var maxLines = 40000;\\n    var chars1 = diff_linesToPartsMunge_(text1,mode);\\n    maxLines = 65535;\\n    var chars2 = diff_linesToPartsMunge_(text2,mode);\\n    return {chars1: chars1, chars2: chars2, lineArray: lineArray};\\n};\\n\\nexports.makepatches = function(source,operator,options) {\\n\\tvar dmpObject = new dmp.diff_match_patch(),\\n\\t\\tsuffix = operator.suffix || \\\"\\\",\\n\\t\\tresult = [];\\n\\t\\t\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tvar diffs, patches;\\n\\t\\t\\tif(suffix === \\\"lines\\\" || suffix === \\\"words\\\") {\\n\\t\\t\\t\\tdiffs = diffLineWordMode(title,operator.operand,suffix);\\n\\t\\t\\t\\tpatches = dmpObject.patch_make(title,diffs);\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tpatches = dmpObject.patch_make(title,operator.operand);\\n\\t\\t\\t}\\n\\t\\t\\tArray.prototype.push.apply(result,[dmpObject.patch_toText(patches)]);\\n\\t\\t});\\n\\n\\treturn result;\\n};\\n\\nexports.applypatches = makeStringBinaryOperator(\\n\\tfunction(a,b) {\\n\\t\\tvar dmpObject = new dmp.diff_match_patch(),\\n\\t\\t\\tpatches;\\n\\t\\ttry {\\n\\t\\t\\tpatches = dmpObject.patch_fromText(b);\\n\\t\\t} catch(e) {\\n\\t\\t}\\n\\t\\tif(patches) {\\n\\t\\t\\treturn [dmpObject.patch_apply(patches,a)[0]];\\n\\t\\t} else {\\n\\t\\t\\treturn [a];\\n\\t\\t}\\n\\t}\\n);\\n\\nfunction makeStringBinaryOperator(fnCalc) {\\n\\treturn function(source,operator,options) {\\n\\t\\tvar result = [];\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tArray.prototype.push.apply(result,fnCalc(title,operator.operand || \\\"\\\",operator.suffix || \\\"\\\"));\\n\\t\\t});\\n\\t\\treturn result;\\n\\t};\\n}\\n\\nfunction makeStringReducingOperator(fnCalc,initialValue) {\\n\\treturn function(source,operator,options) {\\n\\t\\tvar result = [];\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tresult.push(title);\\n\\t\\t});\\n\\t\\tif(result.length === 0) {\\n\\t\\t\\treturn [];\\n\\t\\t}\\n\\t\\treturn [result.reduce(function(accumulator,currentValue) {\\n\\t\\t\\treturn fnCalc(accumulator,currentValue,operator.operand || \\\"\\\");\\n\\t\\t},initialValue) || \\\"\\\"];\\n\\t};\\n}\\n\\nexports.splitregexp = function(source,operator,options) {\\n\\tvar result = [],\\n\\t\\t
2731suffix = operator.suffix || \\\"\\\",\\n\\t\\tflags = (suffix.indexOf(\\\"m\\\") !== -1 ? \\\"m\\\" : \\\"\\\") + (suffix.indexOf(\\\"i\\\") !== -1 ? \\\"i\\\" : \\\"\\\"),\\n\\t\\tregExp;\\n\\ttry {\\n\\t\\tregExp = new RegExp(operator.operand || \\\"\\\",flags);\\n\\t} catch(ex) {\\n\\t\\treturn [\\\"RegExp error: \\\" + ex];\\n\\t}\\n\\tsource(function(tiddler,title) {\\n\\t\\tArray.prototype.push.apply(result,title.split(regExp));\\n\\t});\\n\\treturn result;\\n};\\n\\nexports[\\\"search-replace\\\"] = function(source,operator,options) {\\n\\tvar results = [],\\n\\t\\tsuffixes = operator.suffixes || [],\\n\\t\\tflagSuffix = (suffixes[0] ? (suffixes[0][0] || \\\"\\\") : \\\"\\\"),\\n\\t\\tflags = (flagSuffix.indexOf(\\\"g\\\") !== -1 ? \\\"g\\\" : \\\"\\\") + (flagSuffix.indexOf(\\\"i\\\") !== -1 ? \\\"i\\\" : \\\"\\\") + (flagSuffix.indexOf(\\\"m\\\") !== -1 ? \\\"m\\\" : \\\"\\\"),\\n\\t\\tisRegExp = (suffixes[1] && suffixes[1][0] === \\\"regexp\\\") ? true : false,\\n\\t\\t//Escape regexp characters if the operand is not a regular expression\\n\\t\\tsearchTerm = isRegExp ? operator.operand : $tw.utils.escapeRegExp(operator.operand),\\n\\t\\t//Escape $ character in replacement string if not in regular expression mode\\n\\t\\treplacement = isRegExp ? operator.operands[1] : (operator.operands[1]||\\\"\\\").replace(/\\\\$/g,\\\"$$$$\\\"),\\n\\t\\tregExp;\\n\\ttry {\\n\\t\\tregExp = new RegExp(searchTerm,flags);\\n\\t} catch(ex) {\\n\\t\\treturn [\\\"RegExp error: \\\" + ex];\\n\\t}\\n\\n\\tsource(function(tiddler,title) {\\n\\t\\tif(title && (operator.operands.length > 1)) {\\n\\t\\t\\tresults.push(\\n\\t\\t\\t\\ttitle.replace(regExp,replacement)\\n\\t\\t\\t);\\n\\t\\t\\tregExp.lastIndex = 0;\\n\\t\\t} else {\\n\\t\\t\\tresults.push(title);\\n\\t\\t}\\n\\t});\\n\\treturn results;\\n};\\n\\nexports.pad = function(source,operator,options) {\\n\\tvar results = [],\\n\\t\\ttargetLength = operator.operand ? parseInt(operator.operand) : 0,\\n\\t\\tfill = operator.operands[1] || \\\"0\\\";\\n\\n\\tsource(function(tiddler,title) {\\n\\t\\tif(title && title.length) {\\n\\t\\t\\tif(title.length >= targetLength) {\\n\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tvar padString = \\\"\\\",\\n\\t\\t\\t\\t\\tpadStringLength = targetLength - title.length;\\n\\t\\t\\t\\twhile (padStringLength > padString.length) {\\n\\t\\t\\t\\t\\tpadString += fill;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t//make sure we do not exceed the specified length\\n\\t\\t\\t\\tpadString = padString.slice(0,padStringLength);\\n\\t\\t\\t\\tif(operator.suffix && (operator.suffix === \\\"suffix\\\")) {\\n\\t\\t\\t\\t\\ttitle = title + padString;\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\ttitle = padString + title;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t});\\n\\treturn results;\\n}\\n\\nexports.charcode = function(source,operator,options) {\\n\\tvar chars = [];\\n\\t$tw.utils.each(operator.operands,function(operand) {\\n\\t\\tif(operand !== \\\"\\\") {\\n\\t\\t\\tchars.push(String.fromCharCode($tw.utils.parseInt(operand)));\\n\\t\\t}\\n\\t});\\n\\treturn [chars.join(\\\"\\\")];\\n};\\n\\n})();\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/subfilter.js\":{\"title\":\"$:/core/modules/filters/subfilter.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/subfilter.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator returning its operand evaluated as a filter\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.subfilter = function(source,operator,options) {\\n\\tvar list = options.wiki.filterTiddlers(operator.operand,options.widget,source);\\n\\tif(operator.prefix === \\\"!\\\") {\\n\\t\\tvar results = [];\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tif(list.indexOf(title) === -1) {\\n\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t}\\n\\t\\t});\\n\\t\\treturn results;\\n\\t} else {\\n\\t\\treturn list;\\n\\t}\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/substitute.js\":{\"title\":\"$:/core/modules/filters/substitute.js\",\"text\":\"/*\\\\\\ntitle: $
2731:/core/modules/filters/substitute.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator for substituting variables and embedded filter expressions with their corresponding values\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.substitute = function(source,operator,options) {\\n\\tvar results = [],\\n\\t\\toperands = [];\\n\\t$tw.utils.each(operator.operands,function(operand,index){\\n\\t\\toperands.push({\\n\\t\\t\\tname: (index + 1).toString(),\\n\\t\\t\\tvalue: operand\\n\\t\\t});\\n\\t});\\n\\tsource(function(tiddler,title) {\\n\\t\\tif(title) {\\n\\t\\t\\tresults.push(options.wiki.getSubstitutedText(title,options.widget,{substitutions:operands}));\\n\\t\\t}\\n\\t});\\n\\treturn results;\\n};\\n\\n})();\\n \",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/subtiddlerfields.js\":{\"title\":\"$:/core/modules/filters/subtiddlerfields.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/subtiddlerfields.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator for returning the names of the fields on the selected subtiddlers of the plugin named in the operand\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.subtiddlerfields = function(source,operator,options) {\\n\\tvar results = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tvar subtiddler = options.wiki.getSubTiddler(operator.operand,title);\\n\\t\\tif(subtiddler) {\\n\\t\\t\\tfor(var fieldName in subtiddler.fields) {\\n\\t\\t\\t\\t$tw.utils.pushTop(results,fieldName);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t});\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/suffix.js\":{\"title\":\"$:/core/modules/filters/suffix.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/suffix.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator for checking if a title ends with a suffix\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.suffix = function(source,operator,options) {\\n\\tvar results = [],\\n\\t\\tsuffixes = (operator.suffixes || [])[0] || [];\\n\\tif (!operator.operand) {\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tresults.push(title);\\n\\t\\t});\\n\\t} else if(suffixes.indexOf(\\\"caseinsensitive\\\") !== -1) {\\n\\t\\tvar operand = operator.operand.toLowerCase();\\n\\t\\tif(operator.prefix === \\\"!\\\") {\\n\\t\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\t\\tif(title.toLowerCase().substr(-operand.length) !== operand) {\\n\\t\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t\\t}\\n\\t\\t\\t});\\n\\t\\t} else {\\n\\t\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\t\\tif(title.toLowerCase().substr(-operand.length) === operand) {\\n\\t\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t\\t}\\n\\t\\t\\t});\\n\\t\\t}\\n\\t} else {\\n\\t\\tif(operator.prefix === \\\"!\\\") {\\n\\t\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\t\\tif(title.substr(-operator.operand.length) !== operator.operand) {\\n\\t\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t\\t}\\n\\t\\t\\t});\\n\\t\\t} else {\\n\\t\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\t\\tif(title.substr(-operator.operand.length) === operator.operand) {\\n\\t\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t\\t}\\n\\t\\t\\t});\\n\\t\\t}\\n\\t}\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/tag.js\":{\"title\":\"$:/core/modules/filters/tag.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/tag.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator for checking for the presence of a tag\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.tag = function(source,operator,options) {\\n\\tvar results = [],indexedResults;\\n\\tif((operator.suffix || \\\"\\\").toLowerCase() === \\\"strict\\\" && !operator.operand) {\\n\\t\\t// New semantics:\\n\\t\\t// Always return copy of input if operator.operand is missing\\n\\t\\t
2731source(function(tiddler,title) {\\n\\t\\t\\tresults.push(title);\\n\\t\\t});\\n\\t} else {\\n\\t\\t// Old semantics:\\n\\t\\tvar tiddlers;\\n\\t\\tif(operator.prefix === \\\"!\\\") {\\n\\t\\t\\t// Returns a copy of the input if operator.operand is missing\\n\\t\\t\\ttiddlers = options.wiki.getTiddlersWithTag(operator.operand);\\n\\t\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\t\\tif(tiddlers.indexOf(title) === -1) {\\n\\t\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t\\t}\\n\\t\\t\\t});\\n\\t\\t} else {\\n\\t\\t\\t// Returns empty results if operator.operand is missing\\n\\t\\t\\tif(source.byTag) {\\n\\t\\t\\t\\tindexedResults = source.byTag(operator.operand);\\n\\t\\t\\t\\tif(indexedResults) {\\n\\t\\t\\t\\t\\treturn indexedResults;\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else {\\n\\t\\t\\t\\ttiddlers = options.wiki.getTiddlersWithTag(operator.operand);\\n\\t\\t\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\t\\t\\tif(tiddlers.indexOf(title) !== -1) {\\n\\t\\t\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t});\\n\\t\\t\\t\\tresults = options.wiki.sortByList(results,operator.operand);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/tagging.js\":{\"title\":\"$:/core/modules/filters/tagging.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/tagging.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator returning all tiddlers that are tagged with the selected tiddlers\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.tagging = function(source,operator,options) {\\n\\tvar results = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\t$tw.utils.pushTop(results,options.wiki.getTiddlersWithTag(title));\\n\\t});\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/tags.js\":{\"title\":\"$:/core/modules/filters/tags.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/tags.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator returning all the tags of the selected tiddlers\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.tags = function(source,operator,options) {\\n\\tvar tags = {};\\n\\tsource(function(tiddler,title) {\\n\\t\\tvar t, length;\\n\\t\\tif(tiddler && tiddler.fields.tags) {\\n\\t\\t\\tfor(t=0, length=tiddler.fields.tags.length; t\u003Clength; t++) {\\n\\t\\t\\t\\ttags[tiddler.fields.tags[t]] = true;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t});\\n\\treturn Object.keys(tags);\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/then.js\":{\"title\":\"$:/core/modules/filters/then.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/then.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator for replacing any titles with a constant\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.then = function(source,operator,options) {\\n\\tvar results = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tresults.push(operator.operand);\\n\\t});\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/title.js\":{\"title\":\"$:/core/modules/filters/title.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/title.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator for comparing title fields for equality\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.title = function(source,operator,options) {\\n\\tvar results = [];
2731\\n\\tif(operator.prefix === \\\"!\\\") {\\n\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\tif(tiddler && tiddler.fields.title !== operator.operand) {\\n\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t}\\n\\t\\t});\\n\\t} else {\\n\\t\\tresults.push(operator.operand);\\n\\t}\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/unknown.js\":{\"title\":\"$:/core/modules/filters/unknown.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/unknown.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator for handling unknown filter operators.\\n\\nNot intended to be used directly by end users, hence the square brackets around the name.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar fieldFilterOperatorFn = require(\\\"$:/core/modules/filters/field.js\\\").field;\\n\\n/*\\nExport our filter function\\n*/\\nexports[\\\"[unknown]\\\"] = function(source,operator,options) {\\n\\t// Check for a user defined filter operator\\n\\tif(operator.operator.indexOf(\\\".\\\") !== -1) {\\n\\t\\tvar params = [];\\n\\t\\t$tw.utils.each(operator.operands,function(param) {\\n\\t\\t\\tparams.push({value: param});\\n\\t\\t});\\t\\n\\t\\tvar variableInfo = options.widget && options.widget.getVariableInfo && options.widget.getVariableInfo(operator.operator,{params: params, source: source});\\n\\t\\tif(variableInfo && variableInfo.srcVariable) {\\n\\t\\t\\tvar list = variableInfo.resultList ? variableInfo.resultList : [variableInfo.text];\\n\\t\\t\\tif(operator.prefix === \\\"!\\\") {\\n\\t\\t\\t\\tvar results = [];\\n\\t\\t\\t\\tsource(function(tiddler,title) {\\n\\t\\t\\t\\t\\tif(list.indexOf(title) === -1) {\\n\\t\\t\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t});\\n\\t\\t\\t\\treturn results;\\n\\t\\t\\t} else {\\n\\t\\t\\t\\treturn list;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\t// Otherwise, use the \\\"field\\\" operator\\n\\treturn fieldFilterOperatorFn(source,operator,options);\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/untagged.js\":{\"title\":\"$:/core/modules/filters/untagged.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/untagged.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator returning all the selected tiddlers that are untagged\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.untagged = function(source,operator,options) {\\n\\tvar results = [],\\n\\t\\texpected = (operator.prefix === \\\"!\\\");\\n\\tsource(function(tiddler,title) {\\n\\t\\tif(((tiddler && $tw.utils.isArray(tiddler.fields.tags) && tiddler.fields.tags.length > 0) === expected) || (!tiddler && !expected)) {\\n\\t\\t\\tresults.push(title);\\n\\t\\t}\\n\\t});\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/variables.js\":{\"title\":\"$:/core/modules/filters/variables.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/variables.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator for returning the names of the active variables\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.variables = function(source,operator,options) {\\n\\tvar names = [],\\n\\t\\twidget = options.widget;\\n\\twhile(widget && !widget.hasOwnProperty(\\\"variables\\\")) {\\n\\t\\twidget = widget.parentWidget;\\n\\t}\\n\\tif(widget && widget.variables) {\\n\\t\\tfor(var variable in widget.variables) {\\n\\t\\t\\tnames.push(variable);\\n\\t\\t}\\n\\t}\\n\\treturn names.sort();\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/wikiparserrules.js\":{\"title\":\"$:/core/modules/filters/wikiparserrules.js\",\"text\":\"/*\\\\\\ntitle: $
2731:/core/modules/filters/wikiparserrules.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nFilter operator for returning the names of the wiki parser rules in this wiki\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.wikiparserrules = function(source,operator,options) {\\n\\tvar results = [],\\n\\t\\toperand = operator.operand;\\n\\t$tw.utils.each($tw.modules.types.wikirule,function(mod) {\\n\\t\\tvar exp = mod.exports;\\n\\t\\tif(!operand || exp.types[operand]) {\\n\\t\\t\\tresults.push(exp.name);\\n\\t\\t}\\n\\t});\\n\\tresults.sort();\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters/x-listops.js\":{\"title\":\"$:/core/modules/filters/x-listops.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/x-listops.js\\ntype: application/javascript\\nmodule-type: filteroperator\\n\\nExtended filter operators to manipulate the current list.\\n\\n\\\\*/\\n(function () {\\n\\n\\t/*jslint node: true, browser: true */\\n\\t/*global $tw: false */\\n\\t\\\"use strict\\\";\\n\\n\\t/*\\n\\tFetch titles from the current list\\n\\t*/\\n\\tvar prepare_results = function (source) {\\n\\tvar results = [];\\n\\t\\tsource(function (tiddler, title) {\\n\\t\\t\\tresults.push(title);\\n\\t\\t});\\n\\t\\treturn results;\\n\\t};\\n\\n\\t/*\\n\\tMoves a number of items from the tail of the current list before the item named in the operand\\n\\t*/\\n\\texports.putbefore = function (source, operator) {\\n\\t\\tvar results = prepare_results(source),\\n\\t\\t\\tindex = results.indexOf(operator.operand),\\n\\t\\t\\tcount = $tw.utils.getInt(operator.suffix,1);\\n\\t\\treturn (index === -1) ?\\n\\t\\t\\tresults.slice(0, -1) :\\n\\t\\t\\tresults.slice(0, index).concat(results.slice(-count)).concat(results.slice(index, -count));\\n\\t};\\n\\n\\t/*\\n\\tMoves a number of items from the tail of the current list after the item named in the operand\\n\\t*/\\n\\texports.putafter = function (source, operator) {\\n\\t\\tvar results = prepare_results(source),\\n\\t\\t\\tindex = results.indexOf(operator.operand),\\n\\t\\t\\tcount = $tw.utils.getInt(operator.suffix,1);\\n\\t\\treturn (index === -1) ?\\n\\t\\t\\tresults.slice(0, -1) :\\n\\t\\t\\tresults.slice(0, index + 1).concat(results.slice(-count)).concat(results.slice(index + 1, -count));\\n\\t};\\n\\n\\t/*\\n\\tReplaces the item named in the operand with a number of items from the tail of the current list\\n\\t*/\\n\\texports.replace = function (source, operator) {\\n\\t\\tvar results = prepare_results(source),\\n\\t\\t\\tindex = results.indexOf(operator.operand),\\n\\t\\t\\tcount = $tw.utils.getInt(operator.suffix,1);\\n\\t\\treturn (index === -1) ?\\n\\t\\t\\tresults.slice(0, -count) :\\n\\t\\t\\tresults.slice(0, index).concat(results.slice(-count)).concat(results.slice(index + 1, -count));\\n\\t};\\n\\n\\t/*\\n\\tMoves a number of items from the tail of the current list to the head of the list\\n\\t*/\\n\\texports.putfirst = function (source, operator) {\\n\\t\\tvar results = prepare_results(source),\\n\\t\\t\\tcount = $tw.utils.getInt(operator.suffix,1);\\n\\t\\treturn results.slice(-count).concat(results.slice(0, -count));\\n\\t};\\n\\n\\t/*\\n\\tMoves a number of items from the head of the current list to the tail of the list\\n\\t*/\\n\\texports.putlast = function (source, operator) {\\n\\t\\tvar results = prepare_results(source),\\n\\t\\t\\tcount = $tw.utils.getInt(operator.suffix,1);\\n\\t\\treturn results.slice(count).concat(results.slice(0, count));\\n\\t};\\n\\n\\t/*\\n\\tMoves the item named in the operand a number of places forward or backward in the list\\n\\t*/\\n\\texports.move = function (source, operator) {\\n\\t\\tvar results = prepare_results(source),\\n\\t\\t\\tindex = results.indexOf(operator.operand),\\n\\t\\t\\tcount = $tw.utils.getInt(operator.suffix,1),\\n\\t\\t\\tmarker = results.splice(index, 1),\\n\\t\\t\\toffset =  (index + count) > 0 ? index + count : 0;\\n\\t\\treturn results.slice(0, offset).concat(marker).concat(results.slice(offset));\\n\\t};\\n\\n\\t/*\\n\\tReturns the items from the current list that are after the item named in the operand\\n\\t*/\\n\\texports.allafter = function (source, operator) {\\n\\t\\tvar results = prepare_results(source),\\n\\t\\t\\tindex = results.indexOf(operator.operand);\\n\\t\\treturn (index === -1) ? [] :\\n\\t\\t\\t(operator.suffix) ? results.slice(index) :\\n\\t\\t\\tresults.slice(index + 1);\\n\\t};\\n\\n\\t/*\\n\\tReturns the items from the current list that are before the item named in the operand\\n\\t*/\\n\\texports.allbefore = function (source, operator) {\\n\\t\\tvar results = prepare_results(source),\\n\\t\\t\\tindex = results.indexOf(operator.operand);\\n\\t\\treturn (index === -1) ? [] :\\n\\t\\t\\t(operator.suffix) ? results.slice(0, index + 1) :\\n\\t\\t\\tresults.slice(0, index);\\n\\t};\\n\\n\\t/*\\n\\tAppends the items listed in the operand array to the tail of the current list\\n\\t*/\\n\\texports.append = function (source, operator) {\\n\\t\\tvar append = $tw.utils.parseStringArray(operator.operand, \\\"true\\\"),\\n\\t\\t\\tresults = prepare_results(source),\\n\\t\\t\\tcount = parseInt(operator.suffix) || append.length;\\n\\t\\treturn (append.length === 0) ? results :\\n\\t\\t\\t(operator.prefix) ? results.concat(append.slice(-count)) :\\n\\t\\t\\tresults.concat(append.slice(0, count));\\n\\t};\\n\\n\\t/*\\n\\tPrepends the items listed in the operand array to the head of the current list\\n\\t*/\\n\\texports.prepend = function (source, operator) {\\n\\t\\tvar prepend = $tw.utils.parseStringArray(operator.operand, \\\"true\\\"),\\n\\t\\t\\tresults = prepare_results(source),\\n\\t\\t\\tcount = $tw.utils.getInt(operator.suffix,prepend.length);\\n\\t\\treturn (prepend.length === 0) ? results :\\n\\t\\t\\t(operator.prefix) ? prepend.slice(-count).concat(results) :\\n\\t\\t\\tprepe
2731nd.slice(0, count).concat(results);\\n\\t};\\n\\n\\t/*\\n\\tReturns all items from the current list except the items listed in the operand array\\n\\t*/\\n\\texports.remove = function (source, operator) {\\n\\t\\tvar array = $tw.utils.parseStringArray(operator.operand, \\\"true\\\"),\\n\\t\\t\\tresults = prepare_results(source),\\n\\t\\t\\tcount = parseInt(operator.suffix) || array.length,\\n\\t\\t\\tp,\\n\\t\\t\\tlen,\\n\\t\\t\\tindex;\\n\\t\\tlen = array.length - 1;\\n\\t\\tfor (p = 0; p \u003C count; ++p) {\\n\\t\\t\\tif (operator.prefix) {\\n\\t\\t\\t\\tindex = results.indexOf(array[len - p]);\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tindex = results.indexOf(array[p]);\\n\\t\\t\\t}\\n\\t\\t\\tif (index !== -1) {\\n\\t\\t\\t\\tresults.splice(index, 1);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\treturn results;\\n\\t};\\n\\n\\t/*\\n\\tReturns all items from the current list sorted in the order of the items in the operand array\\n\\t*/\\n\\texports.sortby = function (source, operator) {\\n\\t\\tvar results = prepare_results(source);\\n\\t\\tif (!results || results.length \u003C 2) {\\n\\t\\t\\treturn results;\\n\\t\\t}\\n\\t\\tvar lookup = $tw.utils.parseStringArray(operator.operand, \\\"true\\\");\\n\\t\\tresults.sort(function (a, b) {\\n\\t\\t\\treturn lookup.indexOf(a) - lookup.indexOf(b);\\n\\t\\t});\\n\\t\\treturn results;\\n\\t};\\n\\n\\t/*\\n\\tRemoves all duplicate items from the current list\\n\\t*/\\n\\texports.unique = function (source, operator) {\\n\\t\\tvar results = prepare_results(source);\\n\\t\\tvar set = results.reduce(function (a, b) {\\n\\t\\t\\tif (a.indexOf(b) \u003C 0) {\\n\\t\\t\\t\\ta.push(b);\\n\\t\\t\\t}\\n\\t\\t\\treturn a;\\n\\t\\t}, []);\\n\\t\\treturn set;\\n\\t};\\n\\n\\tvar cycleValueInArray = function(results,operands,stepSize) {\\n\\t\\tvar resultsIndex,\\n\\t\\t\\tstep = stepSize || 1,\\n\\t\\t\\ti = 0,\\n\\t\\t\\topLength = operands.length,\\n\\t\\t\\tnextOperandIndex;\\n\\t\\tfor(i; i \u003C opLength; i++) {\\n\\t\\t\\tresultsIndex = results.indexOf(operands[i]);\\n\\t\\t\\tif(resultsIndex !== -1) {\\n\\t\\t\\t\\tbreak;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tif(resultsIndex !== -1) {\\n\\t\\t\\ti = i + step;\\n\\t\\t\\tnextOperandIndex = (i \u003C opLength ? i : i - opLength);\\n\\t\\t\\tif(operands.length > 1) {\\n\\t\\t\\t\\tresults.splice(resultsIndex,1,operands[nextOperandIndex]);\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tresults.splice(resultsIndex,1);\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\t\\t\\tresults.push(operands[0]);\\n\\t\\t}\\n\\t\\treturn results;\\n\\t}\\n\\n\\t/*\\n\\tToggles an item in the current list.\\n\\t*/\\n\\texports.toggle = function(source,operator) {\\n\\t\\treturn cycleValueInArray(prepare_results(source),operator.operands);\\n\\t}\\n\\n\\texports.cycle = function(source,operator) {\\n\\t\\tvar results = prepare_results(source),\\n\\t\\t\\toperands = (operator.operand.length ? $tw.utils.parseStringArray(operator.operand, \\\"true\\\") : [\\\"\\\"]),\\n\\t\\t\\tstep = $tw.utils.getInt(operator.operands[1]||\\\"\\\",1);\\n\\t\\tif(step \u003C 0) {\\n\\t\\t\\toperands.reverse();\\n\\t\\t\\tstep = Math.abs(step);\\n\\t\\t}\\n\\t\\treturn cycleValueInArray(results,operands,step);\\n\\t}\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/core/modules/filters.js\":{\"title\":\"$:/core/modules/filters.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters.js\\ntype: application/javascript\\nmodule-type: wikimethod\\n\\nAdds tiddler filtering methods to the $tw.Wiki object.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar widgetClass = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\n/* Maximum permitted filter recursion depth */\\nvar MAX_FILTER_DEPTH = 300;\\n\\n/*\\nParses an operation (i.e. a run) within a filter string\\n\\toperators: Array of array of operator nodes into which results should be inserted\\n\\tfilterString: filter string\\n\\tp: start position within the string\\nReturns the new start position, after the parsed operation\\n*/\\nfunction parseFilterOperation(operators,filterString,p) {\\n\\tvar nextBracketPos, operator;\\n\\t// Skip the starting square bracket\\n\\tif(filterString.charAt(p++) !== \\\"[\\\") {\\n\\t\\tthrow \\\"Missing [ in filter expression\\\";\\n\\t}\\n\\t// Process each operator in turn\\n\\tdo {\\n\\t\\toperator = {};\\n\\t\\t// Check for an operator prefix\\n\\t\\tif(filterString.charAt(p) === \\\"!\\\") {\\n\\t\\t\\toperator.prefix = filterString.charAt(p++);\\n\\t\\t}\\n\\t\\t// Get the operator name\\n\\t\\tnextBracketPos = filterString.substring(p).search(/[\\\\[\\\\{\u003C\\\\/
2731]/);\\n\\t\\tif(nextBracketPos === -1) {\\n\\t\\t\\tthrow \\\"Missing [ in filter expression\\\";\\n\\t\\t}\\n\\t\\tnextBracketPos += p;\\n\\t\\tvar bracket = filterString.charAt(nextBracketPos);\\n\\t\\toperator.operator = filterString.substring(p,nextBracketPos);\\n\\t\\t// Any suffix?\\n\\t\\tvar colon = operator.operator.indexOf(':');\\n\\t\\tif(colon > -1) {\\n\\t\\t\\t// The raw suffix for older filters\\n\\t\\t\\toperator.suffix = operator.operator.substring(colon + 1);\\n\\t\\t\\toperator.operator = operator.operator.substring(0,colon) || \\\"field\\\";\\n\\t\\t\\t// The processed suffix for newer filters\\n\\t\\t\\toperator.suffixes = [];\\n\\t\\t\\t$tw.utils.each(operator.suffix.split(\\\":\\\"),function(subsuffix) {\\n\\t\\t\\t\\toperator.suffixes.push([]);\\n\\t\\t\\t\\t$tw.utils.each(subsuffix.split(\\\",\\\"),function(entry) {\\n\\t\\t\\t\\t\\tentry = $tw.utils.trim(entry);\\n\\t\\t\\t\\t\\tif(entry) {\\n\\t\\t\\t\\t\\t\\toperator.suffixes[operator.suffixes.length - 1].push(entry); \\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t});\\n\\t\\t\\t});\\n\\t\\t}\\n\\t\\t// Empty operator means: title\\n\\t\\telse if(operator.operator === \\\"\\\") {\\n\\t\\t\\toperator.operator = \\\"title\\\";\\n\\t\\t}\\n\\t\\toperator.operands = [];\\n\\t\\tvar parseOperand = function(bracketType) {\\n\\t\\t\\tvar operand = {};\\n\\t\\t\\tswitch (bracketType) {\\n\\t\\t\\t\\tcase \\\"{\\\": // Curly brackets\\n\\t\\t\\t\\t\\toperand.indirect = true;\\n\\t\\t\\t\\t\\tnextBracketPos = filterString.indexOf(\\\"}\\\",p);\\n\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\tcase \\\"[\\\": // Square brackets\\n\\t\\t\\t\\t\\tnextBracketPos = filterString.indexOf(\\\"]\\\",p);\\n\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\tcase \\\"\u003C\\\": // Angle brackets\\n\\t\\t\\t\\t\\toperand.variable = true;\\n\\t\\t\\t\\t\\tnextBracketPos = filterString.indexOf(\\\">\\\",p);\\n\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\tcase \\\"/\\\": // regexp brackets\\n\\t\\t\\t\\t\\tvar rex = /^((?:[^\\\\\\\\\\\\/]|\\\\\\\\.)*)\\\\/(?:\\\\(([mygi]+)\\\\))?/g,\\n\\t\\t\\t\\t\\t\\trexMatch = rex.exec(filterString.substring(p));\\n\\t\\t\\t\\t\\tif(rexMatch) {\\n\\t\\t\\t\\t\\t\\toperator.regexp = new RegExp(rexMatch[1], rexMatch[2]);\\n\\t// DEPRECATION WARNING\\n\\tconsole.log(\\\"WARNING: Filter\\\",operator.operator,\\\"has a deprecated regexp operand\\\",operator.regexp);\\n\\t\\t\\t\\t\\t\\tnextBracketPos = p + rex.lastIndex - 1;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\telse {\\n\\t\\t\\t\\t\\t\\tthrow \\\"Unterminated regular expression in filter expression\\\";\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t}\\n\\n\\t\\t\\tif(nextBracketPos === -1) {\\n\\t\\t\\t\\tthrow \\\"Missing closing bracket in filter expression\\\";\\n\\t\\t\\t}\\n\\t\\t\\tif(operator.regexp) {\\n\\t\\t\\t\\toperand.text = \\\"\\\";\\n\\t\\t\\t} else {\\n\\t\\t\\t\\toperand.text = filterString.substring(p,nextBracketPos);\\n\\t\\t\\t}\\n\\t\\t\\toperator.operands.push(operand);\\n\\t\\t\\tp = nextBracketPos + 1;\\n\\t\\t}\\n\\n\\t\\tp = nextBracketPos + 1;\\n\\t\\tparseOperand(bracket);\\n\\n\\t\\t// Check for multiple operands\\n\\t\\twhile(filterString.charAt(p) === \\\",\\\") {\\n\\t\\t\\tp++;\\n\\t\\t\\tif(/^[\\\\[\\\\{\u003C\\\\/]/.test(filterString.substring(p))) {\\n\\t\\t\\t\\tnextBracketPos = p;\\n\\t\\t\\t\\tp++;\\n\\t\\t\\t\\tparseOperand(filterString.charAt(nextBracketPos));\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tthrow \\\"Missing [ in filter expression\\\";\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Push this operator\\n\\t\\toperators.push(operator);\\n\\t} while(filterString.charAt(p) !== \\\"]\\\");\\n\\t// Skip the ending square bracket\\n\\tif(filterString.charAt(p++) !== \\\"]\\\") {\\n\\t\\tthrow \\\"Missing ] in filter expression\\\";\\n\\t}\\n\\t// Return the parsing position\\n\\treturn p;\\n}\\n\\n/*\\nParse a filter string\\n*/\\nexports.parseFilter = function(filterString) {\\n\\tfilterString = filterString || \\\"\\\";\\n\\tvar results = [], // Array of arrays of operator nodes {operator:,operand:}\\n\\t\\tp = 0, // Current position in the filter string\\n\\t\\tmatch;\\n\\tvar whitespaceRegExp = /(\\\\s+)/mg,\\n\\t\\toperandRegExp = /((?:\\\\+|\\\\-|~|=|\\\\:(\\\\w+)(?:\\\\:([\\\\w\\\\:, ]*))?)?)(?:(\\\\[)|(?:\\\"([^\\\"]*)\\\")|(?:'([^']*)')|([^\\\\s\\\\[\\\\]]+))/mg;\\n\\twhile(p \u003C filterString.length) {\\n\\t\\t// Skip any whitespace\\n\\t\\twhitespaceRegExp.lastIndex = p;\\n\\t\\tmatch = whitespaceRegExp.exec(filterString);\\n\\t\\tif(match && match.index === p) {\\n\\t\\t\\tp = p + match[0].length;\\n\\t\\t}\\n\\t\\t// Match the start of the operation\\n\\t\\tif(p \u003C filterString.length) {\\n\\t\\t\\toperandRegExp.lastIndex = p;\\n\\t\\t\\tmatch = operandRegExp.exec(filterString);\\n\\t\\t\\tif(!match || match.index !== p) {\\n\\t\\t\\t\\tthrow $tw.language.getString(\\\"Error/FilterSyntax\\\");\\n\\t\\t\\t}\\n\\t\\t\\tvar operation = {\\n\\t\\t\\t\\tprefix: \\\"\\\",\\n\\t\\t\\t\\toperators: []\\n\\t\\t\\t};\\n\\t\\t\\tif(match[1]) {\\n\\t\\t\\t\\toperation.prefix = match[1];\\n\\t\\t\\t\\tp = p + operation.prefix.length;\\n\\t\\t\\t\\tif(match[2]) {\\n\\t\\t\\t\\t\\toperation.namedPrefix = match[2];\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tif(match[3]) {\\n\\t\\t\\t\\t\\toperation.suffixes = [];\\n\\t\\t\\t\\t\\t $tw.utils.each(match[3].split(\\\":\\\"),function(subsuffix) {\\n\\t\\t\\t\\t\\t\\toperation.suffixes.push([]);
2731\\n\\t\\t\\t\\t\\t\\t$tw.utils.each(subsuffix.split(\\\",\\\"),function(entry) {\\n\\t\\t\\t\\t\\t\\t\\tentry = $tw.utils.trim(entry);\\n\\t\\t\\t\\t\\t\\t\\tif(entry) {\\n\\t\\t\\t\\t\\t\\t\\t\\toperation.suffixes[operation.suffixes.length -1].push(entry);\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t});\\n\\t\\t\\t\\t\\t });\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\tif(match[4]) { // Opening square bracket\\n\\t\\t\\t\\tp = parseFilterOperation(operation.operators,filterString,p);\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tp = match.index + match[0].length;\\n\\t\\t\\t}\\n\\t\\t\\tif(match[5] || match[6] || match[7]) { // Double quoted string, single quoted string or unquoted title\\n\\t\\t\\t\\toperation.operators.push(\\n\\t\\t\\t\\t\\t{operator: \\\"title\\\", operands: [{text: match[5] || match[6] || match[7]}]}\\n\\t\\t\\t\\t);\\n\\t\\t\\t}\\n\\t\\t\\tresults.push(operation);\\n\\t\\t}\\n\\t}\\n\\treturn results;\\n};\\n\\nexports.getFilterOperators = function() {\\n\\tif(!this.filterOperators) {\\n\\t\\t$tw.Wiki.prototype.filterOperators = {};\\n\\t\\t$tw.modules.applyMethods(\\\"filteroperator\\\",this.filterOperators);\\n\\t}\\n\\treturn this.filterOperators;\\n};\\n\\nexports.getFilterRunPrefixes = function() {\\n\\tif(!this.filterRunPrefixes) {\\n\\t\\t$tw.Wiki.prototype.filterRunPrefixes = {};\\n\\t\\t$tw.modules.applyMethods(\\\"filterrunprefix\\\",this.filterRunPrefixes);\\n\\t}\\n\\treturn this.filterRunPrefixes;\\n}\\n\\nexports.filterTiddlers = function(filterString,widget,source) {\\n\\tvar fn = this.compileFilter(filterString);\\n\\treturn fn.call(this,source,widget);\\n};\\n\\n/*\\nCompile a filter into a function with the signature fn(source,widget) where:\\nsource: an iterator function for the source tiddlers, called source(iterator), where iterator is called as iterator(tiddler,title)\\nwidget: an optional widget node for retrieving the current tiddler etc.\\n*/\\nexports.compileFilter = function(filterString) {\\n\\tif(!this.filterCache) {\\n\\t\\tthis.filterCache = Object.create(null);\\n\\t\\tthis.filterCacheCount = 0;\\n\\t}\\n\\tif(this.filterCache[filterString] !== undefined) {\\n\\t\\treturn this.filterCache[filterString];\\n\\t}\\n\\tvar filterParseTree;\\n\\ttry {\\n\\t\\tfilterParseTree = this.parseFilter(filterString);\\n\\t} catch(e) {\\n\\t\\t// We do not cache this result, so it adjusts along with localization changes\\n\\t\\treturn function(source,widget) {\\n\\t\\t\\treturn [$tw.language.getString(\\\"Error/Filter\\\") + \\\": \\\" + e];\\n\\t\\t};\\n\\t}\\n\\t// Get the hashmap of filter operator functions\\n\\tvar filterOperators = this.getFilterOperators();\\n\\t// Assemble array of functions, one for each operation\\n\\tvar operationFunctions = [];\\n\\t// Step through the operations\\n\\tvar self = this;\\n\\t$tw.utils.each(filterParseTree,function(operation) {\\n\\t\\t// Create a function for the chain of operators in the operation\\n\\t\\tvar operationSubFunction = function(source,widget) {\\n\\t\\t\\tvar accumulator = source,\\n\\t\\t\\t\\tresults = [],\\n\\t\\t\\t\\tcurrTiddlerTitle = widget && widget.getVariable(\\\"currentTiddler\\\");\\n\\t\\t\\t$tw.utils.each(operation.operators,function(operator) {\\n\\t\\t\\t\\tvar operands = [],\\n\\t\\t\\t\\t\\toperatorFunction;\\n\\t\\t\\t\\tif(!operator.operator) {\\n\\t\\t\\t\\t\\t// Use the \\\"title\\\" operator if no operator is specified\\n\\t\\t\\t\\t\\toperatorFunction = filterOperators.title;\\n\\t\\t\\t\\t} else if(!filterOperators[operator.operator]) {\\n\\t\\t\\t\\t\\t// Unknown operators treated as \\\"[unknown]\\\" - at run time we can distinguish between a custom operator and falling back to the default \\\"field\\\" operator\\n\\t\\t\\t\\t\\toperatorFunction = filterOperators[\\\"[unknown]\\\"];\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t// Use the operator function\\n\\t\\t\\t\\t\\toperatorFunction = filterOperators[operator.operator];\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t$tw.utils.each(operator.operands,function(operand) {\\n\\t\\t\\t\\t\\tif(operand.indirect) {\\n\\t\\t\\t\\t\\t\\toperand.value = self.getTextReference(operand.text,\\\"\\\",currTiddlerTitle);\\n\\t\\t\\t\\t\\t} else if(operand.variable) {\\n\\t\\t\\t\\t\\t\\tvar varTree = $tw.utils.parseFilterVariable(operand.text);\\n\\t\\t\\t\\t\\t\\toperand.value = widgetClass.evaluateVariable(widget,varTree.name,{params: varTree.params, source: source})[0] || \\\"\\\";\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\toperand.value = operand.text;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\toperands.push(operand.value);\\n\\t\\t\\t\\t});\\n\\n\\t\\t\\t\\t// Invoke the appropriate filteroperator module\\n\\t\\t\\t\\tresults = operatorFunction(accumulator,{\\n\\t\\t\\t\\t\\t\\t\\toperator: operator.operator,\\n\\t\\t\\t\\t\\t\\t\\toperand: o
2731perands.length > 0 ? operands[0] : undefined,\\n\\t\\t\\t\\t\\t\\t\\toperands: operands,\\n\\t\\t\\t\\t\\t\\t\\tprefix: operator.prefix,\\n\\t\\t\\t\\t\\t\\t\\tsuffix: operator.suffix,\\n\\t\\t\\t\\t\\t\\t\\tsuffixes: operator.suffixes,\\n\\t\\t\\t\\t\\t\\t\\tregexp: operator.regexp\\n\\t\\t\\t\\t\\t\\t},{\\n\\t\\t\\t\\t\\t\\t\\twiki: self,\\n\\t\\t\\t\\t\\t\\t\\twidget: widget\\n\\t\\t\\t\\t\\t\\t});\\n\\t\\t\\t\\tif($tw.utils.isArray(results)) {\\n\\t\\t\\t\\t\\taccumulator = self.makeTiddlerIterator(results);\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\taccumulator = results;\\n\\t\\t\\t\\t}\\n\\t\\t\\t});\\n\\t\\t\\tif($tw.utils.isArray(results)) {\\n\\t\\t\\t\\treturn results;\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tvar resultArray = [];\\n\\t\\t\\t\\tresults(function(tiddler,title) {\\n\\t\\t\\t\\t\\tresultArray.push(title);\\n\\t\\t\\t\\t});\\n\\t\\t\\t\\treturn resultArray;\\n\\t\\t\\t}\\n\\t\\t};\\n\\t\\tvar filterRunPrefixes = self.getFilterRunPrefixes();\\n\\t\\t// Wrap the operator functions in a wrapper function that depends on the prefix\\n\\t\\toperationFunctions.push((function() {\\n\\t\\t\\tvar options = {wiki: self, suffixes: operation.suffixes || []};\\n\\t\\t\\tswitch(operation.prefix || \\\"\\\") {\\n\\t\\t\\t\\tcase \\\"\\\": // No prefix means that the operation is unioned into the result\\n\\t\\t\\t\\t\\treturn filterRunPrefixes[\\\"or\\\"](operationSubFunction, options);\\n\\t\\t\\t\\tcase \\\"=\\\": // The results of the operation are pushed into the result without deduplication\\n\\t\\t\\t\\t\\treturn filterRunPrefixes[\\\"all\\\"](operationSubFunction, options);\\n\\t\\t\\t\\tcase \\\"-\\\": // The results of this operation are removed from the main result\\n\\t\\t\\t\\t\\treturn filterRunPrefixes[\\\"except\\\"](operationSubFunction, options);\\n\\t\\t\\t\\tcase \\\"+\\\": // This operation is applied to the main results so far\\n\\t\\t\\t\\t\\treturn filterRunPrefixes[\\\"and\\\"](operationSubFunction, options);\\n\\t\\t\\t\\tcase \\\"~\\\": // This operation is unioned into the result only if the main result so far is empty\\n\\t\\t\\t\\t\\treturn filterRunPrefixes[\\\"else\\\"](operationSubFunction, options);\\n\\t\\t\\t\\tdefault: \\n\\t\\t\\t\\t\\tif(operation.namedPrefix && filterRunPrefixes[operation.namedPrefix]) {\\n\\t\\t\\t\\t\\t\\treturn filterRunPrefixes[operation.namedPrefix](operationSubFunction, options);\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\treturn function(results,source,widget) {\\n\\t\\t\\t\\t\\t\\t\\tresults.clear();\\n\\t\\t\\t\\t\\t\\t\\tresults.push($tw.language.getString(\\\"Error/FilterRunPrefix\\\"));\\n\\t\\t\\t\\t\\t\\t};\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t})());\\n\\t});\\n\\t// Return a function that applies the operations to a source iterator of tiddler titles\\n\\tvar fnMeasured = $tw.perf.measure(\\\"filter: \\\" + filterString,function filterFunction(source,widget) {\\n\\t\\tif(!source) {\\n\\t\\t\\tsource = self.each;\\n\\t\\t} else if(typeof source === \\\"object\\\") { // Array or hashmap\\n\\t\\t\\tsource = self.makeTiddlerIterator(source);\\n\\t\\t}\\n\\t\\tif(!widget) {\\n\\t\\t\\twidget = $tw.rootWidget;\\n\\t\\t}\\n\\t\\tvar results = new $tw.utils.LinkedList();\\n\\t\\tself.filterRecursionCount = (self.filterRecursionCount || 0) + 1;\\n\\t\\tif(self.filterRecursionCount \u003C MAX_FILTER_DEPTH) {\\n\\t\\t\\t$tw.utils.each(operationFunctions,function(operationFunction) {\\n\\t\\t\\t\\toperationFunction(results,source,widget);\\n\\t\\t\\t});\\n\\t\\t} else {\\n\\t\\t\\tresults.push(\\\"/**-- Excessive filter recursion --**/\\\");\\n\\t\\t}\\n\\t\\tself.filterRecursionCount = self.filterRecursionCount - 1;\\n\\t\\treturn results.toArray();\\n\\t});\\n\\tif(this.filterCacheCount >= 2000) {\\n\\t\\t// To prevent memory leak, we maintain an upper limit for cache size.\\n\\t\\t// Reset if exceeded. This should give us 95% of the benefit\\n\\t\\t// that no cache limit would give us.\\n\\t\\tthis.filterCache = Object.create(null);\\n\\t\\tthis.filterCacheCount = 0;\\n\\t}\\n\\tthis.filterCache[filterString] = fnMeasured;\\n\\tthis.filterCacheCount++;\\n\\treturn fnMeasured;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"wikimethod\"},\"$:/core/modules/indexers/backlinks-indexer.js\":{\"title\":\"$:/core/modules/indexers/backlinks-indexer.js\",\"text\":\"/*\\\\\\ntitle: $
2731:/core/modules/indexers/backlinks-indexer.js\\ntype: application/javascript\\nmodule-type: indexer\\n\\nIndexes the tiddlers' backlinks\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global modules: false */\\n\\\"use strict\\\";\\n\\n\\nfunction BacklinksIndexer(wiki) {\\n\\tthis.wiki = wiki;\\n}\\n\\nBacklinksIndexer.prototype.init = function() {\\n\\tthis.index = null;\\n}\\n\\nBacklinksIndexer.prototype.rebuild = function() {\\n\\tthis.index = null;\\n}\\n\\nBacklinksIndexer.prototype._getLinks = function(tiddler) {\\n\\tvar parser =  this.wiki.parseText(tiddler.fields.type, tiddler.fields.text, {});\\n\\tif(parser) {\\n\\t\\treturn this.wiki.extractLinks(parser.tree);\\n\\t}\\n\\treturn [];\\n}\\n\\nBacklinksIndexer.prototype.update = function(updateDescriptor) {\\n\\tif(!this.index) {\\n\\t\\treturn;\\n\\t}\\n\\tvar newLinks = [],\\n\\t    oldLinks = [],\\n\\t    self = this;\\n\\tif(updateDescriptor.old.exists) {\\n\\t\\toldLinks = this._getLinks(updateDescriptor.old.tiddler);\\n\\t}\\n\\tif(updateDescriptor.new.exists) {\\n\\t\\tnewLinks = this._getLinks(updateDescriptor.new.tiddler);\\n\\t}\\n\\n\\t$tw.utils.each(oldLinks,function(link) {\\n\\t\\tif(self.index[link]) {\\n\\t\\t\\tdelete self.index[link][updateDescriptor.old.tiddler.fields.title];\\n\\t\\t}\\n\\t});\\n\\t$tw.utils.each(newLinks,function(link) {\\n\\t\\tif(!self.index[link]) {\\n\\t\\t\\tself.index[link] = Object.create(null);\\n\\t\\t}\\n\\t\\tself.index[link][updateDescriptor.new.tiddler.fields.title] = true;\\n\\t});\\n}\\n\\nBacklinksIndexer.prototype.lookup = function(title) {\\n\\tif(!this.index) {\\n\\t\\tthis.index = Object.create(null);\\n\\t\\tvar self = this;\\n\\t\\tthis.wiki.forEachTiddler(function(title,tiddler) {\\n\\t\\t\\tvar links = self._getLinks(tiddler);\\n\\t\\t\\t$tw.utils.each(links, function(link) {\\n\\t\\t\\t\\tif(!self.index[link]) {\\n\\t\\t\\t\\t\\tself.index[link] = Object.create(null);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tself.index[link][title] = true;\\n\\t\\t\\t});\\n\\t\\t});\\n\\t}\\n\\tif(this.index[title]) {\\n\\t\\treturn Object.keys(this.index[title]);\\n\\t} else {\\n\\t\\treturn [];\\n\\t}\\n}\\n\\nexports.BacklinksIndexer = BacklinksIndexer;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"indexer\"},\"$:/core/modules/indexers/field-indexer.js\":{\"title\":\"$:/core/modules/indexers/field-indexer.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/indexers/field-indexer.js\\ntype: application/javascript\\nmodule-type: indexer\\n\\nIndexes the tiddlers with each field value\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global modules: false */\\n\\\"use strict\\\";\\n\\nvar DEFAULT_MAXIMUM_INDEXED_VALUE_LENGTH = 128;\\n\\nfunction FieldIndexer(wiki) {\\n\\tthis.wiki = wiki;\\n}\\n\\nFieldIndexer.prototype.init = function() {\\n\\tthis.index = null;\\n\\tthis.maxIndexedValueLength = DEFAULT_MAXIMUM_INDEXED_VALUE_LENGTH;\\n\\tthis.addIndexMethods();\\n}\\n\\n// Provided for testing\\nFieldIndexer.prototype.setMaxIndexedValueLength = function(length) {\\n\\tthis.index = null;\\n\\tthis.maxIndexedValueLength = length;\\n};\\n\\nFieldIndexer.prototype.addIndexMethods = function() {\\n\\tvar self = this;\\n\\t// get all tiddlers, including those overwrite shadow tiddlers\\n\\tthis.wiki.each.byField = function(name,value) {\\n\\t\\tvar lookup = self.lookup(name,value);\\n\\t\\treturn lookup && lookup.filter(function(title) {\\n\\t\\t\\treturn self.wiki.tiddlerExists(title)\\n\\t\\t});\\n\\t};\\n\\t// get shadow tiddlers, including shadow tiddlers that is overwritten\\n\\tthis.wiki.eachShadow.byField = function(name,value) {\\n\\t\\tvar lookup = self.lookup(name,value);\\n\\t\\treturn lookup && lookup.filter(function(title) {\\n\\t\\t\\treturn self.wiki.isShadowTiddler(title)\\n\\t\\t});\\n\\t};\\n\\tthis.wiki.eachTiddlerPlusShadows.byField = function(name,value) {\\n\\t\\tvar lookup = self.lookup(name,value);\\n\\t\\treturn lookup ? lookup.slice(0) : null;\\n\\t};\\n\\tthis.wiki.eachShadowPlusTiddlers.byField = function(name,value) {\\n\\t\\tvar lookup = self.lookup(name,value);\\n\\t\\treturn lookup ? lookup.slice(0) : null;\\n\\t};\\n};
2731\\n\\n/*\\nTear down and then rebuild the index as if all tiddlers have changed\\n*/\\nFieldIndexer.prototype.rebuild = function() {\\n\\t// Invalidate the index so that it will be rebuilt when it is next used\\n\\tthis.index = null;\\n};\\n\\n/*\\nBuild the index for a particular field\\n*/\\nFieldIndexer.prototype.buildIndexForField = function(name) {\\n\\tvar self = this;\\n\\t// Hashmap by field name of hashmap by field value of array of tiddler titles\\n\\tthis.index = this.index || Object.create(null);\\n\\tthis.index[name] = Object.create(null);\\n\\tvar baseIndex = this.index[name];\\n\\t// Update the index for each tiddler\\n\\tthis.wiki.eachTiddlerPlusShadows(function(tiddler,title) {\\n\\t\\tif(name in tiddler.fields) {\\n\\t\\t\\tvar value = tiddler.getFieldString(name);\\n\\t\\t\\t// Skip any values above the maximum length\\n\\t\\t\\tif(value.length \u003C self.maxIndexedValueLength) {\\n\\t\\t\\t\\tbaseIndex[value] = baseIndex[value] || [];\\n\\t\\t\\t\\tbaseIndex[value].push(title);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t});\\n};\\n\\n/*\\nUpdate the index in the light of a tiddler value changing; note that the title must be identical. (Renames are handled as a separate delete and create)\\nupdateDescriptor: {old: {tiddler: \u003Ctiddler>, shadow: \u003Cboolean>, exists: \u003Cboolean>},new: {tiddler: \u003Ctiddler>, shadow: \u003Cboolean>, exists: \u003Cboolean>}}\\n*/\\nFieldIndexer.prototype.update = function(updateDescriptor) {\\n\\tvar self = this;\\n\\t// Don't do anything if the index hasn't been built yet\\n\\tif(this.index === null) {\\n\\t\\treturn;\\n\\t}\\n\\t// Remove the old tiddler from the index\\n\\tif(updateDescriptor.old.tiddler) {\\n\\t\\t$tw.utils.each(this.index,function(indexEntry,name) {\\n\\t\\t\\tif(name in updateDescriptor.old.tiddler.fields) {\\n\\t\\t\\t\\tvar value = updateDescriptor.old.tiddler.getFieldString(name),\\n\\t\\t\\t\\t\\ttiddlerList = indexEntry[value];\\n\\t\\t\\t\\tif(tiddlerList) {\\n\\t\\t\\t\\t\\tvar index = tiddlerList.indexOf(updateDescriptor.old.tiddler.fields.title);\\n\\t\\t\\t\\t\\tif(index !== -1) {\\n\\t\\t\\t\\t\\t\\ttiddlerList.splice(index,1);\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t});\\n\\t}\\n\\t// Add the new tiddler to the index\\n\\tif(updateDescriptor[\\\"new\\\"].tiddler) {\\n\\t\\t$tw.utils.each(this.index,function(indexEntry,name) {\\n\\t\\t\\tif(name in updateDescriptor[\\\"new\\\"].tiddler.fields) {\\n\\t\\t\\t\\tvar value = updateDescriptor[\\\"new\\\"].tiddler.getFieldString(name);\\n\\t\\t\\t\\tif(value.length \u003C self.maxIndexedValueLength) {\\n\\t\\t\\t\\t\\tindexEntry[value] = indexEntry[value] || [];\\n\\t\\t\\t\\t\\tindexEntry[value].push(updateDescriptor[\\\"new\\\"].tiddler.fields.title);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t});\\n\\t}\\n};\\n\\n// Lookup the given field returning a list of tiddler titles\\nFieldIndexer.prototype.lookup = function(name,value) {\\n\\t// Fail the lookup if the value is too long\\n\\tif(value.length >= this.maxIndexedValueLength) {\\n\\t\\treturn null;\\n\\t}\\n\\t// Update the index if it has yet to be built\\n\\tif(this.index === null || !this.index[name]) {\\n\\t\\tthis.buildIndexForField(name);\\n\\t}\\n\\treturn this.index[name][value] || [];\\n};\\n\\nexports.FieldIndexer = FieldIndexer;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"indexer\"},\"$:/core/modules/indexers/tag-indexer.js\":{\"title\":\"$:/core/modules/indexers/tag-indexer.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/indexers/tag-indexer.js\\ntype: application/javascript\\nmodule-type: indexer\\n\\nIndexes the tiddlers with each tag\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global modules: false */\\n\\\"use strict\\\";\\n\\nfunction TagIndexer(wiki) {\\n\\tthis.wiki = wiki;\\n}\\n\\nTagIndexer.prototype.init = function() {\\n\\tthis.subIndexers = [\\n\\t\\tnew TagSubIndexer(this,\\\"each\\\"),\\n\\t\\tnew TagSubIndexer(this,\\\"eachShadow\\\"),\\n\\t\\tnew TagSubIndexer(this,\\\"eachTiddlerPlusShadows\\\"),\\n\\t\\tnew TagSubIndexer(this,\\\"eachShadowPlusTiddlers\\\")\\n\\t];\\n\\t$tw.utils.each(this.subIndexers,function(subIndexer) {\\n\\t\\t
2731subIndexer.addIndexMethod();\\n\\t});\\n};\\n\\nTagIndexer.prototype.rebuild = function() {\\n\\t$tw.utils.each(this.subIndexers,function(subIndexer) {\\n\\t\\tsubIndexer.rebuild();\\n\\t});\\n};\\n\\nTagIndexer.prototype.update = function(updateDescriptor) {\\n\\t$tw.utils.each(this.subIndexers,function(subIndexer) {\\n\\t\\tsubIndexer.update(updateDescriptor);\\n\\t});\\n};\\n\\nfunction TagSubIndexer(indexer,iteratorMethod) {\\n\\tthis.indexer = indexer;\\n\\tthis.iteratorMethod = iteratorMethod;\\n\\tthis.index = null; // Hashmap of tag title to {isSorted: bool, titles: [array]} or null if not yet initialised\\n}\\n\\nTagSubIndexer.prototype.addIndexMethod = function() {\\n\\tvar self = this;\\n\\tthis.indexer.wiki[this.iteratorMethod].byTag = function(tag) {\\n\\t\\treturn self.lookup(tag).slice(0);\\n\\t};\\n};\\n\\nTagSubIndexer.prototype.rebuild = function() {\\n\\tvar self = this;\\n\\t// Hashmap by tag of array of {isSorted:, titles:[]}\\n\\tthis.index = Object.create(null);\\n\\t// Add all the tags\\n\\tthis.indexer.wiki[this.iteratorMethod](function(tiddler,title) {\\n\\t\\t$tw.utils.each(tiddler.fields.tags,function(tag) {\\n\\t\\t\\tif(!self.index[tag]) {\\n\\t\\t\\t\\tself.index[tag] = {isSorted: false, titles: [title]};\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tself.index[tag].titles.push(title);\\n\\t\\t\\t}\\n\\t\\t});\\n\\t});\\n};\\n\\nTagSubIndexer.prototype.update = function(updateDescriptor) {\\n\\tthis.index = null;\\n};\\n\\nTagSubIndexer.prototype.lookup = function(tag) {\\n\\t// Update the index if it has yet to be built\\n\\tif(this.index === null) {\\n\\t\\tthis.rebuild();\\n\\t}\\n\\tvar indexRecord = this.index[tag];\\n\\tif(indexRecord) {\\n\\t\\tif(!indexRecord.isSorted) {\\n\\t\\t\\tif(this.indexer.wiki.sortByList) {\\n\\t\\t\\t\\tindexRecord.titles = this.indexer.wiki.sortByList(indexRecord.titles,tag);\\n\\t\\t\\t}\\n\\t\\t\\tindexRecord.isSorted = true;\\n\\t\\t}\\n\\t\\treturn indexRecord.titles;\\n\\t} else {\\n\\t\\treturn [];\\n\\t}\\n};\\n\\n\\nexports.TagIndexer = TagIndexer;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"indexer\"},\"$:/core/modules/info/platform.js\":{\"title\":\"$:/core/modules/info/platform.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/info/platform.js\\ntype: application/javascript\\nmodule-type: info\\n\\nInitialise basic platform $:/info/ tiddlers\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.getInfoTiddlerFields = function(updateInfoTiddlersCallback) {\\n\\tvar mapBoolean = function(value) {return value ? \\\"yes\\\" : \\\"no\\\";},\\n\\t\\tinfoTiddlerFields = [];\\n\\t// Basics\\n\\tinfoTiddlerFields.push({title: \\\"$:/info/browser\\\", text: mapBoolean(!!$tw.browser)});\\n\\tinfoTiddlerFields.push({title: \\\"$:/info/node\\\", text: mapBoolean(!!$tw.node)});\\n\\tinfoTiddlerFields.push({title: \\\"$:/info/startup-timestamp\\\", text: $tw.utils.stringifyDate(new Date())});\\n\\tif($tw.browser) {\\n\\t\\t// Document location\\n\\t\\tvar setLocationProperty = function(name,value) {\\n\\t\\t\\t\\tinfoTiddlerFields.push({title: \\\"$:/info/url/\\\" + name, text: value});\\n\\t\\t\\t},\\n\\t\\t\\tlocation = document.location;\\n\\t\\tsetLocationProperty(\\\"full\\\", (location.toString()).split(\\\"#\\\")[0]);\\n\\t\\tsetLocationProperty(\\\"host\\\", location.host);\\n\\t\\tsetLocationProperty(\\\"hostname\\\", location.hostname);\\n\\t\\tsetLocationProperty(\\\"protocol\\\", location.protocol);\\n\\t\\tsetLocationProperty(\\\"port\\\", location.port);\\n\\t\\tsetLocationProperty(\\\"pathname\\\", location.pathname);\\n\\t\\tsetLocationProperty(\\\"search\\\", location.search);\\n\\t\\tsetLocationProperty(\\\"origin\\\", location.origin);\\n\\t\\t// Screen size\\n\\t\\tinfoTiddlerFields.push({title: \\\"$:/info/browser/screen/width\\\", text: window.screen.width.toString()});\\n\\t\\tinfoTiddlerFields.push({title: \\\"$:/info/browser/screen/height\\\", text: window.screen.height.toString()});\\n \\t\\t// Dark mode through event listener on MediaQueryList\\n \\t\\tvar mqList = window.matchMedia(\\\"(prefers-color-scheme: dark)\\\"),\\n \\t\\t\\tgetDarkModeTiddler = function() {return {title: \\\"$:/info/darkmode\\\", text: mqList.matches ? \\\"yes\\\" : \\\"no\\\"};};\\n \\t\\tinfoTiddlerFields.push(getDarkModeTiddler());\\n \\t\\tmqList.addListener(function(event) {\\n \\t\\t\\tupdateInfoTiddlersCallback([getDarkModeTiddler()]);\\n \\t\\t});\\n\\t\\t// Language\\n\\t\\tinfoTiddlerFields.push({title: \\\"$:/info/browser/language\\\", text: navigator.language || \\\"\\\"});\\n\\t}\\n\\treturn infoTiddlerFields;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"info\"},\"$:/core/modules/keyboard.js\":{\"title\":\"$:/core/modules/keyboard.js\",\"text\":\"/*\\\\\\ntitle: $
2731:/core/modules/keyboard.js\\ntype: application/javascript\\nmodule-type: global\\n\\nKeyboard handling utilities\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar namedKeys = {\\n\\t\\\"cancel\\\": 3,\\n\\t\\\"help\\\": 6,\\n\\t\\\"backspace\\\": 8,\\n\\t\\\"tab\\\": 9,\\n\\t\\\"clear\\\": 12,\\n\\t\\\"return\\\": 13,\\n\\t\\\"enter\\\": 13,\\n\\t\\\"pause\\\": 19,\\n\\t\\\"escape\\\": 27,\\n\\t\\\"space\\\": 32,\\n\\t\\\"page_up\\\": 33,\\n\\t\\\"page_down\\\": 34,\\n\\t\\\"end\\\": 35,\\n\\t\\\"home\\\": 36,\\n\\t\\\"left\\\": 37,\\n\\t\\\"up\\\": 38,\\n\\t\\\"right\\\": 39,\\n\\t\\\"down\\\": 40,\\n\\t\\\"printscreen\\\": 44,\\n\\t\\\"insert\\\": 45,\\n\\t\\\"delete\\\": 46,\\n\\t\\\"0\\\": 48,\\n\\t\\\"1\\\": 49,\\n\\t\\\"2\\\": 50,\\n\\t\\\"3\\\": 51,\\n\\t\\\"4\\\": 52,\\n\\t\\\"5\\\": 53,\\n\\t\\\"6\\\": 54,\\n\\t\\\"7\\\": 55,\\n\\t\\\"8\\\": 56,\\n\\t\\\"9\\\": 57,\\n\\t\\\"firefoxsemicolon\\\": 59,\\n\\t\\\"firefoxequals\\\": 61,\\n\\t\\\"a\\\": 65,\\n\\t\\\"b\\\": 66,\\n\\t\\\"c\\\": 67,\\n\\t\\\"d\\\": 68,\\n\\t\\\"e\\\": 69,\\n\\t\\\"f\\\": 70,\\n\\t\\\"g\\\": 71,\\n\\t\\\"h\\\": 72,\\n\\t\\\"i\\\": 73,\\n\\t\\\"j\\\": 74,\\n\\t\\\"k\\\": 75,\\n\\t\\\"l\\\": 76,\\n\\t\\\"m\\\": 77,\\n\\t\\\"n\\\": 78,\\n\\t\\\"o\\\": 79,\\n\\t\\\"p\\\": 80,\\n\\t\\\"q\\\": 81,\\n\\t\\\"r\\\": 82,\\n\\t\\\"s\\\": 83,\\n\\t\\\"t\\\": 84,\\n\\t\\\"u\\\": 85,\\n\\t\\\"v\\\": 86,\\n\\t\\\"w\\\": 87,\\n\\t\\\"x\\\": 88,\\n\\t\\\"y\\\": 89,\\n\\t\\\"z\\\": 90,\\n\\t\\\"numpad0\\\": 96,\\n\\t\\\"numpad1\\\": 97,\\n\\t\\\"numpad2\\\": 98,\\n\\t\\\"numpad3\\\": 99,\\n\\t\\\"numpad4\\\": 100,\\n\\t\\\"numpad5\\\": 101,\\n\\t\\\"numpad6\\\": 102,\\n\\t\\\"numpad7\\\": 103,\\n\\t\\\"numpad8\\\": 104,\\n\\t\\\"numpad9\\\": 105,\\n\\t\\\"multiply\\\": 106,\\n\\t\\\"add\\\": 107,\\n\\t\\\"separator\\\": 108,\\n\\t\\\"subtract\\\": 109,\\n\\t\\\"decimal\\\": 110,\\n\\t\\\"divide\\\": 111,\\n\\t\\\"f1\\\": 112,\\n\\t\\\"f2\\\": 113,\\n\\t\\\"f3\\\": 114,\\n\\t\\\"f4\\\": 115,\\n\\t\\\"f5\\\": 116,\\n\\t\\\"f6\\\": 117,\\n\\t\\\"f7\\\": 118,\\n\\t\\\"f8\\\": 119,\\n\\t\\\"f9\\\": 120,\\n\\t\\\"f10\\\": 121,\\n\\t\\\"f11\\\": 122,\\n\\t\\\"f12\\\": 123,\\n\\t\\\"f13\\\": 124,\\n\\t\\\"f14\\\": 125,\\n\\t\\\"f15\\\": 126,\\n\\t\\\"f16\\\": 127,\\n\\t\\\"f17\\\": 128,\\n\\t\\\"f18\\\": 129,\\n\\t\\\"f19\\\": 130,\\n\\t\\\"f20\\\": 131,\\n\\t\\\"f21\\\": 132,\\n\\t\\\"f22\\\": 133,\\n\\t\\\"f23\\\": 134,\\n\\t\\\"f24\\\": 135,\\n\\t\\\"firefoxminus\\\": 173,\\n\\t\\\"semicolon\\\": 186,\\n\\t\\\"equals\\\": 187,\\n\\t\\\"comma\\\": 188,\\n\\t\\\"dash\\\": 189,\\n\\t\\\"period\\\": 190,\\n\\t\\\"slash\\\": 191,\\n\\t\\\"backquote\\\": 192,\\n\\t\\\"openbracket\\\": 219,\\n\\t\\\"backslash\\\": 220,\\n\\t\\\"closebracket\\\": 221,\\n\\t\\\"quote\\\": 222\\n};\\n\\nfunction KeyboardManager(options) {\\n\\tvar self = this;\\n\\toptions = options || \\\"\\\";\\n\\t// Save the named key hashmap\\n\\tthis.namedKeys = namedKeys;\\n\\t// Create a reverse mapping of code to keyname\\n\\tthis.keyNames = [];\\n\\t$tw.utils.each(namedKeys,function(keyCode,name) {\\n\\t\\tself.keyNames[keyCode] = name.substr(0,1).toUpperCase() + name.substr(1);\\n\\t});\\n\\t// Save the platform-specific name of the \\\"meta\\\" key\\n\\tthis.metaKeyName = $tw.platform.isMac ? \\\"cmd-\\\" : \\\"win-\\\";\\n\\tthis.shortcutKeysList = [], // Stores the shortcut-key descriptors\\n\\tthis.shortcutActionList = [], // Stores the corresponding action strings\\n\\tthis.shortcutParsedList = []; // Stores the parsed key descriptors\\n\\tthis.shortcutPriorityList = []; // Stores the parsed shortcut priority\\n\\tthis.lookupNames = [\\\"shortcuts\\\"];\\n\\tthis.lookupNames.push($tw.platform.isMac ? \\\"shortcuts-mac\\\" : \\\"shortcuts-not-mac\\\")\\n\\tthis.lookupNames.push($tw.platform.isWindows ? \\\"shortcuts-windows\\\" : \\\"shortcuts-not-windows\\\");\\n\\tthis.lookupNames.push($tw.platform.isLinux ? \\\"shortcuts-linux\\\" : \\\"shortcuts-not-linux\\\");\\n\\tthis.updateShortcutLists(this.getShortcutTiddlerList());
2731\\n\\t$tw.wiki.addEventListener(\\\"change\\\",function(changes) {\\n\\t\\tself.handleShortcutChanges(changes);\\n\\t});\\n}\\n\\n/*\\nReturn an array of keycodes for the modifier keys ctrl, shift, alt, meta\\n*/\\nKeyboardManager.prototype.getModifierKeys = function() {\\n\\treturn [\\n\\t\\t16, // Shift\\n\\t\\t17, // Ctrl\\n\\t\\t18, // Alt\\n\\t\\t20, // CAPS LOCK\\n\\t\\t91, // Meta (left)\\n\\t\\t93, // Meta (right)\\n\\t\\t224 // Meta (Firefox)\\n\\t]\\n};\\n\\n/*\\nParses a key descriptor into the structure:\\n{\\n\\tkeyCode: numeric keycode\\n\\tshiftKey: boolean\\n\\taltKey: boolean\\n\\tctrlKey: boolean\\n\\tmetaKey: boolean\\n}\\nKey descriptors have the following format:\\n\\tctrl+enter\\n\\tctrl+shift+alt+A\\n*/\\nKeyboardManager.prototype.parseKeyDescriptor = function(keyDescriptor,options) {\\n\\tvar components = keyDescriptor.split(/\\\\+|\\\\-/),\\n\\t\\tinfo = {\\n\\t\\t\\tkeyCode: 0,\\n\\t\\t\\tshiftKey: false,\\n\\t\\t\\taltKey: false,\\n\\t\\t\\tctrlKey: false,\\n\\t\\t\\tmetaKey: false\\n\\t\\t};\\n\\tfor(var t=0; t\u003Ccomponents.length; t++) {\\n\\t\\tvar s = components[t].toLowerCase(),\\n\\t\\t\\tc = s.charCodeAt(0);\\n\\t\\t// Look for modifier keys\\n\\t\\tif(s === \\\"ctrl\\\") {\\n\\t\\t\\tinfo.ctrlKey = true;\\n\\t\\t} else if(s === \\\"shift\\\") {\\n\\t\\t\\tinfo.shiftKey = true;\\n\\t\\t} else if(s === \\\"alt\\\") {\\n\\t\\t\\tinfo.altKey = true;\\n\\t\\t} else if(s === \\\"meta\\\" || s === \\\"cmd\\\" || s === \\\"win\\\") {\\n\\t\\t\\tinfo.metaKey = true;\\n\\t\\t}\\n\\t\\t// Replace named keys with their code\\n\\t\\tif(this.namedKeys[s]) {\\n\\t\\t\\tinfo.keyCode = this.namedKeys[s];\\n\\t\\t}\\n\\t}\\n\\tif(options.keyDescriptor) {\\n\\t\\tinfo.keyDescriptor = options.keyDescriptor;\\n\\t}\\n\\tif(info.keyCode) {\\n\\t\\treturn info;\\n\\t} else {\\n\\t\\treturn null;\\n\\t}\\n};\\n\\n/*\\nParse a list of key descriptors into an array of keyInfo objects. The key descriptors can be passed as an array of strings or a space separated string\\n*/\\nKeyboardManager.prototype.parseKeyDescriptors = function(keyDescriptors,options) {\\n\\tvar self = this;\\n\\toptions = options || {};\\n\\toptions.stack = options.stack || [];\\n\\tvar wiki = options.wiki || $tw.wiki;\\n\\tif(typeof keyDescriptors === \\\"string\\\" && keyDescriptors === \\\"\\\") {\\n\\t\\treturn [];\\n\\t}\\n\\tif(!$tw.utils.isArray(keyDescriptors)) {\\n\\t\\tkeyDescriptors = keyDescriptors.split(\\\" \\\");\\n\\t}\\n\\tvar result = [];\\n\\t$tw.utils.each(keyDescriptors,function(keyDescriptor) {\\n\\t\\t// Look for a named shortcut\\n\\t\\tif(keyDescriptor.substr(0,2) === \\\"((\\\" && keyDescriptor.substr(-2,2) === \\\"))\\\") {\\n\\t\\t\\tif(options.stack.indexOf(keyDescriptor) === -1) {\\n\\t\\t\\t\\toptions.stack.push(keyDescriptor);\\n\\t\\t\\t\\tvar name = keyDescriptor.substring(2,keyDescriptor.length - 2),\\n\\t\\t\\t\\t\\tlookupName = function(configName) {\\n\\t\\t\\t\\t\\t\\tvar keyDescriptors = wiki.getTiddlerText(\\\"$:/config/\\\" + configName + \\\"/\\\" + name);\\n\\t\\t\\t\\t\\t\\tif(keyDescriptors) {\\n\\t\\t\\t\\t\\t\\t\\toptions.keyDescriptor = keyDescriptor;\\n\\t\\t\\t\\t\\t\\t\\tresult.push.apply(result,self.parseKeyDescriptors(keyDescriptors,options));\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t};\\n\\t\\t\\t\\t$tw.utils.each(self.lookupNames,function(platformDescriptor) {\\n\\t\\t\\t\\t\\tlookupName(platformDescriptor);\\n\\t\\t\\t\\t});\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\t\\t\\tresult.push(self.parseKeyDescriptor(keyDescriptor,options));\\n\\t\\t}\\n\\t});\\n\\treturn result;\\n};\\n\\nKeyboardManager.prototype.getPrintableShortcuts = function(keyInfoArray) {\\n\\tvar self = this,\\n\\t\\tresult = [];\\n\\t$tw.utils.each(keyInfoArray,function(keyInfo) {\\n\\t\\tif(keyInfo) {\\n\\t\\t\\tresult.push((keyInfo.ctrlKey ? \\\"ctrl-\\\" : \\\"\\\") + \\n\\t\\t\\t\\t   (keyInfo.shiftKey ? \\\"shift-\\\" : \\\"\\\") + \\n\\t\\t\\t\\t   (keyInfo.altKey ? \\\"alt-\\\" : \\\"\\\") + \\n\\t\\t\\t\\t   (keyInfo.metaKey ? self.metaKeyName : \\\"\\\") + \\n\\t\\t\\t\\t   (self.keyNames[keyInfo.keyCode]));\\n\\t\\t}\\n\\t});\\n\\treturn result;\\n}\\n\\nKeyboardManager.prototype.checkKeyDescriptor = function(event,keyInfo) {\\n\\treturn keyInfo &&\\n\\t\\t\\tevent.keyCode === keyInfo.keyCode && \\n\\t\\t\\tevent.shiftKey === keyInfo.shiftKey && \\n\\t\\t\\tevent.altKey === keyInfo.altKey && \\n\\t\\t\\tevent.ctrlKey === keyInfo.ctrlKey && \\n\\t\\t\\tevent.metaKey === keyInfo.metaKey;\\n};\\n\\nKeyboardManager.prototype.checkKeyDescriptors = function(event,keyInfoArray) {\\n\\treturn (this.getMatchingKeyDescriptor(event,keyInfoArray) !== null);\\n};\\n\\nKeyboardManager.prototype.getMatchingKeyDescriptor = function(event,keyInfoArray) {\\n\\tfor(var t=0; t\u003CkeyInfoArray.length; t++) {\\n\\t\\tif(this.checkKeyDescriptor(event,keyInfoArray[t])) {\\n\\t\\t\\treturn keyInfoArray[t];\\n\\t\\t}\\n\\t}\\n\\treturn null;\\n};\\n\\nKeyboardManager.prototype.getEventModifierKeyDescriptor = function(event) {\\n\\treturn event.ctrlKey && !event.shiftKey\\t&& !event.altKey && !event.metaKey ? \\\"ctrl\\\" : \\n\\t\\tevent.shiftKey && !event.ctrlKey && !event.altKey && !event.metaKey ? \\\"shift\\\" : \\n\\t\\tevent.ctrlKey && event.shiftKey && !event.altKey && !event.metaKey ? \\\"ctrl-shift\\\" : \\n\\t\\tevent.altKey && !event.shiftKey && !event.ctrlKey && !event.metaKey ? \\\"alt\\\" : \\n\\t\\tevent.altKey && event.shiftKey && !event.ctrlKey && !event.metaKey ? \\\"alt-shift\\\" : \\n\\t\\tevent.altKey && event.ctrlKey && !event.shiftKey && !event.metaKey ? \\\"ctrl-alt\\\" : \\n\\t\\tevent.altKey && event.shiftKey && event.ctrlKey && !event.metaKey ? \\\"ctrl-alt-shift\\\" : \\n\\t\\tevent.metaKey && !event.ctrlKey && !event.shiftKey && !event.altKey ? \\\"meta\\\" : \\n\\t\\tevent.metaKey && event.ctrlKey && !event.shiftKey && !event.altKey ? \\\"meta-ctrl\\\" :\\n\\t\\tevent.metaKey && event.ctrlKey && event.shiftKey && !event.altKey ? \\\"meta-ctrl-shift\\\" :\\n\\t\\tevent.metaKey && event.ctrlKey && event.shiftKey && event.altKey ? \\\"meta-ctrl-alt-shift\\\" : \\\"normal\\\";\\n};\\n\\nKeyboardManager.prototype.getShortcutTiddlerList = function() {\\n\\treturn $tw.wiki.getTiddlersWithTag(\\\"$:/tags/KeyboardShortcut\\\");\\n};\\n\\nKeyboardManager.prototype.updateShortcutLists = function(tiddlerList) {\\n\\tthis.shortcutTiddlers = tiddlerList;\\n\\tfor(var i=0; i\u003CtiddlerList.length; i++) {\\n\\t\\tvar title = tiddlerList[i],\\n\\t\\t\\ttiddlerFields = $tw.wiki.getTiddler(title).fields;\\n\\t\\tthis.shortcutKeysList[i] = tiddlerFields.key !== undefined ? tid
2731dlerFields.key : undefined;\\n\\t\\tthis.shortcutActionList[i] = tiddlerFields.text;\\n\\t\\tthis.shortcutParsedList[i] = this.shortcutKeysList[i] !== undefined ? this.parseKeyDescriptors(this.shortcutKeysList[i]) : undefined;\\n\\t\\tthis.shortcutPriorityList[i] = tiddlerFields.priority === \\\"yes\\\" ? true : false;\\n\\t}\\n};\\n\\n/*\\nevent: the keyboard event object\\noptions:\\n\\tonlyPriority: true if only priority global shortcuts should be invoked\\n*/\\nKeyboardManager.prototype.handleKeydownEvent = function(event, options) {\\n\\toptions = options || {};\\n\\tvar key, action;\\n\\tfor(var i=0; i\u003Cthis.shortcutTiddlers.length; i++) {\\n\\t\\tif(options.onlyPriority && this.shortcutPriorityList[i] !== true) {\\n\\t\\t\\tcontinue;\\n\\t\\t}\\n\\n\\t\\tif(this.shortcutParsedList[i] !== undefined && this.checkKeyDescriptors(event,this.shortcutParsedList[i])) {\\n\\t\\t\\tkey = this.shortcutParsedList[i];\\n\\t\\t\\taction = this.shortcutActionList[i];\\n\\t\\t}\\n\\t}\\n\\tif(key !== undefined) {\\n\\t\\tevent.preventDefault();\\n\\t\\tevent.stopPropagation();\\n\\t\\t$tw.rootWidget.invokeActionString(action,$tw.rootWidget,event);\\n\\t\\treturn true;\\n\\t}\\n\\treturn false;\\n};\\n\\nKeyboardManager.prototype.detectNewShortcuts = function(changedTiddlers) {\\n\\tvar shortcutConfigTiddlers = [],\\n\\t\\thandled = false;\\n\\t$tw.utils.each(this.lookupNames,function(platformDescriptor) {\\n\\t\\tvar descriptorString = \\\"$:/config/\\\" + platformDescriptor + \\\"/\\\";\\n\\t\\tObject.keys(changedTiddlers).forEach(function(configTiddler) {\\n\\t\\t\\tvar configString = configTiddler.substr(0, configTiddler.lastIndexOf(\\\"/\\\") + 1);\\n\\t\\t\\tif(configString === descriptorString) {\\n\\t\\t\\t\\tshortcutConfigTiddlers.push(configTiddler);\\n\\t\\t\\t\\thandled = true;\\n\\t\\t\\t}\\n\\t\\t});\\n\\t});\\n\\tif(handled) {\\n\\t\\treturn $tw.utils.hopArray(changedTiddlers,shortcutConfigTiddlers);\\n\\t} else {\\n\\t\\treturn false;\\n\\t}\\n};\\n\\nKeyboardManager.prototype.handleShortcutChanges = function(changedTiddlers) {\\n\\tvar newList = this.getShortcutTiddlerList();\\n\\tvar hasChanged = $tw.utils.hopArray(changedTiddlers,this.shortcutTiddlers) ? true :\\n\\t\\t($tw.utils.hopArray(changedTiddlers,newList) ? true :\\n\\t\\t(this.detectNewShortcuts(changedTiddlers))\\n\\t);\\n\\t// Re-cache shortcuts if something changed\\n\\tif(hasChanged) {\\n\\t\\tthis.updateShortcutLists(newList);\\n\\t}\\n};\\n\\nexports.KeyboardManager = KeyboardManager;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"global\"},\"$:/core/modules/language.js\":{\"title\":\"$:/core/modules/language.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/language.js\\ntype: application/javascript\\nmodule-type: global\\n\\nThe $tw.Language() manages translateable strings\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nCreate an instance of the language manager. Options include:\\nwiki: wiki from which to retrieve translation tiddlers\\n*/\\nfunction Language(options) {\\n\\toptions = options || \\\"\\\";\\n\\tthis.wiki = options.wiki || $tw.wiki;\\n}\\n\\n/*\\nReturn a wikified translateable string. The title is automatically prefixed with \\\"$:/language/\\\"\\nOptions include:\\nvariables: optional hashmap of variables to supply to the language wikification\\n*/\\nLanguage.prototype.getString = function(title,options) {\\n\\toptions = options || {};\\n\\ttitle = \\\"$:/language/\\\" + title;\\n\\treturn this.wiki.renderTiddler(\\\"text/plain\\\",title,{variables: options.variables});\\n};\\n\\n/*\\nReturn a raw, unwikified translateable string. The title is automatically prefixed with \\\"$:/language/\\\"\\n*/\\nLanguage.prototype.getRawString = function(title) {\\n\\ttitle = \\\"$:/language/\\\" + title;\\n\\treturn this.wiki.getTiddlerText(title);\\n};\\n\\nexports.Language = Language;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"global\"},\"$:/core/modules/macros/changecount.js\":{\"title\":\"$:/core/modules/macros/changecount.js\",\"text\":\"/*\\\\\\ntitle: $
2731:/core/modules/macros/changecount.js\\ntype: application/javascript\\nmodule-type: macro\\n\\nMacro to return the changecount for the current tiddler\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nInformation about this macro\\n*/\\n\\nexports.name = \\\"changecount\\\";\\n\\nexports.params = [];\\n\\n/*\\nRun the macro\\n*/\\nexports.run = function() {\\n\\treturn this.wiki.getChangeCount(this.getVariable(\\\"currentTiddler\\\")) + \\\"\\\";\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"macro\"},\"$:/core/modules/macros/contrastcolour.js\":{\"title\":\"$:/core/modules/macros/contrastcolour.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/macros/contrastcolour.js\\ntype: application/javascript\\nmodule-type: macro\\n\\nMacro to choose which of two colours has the highest contrast with a base colour\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nInformation about this macro\\n*/\\n\\nexports.name = \\\"contrastcolour\\\";\\n\\nexports.params = [\\n\\t{name: \\\"target\\\"},\\n\\t{name: \\\"fallbackTarget\\\"},\\n\\t{name: \\\"colourA\\\"},\\n\\t{name: \\\"colourB\\\"}\\n];\\n\\n/*\\nRun the macro\\n*/\\nexports.run = function(target,fallbackTarget,colourA,colourB) {\\n\\tvar rgbTarget = $tw.utils.parseCSSColor(target) || $tw.utils.parseCSSColor(fallbackTarget);\\n\\tif(!rgbTarget) {\\n\\t\\treturn colourA;\\n\\t}\\n\\tvar rgbColourA = $tw.utils.parseCSSColor(colourA),\\n\\t\\trgbColourB = $tw.utils.parseCSSColor(colourB);\\n\\tif(rgbColourA && !rgbColourB) {\\n\\t\\treturn rgbColourA;\\n\\t}\\n\\tif(rgbColourB && !rgbColourA) {\\n\\t\\treturn rgbColourB;\\n\\t}\\n\\tif(!rgbColourA && !rgbColourB) {\\n\\t\\t// If neither colour is readable, return a crude inverse of the target\\n\\t\\treturn [255 - rgbTarget[0],255 - rgbTarget[1],255 - rgbTarget[2],rgbTarget[3]];\\n\\t}\\n\\t// Colour brightness formula derived from http://www.w3.org/WAI/ER/WD-AERT/#color-contrast\\n\\tvar brightnessTarget = rgbTarget[0] * 0.299 + rgbTarget[1] * 0.587 + rgbTarget[2] * 0.114,\\n\\t\\tbrightnessA = rgbColourA[0] * 0.299 + rgbColourA[1] * 0.587 + rgbColourA[2] * 0.114,\\n\\t\\tbrightnessB = rgbColourB[0] * 0.299 + rgbColourB[1] * 0.587 + rgbColourB[2] * 0.114;\\n\\treturn Math.abs(brightnessTarget - brightnessA) > Math.abs(brightnessTarget - brightnessB) ? colourA : colourB;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"macro\"},\"$:/core/modules/macros/csvtiddlers.js\":{\"title\":\"$:/core/modules/macros/csvtiddlers.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/macros/csvtiddlers.js\\ntype: application/javascript\\nmodule-type: macro\\n\\nMacro to output tiddlers matching a filter to CSV\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nInformation about this macro\\n*/\\n\\nexports.name = \\\"csvtiddlers\\\";\\n\\nexports.params = [\\n\\t{name: \\\"filter\\\"},\\n\\t{name: \\\"format\\\"},\\n];\\n\\n/*\\nRun the macro\\n*/\\nexports.run = function(filter,format) {\\n\\tvar self = this,\\n\\t\\ttiddlers = this.wiki.filterTiddlers(filter),\\n\\t\\ttiddler,\\n\\t\\tfields = [],\\n\\t\\tt,f;\\n\\t// Collect all the fields\\n\\tfor(t=0;t\u003Ctiddlers.length; t++) {\\n\\t\\ttiddler = this.wiki.getTiddler(tiddlers[t]);\\n\\t\\tfor(f in tiddler.fields) {\\n\\t\\t\\tif(fields.indexOf(f) === -1) {\\n\\t\\t\\t\\tfields.push(f);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\t// Sort the fields and bring the standard ones to the front\\n\\tfields.sort();\\n\\t\\\"title text modified modifier created creator\\\".split(\\\" \\\").reverse().forEach(function(value,index) {\\n\\t\\tvar p = fields.indexOf(value);\\n\\t\\tif(p !== -1) {\\n\\t\\t\\tfields.splice(p,1);\\n\\t\\t\\tfields.unshift(value)\\n\\t\\t}\\n\\t});\\n\\t// Output the column headings\\n\\tvar output = [], row = [];\\n\\tfields.forEach(function(value) {\\n\\t\\trow.push(quoteAndEscape(value))\\n\\t});\\n\\toutput.push(row.join(\\\",\\\"));\\n\\t// Output each tiddler\\n\\tfor(var t=0;t\u003Ctiddlers.length; t++) {\\n\\t\\trow = [];\\n\\t\\ttiddler = this.wiki.getTiddler(tiddlers[t]);\\n\\t\\t\\tfor(f=0; f\u003Cfields.length; f++) {\\n\\t\\t\\t\\trow.push(quoteAndEscape(tiddler ? tiddler.getFieldString(fields[f]) || \\\"\\\" : \\\"\\\"));\\n\\t\\t\\t}\\n\\t\\toutput.push(row.join(\\\",\\\"));\\n\\t}\\n\\treturn output.join(\\\"\\\\n\\\");\\n};\\n\\nfunction quoteAndEscape(value) {\\n\\treturn \\\"\\\\\\\"\\\" + value.replace(/\\\"/mg,\\\"\\\\\\\"\\\\\\\"\\\") + \\\"\\\\\\\"\\\";\\n}\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"macro\"},\"$:/core/modules/macros/displayshortcuts.js\":{\"title\":\"$:/core/modules/macros/displayshortcuts.js\",\"text\":\"/*\\\\\\ntitle: $
2731:/core/modules/macros/displayshortcuts.js\\ntype: application/javascript\\nmodule-type: macro\\n\\nMacro to display a list of keyboard shortcuts in human readable form. Notably, it resolves named shortcuts like `((bold))` to the underlying keystrokes.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nInformation about this macro\\n*/\\n\\nexports.name = \\\"displayshortcuts\\\";\\n\\nexports.params = [\\n\\t{name: \\\"shortcuts\\\"},\\n\\t{name: \\\"prefix\\\"},\\n\\t{name: \\\"separator\\\"},\\n\\t{name: \\\"suffix\\\"}\\n];\\n\\n/*\\nRun the macro\\n*/\\nexports.run = function(shortcuts,prefix,separator,suffix) {\\n\\tvar shortcutArray = $tw.keyboardManager.getPrintableShortcuts($tw.keyboardManager.parseKeyDescriptors(shortcuts,{\\n\\t\\twiki: this.wiki\\n\\t}));\\n\\tif(shortcutArray.length > 0) {\\n\\t\\tshortcutArray.sort(function(a,b) {\\n\\t\\t    return a.toLowerCase().localeCompare(b.toLowerCase());\\n\\t\\t})\\n\\t\\treturn prefix + shortcutArray.join(separator) + suffix;\\n\\t} else {\\n\\t\\treturn \\\"\\\";\\n\\t}\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"macro\"},\"$:/core/modules/macros/jsontiddler.js\":{\"title\":\"$:/core/modules/macros/jsontiddler.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/macros/jsontiddler.js\\ntype: application/javascript\\nmodule-type: macro\\n\\nMacro to output a single tiddler to JSON\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nInformation about this macro\\n*/\\n\\nexports.name = \\\"jsontiddler\\\";\\n\\nexports.params = [\\n\\t{name: \\\"title\\\"}\\n];\\n\\n/*\\nRun the macro\\n*/\\nexports.run = function(title) {\\n\\ttitle = title || this.getVariable(\\\"currentTiddler\\\");\\n\\tvar tiddler = !!title && this.wiki.getTiddler(title),\\n\\t\\tfields = new Object();\\n\\tif(tiddler) {\\n\\t\\tfor(var field in tiddler.fields) {\\n\\t\\t\\tfields[field] = tiddler.getFieldString(field);\\n\\t\\t}\\n\\t}\\n\\treturn JSON.stringify(fields,null,$tw.config.preferences.jsonSpaces);\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"macro\"},\"$:/core/modules/macros/jsontiddlers.js\":{\"title\":\"$:/core/modules/macros/jsontiddlers.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/macros/jsontiddlers.js\\ntype: application/javascript\\nmodule-type: macro\\n\\nMacro to output tiddlers matching a filter to JSON\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nInformation about this macro\\n*/\\n\\nexports.name = \\\"jsontiddlers\\\";\\n\\nexports.params = [\\n\\t{name: \\\"filter\\\"},\\n\\t{name: \\\"spaces\\\"}\\n];\\n\\n/*\\nRun the macro\\n*/\\nexports.run = function(filter,spaces) {\\n\\treturn this.wiki.getTiddlersAsJson(filter,$tw.utils.parseInt(spaces));\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"macro\"},\"$:/core/modules/macros/makedatauri.js\":{\"title\":\"$:/core/modules/macros/makedatauri.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/macros/makedatauri.js\\ntype: application/javascript\\nmodule-type: macro\\n\\nMacro to convert a string of text to a data URI\\n\\n\u003C\u003Cmakedatauri text:\\\"Text to be converted\\\" type:\\\"text/vnd.tiddlywiki\\\">>\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nInformation about this macro\\n*/\\n\\nexports.name = \\\"makedatauri\\\";\\n\\nexports.params = [\\n\\t{name: \\\"text\\\"},\\n\\t{name: \\\"type\\\"},\\n\\t{name: \\\"_canonical_uri\\\"}\\n];\\n\\n/*\\nRun the macro\\n*/\\nexports.run = function(text,type,_canonical_uri) {\\n\\treturn $tw.utils.makeDataUri(text,type,_canonical_uri);\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"macro\"},\"$:/core/modules/macros/now.js\":{\"title\":\"$:/core/modules/macros/now.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/macros/now.js\\ntype: application/javascript\\nmodule-type: macro\\n\\nMacro to return a formatted version of the current time\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nInformation about this macro\\n*/\\n\\nexports.name = \\\"now\\\";\\n\\nexports.params = [\\n\\t{name: \\\"format\\\"}\\n];
2731\\n\\n/*\\nRun the macro\\n*/\\nexports.run = function(format) {\\n\\treturn $tw.utils.formatDateString(new Date(),format || \\\"0hh:0mm, DDth MMM YYYY\\\");\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"macro\"},\"$:/core/modules/macros/qualify.js\":{\"title\":\"$:/core/modules/macros/qualify.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/macros/qualify.js\\ntype: application/javascript\\nmodule-type: macro\\n\\nMacro to qualify a state tiddler title according\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nInformation about this macro\\n*/\\n\\nexports.name = \\\"qualify\\\";\\n\\nexports.params = [\\n\\t{name: \\\"title\\\"}\\n];\\n\\n/*\\nRun the macro\\n*/\\nexports.run = function(title) {\\n\\treturn title + \\\"-\\\" + this.getStateQualifier();\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"macro\"},\"$:/core/modules/macros/resolvepath.js\":{\"title\":\"$:/core/modules/macros/resolvepath.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/macros/resolvepath.js\\ntype: application/javascript\\nmodule-type: macro\\n\\nResolves a relative path for an absolute rootpath.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.name = \\\"resolvepath\\\";\\n\\nexports.params = [\\n\\t{name: \\\"source\\\"},\\n\\t{name: \\\"root\\\"}\\n];\\n\\n/*\\nRun the macro\\n*/\\nexports.run = function(source, root) {\\n\\treturn $tw.utils.resolvePath(source, root);\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"macro\"},\"$:/core/modules/macros/unusedtitle.js\":{\"title\":\"$:/core/modules/macros/unusedtitle.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/macros/unusedtitle.js\\ntype: application/javascript\\nmodule-type: macro\\n\\nMacro to return a new title that is unused in the wiki. It can be given a name as a base.\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.name = \\\"unusedtitle\\\";\\n\\nexports.params = [\\n\\t{name: \\\"baseName\\\"},\\n\\t{name: \\\"separator\\\"},\\n\\t{name: \\\"template\\\"}\\n];\\n\\n/*\\nRun the macro\\n*/\\nexports.run = function(baseName,separator,template) {\\n\\tseparator = separator || \\\" \\\";\\n\\tif(!baseName) {\\n\\t\\tbaseName = $tw.language.getString(\\\"DefaultNewTiddlerTitle\\\");\\n\\t}\\n\\t// $tw.wiki.generateNewTitle = function(baseTitle,options)\\n\\t// options.prefix must be a string! \\n\\treturn this.wiki.generateNewTitle(baseName, {\\\"prefix\\\": separator, \\\"template\\\": template});\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"macro\"},\"$:/core/modules/macros/version.js\":{\"title\":\"$:/core/modules/macros/version.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/macros/version.js\\ntype: application/javascript\\nmodule-type: macro\\n\\nMacro to return the TiddlyWiki core version number\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nInformation about this macro\\n*/\\n\\nexports.name = \\\"version\\\";\\n\\nexports.params = [];\\n\\n/*\\nRun the macro\\n*/\\nexports.run = function() {\\n\\treturn $tw.version;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"macro\"},\"$:/core/modules/parsers/audioparser.js\":{\"title\":\"$:/core/modules/parsers/audioparser.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/parsers/audioparser.js\\ntype: application/javascript\\nmodule-type: parser\\n\\nThe audio parser parses an audio tiddler into an embeddable HTML element\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar AudioParser = function(type,text,options) {\\n\\tvar element = {\\n\\t\\t\\ttype: \\\"element\\\",\\n\\t\\t\\ttag: \\\"audio\\\",\\n\\t\\t\\tattributes: {\\n\\t\\t\\t\\tcontrols: {type: \\\"string\\\", value: \\\"controls\\\"},\\n\\t\\t\\t\\tstyle: {type: \\\"string\\\", value: \\\"width: 100%; object-fit: contain\\\"}\\n\\t\\t\\t}\\n\\t\\t}
2731,\\n\\t\\tsrc;\\n\\tif(options._canonical_uri) {\\n\\t\\telement.attributes.src = {type: \\\"string\\\", value: options._canonical_uri};\\n\\t} else if(text) {\\n\\t\\telement.attributes.src = {type: \\\"string\\\", value: \\\"data:\\\" + type + \\\";base64,\\\" + text};\\n\\t}\\n\\tthis.tree = [element];\\n\\tthis.source = text;\\n\\tthis.type = type;\\n};\\n\\nexports[\\\"audio/ogg\\\"] = AudioParser;\\nexports[\\\"audio/mpeg\\\"] = AudioParser;\\nexports[\\\"audio/mp3\\\"] = AudioParser;\\nexports[\\\"audio/mp4\\\"] = AudioParser;\\n\\n})();\\n\\n\",\"type\":\"application/javascript\",\"module-type\":\"parser\"},\"$:/core/modules/parsers/binaryparser.js\":{\"title\":\"$:/core/modules/parsers/binaryparser.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/parsers/binaryparser.js\\ntype: application/javascript\\nmodule-type: parser\\n\\nThe binary parser parses a binary tiddler into a warning message and download link\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar BINARY_WARNING_MESSAGE = \\\"$:/core/ui/BinaryWarning\\\";\\nvar EXPORT_BUTTON_IMAGE = \\\"$:/core/images/export-button\\\";\\n\\nvar BinaryParser = function(type,text,options) {\\n\\t// Transclude the binary data tiddler warning message\\n\\tvar warn = {\\n\\t\\ttype: \\\"element\\\",\\n\\t\\ttag: \\\"p\\\",\\n\\t\\tchildren: [{\\n\\t\\t\\ttype: \\\"transclude\\\",\\n\\t\\t\\tattributes: {\\n\\t\\t\\t\\t\\\"$tiddler\\\": {type: \\\"string\\\", value: BINARY_WARNING_MESSAGE}\\n\\t\\t\\t}\\n\\t\\t}]\\n\\t};\\n\\t// Create download link based on binary tiddler title\\n\\tvar link = {\\n\\t\\ttype: \\\"element\\\",\\n\\t\\ttag: \\\"a\\\",\\n\\t\\tattributes: {\\n\\t\\t\\ttitle: {type: \\\"indirect\\\", textReference: \\\"!!title\\\"},\\n\\t\\t\\tdownload: {type: \\\"indirect\\\", textReference: \\\"!!title\\\"}\\n\\t\\t},\\n\\t\\tchildren: [{\\n\\t\\t\\ttype: \\\"transclude\\\",\\n\\t\\t\\tattributes: {\\n\\t\\t\\t\\t\\\"$tiddler\\\": {type: \\\"string\\\", value: EXPORT_BUTTON_IMAGE}\\n\\t\\t\\t}\\n\\t\\t}]\\n\\t};\\n\\t// Set the link href to external or internal data URI\\n\\tif(options._canonical_uri) {\\n\\t\\tlink.attributes.href = {\\n\\t\\t\\ttype: \\\"string\\\", \\n\\t\\t\\tvalue: options._canonical_uri\\n\\t\\t};\\n\\t} else if(text) {\\n\\t\\tlink.attributes.href = {\\n\\t\\t\\ttype: \\\"string\\\", \\n\\t\\t\\tvalue: \\\"data:\\\" + type + \\\";base64,\\\" + text\\n\\t\\t};\\n\\t}\\n\\t// Combine warning message and download link in a div\\n\\tvar element = {\\n\\t\\ttype: \\\"element\\\",\\n\\t\\ttag: \\\"div\\\",\\n\\t\\tattributes: {\\n\\t\\t\\tclass: {type: \\\"string\\\", value: \\\"tc-binary-warning\\\"}\\n\\t\\t},\\n\\t\\tchildren: [warn, link]\\n\\t}\\n\\tthis.tree = [element];\\n\\tthis.source = text;\\n\\tthis.type = type;\\n};\\n\\nexports[\\\"application/octet-stream\\\"] = BinaryParser;\\n\\n})();\\n\\n\",\"type\":\"application/javascript\",\"module-type\":\"parser\"},\"$:/core/modules/parsers/csvparser.js\":{\"title\":\"$:/core/modules/parsers/csvparser.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/parsers/csvparser.js\\ntype: application/javascript\\nmodule-type: parser\\n\\nThe CSV text parser processes CSV files into a table wrapped in a scrollable widget\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar CsvParser = function(type,text,options) {\\n\\t// Special handler for tab-delimited files\\n\\tif (type === 'text/tab-delimited-values' && !options.separator) {\\n\\t\\toptions.separator = \\\"\\\\t\\\";\\n\\t}\\n\\t\\n\\t// Table framework\\n\\tthis.tree = [{\\n\\t\\t\\\"type\\\": \\\"scrollable\\\", \\\"children\\\": [{\\n\\t\\t\\t\\\"type\\\": \\\"element\\\", \\\"tag\\\": \\\"table\\\", \\\"children\\\": [{\\n\\t\\t\\t\\t\\\"type\\\": \\\"element\\\", \\\"tag\\\": \\\"tbody\\\", \\\"children\\\": []\\n\\t\\t\\t}], \\\"attributes\\\": {\\n\\t\\t\\t\\t\\\"class\\\": {\\\"type\\\": \\\"string\\\", \\\"value\\\": \\\"tc-csv-table\\\"}\\n\\t\\t\\t}\\n\\t\\t}]\\n\\t}];\\n\\t// Split the text into lines\\n\\tvar lines = $tw.utils.parseCsvString(text, options),\\n\\t\\ttag = \\\"th\\\";\\n\\tvar maxColumns = 0;\\n\\t$tw.utils.each(lines, function(columns) {\\n\\t\\tmaxColumns = Math.max(columns.length, maxColumns);\\n\\t});\\n\\t\\n\\tfor(var line=0; line\u003Clines.length; line++) {\\n\\t\\tvar columns = lines[line];\\n\\t\\tvar row = {\\n\\t\\t\\t\\\"type\\\": \\\"element\\\", \\\"tag\\\": \\\"tr\\\", \\\"children\\\": []\\n\\t\\t};\\n\\t\\tfor(var column=0; column\u003CmaxColumns; column++) {\\n\\t\\t\\trow.children.push({\\n\\t\\t\\t\\t\\\"type\\\": \\\"element\\\", \\\"tag\\\": tag, \\\"children\\\": [{\\n\\t\\t\\t\\t\\t\\\"type\\\": \\\"text\\\",\\n\\t\\t\\t\\t\\t\\\"text\\\": columns[column] || ''\\n\\t\\t\\t\\t}]\\n\\t\\t\\t});\\n\\t\\t}\\n\\t\\ttag = \\\"td\\\";\\n\\t\\tthis.tree[0].children[0].children[0].children.push(row);\\n\\t}\\n\\tthis.source = text;\\n\\tthis.type = type;\\n};\\n\\nexports[\\\"text/csv\\\"] = CsvParser;\\nexports[\\\"text/tab-delimited-values\\\"] = CsvParser;\\n\\n})();\\n\\n\",\"type\":\"application/javascript\",\"module-type\":\"parser\"},\"$:/core/modules/parsers/htmlparser.js\":{\"title\":\"$:/core/modules/parsers/htmlparser.js\",\"text\":\"/*\\\\\\ntitle: $
2731:/core/modules/parsers/htmlparser.js\\ntype: application/javascript\\nmodule-type: parser\\n\\nThe HTML parser displays text as raw HTML\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar HtmlParser = function(type,text,options) {\\n\\tvar src;\\n\\tif(options._canonical_uri) {\\n\\t\\tsrc = options._canonical_uri;\\n\\t} else if(text) {\\n\\t\\tsrc = \\\"data:text/html;charset=utf-8,\\\" + encodeURIComponent(text);\\n\\t}\\n\\tthis.tree = [{\\n\\t\\ttype: \\\"element\\\",\\n\\t\\ttag: \\\"iframe\\\",\\n\\t\\tattributes: {\\n\\t\\t\\tsrc: {type: \\\"string\\\", value: src}\\n\\t\\t}\\n\\t}];\\n\\tif($tw.wiki.getTiddlerText(\\\"$:/config/HtmlParser/DisableSandbox\\\",\\\"no\\\") !== \\\"yes\\\") {\\n\\t\\tthis.tree[0].attributes.sandbox = {type: \\\"string\\\", value: $tw.wiki.getTiddlerText(\\\"$:/config/HtmlParser/SandboxTokens\\\",\\\"\\\")};\\n\\t}\\n\\tthis.source = text;\\n\\tthis.type = type;\\n};\\n\\nexports[\\\"text/html\\\"] = HtmlParser;\\n\\n})();\\n\\n\",\"type\":\"application/javascript\",\"module-type\":\"parser\"},\"$:/core/modules/parsers/imageparser.js\":{\"title\":\"$:/core/modules/parsers/imageparser.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/parsers/imageparser.js\\ntype: application/javascript\\nmodule-type: parser\\n\\nThe image parser parses an image into an embeddable HTML element\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar ImageParser = function(type,text,options) {\\n\\tvar element = {\\n\\t\\t\\ttype: \\\"element\\\",\\n\\t\\t\\ttag: \\\"img\\\",\\n\\t\\t\\tattributes: {}\\n\\t\\t};\\n\\tif(options._canonical_uri) {\\n\\t\\telement.attributes.src = {type: \\\"string\\\", value: options._canonical_uri};\\n\\t} else if(text) {\\n\\t\\tif(type === \\\"image/svg+xml\\\" || type === \\\".svg\\\") {\\n\\t\\t\\telement.attributes.src = {type: \\\"string\\\", value: \\\"data:image/svg+xml,\\\" + encodeURIComponent(text)};\\n\\t\\t} else {\\n\\t\\t\\telement.attributes.src = {type: \\\"string\\\", value: \\\"data:\\\" + type + \\\";base64,\\\" + text};\\n\\t\\t}\\n\\t}\\n\\tthis.tree = [element];\\n\\tthis.source = text;\\n\\tthis.type = type;\\n};\\n\\nexports[\\\"image/svg+xml\\\"] = ImageParser;\\nexports[\\\"image/jpg\\\"] = ImageParser;\\nexports[\\\"image/jpeg\\\"] = ImageParser;\\nexports[\\\"image/png\\\"] = ImageParser;\\nexports[\\\"image/gif\\\"] = ImageParser;\\nexports[\\\"image/webp\\\"] = ImageParser;\\nexports[\\\"image/heic\\\"] = ImageParser;\\nexports[\\\"image/heif\\\"] = ImageParser;\\nexports[\\\"image/x-icon\\\"] = ImageParser;\\nexports[\\\"image/vnd.microsoft.icon\\\"] = ImageParser;\\n\\n})();\\n\\n\",\"type\":\"application/javascript\",\"module-type\":\"parser\"},\"$:/core/modules/utils/parseutils.js\":{\"title\":\"$:/core/modules/utils/parseutils.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/utils/parseutils.js\\ntype: application/javascript\\nmodule-type: utils\\n\\nUtility functions concerned with parsing text into tokens.\\n\\nMost functions have the following pattern:\\n\\n* The parameters are:\\n** `source`: the source string being parsed\\n** `pos`: the current parse position within the string\\n** Any further parameters are used to identify the token that is being parsed\\n* The return value is:\\n** null if the token was not found at the specified position\\n** an object representing the token with the following standard fields:\\n*** `type`: string indicating the type of the token\\n*** `start`: start position of the token in the source string\\n*** `end`: end position of the token in the source string\\n*** Any further fields required to describe the token\\n\\nThe exception is `skipWhiteSpace`, which just returns the position after the whitespace.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nLook for a whitespace token. Returns null if not found, otherwise returns {type: \\\"whitespace\\\", start:, end:,}\\n*/\\nexports.parseWhiteSpace = function(source,pos) {\\n\\tvar p 
2731= pos,c;\\n\\twhile(true) {\\n\\t\\tc = source.charAt(p);\\n\\t\\tif((c === \\\" \\\") || (c === \\\"\\\\f\\\") || (c === \\\"\\\\n\\\") || (c === \\\"\\\\r\\\") || (c === \\\"\\\\t\\\") || (c === \\\"\\\\v\\\") || (c === \\\"\\\\u00a0\\\")) { // Ignores some obscure unicode spaces\\n\\t\\t\\tp++;\\n\\t\\t} else {\\n\\t\\t\\tbreak;\\n\\t\\t}\\n\\t}\\n\\tif(p === pos) {\\n\\t\\treturn null;\\n\\t} else {\\n\\t\\treturn {\\n\\t\\t\\ttype: \\\"whitespace\\\",\\n\\t\\t\\tstart: pos,\\n\\t\\t\\tend: p\\n\\t\\t}\\n\\t}\\n};\\n\\n/*\\nConvenience wrapper for parseWhiteSpace. Returns the position after the whitespace\\n*/\\nexports.skipWhiteSpace = function(source,pos) {\\n\\tvar c;\\n\\twhile(true) {\\n\\t\\tc = source.charAt(pos);\\n\\t\\tif((c === \\\" \\\") || (c === \\\"\\\\f\\\") || (c === \\\"\\\\n\\\") || (c === \\\"\\\\r\\\") || (c === \\\"\\\\t\\\") || (c === \\\"\\\\v\\\") || (c === \\\"\\\\u00a0\\\")) { // Ignores some obscure unicode spaces\\n\\t\\t\\tpos++;\\n\\t\\t} else {\\n\\t\\t\\treturn pos;\\n\\t\\t}\\n\\t}\\n};\\n\\n/*\\nLook for a given string token. Returns null if not found, otherwise returns {type: \\\"token\\\", value:, start:, end:,}\\n*/\\nexports.parseTokenString = function(source,pos,token) {\\n\\tvar match = source.indexOf(token,pos) === pos;\\n\\tif(match) {\\n\\t\\treturn {\\n\\t\\t\\ttype: \\\"token\\\",\\n\\t\\t\\tvalue: token,\\n\\t\\t\\tstart: pos,\\n\\t\\t\\tend: pos + token.length\\n\\t\\t};\\n\\t}\\n\\treturn null;\\n};
2731\\n\\n/*\\nLook for a token matching a regex. Returns null if not found, otherwise returns {type: \\\"regexp\\\", match:, start:, end:,}\\n*/\\nexports.parseTokenRegExp = function(source,pos,reToken) {\\n\\tvar node = {\\n\\t\\ttype: \\\"regexp\\\",\\n\\t\\tstart: pos\\n\\t};\\n\\treToken.lastIndex = pos;\\n\\tnode.match = reToken.exec(source);\\n\\tif(node.match && node.match.index === pos) {\\n\\t\\tnode.end = pos + node.match[0].length;\\n\\t\\treturn node;\\n\\t} else {\\n\\t\\treturn null;\\n\\t}\\n};\\n\\n/*\\nLook for a string literal. Returns null if not found, otherwise returns {type: \\\"string\\\", value:, start:, end:,}\\n*/\\nexports.parseStringLiteral = function(source,pos) {\\n\\tvar node = {\\n\\t\\ttype: \\\"string\\\",\\n\\t\\tstart: pos\\n\\t};\\n\\tvar reString = /(?:\\\"\\\"\\\"([\\\\s\\\\S]*?)\\\"\\\"\\\"|\\\"([^\\\"]*)\\\")|(?:'([^']*)')/g;\\n\\treString.lastIndex = pos;\\n\\tvar match = reString.exec(source);\\n\\tif(match && match.index === pos) {\\n\\t\\tnode.value = match[1] !== undefined ? match[1] :(\\n\\t\\t\\tmatch[2] !== undefined ? match[2] : match[3] \\n\\t\\t\\t\\t\\t);\\n\\t\\tnode.end = pos + match[0].length;\\n\\t\\treturn node;\\n\\t} else {\\n\\t\\treturn null;\\n\\t}\\n};\\n\\n/*\\nReturns an array of {name:} with an optional \\\"default\\\" property. Options include:\\nrequireParenthesis: require the parameter definition to be wrapped in parenthesis\\n*/\\nexports.parseParameterDefinition = function(paramString,options) {\\n\\toptions = options || {};\\n\\tif(options.requireParenthesis) {\\n\\t\\tvar parenMatch = /^\\\\s*\\\\((.*)\\\\)\\\\s*$/g.exec(paramString);\\n\\t\\tif(!parenMatch) {\\n\\t\\t\\treturn [];\\n\\t\\t}\\n\\t\\tparamString = parenMatch[1];\\n\\t}\\n\\tvar params = [],\\n\\t\\treParam = /\\\\s*([^:),\\\\s]+)(?:\\\\s*:\\\\s*(?:\\\"\\\"\\\"([\\\\s\\\\S]*?)\\\"\\\"\\\"|\\\"([^\\\"]*)\\\"|'([^']*)'|([^,\\\"'\\\\s]+)))?/mg,\\n\\t\\tparamMatch = reParam.exec(paramString);\\n\\twhile(paramMatch) {\\n\\t\\t// Save the parameter details\\n\\t\\tvar paramInfo = {name: paramMatch[1]},\\n\\t\\t\\tdefaultValue = paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5];\\n\\t\\tif(defaultValue !== undefined) {\\n\\t\\t\\tparamInfo[\\\"default\\\"] = defaultValue;\\n\\t\\t}\\n\\t\\tparams.push(paramInfo);\\n\\t\\t// Look for the next parameter\\n\\t\\tparamMatch = reParam.exec(paramString);\\n\\t}\\n\\treturn params;\\n};\\n\\nexports.parseMacroParameters = function(node,source,pos) {\\n\\t// Process parameters\\n\\tvar parameter = $tw.utils.parseMacroParameter(source,pos);\\n\\twhile(parameter) {\\n\\t\\tnode.params.push(parameter);\\n\\t\\tpos = parameter.end;\\n\\t\\t// Get the next parameter\\n\\t\\tparameter = $tw.utils.parseMacroParameter(source,pos);\\n\\t}\\n\\tnode.end = pos;\\n\\treturn node;\\n}\\n\\n/*\\nLook for a macro invocation parameter. Returns null if not found, or {type: \\\"macro-parameter\\\", name:, value:, start:, end:}\\n*/\\nexports.parseMacroParameter = function(source,pos) {\\n\\tvar node = {\\n\\t\\ttype: \\\"macro-parameter\\\",\\n\\t\\tstart: pos\\n\\t};\\n\\t// Define our regexp\\n\\tvar reMacroParameter = /(?:([A-Za-z0-9\\\\-_]+)\\\\s*:)?(?:\\\\s*(?:\\\"\\\"\\\"([\\\\s\\\\S]*?)\\\"\\\"\\\"|\\\"([^\\\"]*)\\\"|'([^']*)'|\\\\[\\\\[([^\\\\]]*)\\\\]\\\\]|((?:(?:>(?!>))|[^\\\\s>\\\"'])+)))/g;\\n\\t// Skip whitespace\\n\\tpos = $tw.utils.skipWhiteSpace(source,pos);\\n\\t// Look for the parameter\\n\\tvar token = $tw.utils.parseTokenRegExp(source,pos,reMacroParameter);\\n\\tif(!token) {\\n\\t\\treturn null;\\n\\t}\\n\\tpos = token.end;\\n\\t// Get the parameter details\\n\\tnode.value = token.match[2] !== undefined ? token.match[2] : (\\n\\t\\t\\t\\t\\ttoken.match[3] !== undefined ? token.match[3] : (\\n\\t\\t\\t\\t\\t\\ttoken.match[4] !== undefined ? token.match[4] : (\\n\\t\\t\\t\\t\\t\\t\\ttoken.match[5] !== undefined ? token.match[5] : (\\n\\t\\t\\t\\t\\t\\t\\t\\ttoken.match[6] !== undefined ? token.match[6] : (\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\\"\\\"\\n\\t\\t\\t\\t\\t\\t\\t\\t)\\n\\t\\t\\t\\t\\t\\t\\t)\\n\\t\\t\\t\\t\\t\\t)\\n\\t\\t\\t\\t\\t)\\n\\t\\t\\t\\t);\\n\\tif(token.match[1]) {\\n\\t\\tnode.name = token.match[1];\\n\\t}\\n\\t// Update the end position\\n\\tnode.end = pos;\\n\\treturn node;\\n};
2731\\n\\n/*\\nLook for a macro invocation. Returns null if not found, or {type: \\\"transclude\\\", attributes:, start:, end:}\\n*/\\nexports.parseMacroInvocationAsTransclusion = function(source,pos) {\\n\\tvar node = $tw.utils.parseMacroInvocation(source,pos);\\n\\tif(node) {\\n\\t\\tvar positionalName = 0,\\n\\t\\t\\ttransclusion = {\\n\\t\\t\\t\\ttype: \\\"transclude\\\",\\n\\t\\t\\t\\tstart: node.start,\\n\\t\\t\\t\\tend: node.end\\n\\t\\t\\t};\\n\\t\\t$tw.utils.addAttributeToParseTreeNode(transclusion,\\\"$variable\\\",node.name);\\n\\t\\t$tw.utils.each(node.params,function(param) {\\n\\t\\t\\tvar name = param.name;\\n\\t\\t\\tif(name) {\\n\\t\\t\\t\\tif(name.charAt(0) === \\\"$\\\") {\\n\\t\\t\\t\\t\\tname = \\\"$\\\" + name;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t$tw.utils.addAttributeToParseTreeNode(transclusion,{name: name,type: \\\"string\\\", value: param.value, start: param.start, end: param.end});\\n\\t\\t\\t} else {\\n\\t\\t\\t\\t$tw.utils.addAttributeToParseTreeNode(transclusion,{name: (positionalName++) + \\\"\\\",type: \\\"string\\\", value: param.value, start: param.start, end: param.end});\\n\\t\\t\\t}\\n\\t\\t});\\n\\t\\treturn transclusion;\\n\\t}\\n\\treturn node;\\n};
2731\\n\\n/*\\nLook for a macro invocation. Returns null if not found, or {type: \\\"macrocall\\\", name:, params:, start:, end:}\\n*/\\nexports.parseMacroInvocation = function(source,pos) {\\n\\tvar node = {\\n\\t\\ttype: \\\"macrocall\\\",\\n\\t\\tstart: pos,\\n\\t\\tparams: []\\n\\t};\\n\\t// Define our regexps\\n\\tvar reMacroName = /([^\\\\s>\\\"'=]+)/g;\\n\\t// Skip whitespace\\n\\tpos = $tw.utils.skipWhiteSpace(source,pos);\\n\\t// Look for a double less than sign\\n\\tvar token = $tw.utils.parseTokenString(source,pos,\\\"\u003C\u003C\\\");\\n\\tif(!token) {\\n\\t\\treturn null;\\n\\t}\\n\\tpos = token.end;\\n\\t// Get the macro name\\n\\tvar name = $tw.utils.parseTokenRegExp(source,pos,reMacroName);\\n\\tif(!name) {\\n\\t\\treturn null;\\n\\t}\\n\\tnode.name = name.match[1];\\n\\tpos = name.end;\\n\\tnode = $tw.utils.parseMacroParameters(node,source,pos);\\n\\tpos = node.end;\\n\\t// Skip whitespace\\n\\tpos = $tw.utils.skipWhiteSpace(source,pos);\\n\\t// Look for a double greater than sign\\n\\ttoken = $tw.utils.parseTokenString(source,pos,\\\">>\\\");\\n\\tif(!token) {\\n\\t\\treturn null;\\n\\t}\\n\\tpos = token.end;\\n\\t// Update the end position\\n\\tnode.end = pos;\\n\\treturn node;\\n};\\n\\nexports.parseFilterVariable = function(source) {\\n\\tvar node = {\\n\\t\\t\\tname: \\\"\\\",\\n\\t\\t\\tparams: [],\\n\\t\\t},\\n\\t\\tpos = 0,\\n\\t\\treName = /([^\\\\s\\\"']+)/g;\\n\\t// If there is no whitespace or it is an empty string then there are no macro parameters\\n\\tif(/^\\\\S*$/.test(source)) {\\n\\t\\tnode.name = source;\\n\\t\\treturn node;\\n\\t}\\n\\t// Get the variable name\\n\\tvar nameMatch = $tw.utils.parseTokenRegExp(source,pos,reName);\\n\\tif(nameMatch) {\\n\\t\\tnode.name = nameMatch.match[1];\\n\\t\\tpos = nameMatch.end;\\n\\t\\tnode = $tw.utils.parseMacroParameters(node,source,pos);\\n\\t\\tdelete node.end;\\n\\t}\\n\\treturn node;\\n};
2731\\n\\n/*\\nLook for an HTML attribute definition. Returns null if not found, otherwise returns {type: \\\"attribute\\\", name:, type: \\\"filtered|string|indirect|macro\\\", value|filter|textReference:, start:, end:,}\\n*/\\nexports.parseAttribute = function(source,pos) {\\n\\tvar node = {\\n\\t\\tstart: pos\\n\\t};\\n\\t// Define our regexps\\n\\tvar reAttributeName = /([^\\\\/\\\\s>\\\"'`=]+)/g,\\n\\t\\treUnquotedAttribute = /([^\\\\/\\\\s\u003C>\\\"'`=]+)/g,\\n\\t\\treFilteredValue = /\\\\{\\\\{\\\\{([\\\\S\\\\s]+?)\\\\}\\\\}\\\\}/g,\\n\\t\\treIndirectValue = /\\\\{\\\\{([^\\\\}]+)\\\\}\\\\}/g,\\n\\t\\treSubstitutedValue = /(?:```([\\\\s\\\\S]*?)```|`([^`]|[\\\\S\\\\s]*?)`)/g;\\n\\t// Skip whitespace\\n\\tpos = $tw.utils.skipWhiteSpace(source,pos);\\n\\t// Get the attribute name\\n\\tvar name = $tw.utils.parseTokenRegExp(source,pos,reAttributeName);\\n\\tif(!name) {\\n\\t\\treturn null;\\n\\t}\\n\\tnode.name = name.match[1];\\n\\tpos = name.end;\\n\\t// Skip whitespace\\n\\tpos = $tw.utils.skipWhiteSpace(source,pos);\\n\\t// Look for an equals sign\\n\\tvar token = $tw.utils.parseTokenString(source,pos,\\\"=\\\");\\n\\tif(token) {\\n\\t\\tpos = token.end;\\n\\t\\t// Skip whitespace\\n\\t\\tpos = $tw.utils.skipWhiteSpace(source,pos);\\n\\t\\t// Look for a string literal\\n\\t\\tvar stringLiteral = $tw.utils.parseStringLiteral(source,pos);\\n\\t\\tif(stringLiteral) {\\n\\t\\t\\tpos = stringLiteral.end;\\n\\t\\t\\tnode.type = \\\"string\\\";\\n\\t\\t\\tnode.value = stringLiteral.value;\\n\\t\\t} else {\\n\\t\\t\\t// Look for a filtered value\\n\\t\\t\\tvar filteredValue = $tw.utils.parseTokenRegExp(source,pos,reFilteredValue);\\n\\t\\t\\tif(filteredValue) {\\n\\t\\t\\t\\tpos = filteredValue.end;\\n\\t\\t\\t\\tnode.type = \\\"filtered\\\";\\n\\t\\t\\t\\tnode.filter = filteredValue.match[1];\\n\\t\\t\\t} else {\\n\\t\\t\\t\\t// Look for an indirect value\\n\\t\\t\\t\\tvar indirectValue = $tw.utils.parseTokenRegExp(source,pos,reIndirectValue);\\n\\t\\t\\t\\tif(indirectValue) {\\n\\t\\t\\t\\t\\tpos = indirectValue.end;\\n\\t\\t\\t\\t\\tnode.type = \\\"indirect\\\";\\n\\t\\t\\t\\t\\tnode.textReference = indirectValue.match[1];\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t// Look for a unquoted value\\n\\t\\t\\t\\t\\tvar unquotedValue = $tw.utils.parseTokenRegExp(source,pos,reUnquotedAttribute);\\n\\t\\t\\t\\t\\tif(unquotedValue) {\\n\\t\\t\\t\\t\\t\\tpos = unquotedValue.end;\\n\\t\\t\\t\\t\\t\\tnode.type = \\\"string\\\";\\n\\t\\t\\t\\t\\t\\tnode.value = unquotedValue.match[1];\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t// Look for a macro invocation value\\n\\t\\t\\t\\t\\t\\tvar macroInvocation = $tw.utils.parseMacroInvocation(source,pos);\\n\\t\\t\\t\\t\\t\\tif(macroInvocation) {\\n\\t\\t\\t\\t\\t\\t\\tpos = macroInvocation.end;\\n\\t\\t\\t\\t\\t\\t\\tnode.type = \\\"macro\\\";\\n\\t\\t\\t\\t\\t\\t\\tnode.value = macroInvocation;\\n\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\tvar substitutedValue = $tw.utils.parseTokenRegExp(source,pos,reSubstitutedValue);\\n\\t\\t\\t\\t\\t\\t\\tif(substitutedValue) {\\n\\t\\t\\t\\t\\t\\t\\t\\tpos = substitutedValue.end;\\n\\t\\t\\t\\t\\t\\t\\t\\tnode.type = \\\"substituted\\\";\\n\\t\\t\\t\\t\\t\\t\\t\\tnode.rawValue = substitutedValue.match[1] || substitutedValue.match[2];\\n\\t\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\t\\tnode.type = \\\"string\\\";\\n\\t\\t\\t\\t\\t\\t\\t\\tnode.value = \\\"true\\\";\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t} else {\\n\\t\\tnode.type = \\\"string\\\";\\n\\t\\tnode.value = \\\"true\\\";\\n\\t}\\n\\t// Update the end position\\n\\tnode.end = pos;\\n\\treturn node;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"utils\"},\"$:/core/modules/parsers/pdfparser.js\":{\"title\":\"$:/core/modules/parsers/pdfparser.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/parsers/pdfparser.js\\ntype: application/javascript\\nmodule-type: parser\\n\\nThe PDF parser embeds a PDF viewer\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar ImageParser = function(type,text,options) {\\n\\tvar element = {\\n\\t\\t\\ttype: \\\"element\\\",\\n\\t\\t\\ttag: \\\"iframe\\\",\\n\\t\\t\\tattributes: {}\\n\\t\\t}
2731,\\n\\t\\tsrc;\\n\\tif(options._canonical_uri) {\\n\\t\\telement.attributes.src = {type: \\\"string\\\", value: options._canonical_uri};\\n\\t} else if(text) {\\n\\t\\telement.attributes.src = {type: \\\"string\\\", value: \\\"data:application/pdf;base64,\\\" + text};\\n\\t}\\n\\tthis.tree = [element];\\n\\tthis.source = text;\\n\\tthis.type = type;\\n};\\n\\nexports[\\\"application/pdf\\\"] = ImageParser;\\n\\n})();\\n\\n\",\"type\":\"application/javascript\",\"module-type\":\"parser\"},\"$:/core/modules/parsers/textparser.js\":{\"title\":\"$:/core/modules/parsers/textparser.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/parsers/textparser.js\\ntype: application/javascript\\nmodule-type: parser\\n\\nThe plain text parser processes blocks of source text into a degenerate parse tree consisting of a single text node\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar TextParser = function(type,text,options) {\\n\\tthis.tree = [{\\n\\t\\ttype: \\\"codeblock\\\",\\n\\t\\tattributes: {\\n\\t\\t\\tcode: {type: \\\"string\\\", value: text},\\n\\t\\t\\tlanguage: {type: \\\"string\\\", value: type}\\n\\t\\t}\\n\\t}];\\n\\tthis.source = text;\\n\\tthis.type = type;\\n};\\n\\nexports[\\\"text/plain\\\"] = TextParser;\\nexports[\\\"text/x-tiddlywiki\\\"] = TextParser;\\nexports[\\\"application/javascript\\\"] = TextParser;\\nexports[\\\"application/json\\\"] = TextParser;\\nexports[\\\"text/css\\\"] = TextParser;\\nexports[\\\"application/x-tiddler-dictionary\\\"] = TextParser;\\n\\n})();\\n\\n\",\"type\":\"application/javascript\",\"module-type\":\"parser\"},\"$:/core/modules/parsers/videoparser.js\":{\"title\":\"$:/core/modules/parsers/videoparser.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/parsers/videoparser.js\\ntype: application/javascript\\nmodule-type: parser\\n\\nThe video parser parses a video tiddler into an embeddable HTML element\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar VideoParser = function(type,text,options) {\\n\\tvar element = {\\n\\t\\t\\ttype: \\\"element\\\",\\n\\t\\t\\ttag: \\\"video\\\",\\n\\t\\t\\tattributes: {\\n\\t\\t\\t\\tcontrols: {type: \\\"string\\\", value: \\\"controls\\\"},\\n\\t\\t\\t\\tstyle: {type: \\\"string\\\", value: \\\"width: 100%; object-fit: contain\\\"}\\n\\t\\t\\t}\\n\\t\\t},\\n\\t\\tsrc;\\n\\tif(options._canonical_uri) {\\n\\t\\telement.attributes.src = {type: \\\"string\\\", value: options._canonical_uri};\\n\\t} else if(text) {\\n\\t\\telement.attributes.src = {type: \\\"string\\\", value: \\\"data:\\\" + type + \\\";base64,\\\" + text};\\n\\t}\\n\\tthis.tree = [element];\\n\\tthis.source = text;\\n\\tthis.type = type;\\n};\\n\\nexports[\\\"video/ogg\\\"] = VideoParser;\\nexports[\\\"video/webm\\\"] = VideoParser;\\nexports[\\\"video/mp4\\\"] = VideoParser;\\nexports[\\\"video/quicktime\\\"] = VideoParser;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"parser\"},\"$:/core/modules/parsers/wikiparser/rules/codeblock.js\":{\"title\":\"$:/core/modules/parsers/wikiparser/rules/codeblock.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/parsers/wikiparser/rules/codeblock.js\\ntype: application/javascript\\nmodule-type: wikirule\\n\\nWiki text rule for code blocks. For example:\\n\\n```\\n\\t```\\n\\tThis text will not be //wikified//\\n\\t```\\n```\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.name = \\\"codeblock\\\";\\nexports.types = {block: true};\\n\\nexports.init = function(parser) {\\n\\tthis.parser = parser;\\n\\t// Regexp to match and get language if defined\\n\\tthis.matchRegExp = /```([\\\\w-]*)\\\\r?\\\\n/mg;\\n};\\n\\nexports.parse = function() {\\n\\tvar reEnd = /(\\\\r?\\\\n```$)/mg;\\n\\t// Move past the match\\n\\tthis.parser.pos = this.matchRegExp.lastIndex;\\n\\n\\t// Look for the end of the block\\n\\treEnd.lastIndex = this.parser.pos;\\n\\tvar match = reEnd.exec(this.parser.source),\\n\\t\\ttext;\\n\\t// Process the block\\n\\tif(match) {\\n\\t\\ttext = this.parser.source.substring(this.parser.pos,match.index);\\n\\t\\tthis.parser.pos = match.index + match[0].length;\\n\\t} else {\\n\\t\\ttext = this.parser.source.substr(this.parser.pos);\\n\\t\\tthis.parser.pos = this.parser.sourceLength;\\n\\t}\\n\\t// Return the $codeblock widget\\n\\treturn [{\\n\\t\\t\\ttype: \\\"codeblock\\\",\\n\\t\\t\\tattributes: {\\n\\t\\t\\t\\t\\tcode: {type: \\\"string\\\", value: text},\\n\\t\\t\\t\\t\\tlanguage: {type: \\\"string\\\", value: this.match[1]}\\n\\t\\t\\t}\\n\\t}];\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"wikirule\"},\"$:/core/modules/parsers/wikiparser/rules/codeinline.js\":{\"title\":\"$:/core/modules/parsers/wikiparser/rules/codeinline.js\",\"text\":\"/*\\\\\\ntitle: $
2731:/core/modules/parsers/wikiparser/rules/codeinline.js\\ntype: application/javascript\\nmodule-type: wikirule\\n\\nWiki text inline rule for code runs. For example:\\n\\n```\\n\\tThis is a `code run`.\\n\\tThis is another ``code run``\\n```\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.name = \\\"codeinline\\\";\\nexports.types = {inline: true};\\n\\nexports.init = function(parser) {\\n\\tthis.parser = parser;\\n\\t// Regexp to match\\n\\tthis.matchRegExp = /(``?)/mg;\\n};\\n\\nexports.parse = function() {\\n\\t// Move past the match\\n\\tthis.parser.pos = this.matchRegExp.lastIndex;\\n\\tvar reEnd = new RegExp(this.match[1], \\\"mg\\\");\\n\\t// Look for the end marker\\n\\treEnd.lastIndex = this.parser.pos;\\n\\tvar match = reEnd.exec(this.parser.source),\\n\\t\\ttext;\\n\\t// Process the text\\n\\tif(match) {\\n\\t\\ttext = this.parser.source.substring(this.parser.pos,match.index);\\n\\t\\tthis.parser.pos = match.index + match[0].length;\\n\\t} else {\\n\\t\\ttext = this.parser.source.substr(this.parser.pos);\\n\\t\\tthis.parser.pos = this.parser.sourceLength;\\n\\t}\\n\\treturn [{\\n\\t\\ttype: \\\"element\\\",\\n\\t\\ttag: \\\"code\\\",\\n\\t\\tchildren: [{\\n\\t\\t\\ttype: \\\"text\\\",\\n\\t\\t\\ttext: text\\n\\t\\t}]\\n\\t}];\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"wikirule\"},\"$:/core/modules/parsers/wikiparser/rules/commentblock.js\":{\"title\":\"$:/core/modules/parsers/wikiparser/rules/commentblock.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/parsers/wikiparser/rules/commentblock.js\\ntype: application/javascript\\nmodule-type: wikirule\\n\\nWiki text block rule for HTML comments. For example:\\n\\n```\\n\u003C!-- This is a comment -->\\n\\\\define macroX()\\n\u003C!-- This is a comment -->\\nxxxx\\n\\\\end\\n\u003C!-- This is a comment -->\\n\\n```\\n\\nNote that the syntax for comments is simplified to an opening \\\"\u003C!--\\\" sequence and a closing \\\"-->\\\" sequence -- HTML itself implements a more complex format (see http://ostermiller.org/findhtmlcomment.html)\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.name = \\\"commentblock\\\";\\nexports.types = {block:true, pragma:true};\\n\\nexports.init = function(parser) {\\n\\tthis.parser = parser;\\n\\tthis.matchRegExp = /\u003C!--/mg;\\n\\tthis.endMatchRegExp = /-->/mg;\\n};\\n\\nexports.findNextMatch = function(startPos) {\\n\\tthis.matchRegExp.lastIndex = startPos;\\n\\tthis.match = this.matchRegExp.exec(this.parser.source);\\n\\tif(this.match) {\\n\\t\\tthis.endMatchRegExp.lastIndex = this.match.index + this.match[0].length;\\n\\t\\tthis.endMatch = this.endMatchRegExp.exec(this.parser.source);\\n\\t\\tif(this.endMatch) {\\n\\t\\t\\treturn this.match.index;\\n\\t\\t}\\n\\t}\\n\\treturn undefined;\\n};\\n\\nexports.parse = function() {\\n\\t// Move past the match\\n\\tthis.parser.pos = this.endMatchRegExp.lastIndex;\\n\\t// Don't return any elements\\n\\treturn [];\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"wikirule\"},\"$:/core/modules/parsers/wikiparser/rules/commentinline.js\":{\"title\":\"$:/core/modules/parsers/wikiparser/rules/commentinline.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/parsers/wikiparser/rules/commentinline.js\\ntype: application/javascript\\nmodule-type: wikirule\\n\\nWiki text inline rule for HTML comments. For example:\\n\\n```\\n\u003C!-- This is a comment -->\\n```\\n\\nNote that the syntax for comments is simplified to an opening \\\"\u003C!--\\\" sequence and a closing \\\"-->\\\" sequence -- HTML itself implements a more complex format (see http://ostermiller.org/findhtmlcomment.html)\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.name = \\\"commentinline\\\";\\nexports.types = {inline: true};\\n\\nexports.init = function(parser) {\\n\\tthis.parser = parser;\\n\\tthis.matchRegExp = /\u003C!--/mg;\\n\\tthis.endMatchRegExp = /-->/mg;\\n};\\n\\nexports.findNextMatch = function(startPos) {\\n\\tthis.matchRegExp.lastIndex = startPos;\\n\\tthis.match = this.matchRegExp.exec(this.parser.source);\\n\\tif(this.match) {\\n\\t\\tthis.endMatchRegExp.lastIndex = this.match.index + this.match[0].length;\\n\\t\\tthis.endMatch = this.endMatchRegExp.exec(this.parser.source);\\n\\t\\tif(this.endMatch) {\\n\\t\\t\\treturn this.match.index;\\n\\t\\t}\\n\\t}\\n\\treturn undefined;\\n};\\n\\nexports.parse = function() {\\n\\t// Move past the match\\n\\tthis.parser.pos = this.endMatchRegExp.lastIndex;\\n\\t// Don't return any elements\\n\\treturn [];\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"wikirule\"},\"$:/core/modules/parsers/wikiparser/rules/dash.js\":{\"title\":\"$:/core/modules/parsers/wikiparser/rules/dash.js\",\"text\":\"/*\\\\\\ntitle: $
2731:/core/modules/parsers/wikiparser/rules/dash.js\\ntype: application/javascript\\nmodule-type: wikirule\\n\\nWiki text inline rule for dashes. For example:\\n\\n```\\nThis is an en-dash: --\\n\\nThis is an em-dash: ---\\n```\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.name = \\\"dash\\\";\\nexports.types = {inline: true};\\n\\nexports.init = function(parser) {\\n\\tthis.parser = parser;\\n\\t// Regexp to match\\n\\tthis.matchRegExp = /-{2,3}(?!-)/mg;\\n};\\n\\nexports.parse = function() {\\n\\t// Move past the match\\n\\tthis.parser.pos = this.matchRegExp.lastIndex;\\n\\tvar dash = this.match[0].length === 2 ? \\\"&ndash;\\\" : \\\"&mdash;\\\";\\n\\treturn [{\\n\\t\\ttype: \\\"entity\\\",\\n\\t\\tentity: dash\\n\\t}];\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"wikirule\"},\"$:/core/modules/parsers/wikiparser/rules/emphasis/bold.js\":{\"title\":\"$:/core/modules/parsers/wikiparser/rules/emphasis/bold.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/bold.js\\ntype: application/javascript\\nmodule-type: wikirule\\n\\nWiki text inline rule for emphasis - bold. For example:\\n\\n```\\n\\tThis is ''bold'' text\\n```\\n\\nThis wikiparser can be modified using the rules eg:\\n\\n```\\n\\\\rules except bold \\n\\\\rules only bold \\n```\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.name = \\\"bold\\\";\\nexports.types = {inline: true};\\n\\nexports.init = function(parser) {\\n\\tthis.parser = parser;\\n\\t// Regexp to match\\n\\tthis.matchRegExp = /''/mg;\\n};\\n\\nexports.parse = function() {\\n\\t// Move past the match\\n\\tthis.parser.pos = this.matchRegExp.lastIndex;\\n\\n\\t// Parse the run including the terminator\\n\\tvar tree = this.parser.parseInlineRun(/''/mg,{eatTerminator: true});\\n\\n\\t// Return the classed span\\n\\treturn [{\\n\\t\\ttype: \\\"element\\\",\\n\\t\\ttag: \\\"strong\\\",\\n\\t\\tchildren: tree\\n\\t}];\\n};\\n\\n})();\",\"type\":\"application/javascript\",\"module-type\":\"wikirule\"},\"$:/core/modules/parsers/wikiparser/rules/emphasis/italic.js\":{\"title\":\"$:/core/modules/parsers/wikiparser/rules/emphasis/italic.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/italic.js\\ntype: application/javascript\\nmodule-type: wikirule\\n\\nWiki text inline rule for emphasis - italic. For example:\\n\\n```\\n\\tThis is //italic// text\\n```\\n\\nThis wikiparser can be modified using the rules eg:\\n\\n```\\n\\\\rules except italic\\n\\\\rules only italic\\n```\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.name = \\\"italic\\\";\\nexports.types = {inline: true};\\n\\nexports.init = function(parser) {\\n\\tthis.parser = parser;\\n\\t// Regexp to match\\n\\tthis.matchRegExp = /\\\\/\\\\//mg;\\n};\\n\\nexports.parse = function() {\\n\\t// Move past the match\\n\\tthis.parser.pos = this.matchRegExp.lastIndex;\\n\\n\\t// Parse the run including the terminator\\n\\tvar tree = this.parser.parseInlineRun(/\\\\/\\\\//mg,{eatTerminator: true});\\n\\n\\t// Return the classed span\\n\\treturn [{\\n\\t\\ttype: \\\"element\\\",\\n\\t\\ttag: \\\"em\\\",\\n\\t\\tchildren: tree\\n\\t}];\\n};\\n\\n})();\",\"type\":\"application/javascript\",\"module-type\":\"wikirule\"},\"$:/core/modules/parsers/wikiparser/rules/emphasis/strikethrough.js\":{\"title\":\"$:/core/modules/parsers/wikiparser/rules/emphasis/strikethrough.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/strikethrough.js\\ntype: application/javascript\\nmodule-type: wikirule\\n\\nWiki text inline rule for emphasis - strikethrough. For example:\\n\\n```\\n\\tThis is ~~strikethrough~~ text\\n```\\n\\nThis wikiparser can be modified using the rules eg:\\n\\n```\\n\\\\rules except strikethrough \\n\\\\rules only strikethrough \\n```\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.name = \\\"strikethrough\\\";\\nexports.types = {inline: true};\\n\\nexports.init = function(parser) {\\n\\tthis.parser = parser;\\n\\t// Regexp to match\\n\\tthis.matchRegExp = /~~/mg;\\n};\\n\\nexports.parse = function() {\\n\\t// Move past the match\\n\\tthis.parser.pos = this.matchRegExp.lastIndex;\\n\\n\\t// Parse the run including the terminator\\n\\tvar tree = this.parser.parseInlineRun(/~~/mg,{eatTerminator: true});\\n\\n\\t// Return the classed span\\n\\treturn [{\\n\\t\\ttype: \\\"element\\\",\\n\\t\\ttag: \\\"strike\\\",\\n\\t\\tchildren: tree\\n\\t}];\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"wikirule\"},\"$:/core/modules/parsers/wikiparser/rules/emphasis/subscript.js\":{\"title\":\"$:/core/modules/parsers/wikiparser/rules/emphasis/subscript.js\",\"text\":\"/*\\\\\\ntitle: $
2731:/core/modules/parsers/wikiparser/rules/emphasis/subscript.js\\ntype: application/javascript\\nmodule-type: wikirule\\n\\nWiki text inline rule for emphasis - subscript. For example:\\n\\n```\\n\\tThis is ,,subscript,, text\\n```\\n\\nThis wikiparser can be modified using the rules eg:\\n\\n```\\n\\\\rules except subscript \\n\\\\rules only subscript \\n```\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.name = \\\"subscript\\\";\\nexports.types = {inline: true};\\n\\nexports.init = function(parser) {\\n\\tthis.parser = parser;\\n\\t// Regexp to match\\n\\tthis.matchRegExp = /,,/mg;\\n};\\n\\nexports.parse = function() {\\n\\t// Move past the match\\n\\tthis.parser.pos = this.matchRegExp.lastIndex;\\n\\n\\t// Parse the run including the terminator\\n\\tvar tree = this.parser.parseInlineRun(/,,/mg,{eatTerminator: true});\\n\\n\\t// Return the classed span\\n\\treturn [{\\n\\t\\ttype: \\\"element\\\",\\n\\t\\ttag: \\\"sub\\\",\\n\\t\\tchildren: tree\\n\\t}];\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"wikirule\"},\"$:/core/modules/parsers/wikiparser/rules/emphasis/superscript.js\":{\"title\":\"$:/core/modules/parsers/wikiparser/rules/emphasis/superscript.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/superscript.js\\ntype: application/javascript\\nmodule-type: wikirule\\n\\nWiki text inline rule for emphasis - superscript. For example:\\n\\n```\\n\\tThis is ^^superscript^^ text\\n```\\n\\nThis wikiparser can be modified using the rules eg:\\n\\n```\\n\\\\rules except superscript \\n\\\\rules only superscript \\n```\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.name = \\\"superscript\\\";\\nexports.types = {inline: true};\\n\\nexports.init = function(parser) {\\n\\tthis.parser = parser;\\n\\t// Regexp to match\\n\\tthis.matchRegExp = /\\\\^\\\\^/mg;\\n};\\n\\nexports.parse = function() {\\n\\t// Move past the match\\n\\tthis.parser.pos = this.matchRegExp.lastIndex;\\n\\n\\t// Parse the run including the terminator\\n\\tvar tree = this.parser.parseInlineRun(/\\\\^\\\\^/mg,{eatTerminator: true});\\n\\n\\t// Return the classed span\\n\\treturn [{\\n\\t\\ttype: \\\"element\\\",\\n\\t\\ttag: \\\"sup\\\",\\n\\t\\tchildren: tree\\n\\t}];\\n};\\n\\n})();\",\"type\":\"application/javascript\",\"module-type\":\"wikirule\"},\"$:/core/modules/parsers/wikiparser/rules/emphasis/underscore.js\":{\"title\":\"$:/core/modules/parsers/wikiparser/rules/emphasis/underscore.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/underscore.js\\ntype: application/javascript\\nmodule-type: wikirule\\n\\nWiki text inline rule for emphasis - underscore. For example:\\n\\n```\\n\\tThis is __underscore__ text\\n```\\n\\nThis wikiparser can be modified using the rules eg:\\n\\n```\\n\\\\rules except underscore \\n\\\\rules only underscore\\n```\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.name = \\\"underscore\\\";\\nexports.types = {inline: true};\\n\\nexports.init = function(parser) {\\n\\tthis.parser = parser;\\n\\t// Regexp to match\\n\\tthis.matchRegExp = /__/mg;\\n};\\n\\nexports.parse = function() {\\n\\t// Move past the match\\n\\tthis.parser.pos = this.matchRegExp.lastIndex;\\n\\n\\t// Parse the run including the terminator\\n\\tvar tree = this.parser.parseInlineRun(/__/mg,{eatTerminator: true});\\n\\n\\t// Return the classed span\\n\\treturn [{\\n\\t\\ttype: \\\"element\\\",\\n\\t\\ttag: \\\"u\\\",\\n\\t\\tchildren: tree\\n\\t}];\\n};\\n\\n})();\",\"type\":\"application/javascript\",\"module-type\":\"wikirule\"},\"$:/core/modules/parsers/wikiparser/rules/entity.js\":{\"title\":\"$:/core/modules/parsers/wikiparser/rules/entity.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/parsers/wikiparser/rules/entity.js\\ntype: application/javascript\\nmodule-type: wikirule\\n\\nWiki text inline rule for HTML entities. For example:\\n\\n```\\n\\tThis is a copyright symbol: &copy;\\n```\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.name = \\\"entity\\\";\\nexports.types = {inline: true};\\n\\nexports.init = function(parser) {\\n\\tthis.parser = parser;\\n\\t// Regexp to match\\n\\tthis.matchRegExp = /(&#?[a-zA-Z0-9]{2,8};)/mg;\\n};
2731\\n\\n/*\\nParse the most recent match\\n*/\\nexports.parse = function() {\\n\\t// Get all the details of the match\\n\\tvar entityString = this.match[1];\\n\\t// Move past the macro call\\n\\tthis.parser.pos = this.matchRegExp.lastIndex;\\n\\t// Return the entity\\n\\treturn [{type: \\\"entity\\\", entity: this.match[0]}];\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"wikirule\"},\"$:/core/modules/parsers/wikiparser/rules/extlink.js\":{\"title\":\"$:/core/modules/parsers/wikiparser/rules/extlink.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/parsers/wikiparser/rules/extlink.js\\ntype: application/javascript\\nmodule-type: wikirule\\n\\nWiki text inline rule for external links. For example:\\n\\n```\\nAn external link: https://www.tiddlywiki.com/\\n\\nA suppressed external link: ~http://www.tiddlyspace.com/\\n```\\n\\nExternal links can be suppressed by preceding them with `~`.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.name = \\\"extlink\\\";\\nexports.types = {inline: true};\\n\\nexports.init = function(parser) {\\n\\tthis.parser = parser;\\n\\t// Regexp to match\\n\\tthis.matchRegExp = /~?(?:file|http|https|mailto|ftp|irc|news|data|skype):[^\\\\s\u003C>{}\\\\[\\\\]`|\\\"\\\\\\\\^]+(?:\\\\/|\\\\b)/mg;\\n};\\n\\nexports.parse = function() {\\n\\t// Move past the match\\n\\tthis.parser.pos = this.matchRegExp.lastIndex;\\n\\t// Create the link unless it is suppressed\\n\\tif(this.match[0].substr(0,1) === \\\"~\\\") {\\n\\t\\treturn [{type: \\\"text\\\", text: this.match[0].substr(1)}];\\n\\t} else {\\n\\t\\treturn [{\\n\\t\\t\\ttype: \\\"element\\\",\\n\\t\\t\\ttag: \\\"a\\\",\\n\\t\\t\\tattributes: {\\n\\t\\t\\t\\thref: {type: \\\"string\\\", value: this.match[0]},\\n\\t\\t\\t\\t\\\"class\\\": {type: \\\"string\\\", value: \\\"tc-tiddlylink-external\\\"},\\n\\t\\t\\t\\ttarget: {type: \\\"string\\\", value: \\\"_blank\\\"},\\n\\t\\t\\t\\trel: {type: \\\"string\\\", value: \\\"noopener noreferrer\\\"}\\n\\t\\t\\t},\\n\\t\\t\\tchildren: [{\\n\\t\\t\\t\\ttype: \\\"text\\\", text: this.match[0]\\n\\t\\t\\t}]\\n\\t\\t}];\\n\\t}\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"wikirule\"},\"$:/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js\":{\"title\":\"$:/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js\\ntype: application/javascript\\nmodule-type: wikirule\\n\\nWiki text rule for block-level filtered transclusion. For example:\\n\\n```\\n{{{ [tag[docs]] }}}\\n{{{ [tag[docs]] |tooltip}}}\\n{{{ [tag[docs]] ||TemplateTitle}}}\\n{{{ [tag[docs]] |tooltip||TemplateTitle}}}\\n{{{ [tag[docs]] }}width:40;height:50;}.class.class\\n```\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.name = \\\"filteredtranscludeblock\\\";\\nexports.types = {block: true};\\n\\nexports.init = function(parser) {\\n\\tthis.parser = parser;\\n\\t// Regexp to match\\n\\tthis.matchRegExp = /\\\\{\\\\{\\\\{([^\\\\|]+?)(?:\\\\|([^\\\\|\\\\{\\\\}]+))?(?:\\\\|\\\\|([^\\\\|\\\\{\\\\}]+))?\\\\}\\\\}([^\\\\}]*)\\\\}(?:\\\\.(\\\\S+))?(?:\\\\r?\\\\n|$)/mg;\\n};\\n\\nexports.parse = function() {\\n\\t// Move past the match\\n\\tthis.parser.pos = this.matchRegExp.lastIndex;\\n\\t// Get the match details\\n\\tvar filter = this.match[1],\\n\\t\\ttooltip = this.match[2],\\n\\t\\ttemplate = $tw.utils.trim(this.match[3]),\\n\\t\\tstyle = this.match[4],\\n\\t\\tclasses = this.match[5];\\n\\t// Return the list widget\\n\\tvar node = {\\n\\t\\ttype: \\\"list\\\",\\n\\t\\tattributes: {\\n\\t\\t\\tfilter: {type: \\\"string\\\", value: filter}\\n\\t\\t},\\n\\t\\tisBlock: true\\n\\t};\\n\\tif(tooltip) {\\n\\t\\tnode.attributes.tooltip = {type: \\\"string\\\", value: tooltip};\\n\\t}\\n\\tif(template) {\\n\\t\\tnode.attributes.template = {type: \\\"string\\\", value: template};\\n\\t}\\n\\tif(style) {\\n\\t\\tnode.attributes.style = {type: \\\"string\\\", value: style};\\n\\t}\\n\\tif(classes) {\\n\\t\\tnode.attributes.itemClass = {type: \\\"string\\\", value: classes.split(\\\".\\\").join(\\\" \\\")};\\n\\t}\\n\\treturn [node];\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"wikirule\"},\"$:/core/modules/parsers/wikiparser/rules/filteredtranscludeinline.js\":{\"title\":\"$:/core/modules/parsers/wikiparser/rules/filteredtranscludeinline.js\",\"text\":\"/*\\\\\\ntitle: $
2731:/core/modules/parsers/wikiparser/rules/filteredtranscludeinline.js\\ntype: application/javascript\\nmodule-type: wikirule\\n\\nWiki text rule for inline filtered transclusion. For example:\\n\\n```\\n{{{ [tag[docs]] }}}\\n{{{ [tag[docs]] |tooltip}}}\\n{{{ [tag[docs]] ||TemplateTitle}}}\\n{{{ [tag[docs]] |tooltip||TemplateTitle}}}\\n{{{ [tag[docs]] }}width:40;height:50;}.class.class\\n```\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.name = \\\"filteredtranscludeinline\\\";\\nexports.types = {inline: true};\\n\\nexports.init = function(parser) {\\n\\tthis.parser = parser;\\n\\t// Regexp to match\\n\\tthis.matchRegExp = /\\\\{\\\\{\\\\{([^\\\\|]+?)(?:\\\\|([^\\\\|\\\\{\\\\}]+))?(?:\\\\|\\\\|([^\\\\|\\\\{\\\\}]+))?\\\\}\\\\}([^\\\\}]*)\\\\}(?:\\\\.(\\\\S+))?/mg;\\n};\\n\\nexports.parse = function() {\\n\\t// Move past the match\\n\\tthis.parser.pos = this.matchRegExp.lastIndex;\\n\\t// Get the match details\\n\\tvar filter = this.match[1],\\n\\t\\ttooltip = this.match[2],\\n\\t\\ttemplate = $tw.utils.trim(this.match[3]),\\n\\t\\tstyle = this.match[4],\\n\\t\\tclasses = this.match[5];\\n\\t// Return the list widget\\n\\tvar node = {\\n\\t\\ttype: \\\"list\\\",\\n\\t\\tattributes: {\\n\\t\\t\\tfilter: {type: \\\"string\\\", value: filter}\\n\\t\\t}\\n\\t};\\n\\tif(tooltip) {\\n\\t\\tnode.attributes.tooltip = {type: \\\"string\\\", value: tooltip};\\n\\t}\\n\\tif(template) {\\n\\t\\tnode.attributes.template = {type: \\\"string\\\", value: template};\\n\\t}\\n\\tif(style) {\\n\\t\\tnode.attributes.style = {type: \\\"string\\\", value: style};\\n\\t}\\n\\tif(classes) {\\n\\t\\tnode.attributes.itemClass = {type: \\\"string\\\", value: classes.split(\\\".\\\").join(\\\" \\\")};\\n\\t}\\n\\treturn [node];\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"wikirule\"},\"$:/core/modules/parsers/wikiparser/rules/fnprocdef.js\":{\"title\":\"$:/core/modules/parsers/wikiparser/rules/fnprocdef.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/parsers/wikiparser/rules/fnprocdef.js\\ntype: application/javascript\\nmodule-type: wikirule\\n\\nWiki pragma rule for function, procedure and widget definitions\\n\\n```\\n\\\\function name(param:defaultvalue,param2:defaultvalue)\\ndefinition text\\n\\\\end\\n\\n\\\\procedure name(param:defaultvalue,param2:defaultvalue)\\ndefinition text\\n\\\\end\\n\\n\\\\widget $mywidget(param:defaultvalue,param2:defaultvalue)\\ndefinition text\\n\\\\end\\n```\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.name = \\\"fnprocdef\\\";\\nexports.types = {pragma: true};\\n\\n/*\\nInstantiate parse rule\\n*/\\nexports.init = function(parser) {\\n\\tthis.parser = parser;\\n\\t// Regexp to match\\n\\tthis.matchRegExp = /\\\\\\\\(function|procedure|widget)\\\\s+([^(\\\\s]+)\\\\((\\\\s*([^)]*))?\\\\)(\\\\s*\\\\r?\\\\n)?/mg;\\n};
2731\\n\\n/*\\nParse the most recent match\\n*/\\nexports.parse = function() {\\n\\t// Move past the macro name and parameters\\n\\tthis.parser.pos = this.matchRegExp.lastIndex;\\n\\t// Parse the parameters\\n\\tvar params = [];\\n\\tif(this.match[3]) {\\n\\t\\tparams = $tw.utils.parseParameterDefinition(this.match[4]);\\n\\t}\\n\\t// Is this a multiline definition?\\n\\tvar reEnd;\\n\\tif(this.match[5]) {\\n\\t\\t// If so, the end of the body is marked with \\\\end\\n\\t\\treEnd = new RegExp(\\\"(\\\\\\\\r?\\\\\\\\n[^\\\\\\\\S\\\\\\\\n\\\\\\\\r]*\\\\\\\\\\\\\\\\end[^\\\\\\\\S\\\\\\\\n\\\\\\\\r]*(?:\\\" + $tw.utils.escapeRegExp(this.match[2]) + \\\")?(?:$|\\\\\\\\r?\\\\\\\\n))\\\",\\\"mg\\\");\\n\\t} else {\\n\\t\\t// Otherwise, the end of the definition is marked by the end of the line\\n\\t\\treEnd = /($|\\\\r?\\\\n)/mg;\\n\\t\\t// Move past any whitespace\\n\\t\\tthis.parser.pos = $tw.utils.skipWhiteSpace(this.parser.source,this.parser.pos);\\n\\t}\\n\\t// Find the end of the definition\\n\\treEnd.lastIndex = this.parser.pos;\\n\\tvar text,\\n\\t\\tendMatch = reEnd.exec(this.parser.source);\\n\\tif(endMatch) {\\n\\t\\ttext = this.parser.source.substring(this.parser.pos,endMatch.index);\\n\\t\\tthis.parser.pos = endMatch.index + endMatch[0].length;\\n\\t} else {\\n\\t\\t// We didn't find the end of the definition, so we'll make it blank\\n\\t\\ttext = \\\"\\\";\\n\\t}\\n\\t// Save the macro definition\\n\\tvar parseTreeNodes = [{\\n\\t\\ttype: \\\"set\\\",\\n\\t\\tattributes: {},\\n\\t\\tchildren: [],\\n\\t\\tparams: params\\n\\t}];\\n\\t$tw.utils.addAttributeToParseTreeNode(parseTreeNodes[0],\\\"name\\\",this.match[2]);\\n\\t$tw.utils.addAttributeToParseTreeNode(parseTreeNodes[0],\\\"value\\\",text);\\n\\tif(this.match[1] === \\\"function\\\") {\\n\\t\\tparseTreeNodes[0].isFunctionDefinition = true;\\n\\t} else if(this.match[1] === \\\"procedure\\\") {\\n\\t\\tparseTreeNodes[0].isProcedureDefinition = true;\\n\\t} else if(this.match[1] === \\\"widget\\\") {\\n\\t\\tparseTreeNodes[0].isWidgetDefinition = true;\\n\\t}\\n\\tif(this.parser.configTrimWhiteSpace) {\\n\\t\\tparseTreeNodes[0].configTrimWhiteSpace = true;\\n\\t}\\n\\treturn parseTreeNodes;\\n};\\n\\n})();\\n\\t\",\"type\":\"application/javascript\",\"module-type\":\"wikirule\"},\"$:/core/modules/parsers/wikiparser/rules/hardlinebreaks.js\":{\"title\":\"$:/core/modules/parsers/wikiparser/rules/hardlinebreaks.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/parsers/wikiparser/rules/hardlinebreaks.js\\ntype: application/javascript\\nmodule-type: wikirule\\n\\nWiki text inline rule for marking areas with hard line breaks. For example:\\n\\n```\\n\\\"\\\"\\\"\\nThis is some text\\nThat is set like\\nIt is a Poem\\nWhen it is\\nClearly\\nNot\\n\\\"\\\"\\\"\\n```\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.name = \\\"hardlinebreaks\\\";\\nexports.types = {inline: true};\\n\\nexports.init = function(parser) {\\n\\tthis.parser = parser;\\n\\t// Regexp to match\\n\\tthis.matchRegExp = /\\\"\\\"\\\"(?:\\\\r?\\\\n)?/mg;\\n};\\n\\nexports.parse = function() {\\n\\tvar reEnd = /(\\\"\\\"\\\")|(\\\\r?\\\\n)/mg,\\n\\t\\ttree = [],\\n\\t\\tmatch;\\n\\t// Move past the match\\n\\tthis.parser.pos = this.matchRegExp.lastIndex;\\n\\tdo {\\n\\t\\t// Parse the run up to the terminator\\n\\t\\ttree.push.apply(tree,this.parser.parseInlineRun(reEnd,{eatTerminator: false}));\\n\\t\\t// Redo the terminator match\\n\\t\\treEnd.lastIndex = this.parser.pos;\\n\\t\\tmatch = reEnd.exec(this.parser.source);\\n\\t\\tif(match) {\\n\\t\\t\\tthis.parser.pos = reEnd.lastIndex;\\n\\t\\t\\t// Add a line break if the terminator was a line break\\n\\t\\t\\tif(match[2]) {\\n\\t\\t\\t\\ttree.push({type: \\\"element\\\", tag: \\\"br\\\"});\\n\\t\\t\\t}\\n\\t\\t}\\n\\t} while(match && !match[1]);\\n\\t// Return the nodes\\n\\treturn tree;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"wikirule\"},\"$:/core/modules/parsers/wikiparser/rules/heading.js\":{\"title\":\"$:/core/modules/parsers/wikiparser/rules/heading.js\",\"text\":\"/*\\\\\\ntitle: $
2731:/core/modules/parsers/wikiparser/rules/heading.js\\ntype: application/javascript\\nmodule-type: wikirule\\n\\nWiki text block rule for headings\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.name = \\\"heading\\\";\\nexports.types = {block: true};\\n\\nexports.init = function(parser) {\\n\\tthis.parser = parser;\\n\\t// Regexp to match\\n\\tthis.matchRegExp = /(!{1,6})/mg;\\n};\\n\\n/*\\nParse the most recent match\\n*/\\nexports.parse = function() {\\n\\t// Get all the details of the match\\n\\tvar headingLevel = this.match[1].length;\\n\\t// Move past the !s\\n\\tthis.parser.pos = this.matchRegExp.lastIndex;\\n\\t// Parse any classes, whitespace and then the heading itself\\n\\tvar classes = this.parser.parseClasses();\\n\\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\\n\\tvar tree = this.parser.parseInlineRun(/(\\\\r?\\\\n)/mg);\\n\\t// Return the heading\\n\\treturn [{\\n\\t\\ttype: \\\"element\\\",\\n\\t\\ttag: \\\"h\\\" + headingLevel, \\n\\t\\tattributes: {\\n\\t\\t\\t\\\"class\\\": {type: \\\"string\\\", value: classes.join(\\\" \\\")}\\n\\t\\t},\\n\\t\\tchildren: tree\\n\\t}];\\n};\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"wikirule\"},\"$:/core/modules/parsers/wikiparser/rules/horizrule.js\":{\"title\":\"$:/core/modules/parsers/wikiparser/rules/horizrule.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/parsers/wikiparser/rules/horizrule.js\\ntype: application/javascript\\nmodule-type: wikirule\\n\\nWiki text block rule for rules. For example:\\n\\n```\\n---\\n```\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.name = \\\"horizrule\\\";\\nexports.types = {block: true};\\n\\nexports.init = function(parser) {\\n\\tthis.parser = parser;\\n\\t// Regexp to match\\n\\tthis.matchRegExp = /-{3,}\\\\r?(?:\\\\n|$)/mg;\\n};\\n\\nexports.parse = function() {\\n\\t// Move past the match\\n\\tthis.parser.pos = this.matchRegExp.lastIndex;\\n\\treturn [{type: \\\"element\\\", tag: \\\"hr\\\"}];\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"wikirule\"},\"$:/core/modules/parsers/wikiparser/rules/html.js\":{\"title\":\"$:/core/modules/parsers/wikiparser/rules/html.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/parsers/wikiparser/rules/html.js\\ntype: application/javascript\\nmodule-type: wikirule\\n\\nWiki rule for HTML elements and widgets. For example:\\n\\n{{{\\n\u003Caside>\\nThis is an HTML5 aside element\\n\u003C/aside>\\n\\n\u003C$slider target=\\\"MyTiddler\\\">\\nThis is a widget invocation\\n\u003C/$slider>\\n\\n}}}\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.name = \\\"html\\\";\\nexports.types = {inline: true, block: true};\\n\\nexports.init = function(parser) {\\n\\tthis.parser = parser;\\n};\\n\\nexports.findNextMatch = function(startPos) {\\n\\t// Find the next tag\\n\\tthis.nextTag = this.findNextTag(this.parser.source,startPos,{\\n\\t\\trequireLineBreak: this.is.block\\n\\t});\\n\\treturn this.nextTag ? this.nextTag.start : undefined;\\n};\\n\\n/*\\nParse the most recent match\\n*/\\nexports.parse = function() {\\n\\t// Retrieve the most recent match so that recursive calls don't overwrite it\\n\\tvar tag = this.nextTag;\\n\\tthis.nextTag = null;\\n\\t// Advance the parser position to past the tag\\n\\tthis.parser.pos = tag.end;\\n\\t// Check for an immediately following double linebreak\\n\\tvar hasLineBreak = !tag.isSelfClosing && !!$tw.utils.parseTokenRegExp(this.parser.source,this.parser.pos,/([^\\\\S\\\\n\\\\r]*\\\\r?\\\\n(?:[^\\\\S\\\\n\\\\r]*\\\\r?\\\\n|$))/g);\\n\\t// Set whether we're in block mode\\n\\ttag.isBlock = this.is.block || hasLineBreak;\\n\\t// Parse the body if we need to\\n\\tif(!tag.isSelfClosing && $tw.config.htmlVoidElements.indexOf(tag.tag) === -1) {\\n\\t\\tvar reEndString = \\\"\u003C/\\\" + $tw.utils.escapeRegExp(tag.tag) + \\\">\\\";\\n\\t\\tif(hasLineBreak) {\\n\\t\\t\\ttag.children = this.parser.parseBlocks(reEndString);\\n\\t\\t} else {\\n\\t\\t\\tvar reEnd = new RegExp(\\\"(\\\" + reEndString + \\\")\\\",\\\"mg\\\");\\n\\t\\t\\ttag.children = this.parser.parseInlineRun(reEnd,{eatTerminator: true});\\n\\t\\t}\\n\\t}\\n\\t// Return the tag\\n\\treturn [tag];\\n};
2731\\n\\n/*\\nLook for an HTML tag. Returns null if not found, otherwise returns {type: \\\"element\\\", name:, attributes: {}, orderedAttributes: [], isSelfClosing:, start:, end:,}\\n*/\\nexports.parseTag = function(source,pos,options) {\\n\\toptions = options || {};\\n\\tvar token,\\n\\t\\tnode = {\\n\\t\\t\\ttype: \\\"element\\\",\\n\\t\\t\\tstart: pos,\\n\\t\\t\\tattributes: {},\\n\\t\\t\\torderedAttributes: []\\n\\t\\t};\\n\\t// Define our regexps\\n\\tvar reTagName = /([a-zA-Z0-9\\\\-\\\\$\\\\.]+)/g;\\n\\t// Skip whitespace\\n\\tpos = $tw.utils.skipWhiteSpace(source,pos);\\n\\t// Look for a less than sign\\n\\ttoken = $tw.utils.parseTokenString(source,pos,\\\"\u003C\\\");\\n\\tif(!token) {\\n\\t\\treturn null;\\n\\t}\\n\\tpos = token.end;\\n\\t// Get the tag name\\n\\ttoken = $tw.utils.parseTokenRegExp(source,pos,reTagName);\\n\\tif(!token) {\\n\\t\\treturn null;\\n\\t}\\n\\tnode.tag = token.match[1];\\n\\tif(node.tag.charAt(0) === \\\"$\\\") {\\n\\t\\tnode.type = node.tag.substr(1);\\n\\t}\\n\\tpos = token.end;\\n\\t// Check that the tag is terminated by a space, / or >\\n\\tif(!$tw.utils.parseWhiteSpace(source,pos) && !(source.charAt(pos) === \\\"/\\\") && !(source.charAt(pos) === \\\">\\\") ) {\\n\\t\\treturn null;\\n\\t}\\n\\t// Process attributes\\n\\tvar attribute = $tw.utils.parseAttribute(source,pos);\\n\\twhile(attribute) {\\n\\t\\tnode.orderedAttributes.push(attribute);\\n\\t\\tnode.attributes[attribute.name] = attribute;\\n\\t\\tpos = attribute.end;\\n\\t\\t// Get the next attribute\\n\\t\\tattribute = $tw.utils.parseAttribute(source,pos);\\n\\t}\\n\\t// Skip whitespace\\n\\tpos = $tw.utils.skipWhiteSpace(source,pos);\\n\\t// Look for a closing slash\\n\\ttoken = $tw.utils.parseTokenString(source,pos,\\\"/\\\");\\n\\tif(token) {\\n\\t\\tpos = token.end;\\n\\t\\tnode.isSelfClosing = true;\\n\\t}\\n\\t// Look for a greater than sign\\n\\ttoken = $tw.utils.parseTokenString(source,pos,\\\">\\\");\\n\\tif(!token) {\\n\\t\\treturn null;\\n\\t}\\n\\tpos = token.end;\\n\\t// Check for a required line break\\n\\tif(options.requireLineBreak) {\\n\\t\\ttoken = $tw.utils.parseTokenRegExp(source,pos,/([^\\\\S\\\\n\\\\r]*\\\\r?\\\\n(?:[^\\\\S\\\\n\\\\r]*\\\\r?\\\\n|$))/g);\\n\\t\\tif(!token) {\\n\\t\\t\\treturn null;\\n\\t\\t}\\n\\t}\\n\\t// Update the end position\\n\\tnode.end = pos;\\n\\treturn node;\\n};\\n\\nexports.findNextTag = function(source,pos,options) {\\n\\t// A regexp for finding candidate HTML tags\\n\\tvar reLookahead = /\u003C([a-zA-Z\\\\-\\\\$\\\\.]+)/g;\\n\\t// Find the next candidate\\n\\treLookahead.lastIndex = pos;\\n\\tvar match = reLookahead.exec(source);\\n\\twhile(match) {\\n\\t\\t// Try to parse the candidate as a tag\\n\\t\\tvar tag = this.parseTag(source,match.index,options);\\n\\t\\t// Return success\\n\\t\\tif(tag && this.isLegalTag(tag)) {\\n\\t\\t\\treturn tag;\\n\\t\\t}\\n\\t\\t// Look for the next match\\n\\t\\treLookahead.lastIndex = match.index + 1;\\n\\t\\tmatch = reLookahead.exec(source);\\n\\t}\\n\\t// Failed\\n\\treturn null;\\n};\\n\\nexports.isLegalTag = function(tag) {\\n\\t// Widgets are always OK\\n\\tif(tag.type !== \\\"element\\\") {\\n\\t\\treturn true;\\n\\t// If it's an HTML tag that starts with a dash then it's not legal\\n\\t} else if(tag.tag.charAt(0) === \\\"-\\\") {\\n\\t\\treturn false;\\n\\t} else {\\n\\t\\t// Otherwise it's OK\\n\\t\\treturn true;\\n\\t}\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"wikirule\"},\"$:/core/modules/parsers/wikiparser/rules/image.js\":{\"title\":\"$:/core/modules/parsers/wikiparser/rules/image.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/parsers/wikiparser/rules/image.js\\ntype: application/javascript\\nmodule-type: wikirule\\n\\nWiki text inline rule for embedding images. For example:\\n\\n```\\n[img[https://tiddlywiki.com/fractalveg.jpg]]\\n[img width=23 height=24 [https://tiddlywiki.com/fractalveg.jpg]]\\n[img width={{!!width}} height={{!!height}} [https://tiddlywiki.com/fractalveg.jpg]]\\n[img[Description of image|https://tiddlywiki.com/fractalveg.jpg]]\\n[img[TiddlerTitle]]\\n[img[Description of image|TiddlerTitle]]\\n```\\n\\nGenerates the `\u003C$image>` widget.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.name = \\\"image\\\";\\nexports.types = {inline: true};\\n\\nexports.init = function(parser) {\\n\\tthis.parser = parser;\\n};\\n\\nexports.findNextMatch = function(startPos) {\\n\\t// Find the next tag\\n\\tthis.nextImage = this.findNextImage(this.parser.source,startPos);\\n\\treturn this.nextImage ? this.nextImage.start : undefined;\\n};\\n\\nexports.parse = function() {\\n\\t// Move past the match\\n\\tthis.parser.pos = this.nextImage.end;\\n\\tvar node = {\\n\\t\\ttype: \\\"image\\\",\\n\\t\\tattributes: this.nextImage.attributes\\n\\t};\\n\\treturn [node];\\n};
2731\\n\\n/*\\nFind the next image from the current position\\n*/\\nexports.findNextImage = function(source,pos) {\\n\\t// A regexp for finding candidate HTML tags\\n\\tvar reLookahead = /(\\\\[img)/g;\\n\\t// Find the next candidate\\n\\treLookahead.lastIndex = pos;\\n\\tvar match = reLookahead.exec(source);\\n\\twhile(match) {\\n\\t\\t// Try to parse the candidate as a tag\\n\\t\\tvar tag = this.parseImage(source,match.index);\\n\\t\\t// Return success\\n\\t\\tif(tag) {\\n\\t\\t\\treturn tag;\\n\\t\\t}\\n\\t\\t// Look for the next match\\n\\t\\treLookahead.lastIndex = match.index + 1;\\n\\t\\tmatch = reLookahead.exec(source);\\n\\t}\\n\\t// Failed\\n\\treturn null;\\n};\\n\\n/*\\nLook for an image at the specified position. Returns null if not found, otherwise returns {type: \\\"image\\\", attributes: [], isSelfClosing:, start:, end:,}\\n*/\\nexports.parseImage = function(source,pos) {\\n\\tvar token,\\n\\t\\tnode = {\\n\\t\\t\\ttype: \\\"image\\\",\\n\\t\\t\\tstart: pos,\\n\\t\\t\\tattributes: {}\\n\\t\\t};\\n\\t// Skip whitespace\\n\\tpos = $tw.utils.skipWhiteSpace(source,pos);\\n\\t// Look for the `[img`\\n\\ttoken = $tw.utils.parseTokenString(source,pos,\\\"[img\\\");\\n\\tif(!token) {\\n\\t\\treturn null;\\n\\t}\\n\\tpos = token.end;\\n\\t// Skip whitespace\\n\\tpos = $tw.utils.skipWhiteSpace(source,pos);\\n\\t// Process attributes\\n\\tif(source.charAt(pos) !== \\\"[\\\") {\\n\\t\\tvar attribute = $tw.utils.parseAttribute(source,pos);\\n\\t\\twhile(attribute) {\\n\\t\\t\\tnode.attributes[attribute.name] = attribute;\\n\\t\\t\\tpos = attribute.end;\\n\\t\\t\\tpos = $tw.utils.skipWhiteSpace(source,pos);\\n\\t\\t\\tif(source.charAt(pos) !== \\\"[\\\") {\\n\\t\\t\\t\\t// Get the next attribute\\n\\t\\t\\t\\tattribute = $tw.utils.parseAttribute(source,pos);\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tattribute = null;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\t// Skip whitespace\\n\\tpos = $tw.utils.skipWhiteSpace(source,pos);\\n\\t// Look for the `[` after the attributes\\n\\ttoken = $tw.utils.parseTokenString(source,pos,\\\"[\\\");\\n\\tif(!token) {\\n\\t\\treturn null;\\n\\t}\\n\\tpos = token.end;\\n\\t// Skip whitespace\\n\\tpos = $tw.utils.skipWhiteSpace(source,pos);\\n\\t// Get the source up to the terminating `]]`\\n\\ttoken = $tw.utils.parseTokenRegExp(source,pos,/(?:([^|\\\\]]*?)\\\\|)?([^\\\\]]+?)\\\\]\\\\]/g);\\n\\tif(!token) {\\n\\t\\treturn null;\\n\\t}\\n\\tpos = token.end;\\n\\tif(token.match[1]) {\\n\\t\\tnode.attributes.tooltip = {type: \\\"string\\\", value: token.match[1].trim()};\\n\\t}\\n\\tnode.attributes.source = {type: \\\"string\\\", value: (token.match[2] || \\\"\\\").trim()};\\n\\t// Update the end position\\n\\tnode.end = pos;\\n\\treturn node;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"wikirule\"},\"$:/core/modules/parsers/wikiparser/rules/import.js\":{\"title\":\"$:/core/modules/parsers/wikiparser/rules/import.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/parsers/wikiparser/rules/import.js\\ntype: application/javascript\\nmodule-type: wikirule\\n\\nWiki pragma rule for importing variable definitions\\n\\n```\\n\\\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\\n```\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.name = \\\"import\\\";\\nexports.types = {pragma: true};\\n\\n/*\\nInstantiate parse rule\\n*/\\nexports.init = function(parser) {\\n\\tthis.parser = parser;\\n\\t// Regexp to match\\n\\tthis.matchRegExp = /\\\\\\\\import[^\\\\S\\\\n]/mg;\\n};
2731\\n\\n/*\\nParse the most recent match\\n*/\\nexports.parse = function() {\\n\\tvar self = this;\\n\\t// Move past the pragma invocation\\n\\tthis.parser.pos = this.matchRegExp.lastIndex;\\n\\t// Parse the filter terminated by a line break\\n\\tvar reMatch = /(.*)(?:$|\\\\r?\\\\n)/mg;\\n\\treMatch.lastIndex = this.parser.pos;\\n\\tvar match = reMatch.exec(this.parser.source);\\n\\tthis.parser.pos = reMatch.lastIndex;\\n\\t// Parse tree nodes to return\\n\\treturn [{\\n\\t\\ttype: \\\"importvariables\\\",\\n\\t\\tattributes: {\\n\\t\\t\\tfilter: {type: \\\"string\\\", value: match[1]}\\n\\t\\t},\\n\\t\\tchildren: []\\n\\t}];\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"wikirule\"},\"$:/core/modules/parsers/wikiparser/rules/list.js\":{\"title\":\"$:/core/modules/parsers/wikiparser/rules/list.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/parsers/wikiparser/rules/list.js\\ntype: application/javascript\\nmodule-type: wikirule\\n\\nWiki text block rule for lists. For example:\\n\\n```\\n* This is an unordered list\\n* It has two items\\n\\n# This is a numbered list\\n## With a subitem\\n# And a third item\\n\\n; This is a term that is being defined\\n: This is the definition of that term\\n```\\n\\nNote that lists can be nested arbitrarily:\\n\\n```\\n#** One\\n#* Two\\n#** Three\\n#**** Four\\n#**# Five\\n#**## Six\\n## Seven\\n### Eight\\n## Nine\\n```\\n\\nA CSS class can be applied to a list item as follows:\\n\\n```\\n* List item one\\n*.active List item two has the class `active`\\n* List item three\\n```\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.name = \\\"list\\\";\\nexports.types = {block: true};\\n\\nexports.init = function(parser) {\\n\\tthis.parser = parser;\\n\\t// Regexp to match\\n\\tthis.matchRegExp = /([\\\\*#;:>]+)/mg;\\n};\\n\\nvar listTypes = {\\n\\t\\\"*\\\": {listTag: \\\"ul\\\", itemTag: \\\"li\\\"},\\n\\t\\\"#\\\": {listTag: \\\"ol\\\", itemTag: \\\"li\\\"},\\n\\t\\\";\\\": {listTag: \\\"dl\\\", itemTag: \\\"dt\\\"},\\n\\t\\\":\\\": {listTag: \\\"dl\\\", itemTag: \\\"dd\\\"},\\n\\t\\\">\\\": {listTag: \\\"blockquote\\\", itemTag: \\\"div\\\"}\\n};\\n\\n/*\\nParse the most recent match\\n*/\\nexports.parse = function() {\\n\\t// Array of parse tree nodes for the previous row of the list\\n\\tvar listStack = [];\\n\\t// Cycle through the items in the list\\n\\twhile(true) {\\n\\t\\t// Match the list marker\\n\\t\\tvar reMatch = /([\\\\*#;:>]+)/mg;\\n\\t\\treMatch.lastIndex = this.parser.pos;\\n\\t\\tvar match = reMatch.exec(this.parser.source);\\n\\t\\tif(!match || match.index !== this.parser.pos) {\\n\\t\\t\\tbreak;\\n\\t\\t}\\n\\t\\t// Check whether the list type of the top level matches\\n\\t\\tvar listInfo = listTypes[match[0].charAt(0)];\\n\\t\\tif(listStack.length > 0 && listStack[0].tag !== listInfo.listTag) {\\n\\t\\t\\tbreak;\\n\\t\\t}\\n\\t\\t// Move past the list marker\\n\\t\\tthis.parser.pos = match.index + match[0].length;\\n\\t\\t// Walk through the list markers for the current row\\n\\t\\tfor(var t=0; t\u003Cmatch[0].length; t++) {\\n\\t\\t\\tlistInfo = listTypes[match[0].charAt(t)];\\n\\t\\t\\t// Remove any stacked up element if we can't re-use it because the list type doesn't match\\n\\t\\t\\tif(listStack.length > t && listStack[t].tag !== listInfo.listTag) {\\n\\t\\t\\t\\tlistStack.splice(t,listStack.length - t);\\n\\t\\t\\t}\\n\\t\\t\\t// Construct the list element or reuse the previous one at this level\\n\\t\\t\\tif(listStack.length \u003C= t) {\\n\\t\\t\\t\\tvar listElement = {type: \\\"element\\\", tag: listInfo.listTag, children: [\\n\\t\\t\\t\\t\\t{type: \\\"element\\\", tag: listInfo.itemTag, children: []}\\n\\t\\t\\t\\t]};\\n\\t\\t\\t\\t// Link this list element into the last child item of the parent list item\\n\\t\\t\\t\\tif(t) {\\n\\t\\t\\t\\t\\tvar prevListItem = listStack[t-1].children[listStack[t-1].children.length-1];\\n\\t\\t\\t\\t\\tprevListItem.children.push(listElement);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t// Save this element in the stack\\n\\t\\t\\t\\tlistStack[t] = listElement;\\n\\t\\t\\t} else if(t === (match[0].length - 1)) {\\n\\t\\t\\t\\tlistStack[t].children.push({type: \\\"element\\\", tag: listInfo.itemTag, children: []});\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tif(listStack.length > match[0].length) {\\n\\t\\t\\tlistStack.splice(match[0].length,listStack.length - match[0].length);\\n\\t\\t}\\n\\t\\t// Process the body of the list item into the last list item\\n\\t\\tvar lastListChildren = listStack[listStack.length-1].children,\\n\\t\\t\\tlastListItem = lastListChildren[lastListChildren.length-1],\\n\\t\\t\\tclasses = this.parser.parseClasses();\\n\\t\\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\\n\\t\\tvar tree = this.parser.parseInlineRun(/(\\\\r?\\\\n)/mg);\\n\\t\\tlastListItem.children.push.apply(lastListItem.children,tree);\\n\\t\\tif(classes.length >
2731 0) {\\n\\t\\t\\t$tw.utils.addClassToParseTreeNode(lastListItem,classes.join(\\\" \\\"));\\n\\t\\t}\\n\\t\\t// Consume any whitespace following the list item\\n\\t\\tthis.parser.skipWhitespace();\\n\\t}\\n\\t// Return the root element of the list\\n\\treturn [listStack[0]];\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"wikirule\"},\"$:/core/modules/parsers/wikiparser/rules/macrocallblock.js\":{\"title\":\"$:/core/modules/parsers/wikiparser/rules/macrocallblock.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/parsers/wikiparser/rules/macrocallblock.js\\ntype: application/javascript\\nmodule-type: wikirule\\n\\nWiki rule for block macro calls\\n\\n```\\n\u003C\u003Cname value value2>>\\n```\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.name = \\\"macrocallblock\\\";\\nexports.types = {block: true};\\n\\nexports.init = function(parser) {\\n\\tthis.parser = parser;\\n};\\n\\nexports.findNextMatch = function(startPos) {\\n\\tvar nextStart = startPos;\\n\\t// Try parsing at all possible macrocall openers until we match\\n\\twhile((nextStart = this.parser.source.indexOf(\\\"\u003C\u003C\\\",nextStart)) >= 0) {\\n\\t\\tvar nextCall = $tw.utils.parseMacroInvocationAsTransclusion(this.parser.source,nextStart);\\n\\t\\tif(nextCall) {\\n\\t\\t\\tvar c = this.parser.source.charAt(nextCall.end);\\n\\t\\t\\t// Ensure EOL after parsed macro\\n\\t\\t\\t// If we didn't need to support IE, we'd just use /(?:\\\\r?\\\\n|$)/ym\\n\\t\\t\\tif ((c === \\\"\\\") || (c === \\\"\\\\n\\\") || ((c === \\\"\\\\r\\\") && this.parser.source.charAt(nextCall.end+1) === \\\"\\\\n\\\")) {\\n\\t\\t\\t\\tthis.nextCall = nextCall;\\n\\t\\t\\t\\treturn nextStart;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tnextStart += 2;\\n\\t}\\n\\treturn undefined;\\n};\\n\\n/*\\nParse the most recent match\\n*/\\nexports.parse = function() {\\n\\tvar call = this.nextCall;\\n\\tcall.isBlock = true;\\n\\tthis.nextCall = null;\\n\\tthis.parser.pos = call.end;\\n\\treturn [call];\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"wikirule\"},\"$:/core/modules/parsers/wikiparser/rules/macrocallinline.js\":{\"title\":\"$:/core/modules/parsers/wikiparser/rules/macrocallinline.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/parsers/wikiparser/rules/macrocallinline.js\\ntype: application/javascript\\nmodule-type: wikirule\\n\\nWiki rule for macro calls\\n\\n```\\n\u003C\u003Cname value value2>>\\n```\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.name = \\\"macrocallinline\\\";\\nexports.types = {inline: true};\\n\\nexports.init = function(parser) {\\n\\tthis.parser = parser;\\n};\\n\\nexports.findNextMatch = function(startPos) {\\n\\tvar nextStart = startPos;\\n\\t// Try parsing at all possible macrocall openers until we match\\n\\twhile((nextStart = this.parser.source.indexOf(\\\"\u003C\u003C\\\",nextStart)) >= 0) {\\n\\t\\tthis.nextCall = $tw.utils.parseMacroInvocationAsTransclusion(this.parser.source,nextStart);\\n\\t\\tif(this.nextCall) {\\n\\t\\t\\treturn nextStart;\\n\\t\\t}\\n\\t\\tnextStart += 2;\\n\\t}\\n\\treturn undefined;\\n};\\n\\n/*\\nParse the most recent match\\n*/\\nexports.parse = function() {\\n\\tvar call = this.nextCall;\\n\\tthis.nextCall = null;\\n\\tthis.parser.pos = call.end;\\n\\treturn [call];\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"wikirule\"},\"$:/core/modules/parsers/wikiparser/rules/macrodef.js\":{\"title\":\"$:/core/modules/parsers/wikiparser/rules/macrodef.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/parsers/wikiparser/rules/macrodef.js\\ntype: application/javascript\\nmodule-type: wikirule\\n\\nWiki pragma rule for macro definitions\\n\\n```\\n\\\\define name(param:defaultvalue,param2:defaultvalue)\\ndefinition text, including $param$ markers\\n\\\\end\\n```\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.name = \\\"macrodef\\\";\\nexports.types = {pragma: true};\\n\\n/*\\nInstantiate parse rule\\n*/\\nexports.init = function(parser) {\\n\\tthis.parser = parser;\\n\\t// Regexp to match\\n\\tthis.matchRegExp = /\\\\\\\\define\\\\s+([^(\\\\s]+)\\\\(\\\\s*([^)]*)\\\\)(\\\\s*\\\\r?\\\\n)?/mg;\\n};
2731\\n\\n/*\\nParse the most recent match\\n*/\\nexports.parse = function() {\\n\\t// Move past the macro name and parameters\\n\\tthis.parser.pos = this.matchRegExp.lastIndex;\\n\\t// Parse the parameters\\n\\tvar paramString = this.match[2],\\n\\t\\tparams = [];\\n\\tif(paramString !== \\\"\\\") {\\n\\t\\tvar reParam = /\\\\s*([A-Za-z0-9\\\\-_]+)(?:\\\\s*:\\\\s*(?:\\\"\\\"\\\"([\\\\s\\\\S]*?)\\\"\\\"\\\"|\\\"([^\\\"]*)\\\"|'([^']*)'|\\\\[\\\\[([^\\\\]]*)\\\\]\\\\]|([^\\\"'\\\\s]+)))?/mg,\\n\\t\\t\\tparamMatch = reParam.exec(paramString);\\n\\t\\twhile(paramMatch) {\\n\\t\\t\\t// Save the parameter details\\n\\t\\t\\tvar paramInfo = {name: paramMatch[1]},\\n\\t\\t\\t\\tdefaultValue = paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5] || paramMatch[6];\\n\\t\\t\\tif(defaultValue) {\\n\\t\\t\\t\\tparamInfo[\\\"default\\\"] = defaultValue;\\n\\t\\t\\t}\\n\\t\\t\\tparams.push(paramInfo);\\n\\t\\t\\t// Look for the next parameter\\n\\t\\t\\tparamMatch = reParam.exec(paramString);\\n\\t\\t}\\n\\t}\\n\\t// Is this a multiline definition?\\n\\tvar reEnd;\\n\\tif(this.match[3]) {\\n\\t\\t// If so, the end of the body is marked with \\\\end\\n\\t\\treEnd = new RegExp(\\\"(\\\\\\\\r?\\\\\\\\n[^\\\\\\\\S\\\\\\\\n\\\\\\\\r]*\\\\\\\\\\\\\\\\end[^\\\\\\\\S\\\\\\\\n\\\\\\\\r]*(?:\\\" + $tw.utils.escapeRegExp(this.match[1]) + \\\")?(?:$|\\\\\\\\r?\\\\\\\\n))\\\",\\\"mg\\\");\\n\\t} else {\\n\\t\\t// Otherwise, the end of the definition is marked by the end of the line\\n\\t\\treEnd = /($|\\\\r?\\\\n)/mg;\\n\\t\\t// Move past any whitespace\\n\\t\\tthis.parser.pos = $tw.utils.skipWhiteSpace(this.parser.source,this.parser.pos);\\n\\t}\\n\\t// Find the end of the definition\\n\\treEnd.lastIndex = this.parser.pos;\\n\\tvar text,\\n\\t\\tendMatch = reEnd.exec(this.parser.source);\\n\\tif(endMatch) {\\n\\t\\ttext = this.parser.source.substring(this.parser.pos,endMatch.index);\\n\\t\\tthis.parser.pos = endMatch.index + endMatch[0].length;\\n\\t} else {\\n\\t\\t// We didn't find the end of the definition, so we'll make it blank\\n\\t\\ttext = \\\"\\\";\\n\\t}\\n\\t// Save the macro definition\\n\\tvar parseTreeNodes = [{\\n\\t\\ttype: \\\"set\\\",\\n\\t\\tattributes: {},\\n\\t\\tchildren: [],\\n\\t\\tparams: params,\\n\\t\\tisMacroDefinition: true\\n\\t}];\\n\\t$tw.utils.addAttributeToParseTreeNode(parseTreeNodes[0],\\\"name\\\",this.match[1]);\\n\\t$tw.utils.addAttributeToParseTreeNode(parseTreeNodes[0],\\\"value\\\",text);\\n\\treturn parseTreeNodes;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"wikirule\"},\"$:/core/modules/parsers/wikiparser/rules/parameters.js\":{\"title\":\"$:/core/modules/parsers/wikiparser/rules/parameters.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/parsers/wikiparser/rules/parameters.js\\ntype: application/javascript\\nmodule-type: wikirule\\n\\nWiki pragma rule for parameter definitions\\n\\n```\\n\\\\parameters(param:defaultvalue,param2:defaultvalue)\\ndefinition text\\n```\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.name = \\\"parameters\\\";\\nexports.types = {pragma: true};\\n\\n/*\\nInstantiate parse rule\\n*/\\nexports.init = function(parser) {\\n\\tthis.parser = parser;\\n\\t// Regexp to match\\n\\tthis.matchRegExp = /\\\\\\\\parameters\\\\s*\\\\(([^)]*)\\\\)(\\\\s*\\\\r?\\\\n)?/mg;\\n};
2731\\n\\n/*\\nParse the most recent match\\n*/\\nexports.parse = function() {\\n\\t// Move past the macro name and parameters\\n\\tthis.parser.pos = this.matchRegExp.lastIndex;\\n\\t// Parse the parameters\\n\\tvar params = $tw.utils.parseParameterDefinition(this.match[1]);\\n\\tvar attributes = Object.create(null),\\n\\t\\torderedAttributes = [];\\n\\t$tw.utils.each(params,function(param) {\\n\\t\\tvar name = param.name;\\n\\t\\t// Parameter names starting with dollar must be escaped to double dollars for the parameters widget\\n\\t\\tif(name.charAt(0) === \\\"$\\\") {\\n\\t\\t\\tname = \\\"$\\\" + name;\\n\\t\\t}\\n\\t\\tvar attribute = {name: name, type: \\\"string\\\", value: param[\\\"default\\\"] || \\\"\\\"};\\n\\t\\tattributes[name] = attribute;\\n\\t\\torderedAttributes.push(attribute);\\n\\t});\\n\\t// Save the macro definition\\n\\treturn [{\\n\\t\\ttype: \\\"parameters\\\",\\n\\t\\tattributes: attributes,\\n\\t\\torderedAttributes: orderedAttributes\\n\\t}];\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"wikirule\"},\"$:/core/modules/parsers/wikiparser/rules/parsermode.js\":{\"title\":\"$:/core/modules/parsers/wikiparser/rules/parsermode.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/parsers/wikiparser/rules/parsermode.js\\ntype: application/javascript\\nmodule-type: wikirule\\n\\nWiki pragma rule for parser mode specifications\\n\\n```\\n\\\\parsermode block\\n\\\\parsermode inline\\n```\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.name = \\\"parsermode\\\";\\nexports.types = {pragma: true};\\n\\n/*\\nInstantiate parse rule\\n*/\\nexports.init = function(parser) {\\n\\tthis.parser = parser;\\n\\t// Regexp to match\\n\\tthis.matchRegExp = /\\\\\\\\parsermode[^\\\\S\\\\n]/mg;\\n};
2731\\n\\n/*\\nParse the most recent match\\n*/\\nexports.parse = function() {\\n\\t// Move past the pragma invocation\\n\\tthis.parser.pos = this.matchRegExp.lastIndex;\\n\\t// Parse whitespace delimited tokens terminated by a line break\\n\\tvar reMatch = /[^\\\\S\\\\n]*(\\\\S+)|(\\\\r?\\\\n)/mg,\\n\\t\\tparserMode = undefined;\\n\\treMatch.lastIndex = this.parser.pos;\\n\\tvar match = reMatch.exec(this.parser.source);\\n\\twhile(match && match.index === this.parser.pos) {\\n\\t\\tthis.parser.pos = reMatch.lastIndex;\\n\\t\\t// Exit if we've got the line break\\n\\t\\tif(match[2]) {\\n\\t\\t\\tbreak;\\n\\t\\t}\\n\\t\\t// Process the token\\n\\t\\tif(match[1]) {\\n\\t\\t\\tparserMode = match[1];\\n\\t\\t}\\n\\t\\t// Match the next token\\n\\t\\tmatch = reMatch.exec(this.parser.source);\\n\\t}\\n\\t// Process the tokens\\n\\tif(parserMode !== undefined) {\\n\\t\\tif(parserMode === \\\"block\\\") {\\n\\t\\t\\tthis.parser.parseAsInline = false;\\n\\t\\t} else if(parserMode === \\\"inline\\\") {\\n\\t\\t\\tthis.parser.parseAsInline = true;\\n\\t\\t}\\n\\t}\\n\\t// No parse tree nodes to return\\n\\treturn [];\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"wikirule\"},\"$:/core/modules/parsers/wikiparser/rules/prettyextlink.js\":{\"title\":\"$:/core/modules/parsers/wikiparser/rules/prettyextlink.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/parsers/wikiparser/rules/prettyextlink.js\\ntype: application/javascript\\nmodule-type: wikirule\\n\\nWiki text inline rule for external links. For example:\\n\\n```\\n[ext[https://tiddlywiki.com/fractalveg.jpg]]\\n[ext[Tooltip|https://tiddlywiki.com/fractalveg.jpg]]\\n```\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.name = \\\"prettyextlink\\\";\\nexports.types = {inline: true};\\n\\nexports.init = function(parser) {\\n\\tthis.parser = parser;\\n};\\n\\nexports.findNextMatch = function(startPos) {\\n\\t// Find the next tag\\n\\tthis.nextLink = this.findNextLink(this.parser.source,startPos);\\n\\treturn this.nextLink ? this.nextLink.start : undefined;\\n};\\n\\nexports.parse = function() {\\n\\t// Move past the match\\n\\tthis.parser.pos = this.nextLink.end;\\n\\treturn [this.nextLink];\\n};\\n\\n/*\\nFind the next link from the current position\\n*/\\nexports.findNextLink = function(source,pos) {\\n\\t// A regexp for finding candidate links\\n\\tvar reLookahead = /(\\\\[ext\\\\[)/g;\\n\\t// Find the next candidate\\n\\treLookahead.lastIndex = pos;\\n\\tvar match = reLookahead.exec(source);\\n\\twhile(match) {\\n\\t\\t// Try to parse the candidate as a link\\n\\t\\tvar link = this.parseLink(source,match.index);\\n\\t\\t// Return success\\n\\t\\tif(link) {\\n\\t\\t\\treturn link;\\n\\t\\t}\\n\\t\\t// Look for the next match\\n\\t\\treLookahead.lastIndex = match.index + 1;\\n\\t\\tmatch = reLookahead.exec(source);\\n\\t}\\n\\t// Failed\\n\\treturn null;\\n};
2731\\n\\n/*\\nLook for an link at the specified position. Returns null if not found, otherwise returns {type: \\\"element\\\", tag: \\\"a\\\", attributes: [], isSelfClosing:, start:, end:,}\\n*/\\nexports.parseLink = function(source,pos) {\\n\\tvar token,\\n\\t\\ttextNode = {\\n\\t\\t\\ttype: \\\"text\\\"\\n\\t\\t},\\n\\t\\tnode = {\\n\\t\\t\\ttype: \\\"element\\\",\\n\\t\\t\\ttag: \\\"a\\\",\\n\\t\\t\\tstart: pos,\\n\\t\\t\\tattributes: {\\n\\t\\t\\t\\t\\\"class\\\": {type: \\\"string\\\", value: \\\"tc-tiddlylink-external\\\"},\\n\\t\\t\\t},\\n\\t\\t\\tchildren: [textNode]\\n\\t\\t};\\n\\t// Skip whitespace\\n\\tpos = $tw.utils.skipWhiteSpace(source,pos);\\n\\t// Look for the `[ext[`\\n\\ttoken = $tw.utils.parseTokenString(source,pos,\\\"[ext[\\\");\\n\\tif(!token) {\\n\\t\\treturn null;\\n\\t}\\n\\tpos = token.end;\\n\\t// Look ahead for the terminating `]]`\\n\\tvar closePos = source.indexOf(\\\"]]\\\",pos);\\n\\tif(closePos === -1) {\\n\\t\\treturn null;\\n\\t}\\n\\t// Look for a `|` separating the tooltip\\n\\tvar splitPos = source.indexOf(\\\"|\\\",pos);\\n\\tif(splitPos === -1 || splitPos > closePos) {\\n\\t\\tsplitPos = null;\\n\\t}\\n\\t// Pull out the tooltip and URL\\n\\tvar tooltip, URL;\\n\\tif(splitPos) {\\n\\t\\tURL = source.substring(splitPos + 1,closePos).trim();\\n\\t\\ttextNode.text = source.substring(pos,splitPos).trim();\\n\\t} else {\\n\\t\\tURL = source.substring(pos,closePos).trim();\\n\\t\\ttextNode.text = URL;\\n\\t}\\n\\tnode.attributes.href = {type: \\\"string\\\", value: URL};\\n\\tnode.attributes.target = {type: \\\"string\\\", value: \\\"_blank\\\"};\\n\\tnode.attributes.rel = {type: \\\"string\\\", value: \\\"noopener noreferrer\\\"};\\n\\t// Update the end position\\n\\tnode.end = closePos + 2;\\n\\treturn node;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"wikirule\"},\"$:/core/modules/parsers/wikiparser/rules/prettylink.js\":{\"title\":\"$:/core/modules/parsers/wikiparser/rules/prettylink.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/parsers/wikiparser/rules/prettylink.js\\ntype: application/javascript\\nmodule-type: wikirule\\n\\nWiki text inline rule for pretty links. For example:\\n\\n```\\n[[Introduction]]\\n\\n[[Link description|TiddlerTitle]]\\n```\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.name = \\\"prettylink\\\";\\nexports.types = {inline: true};\\n\\nexports.init = function(parser) {\\n\\tthis.parser = parser;\\n\\t// Regexp to match\\n\\tthis.matchRegExp = /\\\\[\\\\[(.*?)(?:\\\\|(.*?))?\\\\]\\\\]/mg;\\n};\\n\\nexports.parse = function() {\\n\\t// Move past the match\\n\\tthis.parser.pos = this.matchRegExp.lastIndex;\\n\\t// Process the link\\n\\tvar text = this.match[1],\\n\\t\\tlink = this.match[2] || text;\\n\\tif($tw.utils.isLinkExternal(link)) {\\n\\t\\treturn [{\\n\\t\\t\\ttype: \\\"element\\\",\\n\\t\\t\\ttag: \\\"a\\\",\\n\\t\\t\\tattributes: {\\n\\t\\t\\t\\thref: {type: \\\"string\\\", value: link},\\n\\t\\t\\t\\t\\\"class\\\": {type: \\\"string\\\", value: \\\"tc-tiddlylink-external\\\"},\\n\\t\\t\\t\\ttarget: {type: \\\"string\\\", value: \\\"_blank\\\"},\\n\\t\\t\\t\\trel: {type: \\\"string\\\", value: \\\"noopener noreferrer\\\"}\\n\\t\\t\\t},\\n\\t\\t\\tchildren: [{\\n\\t\\t\\t\\ttype: \\\"text\\\", text: text\\n\\t\\t\\t}]\\n\\t\\t}];\\n\\t} else {\\n\\t\\treturn [{\\n\\t\\t\\ttype: \\\"link\\\",\\n\\t\\t\\tattributes: {\\n\\t\\t\\t\\tto: {type: \\\"string\\\", value: link}\\n\\t\\t\\t},\\n\\t\\t\\tchildren: [{\\n\\t\\t\\t\\ttype: \\\"text\\\", text: text\\n\\t\\t\\t}]\\n\\t\\t}];\\n\\t}\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"wikirule\"},\"$:/core/modules/parsers/wikiparser/rules/quoteblock.js\":{\"title\":\"$:/core/modules/parsers/wikiparser/rules/quoteblock.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/parsers/wikiparser/rules/quoteblock.js\\ntype: application/javascript\\nmodule-type: wikirule\\n\\nWiki text rule for quote blocks. For example:\\n\\n```\\n\\t\u003C\u003C\u003C.optionalClass(es) optional cited from\\n\\ta quote\\n\\t\u003C\u003C\u003C\\n\\t\\n\\t\u003C\u003C\u003C.optionalClass(es)\\n\\ta quote\\n\\t\u003C\u003C\u003C optional cited from\\n```\\n\\nQuotes can be quoted by putting more \u003Cs\\n\\n```\\n\\t\u003C\u003C\u003C\\n\\tQuote Level 1\\n\\t\\n\\t\u003C\u003C\u003C\u003C\\n\\tQuoteLevel 2\\n\\t\u003C\u003C\u003C\u003C\\n\\t\\n\\t\u003C\u003C\u003C\\n```\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.name = \\\"quoteblock\\\";\\nexports.types = {block: true};\\n\\nexports.init = function(parser) {\\n\\tthis.parser = parser;\\n\\t// Regexp to match\\n\\tthis.matchRegExp = /(\u003C\u003C\u003C+)/mg;\\n};\\n\\nexports.parse = function() {\\n\\tvar classes = [\\\"tc-quote\\\"];\\n\\t// Get all the details of the match\\n\\tvar reEndString = \\\"^\\\" + this.match[1] + \\\"(?!\u003C)\\\";\\n\\t// Move past the \u003Cs\\n\\tthis.parser.pos = this.matchRegExp.lastIndex;\\n\\t\\n\\t// Parse any classes, whitespace and then the optional cite itself\\n\\tclasses.push.apply(classes, this.parser.parseClasses());\\n\\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\\n\\tvar cite = this.parser.parseInlineRun(/(\\\\r?\\\\n)/mg);\\n\\t// before handling the cite, parse the body of the quote\\n\\tvar tree= this.parser.parseBlocks(reEndString);\\n\\t// If we got a cite, put it before the text\\n\\tif(cite.length > 0) {\\n\\t\\ttree.unshift({\\n\\t\\t\\ttype: \\\"element\\\",\\n\\t\\t\\ttag: \\\"cite\\\",\\n\\t\\t\\tchildren: cite\\n\\t\\t});\\n\\t}\\n\\t// Parse any optional cite\\n\\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\\n\\tcite = this.parser.parseInlineRun(/(\\\\r?\\\\n)/mg);\\n\\t// If we got a cite, push it\\n\\tif(cite.length > 0) {\\n\\t\\ttree.push({\\n\\t\\t\\ttype: \\\"element\\\",\\n\\t\\t\\ttag: \\\"cite\\\",\\n\\t\\t\\tchildren: cite\\n\\t\\t});\\n\\t}\\n\\t// Return the blockquote element\\n\\treturn [{\\n\\t\\ttype: \\\"element\\\",\\n\\t\\ttag: \\\"blockquote\\\",\\n\\t\\tattributes: {\\n\\t\\t\\tclass: { type: \\\"string\\\", value: classes.join(\\\" \\\") },\\n\\t\\t},\\n\\t\\tchildren: tree\\n\\t}];\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"wikirule\"},\"$:/core/modules/parsers/wikiparser/rules/rules.js\":{\"title\":\"$:/core/modules/parsers/wikiparser/rules/rules.js\",\"text\":\"/*\\\\\\ntitle: $
2731:/core/modules/parsers/wikiparser/rules/rules.js\\ntype: application/javascript\\nmodule-type: wikirule\\n\\nWiki pragma rule for rules specifications\\n\\n```\\n\\\\rules except ruleone ruletwo rulethree\\n\\\\rules only ruleone ruletwo rulethree\\n```\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.name = \\\"rules\\\";\\nexports.types = {pragma: true};\\n\\n/*\\nInstantiate parse rule\\n*/\\nexports.init = function(parser) {\\n\\tthis.parser = parser;\\n\\t// Regexp to match\\n\\tthis.matchRegExp = /\\\\\\\\rules[^\\\\S\\\\n]/mg;\\n};\\n\\n/*\\nParse the most recent match\\n*/\\nexports.parse = function() {\\n\\t// Move past the pragma invocation\\n\\tthis.parser.pos = this.matchRegExp.lastIndex;\\n\\t// Parse whitespace delimited tokens terminated by a line break\\n\\tvar reMatch = /[^\\\\S\\\\n]*(\\\\S+)|(\\\\r?\\\\n)/mg,\\n\\t\\ttokens = [];\\n\\treMatch.lastIndex = this.parser.pos;\\n\\tvar match = reMatch.exec(this.parser.source);\\n\\twhile(match && match.index === this.parser.pos) {\\n\\t\\tthis.parser.pos = reMatch.lastIndex;\\n\\t\\t// Exit if we've got the line break\\n\\t\\tif(match[2]) {\\n\\t\\t\\tbreak;\\n\\t\\t}\\n\\t\\t// Process the token\\n\\t\\tif(match[1]) {\\n\\t\\t\\ttokens.push(match[1]);\\n\\t\\t}\\n\\t\\t// Match the next token\\n\\t\\tmatch = reMatch.exec(this.parser.source);\\n\\t}\\n\\t// Process the tokens\\n\\tif(tokens.length > 0) {\\n\\t\\tthis.parser.amendRules(tokens[0],tokens.slice(1));\\n\\t}\\n\\t// No parse tree nodes to return\\n\\treturn [];\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"wikirule\"},\"$:/core/modules/parsers/wikiparser/rules/styleblock.js\":{\"title\":\"$:/core/modules/parsers/wikiparser/rules/styleblock.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/parsers/wikiparser/rules/styleblock.js\\ntype: application/javascript\\nmodule-type: wikirule\\n\\nWiki text block rule for assigning styles and classes to paragraphs and other blocks. For example:\\n\\n```\\n@@.myClass\\n@@background-color:red;\\nThis paragraph will have the CSS class `myClass`.\\n\\n* The `\u003Cul>` around this list will also have the class `myClass`\\n* List item 2\\n\\n@@\\n```\\n\\nNote that classes and styles can be mixed subject to the rule that styles must precede classes. For example\\n\\n```\\n@@.myFirstClass.mySecondClass\\n@@width:100px;.myThirdClass\\nThis is a paragraph\\n@@\\n```\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.name = \\\"styleblock\\\";\\nexports.types = {block: true};\\n\\nexports.init = function(parser) {\\n\\tthis.parser = parser;\\n\\t// Regexp to match\\n\\tthis.matchRegExp = /@@((?:[^\\\\.\\\\r\\\\n\\\\s:]+:[^\\\\r\\\\n;]+;)+)?(?:\\\\.([^\\\\r\\\\n\\\\s]+))?\\\\r?\\\\n/mg;\\n};\\n\\nexports.parse = function() {\\n\\tvar reEndString = \\\"^@@(?:\\\\\\\\r?\\\\\\\\n)?\\\";\\n\\tvar classes = [], styles = [];\\n\\tdo {\\n\\t\\t// Get the class and style\\n\\t\\tif(this.match[1]) {\\n\\t\\t\\tstyles.push(this.match[1]);\\n\\t\\t}\\n\\t\\tif(this.match[2]) {\\n\\t\\t\\tclasses.push(this.match[2].split(\\\".\\\").join(\\\" \\\"));\\n\\t\\t}\\n\\t\\t// Move past the match\\n\\t\\tthis.parser.pos = this.matchRegExp.lastIndex;\\n\\t\\t// Look for another line of classes and styles\\n\\t\\tthis.match = this.matchRegExp.exec(this.parser.source);\\n\\t} while(this.match && this.match.index === this.parser.pos);\\n\\t// Parse the body\\n\\tvar tree = this.parser.parseBlocks(reEndString);\\n\\tfor(var t=0; t\u003Ctree.length; t++) {\\n\\t\\tif(classes.length > 0) {\\n\\t\\t\\t$tw.utils.addClassToParseTreeNode(tree[t],classes.join(\\\" \\\"));\\n\\t\\t}\\n\\t\\tif(styles.length > 0) {\\n\\t\\t\\t$tw.utils.addAttributeToParseTreeNode(tree[t],\\\"style\\\",styles.join(\\\"\\\"));\\n\\t\\t}\\n\\t}\\n\\treturn tree;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"wikirule\"},\"$:/core/modules/parsers/wikiparser/rules/styleinline.js\":{\"title\":\"$:/core/modules/parsers/wikiparser/rules/styleinl
2731ine.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/parsers/wikiparser/rules/styleinline.js\\ntype: application/javascript\\nmodule-type: wikirule\\n\\nWiki text inline rule for assigning styles and classes to inline runs. For example:\\n\\n```\\n@@.myClass This is some text with a class@@\\n@@background-color:red;This is some text with a background colour@@\\n@@width:100px;.myClass This is some text with a class and a width@@\\n```\\n\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.name = \\\"styleinline\\\";\\nexports.types = {inline: true};\\n\\nexports.init = function(parser) {\\n\\tthis.parser = parser;\\n\\t// Regexp to match\\n\\tthis.matchRegExp = /@@((?:[^\\\\.\\\\r\\\\n\\\\s:]+:[^\\\\r\\\\n;]+;)+)?(\\\\.(?:[^\\\\r\\\\n\\\\s]+)\\\\s+)?/mg;\\n};\\n\\nexports.parse = function() {\\n\\tvar reEnd = /@@/g;\\n\\t// Get the styles and class\\n\\tvar stylesString = this.match[1],\\n\\t\\tclassString = this.match[2] ? this.match[2].split(\\\".\\\").join(\\\" \\\") : undefined;\\n\\t// Move past the match\\n\\tthis.parser.pos = this.matchRegExp.lastIndex;\\n\\t// Parse the run up to the terminator\\n\\tvar tree = this.parser.parseInlineRun(reEnd,{eatTerminator: true});\\n\\t// Return the classed span\\n\\tvar node = {\\n\\t\\ttype: \\\"element\\\",\\n\\t\\ttag: \\\"span\\\",\\n\\t\\tchildren: tree\\n\\t};\\n\\tif(classString) {\\n\\t\\t$tw.utils.addClassToParseTreeNode(node,classString);\\n\\t}\\n\\tif(stylesString) {\\n\\t\\t$tw.utils.addAttributeToParseTreeNode(node,\\\"style\\\",stylesString);\\n\\t}\\n\\tif(!classString && !stylesString) {\\n\\t\\t$tw.utils.addClassToParseTreeNode(node,\\\"tc-inline-style\\\");\\n\\t}\\n\\treturn [node];\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"wikirule\"},\"$:/core/modules/parsers/wikiparser/rules/syslink.js\":{\"title\":\"$:/core/modules/parsers/wikiparser/rules/syslink.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/parsers/wikiparser/rules/syslink.js\\ntype: application/javascript\\nmodule-type: wikirule\\n\\nWiki text inline rule for system tiddler links.\\nCan be suppressed preceding them with `~`.\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.name = \\\"syslink\\\";\\nexports.types = {inline: true};\\n\\nexports.init = function(parser) {\\n\\tthis.parser = parser;\\n\\t// Regexp to match\\n\\tthis.matchRegExp = new RegExp(\\n\\t\\t\\\"~?\\\\\\\\$:\\\\\\\\/[\\\" +\\n\\t\\t$tw.config.textPrimitives.anyLetter.substr(1,$tw.config.textPrimitives.anyLetter.length - 2) +\\n\\t\\t\\\"\\\\/._-]+\\\",\\n\\t\\t\\\"mg\\\"\\n\\t);\\n};\\n\\nexports.parse = function() {\\n\\tvar match = this.match[0];\\n\\t// Move past the match\\n\\tthis.parser.pos = this.matchRegExp.lastIndex;\\n\\t// Create the link unless it is suppressed\\n\\tif(match.substr(0,1) === \\\"~\\\") {\\n\\t\\treturn [{type: \\\"text\\\", text: match.substr(1)}];\\n\\t} else {\\n\\t\\treturn [{\\n\\t\\t\\ttype: \\\"link\\\",\\n\\t\\t\\tattributes: {\\n\\t\\t\\t\\tto: {type: \\\"string\\\", value: match}\\n\\t\\t\\t},\\n\\t\\t\\tchildren: [{\\n\\t\\t\\t\\ttype: \\\"text\\\",\\n\\t\\t\\t\\ttext: match\\n\\t\\t\\t}]\\n\\t\\t}];\\n\\t}\\n};\\n\\n})();\",\"type\":\"application/javascript\",\"module-type\":\"wikirule\"},\"$:/core/modules/parsers/wikiparser/rules/table.js\":{\"title\":\"$:/core/modules/parsers/wikiparser/rules/table.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/parsers/wikiparser/rules/table.js\\ntype: application/javascript\\nmodule-type: wikirule\\n\\nWiki text block rule for tables.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.name = \\\"table\\\";\\nexports.types = {block: true};\\n\\nexports.init = function(parser) {\\n\\tthis.parser = parser;\\n\\t// Regexp to match\\n\\tthis.matchRegExp = /^\\\\|(?:[^\\\\n]*)\\\\|(?:[fhck]?)\\\\r?(?:\\\\n|$)/mg;\\n};\\n\\nvar processRow = function(prevColumns) {\\n\\tvar cellRegExp = /(?:\\\\|([^\\\\n\\\\|]*)\\\\|)|(\\\\|[fhck]?\\\\r?(?:\\\\n|$))/mg,\\n\\t\\tcellTermRegExp = /((?:\\\\x20*)\\\\|)/mg,\\n\\t\\ttree = [],\\n\\t\\tcol = 0,\\n\\t\\tcolSpanCount = 1,\\n\\t\\tprevCell,\\n\\t\\tvAlign;\\n\\t// Match a single cell\\n\\tcellRegExp.lastIndex = this.parser.pos;\\n\\tvar cellMatch = cellRegExp.exec(this.parser.source);\\n\\twhile(cellMatch && cellMatch.index === this.parser.pos) {\\n\\t\\tif(cellMatch[1] === \\\"~\\\") {\\n\\t\\t\\t// Rowspan\\n\\t\\t\\tvar last = prevColumns[col];\\n\\t\\t\\tif(last) {\\n\\t\\t\\t\\tlast.rowSpanCount++;
2731\\n\\t\\t\\t\\t$tw.utils.addAttributeToParseTreeNode(last.element,\\\"rowspan\\\",last.rowSpanCount);\\n\\t\\t\\t\\tvAlign = $tw.utils.getAttributeValueFromParseTreeNode(last.element,\\\"valign\\\",\\\"center\\\");\\n\\t\\t\\t\\t$tw.utils.addAttributeToParseTreeNode(last.element,\\\"valign\\\",vAlign);\\n\\t\\t\\t\\tif(colSpanCount > 1) {\\n\\t\\t\\t\\t\\t$tw.utils.addAttributeToParseTreeNode(last.element,\\\"colspan\\\",colSpanCount);\\n\\t\\t\\t\\t\\tcolSpanCount = 1;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\t// Move to just before the `|` terminating the cell\\n\\t\\t\\tthis.parser.pos = cellRegExp.lastIndex - 1;\\n\\t\\t} else if(cellMatch[1] === \\\">\\\") {\\n\\t\\t\\t// Colspan\\n\\t\\t\\tcolSpanCount++;\\n\\t\\t\\t// Move to just before the `|` terminating the cell\\n\\t\\t\\tthis.parser.pos = cellRegExp.lastIndex - 1;\\n\\t\\t} else if(cellMatch[1] === \\\"\u003C\\\" && prevCell) {\\n\\t\\t\\tcolSpanCount = 1 + $tw.utils.getAttributeValueFromParseTreeNode(prevCell,\\\"colspan\\\",1);\\n\\t\\t\\t$tw.utils.addAttributeToParseTreeNode(prevCell,\\\"colspan\\\",colSpanCount);\\n\\t\\t\\tcolSpanCount = 1;\\n\\t\\t\\t// Move to just before the `|` terminating the cell\\n\\t\\t\\tthis.parser.pos = cellRegExp.lastIndex - 1;\\n\\t\\t} else if(cellMatch[2]) {\\n\\t\\t\\t// End of row\\n\\t\\t\\tif(prevCell && colSpanCount > 1) {\\n\\t\\t\\t\\tif(prevCell.attributes && prevCell.attributes && prevCell.attributes.colspan) {\\n\\t\\t\\t\\t\\t\\tcolSpanCount += prevCell.attributes.colspan.value;\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tcolSpanCount -= 1;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t$tw.utils.addAttributeToParseTreeNode(prevCell,\\\"colspan\\\",colSpanCount);\\n\\t\\t\\t}\\n\\t\\t\\tthis.parser.pos = cellRegExp.lastIndex - 1;\\n\\t\\t\\tbreak;\\n\\t\\t} else {\\n\\t\\t\\t// For ordinary cells, step beyond the opening `|`\\n\\t\\t\\tthis.parser.pos++;\\n\\t\\t\\t// Look for a space at the start of the cell\\n\\t\\t\\tvar spaceLeft = false;\\n\\t\\t\\tvAlign = null;\\n\\t\\t\\tif(this.parser.source.substr(this.parser.pos).search(/^\\\\^([^\\\\^]|\\\\^\\\\^)/) === 0) {\\n\\t\\t\\t\\tvAlign = \\\"top\\\";\\n\\t\\t\\t} else if(this.parser.source.substr(this.parser.pos).search(/^,([^,]|,,)/) === 0) {\\n\\t\\t\\t\\tvAlign = \\\"bottom\\\";\\n\\t\\t\\t}\\n\\t\\t\\tif(vAlign) {\\n\\t\\t\\t\\tthis.parser.pos++;\\n\\t\\t\\t}\\n\\t\\t\\tvar chr = this.parser.source.substr(this.parser.pos,1);\\n\\t\\t\\twhile(chr === \\\" \\\") {\\n\\t\\t\\t\\tspaceLeft = true;\\n\\t\\t\\t\\tthis.parser.pos++;\\n\\t\\t\\t\\tchr = this.parser.source.substr(this.parser.pos,1);\\n\\t\\t\\t}\\n\\t\\t\\t// Check whether this is a heading cell\\n\\t\\t\\tvar cell;\\n\\t\\t\\tif(chr === \\\"!\\\") {\\n\\t\\t\\t\\tthis.parser.pos++;\\n\\t\\t\\t\\tcell = {type: \\\"element\\\", tag: \\\"th\\\", children: []};\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tcell = {type: \\\"element\\\", tag: \\\"td\\\", children: []};\\n\\t\\t\\t}\\n\\t\\t\\ttree.push(cell);\\n\\t\\t\\t// Record information about this cell\\n\\t\\t\\tprevCell = cell;\\n\\t\\t\\tprevColumns[col] = {rowSpanCount:1,element:cell};\\n\\t\\t\\t// Check for a colspan\\n\\t\\t\\tif(colSpanCount > 1) {\\n\\t\\t\\t\\t$tw.utils.addAttributeToParseTreeNode(cell,\\\"colspan\\\",colSpanCount);\\n\\t\\t\\t\\tcolSpanCount = 1;\\n\\t\\t\\t}\\n\\t\\t\\t// Parse the cell\\n\\t\\t\\tcell.children = this.parser.parseInlineRun(cellTermRegExp,{eatTerminator: true});\\n\\t\\t\\t// Set the alignment for the cell\\n\\t\\t\\tif(vAlign) {\\n\\t\\t\\t\\t$tw.utils.addAttributeToParseTreeNode(cell,\\\"valign\\\",vAlign);\\n\\t\\t\\t}\\n\\t\\t\\tif(this.parser.source.substr(this.parser.pos - 2,1) === \\\" \\\") { // spaceRight\\n\\t\\t\\t\\t$tw.utils.addAttributeToParseTreeNode(cell,\\\"align\\\",spaceLeft ? \\\"center\\\" : \\\"left\\\");\\n\\t\\t\\t} else if(spaceLeft) {\\n\\t\\t\\t\\t$tw.utils.addAttributeToParseTreeNode(cell,\\\"align\\\",\\\"right\\\");\\n\\t\\t\\t}\\n\\t\\t\\t// Move back to the closing `|`\\n\\t\\t\\tthis.parser.pos--;\\n\\t\\t}\\n\\t\\tcol++;\\n\\t\\tcellRegExp.lastIndex = this.parser.pos;\\n\\t\\tcellMatch = cellRegExp.exec(this.parser.source);\\n\\t}\\n\\treturn tree;\\n};\\n\\nexports.parse = function() {\\n\\tvar rowContainerTypes = {\\\"c\\\":\\\"caption\\\", \\\"h\\\":\\\"thead\\\", \\\"\\\":\\\"tbody\\\", \\\"f\\\":\\\"tfoot\\\"},\\n\\t\\ttable = {type: \\\"element\\\", tag: \\\"table\\\", children: []},\\n\\t\\trowRegExp = /^\\\\|([^\\\\n]*)\\\\|([fhck]?)\\\\r?(?:\\\\n|$)/mg,\\n\\t\\trowTermRegExp = /(\\\\|(?:[fhck]?)\\\\r?(?:\\\\n|$))/mg,\\n\\t\\tprevColumns = [],\\n\\t\\tcurrRowType,\\n\\t\\trowContainer,\\n\\t\\trowCount = 0;\\n\\t// Match the row\\n\\trowRegExp.lastIndex = this.parser.pos;\\n\\tvar rowMatch = rowRegExp.exec(this.parser.source);\\n\\twhile(rowMatch && rowMatch.index === this.parser.pos) {\\n\\t\\tvar rowType = rowMatch[2];\\n\\t\\t// Check if it is a class assignment\\n\\t\\tif(rowType === \\\"k\\\") {\\n\\t\\t\\t$t
2731w.utils.addClassToParseTreeNode(table,rowMatch[1]);\\n\\t\\t\\tthis.parser.pos = rowMatch.index + rowMatch[0].length;\\n\\t\\t} else {\\n\\t\\t\\t// Otherwise, create a new row if this one is of a different type\\n\\t\\t\\tif(rowType !== currRowType) {\\n\\t\\t\\t\\trowContainer = {type: \\\"element\\\", tag: rowContainerTypes[rowType], children: []};\\n\\t\\t\\t\\ttable.children.push(rowContainer);\\n\\t\\t\\t\\tcurrRowType = rowType;\\n\\t\\t\\t}\\n\\t\\t\\t// Is this a caption row?\\n\\t\\t\\tif(currRowType === \\\"c\\\") {\\n\\t\\t\\t\\t// If so, move past the opening `|` of the row\\n\\t\\t\\t\\tthis.parser.pos++;\\n\\t\\t\\t\\t// Move the caption to the first row if it isn't already\\n\\t\\t\\t\\tif(table.children.length !== 1) {\\n\\t\\t\\t\\t\\ttable.children.pop(); // Take rowContainer out of the children array\\n\\t\\t\\t\\t\\ttable.children.splice(0,0,rowContainer); // Insert it at the bottom\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t// Set the alignment - TODO: figure out why TW did this\\n//\\t\\t\\t\\trowContainer.attributes.align = rowCount === 0 ? \\\"top\\\" : \\\"bottom\\\";\\n\\t\\t\\t\\t// Parse the caption\\n\\t\\t\\t\\trowContainer.children = this.parser.parseInlineRun(rowTermRegExp,{eatTerminator: true});\\n\\t\\t\\t} else {\\n\\t\\t\\t\\t// Create the row\\n\\t\\t\\t\\tvar theRow = {type: \\\"element\\\", tag: \\\"tr\\\", children: []};\\n\\t\\t\\t\\t$tw.utils.addClassToParseTreeNode(theRow,rowCount%2 ? \\\"oddRow\\\" : \\\"evenRow\\\");\\n\\t\\t\\t\\trowContainer.children.push(theRow);\\n\\t\\t\\t\\t// Process the row\\n\\t\\t\\t\\ttheRow.children = processRow.call(this,prevColumns);\\n\\t\\t\\t\\tthis.parser.pos = rowMatch.index + rowMatch[0].length;\\n\\t\\t\\t\\t// Increment the row count\\n\\t\\t\\t\\trowCount++;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\trowMatch = rowRegExp.exec(this.parser.source);\\n\\t}\\n\\treturn [table];\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"wikirule\"},\"$:/core/modules/parsers/wikiparser/rules/transcludeblock.js\":{\"title\":\"$:/core/modules/parsers/wikiparser/rules/transcludeblock.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/parsers/wikiparser/rules/transcludeblock.js\\ntype: application/javascript\\nmodule-type: wikirule\\n\\nWiki text rule for block-level transclusion. For example:\\n\\n```\\n{{MyTiddler}}\\n{{MyTiddler||TemplateTitle}}\\n```\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.name = \\\"transcludeblock\\\";\\nexports.types = {block: true};\\n\\nexports.init = function(parser) {\\n\\tthis.parser = parser;\\n\\t// Regexp to match\\n\\tthis.matchRegExp = /\\\\{\\\\{([^\\\\{\\\\}\\\\|]*)(?:\\\\|\\\\|([^\\\\|\\\\{\\\\}]+))?(?:\\\\|([^\\\\{\\\\}]+))?\\\\}\\\\}(?:\\\\r?\\\\n|$)/mg;\\n};\\n\\nexports.parse = function() {\\n\\t// Move past the match\\n\\tthis.parser.pos = this.matchRegExp.lastIndex;\\n\\t// Get the match details\\n\\tvar template = $tw.utils.trim(this.match[2]),\\n\\t\\ttextRef = $tw.utils.trim(this.match[1]),\\n\\t\\tparams = this.match[3] ? this.match[3].split(\\\"|\\\") : [];\\n\\t// Prepare the transclude widget\\n\\tvar transcludeNode = {\\n\\t\\t\\ttype: \\\"transclude\\\",\\n\\t\\t\\tattributes: {},\\n\\t\\t\\tisBlock: true\\n\\t\\t};\\n\\t$tw.utils.each(params,function(paramValue,index) {\\n\\t\\tvar name = \\\"\\\" + index;\\n\\t\\ttranscludeNode.attributes[name] = {\\n\\t\\t\\tname: name,\\n\\t\\t\\ttype: \\\"string\\\",\\n\\t\\t\\tvalue: paramValue\\n\\t\\t}\\n\\t});\\n\\t// Prepare the tiddler widget\\n\\tvar tr, targetTitle, targetField, targetIndex, tiddlerNode;\\n\\tif(textRef) {\\n\\t\\ttr = $tw.utils.parseTextReference(textRef);\\n\\t\\ttargetTitle = tr.title;\\n\\t\\ttargetField = tr.field;\\n\\t\\ttargetIndex = tr.index;\\n\\t\\ttiddlerNode = {\\n\\t\\t\\ttype: \\\"tiddler\\\",\\n\\t\\t\\tattributes: {\\n\\t\\t\\t\\ttiddler: {name: \\\"tiddler\\\", type: \\\"string\\\", value: targetTitle}\\n\\t\\t\\t},\\n\\t\\t\\tisBlock: true,\\n\\t\\t\\tchildren: [transcludeNode]\\n\\t\\t};\\n\\t}\\n\\tif(template) {\\n\\t\\ttranscludeNode.attributes[\\\"$tiddler\\\"] = {name: \\\"$tiddler\\\", type: \\\"string\\\", value: template};\\n\\t\\tif(textRef) {\\n\\t\\t\\treturn [tiddlerNode];\\n\\t\\t} else {\\n\\t\\t\\treturn [transcludeNode];\\n\\t\\t}\\n\\t} else {\\n\\t\\tif(textRef) {\\n\\t\\t\\ttranscludeNode.attributes[\\\"$tiddler\\\"] = {name: \\\"$tiddler\\\", type: \\\"string\\\", value: targetTitle};\\n\\t\\t\\tif(targetField) {\\n\\t\\t\\t\\ttranscludeNode.attributes[\\\"$field\\\"] = {name: \\\"$field\\\", type: \\\"string\\\", value: targetField};\\n\\t\\t\\t}\\n\\t\\t\\tif(targetIndex) {\\n\\t\\t\\t\\ttranscludeNode.attributes[\\\"$index\\\"] = {name: \\\"$index\\\", type: \\\"string\\\", value: targetIndex};\\n\\t\\t\\t}\\n\\t\\t\\treturn [tiddlerNode];\\n\\t\\t} else {\\n\\t\\t\\treturn [transcludeNode];\\n\\t\\t}\\n\\t}\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"wikirule\"},\"$:/core/modules/parsers/wikiparser/rules/transcludeinline.js\":{\"title\":\"$:/core/modules/parsers/wikiparser/rules/transcludeinline.js\",\"text\":\"/*\\\\\\ntitle: $
2731:/core/modules/parsers/wikiparser/rules/transcludeinline.js\\ntype: application/javascript\\nmodule-type: wikirule\\n\\nWiki text rule for inline-level transclusion. For example:\\n\\n```\\n{{MyTiddler}}\\n{{MyTiddler||TemplateTitle}}\\n```\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.name = \\\"transcludeinline\\\";\\nexports.types = {inline: true};\\n\\nexports.init = function(parser) {\\n\\tthis.parser = parser;\\n\\t// Regexp to match\\n\\tthis.matchRegExp = /\\\\{\\\\{([^\\\\{\\\\}\\\\|]*)(?:\\\\|\\\\|([^\\\\|\\\\{\\\\}]+))?(?:\\\\|([^\\\\{\\\\}]+))?\\\\}\\\\}/mg;\\n};\\n\\nexports.parse = function() {\\n\\t// Move past the match\\n\\tthis.parser.pos = this.matchRegExp.lastIndex;\\n\\t// Get the match details\\n\\tvar template = $tw.utils.trim(this.match[2]),\\n\\t\\ttextRef = $tw.utils.trim(this.match[1]),\\n\\t\\tparams = this.match[3] ? this.match[3].split(\\\"|\\\") : [];\\n\\t// Prepare the transclude widget\\n\\tvar transcludeNode = {\\n\\t\\t\\ttype: \\\"transclude\\\",\\n\\t\\t\\tattributes: {}\\n\\t\\t};\\n\\t$tw.utils.each(params,function(paramValue,index) {\\n\\t\\tvar name = \\\"\\\" + index;\\n\\t\\ttranscludeNode.attributes[name] = {\\n\\t\\t\\tname: name,\\n\\t\\t\\ttype: \\\"string\\\",\\n\\t\\t\\tvalue: paramValue\\n\\t\\t}\\n\\t});\\n\\t// Prepare the tiddler widget\\n\\tvar tr, targetTitle, targetField, targetIndex, tiddlerNode;\\n\\tif(textRef) {\\n\\t\\ttr = $tw.utils.parseTextReference(textRef);\\n\\t\\ttargetTitle = tr.title;\\n\\t\\ttargetField = tr.field;\\n\\t\\ttargetIndex = tr.index;\\n\\t\\ttiddlerNode = {\\n\\t\\t\\ttype: \\\"tiddler\\\",\\n\\t\\t\\tattributes: {\\n\\t\\t\\t\\ttiddler: {name: \\\"tiddler\\\", type: \\\"string\\\", value: targetTitle}\\n\\t\\t\\t},\\n\\t\\t\\tchildren: [transcludeNode]\\n\\t\\t};\\n\\t}\\n\\tif(template) {\\n\\t\\ttranscludeNode.attributes[\\\"$tiddler\\\"] = {name: \\\"$tiddler\\\", type: \\\"string\\\", value: template};\\n\\t\\tif(textRef) {\\n\\t\\t\\treturn [tiddlerNode];\\n\\t\\t} else {\\n\\t\\t\\treturn [transcludeNode];\\n\\t\\t}\\n\\t} else {\\n\\t\\tif(textRef) {\\n\\t\\t\\ttranscludeNode.attributes[\\\"$tiddler\\\"] = {name: \\\"$tiddler\\\", type: \\\"string\\\", value: targetTitle};\\n\\t\\t\\tif(targetField) {\\n\\t\\t\\t\\ttranscludeNode.attributes[\\\"$field\\\"] = {name: \\\"$field\\\", type: \\\"string\\\", value: targetField};\\n\\t\\t\\t}\\n\\t\\t\\tif(targetIndex) {\\n\\t\\t\\t\\ttranscludeNode.attributes[\\\"$index\\\"] = {name: \\\"$index\\\", type: \\\"string\\\", value: targetIndex};\\n\\t\\t\\t}\\n\\t\\t\\treturn [tiddlerNode];\\n\\t\\t} else {\\n\\t\\t\\treturn [transcludeNode];\\n\\t\\t}\\n\\t}\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"wikirule\"},\"$:/core/modules/parsers/wikiparser/rules/typedblock.js\":{\"title\":\"$:/core/modules/parsers/wikiparser/rules/typedblock.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/parsers/wikiparser/rules/typedblock.js\\ntype: application/javascript\\nmodule-type: wikirule\\n\\nWiki text rule for typed blocks. For example:\\n\\n```\\n$$$.js\\nThis will be rendered as JavaScript\\n$$$\\n\\n$$$.svg\\n\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"150\\\" height=\\\"100\\\">\\n  \u003Ccircle cx=\\\"100\\\" cy=\\\"50\\\" r=\\\"40\\\" stroke=\\\"black\\\" stroke-width=\\\"2\\\" fill=\\\"red\\\" />\\n\u003C/svg>\\n$$$\\n\\n$$$text/vnd.tiddlywiki>text/html\\nThis will be rendered as an //HTML representation// of WikiText\\n$$$\\n```\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar widget = require(\\\"$:/core/modules/widgets/widget.js\\\");\\n\\nexports.name = \\\"typedblock\\\";\\nexports.types = {block: true};\\n\\nexports.init = function(parser) {\\n\\tthis.parser = parser;\\n\\t// Regexp to match\\n\\tthis.matchRegExp = /\\\\$\\\\$\\\\$([^ >\\\\r\\\\n]*)(?: *> *([^ \\\\r\\\\n]+))?\\\\r?\\\\n/mg;\\n};\\n\\nexports.parse = function() {\\n\\tvar reEnd = /\\\\r?\\\\n\\\\$\\\\$\\\\$\\\\r?(?:\\\\n|$)/mg;\\n\\t// Save the type\\n\\tvar parseType = this.match[1],\\n\\t\\trenderType = this.match[2];\\n\\t// Move past the match\\n\\tthis.parser.pos = this.matchRegExp.lastIndex;\\n\\t// Look for the end of the block\\n\\treEnd.lastIndex = this.parser.pos;\\n\\tvar match = reEnd.exec(this.parser.source),\\n\\t\\ttext;\\n\\t// Process the block\\n\\tif(match) {\\n\\t\\ttext = this.parser.source.substring(this.parser.pos,match.index);\\n\\t\\tthis.parser.pos = match.index + match[0].length;\\n\\t} else {\\n\\t\\ttext = this.parser.source.substr(this.parser.pos);\\n\\t\\tthis.parser.pos = this.parser.sourceLength;\\n\\t}\\n\\t// Parse the block according to the specified type\\n\\tvar parser = this.parser.wiki.parseText(parseType,text,{defaultType: \\\"text/plain\\\"});\\n\\t// If there's no render type, just return the parse tree\\n\\tif(!renderType) {\\n\\t\\treturn parser.tree;\\n\\t} else {\\n\\t\\t// Otherwise, render to the rendertype and return in a \u003CPRE> tag\\n\\t\\tvar widgetNode = this.parser.wiki.makeWidget(parser),\\n\\t\\t\\tcontainer = $tw.fakeDocument.createElement(\\\"div\\\");\\n\\t\\twidgetNode.render(container,null);\\n\\t\\ttext = renderType === \\\"text/html\\\" ? container.innerHTML : container.textContent;\\n\\t\\treturn [{\\n\\t\\t\\ttype: \\\"element\\\",\\n\\t\\t\\ttag: \\\"pre\\\",\\n\\t\\t\\tchildren: [{\\n\\t\\t\\t\\ttype: \\\"text\\\",\\n\\t\\t\\t\\ttext: text\\n\\t\\t\\t}]\\n\\t\\t}];\\n\\t}\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"wikirule\"},\"$:/core/modules/parsers/wikiparser/rules/whitespace.js\":{\"title\":\"$:/core/modules/parsers/wikiparser/rules/whitespace.js\",\"text\":\"/*\\\\\\ntitle: $
2731:/core/modules/parsers/wikiparser/rules/whitespace.js\\ntype: application/javascript\\nmodule-type: wikirule\\n\\nWiki pragma rule for whitespace specifications\\n\\n```\\n\\\\whitespace trim\\n\\\\whitespace notrim\\n```\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.name = \\\"whitespace\\\";\\nexports.types = {pragma: true};\\n\\n/*\\nInstantiate parse rule\\n*/\\nexports.init = function(parser) {\\n\\tthis.parser = parser;\\n\\t// Regexp to match\\n\\tthis.matchRegExp = /\\\\\\\\whitespace[^\\\\S\\\\n]/mg;\\n};\\n\\n/*\\nParse the most recent match\\n*/\\nexports.parse = function() {\\n\\tvar self = this;\\n\\t// Move past the pragma invocation\\n\\tthis.parser.pos = this.matchRegExp.lastIndex;\\n\\t// Parse whitespace delimited tokens terminated by a line break\\n\\tvar reMatch = /[^\\\\S\\\\n]*(\\\\S+)|(\\\\r?\\\\n)/mg,\\n\\t\\ttokens = [];\\n\\treMatch.lastIndex = this.parser.pos;\\n\\tvar match = reMatch.exec(this.parser.source);\\n\\twhile(match && match.index === this.parser.pos) {\\n\\t\\tthis.parser.pos = reMatch.lastIndex;\\n\\t\\t// Exit if we've got the line break\\n\\t\\tif(match[2]) {\\n\\t\\t\\tbreak;\\n\\t\\t}\\n\\t\\t// Process the token\\n\\t\\tif(match[1]) {\\n\\t\\t\\ttokens.push(match[1]);\\n\\t\\t}\\n\\t\\t// Match the next token\\n\\t\\tmatch = reMatch.exec(this.parser.source);\\n\\t}\\n\\t// Process the tokens\\n\\t$tw.utils.each(tokens,function(token) {\\n\\t\\tswitch(token) {\\n\\t\\t\\tcase \\\"trim\\\":\\n\\t\\t\\t\\tself.parser.configTrimWhiteSpace = true;\\n\\t\\t\\t\\tbreak;\\n\\t\\t\\tcase \\\"notrim\\\":\\n\\t\\t\\t\\tself.parser.configTrimWhiteSpace = false;\\n\\t\\t\\t\\tbreak;\\n\\t\\t}\\n\\t});\\n\\t// No parse tree nodes to return\\n\\treturn [];\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"wikirule\"},\"$:/core/modules/parsers/wikiparser/rules/wikilink.js\":{\"title\":\"$:/core/modules/parsers/wikiparser/rules/wikilink.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/parsers/wikiparser/rules/wikilink.js\\ntype: application/javascript\\nmodule-type: wikirule\\n\\nWiki text inline rule for wiki links. For example:\\n\\n```\\nAWikiLink\\nAnotherLink\\n~SuppressedLink\\n```\\n\\nPrecede a camel case word with `~` to prevent it from being recognised as a link.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.name = \\\"wikilink\\\";\\nexports.types = {inline: true};\\n\\nexports.init = function(parser) {\\n\\tthis.parser = parser;\\n\\t// Regexp to match\\n\\tthis.matchRegExp = new RegExp($tw.config.textPrimitives.unWikiLink + \\\"?\\\" + $tw.config.textPrimitives.wikiLink,\\\"mg\\\");\\n};\\n\\n/*\\nParse the most recent match\\n*/\\nexports.parse = function() {\\n\\t// Get the details of the match\\n\\tvar linkText = this.match[0];\\n\\t// Move past the macro call\\n\\tthis.parser.pos = this.matchRegExp.lastIndex;\\n\\t// If the link starts with the unwikilink character then just output it as plain text\\n\\tif(linkText.substr(0,1) === $tw.config.textPrimitives.unWikiLink) {\\n\\t\\treturn [{type: \\\"text\\\", text: linkText.substr(1)}];\\n\\t}\\n\\t// If the link has been preceded with a blocked letter then don't treat it as a link\\n\\tif(this.match.index > 0) {\\n\\t\\tvar preRegExp = new RegExp($tw.config.textPrimitives.blockPrefixLetters,\\\"mg\\\");\\n\\t\\tpreRegExp.lastIndex = this.match.index-1;\\n\\t\\tvar preMatch = preRegExp.exec(this.parser.source);\\n\\t\\tif(preMatch && preMatch.index === this.match.index-1) {\\n\\t\\t\\treturn [{type: \\\"text\\\", text: linkText}];\\n\\t\\t}\\n\\t}\\n\\treturn [{\\n\\t\\ttype: \\\"link\\\",\\n\\t\\tattributes: {\\n\\t\\t\\tto: {type: \\\"string\\\", value: linkText}\\n\\t\\t},\\n\\t\\tchildren: [{\\n\\t\\t\\ttype: \\\"text\\\",\\n\\t\\t\\ttext: linkText\\n\\t\\t}]\\n\\t}];\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"wikirule\"},\"$:/core/modules/parsers/wikiparser/rules/wikilinkprefix.js\":{\"title\":\"$:/core/modules/parsers/wikiparser/rules/wikilinkprefix.js\",\"text\":\"/*\\\\\\ntitle: $
2731:/core/modules/parsers/wikiparser/rules/wikilinkprefix.js\\ntype: application/javascript\\nmodule-type: wikirule\\n\\nWiki text inline rule for suppressed wiki links. For example:\\n\\n```\\n~SuppressedLink\\n```\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.name = \\\"wikilinkprefix\\\";\\nexports.types = {inline: true};\\n\\nexports.init = function(parser) {\\n\\tthis.parser = parser;\\n\\t// Regexp to match\\n\\tthis.matchRegExp = new RegExp($tw.config.textPrimitives.unWikiLink + $tw.config.textPrimitives.wikiLink,\\\"mg\\\");\\n};\\n\\n/*\\nParse the most recent match\\n*/\\nexports.parse = function() {\\n\\t// Get the details of the match\\n\\tvar linkText = this.match[0];\\n\\t// Move past the wikilink\\n\\tthis.parser.pos = this.matchRegExp.lastIndex;\\n\\t// Return the link without unwikilink character as plain text\\n\\treturn [{type: \\\"text\\\", text: linkText.substr(1)}];\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"wikirule\"},\"$:/core/modules/parsers/wikiparser/wikiparser.js\":{\"title\":\"$:/core/modules/parsers/wikiparser/wikiparser.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/parsers/wikiparser/wikiparser.js\\ntype: application/javascript\\nmodule-type: parser\\n\\nThe wiki text parser processes blocks of source text into a parse tree.\\n\\nThe parse tree is made up of nested arrays of these JavaScript objects:\\n\\n\\t{type: \\\"element\\\", tag: \u003Cstring>, attributes: {}, children: []} - an HTML element\\n\\t{type: \\\"text\\\", text: \u003Cstring>} - a text node\\n\\t{type: \\\"entity\\\", value: \u003Cstring>} - an entity\\n\\t{type: \\\"raw\\\", html: \u003Cstring>} - raw HTML\\n\\nAttributes are stored as hashmaps of the following objects:\\n\\n\\t{type: \\\"string\\\", value: \u003Cstring>} - literal string\\n\\t{type: \\\"indirect\\\", textReference: \u003CtextReference>} - indirect through a text reference\\n\\t{type: \\\"macro\\\", macro: \u003CTBD>} - indirect through a macro invocation\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\ntype: content type of text\\ntext: text to be parsed\\noptions: see below:\\n\\tparseAsInline: true to parse text as inline instead of block\\n\\twiki: reference to wiki to use\\n\\t_canonical_uri: optional URI of content if text is missing or empty\\n\\tconfigTrimWhiteSpace: true to trim whitespace\\n*/\\nvar WikiParser = function(type,text,options) {\\n\\tthis.wiki = options.wiki;\\n\\tvar self = this;\\n\\t// Check for an externally linked tiddler\\n\\tif($tw.browser && (text || \\\"\\\") === \\\"\\\" && options._canonical_uri) {\\n\\t\\tthis.loadRemoteTiddler(options._canonical_uri);\\n\\t\\ttext = $tw.language.getRawString(\\\"LazyLoadingWarning\\\");\\n\\t}\\n\\t// Save the parse text\\n\\tthis.type = type || \\\"text/vnd.tiddlywiki\\\";\\n\\tthis.source = text || \\\"\\\";\\n\\tthis.sourceLength = this.source.length;\\n\\t// Flag for ignoring whitespace\\n\\tthis.configTrimWhiteSpace = options.configTrimWhiteSpace !== undefined ? options.configTrimWhiteSpace : false;\\n\\t// Parser mode\\n\\tthis.parseAsInline = options.parseAsInline;\\n\\t// Set current parse position\\n\\tthis.pos = 0;\\n\\t// Start with empty output\\n\\tthis.tree = [];\\n\\t// Assemble the rule classes we're going to use\\n\\tvar pragmaRuleClasses, blockRuleClasses, inlineRuleClasses;\\n\\tif(options.rules) {\\n\\t\\tpragmaRuleClasses = options.rules.pragma;\\n\\t\\tblockRuleClasses = options.rules.block;\\n\\t\\tinlineRuleClasses = options.rules.inline;\\n\\t} else {\\n\\t\\t// Setup the rule classes if we don't have them already\\n\\t\\tif(!this.pragmaRuleClasses) {\\n\\t\\t\\tWikiParser.prototype.pragmaRuleClasses = $tw.modules.createClassesFromModules(\\\"wikirule\\\",\\\"pragma\\\",$tw.WikiRuleBase);\\n\\t\\t\\tthis.setupRules(WikiParser.prototype.pragmaRuleClasses,\\\"$:/config/WikiParserRules/Pragmas/\\\");\\n\\t\\t}\\n\\t\\tpragmaRuleClasses = this.pragmaRuleClasses;\\n\\t\\tif(!this.blockRuleClasses) {\\n\\t\\t\\tWikiParser.prototype.blockRuleClasses = $tw.modules.createClassesFromModules(\\\"wikirule\\\",\\\"block\\\",$tw.WikiRuleBase);\\n\\t\\t\\tthis.setupRules(WikiParser.prototype.blockRuleClasses,\\\"$:/config/WikiParserRules/Block/\\\");\\n\\t\\t}\\n\\t\\tblockRuleClasses = this.blockRuleClasses;
2731\\n\\t\\tif(!this.inlineRuleClasses) {\\n\\t\\t\\tWikiParser.prototype.inlineRuleClasses = $tw.modules.createClassesFromModules(\\\"wikirule\\\",\\\"inline\\\",$tw.WikiRuleBase);\\n\\t\\t\\tthis.setupRules(WikiParser.prototype.inlineRuleClasses,\\\"$:/config/WikiParserRules/Inline/\\\");\\n\\t\\t}\\n\\t\\tinlineRuleClasses = this.inlineRuleClasses;\\n\\t}\\n\\t// Instantiate the pragma parse rules\\n\\tthis.pragmaRules = this.instantiateRules(pragmaRuleClasses,\\\"pragma\\\",0);\\n\\t// Instantiate the parser block and inline rules\\n\\tthis.blockRules = this.instantiateRules(blockRuleClasses,\\\"block\\\",0);\\n\\tthis.inlineRules = this.instantiateRules(inlineRuleClasses,\\\"inline\\\",0);\\n\\t// Parse any pragmas\\n\\tvar topBranch = this.parsePragmas();\\n\\t// Parse the text into inline runs or blocks\\n\\tif(this.parseAsInline) {\\n\\t\\ttopBranch.push.apply(topBranch,this.parseInlineRun());\\n\\t} else {\\n\\t\\ttopBranch.push.apply(topBranch,this.parseBlocks());\\n\\t}\\n\\t// Return the parse tree\\n};\\n\\n/*\\n*/\\nWikiParser.prototype.loadRemoteTiddler = function(url) {\\n\\tvar self = this;\\n\\t$tw.utils.httpRequest({\\n\\t\\turl: url,\\n\\t\\ttype: \\\"GET\\\",\\n\\t\\tcallback: function(err,data) {\\n\\t\\t\\tif(!err) {\\n\\t\\t\\t\\tvar tiddlers = self.wiki.deserializeTiddlers(\\\".tid\\\",data,self.wiki.getCreationFields());\\n\\t\\t\\t\\t$tw.utils.each(tiddlers,function(tiddler) {\\n\\t\\t\\t\\t\\ttiddler[\\\"_canonical_uri\\\"] = url;\\n\\t\\t\\t\\t});\\n\\t\\t\\t\\tif(tiddlers) {\\n\\t\\t\\t\\t\\tself.wiki.addTiddlers(tiddlers);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t});\\n};\\n\\n/*\\n*/\\nWikiParser.prototype.setupRules = function(proto,configPrefix) {\\n\\tvar self = this;\\n\\tif(!$tw.safeMode) {\\n\\t\\t$tw.utils.each(proto,function(object,name) {\\n\\t\\t\\tif(self.wiki.getTiddlerText(configPrefix + name,\\\"enable\\\") !== \\\"enable\\\") {\\n\\t\\t\\t\\tdelete proto[name];\\n\\t\\t\\t}\\n\\t\\t});\\n\\t}\\n};\\n\\n/*\\nInstantiate an array of parse rules\\n*/\\nWikiParser.prototype.instantiateRules = function(classes,type,startPos) {\\n\\tvar rulesInfo = [],\\n\\t\\tself = this;\\n\\t$tw.utils.each(classes,function(RuleClass) {\\n\\t\\t// Instantiate the rule\\n\\t\\tvar rule = new RuleClass(self);\\n\\t\\trule.is = {};\\n\\t\\trule.is[type] = true;\\n\\t\\trule.init(self);\\n\\t\\tvar matchIndex = rule.findNextMatch(startPos);\\n\\t\\tif(matchIndex !== undefined) {\\n\\t\\t\\trulesInfo.push({\\n\\t\\t\\t\\trule: rule,\\n\\t\\t\\t\\tmatchIndex: matchIndex\\n\\t\\t\\t});\\n\\t\\t}\\n\\t});\\n\\treturn rulesInfo;\\n};\\n\\n/*\\nSkip any whitespace at the current position. Options are:\\n\\ttreatNewlinesAsNonWhitespace: true if newlines are NOT to be treated as whitespace\\n*/\\nWikiParser.prototype.skipWhitespace = function(options) {\\n\\toptions = options || {};\\n\\tvar whitespaceRegExp = options.treatNewlinesAsNonWhitespace ? /([^\\\\S\\\\n]+)/mg : /(\\\\s+)/mg;\\n\\twhitespaceRegExp.lastIndex = this.pos;\\n\\tvar whitespaceMatch = whitespaceRegExp.exec(this.source);\\n\\tif(whitespaceMatch && whitespaceMatch.index === this.pos) {\\n\\t\\tthis.pos = whitespaceRegExp.lastIndex;\\n\\t}\\n};\\n\\n/*\\nGet the next match out of an array of parse rule instances\\n*/\\nWikiParser.prototype.findNextMatch = function(rules,startPos) {\\n\\t// Find the best matching rule by finding the closest match position\\n\\tvar matchingRule,\\n\\t\\tmatchingRulePos = this.sourceLength;\\n\\t// Step through each rule\\n\\tfor(var t=0; t\u003Crules.length; t++) {\\n\\t\\tvar ruleInfo = rules[t];\\n\\t\\t// Ask the rule to get the next match if we've moved past the current one\\n\\t\\tif(ruleInfo.matchIndex !== undefined  && ruleInfo.matchIndex \u003C startPos) {\\n\\t\\t\\truleInfo.matchIndex = ruleInfo.rule.findNextMatch(startPos);\\n\\t\\t}\\n\\t\\t// Adopt this match if it's closer than the current best match\\n\\t\\tif(ruleInfo.matchIndex !== undefined && ruleInfo.matchIndex \u003C= matchingRulePos) {\\n\\t\\t\\tmatchingRule = ruleInfo;\\n\\t\\t\\tmatchingRulePos = ruleInfo.matchIndex;\\n\\t\\t}\\n\\t}\\n\\treturn matchingRule;\\n};
2731\\n\\n/*\\nParse any pragmas at the beginning of a block of parse text\\n*/\\nWikiParser.prototype.parsePragmas = function() {\\n\\tvar currentTreeBranch = this.tree;\\n\\twhile(true) {\\n\\t\\t// Skip whitespace\\n\\t\\tthis.skipWhitespace();\\n\\t\\t// Check for the end of the text\\n\\t\\tif(this.pos >= this.sourceLength) {\\n\\t\\t\\tbreak;\\n\\t\\t}\\n\\t\\t// Check if we've arrived at a pragma rule match\\n\\t\\tvar nextMatch = this.findNextMatch(this.pragmaRules,this.pos);\\n\\t\\t// If not, just exit\\n\\t\\tif(!nextMatch || nextMatch.matchIndex !== this.pos) {\\n\\t\\t\\tbreak;\\n\\t\\t}\\n\\t\\t// Process the pragma rule\\n\\t\\tvar subTree = nextMatch.rule.parse();\\n\\t\\tif(subTree.length > 0) {\\n\\t\\t\\t// Quick hack; we only cope with a single parse tree node being returned, which is true at the moment\\n\\t\\t\\tcurrentTreeBranch.push.apply(currentTreeBranch,subTree);\\n\\t\\t\\tsubTree[0].children = [];\\n\\t\\t\\tcurrentTreeBranch = subTree[0].children;\\n\\t\\t}\\n\\t}\\n\\treturn currentTreeBranch;\\n};\\n\\n/*\\nParse a block from the current position\\n\\tterminatorRegExpString: optional regular expression string that identifies the end of plain paragraphs. Must not include capturing parenthesis\\n*/\\nWikiParser.prototype.parseBlock = function(terminatorRegExpString) {\\n\\tvar terminatorRegExp = terminatorRegExpString ? new RegExp(\\\"(\\\" + terminatorRegExpString + \\\"|\\\\\\\\r?\\\\\\\\n\\\\\\\\r?\\\\\\\\n)\\\",\\\"mg\\\") : /(\\\\r?\\\\n\\\\r?\\\\n)/mg;\\n\\tthis.skipWhitespace();\\n\\tif(this.pos >= this.sourceLength) {\\n\\t\\treturn [];\\n\\t}\\n\\t// Look for a block rule that applies at the current position\\n\\tvar nextMatch = this.findNextMatch(this.blockRules,this.pos);\\n\\tif(nextMatch && nextMatch.matchIndex === this.pos) {\\n\\t\\treturn nextMatch.rule.parse();\\n\\t}\\n\\t// Treat it as a paragraph if we didn't find a block rule\\n\\tvar start = this.pos;\\n\\tvar children = this.parseInlineRun(terminatorRegExp);\\n\\tvar end = this.pos;\\n\\treturn [{type: \\\"element\\\", tag: \\\"p\\\", children: children, start: start, end: end }];\\n};\\n\\n/*\\nParse a series of blocks of text until a terminating regexp is encountered or the end of the text\\n\\tterminatorRegExpString: terminating regular expression\\n*/\\nWikiParser.prototype.parseBlocks = function(terminatorRegExpString) {\\n\\tif(terminatorRegExpString) {\\n\\t\\treturn this.parseBlocksTerminated(terminatorRegExpString);\\n\\t} else {\\n\\t\\treturn this.parseBlocksUnterminated();\\n\\t}\\n};\\n\\n/*\\nParse a block from the current position to the end of the text\\n*/\\nWikiParser.prototype.parseBlocksUnterminated = function() {\\n\\tvar tree = [];\\n\\twhile(this.pos \u003C this.sourceLength) {\\n\\t\\ttree.push.apply(tree,this.parseBlock());\\n\\t}\\n\\treturn tree;\\n};
2731\\n\\n/*\\nParse blocks of text until a terminating regexp is encountered\\n*/\\nWikiParser.prototype.parseBlocksTerminated = function(terminatorRegExpString) {\\n\\tvar terminatorRegExp = new RegExp(\\\"(\\\" + terminatorRegExpString + \\\")\\\",\\\"mg\\\"),\\n\\t\\ttree = [];\\n\\t// Skip any whitespace\\n\\tthis.skipWhitespace();\\n\\t//  Check if we've got the end marker\\n\\tterminatorRegExp.lastIndex = this.pos;\\n\\tvar match = terminatorRegExp.exec(this.source);\\n\\t// Parse the text into blocks\\n\\twhile(this.pos \u003C this.sourceLength && !(match && match.index === this.pos)) {\\n\\t\\tvar blocks = this.parseBlock(terminatorRegExpString);\\n\\t\\ttree.push.apply(tree,blocks);\\n\\t\\t// Skip any whitespace\\n\\t\\tthis.skipWhitespace();\\n\\t\\t//  Check if we've got the end marker\\n\\t\\tterminatorRegExp.lastIndex = this.pos;\\n\\t\\tmatch = terminatorRegExp.exec(this.source);\\n\\t}\\n\\tif(match && match.index === this.pos) {\\n\\t\\tthis.pos = match.index + match[0].length;\\n\\t}\\n\\treturn tree;\\n};
2731\\n\\n/*\\nParse a run of text at the current position\\n\\tterminatorRegExp: a regexp at which to stop the run\\n\\toptions: see below\\nOptions available:\\n\\teatTerminator: move the parse position past any encountered terminator (default false)\\n*/\\nWikiParser.prototype.parseInlineRun = function(terminatorRegExp,options) {\\n\\tif(terminatorRegExp) {\\n\\t\\treturn this.parseInlineRunTerminated(terminatorRegExp,options);\\n\\t} else {\\n\\t\\treturn this.parseInlineRunUnterminated(options);\\n\\t}\\n};\\n\\nWikiParser.prototype.parseInlineRunUnterminated = function(options) {\\n\\tvar tree = [];\\n\\t// Find the next occurrence of an inline rule\\n\\tvar nextMatch = this.findNextMatch(this.inlineRules,this.pos);\\n\\t// Loop around the matches until we've reached the end of the text\\n\\twhile(this.pos \u003C this.sourceLength && nextMatch) {\\n\\t\\t// Process the text preceding the run rule\\n\\t\\tif(nextMatch.matchIndex > this.pos) {\\n\\t\\t\\tthis.pushTextWidget(tree,this.source.substring(this.pos,nextMatch.matchIndex),this.pos,nextMatch.matchIndex);\\n\\t\\t\\tthis.pos = nextMatch.matchIndex;\\n\\t\\t}\\n\\t\\t// Process the run rule\\n\\t\\ttree.push.apply(tree,nextMatch.rule.parse());\\n\\t\\t// Look for the next run rule\\n\\t\\tnextMatch = this.findNextMatch(this.inlineRules,this.pos);\\n\\t}\\n\\t// Process the remaining text\\n\\tif(this.pos \u003C this.sourceLength) {\\n\\t\\tthis.pushTextWidget(tree,this.source.substr(this.pos),this.pos,this.sourceLength);\\n\\t}\\n\\tthis.pos = this.sourceLength;\\n\\treturn tree;\\n};\\n\\nWikiParser.prototype.parseInlineRunTerminated = function(terminatorRegExp,options) {\\n\\toptions = options || {};\\n\\tvar tree = [];\\n\\t// Find the next occurrence of the terminator\\n\\tterminatorRegExp.lastIndex = this.pos;\\n\\tvar terminatorMatch = terminatorRegExp.exec(this.source);\\n\\t// Find the next occurrence of a inlinerule\\n\\tvar inlineRuleMatch = this.findNextMatch(this.inlineRules,this.pos);\\n\\t// Loop around until we've reached the end of the text\\n\\twhile(this.pos \u003C this.sourceLength && (terminatorMatch || inlineRuleMatch)) {\\n\\t\\t// Return if we've found the terminator, and it precedes any inline rule match\\n\\t\\tif(terminatorMatch) {\\n\\t\\t\\tif(!inlineRuleMatch || inlineRuleMatch.matchIndex >= terminatorMatch.index) {\\n\\t\\t\\t\\tif(terminatorMatch.index > this.pos) {\\n\\t\\t\\t\\t\\tthis.pushTextWidget(tree,this.source.substring(this.pos,terminatorMatch.index),this.pos,terminatorMatch.index);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tthis.pos = terminatorMatch.index;\\n\\t\\t\\t\\tif(options.eatTerminator) {\\n\\t\\t\\t\\t\\tthis.pos += terminatorMatch[0].length;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn tree;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\t// Process any inline rule, along with the text preceding it\\n\\t\\tif(inlineRuleMatch) {\\n\\t\\t\\t// Preceding text\\n\\t\\t\\tif(inlineRuleMatch.matchIndex > this.pos) {\\n\\t\\t\\t\\tthis.pushTextWidget(tree,this.source.substring(this.pos,inlineRuleMatch.matchIndex),this.pos,inlineRuleMatch.matchIndex);\\n\\t\\t\\t\\tthis.pos = inlineRuleMatch.matchIndex;\\n\\t\\t\\t}\\n\\t\\t\\t// Process the inline rule\\n\\t\\t\\ttree.push.apply(tree,inlineRuleMatch.rule.parse());\\n\\t\\t\\t// Look for the next inline rule\\n\\t\\t\\tinlineRuleMatch = this.findNextMatch(this.inlineRules,this.pos);\\n\\t\\t\\t// Look for the next terminator match\\n\\t\\t\\tterminatorRegExp.lastIndex = this.pos;\\n\\t\\t\\tterminatorMatch = terminatorRegExp.exec(this.source);\\n\\t\\t}\\n\\t}\\n\\t// Process the remaining text\\n\\tif(this.pos \u003C this.sourceLength) {\\n\\t\\tthis.pushTextWidget(tree,this.source.substr(this.pos),this.pos,this.sourceLength);\\n\\t}\\n\\tthis.pos = this.sourceLength;\\n\\treturn tree;\\n};
2731\\n\\n/*\\nPush a text widget onto an array, respecting the configTrimWhiteSpace setting\\n*/\\nWikiParser.prototype.pushTextWidget = function(array,text,start,end) {\\n\\tif(this.configTrimWhiteSpace) {\\n\\t\\ttext = $tw.utils.trim(text);\\n\\t}\\n\\tif(text) {\\n\\t\\tarray.push({type: \\\"text\\\", text: text, start: start, end: end});\\t\\t\\n\\t}\\n};\\n\\n/*\\nParse zero or more class specifiers `.classname`\\n*/\\nWikiParser.prototype.parseClasses = function() {\\n\\tvar classRegExp = /\\\\.([^\\\\s\\\\.]+)/mg,\\n\\t\\tclassNames = [];\\n\\tclassRegExp.lastIndex = this.pos;\\n\\tvar match = classRegExp.exec(this.source);\\n\\twhile(match && match.index === this.pos) {\\n\\t\\tthis.pos = match.index + match[0].length;\\n\\t\\tclassNames.push(match[1]);\\n\\t\\tmatch = classRegExp.exec(this.source);\\n\\t}\\n\\treturn classNames;\\n};\\n\\n/*\\nAmend the rules used by this instance of the parser\\n\\ttype: `only` keeps just the named rules, `except` keeps all but the named rules\\n\\tnames: array of rule names\\n*/\\nWikiParser.prototype.amendRules = function(type,names) {\\n\\tnames = names || [];\\n\\t// Define the filter function\\n\\tvar target;\\n\\tif(type === \\\"only\\\") {\\n\\t\\ttarget = true;\\n\\t} else if(type === \\\"except\\\") {\\n\\t\\ttarget = false;\\n\\t} else {\\n\\t\\treturn;\\n\\t}\\n\\t// Define a function to process each of our rule arrays\\n\\tvar processRuleArray = function(ruleArray) {\\n\\t\\tfor(var t=ruleArray.length-1; t>=0; t--) {\\n\\t\\t\\tif((names.indexOf(ruleArray[t].rule.name) === -1) === target) {\\n\\t\\t\\t\\truleArray.splice(t,1);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t};\\n\\t// Process each rule array\\n\\tprocessRuleArray(this.pragmaRules);\\n\\tprocessRuleArray(this.blockRules);\\n\\tprocessRuleArray(this.inlineRules);\\n};\\n\\nexports[\\\"text/vnd.tiddlywiki\\\"] = WikiParser;\\n\\n})();\\n\\n\",\"type\":\"application/javascript\",\"module-type\":\"parser\"},\"$:/core/modules/parsers/wikiparser/rules/wikirulebase.js\":{\"title\":\"$:/core/modules/parsers/wikiparser/rules/wikirulebase.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/parsers/wikiparser/rules/wikirulebase.js\\ntype: application/javascript\\nmodule-type: global\\n\\nBase class for wiki parser rules\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nThis constructor is always overridden with a blank constructor, and so shouldn't be used\\n*/\\nvar WikiRuleBase = function() {\\n};
2731\\n\\n/*\\nTo be overridden by individual rules\\n*/\\nWikiRuleBase.prototype.init = function(parser) {\\n\\tthis.parser = parser;\\n};\\n\\n/*\\nDefault implementation of findNextMatch uses RegExp matching\\n*/\\nWikiRuleBase.prototype.findNextMatch = function(startPos) {\\n\\tthis.matchRegExp.lastIndex = startPos;\\n\\tthis.match = this.matchRegExp.exec(this.parser.source);\\n\\treturn this.match ? this.match.index : undefined;\\n};\\n\\nexports.WikiRuleBase = WikiRuleBase;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"global\"},\"$:/core/modules/pluginswitcher.js\":{\"title\":\"$:/core/modules/pluginswitcher.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/pluginswitcher.js\\ntype: application/javascript\\nmodule-type: global\\n\\nManages switching plugins for themes and languages.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\noptions:\\nwiki: wiki store to be used\\npluginType: type of plugin to be switched\\ncontrollerTitle: title of tiddler used to control switching of this resource\\ndefaultPlugins: array of default plugins to be used if nominated plugin isn't found\\nonSwitch: callback when plugin is switched (single parameter is array of plugin titles)\\n*/\\nfunction PluginSwitcher(options) {\\n\\tthis.wiki = options.wiki;\\n\\tthis.pluginType = options.pluginType;\\n\\tthis.controllerTitle = options.controllerTitle;\\n\\tthis.defaultPlugins = options.defaultPlugins || [];\\n\\tthis.onSwitch = options.onSwitch;\\n\\t// Switch to the current plugin\\n\\tthis.switchPlugins();\\n\\t// Listen for changes to the selected plugin\\n\\tvar self = this;\\n\\tthis.wiki.addEventListener(\\\"change\\\",function(changes) {\\n\\t\\tif($tw.utils.hop(changes,self.controllerTitle)) {\\n\\t\\t\\tself.switchPlugins();\\n\\t\\t}\\n\\t});\\n}\\n\\nPluginSwitcher.prototype.switchPlugins = function() {\\n\\t// Get the name of the current theme\\n\\tvar selectedPluginTitle = this.wiki.getTiddlerText(this.controllerTitle);\\n\\t// If it doesn't exist, then fallback to one of the default themes\\n\\tvar index = 0;\\n\\twhile(!this.wiki.getTiddler(selectedPluginTitle) && index \u003C this.defaultPlugins.length) {\\n\\t\\tselectedPluginTitle = this.defaultPlugins[index++];\\n\\t}\\n\\t// Accumulate the titles of the plugins that we need to load\\n\\tvar plugins = [],\\n\\t\\tself = this,\\n\\t\\taccumulatePlugin = function(title) {\\n\\t\\t\\tvar tiddler = self.wiki.getTiddler(title);\\n\\t\\t\\tif(tiddler && tiddler.isPlugin() && plugins.indexOf(title) === -1) {\\n\\t\\t\\t\\tplugins.push(title);\\n\\t\\t\\t\\tvar pluginInfo = $tw.utils.parseJSONSafe(self.wiki.getTiddlerText(title)),\\n\\t\\t\\t\\t\\tdependents = $tw.utils.parseStringArray(tiddler.fields.dependents || \\\"\\\");\\n\\t\\t\\t\\t$tw.utils.each(dependents,function(title) {\\n\\t\\t\\t\\t\\taccumulatePlugin(title);\\n\\t\\t\\t\\t});\\n\\t\\t\\t}\\n\\t\\t};\\n\\taccumulatePlugin(selectedPluginTitle);\\n\\t// Read the plugin info for the incoming plugins\\n\\tvar changes = $tw.wiki.readPluginInfo(plugins);\\n\\t// Unregister any existing theme tiddlers\\n\\tvar unregisteredTiddlers = $tw.wiki.unregisterPluginTiddlers(this.pluginType);\\n\\t// Register any new theme tiddlers\\n\\tvar registeredTiddlers = $tw.wiki.registerPluginTiddlers(this.pluginType,plugins);\\n\\t// Unpack the current theme tiddlers\\n\\t$tw.wiki.unpackPluginTiddlers();\\n\\t// Call the switch handler\\n\\tif(this.onSwitch) {\\n\\t\\tthis.onSwitch(plugins);\\n\\t}\\n};\\n\\nexports.PluginSwitcher = PluginSwitcher;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"global\"},\"$:/core/modules/saver-handler.js\":{\"title\":\"$:/core/modules/saver-handler.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/saver-handler.js\\ntype: application/javascript\\nmodule-type: global\\n\\nThe saver handler tracks changes to the store and handles saving the entire wiki via saver modules.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nInstantiate the saver handler with the following options:\\nwiki: wiki to be synced\\ndirtyTracking: true if dirty tracking should be performed\\n*/\\nfunction SaverHandler(options) {\\n\\tvar self = this;\\n\\tthis.wiki = options.wiki;\\n\\tthis.dirtyTracking = options.dirtyTracking;\\n\\tthis.preloadDirty = options.preloadDirty || [];\\n\\tthis.pendingAutoSave = false;\\n\\t// Make a logger\\n\\tthis.logger = new $tw.utils.Logger(\\\"saver-handler\\\");\\n\\t// Initialise our savers\\n\\tif($tw.browser) {\\n\\t\\tthis.initSavers();\\n\\t}\\n\\t// Only do dirty tracking if required\\n\\tif($tw.browser && this.dirtyTracking) {\\n\\t\\t// Compile the dirty tiddler filter\\n\\t\\tthis.filterFn = this.wiki.compileFilter(this.wiki.getTiddlerText(this.titleSyncFilter));\\n\\t\\t// Count of changes that have not yet been saved\\n\\t\\tvar filteredChanges = self.filterFn.call(self.wiki,function(iterator) {\\n\\t\\t\\t\\t$t
2731w.utils.each(self.preloadDirty,function(title) {\\n\\t\\t\\t\\t\\tvar tiddler = self.wiki.getTiddler(title);\\n\\t\\t\\t\\t\\titerator(tiddler,title);\\n\\t\\t\\t\\t});\\n\\t\\t});\\n\\t\\tthis.numChanges = filteredChanges.length;\\n\\t\\t// Listen out for changes to tiddlers\\n\\t\\tthis.wiki.addEventListener(\\\"change\\\",function(changes) {\\n\\t\\t\\t// Filter the changes so that we only count changes to tiddlers that we care about\\n\\t\\t\\tvar filteredChanges = self.filterFn.call(self.wiki,function(iterator) {\\n\\t\\t\\t\\t$tw.utils.each(changes,function(change,title) {\\n\\t\\t\\t\\t\\tvar tiddler = self.wiki.getTiddler(title);\\n\\t\\t\\t\\t\\titerator(tiddler,title);\\n\\t\\t\\t\\t});\\n\\t\\t\\t});\\n\\t\\t\\t// Adjust the number of changes\\n\\t\\t\\tself.numChanges += filteredChanges.length;\\n\\t\\t\\tself.updateDirtyStatus();\\n\\t\\t\\t// Do any autosave if one is pending and there's no more change events\\n\\t\\t\\tif(self.pendingAutoSave && self.wiki.getSizeOfTiddlerEventQueue() === 0) {\\n\\t\\t\\t\\t// Check if we're dirty\\n\\t\\t\\t\\tif(self.numChanges > 0) {\\n\\t\\t\\t\\t\\tself.saveWiki({\\n\\t\\t\\t\\t\\t\\tmethod: \\\"autosave\\\",\\n\\t\\t\\t\\t\\t\\tdownloadType: \\\"text/plain\\\"\\n\\t\\t\\t\\t\\t});\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tself.pendingAutoSave = false;\\n\\t\\t\\t}\\n\\t\\t});\\n\\t\\t// Listen for the autosave event\\n\\t\\t$tw.rootWidget.addEventListener(\\\"tm-auto-save-wiki\\\",function(event) {\\n\\t\\t\\t// Do the autosave unless there are outstanding tiddler change events\\n\\t\\t\\tif(self.wiki.getSizeOfTiddlerEventQueue() === 0) {\\n\\t\\t\\t\\t// Check if we're dirty\\n\\t\\t\\t\\tif(self.numChanges > 0) {\\n\\t\\t\\t\\t\\tself.saveWiki({\\n\\t\\t\\t\\t\\t\\tmethod: \\\"autosave\\\",\\n\\t\\t\\t\\t\\t\\tdownloadType: \\\"text/plain\\\"\\n\\t\\t\\t\\t\\t});\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else {\\n\\t\\t\\t\\t// Otherwise put ourselves in the \\\"pending autosave\\\" state and wait for the change event before we do the autosave\\n\\t\\t\\t\\tself.pendingAutoSave = true;\\n\\t\\t\\t}\\n\\t\\t});\\n\\t\\t// Set up our beforeunload handler\\n\\t\\t$tw.addUnloadTask(function(event) {\\n\\t\\t\\tvar confirmationMessage;\\n\\t\\t\\tif(self.isDirty()) {\\n\\t\\t\\t\\tconfirmationMessage = $tw.language.getString(\\\"UnsavedChangesWarning\\\");\\n\\t\\t\\t\\tevent.returnValue = confirmationMessage; // Gecko\\n\\t\\t\\t}\\n\\t\\t\\treturn confirmationMessage;\\n\\t\\t});\\n\\t}\\n\\t// Install the save action handlers\\n\\tif($tw.browser) {\\n\\t\\t$tw.rootWidget.addEventListener(\\\"tm-save-wiki\\\",function(event) {\\n\\t\\t\\tself.saveWiki({\\n\\t\\t\\t\\ttemplate: event.param,\\n\\t\\t\\t\\tdownloadType: \\\"text/plain\\\",\\n\\t\\t\\t\\tvariables: event.paramObject\\n\\t\\t\\t});\\n\\t\\t});\\n\\t\\t$tw.rootWidget.addEventListener(\\\"tm-download-file\\\",function(event) {\\n\\t\\t\\tself.saveWiki({\\n\\t\\t\\t\\tmethod: \\\"download\\\",\\n\\t\\t\\t\\ttemplate: event.param,\\n\\t\\t\\t\\tdownloadType: \\\"text/plain\\\",\\n\\t\\t\\t\\tvariables: event.paramObject\\n\\t\\t\\t});\\n\\t\\t});\\n\\t}\\n}\\n\\nSaverHandler.prototype.titleSyncFilter = \\\"$:/config/SaverFilter\\\";\\nSaverHandler.prototype.titleAutoSave = \\\"$:/config/AutoSave\\\";\\nSaverHandler.prototype.titleSavedNotification = \\\"$:/language/Notifications/Save/Done\\\";\\n\\n/*\\nSelect the appropriate saver modules and set them up\\n*/\\nSaverHandler.prototype.initSavers = function(moduleType) {\\n\\tmoduleType = moduleType || \\\"saver\\\";\\n\\t// Instantiate the available savers\\n\\tthis.savers = [];\\n\\tvar self = this;\\n\\t$tw.modules.forEachModuleOfType(moduleType,function(title,module) {\\n\\t\\tif(module.canSave(self)) {\\n\\t\\t\\tself.savers.push(module.create(self.wiki));\\n\\t\\t}\\n\\t});\\n\\t// Sort the savers into priority order\\n\\tthis.savers.sort(function(a,b) {\\n\\t\\tif(a.info.priority \u003C b.info.priority) {\\n\\t\\t\\treturn -1;\\n\\t\\t} else {\\n\\t\\t\\tif(a.info.priority > b.info.priority) {\\n\\t\\t\\t\\treturn +1;\\n\\t\\t\\t} else {\\n\\t\\t\\t\\treturn 0;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t});\\n};
2731\\n\\n/*\\nSave the wiki contents. Options are:\\n\\tmethod: \\\"save\\\", \\\"autosave\\\" or \\\"download\\\"\\n\\ttemplate: the tiddler containing the template to save\\n\\tdownloadType: the content type for the saved file\\n*/\\nSaverHandler.prototype.saveWiki = function(options) {\\n\\toptions = options || {};\\n\\tvar self = this,\\n\\t\\tmethod = options.method || \\\"save\\\";\\n\\t// Ignore autosave if disabled\\n\\tif(method === \\\"autosave\\\" && ($tw.config.disableAutoSave || this.wiki.getTiddlerText(this.titleAutoSave,\\\"yes\\\") !== \\\"yes\\\")) {\\n\\t\\treturn false;\\n\\t}\\n\\tvar\\tvariables = options.variables || {},\\n\\t\\ttemplate = (options.template || \\n\\t\\t           this.wiki.getTiddlerText(\\\"$:/config/SaveWikiButton/Template\\\",\\\"$:/core/save/all\\\")).trim(),\\n\\t\\tdownloadType = options.downloadType || \\\"text/plain\\\",\\n\\t\\ttext = this.wiki.renderTiddler(downloadType,template,options),\\n\\t\\tcallback = function(err) {\\n\\t\\t\\tif(err) {\\n\\t\\t\\t\\talert($tw.language.getString(\\\"Error/WhileSaving\\\") + \\\":\\\\n\\\\n\\\" + err);\\n\\t\\t\\t} else {\\n\\t\\t\\t\\t// Clear the task queue if we're saving (rather than downloading)\\n\\t\\t\\t\\tif(method !== \\\"download\\\") {\\n\\t\\t\\t\\t\\tself.numChanges = 0;\\n\\t\\t\\t\\t\\tself.updateDirtyStatus();\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t$tw.notifier.display(self.titleSavedNotification);\\n\\t\\t\\t\\tif(options.callback) {\\n\\t\\t\\t\\t\\toptions.callback();\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t};\\n\\t// Call the highest priority saver that supports this method\\n\\tfor(var t=this.savers.length-1; t>=0; t--) {\\n\\t\\tvar saver = this.savers[t];\\n\\t\\tif(saver.info.capabilities.indexOf(method) !== -1 && saver.save(text,method,callback,{variables: {filename: variables.filename}})) {\\n\\t\\t\\tthis.logger.log(\\\"Saving wiki with method\\\",method,\\\"through saver\\\",saver.info.name);\\n\\t\\t\\treturn true;\\n\\t\\t}\\n\\t}\\n\\treturn false;\\n};
2731\\n\\n/*\\nChecks whether the wiki is dirty (ie the window shouldn't be closed)\\n*/\\nSaverHandler.prototype.isDirty = function() {\\n\\treturn this.numChanges > 0;\\n};\\n\\n/*\\nUpdate the document body with the class \\\"tc-dirty\\\" if the wiki has unsaved/unsynced changes\\n*/\\nSaverHandler.prototype.updateDirtyStatus = function() {\\n\\tvar self = this;\\n\\tif($tw.browser) {\\n\\t\\t$tw.utils.toggleClass(document.body,\\\"tc-dirty\\\",this.isDirty());\\n\\t\\t$tw.utils.each($tw.windows,function(win) {\\n\\t\\t\\t$tw.utils.toggleClass(win.document.body,\\\"tc-dirty\\\",self.isDirty());\\n\\t\\t});\\n\\t}\\n};\\n\\nexports.SaverHandler = SaverHandler;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"global\"},\"$:/core/modules/savers/andtidwiki.js\":{\"title\":\"$:/core/modules/savers/andtidwiki.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/savers/andtidwiki.js\\ntype: application/javascript\\nmodule-type: saver\\n\\nHandles saving changes via the AndTidWiki Android app\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false, netscape: false, Components: false */\\n\\\"use strict\\\";\\n\\nvar AndTidWiki = function(wiki) {\\n};\\n\\nAndTidWiki.prototype.save = function(text,method,callback,options) {\\n\\tvar filename = options && options.variables ? options.variables.filename : null;\\n\\tif (method === \\\"download\\\") {\\n\\t\\t// Support download\\n\\t\\tif (window.twi.saveDownload) {\\n\\t\\t\\ttry {\\n\\t\\t\\t\\twindow.twi.saveDownload(text,filename);\\n\\t\\t\\t} catch(err) {\\n\\t\\t\\t\\tif (err.message === \\\"Method not found\\\") {\\n\\t\\t\\t\\t\\twindow.twi.saveDownload(text);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\t\\t\\tvar link = document.createElement(\\\"a\\\");\\n\\t\\t\\tlink.setAttribute(\\\"href\\\",\\\"data:text/plain,\\\" + encodeURIComponent(text));\\n\\t\\t\\tif (filename) {\\n\\t\\t\\t    link.setAttribute(\\\"download\\\",filename);\\n\\t\\t\\t}\\n\\t\\t\\tdocument.body.appendChild(link);\\n\\t\\t\\tlink.click();\\n\\t\\t\\tdocument.body.removeChild(link);\\n\\t\\t}\\n\\t} else if (window.twi.saveWiki) {\\n\\t\\t// Direct save in Tiddloid\\n\\t\\twindow.twi.saveWiki(text);\\n\\t} else {\\n\\t\\t// Get the pathname of this document\\n\\t\\tvar pathname = $tw.utils.decodeURIComponentSafe(document.location.toString().split(\\\"#\\\")[0]);\\n\\t\\t// Strip the file://\\n\\t\\tif(pathname.indexOf(\\\"file://\\\") === 0) {\\n\\t\\t\\tpathname = pathname.substr(7);\\n\\t\\t}\\n\\t\\t// Strip any query or location part\\n\\t\\tvar p = pathname.indexOf(\\\"?\\\");\\n\\t\\tif(p !== -1) {\\n\\t\\t\\tpathname = pathname.substr(0,p);\\n\\t\\t}\\n\\t\\tp = pathname.indexOf(\\\"#\\\");\\n\\t\\tif(p !== -1) {\\n\\t\\t\\tpathname = pathname.substr(0,p);\\n\\t\\t}\\n\\t\\t// Save the file\\n\\t\\twindow.twi.saveFile(pathname,text);\\n\\t}\\n\\t// Call the callback\\n\\tcallback(null);\\n\\treturn true;\\n};
2731\\n\\n/*\\nInformation about this saver\\n*/\\nAndTidWiki.prototype.info = {\\n\\tname: \\\"andtidwiki\\\",\\n\\tpriority: 1600,\\n\\tcapabilities: [\\\"save\\\", \\\"autosave\\\", \\\"download\\\"]\\n};\\n\\n/*\\nStatic method that returns true if this saver is capable of working\\n*/\\nexports.canSave = function(wiki) {\\n\\treturn !!window.twi && !!window.twi.saveFile;\\n};\\n\\n/*\\nCreate an instance of this saver\\n*/\\nexports.create = function(wiki) {\\n\\treturn new AndTidWiki(wiki);\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"saver\"},\"$:/core/modules/savers/custom.js\":{\"title\":\"$:/core/modules/savers/custom.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/savers/custom.js\\ntype: application/javascript\\nmodule-type: saver\\n\\nLooks for `window.$tw.customSaver` first on the current window, then\\non the parent window (of an iframe). If present, the saver must define\\n\\tsave: function(text,method,callback) { ... }\\nand the saver may define\\n\\tpriority: number\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar findSaver = function(window) {\\n\\ttry {\\n\\t\\treturn window && window.$tw && window.$tw.customSaver;\\n\\t} catch (err) {\\n\\t\\t// Catching the exception is the most reliable way to detect cross-origin iframe errors.\\n\\t\\t// For example, instead of saying that `window.parent.$tw` is undefined, Firefox will throw\\n\\t\\t//   Uncaught DOMException: Permission denied to access property \\\"$tw\\\" on cross-origin object\\n\\t\\tconsole.log({ msg: \\\"custom saver is disabled\\\", reason: err });\\n\\t\\treturn null;\\n\\t}\\n}\\nvar saver = findSaver(window) || findSaver(window.parent) || {};\\n\\nvar CustomSaver = function(wiki) {\\n};\\n\\nCustomSaver.prototype.save = function(text,method,callback) {\\n\\treturn saver.save(text, method, callback);\\n};\\n\\n/*\\nInformation about this saver\\n*/\\nCustomSaver.prototype.info = {\\n\\tname: \\\"custom\\\",\\n\\tpriority: saver.priority || 4000,\\n\\tcapabilities: [\\\"save\\\",\\\"autosave\\\"]\\n};\\n\\n/*\\nStatic method that returns true if this saver is capable of working\\n*/\\nexports.canSave = function(wiki) {\\n\\treturn !!(saver.save);\\n};\\n\\n/*\\nCreate an instance of this saver\\n*/\\nexports.create = function(wiki) {\\n\\treturn new CustomSaver(wiki);\\n};\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"saver\"},\"$:/core/modules/savers/download.js\":{\"title\":\"$:/core/modules/savers/download.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/savers/download.js\\ntype: application/javascript\\nmodule-type: saver\\n\\nHandles saving changes via HTML5's download APIs\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nSelect the appropriate saver module and set it up\\n*/\\nvar DownloadSaver = function(wiki) {\\n};\\n\\nDownloadSaver.prototype.save = function(text,method,callback,options) {\\n\\toptions = options || {};\\n\\t// Get the current filename\\n\\tvar filename = options.variables.filename;\\n\\tif(!filename) {\\n\\t\\tvar p = document.location.pathname.lastIndexOf(\\\"/\\\");\\n\\t\\tif(p !== -1) {\\n\\t\\t\\t// We decode the pathname because document.location is URL encoded by the browser\\n\\t\\t\\tfilename = $tw.utils.decodeURIComponentSafe(document.location.pathname.substr(p+1));\\n\\t\\t}\\n\\t}\\n\\tif(!filename) {\\n\\t\\tfilename = \\\"tiddlywiki.html\\\";\\n\\t}\\n\\t// Set up the link\\n\\tvar link = document.createElement(\\\"a\\\");\\n\\tif(Blob !== undefined) {\\n\\t\\tvar blob = new Blob([text], {type: \\\"text/html\\\"});\\n\\t\\tlink.setAttribute(\\\"href\\\", URL.createObjectURL(blob));\\n\\t} else {\\n\\t\\tlink.setAttribute(\\\"href\\\",\\\"data:text/html,\\\" + encodeURIComponent(text));\\n\\t}\\n\\tlink.setAttribute(\\\"download\\\",filename);\\n\\tdocument.body.appendChild(link);\\n\\tlink.click();\\n\\tdocument.body.removeChild(link);\\n\\t// Callback that we succeeded\\n\\tcallback(null);\\n\\treturn true;\\n};
2731\\n\\n/*\\nInformation about this saver\\n*/\\nDownloadSaver.prototype.info = {\\n\\tname: \\\"download\\\",\\n\\tpriority: 100\\n};\\n\\nObject.defineProperty(DownloadSaver.prototype.info, \\\"capabilities\\\", {\\n\\tget: function() {\\n\\t\\tvar capabilities = [\\\"save\\\", \\\"download\\\"];\\n\\t\\tif(($tw.wiki.getTextReference(\\\"$:/config/DownloadSaver/AutoSave\\\") || \\\"\\\").toLowerCase() === \\\"yes\\\") {\\n\\t\\t\\tcapabilities.push(\\\"autosave\\\");\\n\\t\\t}\\n\\t\\treturn capabilities;\\n\\t}\\n});\\n\\n/*\\nStatic method that returns true if this saver is capable of working\\n*/\\nexports.canSave = function(wiki) {\\n\\treturn document.createElement(\\\"a\\\").download !== undefined;\\n};\\n\\n/*\\nCreate an instance of this saver\\n*/\\nexports.create = function(wiki) {\\n\\treturn new DownloadSaver(wiki);\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"saver\"},\"$:/core/modules/savers/fsosaver.js\":{\"title\":\"$:/core/modules/savers/fsosaver.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/savers/fsosaver.js\\ntype: application/javascript\\nmodule-type: saver\\n\\nHandles saving changes via MS FileSystemObject ActiveXObject\\n\\nNote: Since TiddlyWiki's markup contains the MOTW, the FileSystemObject normally won't be available. \\nHowever, if the wiki is loaded as an .HTA file (Windows HTML Applications) then the FSO can be used.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nSelect the appropriate saver module and set it up\\n*/\\nvar FSOSaver = function(wiki) {\\n};\\n\\nFSOSaver.prototype.save = function(text,method,callback) {\\n\\t// Get the pathname of this document\\n\\tvar pathname = unescape(document.location.pathname);\\n\\t// Test for a Windows path of the form /x:\\\\blah...\\n\\tif(/^\\\\/[A-Z]\\\\:\\\\\\\\[^\\\\\\\\]+/i.test(pathname)) {\\t// ie: ^/[a-z]:/[^/]+\\n\\t\\t// Remove the leading slash\\n\\t\\tpathname = pathname.substr(1);\\n\\t} else if(document.location.hostname !== \\\"\\\" && /^\\\\/\\\\\\\\[^\\\\\\\\]+\\\\\\\\[^\\\\\\\\]+/i.test(pathname)) {\\t// test for \\\\\\\\server\\\\share\\\\blah... - ^/[^/]+/[^/]+\\n\\t\\t// Remove the leading slash\\n\\t\\tpathname = pathname.substr(1);\\n\\t\\t// reconstruct UNC path\\n\\t\\tpathname = \\\"\\\\\\\\\\\\\\\\\\\" + document.location.hostname + pathname;\\n\\t} else {\\n\\t\\treturn false;\\n\\t}\\n\\t// Save the file (as UTF-16)\\n\\tvar fso = new ActiveXObject(\\\"Scripting.FileSystemObject\\\");\\n\\tvar file = fso.OpenTextFile(pathname,2,-1,-1);\\n\\tfile.Write(text);\\n\\tfile.Close();\\n\\t// Callback that we succeeded\\n\\tcallback(null);\\n\\treturn true;\\n};
2731\\n\\n/*\\nInformation about this saver\\n*/\\nFSOSaver.prototype.info = {\\n\\tname: \\\"FSOSaver\\\",\\n\\tpriority: 120,\\n\\tcapabilities: [\\\"save\\\", \\\"autosave\\\"]\\n};\\n\\n/*\\nStatic method that returns true if this saver is capable of working\\n*/\\nexports.canSave = function(wiki) {\\n\\ttry {\\n\\t\\treturn (window.location.protocol === \\\"file:\\\") && !!(new ActiveXObject(\\\"Scripting.FileSystemObject\\\"));\\n\\t} catch(e) { return false; }\\n};\\n\\n/*\\nCreate an instance of this saver\\n*/\\nexports.create = function(wiki) {\\n\\treturn new FSOSaver(wiki);\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"saver\"},\"$:/core/modules/savers/gitea.js\":{\"title\":\"$:/core/modules/savers/gitea.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/savers/gitea.js\\ntype: application/javascript\\nmodule-type: saver\\n\\nSaves wiki by pushing a commit to the gitea\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nSelect the appropriate saver module and set it up\\n*/\\nvar GiteaSaver = function(wiki) {\\n\\tthis.wiki = wiki;\\n};\\n\\nGiteaSaver.prototype.save = function(text,method,callback) {\\n\\tvar self = this,\\n\\t\\tusername = this.wiki.getTiddlerText(\\\"$:/Gitea/Username\\\"),\\n\\t\\tpassword = $tw.utils.getPassword(\\\"Gitea\\\"),\\n\\t\\trepo = this.wiki.getTiddlerText(\\\"$:/Gitea/Repo\\\"),\\n\\t\\tpath = this.wiki.getTiddlerText(\\\"$:/Gitea/Path\\\",\\\"\\\"),\\n\\t\\tfilename = this.wiki.getTiddlerText(\\\"$:/Gitea/Filename\\\"),\\n\\t\\tbranch = this.wiki.getTiddlerText(\\\"$:/Gitea/Branch\\\") || \\\"master\\\",\\n\\t\\tendpoint = this.wiki.getTiddlerText(\\\"$:/Gitea/ServerURL\\\") || \\\"https://gitea\\\",\\n\\t\\theaders = {\\n\\t\\t\\t\\\"Accept\\\": \\\"application/json\\\",\\n\\t\\t\\t\\\"Content-Type\\\": \\\"application/json;charset=UTF-8\\\",\\n\\t\\t\\t\\\"Authorization\\\": \\\"token \\\" + password\\n\\t\\t};\\n\\t// Bail if we don't have everything we need\\n\\tif(!username || !password || !repo || !filename) {\\n\\t\\treturn false;\\n\\t}\\n\\t// Make sure the path start and ends with a slash\\n\\tif(path.substring(0,1) !== \\\"/\\\") {\\n\\t\\tpath = \\\"/\\\" + path;\\n\\t}\\n\\tif(path.substring(path.length - 1) !== \\\"/\\\") {\\n\\t\\tpath = path + \\\"/\\\";\\n\\t}\\n\\t// Compose the base URI\\n\\tvar uri = endpoint + \\\"/repos/\\\" + repo + \\\"/contents\\\" + path;\\n\\t// Perform a get request to get the details (inc shas) of files in the same path as our file\\n\\t$tw.utils.httpRequest({\\n\\t\\turl: uri,\\n\\t\\ttype: \\\"GET\\\",\\n\\t\\theaders: headers,\\n\\t\\tdata: {\\n\\t\\t\\tref: branch\\n\\t\\t},\\n\\t\\tcallback: function(err,getResponseDataJson,xhr) {\\n\\t\\t\\tvar getResponseData,sha = \\\"\\\";\\n\\t\\t\\tif(err && xhr.status !== 404) {\\n\\t\\t\\t\\treturn callback(err);\\n\\t\\t\\t}\\n\\t\\t\\tvar use_put = true;\\n\\t\\t\\tif(xhr.status !== 404) {\\n\\t\\t\\t\\tgetResponseData = $tw.utils.parseJSONSafe(getResponseDataJson);\\n\\t\\t\\t\\t$tw.utils.each(getResponseData,function(details) {\\n\\t\\t\\t\\t\\tif(details.name === filename) {\\n\\t\\t\\t\\t\\t\\tsha = details.sha;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t});\\n\\t\\t\\t\\tif(sha === \\\"\\\"){\\n\\t\\t\\t\\t\\tuse_put = false;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\tvar data = {\\n\\t\\t\\t\\tmessage: $tw.language.getString(\\\"ControlPanel/Saving/GitService/CommitMessage\\\"),\\n\\t\\t\\t\\tcontent: $tw.utils.base64Encode(text),\\n\\t\\t\\t\\tsha: sha\\n\\t\\t\\t};\\n\\t\\t\\t$tw.utils.httpRequest({\\n\\t\\t\\t\\turl: endpoint + \\\"/repos/\\\" + repo + \\\"/branches/\\\" + branch,\\n\\t\\t\\t\\ttype: \\\"GET\\\",\\n\\t\\t\\t\\theaders: headers,\\n\\t\\t\\t\\tcallback: function(err,getResponseDataJson,xhr) {\\n\\t\\t\\t\\t\\tif(xhr.status === 404) {\\n\\t\\t\\t\\t\\t\\tcallback(\\\"Please ensure the branch in the Gitea repo exists\\\");\\n\\t\\t\\t\\t\\t}else{\\n\\t\\t\\t\\t\\t\\tdata[\\\"branch\\\"] = branch;\\n\\t\\t\\t\\t\\t\\tself.upload(uri + filename, use_put?\\\"PUT\\\":\\\"POST\\\", headers, data, callback);\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t});\\n\\t\\t}\\n\\t});\\n\\treturn true;\\n};\\n\\nGiteaSaver.prototype.upload = function(uri,method,headers,data,callback) {\\n\\t$tw.utils.httpRequest({\\n\\t\\turl: uri,\\n\\t\\ttype: method,\\n\\t\\theaders: headers,\\n\\t\\tdata: JSON.stringify(data),\\n\\t\\tcallback: function(err,putResponseDataJson,xhr) {\\n\\t\\t\\tif(err) {\\n\\t\\t\\t\\treturn callback(err);\\n\\t\\t\\t}\\n\\t\\t\\tvar putResponseData = $tw.utils.parseJSONSafe(putResponseDataJson);\\n\\t\\t\\tcallback(null);\\n\\t\\t}\\n\\t});\\n};
2731\\n\\n/*\\nInformation about this saver\\n*/\\nGiteaSaver.prototype.info = {\\n\\tname: \\\"Gitea\\\",\\n\\tpriority: 2000,\\n\\tcapabilities: [\\\"save\\\", \\\"autosave\\\"]\\n};\\n\\n/*\\nStatic method that returns true if this saver is capable of working\\n*/\\nexports.canSave = function(wiki) {\\n\\treturn true;\\n};\\n\\n/*\\nCreate an instance of this saver\\n*/\\nexports.create = function(wiki) {\\n\\treturn new GiteaSaver(wiki);\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"saver\"},\"$:/core/modules/savers/github.js\":{\"title\":\"$:/core/modules/savers/github.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/savers/github.js\\ntype: application/javascript\\nmodule-type: saver\\n\\nSaves wiki by pushing a commit to the GitHub v3 REST API\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nSelect the appropriate saver module and set it up\\n*/\\nvar GitHubSaver = function(wiki) {\\n\\tthis.wiki = wiki;\\n};\\n\\nGitHubSaver.prototype.save = function(text,method,callback) {\\n\\tvar self = this,\\n\\t\\tusername = this.wiki.getTiddlerText(\\\"$:/GitHub/Username\\\"),\\n\\t\\tpassword = $tw.utils.getPassword(\\\"github\\\"),\\n\\t\\trepo = this.wiki.getTiddlerText(\\\"$:/GitHub/Repo\\\"),\\n\\t\\tpath = this.wiki.getTiddlerText(\\\"$:/GitHub/Path\\\",\\\"\\\"),\\n\\t\\tfilename = this.wiki.getTiddlerText(\\\"$:/GitHub/Filename\\\"),\\n\\t\\tbranch = this.wiki.getTiddlerText(\\\"$:/GitHub/Branch\\\") || \\\"main\\\",\\n\\t\\tendpoint = this.wiki.getTiddlerText(\\\"$:/GitHub/ServerURL\\\") || \\\"https://api.github.com\\\",\\n\\t\\theaders = {\\n\\t\\t\\t\\\"Accept\\\": \\\"application/vnd.github.v3+json\\\",\\n\\t\\t\\t\\\"Content-Type\\\": \\\"application/json;charset=UTF-8\\\",\\n\\t\\t\\t\\\"Authorization\\\": \\\"Basic \\\" + window.btoa(username + \\\":\\\" + password),\\n\\t\\t\\t\\\"If-None-Match\\\": \\\"\\\"\\n\\t\\t};\\n\\t// Bail if we don't have everything we need\\n\\tif(!username || !password || !repo || !filename) {\\n\\t\\treturn false;\\n\\t}\\n\\t// Make sure the path start and ends with a slash\\n\\tif(path.substring(0,1) !== \\\"/\\\") {\\n\\t\\tpath = \\\"/\\\" + path;\\n\\t}\\n\\tif(path.substring(path.length - 1) !== \\\"/\\\") {\\n\\t\\tpath = path + \\\"/\\\";\\n\\t}\\n\\t// Compose the base URI\\n\\tvar uri = endpoint + \\\"/repos/\\\" + repo + \\\"/contents\\\" + path;\\n\\t// Perform a get request to get the details (inc shas) of files in the same path as our file\\n\\t$tw.utils.httpRequest({\\n\\t\\turl: uri,\\n\\t\\ttype: \\\"GET\\\",\\n\\t\\theaders: headers,\\n\\t\\tdata: {\\n\\t\\t\\tref: branch\\n\\t\\t},\\n\\t\\tcallback: function(err,getResponseDataJson,xhr) {\\n\\t\\t\\tvar getResponseData,sha = \\\"\\\";\\n\\t\\t\\tif(err && xhr.status !== 404) {\\n\\t\\t\\t\\treturn callback(err);\\n\\t\\t\\t}\\n\\t\\t\\tif(xhr.status !== 404) {\\n\\t\\t\\t\\tgetResponseData = $tw.utils.parseJSONSafe(getResponseDataJson);\\n\\t\\t\\t\\t$tw.utils.each(getResponseData,function(details) {\\n\\t\\t\\t\\t\\tif(details.name === filename) {\\n\\t\\t\\t\\t\\t\\tsha = details.sha;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t});\\n\\t\\t\\t}\\n\\t\\t\\tvar data = {\\n\\t\\t\\t\\tmessage: $tw.language.getString(\\\"ControlPanel/Saving/GitService/CommitMessage\\\"),\\n\\t\\t\\t\\tcontent: $tw.utils.base64Encode(text),\\n\\t\\t\\t\\tbranch: branch,\\n\\t\\t\\t\\tsha: sha\\n\\t\\t\\t};\\n\\t\\t\\t// Perform a PUT request to save the file\\n\\t\\t\\t$tw.utils.httpRequest({\\n\\t\\t\\t\\turl: uri + filename,\\n\\t\\t\\t\\ttype: \\\"PUT\\\",\\n\\t\\t\\t\\theaders: headers,\\n\\t\\t\\t\\tdata: JSON.stringify(data),\\n\\t\\t\\t\\tcallback: function(err,putResponseDataJson,xhr) {\\n\\t\\t\\t\\t\\tif(err) {\\n\\t\\t\\t\\t\\t\\treturn callback(err);\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tvar putResponseData = $tw.utils.parseJSONSafe(putResponseDataJson);\\n\\t\\t\\t\\t\\tcallback(null);\\n\\t\\t\\t\\t}\\n\\t\\t\\t});\\n\\t\\t}\\n\\t});\\n\\treturn true;\\n};
2731\\n\\n/*\\nInformation about this saver\\n*/\\nGitHubSaver.prototype.info = {\\n\\tname: \\\"github\\\",\\n\\tpriority: 2000,\\n\\tcapabilities: [\\\"save\\\", \\\"autosave\\\"]\\n};\\n\\n/*\\nStatic method that returns true if this saver is capable of working\\n*/\\nexports.canSave = function(wiki) {\\n\\treturn true;\\n};\\n\\n/*\\nCreate an instance of this saver\\n*/\\nexports.create = function(wiki) {\\n\\treturn new GitHubSaver(wiki);\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"saver\"},\"$:/core/modules/savers/gitlab.js\":{\"title\":\"$:/core/modules/savers/gitlab.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/savers/gitlab.js\\ntype: application/javascript\\nmodule-type: saver\\n\\nSaves wiki by pushing a commit to the GitLab REST API\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: true */\\n\\\"use strict\\\";\\n\\n/*\\nSelect the appropriate saver module and set it up\\n*/\\nvar GitLabSaver = function(wiki) {\\n\\tthis.wiki = wiki;\\n};\\n\\nGitLabSaver.prototype.save = function(text,method,callback) {\\n\\t/* See https://docs.gitlab.com/ee/api/repository_files.html */\\n\\tvar self = this,\\n\\t\\tusername = this.wiki.getTiddlerText(\\\"$:/GitLab/Username\\\"),\\n\\t\\tpassword = $tw.utils.getPassword(\\\"gitlab\\\"),\\n\\t\\trepo = this.wiki.getTiddlerText(\\\"$:/GitLab/Repo\\\"),\\n\\t\\tpath = this.wiki.getTiddlerText(\\\"$:/GitLab/Path\\\",\\\"\\\"),\\n\\t\\tfilename = this.wiki.getTiddlerText(\\\"$:/GitLab/Filename\\\"),\\n\\t\\tbranch = this.wiki.getTiddlerText(\\\"$:/GitLab/Branch\\\") || \\\"master\\\",\\n\\t\\tendpoint = this.wiki.getTiddlerText(\\\"$:/GitLab/ServerURL\\\") || \\\"https://gitlab.com/api/v4\\\",\\n\\t\\theaders = {\\n\\t\\t\\t\\\"Content-Type\\\": \\\"application/json;charset=UTF-8\\\",\\n\\t\\t\\t\\\"Private-Token\\\": password\\n\\t\\t};\\n\\t// Bail if we don't have everything we need\\n\\tif(!username || !password || !repo || !filename) {\\n\\t\\treturn false;\\n\\t}\\n\\t// Make sure the path start and ends with a slash\\n\\tif(path.substring(0,1) !== \\\"/\\\") {\\n\\t\\tpath = \\\"/\\\" + path;\\n\\t}\\n\\tif(path.substring(path.length - 1) !== \\\"/\\\") {\\n\\t\\tpath = path + \\\"/\\\";\\n\\t}\\n\\t// Compose the base URI\\n\\tvar uri = endpoint + \\\"/projects/\\\" + encodeURIComponent(repo) + \\\"/repository/\\\";\\n\\t// Perform a get request to get the details (inc shas) of files in the same path as our file\\n\\t$tw.utils.httpRequest({\\n\\t\\turl: uri + \\\"tree/?path=\\\" + encodeURIComponent(path.replace(/^\\\\/+|\\\\/$/g, '')) + \\\"&branch=\\\" + encodeURIComponent(branch.replace(/^\\\\/+|\\\\/$/g, '')),\\n\\t\\ttype: \\\"GET\\\",\\n\\t\\theaders: headers,\\n\\t\\tcallback: function(err,getResponseDataJson,xhr) {\\n\\t\\t\\tvar getResponseData,sha = \\\"\\\";\\n\\t\\t\\tif(err && xhr.status !== 404) {\\n\\t\\t\\t\\treturn callback(err);\\n\\t\\t\\t}\\n\\t\\t\\tvar requestType = \\\"POST\\\";\\n\\t\\t\\tif(xhr.status !== 404) {\\n\\t\\t\\t\\tgetResponseData = $tw.utils.parseJSONSafe(getResponseDataJson);\\n\\t\\t\\t\\t$tw.utils.each(getResponseData,function(details) {\\n\\t\\t\\t\\t\\tif(details.name === filename) {\\n\\t\\t\\t\\t\\t\\trequestType = \\\"PUT\\\";\\n\\t\\t\\t\\t\\t\\tsha = details.sha;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t});\\n\\t\\t\\t}\\n\\t\\t\\tvar data = {\\n\\t\\t\\t\\tcommit_message: $tw.language.getString(\\\"ControlPanel/Saving/GitService/CommitMessage\\\"),\\n\\t\\t\\t\\tcontent: text,\\n\\t\\t\\t\\tbranch: branch,\\n\\t\\t\\t\\tsha: sha\\n\\t\\t\\t};\\n\\t\\t\\t// Perform a request to save the file\\n\\t\\t\\t$tw.utils.httpRequest({\\n\\t\\t\\t\\turl: uri + \\\"files/\\\" + encodeURIComponent(path.replace(/^\\\\/+/, '') + filename),\\n\\t\\t\\t\\ttype: requestType,\\n\\t\\t\\t\\theaders: headers,\\n\\t\\t\\t\\tdata: JSON.stringify(data),\\n\\t\\t\\t\\tcallback: function(err,putResponseDataJson,xhr) {\\n\\t\\t\\t\\t\\tif(err) {\\n\\t\\t\\t\\t\\t\\treturn callback(err);\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tvar putResponseData = $tw.utils.parseJSONSafe(putResponseDataJson);\\n\\t\\t\\t\\t\\tcallback(null);\\n\\t\\t\\t\\t}\\n\\t\\t\\t});\\n\\t\\t}\\n\\t});\\n\\treturn true;\\n};
2731\\n\\n/*\\nInformation about this saver\\n*/\\nGitLabSaver.prototype.info = {\\n\\tname: \\\"gitlab\\\",\\n\\tpriority: 2000,\\n\\tcapabilities: [\\\"save\\\", \\\"autosave\\\"]\\n};\\n\\n/*\\nStatic method that returns true if this saver is capable of working\\n*/\\nexports.canSave = function(wiki) {\\n\\treturn true;\\n};\\n\\n/*\\nCreate an instance of this saver\\n*/\\nexports.create = function(wiki) {\\n\\treturn new GitLabSaver(wiki);\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"saver\"},\"$:/core/modules/savers/manualdownload.js\":{\"title\":\"$:/core/modules/savers/manualdownload.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/savers/manualdownload.js\\ntype: application/javascript\\nmodule-type: saver\\n\\nHandles saving changes via HTML5's download APIs\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n// Title of the tiddler containing the download message\\nvar downloadInstructionsTitle = \\\"$:/language/Modals/Download\\\";\\n\\n/*\\nSelect the appropriate saver module and set it up\\n*/\\nvar ManualDownloadSaver = function(wiki) {\\n};\\n\\nManualDownloadSaver.prototype.save = function(text,method,callback) {\\n\\t$tw.modal.display(downloadInstructionsTitle,{\\n\\t\\tdownloadLink: \\\"data:text/html,\\\" + encodeURIComponent(text)\\n\\t});\\n\\t// Callback that we succeeded\\n\\tcallback(null);\\n\\treturn true;\\n};
2731\\n\\n/*\\nInformation about this saver\\n*/\\nManualDownloadSaver.prototype.info = {\\n\\tname: \\\"manualdownload\\\",\\n\\tpriority: 0,\\n\\tcapabilities: [\\\"save\\\", \\\"download\\\"]\\n};\\n\\n/*\\nStatic method that returns true if this saver is capable of working\\n*/\\nexports.canSave = function(wiki) {\\n\\treturn true;\\n};\\n\\n/*\\nCreate an instance of this saver\\n*/\\nexports.create = function(wiki) {\\n\\treturn new ManualDownloadSaver(wiki);\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"saver\"},\"$:/core/modules/savers/msdownload.js\":{\"title\":\"$:/core/modules/savers/msdownload.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/savers/msdownload.js\\ntype: application/javascript\\nmodule-type: saver\\n\\nHandles saving changes via window.navigator.msSaveBlob()\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nSelect the appropriate saver module and set it up\\n*/\\nvar MsDownloadSaver = function(wiki) {\\n};\\n\\nMsDownloadSaver.prototype.save = function(text,method,callback) {\\n\\t// Get the current filename\\n\\tvar filename = \\\"tiddlywiki.html\\\",\\n\\t\\tp = document.location.pathname.lastIndexOf(\\\"/\\\");\\n\\tif(p !== -1) {\\n\\t\\tfilename = document.location.pathname.substr(p+1);\\n\\t}\\n\\t// Set up the link\\n\\tvar blob = new Blob([text], {type: \\\"text/html\\\"});\\n\\twindow.navigator.msSaveBlob(blob,filename);\\n\\t// Callback that we succeeded\\n\\tcallback(null);\\n\\treturn true;\\n};
2731\\n\\n/*\\nInformation about this saver\\n*/\\nMsDownloadSaver.prototype.info = {\\n\\tname: \\\"msdownload\\\",\\n\\tpriority: 110,\\n\\tcapabilities: [\\\"save\\\", \\\"download\\\"]\\n};\\n\\n/*\\nStatic method that returns true if this saver is capable of working\\n*/\\nexports.canSave = function(wiki) {\\n\\treturn !!window.navigator.msSaveBlob;\\n};\\n\\n/*\\nCreate an instance of this saver\\n*/\\nexports.create = function(wiki) {\\n\\treturn new MsDownloadSaver(wiki);\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"saver\"},\"$:/core/modules/savers/put.js\":{\"title\":\"$:/core/modules/savers/put.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/savers/put.js\\ntype: application/javascript\\nmodule-type: saver\\n\\nSaves wiki by performing a PUT request to the server\\n\\nWorks with any server which accepts a PUT request\\nto the current URL, such as a WebDAV server.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nRetrieve ETag if available\\n*/\\nvar retrieveETag = function(self) {\\n\\tvar headers = {\\n\\t\\tAccept: \\\"*/*;charset=UTF-8\\\"\\n\\t};\\n\\t$tw.utils.httpRequest({\\n\\t\\turl: self.uri(),\\n\\t\\ttype: \\\"HEAD\\\",\\n\\t\\theaders: headers,\\n\\t\\tcallback: function(err,data,xhr) {\\n\\t\\t\\tif(err) {\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\t\\t\\tvar etag = xhr.getResponseHeader(\\\"ETag\\\");\\n\\t\\t\\tif(!etag) {\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\t\\t\\tself.etag = etag.replace(/^W\\\\//,\\\"\\\");\\n\\t\\t}\\n\\t});\\n};\\n\\n\\n/*\\nSelect the appropriate saver module and set it up\\n*/\\nvar PutSaver = function(wiki) {\\n\\tthis.wiki = wiki;\\n\\tvar self = this;\\n\\tvar uri = this.uri();\\n\\t// Async server probe. Until probe finishes, save will fail fast\\n\\t// See also https://github.com/Jermolene/TiddlyWiki5/issues/2276\\n\\t$tw.utils.httpRequest({\\n\\t\\turl: uri,\\n\\t\\ttype: \\\"OPTIONS\\\",\\n\\t\\tcallback: function(err,data,xhr) {\\n\\t\\t\\t// Check DAV header http://www.webdav.org/specs/rfc2518.html#rfc.section.9.1\\n\\t\\t\\tif(!err) {\\n\\t\\t\\t\\tself.serverAcceptsPuts = xhr.status === 200 && !!xhr.getResponseHeader(\\\"dav\\\");\\n\\t\\t\\t}\\n\\t\\t}\\n\\t});\\n\\tretrieveETag(this);\\n};\\n\\nPutSaver.prototype.uri = function() {\\n\\treturn document.location.toString().split(\\\"#\\\")[0];\\n};\\n\\n// TODO: in case of edit conflict\\n// Prompt: Do you want to save over this? Y/N\\n// Merging would be ideal, and may be possible using future generic merge flow\\nPutSaver.prototype.save = function(text,method,callback) {\\n\\tif(!this.serverAcceptsPuts) {\\n\\t\\treturn false;\\n\\t}\\n\\tvar self = this;\\n\\tvar headers = {\\n\\t\\t\\\"Content-Type\\\": \\\"text/html;charset=UTF-8\\\"\\n\\t};\\n\\tif(this.etag) {\\n\\t\\theaders[\\\"If-Match\\\"] = this.etag;\\n\\t}\\n\\t$tw.notifier.display(\\\"$:/language/Notifications/Save/Starting\\\");\\n\\t$tw.utils.httpRequest({\\n\\t\\turl: this.uri(),\\n\\t\\ttype: \\\"PUT\\\",\\n\\t\\theaders: headers,\\n\\t\\tdata: text,\\n\\t\\tcallback: function(err,data,xhr) {\\n\\t\\t\\tif(err) {\\n\\t\\t\\t\\tvar status = xhr.status,\\n\\t\\t\\t\\t\\terrorMsg = err;\\n\\t\\t\\t\\tif(status === 412) { // file changed on server\\n\\t\\t\\t\\t\\terrorMsg = $tw.language.getString(\\\"Error/PutEditConflict\\\");\\n\\t\\t\\t\\t} else if(status === 401) { // authentication required\\n\\t\\t\\t\\t\\terrorMsg = $tw.language.getString(\\\"Error/PutUnauthorized\\\");\\n\\t\\t\\t\\t} else if(status === 403) { // permission denied\\n\\t\\t\\t\\t\\terrorMsg = $tw.language.getString(\\\"Error/PutForbidden\\\");\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tif (xhr.responseText) {\\n\\t\\t\\t\\t\\t// treat any server response like a plain text error explanation\\n\\t\\t\\t\\t\\terrorMsg = errorMsg + \\\"\\\\n\\\\n\\\" + xhr.responseText;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tcallback(errorMsg); // fail\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tself.etag = xhr.getResponseHeader(\\\"ETag\\\");\\n\\t\\t\\t\\tif(self.etag == null) {\\n\\t\\t\\t\\t\\tretrieveETag(self);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tcallback(null); // success\\n\\t\\t\\t}\\n\\t\\t}\\n\\t});\\n\\treturn true;\\n};
2731\\n\\n/*\\nInformation about this saver\\n*/\\nPutSaver.prototype.info = {\\n\\tname: \\\"put\\\",\\n\\tpriority: 2000,\\n\\tcapabilities: [\\\"save\\\",\\\"autosave\\\"]\\n};\\n\\n/*\\nStatic method that returns true if this saver is capable of working\\n*/\\nexports.canSave = function(wiki) {\\n\\treturn /^https?:/.test(location.protocol);\\n};\\n\\n/*\\nCreate an instance of this saver\\n*/\\nexports.create = function(wiki) {\\n\\treturn new PutSaver(wiki);\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"saver\"},\"$:/core/modules/savers/tiddlyfox.js\":{\"title\":\"$:/core/modules/savers/tiddlyfox.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/savers/tiddlyfox.js\\ntype: application/javascript\\nmodule-type: saver\\n\\nHandles saving changes via the TiddlyFox file extension\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false, netscape: false, Components: false */\\n\\\"use strict\\\";\\n\\nvar TiddlyFoxSaver = function(wiki) {\\n};\\n\\nTiddlyFoxSaver.prototype.save = function(text,method,callback) {\\n\\tvar messageBox = document.getElementById(\\\"tiddlyfox-message-box\\\");\\n\\tif(messageBox) {\\n\\t\\t// Get the pathname of this document\\n\\t\\tvar pathname = document.location.toString().split(\\\"#\\\")[0];\\n\\t\\t// Replace file://localhost/ with file:///\\n\\t\\tif(pathname.indexOf(\\\"file://localhost/\\\") === 0) {\\n\\t\\t\\tpathname = \\\"file://\\\" + pathname.substr(16);\\n\\t\\t}\\n\\t\\t// Windows path file:///x:/blah/blah --> x:\\\\blah\\\\blah\\n\\t\\tif(/^file\\\\:\\\\/\\\\/\\\\/[A-Z]\\\\:\\\\//i.test(pathname)) {\\n\\t\\t\\t// Remove the leading slash and convert slashes to backslashes\\n\\t\\t\\tpathname = pathname.substr(8).replace(/\\\\//g,\\\"\\\\\\\\\\\");\\n\\t\\t// Firefox Windows network path file://///server/share/blah/blah --> //server/share/blah/blah\\n\\t\\t} else if(pathname.indexOf(\\\"file://///\\\") === 0) {\\n\\t\\t\\tpathname = \\\"\\\\\\\\\\\\\\\\\\\" + unescape(pathname.substr(10)).replace(/\\\\//g,\\\"\\\\\\\\\\\");\\n\\t\\t// Mac/Unix local path file:///path/path --> /path/path\\n\\t\\t} else if(pathname.indexOf(\\\"file:///\\\") === 0) {\\n\\t\\t\\tpathname = unescape(pathname.substr(7));\\n\\t\\t// Mac/Unix local path file:/path/path --> /path/path\\n\\t\\t} else if(pathname.indexOf(\\\"file:/\\\") === 0) {\\n\\t\\t\\tpathname = unescape(pathname.substr(5));\\n\\t\\t// Otherwise Windows networth path file://server/share/path/path --> \\\\\\\\server\\\\share\\\\path\\\\path\\n\\t\\t} else {\\n\\t\\t\\tpathname = \\\"\\\\\\\\\\\\\\\\\\\" + unescape(pathname.substr(7)).replace(new RegExp(\\\"/\\\",\\\"g\\\"),\\\"\\\\\\\\\\\");\\n\\t\\t}\\n\\t\\t// Create the message element and put it in the message box\\n\\t\\tvar message = document.createElement(\\\"div\\\");\\n\\t\\tmessage.setAttribute(\\\"data-tiddlyfox-path\\\",$tw.utils.decodeURIComponentSafe(pathname));\\n\\t\\tmessage.setAttribute(\\\"data-tiddlyfox-content\\\",text);\\n\\t\\tmessageBox.appendChild(message);\\n\\t\\t// Add an event handler for when the file has been saved\\n\\t\\tmessage.addEventListener(\\\"tiddlyfox-have-saved-file\\\",function(event) {\\n\\t\\t\\tcallback(null);\\n\\t\\t}, false);\\n\\t\\t// Create and dispatch the custom event to the extension\\n\\t\\tvar event = document.createEvent(\\\"Events\\\");\\n\\t\\tevent.initEvent(\\\"tiddlyfox-save-file\\\",true,false);\\n\\t\\tmessage.dispatchEvent(event);\\n\\t\\treturn true;\\n\\t} else {\\n\\t\\treturn false;\\n\\t}\\n};\\n\\n/*\\nInformation about this saver\\n*/\\nTiddlyFoxSaver.prototype.info = {\\n\\tname: \\\"tiddlyfox\\\",\\n\\tpriority: 1500,\\n\\tcapabilities: [\\\"save\\\", \\\"autosave\\\"]\\n};\\n\\n/*\\nStatic method that returns true if this saver is capable of working\\n*/\\nexports.canSave = function(wiki) {\\n\\treturn true;\\n};
2731\\n\\n/*\\nCreate an instance of this saver\\n*/\\nexports.create = function(wiki) {\\n\\treturn new TiddlyFoxSaver(wiki);\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"saver\"},\"$:/core/modules/savers/tiddlyie.js\":{\"title\":\"$:/core/modules/savers/tiddlyie.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/savers/tiddlyie.js\\ntype: application/javascript\\nmodule-type: saver\\n\\nHandles saving changes via Internet Explorer BHO extenion (TiddlyIE)\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nSelect the appropriate saver module and set it up\\n*/\\nvar TiddlyIESaver = function(wiki) {\\n};\\n\\nTiddlyIESaver.prototype.save = function(text,method,callback) {\\n\\t// Check existence of TiddlyIE BHO extension (note: only works after document is complete)\\n\\tif(typeof(window.TiddlyIE) != \\\"undefined\\\") {\\n\\t\\t// Get the pathname of this document\\n\\t\\tvar pathname = unescape(document.location.pathname);\\n\\t\\t// Test for a Windows path of the form /x:/blah...\\n\\t\\tif(/^\\\\/[A-Z]\\\\:\\\\/[^\\\\/]+/i.test(pathname)) {\\t// ie: ^/[a-z]:/[^/]+ (is this better?: ^/[a-z]:/[^/]+(/[^/]+)*\\\\.[^/]+ )\\n\\t\\t\\t// Remove the leading slash\\n\\t\\t\\tpathname = pathname.substr(1);\\n\\t\\t\\t// Convert slashes to backslashes\\n\\t\\t\\tpathname = pathname.replace(/\\\\//g,\\\"\\\\\\\\\\\");\\n\\t\\t} else if(document.hostname !== \\\"\\\" && /^\\\\/[^\\\\/]+\\\\/[^\\\\/]+/i.test(pathname)) {\\t// test for \\\\\\\\server\\\\share\\\\blah... - ^/[^/]+/[^/]+\\n\\t\\t\\t// Convert slashes to backslashes\\n\\t\\t\\tpathname = pathname.replace(/\\\\//g,\\\"\\\\\\\\\\\");\\n\\t\\t\\t// reconstruct UNC path\\n\\t\\t\\tpathname = \\\"\\\\\\\\\\\\\\\\\\\" + document.location.hostname + pathname;\\n\\t\\t} else return false;\\n\\t\\t// Prompt the user to save the file\\n\\t\\twindow.TiddlyIE.save(pathname, text);\\n\\t\\t// Callback that we succeeded\\n\\t\\tcallback(null);\\n\\t\\treturn true;\\n\\t} else {\\n\\t\\treturn false;\\n\\t}\\n};\\n\\n/*\\nInformation about this saver\\n*/\\nTiddlyIESaver.prototype.info = {\\n\\tname: \\\"tiddlyiesaver\\\",\\n\\tpriority: 1500,\\n\\tcapabilities: [\\\"save\\\"]\\n};\\n\\n/*\\nStatic method that returns true if this saver is capable of working\\n*/\\nexports.canSave = function(wiki) {\\n\\treturn (window.location.protocol === \\\"file:\\\");\\n};\\n\\n/*\\nCreate an instance of this saver\\n*/\\nexports.create = function(wiki) {\\n\\treturn new TiddlyIESaver(wiki);\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"saver\"},\"$:/core/modules/savers/twedit.js\":{\"title\":\"$:/core/modules/savers/twedit.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/savers/twedit.js\\ntype: application/javascript\\nmodule-type: saver\\n\\nHandles saving changes via the TWEdit iOS app\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false, netscape: false, Components: false */\\n\\\"use strict\\\";\\n\\nvar TWEditSaver = function(wiki) {\\n};\\n\\nTWEditSaver.prototype.save = function(text,method,callback) {\\n\\t// Bail if we're not running under TWEdit\\n\\tif(typeof DeviceInfo !== \\\"object\\\") {\\n\\t\\treturn false;\\n\\t}\\n\\t// Get the pathname of this document\\n\\tvar pathname = $tw.utils.decodeURIComponentSafe(document.location.pathname);\\n\\t// Strip any query or location part\\n\\tvar p = pathname.indexOf(\\\"?\\\");\\n\\tif(p !== -1) {\\n\\t\\tpathname = pathname.substr(0,p);\\n\\t}\\n\\tp = pathname.indexOf(\\\"#\\\");\\n\\tif(p !== -1) {\\n\\t\\tpathname = pathname.substr(0,p);\\n\\t}\\n\\t// Remove the leading \\\"/Documents\\\" from path\\n\\tvar prefix = \\\"/Documents\\\";\\n\\tif(pathname.indexOf(prefix) === 0) {\\n\\t\\tpathname = pathname.substr(prefix.length);\\n\\t}\\n\\t// Error handler\\n\\tvar errorHandler = function(event) {\\n\\t\\t// Error\\n\\t\\tcallback($tw.language.getString(\\\"Error/SavingToTWEdit\\\") + \\\": \\\" + event.target.error.code);\\n\\t};\\n\\t// Get the file system\\n\\twindow.requestFileSystem(LocalFileSystem.PERSISTENT,0,function(fileSystem) {\\n\\t\\t// Now we've got the filesystem, get the fileEntry\\n\\t\\tfileSystem.root.getFile(pathname, {create: true}, function(fileEntry) {\\n\\t\\t\\t// Now we've got the fileEntry, create the writer\\n\\t\\t\\tfileEntry.createWriter(function(writer) {\\n\\t\\t\\t\\twriter.onerror = errorHandler;\\n\\t\\t\\t\\twriter.onwrite = function() {\\n\\t\\t\\t\\t\\tcallback(null);\\n\\t\\t\\t\\t};\\n\\t\\t\\t\\twriter.position = 0;\\n\\t\\t\\t\\twriter.write(text);\\n\\t\\t\\t},errorHandler);\\n\\t\\t}, errorHandler);\\n\\t}, errorHandler);\\n\\treturn true;\\n};
2731\\n\\n/*\\nInformation about this saver\\n*/\\nTWEditSaver.prototype.info = {\\n\\tname: \\\"twedit\\\",\\n\\tpriority: 1600,\\n\\tcapabilities: [\\\"save\\\", \\\"autosave\\\"]\\n};\\n\\n/*\\nStatic method that returns true if this saver is capable of working\\n*/\\nexports.canSave = function(wiki) {\\n\\treturn true;\\n};\\n\\n/*\\nCreate an instance of this saver\\n*/\\nexports.create = function(wiki) {\\n\\treturn new TWEditSaver(wiki);\\n};\\n\\n/////////////////////////// Hack\\n// HACK: This ensures that TWEdit recognises us as a TiddlyWiki document\\nif($tw.browser) {\\n\\twindow.version = {title: \\\"TiddlyWiki\\\"};\\n}\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"saver\"},\"$:/core/modules/savers/upload.js\":{\"title\":\"$:/core/modules/savers/upload.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/savers/upload.js\\ntype: application/javascript\\nmodule-type: saver\\n\\nHandles saving changes via upload to a server.\\n\\nDesigned to be compatible with BidiX's UploadPlugin at http://tiddlywiki.bidix.info/#UploadPlugin\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nSelect the appropriate saver module and set it up\\n*/\\nvar UploadSaver = function(wiki) {\\n\\tthis.wiki = wiki;\\n};\\n\\nUploadSaver.prototype.save = function(text,method,callback) {\\n\\t// Get the various parameters we need\\n\\tvar backupDir = this.wiki.getTextReference(\\\"$:/UploadBackupDir\\\") || \\\".\\\",\\n\\t\\tusername = this.wiki.getTextReference(\\\"$:/UploadName\\\"),\\n\\t\\tpassword = $tw.utils.getPassword(\\\"upload\\\"),\\n\\t\\tuploadDir = this.wiki.getTextReference(\\\"$:/UploadDir\\\") || \\\".\\\",\\n\\t\\tuploadFilename = this.wiki.getTextReference(\\\"$:/UploadFilename\\\") || \\\"index.html\\\",\\n\\t\\tuploadWithUrlOnly = this.wiki.getTextReference(\\\"$:/UploadWithUrlOnly\\\") || \\\"no\\\",\\n\\t\\turl = this.wiki.getTextReference(\\\"$:/UploadURL\\\");\\n\\t// Bail out if we don't have the bits we need\\n\\tif (uploadWithUrlOnly === \\\"yes\\\") {\\n\\t\\t// The url is good enough. No need for a username and password.\\n\\t\\t// Assume the server uses some other kind of auth mechanism.\\n\\t\\tif(!url || url.toString().trim() === \\\"\\\") {\\n\\t\\t\\treturn false;\\n\\t\\t}\\n\\t}\\n\\telse {\\n\\t\\t// Require username and password to be present.\\n\\t\\t// Assume the server uses the standard UploadPlugin username/password.\\n\\t\\tif(!username || username.toString().trim() === \\\"\\\" || !password || password.toString().trim() === \\\"\\\") {\\n\\t\\t\\treturn false;\\n\\t\\t}\\n\\t}\\n\\t// Construct the url if not provided\\n\\tif(!url) {\\n\\t\\turl = \\\"http://\\\" + username + \\\".tiddlyspot.com/store.cgi\\\";\\n\\t}\\n\\t// Assemble the header\\n\\tvar boundary = \\\"---------------------------\\\" + \\\"AaB03x\\\";\\n\\tvar uploadFormName = \\\"UploadPlugin\\\";\\n\\tvar head = [];\\n\\thead.push(\\\"--\\\" + boundary + \\\"\\\\r\\\\nContent-disposition: form-data; name=\\\\\\\"UploadPlugin\\\\\\\"\\\\r\\\\n\\\");\\n\\thead.push(\\\"backupDir=\\\" + backupDir + \\\";user=\\\" + username + \\\";password=\\\" + password + \\\";uploaddir=\\\" + uploadDir + \\\";;\\\"); \\n\\thead.push(\\\"\\\\r\\\\n\\\" + \\\"--\\\" + boundary);\\n\\thead.push(\\\"Content-disposition: form-data; name=\\\\\\\"userfile\\\\\\\"; filename=\\\\\\\"\\\" + uploadFilename + \\\"\\\\\\\"\\\");\\n\\thead.push(\\\"Content-Type: text/html;charset=UTF-8\\\");\\n\\thead.push(\\\"Content-Length: \\\" + text.length + \\\"\\\\r\\\\n\\\");\\n\\thead.push(\\\"\\\");\\n\\t// Assemble the tail and the data itself\\n\\tvar tail = \\\"\\\\r\\\\n--\\\" + boundary + \\\"--\\\\r\\\\n\\\",\\n\\t\\tdata = head.join(\\\"\\\\r\\\\n\\\") + text + tail;\\n\\t// Do the HTTP post\\n\\t$tw.notifier.display(\\\"$:/language/Notifications/Save/Starting\\\");\\n\\tvar http = new XMLHttpRequest();\\n\\thttp.open(\\\"POST\\\",url,true,username,password);\\n\\thttp.setRequestHeader(\\\"Content-Type\\\",\\\"multipart/form-data; charset=UTF-8; boundary=\\\" + boundary);\\n\\thttp.onreadystatechange = function() {\\n\\t\\tif(http.readyState == 4 && http.status == 200) {\\n\\t\\t\\tif(http.responseText.substr(0,4) === \\\"0 - \\\") {\\n\\t\\t\\t\\tcallback(null);\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tcallback(http.responseText);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t};\\n\\ttry {\\n\\t\\thttp.send(data);\\n\\t} catch(ex) {\\n\\t\\treturn callback($tw.language.getString(\\\"Error/Caption\\\") + \\\":\\\" + ex);\\n\\t}\\n\\treturn true;\\n};
2731\\n\\n/*\\nInformation about this saver\\n*/\\nUploadSaver.prototype.info = {\\n\\tname: \\\"upload\\\",\\n\\tpriority: 2000,\\n\\tcapabilities: [\\\"save\\\", \\\"autosave\\\"]\\n};\\n\\n/*\\nStatic method that returns true if this saver is capable of working\\n*/\\nexports.canSave = function(wiki) {\\n\\treturn true;\\n};\\n\\n/*\\nCreate an instance of this saver\\n*/\\nexports.create = function(wiki) {\\n\\treturn new UploadSaver(wiki);\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"saver\"},\"$:/core/modules/server/authenticators/basic.js\":{\"title\":\"$:/core/modules/server/authenticators/basic.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/server/authenticators/basic.js\\ntype: application/javascript\\nmodule-type: authenticator\\n\\nAuthenticator for WWW basic authentication\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nif($tw.node) {\\n\\tvar util = require(\\\"util\\\"),\\n\\t\\tfs = require(\\\"fs\\\"),\\n\\t\\turl = require(\\\"url\\\"),\\n\\t\\tpath = require(\\\"path\\\");\\n}\\n\\nfunction BasicAuthenticator(server) {\\n\\tthis.server = server;\\n\\tthis.credentialsData = [];\\n}\\n\\n/*\\nReturns true if the authenticator is active, false if it is inactive, or a string if there is an error\\n*/\\nB
2731asicAuthenticator.prototype.init = function() {\\n\\t// Read the credentials data\\n\\tthis.credentialsFilepath = this.server.get(\\\"credentials\\\");\\n\\tif(this.credentialsFilepath) {\\n\\t\\tvar resolveCredentialsFilepath = path.resolve(this.server.boot.wikiPath,this.credentialsFilepath);\\n\\t\\tif(fs.existsSync(resolveCredentialsFilepath) && !fs.statSync(resolveCredentialsFilepath).isDirectory()) {\\n\\t\\t\\tvar credentialsText = fs.readFileSync(resolveCredentialsFilepath,\\\"utf8\\\"),\\n\\t\\t\\t\\tcredentialsData = $tw.utils.parseCsvStringWithHeader(credentialsText);\\n\\t\\t\\tif(typeof credentialsData === \\\"string\\\") {\\n\\t\\t\\t\\treturn \\\"Error: \\\" + credentialsData + \\\" reading credentials from '\\\" + resolveCredentialsFilepath + \\\"'\\\";\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tthis.credentialsData = credentialsData;\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\t\\t\\treturn \\\"Error: Unable to load user credentials from '\\\" + resolveCredentialsFilepath + \\\"'\\\";\\n\\t\\t}\\n\\t}\\n\\t// Add the hardcoded username and password if specified\\n\\tif(this.server.get(\\\"username\\\") && this.server.get(\\\"password\\\")) {\\n\\t\\tthis.credentialsData = this.credentialsData || [];\\n\\t\\tthis.credentialsData.push({\\n\\t\\t\\tusername: this.server.get(\\\"username\\\"),\\n\\t\\t\\tpassword: this.server.get(\\\"password\\\")\\n\\t\\t});\\n\\t}\\n\\treturn this.credentialsData.length > 0;\\n};\\n\\n/*\\nReturns true if the request is authenticated and assigns the \\\"authenticatedUsername\\\" state variable.\\nReturns false if the request couldn't be authenticated having sent an appropriate response to the browser\\n*/\\nBasicAuthenticator.prototype.authenticateRequest = function(request,response,state) {\\n\\t// Extract the incoming username and password from the request\\n\\tvar header = request.headers.authorization || \\\"\\\";\\n\\tif(!header && state.allowAnon) {\\n\\t\\t// If there's no header and anonymous access is allowed then we don't set authenticatedUsername\\n\\t\\treturn true;\\n\\t}\\n\\tvar token = header.split(/\\\\s+/).pop() || \\\"\\\",\\n\\t\\tauth = $tw.utils.base64Decode(token),\\n\\t\\tparts = auth.split(/:/),\\n\\t\\tincomingUsername = parts[0],\\n\\t\\tincomingPassword = parts[1];\\n\\t// Check that at least one of the credentials matches\\n\\tvar matchingCredentials = this.credentialsData.find(function(credential) {\\n\\t\\treturn credential.username === incomingUsername && credential.password === incomingPassword;\\n\\t});\\n\\tif(matchingCredentials) {\\n\\t\\t// If so, add the authenticated username to the request state\\n\\t\\tstate.authenticatedUsername = incomingUsername;\\n\\t\\treturn true;\\n\\t} else {\\n\\t\\t// If not, return an authentication challenge\\n\\t\\tresponse.writeHead(401,\\\"Authentication required\\\",{\\n\\t\\t\\t\\\"WWW-Authenticate\\\": 'Basic realm=\\\"Please provide your username and password to login to ' + state.server.servername + '\\\"'\\n\\t\\t});\\n\\t\\tresponse.end();\\n\\t\\treturn false;\\n\\t}\\n};\\n\\nexports.AuthenticatorClass = BasicAuthenticator;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"authenticator\"},\"$:/core/modules/server/authenticators/header.js\":{\"title\":\"$:/core/modules/server/authenticators/header.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/server/authenticators/header.js\\ntype: application/javascript\\nmodule-type: authenticator\\n\\nAuthenticator for trusted header authentication\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nfunction HeaderAuthenticator(server) {\\n\\tthis.server = server;\\n\\tthis.header = server.get(\\\"authenticated-user-header\\\") ? server.get(\\\"authenticated-user-header\\\").toLowerCase() : undefined;\\n}\\n\\n/*\\nReturns true if the authenticator is active, false if it is inactive, or a string if there is an error\\n*/\\nHeaderAuthenticator.prototype.init = function() {\\n\\treturn !!this.header;\\n};
2731\\n\\n/*\\nReturns true if the request is authenticated and assigns the \\\"authenticatedUsername\\\" state variable.\\nReturns false if the request couldn't be authenticated having sent an appropriate response to the browser\\n*/\\nHeaderAuthenticator.prototype.authenticateRequest = function(request,response,state) {\\n\\t// Otherwise, authenticate as the username in the specified header\\n\\tvar username = request.headers[this.header];\\n\\tif(!username && !state.allowAnon) {\\n\\t\\tresponse.writeHead(401,\\\"Authorization header required to login to '\\\" + state.server.servername + \\\"'\\\");\\n\\t\\tresponse.end();\\n\\t\\treturn false;\\n\\t} else {\\n\\t\\t// authenticatedUsername will be undefined for anonymous users\\n\\t\\tstate.authenticatedUsername = $tw.utils.decodeURIComponentSafe(username);\\n\\t\\treturn true;\\n\\t}\\n};\\n\\nexports.AuthenticatorClass = HeaderAuthenticator;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"authenticator\"},\"$:/core/modules/server/routes/delete-tiddler.js\":{\"title\":\"$:/core/modules/server/routes/delete-tiddler.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/server/routes/delete-tiddler.js\\ntype: application/javascript\\nmodule-type: route\\n\\nDELETE /recipes/default/tiddlers/:title\\n\\n\\\\*/\\n(function() {\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.method = \\\"DELETE\\\";\\n\\nexports.path = /^\\\\/bags\\\\/default\\\\/tiddlers\\\\/(.+)$/;\\n\\nexports.handler = function(request,response,state) {\\n\\tvar title = $tw.utils.decodeURIComponentSafe(state.params[0]);\\n\\tstate.wiki.deleteTiddler(title);\\n\\tresponse.writeHead(204, \\\"OK\\\", {\\n\\t\\t\\\"Content-Type\\\": \\\"text/plain\\\"\\n\\t});\\n\\tresponse.end();\\n};\\n\\n}());\\n\",\"type\":\"application/javascript\",\"module-type\":\"route\"},\"$:/core/modules/server/routes/get-favicon.js\":{\"title\":\"$:/core/modules/server/routes/get-favicon.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/server/routes/get-favicon.js\\ntype: application/javascript\\nmodule-type: route\\n\\nGET /favicon.ico\\n\\n\\\\*/\\n(function() {\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.method = \\\"GET\\\";\\n\\nexports.path = /^\\\\/favicon.ico$/;\\n\\nexports.handler = function(request,response,state) {\\n\\tvar buffer = state.wiki.getTiddlerText(\\\"$:/favicon.ico\\\",\\\"\\\");\\n\\tstate.sendResponse(200,{\\\"Content-Type\\\": \\\"image/x-icon\\\"},buffer,\\\"base64\\\");\\n};\\n\\n}());\\n\",\"type\":\"application/javascript\",\"module-type\":\"route\"},\"$:/core/modules/server/routes/get-file.js\":{\"title\":\"$:/core/modules/server/routes/get-file.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/server/routes/get-file.js\\ntype: application/javascript\\nmodule-type: route\\n\\nGET /files/:filepath\\n\\n\\\\*/\\n(function() {\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.method = \\\"GET\\\";\\n\\nexports.path = /^\\\\/files\\\\/(.+)$/;\\n\\nexports.handler = function(request,response,state) {\\n\\tvar path = require(\\\"path\\\"),\\n\\t\\tfs = require(\\\"fs\\\"),\\n\\t\\tutil = require(\\\"util\\\"),\\n\\t\\tsuppliedFilename = $tw.utils.decodeURIComponentSafe(state.params[0]),\\n\\t\\tbaseFilename = path.resolve(state.boot.wikiPath,\\\"files\\\"),\\n\\t\\tfilename = path.resolve(baseFilename,suppliedFilename),\\n\\t\\textension = path.extname(filename);\\n\\t// Check that the filename is inside the wiki files folder\\n\\tif(path.relative(baseFilename,filename).indexOf(\\\"..\\\") !== 0) {\\n\\t\\t// Send the file\\n\\t\\tfs.readFile(filename,function(err,content) {\\n\\t\\t\\tvar status,content,type = \\\"text/plain\\\";\\n\\t\\t\\tif(err) {\\n\\t\\t\\t\\tconsole.log(\\\"Error accessing file \\\" + filename + \\\": \\\" + err.toString());\\n\\t\\t\\t\\tstatus = 404;\\n\\t\\t\\t\\tcontent = \\\"File '\\\" + suppliedFilename + \\\"' not found\\\";\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tstatus = 200;\\n\\t\\t\\t\\tcontent = content;\\n\\t\\t\\t\\ttype = ($tw.config.fileExtensionInfo[extension] ? $tw.config.fileExtensionInfo[extension].type : \\\"application/octet-stream\\\");\\n\\t\\t\\t}\\n\\t\\t\\tstate.sendResponse(status,{\\\"Content-Type\\\": type},content);\\n\\t\\t});\\n\\t}
2731 else {\\n\\t\\tstate.sendResponse(404,{\\\"Content-Type\\\": \\\"text/plain\\\"},\\\"File '\\\" + suppliedFilename + \\\"' not found\\\");\\n\\t}\\n};\\n\\n}());\\n\",\"type\":\"application/javascript\",\"module-type\":\"route\"},\"$:/core/modules/server/routes/get-index.js\":{\"title\":\"$:/core/modules/server/routes/get-index.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/server/routes/get-index.js\\ntype: application/javascript\\nmodule-type: route\\n\\nGET /\\n\\n\\\\*/\\n(function() {\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.method = \\\"GET\\\";\\n\\nexports.path = /^\\\\/$/;\\n\\nexports.handler = function(request,response,state) {\\n\\tvar text = state.wiki.renderTiddler(state.server.get(\\\"root-render-type\\\"),state.server.get(\\\"root-tiddler\\\")),\\n\\t\\tresponseHeaders = {\\n\\t\\t\\\"Content-Type\\\": state.server.get(\\\"root-serve-type\\\")\\n\\t};\\n\\tstate.sendResponse(200,responseHeaders,text);\\n};\\n\\n}());\\n\",\"type\":\"application/javascript\",\"module-type\":\"route\"},\"$:/core/modules/server/routes/get-login-basic.js\":{\"title\":\"$:/core/modules/server/routes/get-login-basic.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/server/routes/get-login-basic.js\\ntype: application/javascript\\nmodule-type: route\\n\\nGET /login-basic -- force a Basic Authentication challenge\\n\\n\\\\*/\\n(function() {\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.method = \\\"GET\\\";\\n\\nexports.path = /^\\\\/login-basic$/;\\n\\nexports.handler = function(request,response,state) {\\n\\tif(!state.authenticatedUsername) {\\n\\t\\t// Challenge if there's no username\\n\\t\\tresponse.writeHead(401,{\\n\\t\\t\\t\\\"WWW-Authenticate\\\": 'Basic realm=\\\"Please provide your username and password to login to ' + state.server.servername + '\\\"'\\n\\t\\t});\\n\\t\\tresponse.end();\\n\\t} else {\\n\\t\\t// Redirect to the root wiki if login worked\\n\\t\\tvar location = ($tw.syncadaptor && $tw.syncadaptor.host)? $tw.syncadaptor.host: \\\"/\\\";\\n\\t\\tresponse.writeHead(302,{\\n\\t\\t\\tLocation: location\\n\\t\\t});\\n\\t\\tresponse.end();\\n\\t}\\n};\\n\\n}());\\n\",\"type\":\"application/javascript\",\"module-type\":\"route\"},\"$:/core/modules/server/routes/get-status.js\":{\"title\":\"$:/core/modules/server/routes/get-status.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/server/routes/get-status.js\\ntype: application/javascript\\nmodule-type: route\\n\\nGET /status\\n\\n\\\\*/\\n(function() {\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.method = \\\"GET\\\";\\n\\nexports.path = /^\\\\/status$/;\\n\\nexports.handler = function(request,response,state) {\\n\\tvar text = JSON.stringify({\\n\\t\\tusername: state.authenticatedUsername || state.server.get(\\\"anon-username\\\") || \\\"\\\",\\n\\t\\tanonymous: !state.authenticatedUsername,\\n\\t\\tread_only: !state.server.isAuthorized(\\\"writers\\\",state.authenticatedUsername),\\n\\t\\tlogout_is_available: false,\\n\\t\\t
2731space: {\\n\\t\\t\\trecipe: \\\"default\\\"\\n\\t\\t},\\n\\t\\ttiddlywiki_version: $tw.version\\n\\t});\\n\\tstate.sendResponse(200,{\\\"Content-Type\\\": \\\"application/json\\\"},text,\\\"utf8\\\");\\n};\\n\\n}());\\n\",\"type\":\"application/javascript\",\"module-type\":\"route\"},\"$:/core/modules/server/routes/get-tiddler-html.js\":{\"title\":\"$:/core/modules/server/routes/get-tiddler-html.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/server/routes/get-tiddler-html.js\\ntype: application/javascript\\nmodule-type: route\\n\\nGET /:title\\n\\n\\\\*/\\n(function() {\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.method = \\\"GET\\\";\\n\\nexports.path = /^\\\\/([^\\\\/]+)$/;\\n\\nexports.handler = function(request,response,state) {\\n\\tvar title = $tw.utils.decodeURIComponentSafe(state.params[0]),\\n\\t\\ttiddler = state.wiki.getTiddler(title);\\n\\tif(tiddler) {\\n\\t\\tvar renderType = tiddler.getFieldString(\\\"_render_type\\\"),\\n\\t\\t\\trenderTemplate = tiddler.getFieldString(\\\"_render_template\\\");\\n\\t\\t// Tiddler fields '_render_type' and '_render_template' overwrite\\n\\t\\t// system wide settings for render type and template\\n\\t\\tif(state.wiki.isSystemTiddler(title)) {\\n\\t\\t\\trenderType = renderType || state.server.get(\\\"system-tiddler-render-type\\\");\\n\\t\\t\\trenderTemplate = renderTemplate || state.server.get(\\\"system-tiddler-render-template\\\");\\n\\t\\t} else {\\n\\t\\t\\trenderType = renderType || state.server.get(\\\"tiddler-render-type\\\");\\n\\t\\t\\trenderTemplate = renderTemplate || state.server.get(\\\"tiddler-render-template\\\");\\n\\t\\t}\\n\\t\\tvar text = state.wiki.renderTiddler(renderType,renderTemplate,{parseAsInline: true, variables: {currentTiddler: title}});\\n\\n\\t\\t// Naughty not to set a content-type, but it's the easiest way to ensure the browser will see HTML pages as HTML, and accept plain text tiddlers as CSS or JS\\n\\t\\tstate.sendResponse(200,{},text,\\\"utf8\\\");\\n\\t} else {\\n\\t\\tresponse.writeHead(404);\\n\\t\\tresponse.end();\\n\\t}\\n};\\n\\n}());\\n\",\"type\":\"application/javascript\",\"module-type\":\"route\"},\"$:/core/modules/server/routes/get-tiddler.js\":{\"title\":\"$:/core/modules/server/routes/get-tiddler.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/server/routes/get-tiddler.js\\ntype: application/javascript\\nmodule-type: route\\n\\nGET /recipes/default/tiddlers/:title\\n\\n\\\\*/\\n(function() {\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.method = \\\"GET\\\";\\n\\nexports.path = /^\\\\/recipes\\\\/default\\\\/tiddlers\\\\/(.+)$/;\\n\\nexports.handler = function(request,response,state) {\\n\\tvar title = $tw.utils.decodeURIComponentSafe(state.params[0]),\\n\\t\\ttiddler = state.wiki.getTiddler(title),\\n\\t\\ttiddlerFields = {},\\n\\t\\tknownFields = [\\n\\t\\t\\t\\\"bag\\\", \\\"created\\\", \\\"creator\\\", \\\"modified\\\", \\\"modifier\\\", \\\"permissions\\\", \\\"recipe\\\", \\\"revision\\\", \\\"tags\\\", \\\"text\\\", \\\"title\\\", \\\"type\\\", \\\"uri\\\"\\n\\t\\t];\\n\\tif(tiddler) {\\n\\t\\t$tw.utils.each(tiddler.fields,function(field,name) {\\n\\t\\t\\tvar value = tiddler.getFieldString(name);\\n\\t\\t\\tif(knownFields.indexOf(name) !== -1) {\\n\\t\\t\\t\\ttiddlerFields[name] = value;\\n\\t\\t\\t} else {\\n\\t\\t\\t\\ttiddlerFields.fields = tiddlerFields.fields || {};\\n\\t\\t\\t\\ttiddlerFields.fields[name] = value;\\n\\t\\t\\t}\\n\\t\\t});\\n\\t\\ttiddlerFields.revision = state.wiki.getChangeCount(title);\\n\\t\\ttiddlerFields.bag = \\\"default\\\";\\n\\t\\ttiddlerFields.type = tiddlerFields.type || \\\"text/vnd.tiddlywiki\\\";\\n\\t\\tstate.sendResponse(200,{\\\"Content-Type\\\": \\\"application/json\\\"},JSON.stringify(tiddlerFields),\\\"utf8\\\");\\n\\t} else {\\n\\t\\tresponse.writeHead(404);\\n\\t\\tresponse.end();\\n\\t}\\n};\\n\\n}());\\n\",\"type\":\"application/javascript\",\"module-type\":\"route\"},\"$:/core/modules/server/routes/get-tiddlers-json.js\":{\"title\":\"$:/core/modules/server/routes/get-tiddlers-json.js\",\"text\":\"/*\\\\\\ntitle: $
2731:/core/modules/server/routes/get-tiddlers-json.js\\ntype: application/javascript\\nmodule-type: route\\n\\nGET /recipes/default/tiddlers.json?filter=\u003Cfilter>\\n\\n\\\\*/\\n(function() {\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar DEFAULT_FILTER = \\\"[all[tiddlers]!is[system]sort[title]]\\\";\\n\\nexports.method = \\\"GET\\\";\\n\\nexports.path = /^\\\\/recipes\\\\/default\\\\/tiddlers.json$/;\\n\\nexports.handler = function(request,response,state) {\\n\\tvar filter = state.queryParameters.filter || DEFAULT_FILTER;\\n\\tif(state.wiki.getTiddlerText(\\\"$:/config/Server/AllowAllExternalFilters\\\") !== \\\"yes\\\") {\\n\\t\\tif(state.wiki.getTiddlerText(\\\"$:/config/Server/ExternalFilters/\\\" + filter) !== \\\"yes\\\") {\\n\\t\\t\\tconsole.log(\\\"Blocked attempt to GET /recipes/default/tiddlers.json with filter: \\\" + filter);\\n\\t\\t\\tresponse.writeHead(403);\\n\\t\\t\\tresponse.end();\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\t}\\n\\tif(state.wiki.getTiddlerText(\\\"$:/config/SyncSystemTiddlersFromServer\\\") === \\\"no\\\") {\\n\\t\\tfilter += \\\"+[!is[system]]\\\";\\n\\t}\\n\\tvar excludeFields = (state.queryParameters.exclude || \\\"text\\\").split(\\\",\\\"),\\n\\t\\ttitles = state.wiki.filterTiddlers(filter);\\n\\tvar tiddlers = [];\\n\\t$tw.utils.each(titles,function(title) {\\n\\t\\tvar tiddler = state.wiki.getTiddler(title);\\n\\t\\tif(tiddler) {\\n\\t\\t\\tvar tiddlerFields = tiddler.getFieldStrings({exclude: excludeFields});\\n\\t\\t\\ttiddlerFields.revision = state.wiki.getChangeCount(title);\\n\\t\\t\\ttiddlerFields.type = tiddlerFields.type || \\\"text/vnd.tiddlywiki\\\";\\n\\t\\t\\ttiddlers.push(tiddlerFields);\\n\\t\\t}\\n\\t});\\n\\tvar text = JSON.stringify(tiddlers);\\n\\tstate.sendResponse(200,{\\\"Content-Type\\\": \\\"application/json\\\"},text,\\\"utf8\\\");\\n};\\n\\n}());\\n\",\"type\":\"application/javascript\",\"module-type\":\"route\"},\"$:/core/modules/server/routes/put-tiddler.js\":{\"title\":\"$:/core/modules/server/routes/put-tiddler.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/server/routes/put-tiddler.js\\ntype: application/javascript\\nmodule-type: route\\n\\nPUT /recipes/default/tiddlers/:title\\n\\n\\\\*/\\n(function() {\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.method = \\\"PUT\\\";\\n\\nexports.path = /^\\\\/recipes\\\\/default\\\\/tiddlers\\\\/(.+)$/;\\n\\nexports.handler = function(request,response,state) {\\n\\tvar title = $tw.utils.decodeURIComponentSafe(state.params[0]),\\n\\tfields = $tw.utils.parseJSONSafe(state.data);\\n\\t// Pull up any subfields in the `fields` object\\n\\tif(fields.fields) {\\n\\t\\t$tw.utils.each(fields.fields,function(field,name) {\\n\\t\\t\\tfields[name] = field;\\n\\t\\t});\\n\\t\\tdelete fields.fields;\\n\\t}\\n\\t// Remove any revision field\\n\\tif(fields.revision) {\\n\\t\\tdelete fields.revision;\\n\\t}\\n\\t// If this is a skinny tiddler, it means the client never got the full\\n\\t// version of the tiddler to edit. So we must preserve whatever text\\n\\t// already exists on the server, or else we'll inadvertently delete it.\\n\\tif(fields._is_skinny !== undefined) {\\n\\t\\tvar tiddler = state.wiki.getTiddler(title);\\n\\t\\tif(tiddler) {\\n\\t\\t\\tfields.text = tiddler.fields.text;\\n\\t\\t}\\n\\t\\tdelete fields._is_skinny;\\n\\t}\\n\\tstate.wiki.addTiddler(new $tw.Tiddler(fields,{title: title}));\\n\\tvar changeCount = state.wiki.getChangeCount(title).toString();\\n\\tresponse.writeHead(204, \\\"OK\\\",{\\n\\t\\tEtag: \\\"\\\\\\\"default/\\\" + encodeURIComponent(title) + \\\"/\\\" + changeCount + \\\":\\\\\\\"\\\",\\n\\t\\t\\\"Content-Type\\\": \\\"text/plain\\\"\\n\\t});\\n\\tresponse.end();\\n};\\n\\n}());\\n\",\"type\":\"application/javascript\",\"module-type\":\"route\"},\"$:/core/modules/server/server.js\":{\"title\":\"$:/core/modules/server/server.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/server/server.js\\ntype: application/javascript\\nmodule-type: library\\n\\nServe tiddlers over http\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nif($tw.node) {\\n\\tvar util = require(\\\"util\\\"),\\n\\t\\tfs = require(\\\"fs\\\"),\\n\\t\\turl = require(\\\"url\\\"),\\n\\t\\tpath = require(\\\"path\\\"),\\n\\t\\tquerystring = require(\\\"querystring\\\"),\\n\\t\\tcrypto = require(\\\"crypto\\\"),\\n\\t\\tzlib = require(\\\"zlib\\\");\\n}\\n\\n/*\\nA simple HTTP server with regexp-based routes\\noptions: variables - optional hashmap of variables to set (a misnomer - they are really constant parameters)\\n\\t\\t routes - optional array of routes to use\\n\\t\\t wiki - reference to wiki object\\n*/\\nfunction Server(options) {\\n\\tvar self = this;\\n\\tthis.routes = options.routes || [];\\n\\tthis.authenticators = options.authenticators || [];\\n\\tthis.wiki = options.wiki;\\n\\tthis.boot = options.boot || $tw.boot;\\n\\t// Initialise the variables\\n\\tthis.variables = $tw.utils.extend({},this.defaultVariables);\\n\\tif(options.variables) {\\n\\t\\tfor(var variable in options.variables) {\\n\\t\\t\\tif(options.variables[variable]) {\\n\\t\\t\\t\\tthis.variables[variable] = options.variables[variable];\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\t// Setup the default required plugins\\n\\tthis.requiredPlugins = this.get(\\\"required-plugins\\\").split(',');\\n\\t// Initialise CSRF\\n\\tthis.csrfDisable = this.get(\\\"csrf-disable\\\") === \\\"yes\\\";\\n\\t// Initialize Gzip compression\\n\\tthis.enableGzip = this.get(\\\"gzip\\\") === \\\"yes\\\";\\n\\t// Initialize browser-caching\\n\\tthis.enableBrowserCache = this.get(\\\"use-browser-cache\\\") === \\\"yes\\\";\\n\\t// Initialise authorization\\n\\tvar authorizedUserName;\\n\\tif(this.get(\\\"username\\\") && this.get(\\\"password\\\")) {\\n\\t\\tauthorizedUserName = this.get(\\\"username\\\");\\n\\t} else if(this.get(\\\"credentials\\\")) {\\n\\t\\tauthorizedUserName = \\\"(authenticated)\\\";\\n\\t} else {\\n\\t\\tauthorizedUserName = \\\"(anon)\\\";\\n\\t}\\n\\tthis.authorizationPrincipals = {\\n\\t\\treaders: (this.get(\\\"readers\\\") || authorizedUserName).split(\\\",\\\").map($tw.utils.trim),\\n\\t\\twriters: (this.get(\\\"writers\\\") || authorizedUserName).split(\\\",\\\").map($tw.utils.trim)\\n\\t}\\n\\tif(this.get(\\\"admin\\\") || authorizedUserName !== \\\"(anon)\\\") {\\n\\t\\tthis.authorizationPrincipals[\\\"admin\\\"] = (this.get(\\\"admin\\\") || authorizedUserName).split(',').map($tw.utils.trim)\\n\\t}\\n\\t// Load and initialise authenticators\\n\\t$tw.modules.forEac
2731hModuleOfType(\\\"authenticator\\\", function(title,authenticatorDefinition) {\\n\\t\\t// console.log(\\\"Loading authenticator \\\" + title);\\n\\t\\tself.addAuthenticator(authenticatorDefinition.AuthenticatorClass);\\n\\t});\\n\\t// Load route handlers\\n\\t$tw.modules.forEachModuleOfType(\\\"route\\\", function(title,routeDefinition) {\\n\\t\\t// console.log(\\\"Loading server route \\\" + title);\\n\\t\\tself.addRoute(routeDefinition);\\n\\t});\\n\\t// Initialise the http vs https\\n\\tthis.listenOptions = null;\\n\\tthis.protocol = \\\"http\\\";\\n\\tvar tlsKeyFilepath = this.get(\\\"tls-key\\\"),\\n\\t\\ttlsCertFilepath = this.get(\\\"tls-cert\\\"),\\n\\t\\ttlsPassphrase = this.get(\\\"tls-passphrase\\\");\\n\\tif(tlsCertFilepath && tlsKeyFilepath) {\\n\\t\\tthis.listenOptions = {\\n\\t\\t\\tkey: fs.readFileSync(path.resolve(this.boot.wikiPath,tlsKeyFilepath),\\\"utf8\\\"),\\n\\t\\t\\tcert: fs.readFileSync(path.resolve(this.boot.wikiPath,tlsCertFilepath),\\\"utf8\\\"),\\n\\t\\t\\tpassphrase: tlsPassphrase || ''\\n\\t\\t};\\n\\t\\tthis.protocol = \\\"https\\\";\\n\\t}\\n\\tthis.transport = require(this.protocol);\\n\\t// Name the server and init the boot state\\n\\tthis.servername = $tw.utils.transliterateToSafeASCII(this.get(\\\"server-name\\\") || this.wiki.getTiddlerText(\\\"$:/SiteTitle\\\") || \\\"TiddlyWiki5\\\");\\n\\tthis.boot.origin = this.get(\\\"origin\\\")? this.get(\\\"origin\\\"): this.protocol+\\\"://\\\"+this.get(\\\"host\\\")+\\\":\\\"+this.get(\\\"port\\\");\\n\\tthis.boot.pathPrefix = this.get(\\\"path-prefix\\\") || \\\"\\\";\\n}\\n\\n/*\\nSend a response to the client. This method checks if the response must be sent\\nor if the client alrady has the data cached. If that's the case only a 304\\nresponse will be transmitted and the browser will use the cached data.\\nOnly requests with status code 200 are considdered for caching.\\nrequest: request instance passed to the handler\\nresponse: response instance passed to the handler\\nstatusCode: stauts code to send to the browser\\nheaders: response headers (they will be augmented with an `Etag` header)\\ndata: the data to send (passed to the end method of the response instance)\\nencoding: the encoding of the data to send (passed to the end method of the response instance)\\n*/\\nfunction sendResponse(request,response,statusCode,headers,data,encoding) {\\n\\tif(this.enableBrowserCache && (statusCode == 200)) {\\n\\t\\tvar hash = crypto.createHash('md5');\\n\\t\\t// Put everything into the hash that could change and invalidate the data that\\n\\t\\t// the browser already stored. The headers the data and the encoding.\\n\\t\\thash.update(data);\\n\\t\\thash.update(JSON.stringify(headers));\\n\\t\\tif(encoding) {\\n\\t\\t\\thash.update(encoding);\\n\\t\\t}\\n\\t\\tvar contentDigest = hash.digest(\\\"hex\\\");\\n\\t\\t// RFC 7232 section 2.3 mandates for the etag to be enclosed in quotes\\n\\t\\theaders[\\\"Etag\\\"] = '\\\"' + contentDigest + '\\\"';\\n\\t\\theaders[\\\"Cache-Control\\\"] = \\\"max-age=0, must-revalidate\\\";\\n\\t\\t// Check if any of the hashes contained within the if-none-match header\\n\\t\\t// matches the current hash.\\n\\t\\t// If one matches, do not send the data but tell the browser to use the\\n\\t\\t// cached data.\\n\\t\\t// We do not implement \\\"*\\\" as it makes no sense here.\\n\\t\\tvar ifNoneMatch = request.headers[\\\"if-none-match\\\"];\\n\\t\\tif(ifNoneMatch) {\\n\\t\\t\\tvar matchParts = ifNoneMatch.split(\\\",\\\").map(function(etag) {\\n\\t\\t\\t\\treturn etag.replace(/^[ \\\"]+|[ \\\"]+$/g, \\\"\\\");\\n\\t\\t\\t});\\n\\t\\t\\tif(matchParts.indexOf(contentDigest) != -1) {\\n\\t\\t\\t\\tresponse.writeHead(304,headers);\\n\\t\\t\\t\\tresponse.end();\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\t/*\\n\\tIf the gzip=yes is set, check if the user agent permits compression. If so,\\n\\tcompress our response if the raw data is bigger than 2k. Compressing less\\n\\tdata is inefficient. Note that we use the synchronous functions from zlib\\n\\tto stay in the imperative style. The current `Server` doesn't depend on\\n\\tthis, and we may just as well use the async versions.\\n\\t*/\\n\\tif(this.enableGzip && (data.length > 2048)) {\\n\\t\\tvar acceptEncoding = request.headers[\\\"accept-encoding\\\"] || \\\"\\\";\\n\\t\\tif(/\\\\bdeflate\\\\b/.test(acceptEncoding)) {\\n\\t\\t\\theaders[\\\"Content-Encoding\\\"] = \\\"deflate\\\";\\n\\t\\t\\tdata = zlib.deflateSync(data);\\n\\t\\t} else if(/\\\\bgzip\\\\b/.test(acceptEncoding)) {\\n\\t\\t\\theaders[\\\"Content-Encoding\\\"] = \\\"gzip\\\";\\n\\t\\t\\tdata = zlib.gzipSync(data);\\n\\t\\t}\\n\\t}\\n\\n\\tresponse.writeHead(statusCode,headers);\\n\\tresponse.end(data,encoding);\\n}\\n\\nServer.prototype.defaultVariables = {\\n\\tport: \\\"8080\\\",\\n\\thost: \\\"127.0.0.1\\\",\\n\\t\\\"required-plugins\\\": \\\"$:/plugins/tiddlywiki/filesystem,$:/plugins/tiddlywiki/tiddlyweb\\\",\\n\\t\\\"root-tiddler\\\": \\\"$:/core/save/all\\\",\\n\\t\\\"root-render-type\\\": \\\"text/plain\\\",\\n\\t\\\"root-serve-type\\\": \\\"text/html\\\",\\n\\t\\\"t
2731iddler-render-type\\\": \\\"text/html\\\",\\n\\t\\\"tiddler-render-template\\\": \\\"$:/core/templates/server/static.tiddler.html\\\",\\n\\t\\\"system-tiddler-render-type\\\": \\\"text/plain\\\",\\n\\t\\\"system-tiddler-render-template\\\": \\\"$:/core/templates/wikified-tiddler\\\",\\n\\t\\\"debug-level\\\": \\\"none\\\",\\n\\t\\\"gzip\\\": \\\"no\\\",\\n\\t\\\"use-browser-cache\\\": \\\"no\\\"\\n};\\n\\nServer.prototype.get = function(name) {\\n\\treturn this.variables[name];\\n};\\n\\nServer.prototype.addRoute = function(route) {\\n\\tthis.routes.push(route);\\n};\\n\\nServer.prototype.addAuthenticator = function(AuthenticatorClass) {\\n\\t// Instantiate and initialise the authenticator\\n\\tvar authenticator = new AuthenticatorClass(this),\\n\\t\\tresult = authenticator.init();\\n\\tif(typeof result === \\\"string\\\") {\\n\\t\\t$tw.utils.error(\\\"Error: \\\" + result);\\n\\t} else if(result) {\\n\\t\\t// Only use the authenticator if it initialised successfully\\n\\t\\tthis.authenticators.push(authenticator);\\n\\t}\\n};\\n\\nServer.prototype.findMatchingRoute = function(request,state) {\\n\\tfor(var t=0; t\u003Cthis.routes.length; t++) {\\n\\t\\tvar potentialRoute = this.routes[t],\\n\\t\\t\\tpathRegExp = potentialRoute.path,\\n\\t\\t\\tpathname = state.urlInfo.pathname,\\n\\t\\t\\tmatch;\\n\\t\\tif(state.pathPrefix) {\\n\\t\\t\\tif(pathname.substr(0,state.pathPrefix.length) === state.pathPrefix) {\\n\\t\\t\\t\\tpathname = pathname.substr(state.pathPrefix.length) || \\\"/\\\";\\n\\t\\t\\t\\tmatch = potentialRoute.path.exec(pathname);\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tmatch = false;\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\t\\t\\tmatch = potentialRoute.path.exec(pathname);\\n\\t\\t}\\n\\t\\tif(match && request.method === potentialRoute.method) {\\n\\t\\t\\tstate.params = [];\\n\\t\\t\\tfor(var p=1; p\u003Cmatch.length; p++) {\\n\\t\\t\\t\\tstate.params.push(match[p]);\\n\\t\\t\\t}\\n\\t\\t\\treturn potentialRoute;\\n\\t\\t}\\n\\t}\\n\\treturn null;\\n};\\n\\nServer.prototype.methodMappings = {\\n\\t\\\"GET\\\": \\\"readers\\\",\\n\\t\\\"OPTIONS\\\": \\\"readers\\\",\\n\\t\\\"HEAD\\\": \\\"readers\\\",\\n\\t\\\"PUT\\\": \\\"writers\\\",\\n\\t\\\"POST\\\": \\\"writers\\\",\\n\\t\\\"DELETE\\\": \\\"writers\\\"\\n};\\n\\n/*\\nCheck whether a given user is authorized for the specified authorizationType (\\\"readers\\\" or \\\"writers\\\"). Pass null or undefined as the username to check for anonymous access\\n*/\\nServer.prototype.isAuthorized = function(authorizationType,username) {\\n\\tvar principals = this.authorizationPrincipals[authorizationType] || [];\\n\\treturn principals.indexOf(\\\"(anon)\\\") !== -1 || (username && (principals.indexOf(\\\"(authenticated)\\\") !== -1 || principals.indexOf(username) !== -1));\\n}\\n\\nServer.prototype.requestHandler = function(request,response,options) {\\n\\toptions = options || {};\\n\\t// Compose the state object\\n\\tvar self = this;\\n\\tvar state = {};\\n\\tstate.wiki = options.wiki || self.wiki;\\n\\tstate.boot = options.boot || self.boot;\\n\\tstate.server = self;\\n\\tstate.urlInfo = url.parse(request.url);\\n\\tstate.queryParameters = querystring.parse(state.urlInfo.query);\\n\\tstate.pathPrefix = options.pathPrefix || this.get(\\\"path-prefix\\\") || \\\"\\\";\\n\\tstate.sendResponse = sendResponse.bind(self,request,response);\\n\\t// Get the principals authorized to access this resource\\n\\tstate.authorizationType = options.authorizationType || this.methodMappings[request.method] || \\\"readers\\\";\\n\\t// Check for the CSRF header if this is a write\\n\\tif(!this.csrfDisable && state.authorizationType === \\\"writers\\\" && request.headers[\\\"x-requested-with\\\"] !== \\\"TiddlyWiki\\\") {\\n\\t\\tresponse.writeHead(403,\\\"'X-Requested-With' header required to login to '\\\" + this.servername + \\\"'\\\");\\n\\t\\tresponse.end();\\n\\t\\treturn;\\n\\t}\\n\\t// Check whether anonymous access is granted\\n\\tstate.allowAnon = this.isAuthorized(state.authorizationType,null);\\n\\t// Authenticate with the first active authenticator\\n\\tif(this.authenticators.length > 0) {\\n\\t\\tif(!this.authenticators[0].authenticateRequest(request,response,state)) {\\n\\t\\t\\t// Bail if we failed (the authenticator will have sent the response)\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\t}\\n\\t// Authorize with the authenticated username\\n\\tif(!this.isAuthorized(state.authorizationType,state.authenticatedUsername)) {\\n\\t\\tresponse.writeHead(401,\\\"'\\\" + state.authenticatedUsername + \\\"' is not authorized to access '\\\" + this.servername + \\\"'\\\");\\n\\t\\tresponse.end();\\n\\t\\treturn;\\n\\t}\\n\\t// Find the route that matches this path\\n\\tvar route = self.findMatchingRoute(request,state);\\n\\t// Optionally output debug info\\n\\tif(self.get(\\\"debug-level\\\") !== \\\"none\\\") {\\n\\t\\tconsole.log(\\\"Request path:\\\",JSON.stringify(state.urlInfo));\\n\\t\\tconsole.log(\\\"Request headers:\\\",JSON.stringify(request.headers));\\n\\t\\tconsole.log(\\\"authenticatedUsername:\\\",state.authenticatedUsername);\\n\\t}\\n\\t// Return a 404 if we didn't find a route\\n\\tif(!route) {\\n\\t\\tresponse.writeHead(404);\\n\\t\\tresponse.end();\\n\\t\\treturn;\\n\\t}\\n\\t// Receive the request body if necessary and hand off to the route handler\\n\\tif(route.bodyFormat === \\\"stream\\\" || request.method === \\\"GET\\\" || request.method === \\\"HEAD\\\") {\\n\\t\\t// Let the route handle the request stream itself\\n\\t\\troute.handler(request,response,state);\\n\\t} else if(route.bodyFormat === \\\"string\\\" || !route.bodyFormat) {\\n\\t\\t// Set the encoding for the incoming request\\n\\t\\trequest.setEncoding(\\\"utf8\\\");\\n\\t\\tvar data = \\\"\\\";\\n\\t\\trequest.on(\\\"data\\\",function(chunk) {\\n\\t\\t\\tdata += chunk.toString();\\n\\t\\t});\\n\\t\\trequest.on(\\\"end\\\",function() {\\n\\t\\t\\tstate.data = data;\\n\\t\\t\\troute.handler(request,response,state);\\n\\t\\t});\\n\\t} else if(route.bodyFormat === \\\"buffer\\\") {\\n\\t\\tvar data = [];\\n\\t\\trequest.on(\\\"data\\\",function(chunk) {\\n\\t\\t\\tdata.push(chunk);\\n\\t\\t});\\n\\t\\trequest.on(\\\"end\\\",function() {\\n\\t\\t\\tstate.data = Buffer.concat(data);\\n\\t\\t\\troute.handler(request,response,state);\\n\\t\\t})\\n\\t} else {\\n\\t\\tresponse.writeHead(400,\\\"Invalid bodyFormat \\\" + route.bodyFormat + \\\" in route \\\" + route.method + \\\" \\\" + route.path.source);\\n\\t\\tresponse.end();\\n\\t}\\n};
2731\\n\\n/*\\nListen for requests\\nport: optional port number (falls back to value of \\\"port\\\" variable)\\nhost: optional host address (falls back to value of \\\"host\\\" variable)\\nprefix: optional prefix (falls back to value of \\\"path-prefix\\\" variable)\\n*/\\nServer.prototype.listen = function(port,host,prefix) {\\n\\tvar self = this;\\n\\t// Handle defaults for port and host\\n\\tport = port || this.get(\\\"port\\\");\\n\\thost = host || this.get(\\\"host\\\");\\n\\tprefix = prefix || this.get(\\\"path-prefix\\\") || \\\"\\\";\\n\\t// Check for the port being a string and look it up as an environment variable\\n\\tif(parseInt(port,10).toString() !== port) {\\n\\t\\tport = process.env[port] || 8080;\\n\\t}\\n\\t// Warn if required plugins are missing\\n\\tvar missing = [];\\n\\tfor (var index=0; index\u003Cthis.requiredPlugins.length; index++) {\\n\\t\\tif (!this.wiki.getTiddler(this.requiredPlugins[index])) {\\n\\t\\t\\tmissing.push(this.requiredPlugins[index]);\\n\\t\\t}\\n\\t}\\n\\tif(missing.length > 0) {\\n\\t\\tvar error = \\\"Warning: Plugin(s) required for client-server operation are missing.\\\\n\\\"+\\n\\t\\t\\t\\\"\\\\\\\"\\\"+ missing.join(\\\"\\\\\\\", \\\\\\\"\\\")+\\\"\\\\\\\"\\\";\\n\\t\\t$tw.utils.warning(error);\\n\\t}\\n\\t// Create the server\\n\\tvar server;\\n\\tif(this.listenOptions) {\\n\\t\\tserver = this.transport.createServer(this.listenOptions,this.requestHandler.bind(this));\\n\\t} else {\\n\\t\\tserver = this.transport.createServer(this.requestHandler.bind(this));\\n\\t}\\n\\t// Display the port number after we've started listening (the port number might have been specified as zero, in which case we will get an assigned port)\\n\\tserver.on(\\\"listening\\\",function() {\\n\\t\\tvar address = server.address(),\\n\\t\\t\\turl = self.protocol + \\\"://\\\" + (address.family === \\\"IPv6\\\" ? \\\"[\\\" + address.address + \\\"]\\\" : address.address) + \\\":\\\" + address.port + prefix;\\n\\t\\t$tw.utils.log(\\\"Serving on \\\" + url,\\\"brown/orange\\\");\\n\\t\\t$tw.utils.log(\\\"(press ctrl-C to exit)\\\",\\\"red\\\");\\n\\t});\\n\\t// Listen\\n\\treturn server.listen(port,host);\\n};\\n\\nexports.Server = Server;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"library\"},\"$:/core/modules/browser-messaging.js\":{\"title\":\"$:/core/modules/browser-messaging.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/browser-messaging.js\\ntype: application/javascript\\nmodule-type: startup\\n\\nBrowser message handling\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n// Export name and synchronous status\\nexports.name = \\\"browser-messaging\\\";\\nexports.platforms = [\\\"browser\\\"];\\nexports.after = [\\\"startup\\\"];\\nexports.synchronous = true;\\n\\n/*\\nLoad a specified url as an iframe and call the callback when it is loaded. If the url is already loaded then the existing iframe instance is used\\n*/\\nfunction loadIFrame(url,callback) {\\n\\t// Check if iframe already exists\\n\\tvar iframeInfo = $tw.browserMessaging.iframeInfoMap[url];\\n\\tif(iframeInfo) {\\n\\t\\t// We've already got the iframe\\n\\t\\tcallback(null,iframeInfo);\\n\\t} else {\\n\\t\\t// Create the iframe and save it in the list\\n\\t\\tvar iframe = document.createElement(\\\"iframe\\\");\\n\\t\\tiframeInfo = {\\n\\t\\t\\turl: url,\\n\\t\\t\\tstatus: \\\"loading\\\",\\n\\t\\t\\tdomNode: iframe\\n\\t\\t};\\n\\t\\t$tw.browserMessaging.iframeInfoMap[url] = iframeInfo;\\n\\t\\tsaveIFrameInfoTiddler(iframeInfo);\\n\\t\\t// Add the iframe to the DOM and hide it\\n\\t\\tiframe.style.display = \\\"none\\\";\\n\\t\\tiframe.setAttribute(\\\"library\\\",\\\"true\\\");\\n\\t\\tdocument.body.appendChild(iframe);\\n\\t\\t// Set up onload\\n\\t\\tiframe.onload = function() {\\n\\t\\t\\tiframeInfo.status = \\\"loaded\\\";\\n\\t\\t\\tsaveIFrameInfoTiddler(iframeInfo);\\n\\t\\t\\tcallback(null,iframeInfo);\\n\\t\\t};\\n\\t\\tiframe.onerror = function() {\\n\\t\\t\\tcallback(\\\"Cannot load iframe\\\");\\n\\t\\t};
2731\\n\\t\\ttry {\\n\\t\\t\\tiframe.src = url;\\n\\t\\t} catch(ex) {\\n\\t\\t\\tcallback(ex);\\n\\t\\t}\\n\\t}\\n}\\n\\n/*\\nUnload library iframe for given url\\n*/\\nfunction unloadIFrame(url){\\n\\tvar iframes = document.getElementsByTagName('iframe');\\n\\tfor(var t=iframes.length-1; t--; t>=0) {\\n\\t\\tvar iframe = iframes[t];\\n\\t\\tif(iframe.getAttribute(\\\"library\\\") === \\\"true\\\" &&\\n\\t\\t  iframe.getAttribute(\\\"src\\\") === url) {\\n\\t\\t\\tiframe.parentNode.removeChild(iframe);\\n\\t\\t}\\n\\t}\\n}\\n\\nfunction saveIFrameInfoTiddler(iframeInfo) {\\n\\t$tw.wiki.addTiddler(new $tw.Tiddler($tw.wiki.getCreationFields(),{\\n\\t\\ttitle: \\\"$:/temp/ServerConnection/\\\" + iframeInfo.url,\\n\\t\\ttext: iframeInfo.status,\\n\\t\\ttags: [\\\"$:/tags/ServerConnection\\\"],\\n\\t\\turl: iframeInfo.url\\n\\t},$tw.wiki.getModificationFields()));\\n}\\n\\nexports.startup = function() {\\n\\t// Initialise the store of iframes we've created\\n\\t$tw.browserMessaging = {\\n\\t\\tiframeInfoMap: {} // Hashmap by URL of {url:,status:\\\"loading/loaded\\\",domNode:}\\n\\t};\\n\\t// Listen for widget messages to control loading the plugin library\\n\\t$tw.rootWidget.addEventListener(\\\"tm-load-plugin-library\\\",function(event) {\\n\\t\\tvar paramObject = event.paramObject || {},\\n\\t\\t\\turl = paramObject.url;\\n\\t\\tif(url) {\\n\\t\\t\\tloadIFrame(url,function(err,iframeInfo) {\\n\\t\\t\\t\\tif(err) {\\n\\t\\t\\t\\t\\talert($tw.language.getString(\\\"Error/LoadingPluginLibrary\\\") + \\\": \\\" + url);\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tiframeInfo.domNode.contentWindow.postMessage({\\n\\t\\t\\t\\t\\t\\tverb: \\\"GET\\\",\\n\\t\\t\\t\\t\\t\\turl: \\\"recipes/library/tiddlers.json\\\",\\n\\t\\t\\t\\t\\t\\tcookies: {\\n\\t\\t\\t\\t\\t\\t\\ttype: \\\"save-info\\\",\\n\\t\\t\\t\\t\\t\\t\\tinfoTitlePrefix: paramObject.infoTitlePrefix || \\\"$:/temp/RemoteAssetInfo/\\\",\\n\\t\\t\\t\\t\\t\\t\\turl: url\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t},\\\"*\\\");\\n\\t\\t\\t\\t}\\n\\t\\t\\t});\\n\\t\\t}\\n\\t});\\n\\t// Listen for widget messages to control unloading the plugin library\\n\\t$tw.rootWidget.addEventListener(\\\"tm-unload-plugin-library\\\",function(event) {\\n\\t\\tvar paramObject = event.paramObject || {},\\n\\t\\t\\turl = paramObject.url;\\n\\t\\t$tw.browserMessaging.iframeInfoMap[url] = undefined;\\n\\t\\tif(url) {\\n\\t\\t\\tunloadIFrame(url);\\n\\t\\t\\t$tw.utils.each(\\n\\t\\t\\t\\t$tw.wiki.filterTiddlers(\\\"[[$:/temp/ServerConnection/\\\" + url + \\\"]] [prefix[$:/temp/RemoteAssetInfo/\\\" + url + \\\"/]]\\\"),\\n\\t\\t\\t\\tfunction(title) {\\n\\t\\t\\t\\t\\t$tw.wiki.deleteTiddler(title);\\n\\t\\t\\t\\t}\\n\\t\\t\\t);\\n\\t\\t}\\n\\t});\\n\\t$tw.rootWidget.addEventListener(\\\"tm-load-plugin-from-library\\\",function(event) {\\n\\t\\tvar paramObject = event.paramObject || {},\\n\\t\\t\\turl = paramObject.url,\\n\\t\\t\\ttitle = paramObject.title;\\n\\t\\tif(url && title) {\\n\\t\\t\\tloadIFrame(url,function(err,iframeInfo) {\\n\\t\\t\\t\\tif(err) {\\n\\t\\t\\t\\t\\talert($tw.language.getString(\\\"Error/LoadingPluginLibrary\\\") + \\\": \\\" + url);\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tiframeInfo.domNode.contentWindow.postMessage({\\n\\t\\t\\t\\t\\t\\tverb: \\\"GET\\\",\\n\\t\\t\\t\\t\\t\\turl: \\\"recipes/library/tiddlers/\\\" + encodeURIComponent(title) + \\\".json\\\",\\n\\t\\t\\t\\t\\t\\tcookies: {\\n\\t\\t\\t\\t\\t\\t\\ttype: \\\"save-tiddler\\\",\\n\\t\\t\\t\\t\\t\\t\\turl: url\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t},\\\"*\\\");\\n\\t\\t\\t\\t}\\n\\t\\t\\t});\\n\\t\\t}\\n\\t});\\n\\t// Listen for window messages from other windows\\n\\twindow.addEventListener(\\\"message\\\",function listener(event){\\n\\t\\t// console.log(\\\"browser-messaging: \\\",document.location.toString())\\n\\t\\t// console.log(\\\"browser-messaging: Received message from\\\",event.origin);\\n\\t\\t// console.log(\\\"browser-messaging: Message content\\\",event.data);
2731\\n\\t\\tswitch(event.data.verb) {\\n\\t\\t\\tcase \\\"GET-RESPONSE\\\":\\n\\t\\t\\t\\tif(event.data.status.charAt(0) === \\\"2\\\") {\\n\\t\\t\\t\\t\\tif(event.data.cookies) {\\n\\t\\t\\t\\t\\t\\tif(event.data.cookies.type === \\\"save-info\\\") {\\n\\t\\t\\t\\t\\t\\t\\tvar tiddlers = $tw.utils.parseJSONSafe(event.data.body);\\n\\t\\t\\t\\t\\t\\t\\t$tw.utils.each(tiddlers,function(tiddler) {\\n\\t\\t\\t\\t\\t\\t\\t\\t$tw.wiki.addTiddler(new $tw.Tiddler($tw.wiki.getCreationFields(),tiddler,{\\n\\t\\t\\t\\t\\t\\t\\t\\t\\ttitle: event.data.cookies.infoTitlePrefix + event.data.cookies.url + \\\"/\\\" + tiddler.title,\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\\"original-title\\\": tiddler.title,\\n\\t\\t\\t\\t\\t\\t\\t\\t\\ttext: \\\"\\\",\\n\\t\\t\\t\\t\\t\\t\\t\\t\\ttype: \\\"text/vnd.tiddlywiki\\\",\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\\"original-type\\\": tiddler.type,\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\\"plugin-type\\\": undefined,\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\\"original-plugin-type\\\": tiddler[\\\"plugin-type\\\"],\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\\"module-type\\\": undefined,\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\\"original-module-type\\\": tiddler[\\\"module-type\\\"],\\n\\t\\t\\t\\t\\t\\t\\t\\t\\ttags: [\\\"$:/tags/RemoteAssetInfo\\\"],\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\\"original-tags\\\": $tw.utils.stringifyList(tiddler.tags || []),\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\\"server-url\\\": event.data.cookies.url\\n\\t\\t\\t\\t\\t\\t\\t\\t},$tw.wiki.getModificationFields()));\\n\\t\\t\\t\\t\\t\\t\\t});\\n\\t\\t\\t\\t\\t\\t} else if(event.data.cookies.type === \\\"save-tiddler\\\") {\\n\\t\\t\\t\\t\\t\\t\\tvar tiddler = $tw.utils.parseJSONSafe(event.data.body);\\n\\t\\t\\t\\t\\t\\t\\t$tw.wiki.addTiddler(new $tw.Tiddler(tiddler));\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tbreak;\\n\\t\\t}\\n\\t},false);\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"startup\"},\"$:/core/modules/startup/commands.js\":{\"title\":\"$:/core/modules/startup/commands.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/startup/commands.js\\ntype: application/javascript\\nmodule-type: startup\\n\\nCommand processing\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n// Export name and synchronous status\\nexports.name = \\\"commands\\\";\\nexports.platforms = [\\\"node\\\"];\\nexports.after = [\\\"story\\\"];\\nexports.synchronous = false;\\n\\nexports.startup = function(callback) {\\n\\t// On the server, start a commander with the command line arguments\\n\\tvar commander = new $tw.Commander(\\n\\t\\t$tw.boot.argv,\\n\\t\\tfunction(err) {\\n\\t\\t\\tif(err) {\\n\\t\\t\\t\\treturn $tw.utils.error(\\\"Error: \\\" + err);\\n\\t\\t\\t}\\n\\t\\t\\tcallback();\\n\\t\\t},\\n\\t\\t$tw.wiki,\\n\\t\\t{output: process.stdout, error: process.stderr}\\n\\t);\\n\\tcommander.execute();\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"startup\"},\"$:/core/modules/startup/favicon.js\":{\"title\":\"$:/core/modules/startup/favicon.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/startup/favicon.js\\ntype: application/javascript\\nmodule-type: startup\\n\\nFavicon handling\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n// Export name and synchronous status\\nexports.name = \\\"favicon\\\";\\nexports.platforms = [\\\"browser\\\"];\\nexports.after = [\\\"startup\\\"];\\nexports.synchronous = true;\\n\\n// Favicon tiddler\\nvar FAVICON_TITLE = \\\"$:/favicon.ico\\\";\\n\\nexports.startup = function() {\\n\\t// Set up the favicon\\n\\tsetFavicon();\\n\\t// Reset the favicon when the tiddler changes\\n\\t$tw.wiki.addEventListener(\\\"change\\\",function(changes) {\\n\\t\\tif($tw.utils.hop(changes,FAVICON_TITLE)) {\\n\\t\\t\\tsetFavicon();\\n\\t\\t}\\n\\t});\\n};\\n\\nfunction setFavicon() {\\n\\tvar tiddler = $tw.wiki.getTiddler(FAVICON_TITLE);\\n\\tif(tiddler) {\\n\\t\\tvar faviconLink = document.getElementById(\\\"faviconLink\\\");\\n\\t\\tfaviconLink.setAttribute(\\\"href\\\",$tw.utils.makeDataUri(tiddler.fields.text,tiddler.fields.type,ti
2731ddler.fields._canonical_uri));\\n\\t}\\n}\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"startup\"},\"$:/core/modules/startup/info.js\":{\"title\":\"$:/core/modules/startup/info.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/startup/info.js\\ntype: application/javascript\\nmodule-type: startup\\n\\nInitialise $:/info tiddlers via $:/temp/info-plugin pseudo-plugin\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n// Export name and synchronous status\\nexports.name = \\\"info\\\";\\nexports.before = [\\\"startup\\\"];\\nexports.after = [\\\"load-modules\\\"];\\nexports.synchronous = true;\\n\\nvar TITLE_INFO_PLUGIN = \\\"$:/temp/info-plugin\\\";\\n\\nexports.startup = function() {\\n\\t// Function to bake the info plugin with new tiddlers\\n\\tvar updateInfoPlugin = function(tiddlerFieldsArray) {\\n\\t\\t// Get the existing tiddlers\\n\\t\\tvar json = $tw.wiki.getTiddlerData(TITLE_INFO_PLUGIN,{tiddlers: {}});\\n\\t\\t// Add the new ones\\n\\t\\t$tw.utils.each(tiddlerFieldsArray,function(fields) {\\n\\t\\t\\tif(fields && fields.title) {\\n\\t\\t\\t\\tjson.tiddlers[fields.title] = fields;\\n\\t\\t\\t}\\n\\t\\t});\\n\\t\\t// Bake the info tiddlers into a plugin. We use the non-standard plugin-type \\\"info\\\" because ordinary plugins are only registered asynchronously after being loaded dynamically\\n\\t\\tvar fields = {\\n\\t\\t\\ttitle: TITLE_INFO_PLUGIN,\\n\\t\\t\\ttype: \\\"application/json\\\",\\n\\t\\t\\t\\\"plugin-type\\\": \\\"info\\\",\\n\\t\\t\\ttext: JSON.stringify(json,null,$tw.config.preferences.jsonSpaces)\\n\\t\\t};\\n\\t\\t$tw.wiki.addTiddler(new $tw.Tiddler(fields));\\n\\n\\t};\\n\\t// Collect up the info tiddlers\\n\\tvar tiddlerFieldsArray = [];\\n\\t// Give each info module a chance to provide as many info tiddlers as they want as an array, and give them a callback for dynamically updating them\\n\\t$tw.modules.forEachModuleOfType(\\\"info\\\",function(title,moduleExports) {\\n\\t\\tif(moduleExports && moduleExports.getInfoTiddlerFields) {\\n\\t\\t\\tArray.prototype.push.apply(tiddlerFieldsArray,moduleExports.getInfoTiddlerFields(updateInfoPlugin));\\n\\t\\t}\\n\\t});\\n\\tupdateInfoPlugin(tiddlerFieldsArray);\\n\\tvar changes = $tw.wiki.readPluginInfo([TITLE_INFO_PLUGIN]);\\n\\t$tw.wiki.registerPluginTiddlers(\\\"info\\\",[TITLE_INFO_PLUGIN]);\\n\\t$tw.wiki.unpackPluginTiddlers();\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"startup\"},\"$:/core/modules/startup/load-modules.js\":{\"title\":\"$:/core/modules/startup/load-modules.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/startup/load-modules.js\\ntype: application/javascript\\nmodule-type: startup\\n\\nLoad core modules\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n// Export name and synchronous status\\nexports.name = \\\"load-modules\\\";\\nexports.synchronous = true;\\n\\nexports.startup = function() {\\n\\t// Load modules\\n\\t$tw.modules.applyMethods(\\\"utils\\\",$tw.utils);\\n\\tif($tw.node) {\\n\\t\\t$tw.modules.applyMethods(\\\"utils-node\\\",$tw.utils);\\n\\t}\\n\\tif($tw.browser) {\\n\\t\\t$tw.modules.applyMethods(\\\"utils-browser\\\",$tw.utils);\\n\\t}\\n\\t$tw.modules.applyMethods(\\\"global\\\",$tw);\\n\\t$tw.modules.applyMethods(\\\"config\\\",$tw.config);\\n\\t$tw.Tiddler.fieldModules = $tw.modules.getModulesByTypeAsHashmap(\\\"tiddlerfield\\\");\\n\\t$tw.modules.applyMethods(\\\"tiddlermethod\\\",$tw.Tiddler.prototype);\\n\\t$tw.modules.applyMethods(\\\"wikimethod\\\",$tw.Wiki.prototype);\\n\\t$tw.wiki.addIndexersToWiki();\\n\\t$tw.modules.applyMethods(\\\"tiddlerdeserializer\\\",$tw.Wiki.tiddlerDeserializerModules);\\n\\t$tw.macros = $tw.modules.getModulesByTypeAsHashmap(\\\"macro\\\");\\n\\t$tw.wiki.initParsers();\\n\\t$tw.Commander.initCommands();\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"startup\"},\"$:/core/modules/startup/password.js\":{\"title\":\"$:/core/modules/startup/password.js\",\"text\":\"/*\\\\\\ntitle: $
2731:/core/modules/startup/password.js\\ntype: application/javascript\\nmodule-type: startup\\n\\nPassword handling\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n// Export name and synchronous status\\nexports.name = \\\"password\\\";\\nexports.platforms = [\\\"browser\\\"];\\nexports.after = [\\\"startup\\\"];\\nexports.synchronous = true;\\n\\nexports.startup = function() {\\n\\t$tw.rootWidget.addEventListener(\\\"tm-set-password\\\",function(event) {\\n\\t\\t$tw.passwordPrompt.createPrompt({\\n\\t\\t\\tserviceName: $tw.language.getString(\\\"Encryption/PromptSetPassword\\\"),\\n\\t\\t\\tnoUserName: true,\\n\\t\\t\\tsubmitText: $tw.language.getString(\\\"Encryption/SetPassword\\\"),\\n\\t\\t\\tcanCancel: true,\\n\\t\\t\\trepeatPassword: true,\\n\\t\\t\\tcallback: function(data) {\\n\\t\\t\\t\\tif(data) {\\n\\t\\t\\t\\t\\t$tw.crypto.setPassword(data.password);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn true; // Get rid of the password prompt\\n\\t\\t\\t}\\n\\t\\t});\\n\\t});\\n\\t$tw.rootWidget.addEventListener(\\\"tm-clear-password\\\",function(event) {\\n\\t\\tif($tw.browser) {\\n\\t\\t\\tif(!confirm($tw.language.getString(\\\"Encryption/ConfirmClearPassword\\\"))) {\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\t$tw.crypto.setPassword(null);\\n\\t});\\n\\t// Ensure that $:/isEncrypted is maintained properly\\n\\t$tw.wiki.addEventListener(\\\"change\\\",function(changes) {\\n\\t\\tif($tw.utils.hop(changes,\\\"$:/isEncrypted\\\")) {\\n\\t\\t\\t$tw.crypto.updateCryptoStateTiddler();\\n\\t\\t}\\n\\t});\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"startup\"},\"$:/core/modules/startup/plugins.js\":{\"title\":\"$:/core/modules/startup/plugins.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/startup/plugins.js\\ntype: application/javascript\\nmodule-type: startup\\n\\nStartup logic concerned with managing plugins\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n// Export name and synchronous status\\nexports.name = \\\"plugins\\\";\\nexports.after = [\\\"load-modules\\\"];\\nexports.before = [\\\"startup\\\"];\\nexports.synchronous = true;\\n\\nvar TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE = \\\"$:/status/RequireReloadDueToPluginChange\\\";\\n\\nvar PREFIX_CONFIG_REGISTER_PLUGIN_TYPE = \\\"$:/config/RegisterPluginType/\\\";\\n\\nexports.startup = function() {\\n\\t$tw.wiki.addTiddler({title: TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE,text: \\\"no\\\"});\\n\\t$tw.wiki.addEventListener(\\\"change\\\",function(changes) {\\n\\t\\t// Work out which of the changed tiddlers are plugins that we need to reregister\\n\\t\\tvar changesToProcess = [],\\n\\t\\t\\trequireReloadDueToPluginChange = false;\\n\\t\\t$tw.utils.each(Object.keys(changes),function(title) {\\n\\t\\t\\tvar tiddler = $tw.wiki.getTiddler(title),\\n\\t\\t\\t\\trequiresReload = $tw.wiki.doesPluginRequireReload(title);\\n\\t\\t\\tif(requiresReload) {\\n\\t\\t\\t\\trequireReloadDueToPluginChange = true;\\n\\t\\t\\t} else if(tiddler) {\\n\\t\\t\\t\\tvar pluginType = tiddler.fields[\\\"plugin-type\\\"];\\n\\t\\t\\t\\tif($tw.wiki.getTiddlerText(PREFIX_CONFIG_REGISTER_PLUGIN_TYPE + (tiddler.fields[\\\"plugin-type\\\"] || \\\"\\\"),\\\"no\\\") === \\\"yes\\\") {\\n\\t\\t\\t\\t\\tchangesToProcess.push(title);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t});\\n\\t\\t// Issue warning if any of the tiddlers require a reload\\n\\t\\tif(requireReloadDueToPluginChange) {\\n\\t\\t\\t$tw.wiki.addTiddler({title: TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE,text: \\\"yes\\\"});\\n\\t\\t}\\n\\t\\t// Read or delete the plugin info of the changed tiddlers\\n\\t\\tif(changesToProcess.length > 0) {\\n\\t\\t\\tvar changes = $tw.wiki.readPluginInfo(changesToProcess);\\n\\t\\t\\tif(changes.modifiedPlugins.length > 0 || changes.deletedPlugins.length > 0) {\\n\\t\\t\\t\\tvar changedShadowTiddlers = {};\\n\\t\\t\\t\\t// Collect the shadow tiddlers of any deleted plugins\\n\\t\\t\\t\\t$tw.utils.each(changes.deletedPlugins,function(pluginTitle) {\\n\\t\\t\\t\\t\\tvar pluginInfo = $tw.wiki.getPluginInfo(pluginTitle);
2731\\n\\t\\t\\t\\t\\tif(pluginInfo) {\\n\\t\\t\\t\\t\\t\\t$tw.utils.each(Object.keys(pluginInfo.tiddlers),function(title) {\\n\\t\\t\\t\\t\\t\\t\\tchangedShadowTiddlers[title] = true;\\n\\t\\t\\t\\t\\t\\t});\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t});\\n\\t\\t\\t\\t// Collect the shadow tiddlers of any modified plugins\\n\\t\\t\\t\\t$tw.utils.each(changes.modifiedPlugins,function(pluginTitle) {\\n\\t\\t\\t\\t\\tvar pluginInfo = $tw.wiki.getPluginInfo(pluginTitle);\\n\\t\\t\\t\\t\\tif(pluginInfo) {\\n\\t\\t\\t\\t\\t\\t$tw.utils.each(Object.keys(pluginInfo.tiddlers),function(title) {\\n\\t\\t\\t\\t\\t\\t\\tchangedShadowTiddlers[title] = false;\\n\\t\\t\\t\\t\\t\\t});\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t});\\n\\t\\t\\t\\t// (Re-)register any modified plugins\\n\\t\\t\\t\\t$tw.wiki.registerPluginTiddlers(null,changes.modifiedPlugins);\\n\\t\\t\\t\\t// Unregister any deleted plugins\\n\\t\\t\\t\\t$tw.wiki.unregisterPluginTiddlers(null,changes.deletedPlugins);\\n\\t\\t\\t\\t// Unpack the shadow tiddlers\\n\\t\\t\\t\\t$tw.wiki.unpackPluginTiddlers();\\n\\t\\t\\t\\t// Queue change events for the changed shadow tiddlers\\n\\t\\t\\t\\t$tw.utils.each(Object.keys(changedShadowTiddlers),function(title) {\\n\\t\\t\\t\\t\\t$tw.wiki.enqueueTiddlerEvent(title,changedShadowTiddlers[title]);\\n\\t\\t\\t\\t});\\n\\t\\t\\t}\\n\\t\\t}\\n\\t});\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"startup\"},\"$:/core/modules/startup/render.js\":{\"title\":\"$:/core/modules/startup/render.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/startup/render.js\\ntype: application/javascript\\nmodule-type: startup\\n\\nTitle, stylesheet and page rendering\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n// Export name and synchronous status\\nexports.name = \\\"render\\\";\\nexports.platforms = [\\\"browser\\\"];\\nexports.after = [\\\"story\\\"];\\nexports.synchronous = true;\\n\\n// Default story and history lists\\nvar PAGE_TITLE_TITLE = \\\"$:/core/wiki/title\\\";\\nvar PAGE_STYLESHEET_TITLE = \\\"$:/core/ui/PageStylesheet\\\";\\nvar PAGE_TEMPLATE_TITLE = \\\"$:/core/ui/RootTemplate\\\";\\n\\n// Time (in ms) that we defer refreshing changes to draft tiddlers\\nvar DRAFT_TIDDLER_TIMEOUT_TITLE = \\\"$:/config/Drafts/TypingTimeout\\\";\\nvar THROTTLE_REFRESH_TIMEOUT = 400;\\n\\nexports.startup = function() {\\n\\t// Set up the title\\n\\t$tw.titleWidgetNode = $tw.wiki.makeTranscludeWidget(PAGE_TITLE_TITLE,{document: $tw.fakeDocument, parseAsInline: true});\\n\\t$tw.titleContainer = $tw.fakeDocument.createElement(\\\"div\\\");\\n\\t$tw.titleWidgetNode.render($tw.titleContainer,null);\\n\\tdocument.title = $tw.titleContainer.textContent;\\n\\t$tw.wiki.addEventListener(\\\"change\\\",function(changes) {\\n\\t\\tif($tw.titleWidgetNode.refresh(changes,$tw.titleContainer,null)) {\\n\\t\\t\\tdocument.title = $tw.titleContainer.textContent;\\n\\t\\t}\\n\\t});\\n\\t// Set up the styles\\n\\t$tw.styleWidgetNode = $tw.wiki.makeTranscludeWidget(PAGE_STYLESHEET_TITLE,{document: $tw.fakeDocument});\\n\\t$tw.styleContainer = $tw.fakeDocument.createElement(\\\"style\\\");\\n\\t$tw.styleWidgetNode.render($tw.styleContainer,null);\\n\\t$tw.styleWidgetNode.assignedStyles = $tw.styleContainer.textContent;\\n\\t$tw.styleElement = document.createElement(\\\"style\\\");\\n\\t$tw.styleElement.innerHTML = $tw.styleWidgetNode.assignedStyles;\\n\\tdocument.head.insertBefore($tw.styleElement,document.head.firstChild);\\n\\t$tw.wiki.addEventListener(\\\"change\\\",$tw.perf.report(\\\"styleRefresh\\\",function(changes) {\\n\\t\\tif($tw.styleWidgetNode.refresh(changes,$tw.styleContainer,null)) {\\n\\t\\t\\tvar newStyles = $tw.styleContainer.textContent;\\n\\t\\t\\tif(newStyles !== $tw.styleWidgetNode.assignedStyles) {\\n\\t\\t\\t\\t$tw.styleWidgetNode.assignedStyles = newStyles;\\n\\t\\t\\t\\t$tw.styleElement.innerHTML = $tw.styleWidgetNode.assignedStyles;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}));\\n\\t// Display the $:/core/ui/PageTemplate tiddler to kick off the display\\n\\t$tw.perf.report(\\\"mainRender\\\",function() {\\n\\t\\t$tw.pageWidgetNode = $tw.wiki.makeTranscludeWidget(PAGE_TEMPLATE_TITLE,{document: document, parentWidget: $tw.rootWidget, recursionMarker: \\\"no\\\"});\\n\\t\\t$tw.pageContainer = document.createElement(\\\"div\\\");\\n\\t\\t$tw.utils.addClass($tw.pageContainer,\\\"tc-page-container-wrapper\\\");\\n\\t\\tdocument.body.insertBefore($tw.pageContainer,document.body.firstChild);\\n\\t\\t$tw.pageWidgetNode.render($tw.pageContainer,null);
2731\\n   \\t\\t$tw.hooks.invokeHook(\\\"th-page-refreshed\\\");\\n\\t})();\\n\\t// Remove any splash screen elements\\n\\tvar removeList = document.querySelectorAll(\\\".tc-remove-when-wiki-loaded\\\");\\n\\t$tw.utils.each(removeList,function(removeItem) {\\n\\t\\tif(removeItem.parentNode) {\\n\\t\\t\\tremoveItem.parentNode.removeChild(removeItem);\\n\\t\\t}\\n\\t});\\n\\t// Prepare refresh mechanism\\n\\tvar deferredChanges = Object.create(null),\\n\\t\\ttimerId;\\n\\tfunction refresh() {\\n\\t\\t// Process the refresh\\n\\t\\t$tw.hooks.invokeHook(\\\"th-page-refreshing\\\");\\n\\t\\t$tw.pageWidgetNode.refresh(deferredChanges);\\n\\t\\tdeferredChanges = Object.create(null);\\n\\t\\t$tw.hooks.invokeHook(\\\"th-page-refreshed\\\");\\n\\t}\\n\\t// Add the change event handler\\n\\t$tw.wiki.addEventListener(\\\"change\\\",$tw.perf.report(\\\"mainRefresh\\\",function(changes) {\\n\\t\\t// Check if only tiddlers that are throttled have changed\\n\\t\\tvar onlyThrottledTiddlersHaveChanged = true;\\n\\t\\tfor(var title in changes) {\\n\\t\\t\\tvar tiddler = $tw.wiki.getTiddler(title);\\n\\t\\t\\tif(!$tw.wiki.isVolatileTiddler(title) && (!tiddler || !(tiddler.hasField(\\\"draft.of\\\") || tiddler.hasField(\\\"throttle.refresh\\\")))) {\\n\\t\\t\\t\\tonlyThrottledTiddlersHaveChanged = false;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\t// Defer the change if only drafts have changed\\n\\t\\tif(timerId) {\\n\\t\\t\\tclearTimeout(timerId);\\n\\t\\t}\\n\\t\\ttimerId = null;\\n\\t\\tif(onlyThrottledTiddlersHaveChanged) {\\n\\t\\t\\tvar timeout = parseInt($tw.wiki.getTiddlerText(DRAFT_TIDDLER_TIMEOUT_TITLE,\\\"\\\"),10);\\n\\t\\t\\tif(isNaN(timeout)) {\\n\\t\\t\\t\\ttimeout = THROTTLE_REFRESH_TIMEOUT;\\n\\t\\t\\t}\\n\\t\\t\\ttimerId = setTimeout(refresh,timeout);\\n\\t\\t\\t$tw.utils.extend(deferredChanges,changes);\\n\\t\\t} else {\\n\\t\\t\\t$tw.utils.extend(deferredChanges,changes);\\n\\t\\t\\trefresh();\\n\\t\\t}\\n\\t}));\\n\\t// Fix up the link between the root widget and the page container\\n\\t$tw.rootWidget.domNodes = [$tw.pageContainer];\\n\\t$tw.rootWidget.children = [$tw.pageWidgetNode];\\n\\t// Run any post-render startup actions\\n\\t$tw.rootWidget.invokeActionsByTag(\\\"$:/tags/StartupAction/PostRender\\\");\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"startup\"},\"$:/core/modules/startup/rootwidget.js\":{\"title\":\"$:/core/modules/startup/rootwidget.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/startup/rootwidget.js\\ntype: application/javascript\\nmodule-type: startup\\n\\nSetup the root widget and the core root widget handlers\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n// Export name and synchronous status\\nexports.name = \\\"rootwidget\\\";\\nexports.platforms = [\\\"browser\\\"];\\nexports.after = [\\\"startup\\\"];\\nexports.before = [\\\"story\\\"];\\nexports.synchronous = true;\\n\\nexports.startup = function() {\\n\\t// Install the HTTP client event handler\\n\\t$tw.httpClient = new $tw.utils.HttpClient();\\n\\tvar getPropertiesWithPrefix = function(properties,prefix) {\\n\\t\\tvar result = Object.create(null);\\n\\t\\t$tw.utils.each(properties,function(value,name) {\\n\\t\\t\\tif(name.indexOf(prefix) === 0) {\\n\\t\\t\\t\\tresult[name.substring(prefix.length)] = properties[name];\\n\\t\\t\\t}\\n\\t\\t});\\n\\t\\treturn result;\\n\\t};\\n\\t$tw.rootWidget.addEventListener(\\\"tm-http-request\\\",function(event) {\\n\\t\\tvar params = event.paramObject || {};\\n\\t\\t$tw.httpClient.initiateHttpRequest({\\n\\t\\t\\twiki: event.widget.wiki,\\n\\t\\t\\turl: params.url,\\n\\t\\t\\tmethod: params.method,\\n\\t\\t\\tbody: params.body,\\n\\t\\t\\tbinary: params.binary,\\n\\t\\t\\toncompletion: params.oncompletion,\\n\\t\\t\\tonprogress: params.onprogress,\\n\\t\\t\\tbindStatus: params[\\\"bind-status\\\"],\\n\\t\\t\\tbindProgress: params[\\\"bind-progress\\\"],\\n\\t\\t\\tvariables: getPropertiesWithPrefix(params,\\\"var-\\\"),\\n\\t\\t\\theaders: getPropertiesWithPrefix(params,\\\"header-\\\"),\\n\\t\\t\\tpasswordHeaders: getPropertiesWithPrefix(params,\\\"password-header-\\\"),\\n\\t\\t\\tqueryStrings: getPropertiesWithPrefix(params,\\\"query-\\\"),\\n\\t\\t\\tpasswordQueryStrings: getPropertiesWithPrefix(params,\\\"password-query-\\\")\\n\\t\\t});\\n\\t});\\n\\t$tw.rootWidget.addEventListener(\\\"tm-http-cancel-all-requests\\\",function(event) {\\n\\t\\t$tw.httpClient.cancelAllHttpRequests();\\n\\t});\\n\\t// Install the modal message mechanism\\n\\t$tw.modal = new $tw.utils.Modal($tw.wiki);\\n\\t$tw.rootWidget.addEventListener(\\\"tm-modal\\\",function(event) {\\n\\t\\t$tw.modal.dis
2731play(event.param,{variables: event.paramObject, event: event});\\n\\t});\\n\\t$tw.rootWidget.addEventListener(\\\"tm-show-switcher\\\",function(event) {\\n\\t\\t$tw.modal.display(\\\"$:/core/ui/SwitcherModal\\\",{variables: event.paramObject, event: event});\\n\\t});\\n\\t// Install the notification  mechanism\\n\\t$tw.notifier = new $tw.utils.Notifier($tw.wiki);\\n\\t$tw.rootWidget.addEventListener(\\\"tm-notify\\\",function(event) {\\n\\t\\t$tw.notifier.display(event.param,{variables: event.paramObject});\\n\\t});\\n\\t// Install the copy-to-clipboard  mechanism\\n\\t$tw.rootWidget.addEventListener(\\\"tm-copy-to-clipboard\\\",function(event) {\\n\\t\\t$tw.utils.copyToClipboard(event.param);\\n\\t});\\n\\t// Install the tm-focus-selector message\\n\\t$tw.rootWidget.addEventListener(\\\"tm-focus-selector\\\",function(event) {\\n\\t\\tvar selector = event.param || \\\"\\\",\\n\\t\\t\\telement,\\n\\t\\t    \\tbaseElement = event.event && event.event.target ? event.event.target.ownerDocument : document;\\n\\t\\telement = $tw.utils.querySelectorSafe(selector,baseElement);\\n\\t\\tif(element && element.focus) {\\n\\t\\t\\telement.focus(event.paramObject);\\n\\t\\t}\\n\\t});\\n\\t// Install the tm-rename-tiddler and tm-relink-tiddler messages\\n\\tvar makeRenameHandler = function(method) {\\n\\t\\treturn function(event) {\\n\\t\\t\\tvar options = {},\\n\\t\\t\\t\\tparamObject = event.paramObject || {},\\n\\t\\t\\t\\tfrom = paramObject.from || event.tiddlerTitle,\\n\\t\\t\\t\\tto = paramObject.to;\\n\\t\\t\\toptions.dontRenameInTags = (paramObject.renameInTags === \\\"false\\\" || paramObject.renameInTags === \\\"no\\\") ? true : false;\\n\\t\\t\\toptions.dontRenameInLists = (paramObject.renameInLists === \\\"false\\\" || paramObject.renameInLists === \\\"no\\\") ? true : false;\\n\\t\\t\\t$tw.wiki[method](from,to,options);\\n\\t\\t};\\n\\t};\\n\\t$tw.rootWidget.addEventListener(\\\"tm-rename-tiddler\\\",makeRenameHandler(\\\"renameTiddler\\\"));\\n\\t$tw.rootWidget.addEventListener(\\\"tm-relink-tiddler\\\",makeRenameHandler(\\\"relinkTiddler\\\"));\\n\\t// Install the scroller\\n\\t$tw.pageScroller = new $tw.utils.PageScroller();\\n\\t$tw.rootWidget.addEventListener(\\\"tm-scroll\\\",function(event) {\\n\\t\\t$tw.pageScroller.handleEvent(event);\\n\\t});\\n\\tvar fullscreen = $tw.utils.getFullScreenApis();\\n\\tif(fullscreen) {\\n\\t\\t$tw.rootWidget.addEventListener(\\\"tm-full-screen\\\",function(event) {\\n\\t\\t\\tvar fullScreenDocument = event.event ? event.event.target.ownerDocument : document;\\n\\t\\t\\tif(event.param === \\\"enter\\\") {\\n\\t\\t\\t\\tfullScreenDocument.documentElement[fullscreen._requestFullscreen](Element.ALLOW_KEYBOARD_INPUT);\\n\\t\\t\\t} else if(event.param === \\\"exit\\\") {\\n\\t\\t\\t\\tfullScreenDocument[fullscreen._exitFullscreen]();\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tif(fullScreenDocument[fullscreen._fullscreenElement]) {\\n\\t\\t\\t\\t\\tfullScreenDocument[fullscreen._exitFullscreen]();\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tfullScreenDocument.documentElement[fullscreen._requestFullscreen](Element.ALLOW_KEYBOARD_INPUT);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t});\\n\\t}\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"startup\"},\"$:/core/modules/startup.js\":{\"title\":\"$:/core/modules/startup.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/startup.js\\ntype: application/javascript\\nmodule-type: startup\\n\\nMiscellaneous startup logic for both the client and server.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n// Export name and synchronous status\\nexports.name = \\\"startup\\\";\\nexports.after = [\\\"load-modules\\\"];\\nexports.synchronous = true;\\n\\n// Set to `true` to enable performance instrumentation\\nvar PERFORMANCE_INSTRUMENTATION_CONFIG_TITLE = \\\"$:/config/Performance/Instrumentation\\\";\\n\\nvar widget = require(\\\"$:/core/modules/widgets/widget.js\\\");\\n\\nexports.startup = function() {\\n\\t// Minimal browser detection\\n\\tif($tw.browser) {\\n\\t\\t$tw.browser.isIE = (/msie|trident/i.test(navigator.userAgent));\\n\\t\\t$tw.browser.isFirefox = !!document.mozFullScreenEnabled;\\n\\t\\t// 2023-07-21 Edge returns UA below. So we use \\\"isChromeLike\\\"\\n\\t\\t//'mozilla/5.0 (windows nt 10.0; win64; x64) applewebkit/537.36 (khtml, like gecko) chrome/114.0.0.0 safari/537.36 edg/114.0.1823.82'\\n\\t\\t$tw.browser.isChromeLike = navigator.userAgent.toLowerCase().indexOf(\\\"chrome\\\") > -1;\\n\\t\\t$tw.browser.hasTouch = !!window.matchMedia && window.matchMedia(\\\"(pointer: coarse)\\\").matches;\\n\\t\\t$tw.browser.isMobileChrome = $tw.browser.isChromeLike && $tw.browser.hasTouch;\\n\\t}\\n\\t// Platform detection\\n\\t$tw.platform = {};\\n\\tif($tw.browser) {\\n\\t\\t$tw.platform.isMac = /Mac/.test(navigator.platform);\\n\\t\\t$tw.platform.isWindows = /win/i.test(navigator.platform);\\n\\t\\t$tw.platform.isLinux = /Linux/i.test(navigator.platform);\\n\\t}
2731 else {\\n\\t\\tswitch(require(\\\"os\\\").platform()) {\\n\\t\\t\\tcase \\\"darwin\\\":\\n\\t\\t\\t\\t$tw.platform.isMac = true;\\n\\t\\t\\t\\tbreak;\\n\\t\\t\\tcase \\\"win32\\\":\\n\\t\\t\\t\\t$tw.platform.isWindows = true;\\n\\t\\t\\t\\tbreak;\\n\\t\\t\\tcase \\\"freebsd\\\":\\n\\t\\t\\t\\t$tw.platform.isLinux = true;\\n\\t\\t\\t\\tbreak;\\n\\t\\t\\tcase \\\"linux\\\":\\n\\t\\t\\t\\t$tw.platform.isLinux = true;\\n\\t\\t\\t\\tbreak;\\n\\t\\t}\\n\\t}\\n\\t// Initialise version\\n\\t$tw.version = $tw.utils.extractVersionInfo();\\n\\t// Set up the performance framework\\n\\t$tw.perf = new $tw.Performance($tw.wiki.getTiddlerText(PERFORMANCE_INSTRUMENTATION_CONFIG_TITLE,\\\"no\\\") === \\\"yes\\\");\\n\\t// Create a root widget for attaching event handlers. By using it as the parentWidget for another widget tree, one can reuse the event handlers\\n\\t$tw.rootWidget = new widget.widget({\\n\\t\\ttype: \\\"widget\\\",\\n\\t\\tchildren: []\\n\\t},{\\n\\t\\twiki: $tw.wiki,\\n\\t\\tdocument: $tw.browser ? document : $tw.fakeDocument\\n\\t});\\n\\t// Execute any startup actions\\n\\t$tw.rootWidget.invokeActionsByTag(\\\"$:/tags/StartupAction\\\");\\n\\tif($tw.browser) {\\n\\t\\t$tw.rootWidget.invokeActionsByTag(\\\"$:/tags/StartupAction/Browser\\\");\\n\\t}\\n\\tif($tw.node) {\\n\\t\\t$tw.rootWidget.invokeActionsByTag(\\\"$:/tags/StartupAction/Node\\\");\\n\\t}\\n\\t// Kick off the language manager and switcher\\n\\t$tw.language = new $tw.Language();\\n\\t$tw.languageSwitcher = new $tw.PluginSwitcher({\\n\\t\\twiki: $tw.wiki,\\n\\t\\tpluginType: \\\"language\\\",\\n\\t\\tcontrollerTitle: \\\"$:/language\\\",\\n\\t\\tdefaultPlugins: [\\n\\t\\t\\t\\\"$:/languages/en-GB\\\"\\n\\t\\t],\\n\\t\\tonSwitch: function(plugins) {\\n\\t\\t\\tif($tw.browser) {\\n\\t\\t\\t\\tvar pluginTiddler = $tw.wiki.getTiddler(plugins[0]);\\n\\t\\t\\t\\tif(pluginTiddler) {\\n\\t\\t\\t\\t\\tdocument.documentElement.setAttribute(\\\"dir\\\",pluginTiddler.getFieldString(\\\"text-direction\\\") || \\\"auto\\\");\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tdocument.documentElement.removeAttribute(\\\"dir\\\");\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t});\\n\\t// Kick off the theme manager\\n\\t$tw.themeManager = new $tw.PluginSwitcher({\\n\\t\\twiki: $tw.wiki,\\n\\t\\tpluginType: \\\"theme\\\",\\n\\t\\tcontrollerTitle: \\\"$:/theme\\\",\\n\\t\\tdefaultPlugins: [\\n\\t\\t\\t\\\"$:/themes/tiddlywiki/snowwhite\\\",\\n\\t\\t\\t\\\"$:/themes/tiddlywiki/vanilla\\\"\\n\\t\\t]\\n\\t});\\n\\t// Kick off the keyboard manager\\n\\t$tw.keyboardManager = new $tw.KeyboardManager();\\n\\t// Listen for shortcuts\\n\\tif($tw.browser) {\\n\\t\\t$tw.utils.addEventListeners(document,[{\\n\\t\\t\\tname: \\\"keydown\\\",\\n\\t\\t\\thandlerObject: $tw.keyboardManager,\\n\\t\\t\\thandlerMethod: \\\"handleKeydownEvent\\\"\\n\\t\\t}]);\\n\\t}\\n\\t// Clear outstanding tiddler store change events to avoid an unnecessary refresh cycle at startup\\n\\t$tw.wiki.clearTiddlerEventQueue();\\n\\t// Find a working syncadaptor\\n\\t$tw.syncadaptor = undefined;\\n\\t$tw.modules.forEachModuleOfType(\\\"syncadaptor\\\",function(title,module) {\\n\\t\\tif(!$tw.syncadaptor && module.adaptorClass) {\\n\\t\\t\\t$tw.syncadaptor = new module.adaptorClass({wiki: $tw.wiki});\\n\\t\\t}\\n\\t});\\n\\t// Set up the syncer object if we've got a syncadaptor\\n\\tif($tw.syncadaptor) {\\n\\t\\t$tw.syncer = new $tw.Syncer({\\n\\t\\t\\twiki: $tw.wiki,\\n\\t\\t\\tsyncadaptor: $tw.syncadaptor,\\n\\t\\t\\tlogging: $tw.wiki.getTiddlerText('$:/config/SyncLogging', \\\"yes\\\") === \\\"yes\\\"\\n\\t\\t});\\n\\t}\\n\\t// Setup the saver handler\\n\\t$tw.saverHandler = new $tw.SaverHandler({\\n\\t\\twiki: $tw.wiki,\\n\\t\\tdirtyTracking: !$tw.syncadaptor,\\n\\t\\tpreloadDirty: $tw.boot.preloadDirty || []\\n\\t});\\n\\t// Host-specific startup\\n\\tif($tw.browser) {\\n\\t\\t// Install the popup manager\\n\\t\\t$tw.popup = new $tw.utils.Popup();\\n\\t\\t// Install the animator\\n\\t\\t$tw.anim = new $tw.utils.Animator();\\n\\t}\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"startup\"},\"$:/core/modules/startup/story.js\":{\"title\":\"$:/core/modules/startup/story.js\",\"text\":\"/*\\\\\\ntitle: $
2731:/core/modules/startup/story.js\\ntype: application/javascript\\nmodule-type: startup\\n\\nLoad core modules\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n// Export name and synchronous status\\nexports.name = \\\"story\\\";\\nexports.after = [\\\"startup\\\"];\\nexports.synchronous = true;\\n\\n// Default story and history lists\\nvar DEFAULT_STORY_TITLE = \\\"$:/StoryList\\\";\\nvar DEFAULT_HISTORY_TITLE = \\\"$:/HistoryList\\\";\\n\\n// Default tiddlers\\nvar DEFAULT_TIDDLERS_TITLE = \\\"$:/DefaultTiddlers\\\";\\n\\n// Config\\nvar CONFIG_UPDATE_ADDRESS_BAR = \\\"$:/config/Navigation/UpdateAddressBar\\\"; // Can be \\\"no\\\", \\\"permalink\\\", \\\"permaview\\\"\\nvar CONFIG_UPDATE_HISTORY = \\\"$:/config/Navigation/UpdateHistory\\\"; // Can be \\\"yes\\\" or \\\"no\\\"\\nvar CONFIG_PERMALINKVIEW_COPY_TO_CLIPBOARD = \\\"$:/config/Navigation/Permalinkview/CopyToClipboard\\\"; // Can be \\\"yes\\\" (default) or \\\"no\\\"\\nvar CONFIG_PERMALINKVIEW_UPDATE_ADDRESS_BAR = \\\"$:/config/Navigation/Permalinkview/UpdateAddressBar\\\"; // Can be \\\"yes\\\" (default) or \\\"no\\\"\\n\\n\\n// Links to help, if there is no param\\nvar HELP_OPEN_EXTERNAL_WINDOW = \\\"http://tiddlywiki.com/#WidgetMessage%3A%20tm-open-external-window\\\";\\n\\nexports.startup = function() {\\n\\t// Open startup tiddlers\\n\\topenStartupTiddlers({\\n\\t\\tdisableHistory: $tw.boot.disableStartupNavigation\\n\\t});\\n\\tif($tw.browser) {\\n\\t\\t// Set up location hash update\\n\\t\\t$tw.wiki.addEventListener(\\\"change\\\",function(changes) {\\n\\t\\t\\tif($tw.utils.hop(changes,DEFAULT_STORY_TITLE) || $tw.utils.hop(changes,DEFAULT_HISTORY_TITLE)) {\\n\\t\\t\\t\\tupdateLocationHash({\\n\\t\\t\\t\\t\\tupdateAddressBar: $tw.wiki.getTiddlerText(CONFIG_UPDATE_ADDRESS_BAR,\\\"permaview\\\").trim(),\\n\\t\\t\\t\\t\\tupdateHistory: $tw.wiki.getTiddlerText(CONFIG_UPDATE_HISTORY,\\\"no\\\").trim()\\n\\t\\t\\t\\t});\\n\\t\\t\\t}\\n\\t\\t});\\n\\t\\t// Listen for changes to the browser location hash\\n\\t\\twindow.addEventListener(\\\"hashc
2731hange\\\",function() {\\n\\t\\t\\tvar hash = $tw.utils.getLocationHash();\\n\\t\\t\\tif(hash !== $tw.locationHash) {\\n\\t\\t\\t\\t$tw.locationHash = hash;\\n\\t\\t\\t\\tif(hash !== \\\"#\\\") {\\n\\t\\t\\t\\t\\topenStartupTiddlers({defaultToCurrentStory: true});\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t},false);\\n\\t\\t// Listen for the tm-browser-refresh message\\n\\t\\t$tw.rootWidget.addEventListener(\\\"tm-browser-refresh\\\",function(event) {\\n\\t\\t\\twindow.location.reload(true);\\n\\t\\t});\\n\\t\\t// Listen for tm-open-external-window message\\n\\t\\t$tw.rootWidget.addEventListener(\\\"tm-open-external-window\\\",function(event) {\\n\\t\\t\\tvar paramObject = event.paramObject || {},\\n\\t\\t\\t\\tstrUrl = event.param || HELP_OPEN_EXTERNAL_WINDOW,\\n\\t\\t\\t\\tstrWindowName = paramObject.windowName,\\n\\t\\t\\t\\tstrWindowFeatures = paramObject.windowFeatures;\\n\\t\\t\\twindow.open(strUrl, strWindowName, strWindowFeatures);\\n\\t\\t});\\n\\t\\t// Listen for the tm-print message\\n\\t\\t$tw.rootWidget.addEventListener(\\\"tm-print\\\",function(event) {\\n\\t\\t\\t(event.event.view || window).print();\\n\\t\\t});\\n\\t\\t// Listen for the tm-home message\\n\\t\\t$tw.rootWidget.addEventListener(\\\"tm-home\\\",function(event) {\\n\\t\\t\\twindow.location.hash = \\\"\\\";\\n\\t\\t\\tvar storyFilter = $tw.wiki.getTiddlerText(DEFAULT_TIDDLERS_TITLE),\\n\\t\\t\\t\\tstoryList = $tw.wiki.filterTiddlers(storyFilter);\\n\\t\\t\\t//invoke any hooks that might change the default story list\\n\\t\\t\\tstoryList = $tw.hooks.invokeHook(\\\"th-opening-default-tiddlers-list\\\",storyList);\\n\\t\\t\\t$tw.wiki.addTiddler({title: DEFAULT_STORY_TITLE, text: \\\"\\\", list: storyList},$tw.wiki.getModificationFields());\\n\\t\\t\\tif(storyList[0]) {\\n\\t\\t\\t\\t$tw.wiki.addToHistory(storyList[0]);\\n\\t\\t\\t}\\n\\t\\t});\\n\\t\\t// Listen for the tm-permalink message\\n\\t\\t$tw.rootWidget.addEventListener(\\\"tm-permalink\\\",function(event) {\\n\\t\\t\\tupdateLocationHash({\\n\\t\\t\\t\\tupdateAddressBar: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_UPDATE_ADDRESS_BAR,\\\"yes\\\").trim() === \\\"yes\\\" ? \\\"permalink\\\" : \\\"none\\\",\\n\\t\\t\\t\\tupdateHistory: $tw.wiki.getTiddlerText(CONFIG_UPDATE_HISTORY,\\\"no\\\").trim(),\\n\\t\\t\\t\\ttargetTiddler: event.param || event.tiddlerTitle,\\n\\t\\t\\t\\tcopyToClipboard: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_COPY_TO_CLIPBOARD,\\\"yes\\\").trim() === \\\"yes\\\" ? \\\"permalink\\\" : \\\"none\\\"\\n\\t\\t\\t});\\n\\t\\t});\\n\\t\\t// Listen for the tm-permaview message\\n\\t\\t$tw.rootWidget.addEventListener(\\\"tm-permaview\\\",function(event) {\\n\\t\\t\\tupdateLocationHash({\\n\\t\\t\\t\\tupdateAddressBar: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_UPDATE_ADDRESS_BAR,\\\"yes\\\").trim() === \\\"yes\\\" ? \\\"permaview\\\" : \\\"none\\\",\\n\\t\\t\\t\\tupdateHistory: $tw.wiki.getTiddlerText(CONFIG_UPDATE_HISTORY,\\\"no\\\").trim(),\\n\\t\\t\\t\\ttargetTiddler: event.param || event.tiddlerTitle,\\n\\t\\t\\t\\tcopyToClipboard: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_COPY_TO_CLIPBOARD,\\\"yes\\\").trim() === \\\"yes\\\" ? \\\"permaview\\\" : \\\"none\\\"\\n\\t\\t\\t});\\n\\t\\t});\\n\\t}\\n};\\n\\n/*\\nProcess the location hash to open the specified tiddlers. Options:\\ndisableHistory: if true $:/History is NOT updated\\ndefaultToCurrentStory: If true, the current story is retained as the default, instead of opening the default tiddlers\\n*/\\nfunction openStartupTiddlers(options) {\\n\\toptions = options || {};\\n\\t// Work out the target tiddler and the story filter. \\\"null\\\" means \\\"unspecified\\\"\\n\\tvar target = null,\\n\\t\\tstoryFilter = null;\\n\\tif($tw.locationHash.length > 1) {\\n\\t\\tvar hash = $tw.locationHash.substr(1),\\n\\t\\t\\tsplit = hash.indexOf(\\\":\\\");\\n\\t\\tif(split === -1) {\\n\\t\\t\\ttarget = $tw.utils.decodeURIComponentSafe(hash.trim());\\n\\t\\t} else {\\n\\t\\t\\ttarget = $tw.utils.decodeURIComponentSafe(hash.substr(0,split).trim());\\n\\t\\t\\tstoryFilter = $tw.utils.decodeURIComponentSafe(hash.substr(split + 1).trim());\\n\\t\\t}\\n\\t}\\n\\t// If the story wasn't specified use the current tiddlers or a blank story\\n\\tif(storyFilter === null) {\\n\\t\\tif(options.defaultToCurrentStory) {\\n\\t\\t\\tvar currStoryList = $tw.wiki.getTiddlerList(DEFAULT_STORY_TITLE);\\n\\t\\t\\tstoryFilter = $tw.utils.stringifyList(currStoryList);\\n\\t\\t} else {\\n\\t\\t\\tif(target && target !== \\\"\\\") {\\n\\t\\t\\t\\tstoryFilter = \\\"\\\";\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tstoryFilter = $tw.wiki.getTiddlerText(DEFAULT_TIDDLERS_TITLE);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\t// Process the story filter to get the story list\\n\\tvar storyList = $tw.wiki.filterTiddlers(storyFilter);\\n\\t// Invoke any hooks that want to change the default story list\\n\\tstoryList = $tw.hooks.invokeHook(\\\"th-opening-default-tiddlers-list\\\",storyList);\\n\\t// If the target tiddler isn't included then splice it in at the top\\n\\tif(target && storyList.indexOf(target) === -1) {\\n\\t\\t
2731storyList.unshift(target);\\n\\t}\\n\\t// Save the story list\\n\\t$tw.wiki.addTiddler({title: DEFAULT_STORY_TITLE, text: \\\"\\\", list: storyList},$tw.wiki.getModificationFields());\\n\\t// Update history\\n\\tvar story = new $tw.Story({\\n\\t\\twiki: $tw.wiki,\\n\\t\\tstoryTitle: DEFAULT_STORY_TITLE,\\n\\t\\thistoryTitle: DEFAULT_HISTORY_TITLE\\n\\t});\\n\\tif(!options.disableHistory) {\\n\\t\\t// If a target tiddler was specified add it to the history stack\\n\\t\\tif(target && target !== \\\"\\\") {\\n\\t\\t\\t// The target tiddler doesn't need double square brackets, but we'll silently remove them if they're present\\n\\t\\t\\tif(target.indexOf(\\\"[[\\\") === 0 && target.substr(-2) === \\\"]]\\\") {\\n\\t\\t\\t\\ttarget = target.substr(2,target.length - 4);\\n\\t\\t\\t}\\n\\t\\t\\tstory.addToHistory(target);\\n\\t\\t} else if(storyList.length > 0) {\\n\\t\\t\\tstory.addToHistory(storyList[0]);\\n\\t\\t}\\n\\t}\\n}\\n\\n/*\\noptions: See below\\noptions.updateAddressBar: \\\"permalink\\\", \\\"permaview\\\" or \\\"no\\\" (defaults to \\\"permaview\\\")\\noptions.updateHistory: \\\"yes\\\" or \\\"no\\\" (defaults to \\\"no\\\")\\noptions.copyToClipboard: \\\"permalink\\\", \\\"permaview\\\" or \\\"no\\\" (defaults to \\\"no\\\")\\noptions.targetTiddler: optional title of target tiddler for permalink\\n*/\\nfunction updateLocationHash(options) {\\n\\t// Get the story and the history stack\\n\\tvar storyList = $tw.wiki.getTiddlerList(DEFAULT_STORY_TITLE),\\n\\t\\thistoryList = $tw.wiki.getTiddlerData(DEFAULT_HISTORY_TITLE,[]),\\n\\t\\ttargetTiddler = \\\"\\\";\\n\\tif(options.targetTiddler) {\\n\\t\\ttargetTiddler = options.targetTiddler;\\n\\t} else {\\n\\t\\t// The target tiddler is the one at the top of the stack\\n\\t\\tif(historyList.length > 0) {\\n\\t\\t\\ttargetTiddler = historyList[historyList.length-1].title;\\n\\t\\t}\\n\\t\\t// Blank the target tiddler if it isn't present in the story\\n\\t\\tif(storyList.indexOf(targetTiddler) === -1) {\\n\\t\\t\\ttargetTiddler = \\\"\\\";\\n\\t\\t}\\n\\t}\\n\\t// Assemble the location hash\\n\\tswitch(options.updateAddressBar) {\\n\\t\\tcase \\\"permalink\\\":\\n\\t\\t\\t$tw.locationHash = \\\"#\\\" + encodeURIComponent(targetTiddler);\\n\\t\\t\\tbreak;\\n\\t\\tcase \\\"permaview\\\":\\n\\t\\t\\t$tw.locationHash = \\\"#\\\" + encodeURIComponent(targetTiddler) + \\\":\\\" + encodeURIComponent($tw.utils.stringifyList(storyList));\\n\\t\\t\\tbreak;\\n\\t}\\n\\t// Copy URL to the clipboard\\n\\tswitch(options.copyToClipboard) {\\n\\t\\tcase \\\"permalink\\\":\\n\\t\\t\\t$tw.utils.copyToClipboard($tw.utils.getLocationPath() + \\\"#\\\" + encodeURIComponent(targetTiddler));\\n\\t\\t\\tbreak;\\n\\t\\tcase \\\"permaview\\\":\\n\\t\\t\\t$tw.utils.copyToClipboard($tw.utils.getLocationPath() + \\\"#\\\" + encodeURIComponent(targetTiddler) + \\\":\\\" + encodeURIComponent($tw.utils.stringifyList(storyList)));\\n\\t\\t\\tbreak;\\n\\t}\\n\\t// Only change the location hash if we must, thus avoiding unnecessary onhashchange events\\n\\tif($tw.utils.getLocationHash() !== $tw.locationHash) {\\n\\t\\tif(options.updateHistory === \\\"yes\\\") {\\n\\t\\t\\t// Assign the location hash so that history is updated\\n\\t\\t\\twindow.location.hash = $tw.locationHash;\\n\\t\\t} else {\\n\\t\\t\\t// We use replace so that browser history isn't affected\\n\\t\\t\\twindow.location.replace(window.location.toString().split(\\\"#\\\")[0] + $tw.locationHash);\\n\\t\\t}\\n\\t}\\n}\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"startup\"},\"$:/core/modules/startup/windows.js\":{\"title\":\"$:/core/modules/startup/windows.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/startup/windows.js\\ntype: application/javascript\\nmodule-type: startup\\n\\nSetup root widget handlers for the messages concerned with opening external browser windows\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n// Export name and synchronous status\\nexports.name = \\\"windows\\\";\\nexports.platforms = [\\\"browser\\\"];\\nexports.after = [\\\"startup\\\"];\\nexports.synchronous = true;\\n\\n// Global to keep track of open windows (hashmap by title)\\n$tw.windows = {};\\n// Default template to use for new windows\\nvar DEFAULT_WINDOW_TEMPLATE = \\\"$:/core/templates/single.tiddler.window\\\";\\n\\nexports.startup = function() {\\n\\t// Handle open window message\\n\\t$tw.rootWidget.addEventListener(\\\"tm-open-window\\\",function(event) {\\n\\t\\t// Get the parameters\\n\\t\\tvar refreshHandler,\\n\\t\\t\\ttitle = event.param || event.tiddlerTitle,\\n\\t\\t\\tparamObject = event.paramObject || {},\\n\\t\\t\\twindowTitle = paramObject.windowTitle || title,\\n\\t\\t\\twindowID = paramObject.windowID || title,\\n\\t\\t\\ttemplate = paramObject.template || DEFAULT_WINDOW_TEMPLATE,\\n\\t\\t\\twidth = paramObject.width || \\\"700\\\",\\n\\t\\t\\theight = paramObject.height || \\\"600\\\",\\n\\t\\t\\ttop = paramObject.top,\\n\\t\\t\\tleft = paramObject.left,\\n\\t\\t\\tvariables = $tw.utils.extend({},paramObject,{currentTiddler: title, \\\"tv-window-id\\\": windowID});\\n\\t\\t// Open the window\\n\\t\\tvar srcWindow,\\n\\t\\t    srcDocument;\\n\\t\\t// In case that popup blockers deny opening a new window\\n\\t\\ttry {\\n\\t\\t\\tsrcWindow = window.open(\\\"\\\",\\\"external-\\\" + windowID,\\\"scrollbars,width=\\\" + width + \\\",height=\\\" + height + (top ? \\\",top=\\\" + top : \\\"\\\" ) + (left ? \\\",left=\\\" + left : \\\"\\\" )),\\n\\t\\t\\tsrcDocument = srcWindow.document;\\n\\t\\t}\\n\\t\\tcatch(e) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\t\\t$tw.windows[windowID] = srcWindow;\\n\\t\\t// Check for reopening the same window\\n\\t\\tif(srcWindow.haveInitialisedWindow) {\\n\\t\\t\\treturn;\\n\\t\\t}
2731\\n\\t\\t// Initialise the document\\n\\t\\tsrcDocument.write(\\\"\u003Chtml>\u003Chead>\u003C/head>\u003Cbody class='tc-body tc-single-tiddler-window'>\u003C/body>\u003C/html>\\\");\\n\\t\\tsrcDocument.close();\\n\\t\\tsrcDocument.title = windowTitle;\\n\\t\\tsrcWindow.addEventListener(\\\"beforeunload\\\",function(event) {\\n\\t\\t\\tdelete $tw.windows[windowID];\\n\\t\\t\\t$tw.wiki.removeEventListener(\\\"change\\\",refreshHandler);\\n\\t\\t},false);\\n\\t\\t// Set up the styles\\n\\t\\tvar styleWidgetNode = $tw.wiki.makeTranscludeWidget(\\\"$:/core/ui/PageStylesheet\\\",{\\n\\t\\t\\t\\tdocument: $tw.fakeDocument,\\n\\t\\t\\t\\tvariables: variables,\\n\\t\\t\\t\\timportPageMacros: true}),\\n\\t\\t\\tstyleContainer = $tw.fakeDocument.createElement(\\\"style\\\");\\n\\t\\tstyleWidgetNode.render(styleContainer,null);\\n\\t\\tvar styleElement = srcDocument.createElement(\\\"style\\\");\\n\\t\\tstyleElement.innerHTML = styleContainer.textContent;\\n\\t\\tsrcDocument.head.insertBefore(styleElement,srcDocument.head.firstChild);\\n\\t\\t// Render the text of the tiddler\\n\\t\\tvar parser = $tw.wiki.parseTiddler(template),\\n\\t\\t\\twidgetNode = $tw.wiki.makeWidget(parser,{document: srcDocument, parentWidget: $tw.rootWidget, variables: variables});\\n\\t\\twidgetNode.render(srcDocument.body,srcDocument.body.firstChild);\\n\\t\\t// Function to handle refreshes\\n\\t\\trefreshHandler = function(changes) {\\n\\t\\t\\tif(styleWidgetNode.refresh(changes,styleContainer,null)) {\\n\\t\\t\\t\\tstyleElement.innerHTML = styleContainer.textContent;\\n\\t\\t\\t}\\n\\t\\t\\twidgetNode.refresh(changes);\\n\\t\\t};\\n\\t\\t$tw.wiki.addEventListener(\\\"change\\\",refreshHandler);\\n\\t\\t// Listen for keyboard shortcuts\\n\\t\\t$tw.utils.addEventListeners(srcDocument,[{\\n\\t\\t\\tname: \\\"keydown\\\",\\n\\t\\t\\thandlerObject: $tw.keyboardManager,\\n\\t\\t\\thandlerMethod: \\\"handleKeydownEvent\\\"\\n\\t\\t}]);\\n\\t\\tsrcWindow.document.documentElement.addEventListener(\\\"click\\\",$tw.popup,true);\\n\\t\\tsrcWindow.haveInitialisedWindow = true;\\n\\t});\\n\\t$tw.rootWidget.addEventListener(\\\"tm-close-window\\\",function(event) {\\n\\t\\tvar windowID = event.param,\\n\\t\\t\\twin = $tw.windows[windowID];\\n\\t\\t\\tif(win) {\\n\\t\\t\\t\\twin.close();\\n\\t\\t\\t}\\n\\t});\\n\\tvar closeAllWindows = function() {\\n\\t\\t$tw.utils.each($tw.windows,function(win) {\\n\\t\\t\\twin.close();\\n\\t\\t});\\n\\t}\\n\\t$tw.rootWidget.addEventListener(\\\"tm-close-all-windows\\\",closeAllWindows);\\n\\t// Close open windows when unloading main window\\n\\t$tw.addUnloadTask(closeAllWindows);\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"startup\"},\"$:/core/modules/story.js\":{\"title\":\"$:/core/modules/story.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/story.js\\ntype: application/javascript\\nmodule-type: global\\n\\nLightweight object for managing interactions with the story and history lists.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nConstruct Story object with options:\\nwiki: reference to wiki object to use to resolve tiddler titles\\nstoryTitle: title of story list tiddler\\nhistoryTitle: title of history list tiddler\\n*/\\nfunction Story(options) {\\n\\toptions = options || {};\\n\\tthis.wiki = options.wiki || $tw.wiki;\\n\\tthis.storyTitle = options.storyTitle || \\\"$:/StoryList\\\";\\n\\tthis.historyTitle = options.historyTitle || \\\"$:/HistoryList\\\";\\n};\\n\\nStory.prototype.navigateTiddler = function(navigateTo,navigateFromTitle,navigateFromClientRect) {\\n\\tthis.addToStory(navigateTo,navigateFromTitle);\\n\\tthis.addToHistory(navigateTo,navigateFromClientRect);\\n};\\n\\nStory.prototype.getStoryList = function() {\\n\\treturn this.wiki.getTiddlerList(this.storyTitle) || [];\\n};\\n\\nStory.prototype.addToStory = function(navigateTo,navigateFromTitle,options) {\\n\\toptions = options || {};\\n\\tvar storyList = this.getStoryList();\\n\\t// See if the tiddler is already there\\n\\tvar slot = storyList.indexOf(navigateTo);\\n\\t// Quit if it already exists in the story river\\n\\tif(slot >= 0) {\\n\\t\\treturn;\\n\\t}\\n\\t// First we try to find the position of the story element we navigated from\\n\\tvar fromIndex = storyList.indexOf(navigateFromTitle);\\n\\tif(fromIndex >= 0) {\\n\\t\\t// The tiddler is added from inside the river\\n\\t\\t// Determine where to insert the tiddler;
2731 Fallback is \\\"below\\\"\\n\\t\\tswitch(options.openLinkFromInsideRiver) {\\n\\t\\t\\tcase \\\"top\\\":\\n\\t\\t\\t\\tslot = 0;\\n\\t\\t\\t\\tbreak;\\n\\t\\t\\tcase \\\"bottom\\\":\\n\\t\\t\\t\\tslot = storyList.length;\\n\\t\\t\\t\\tbreak;\\n\\t\\t\\tcase \\\"above\\\":\\n\\t\\t\\t\\tslot = fromIndex;\\n\\t\\t\\t\\tbreak;\\n\\t\\t\\tcase \\\"below\\\": // Intentional fall-through\\n\\t\\t\\tdefault:\\n\\t\\t\\t\\tslot = fromIndex + 1;\\n\\t\\t\\t\\tbreak;\\n\\t\\t}\\n\\t} else {\\n\\t\\t// The tiddler is opened from outside the river. Determine where to insert the tiddler; default is \\\"top\\\"\\n\\t\\tif(options.openLinkFromOutsideRiver === \\\"bottom\\\") {\\n\\t\\t\\t// Insert at bottom\\n\\t\\t\\tslot = storyList.length;\\n\\t\\t} else {\\n\\t\\t\\t// Insert at top\\n\\t\\t\\tslot = 0;\\n\\t\\t}\\n\\t}\\n\\t// Add the tiddler\\n\\tstoryList.splice(slot,0,navigateTo);\\n\\t// Save the story\\n\\tthis.saveStoryList(storyList);\\n};\\n\\nStory.prototype.saveStoryList = function(storyList) {\\n\\tvar storyTiddler = this.wiki.getTiddler(this.storyTitle);\\n\\tthis.wiki.addTiddler(new $tw.Tiddler(\\n\\t\\tthis.wiki.getCreationFields(),\\n\\t\\t{title: this.storyTitle},\\n\\t\\tstoryTiddler,\\n\\t\\t{list: storyList},\\n\\t\\tthis.wiki.getModificationFields()\\n\\t));\\n};\\n\\nStory.prototype.addToHistory = function(navigateTo,navigateFromClientRect) {\\n\\tvar titles = $tw.utils.isArray(navigateTo) ? navigateTo : [navigateTo];\\n\\t// Add a new record to the top of the history stack\\n\\tvar historyList = this.wiki.getTiddlerData(this.historyTitle,[]);\\n\\t$tw.utils.each(titles,function(title) {\\n\\t\\thistoryList.push({title: title, fromPageRect: navigateFromClientRect});\\n\\t});\\n\\tthis.wiki.setTiddlerData(this.historyTitle,historyList,{\\\"current-tiddler\\\": titles[titles.length-1]});\\n};\\n\\nStory.prototype.storyCloseTiddler = function(targetTitle) {\\n// TBD\\n};\\n\\nStory.prototype.storyCloseAllTiddlers = function() {\\n// TBD\\n};\\n\\nStory.prototype.storyCloseOtherTiddlers = function(targetTitle) {\\n// TBD\\n};\\n\\nStory.prototype.storyEditTiddler = function(targetTitle) {\\n// TBD\\n};\\n\\nStory.prototype.storyDeleteTiddler = function(targetTitle) {\\n// TBD\\n};\\n\\nStory.prototype.storySaveTiddler = function(targetTitle) {\\n// TBD\\n};\\n\\nStory.prototype.storyCancelTiddler = function(targetTitle) {\\n// TBD\\n};\\n\\nStory.prototype.storyNewTiddler = function(targetTitle) {\\n// TBD\\n};\\n\\nexports.Story = Story;\\n\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"global\"},\"$:/core/modules/storyviews/classic.js\":{\"title\":\"$:/core/modules/storyviews/classic.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/storyviews/classic.js\\ntype: application/javascript\\nmodule-type: storyview\\n\\nViews the story as a linear sequence\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar easing = \\\"cubic-bezier(0.645, 0.045, 0.355, 1)\\\"; // From http://easings.net/#easeInOutCubic\\n\\nvar ClassicStoryView = function(listWidget) {\\n\\tthis.listWidget = listWidget;\\n};\\n\\nClassicStoryView.prototype.navigateTo = function(historyInfo) {\\n\\tvar duration = $tw.utils.getAnimationDuration()\\n\\tvar listElementIndex = this.listWidget.findListItem(0,historyInfo.title);\\n\\tif(listElementIndex === undefined) {\\n\\t\\treturn;\\n\\t}\\n\\tvar listItemWidget = this.listWidget.children[listElementIndex],\\n\\t\\ttargetElement = listItemWidget.findFirstDomNode();\\n\\t// Abandon if the list entry isn't a DOM element (it might be a text node)\\n\\tif(!targetElement || targetElement.nodeType === Node.TEXT_NODE) {\\n\\t\\treturn;\\n\\t}\\n\\tif(duration) {\\n\\t\\t// Scroll the node into view\\n\\t\\tthis.listWidget.dispatchEvent({type: \\\"tm-scroll\\\", target: targetElement});\\n\\t} else {\\n\\t\\ttargetElement.scrollIntoView();\\n\\t}\\n};\\n\\nClassicStoryView.prototype.insert = function(widget) {\\n\\tvar duration = $tw.utils.getAnimationDuration();\\n\\tif(duration) {\\n\\t\\tvar targetElement = widget.findFirstDomNode();\\n\\t\\t// Abandon if the list entry isn't a DOM element (it might be a text node)\\n\\t\\tif(!targetElement || targetElement.nodeType === Node.TEXT_NODE) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\t\\t// Get the current height of the tiddler\\n\\t\\tvar computedStyle = window.getComputedStyle(targetElement),\\n\\t\\t\\tcurrMarginBottom = parseInt(computedStyle.marginBottom,10),\\n\\t\\t\\tcurrMarginTop = parseInt(computedStyle.marginTop,10),\\n\\t\\t\\tcurrHeight = targetElement.offsetHeight + currMarginTop;\\n\\t\\t// Reset the margin once the transition is over\\n\\t\\t
2731setTimeout(function() {\\n\\t\\t\\t$tw.utils.setStyle(targetElement,[\\n\\t\\t\\t\\t{transition: \\\"none\\\"},\\n\\t\\t\\t\\t{marginBottom: \\\"\\\"}\\n\\t\\t\\t]);\\n\\t\\t},duration);\\n\\t\\t// Set up the initial position of the element\\n\\t\\t$tw.utils.setStyle(targetElement,[\\n\\t\\t\\t{transition: \\\"none\\\"},\\n\\t\\t\\t{marginBottom: (-currHeight) + \\\"px\\\"},\\n\\t\\t\\t{opacity: \\\"0.0\\\"}\\n\\t\\t]);\\n\\t\\t$tw.utils.forceLayout(targetElement);\\n\\t\\t// Transition to the final position\\n\\t\\t$tw.utils.setStyle(targetElement,[\\n\\t\\t\\t{transition: \\\"opacity \\\" + duration + \\\"ms \\\" + easing + \\\", \\\" +\\n\\t\\t\\t\\t\\t\\t\\\"margin-bottom \\\" + duration + \\\"ms \\\" + easing},\\n\\t\\t\\t{marginBottom: currMarginBottom + \\\"px\\\"},\\n\\t\\t\\t{opacity: \\\"1.0\\\"}\\n\\t]);\\n\\t}\\n};\\n\\nClassicStoryView.prototype.remove = function(widget) {\\n\\tvar duration = $tw.utils.getAnimationDuration();\\n\\tif(duration) {\\n\\t\\tvar targetElement = widget.findFirstDomNode(),\\n\\t\\t\\tremoveElement = function() {\\n\\t\\t\\t\\twidget.removeChildDomNodes();\\n\\t\\t\\t};\\n\\t\\t// Abandon if the list entry isn't a DOM element (it might be a text node)\\n\\t\\tif(!targetElement || targetElement.nodeType === Node.TEXT_NODE) {\\n\\t\\t\\tremoveElement();\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\t\\t// Get the current height of the tiddler\\n\\t\\tvar currWidth = targetElement.offsetWidth,\\n\\t\\t\\tcomputedStyle = window.getComputedStyle(targetElement),\\n\\t\\t\\tcurrMarginBottom = parseInt(computedStyle.marginBottom,10),\\n\\t\\t\\tcurrMarginTop = parseInt(computedStyle.marginTop,10),\\n\\t\\t\\tcurrHeight = targetElement.offsetHeight + currMarginTop;\\n\\t\\t// Remove the dom nodes of the widget at the end of the transition\\n\\t\\tsetTimeout(removeElement,duration);\\n\\t\\t// Animate the closure\\n\\t\\t$tw.utils.setStyle(targetElement,[\\n\\t\\t\\t{transition: \\\"none\\\"},\\n\\t\\t\\t{transform: \\\"translateX(0px)\\\"},\\n\\t\\t\\t{marginBottom:  currMarginBottom + \\\"px\\\"},\\n\\t\\t\\t{opacity: \\\"1.0\\\"}\\n\\t\\t]);\\n\\t\\t$tw.utils.forceLayout(targetElement);\\n\\t\\t$tw.utils.setStyle(targetElement,[\\n\\t\\t\\t{transition: $tw.utils.roundTripPropertyName(\\\"transform\\\") + \\\" \\\" + duration + \\\"ms \\\" + easing + \\\", \\\" +\\n\\t\\t\\t\\t\\t\\t\\\"opacity \\\" + duration + \\\"ms \\\" + easing + \\\", \\\" +\\n\\t\\t\\t\\t\\t\\t\\\"margin-bottom \\\" + duration + \\\"ms \\\" + easing},\\n\\t\\t\\t{transform: \\\"translateX(-\\\" + currWidth + \\\"px)\\\"},\\n\\t\\t\\t{marginBottom: (-currHeight) + \\\"px\\\"},\\n\\t\\t\\t{opacity: \\\"0.0\\\"}\\n\\t\\t]);\\n\\t} else {\\n\\t\\twidget.removeChildDomNodes();\\n\\t}\\n};\\n\\nexports.classic = ClassicStoryView;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"storyview\"},\"$:/core/modules/storyviews/pop.js\":{\"title\":\"$:/core/modules/storyviews/pop.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/storyviews/pop.js\\ntype: application/javascript\\nmodule-type: storyview\\n\\nAnimates list insertions and removals\\
2731n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar PopStoryView = function(listWidget) {\\n\\tthis.listWidget = listWidget;\\n};\\n\\nPopStoryView.prototype.navigateTo = function(historyInfo) {\\n\\tvar listElementIndex = this.listWidget.findListItem(0,historyInfo.title);\\n\\tif(listElementIndex === undefined) {\\n\\t\\treturn;\\n\\t}\\n\\tvar listItemWidget = this.listWidget.children[listElementIndex],\\n\\t\\ttargetElement = listItemWidget.findFirstDomNode();\\n\\t// Abandon if the list entry isn't a DOM element (it might be a text node)\\n\\tif(!targetElement || targetElement.nodeType === Node.TEXT_NODE) {\\n\\t\\treturn;\\n\\t}\\n\\t// Scroll the node into view\\n\\tthis.listWidget.dispatchEvent({type: \\\"tm-scroll\\\", target: targetElement});\\n};\\n\\nPopStoryView.prototype.insert = function(widget) {\\n\\tvar targetElement = widget.findFirstDomNode(),\\n\\t\\tduration = $tw.utils.getAnimationDuration();\\n\\t// Abandon if the list entry isn't a DOM element (it might be a text node)\\n\\tif(!targetElement || targetElement.nodeType === Node.TEXT_NODE) {\\n\\t\\treturn;\\n\\t}\\n\\t// Reset once the transition is over\\n\\tsetTimeout(function() {\\n\\t\\t$tw.utils.setStyle(targetElement,[\\n\\t\\t\\t{transition: \\\"none\\\"},\\n\\t\\t\\t{transform: \\\"none\\\"}\\n\\t\\t]);\\n\\t\\t$tw.utils.setStyle(widget.document.body,[\\n\\t\\t\\t{\\\"overflow-x\\\": \\\"\\\"}\\n\\t\\t]);\\n\\t},duration);\\n\\t// Prevent the page from overscrolling due to the zoom factor\\n\\t$tw.utils.setStyle(widget.document.body,[\\n\\t\\t{\\\"overflow-x\\\": \\\"hidden\\\"}\\n\\t]);\\n\\t// Set up the initial position of the element\\n\\t$tw.utils.setStyle(targetElement,[\\n\\t\\t{transition: \\\"none\\\"},\\n\\t\\t{transform: \\\"scale(2)\\\"},\\n\\t\\t{opacity: \\\"0.0\\\"}\\n\\t]);\\n\\t$tw.utils.forceLayout(targetElement);\\n\\t// Transition to the final position\\n\\t$tw.utils.setStyle(targetElement,[\\n\\t\\t{transition: $tw.utils.roundTripPropertyName(\\\"transform\\\") + \\\" \\\" + duration + \\\"ms ease-in-out, \\\" +\\n\\t\\t\\t\\t\\t\\\"opacity \\\" + duration + \\\"ms ease-in-out\\\"},\\n\\t\\t{transform: \\\"scale(1)\\\"},\\n\\t\\t{opacity: \\\"1.0\\\"}\\n\\t]);\\n};\\n\\nPopStoryView.prototype.remove = function(widget) {\\n\\tvar targetElement = widget.findFirstDomNode(),\\n\\t\\tduration = $tw.utils.getAnimationDuration(),\\n\\t\\tremoveElement = function() {\\n\\t\\t\\tif(targetElement && targetElement.parentNode) {\\n\\t\\t\\t\\twidget.removeChildDomNodes();\\n\\t\\t\\t}\\n\\t\\t};\\n\\t// Abandon if the list entry isn't a DOM element (it might be a text node)\\n\\tif(!targetElement || targetElement.nodeType === Node.TEXT_NODE) {\\n\\t\\tremoveElement();\\n\\t\\treturn;\\n\\t}\\n\\t// Remove the element at the end of the transition\\n\\tsetTimeout(removeElement,duration);\\n\\t// Animate the closure\\n\\t$tw.utils.setStyle(targetElement,[\\n\\t\\t{transition: \\\"none\\\"},\\n\\t\\t{transform: \\\"scale(1)\\\"},\\n\\t\\t{opacity: \\\"1.0\\\"}\\n\\t]);\\n\\t$tw.utils.forceLayout(targetElement);\\n\\t$tw.utils.setStyle(targetElement,[\\n\\t\\t{transition: $tw.utils.roundTripPropertyName(\\\"transform\\\") + \\\" \\\" + duration + \\\"ms ease-in-out, \\\" +\\n\\t\\t\\t\\t\\t\\\"opacity \\\" + duration + \\\"ms ease-in-out\\\"},\\n\\t\\t{transform: \\\"scale(0.1)\\\"},\\n\\t\\t{opacity: \\\"0.0\\\"}\\n\\t]);\\n};\\n\\nexports.pop = PopStoryView;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"storyview\"},\"$:/core/modules/storyviews/zoomin.js\":{\"title\":\"$:/core/modules/storyviews/zoomin.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/storyviews/zoomin.js\\ntype: application/javascript\\nmodule-type: storyview\\n\\nZooms between individual tiddlers\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar easing = \\\"cubic-bezier(0.645, 0.045, 0.355, 1)\\\"; // From http://easings.net/#easeInOutCubic\\n\\nvar ZoominListView = function(listWidget) {\\n\\tvar self = this;\\n\\tthis.listWidget = listWidget;\\n\\tthis.textNodeLogger = new $tw.utils.Logger(\\\"zoomin story river view\\\", {\\n\\t\\tenable: true,\\n\\t\\tcolour: 'red'\\n\\t});\\n\\t// Get the index of the tiddler that is at the top of the history\\n\\tvar history = this.listWidget.wiki.getTiddlerDataCached(this.listWidget.historyTitle,[]),\\n\\t\\ttargetTiddler;\\n\\tif(history.length > 0) {\\n\\t\\ttargetTiddler = history[history.length-1].title;\\n\\t}\\n\\t// Make all the tiddlers position absolute, and hide all but the top (or first) one\\n\\t$tw.utils.each(this.listWidget.children,function(itemWidget,index) {\\n\\t\\tvar domNo
2731de = itemWidget.findFirstDomNode();\\n\\t\\t// Abandon if the list entry isn't a DOM element (it might be a text node)\\n\\t\\tif(!(domNode instanceof Element)) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\t\\tif((targetTiddler && targetTiddler !== itemWidget.parseTreeNode.itemTitle) || (!targetTiddler && index)) {\\n\\t\\t\\tdomNode.style.display = \\\"none\\\";\\n\\t\\t} else {\\n\\t\\t\\tself.currentTiddlerDomNode = domNode;\\n\\t\\t}\\n\\t\\t$tw.utils.addClass(domNode,\\\"tc-storyview-zoomin-tiddler\\\");\\n\\t});\\n};\\n\\nZoominListView.prototype.navigateTo = function(historyInfo) {\\n\\tvar duration = $tw.utils.getAnimationDuration(),\\n\\t\\tlistElementIndex = this.listWidget.findListItem(0,historyInfo.title);\\n\\tif(listElementIndex === undefined) {\\n\\t\\treturn;\\n\\t}\\n\\tvar listItemWidget = this.listWidget.children[listElementIndex],\\n\\t\\ttargetElement = listItemWidget.findFirstDomNode();\\n\\t// Abandon if the list entry isn't a DOM element (it might be a text node)\\n\\tif(!targetElement) {\\n\\t\\treturn;\\n\\t} else if (targetElement.nodeType === Node.TEXT_NODE) {\\n\\t\\tthis.logTextNodeRoot(targetElement);\\n\\t\\treturn;\\n\\t}\\n\\t// Make the new tiddler be position absolute and visible so that we can measure it\\n\\t$tw.utils.addClass(targetElement,\\\"tc-storyview-zoomin-tiddler\\\");\\n\\t$tw.utils.setStyle(targetElement,[\\n\\t\\t{display: \\\"block\\\"},\\n\\t\\t{transformOrigin: \\\"0 0\\\"},\\n\\t\\t{transform: \\\"translateX(0px) translateY(0px) scale(1)\\\"},\\n\\t\\t{transition: \\\"none\\\"},\\n\\t\\t{opacity: \\\"0.0\\\"}\\n\\t]);\\n\\t// Get the position of the source node, or use the centre of the window as the source position\\n\\tvar sourceBounds = historyInfo.fromPageRect || {\\n\\t\\t\\tleft: window.innerWidth/2 - 2,\\n\\t\\t\\ttop: window.innerHeight/2 - 2,\\n\\t\\t\\twidth: window.innerWidth/8,\\n\\t\\t\\theight: window.innerHeight/8\\n\\t\\t};\\n\\t// Try to find the title node in the target tiddler\\n\\tvar titleDomNode = findTitleDomNode(listItemWidget) || listItemWidget.findFirstDomNode(),\\n\\t\\tzoomBounds = titleDomNode.getBoundingClientRect();\\n\\t// Compute the transform for the target tiddler to make the title lie over the source rectange\\n\\tvar targetBounds = targetElement.getBoundingClientRect(),\\n\\t\\tscale = sourceBounds.width / zoomBounds.width,\\n\\t\\tx = sourceBounds.left - targetBounds.left - (zoomBounds.left - targetBounds.left) * scale,\\n\\t\\ty = sourceBounds.top - targetBounds.top - (zoomBounds.top - targetBounds.top) * scale;\\n\\t// Transform the target tiddler to its starting position\\n\\t$tw.utils.setStyle(targetElement,[\\n\\t\\t{transform: \\\"translateX(\\\" + x + \\\"px) translateY(\\\" + y + \\\"px) scale(\\\" + scale + \\\")\\\"}\\n\\t]);\\n\\t// Force layout\\n\\t$tw.utils.forceLayout(targetElement);\\n\\t// Apply the ending transitions with a timeout to ensure that the previously applied transformations are applied first\\n\\tvar self = this,\\n\\t\\tprevCurrentTiddler = this.currentTiddlerDomNode;\\n\\tthis.currentTiddlerDomNode = targetElement;\\n\\t// Transform the target tiddler to its natural size\\n\\t$tw.utils.setStyle(targetElement,[\\n\\t\\t{transition: $tw.utils.roundTripPropertyName(\\\"transform\\\") + \\\" \\\" + duration + \\\"ms \\\" + easing + \\\", opacity \\\" + duration + \\\"ms \\\" + easing},\\n\\t\\t{opacity: \\\"1.0\\\"},\\n\\t\\t{transform: \\\"translateX(0px) translateY(0px) scale(1)\\\"},\\n\\t\\t{zIndex: \\\"500\\\"},\\n\\t]);\\n\\t// Transform the previous tiddler out of the way and then hide it\\n\\tif(prevCurrentTiddler && prevCurrentTiddler !== targetElement) {\\n\\t\\tscale = zoomBounds.width / sourceBounds.width;\\n\\t\\tx =  zoomBounds.left - targetBounds.left - (sourceBounds.left - targetBounds.left) * scale;\\n\\t\\ty =  zoomBounds.top - targetBounds.top - (sourceBounds.top - targetBounds.top) * scale;\\n\\t\\t$tw.utils.setStyle(prevCurrentTiddler,[\\n\\t\\t\\t{transition: $tw.utils.roundTripPropertyName(\\\"transform\\\") + \\\" \\\" + duration + \\\"ms \\\" + easing + \\\", opacity \\\" + duration + \\\"ms \\\" + easing},\\n\\t\\t\\t{opacity: \\\"0.0\\\"},\\n\\t\\t\\t{transformOrigin: \\\"0 0\\\"},\\n\\t\\t\\t{transform: \\\"translateX(\\\" + x + \\\"px) translateY(\\\" + y + \\\"px) scale(\\\" + scale + \\\")\\\"},\\n\\t\\t\\t{zIndex: \\\"0\\\"}\\n\\t\\t]);\\n\\t\\t// Hide the tiddler when the transition has finished\\n\\t\\t
2731setTimeout(function() {\\n\\t\\t\\tif(self.currentTiddlerDomNode !== prevCurrentTiddler) {\\n\\t\\t\\t\\tprevCurrentTiddler.style.display = \\\"none\\\";\\n\\t\\t\\t}\\n\\t\\t},duration);\\n\\t}\\n\\t// Scroll the target into view\\n//\\t$tw.pageScroller.scrollIntoView(targetElement);\\n};\\n\\n/*\\nFind the first child DOM node of a widget that has the class \\\"tc-title\\\"\\n*/\\nfunction findTitleDomNode(widget,targetClass) {\\n\\ttargetClass = targetClass || \\\"tc-title\\\";\\n\\tvar domNode = widget.findFirstDomNode();\\n\\tif(domNode && domNode.querySelector) {\\n\\t\\treturn $tw.utils.querySelectorSafe(\\\".\\\" + targetClass,domNode);\\n\\t}\\n\\treturn null;\\n}\\n\\nZoominListView.prototype.insert = function(widget) {\\n\\tvar targetElement = widget.findFirstDomNode();\\n\\t// Abandon if the list entry isn't a DOM element (it might be a text node)\\n\\tif(!targetElement) {\\n\\t\\treturn;\\n\\t} else if (targetElement.nodeType === Node.TEXT_NODE) {\\n\\t\\tthis.logTextNodeRoot(targetElement);\\n\\t\\treturn;\\n\\t}\\n\\t// Make the newly inserted node position absolute and hidden\\n\\t$tw.utils.addClass(targetElement,\\\"tc-storyview-zoomin-tiddler\\\");\\n\\t$tw.utils.setStyle(targetElement,[\\n\\t\\t{display: \\\"none\\\"}\\n\\t]);\\n};\\n\\nZoominListView.prototype.remove = function(widget) {\\n\\tvar targetElement = widget.findFirstDomNode(),\\n\\t\\tduration = $tw.utils.getAnimationDuration(),\\n\\t\\tremoveElement = function() {\\n\\t\\t\\twidget.removeChildDomNodes();\\n\\t\\t};\\n\\t// Abandon if the list entry isn't a DOM element (it might be a text node)\\n\\tif(!targetElement || targetElement.nodeType === Node.TEXT_NODE) {\\n\\t\\tremoveElement();\\n\\t\\treturn;\\n\\t}\\n\\t// Abandon if hidden\\n\\tif(targetElement.style.display != \\\"block\\\" ) {\\n\\t\\tremoveElement();\\n\\t\\treturn;\\n\\t}\\n\\t// Set up the tiddler that is being closed\\n\\t$tw.utils.addClass(targetElement,\\\"tc-storyview-zoomin-tiddler\\\");\\n\\t$tw.utils.setStyle(targetElement,[\\n\\t\\t{display: \\\"block\\\"},\\n\\t\\t{transformOrigin: \\\"50% 50%\\\"},\\n\\t\\t{transform: \\\"translateX(0px) translateY(0px) scale(1)\\\"},\\n\\t\\t{transition: \\\"none\\\"},\\n\\t\\t{zIndex: \\\"0\\\"}\\n\\t]);\\n\\t// We'll move back to the previous or next element in the story\\n\\tvar toWidget = widget.previousSibling();\\n\\tif(!toWidget) {\\n\\t\\ttoWidget = widget.nextSibling();\\n\\t}\\n\\tvar toWidgetDomNode = toWidget && toWidget.findFirstDomNode();\\n\\t// Set up the tiddler we're moving back in\\n\\tif(toWidgetDomNode) {\\n\\t\\tif (toWidgetDomNode.nodeType === Node.TEXT_NODE) {\\n\\t\\t\\tthis.logTextNodeRoot(toWidgetDomNode);\\n\\t\\t\\ttoWidgetDomNode = null;\\n\\t\\t} else {\\n\\t\\t\\t$tw.utils.addClass(toWidgetDomNode,\\\"tc-storyview-zoomin-tiddler\\\");\\n\\t\\t\\t$tw.utils.setStyle(toWidgetDomNode,[\\n\\t\\t\\t\\t{display: \\\"block\\\"},\\n\\t\\t\\t\\t{transformOrigin: \\\"50% 50%\\\"},\\n\\t\\t\\t\\t{transform: \\\"translateX(0px) translateY(0px) scale(10)\\\"},\\n\\t\\t\\t\\t{transition: $tw.utils.roundTripPropertyName(\\\"transform\\\") + \\\" \\\" + duration + \\\"ms \\\" + easing + \\\", opacity \\\" + duration + \\\"ms \\\" + easing},\\n\\t\\t\\t\\t{opacity: \\\"0\\\"},\\n\\t\\t\\t\\t{zIndex: \\\"500\\\"}\\n\\t\\t\\t]);\\n\\t\\t\\tthis.currentTiddlerDomNode = toWidgetDomNode;\\n\\t\\t}\\n\\t}\\n\\t// Animate them both\\n\\t// Force layout\\n\\t$tw.utils.forceLayout(this.listWidget.parentDomNode);\\n\\t// First, the tiddler we're closing\\n\\t$tw.utils.setStyle(targetElement,[\\n\\t\\t{transformOrigin: \\\"50% 50%\\\"},\\n\\t\\t{transform: \\\"translateX(0px) translateY(0px) scale(0.1)\\\"},\\n\\t\\t{transition: $tw.utils.roundTripPropertyName(\\\"transform\\\") + \\\" \\\" + duration + \\\"ms \\\" + easing + \\\", opacity \\\" + duration + \\\"ms \\\" + easing},\\n\\t\\t{opacity: \\\"0\\\"},\\n\\t\\t{zIndex: \\\"0\\\"}\\n\\t]);\\n\\tsetTimeout(removeElement,duration);\\n\\t// Now the tiddler we're going back to\\n\\tif(toWidgetDomNode) {\\n\\t\\t$tw.utils.setStyle(toWidgetDomNode,[\\n\\t\\t\\t{transform: \\\"translateX(0px) translateY(0px) scale(1)\\\"},\\n\\t\\t\\t{opacity: \\\"1\\\"}\\n\\t\\t]);\\n\\t}\\n\\treturn true; // Indicate that we'll delete the DOM node\\n};\\n\\nZoominListView.prototype.logTextNodeRoot = function(node) {\\n\\tthis.textNodeLogger.log($tw.language.getString(\\\"Error/ZoominTextNode\\\") + \\\" \\\" + node.textContent);\\n};\\n\\nexports.zoomin = ZoominListView;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"storyview\"},\"$:/core/modules/syncer.js\":{\"title\":\"$:/core/modules/syncer.js\",\"text\":\"/*\\\\\\ntitle: $
2731:/core/modules/syncer.js\\ntype: application/javascript\\nmodule-type: global\\n\\nThe syncer tracks changes to the store and synchronises them to a remote data store represented as a \\\"sync adaptor\\\"\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nDefaults\\n*/\\nSyncer.prototype.titleIsLoggedIn = \\\"$:/status/IsLoggedIn\\\";\\nSyncer.prototype.titleIsAnonymous = \\\"$:/status/IsAnonymous\\\";\\nSyncer.prototype.titleIsReadOnly = \\\"$:/status/IsReadOnly\\\";\\nSyncer.prototype.titleUserName = \\\"$:/status/UserName\\\";\\nSyncer.prototype.titleSyncFilter = \\\"$:/config/SyncFilter\\\";\\nSyncer.prototype.titleSyncPollingInterval = \\\"$:/config/SyncPollingInterval\\\";\\nSyncer.prototype.titleSyncDisableLazyLoading = \\\"$:/config/SyncDisableLazyLoading\\\";\\nSyncer.prototype.titleSavedNotification = \\\"$:/language/Notifications/Save/Done\\\";\\nSyncer.prototype.titleSyncThrottleInterval = \\\"$:/config/SyncThrottleInterval\\\";\\nSyncer.prototype.taskTimerInterval = 1 * 1000; // Interval for sync timer\\nSyncer.prototype.throttleInterval = 1 * 1000; // Defer saving tiddlers if they've changed in the last 1s...\\nSyncer.prototype.errorRetryInterval = 5 * 1000; // Interval to retry after an error\\nSyncer.prototype.fallbackInterval = 10 * 1000; // Unless the task is older than 10s\\nSyncer.prototype.pollTimerInterval = 60 * 1000; // Interval for polling for changes from the adaptor\\n\\n/*\\nInstantiate the syncer with the following options:\\nsyncadaptor: reference to syncadaptor to be used\\nwiki: wiki to be synced\\n*/\\nfunction Syncer(options) {\\n\\tvar self = this;\\n\\tthis.wiki = options.wiki;\\n\\t// Save parameters\\n\\tthis.syncadaptor = options.syncadaptor;\\n\\tthis.disableUI = !!options.disableUI;\\n\\tthis.titleIsLoggedIn = options.titleIsLoggedIn || this.titleIsLoggedIn;\\n\\tthis.titleUserName = options.titleUserName || this.titleUserName;\\n\\tthis.titleSyncFilter = options.titleSyncFilter || this.titleSyncFilter;\\n\\tthis.titleSavedNotification = options.titleSavedNotification || this.titleSavedNotification;\\n\\tthis.taskTimerInterval = options.taskTimerInterval || this.taskTimerInterval;\\n\\tthis.throttleInterval = options.throttleInterval || parseInt(this.wiki.getTiddlerText(this.titleSyncThrottleInterval,\\\"\\\"),10) || this.throttleInterval;\\n\\tthis.errorRetryInterval = options.errorRetryInterval || this.errorRetryInterval;\\n\\tthis.fallbackInterval = options.fallbackInterval || this.fallbackInterval;\\n\\tthis.pollTimerInterval = options.pollTimerInterval || parseInt(this.wiki.getTiddlerText(this.titleSyncPollingInterval,\\\"\\\"),10) || this.pollTimerInterval;\\n\\tthis.logging = \\\"logging\\\" in options ? options.logging : true;\\n\\t// Make a logger\\n\\tthis.logger = new $tw.utils.Logger(\\\"syncer\\\" + ($tw.browser ? \\\"-browser\\\" : \\\"\\\") + ($tw.node ? \\\"-server\\\" : \\\"\\\")  + (this.syncadaptor.name ? (\\\"-\\\" + this.syncadaptor.name) : \\\"\\\"),{\\n\\t\\tcolour: \\\"cyan\\\",\\n\\t\\tenable: this.logging,\\n\\t\\tsaveHistory: true\\n\\t});\\n\\t// Make another logger for connection errors\\n\\tthis.loggerConnection = new $tw.utils.Logger(\\\"syncer\\\" + ($tw.browser ? \\\"-browser\\\" : \\\"\\\") + ($tw.node ? \\\"-server\\\" : \\\"\\\")  + (this.syncadaptor.name ? (\\\"-\\\" + this.syncadaptor.name) : \\\"\\\") + \\\"-connection\\\",{\\n\\t\\tcolour: \\\"cyan\\\",\\n\\t\\tenable: this.logging\\n\\t});\\n\\t// Ask the syncadaptor to use the main logger\\n\\tif(this.syncadaptor.setLoggerSaveBuffer) {\\n\\t\\tthis.syncadaptor.setLoggerSaveBuffer(this.logger);\\n\\t}\\n\\t// Compile the dirty tiddler filter\\n\\tthis.filterFn = this.wiki.compileFilter(this.wiki.getTiddlerText(this.titleSyncFilter));\\n\\t// Record information for known tiddlers\\n\\tthis.readTiddlerInfo();\\n\\tthis.titlesToBeLoaded = {}; // Hashmap of titles of tiddlers that need loading from the server\\n\\tthis.titlesHaveBeenLazyLoaded = {}; // Hashmap of titles of tiddlers that have already been lazily loaded from the server\\n\\t// Timers\\n\\tthis.taskTimerId = null; // Timer for task dispatch\\n\\tthis.pollTimerId = null; // Timer for polling server\\n\\t// Number of outstanding requests\\n\\tthis.numTasksInProgress = 0;\\n\\t// Listen out for changes to tiddlers\\n\\tthis.wiki.addEventListener(\\\"change\\\",function(ch
2731anges) {\\n\\t\\t// Filter the changes to just include ones that are being synced\\n\\t\\tvar filteredChanges = self.getSyncedTiddlers(function(callback) {\\n\\t\\t\\t$tw.utils.each(changes,function(change,title) {\\n\\t\\t\\t\\tvar tiddler = self.wiki.tiddlerExists(title) && self.wiki.getTiddler(title);\\n\\t\\t\\t\\tcallback(tiddler,title);\\n\\t\\t\\t});\\n\\t\\t});\\n\\t\\tif(filteredChanges.length > 0) {\\n\\t\\t\\tself.processTaskQueue();\\n\\t\\t} else {\\n\\t\\t\\t// Look for deletions of tiddlers we're already syncing\\t\\n\\t\\t\\tvar outstandingDeletion = false\\n\\t\\t\\t$tw.utils.each(changes,function(change,title,object) {\\n\\t\\t\\t\\tif(change.deleted && $tw.utils.hop(self.tiddlerInfo,title)) {\\n\\t\\t\\t\\t\\toutstandingDeletion = true;\\n\\t\\t\\t\\t}\\n\\t\\t\\t});\\n\\t\\t\\tif(outstandingDeletion) {\\n\\t\\t\\t\\tself.processTaskQueue();\\n\\t\\t\\t}\\n\\t\\t}\\n\\t});\\n\\t// Browser event handlers\\n\\tif($tw.browser && !this.disableUI) {\\n\\t\\t// Set up our beforeunload handler\\n\\t\\t$tw.addUnloadTask(function(event) {\\n\\t\\t\\tvar confirmationMessage;\\n\\t\\t\\tif(self.isDirty()) {\\n\\t\\t\\t\\tconfirmationMessage = $tw.language.getString(\\\"UnsavedChangesWarning\\\");\\n\\t\\t\\t\\tevent.returnValue = confirmationMessage; // Gecko\\n\\t\\t\\t}\\n\\t\\t\\treturn confirmationMessage;\\n\\t\\t});\\n\\t\\t// Listen out for login/logout/refresh events in the browser\\n\\t\\t$tw.rootWidget.addEventListener(\\\"tm-login\\\",function(event) {\\n\\t\\t\\tvar username = event && event.paramObject && event.paramObject.username,\\n\\t\\t\\t\\tpassword = event && event.paramObject && event.paramObject.password;\\n\\t\\t\\tif(username && password) {\\n\\t\\t\\t\\t// Login with username and password\\n\\t\\t\\t\\tself.login(username,password,function() {});\\n\\t\\t\\t} else {\\n\\t\\t\\t\\t// No username and password, so we display a prompt\\n\\t\\t\\t\\tself.handleLoginEvent();\\t\\t\\t\\t\\n\\t\\t\\t}\\n\\t\\t});\\n\\t\\t$tw.rootWidget.addEventListener(\\\"tm-logout\\\",function() {\\n\\t\\t\\tself.handleLogoutEvent();\\n\\t\\t});\\n\\t\\t$tw.rootWidget.addEventListener(\\\"tm-server-refresh\\\",function() {\\n\\t\\t\\tself.handleRefreshEvent();\\n\\t\\t});\\n\\t\\t$tw.rootWidget.addEventListener(\\\"tm-copy-syncer-logs-to-clipboard\\\",function() {\\n\\t\\t\\t$tw.utils.copyToClipboard($tw.utils.getSystemInfo() + \\\"\\\\n\\\\nLog:\\\\n\\\" + self.logger.getBuffer());\\n\\t\\t});\\n\\t}\\n\\t// Listen out for lazyLoad events\\n\\tif(!this.disableUI && this.wiki.getTiddlerText(this.titleSyncDisableLazyLoading) !== \\\"yes\\\") {\\n\\t\\tthis.wiki.addEventListener(\\\"lazyLoad\\\",function(title) {\\n\\t\\t\\tself.handleLazyLoadEvent(title);\\n\\t\\t});\\t\\t\\n\\t}\\n\\t// Get the login status\\n\\tthis.getStatus(function(err,isLoggedIn) {\\n\\t\\t// Do a sync from the server\\n\\t\\tself.syncFromServer();\\n\\t});\\n}\\n\\n/*\\nShow a generic network error alert\\n*/\\nSyncer.prototype.displayError = function(msg,err) {\\n\\tif(err === ($tw.language.getString(\\\"Error/XMLHttpRequest\\\") + \\\": 0\\\")) {\\n\\t\\tthis.loggerConnection.alert($tw.language.getString(\\\"Error/NetworkErrorAlert\\\"));\\n\\t\\tthis.logger.log(msg + \\\":\\\",err);\\n\\t} else {\\n\\t\\tthis.logger.alert(msg + \\\":\\\",err);\\n\\t}\\n};\\n\\n/*\\nReturn an array of the tiddler titles that are subjected to syncing\\n*/\\nSyncer.prototype.getSyncedTiddlers = function(source) {\\n\\treturn this.filterFn.call(this.wiki,source);\\n};\\n\\n/*\\nReturn an array of the tiddler titles that are subjected to syncing\\n*/\\nSyncer.prototype.getTiddlerRevision = function(title) {\\n\\tif(this.syncadaptor && this.syncadaptor.getTiddlerRevision) {\\n\\t\\treturn this.syncadaptor.getTiddlerRevision(title);\\n\\t} else {\\n\\t\\treturn this.wiki.getTiddler(title).fields.revision;\\t\\n\\t} \\n};\\n\\n/*\\nRead (or re-read) the latest tiddler info from the store\\n*/\\nSyncer.prototype.readTiddlerInfo = function() {\\n\\t// Hashmap by title of {revision:,changeCount:,adaptorInfo:}\\n\\t// \\\"revision\\\" is the revision of the tiddler last seen on the server, and \\\"changecount\\\" is the corresponding local changecount\\n\\tthis.tiddlerInfo = {};\\n\\t// Record information for known tiddlers\\n\\tvar self = this,\\n\\t\\ttiddlers = this.get
2731SyncedTiddlers();\\n\\t$tw.utils.each(tiddlers,function(title) {\\n\\t\\tvar tiddler = self.wiki.getTiddler(title);\\n\\t\\tif(tiddler) {\\n\\t\\t\\tself.tiddlerInfo[title] = {\\n\\t\\t\\t\\trevision: self.getTiddlerRevision(title),\\n\\t\\t\\t\\tadaptorInfo: self.syncadaptor && self.syncadaptor.getTiddlerInfo(tiddler),\\n\\t\\t\\t\\tchangeCount: self.wiki.getChangeCount(title)\\n\\t\\t\\t};\\n\\t\\t}\\n\\t});\\n};\\n\\n/*\\nChecks whether the wiki is dirty (ie the window shouldn't be closed)\\n*/\\nSyncer.prototype.isDirty = function() {\\n\\tthis.logger.log(\\\"Checking dirty status\\\");\\n\\t// Check tiddlers that are in the store and included in the filter function\\n\\tvar titles = this.getSyncedTiddlers();\\n\\tfor(var index=0; index\u003Ctitles.length; index++) {\\n\\t\\tvar title = titles[index],\\n\\t\\t\\ttiddlerInfo = this.tiddlerInfo[title];\\n\\t\\tif(this.wiki.tiddlerExists(title)) {\\n\\t\\t\\tif(tiddlerInfo) {\\n\\t\\t\\t\\t// If the tiddler is known on the server and has been modified locally then it needs to be saved to the server\\n\\t\\t\\t\\tif(this.wiki.getChangeCount(title) > tiddlerInfo.changeCount) {\\n\\t\\t\\t\\t\\treturn true;\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else {\\n\\t\\t\\t\\t// If the tiddler isn't known on the server then it needs to be saved to the server\\n\\t\\t\\t\\treturn true;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\t// Check tiddlers that are known from the server but not currently in the store\\n\\ttitles = Object.keys(this.tiddlerInfo);\\n\\tfor(index=0; index\u003Ctitles.length; index++) {\\n\\t\\tif(!this.wiki.tiddlerExists(titles[index])) {\\n\\t\\t\\t// There must be a pending delete\\n\\t\\t\\treturn true;\\n\\t\\t}\\n\\t}\\n\\treturn false;\\n};
2731\\n\\n/*\\nUpdate the document body with the class \\\"tc-dirty\\\" if the wiki has unsaved/unsynced changes\\n*/\\nSyncer.prototype.updateDirtyStatus = function() {\\n\\tif($tw.browser && !this.disableUI) {\\n\\t\\tvar dirty = this.isDirty();\\n\\t\\t$tw.utils.toggleClass(document.body,\\\"tc-dirty\\\",dirty);\\n\\t\\tif(!dirty) {\\n\\t\\t\\tthis.loggerConnection.clearAlerts();\\n\\t\\t}\\n\\t}\\n};\\n\\n/*\\nSave an incoming tiddler in the store, and updates the associated tiddlerInfo\\n*/\\nSyncer.prototype.storeTiddler = function(tiddlerFields) {\\n\\t// Save the tiddler\\n\\tvar tiddler = new $tw.Tiddler(tiddlerFields);\\n\\tthis.wiki.addTiddler(tiddler);\\n\\t// Save the tiddler revision and changeCount details\\n\\tthis.tiddlerInfo[tiddlerFields.title] = {\\n\\t\\trevision: this.getTiddlerRevision(tiddlerFields.title),\\n\\t\\tadaptorInfo: this.syncadaptor.getTiddlerInfo(tiddler),\\n\\t\\tchangeCount: this.wiki.getChangeCount(tiddlerFields.title)\\n\\t};\\n};\\n\\nSyncer.prototype.getStatus = function(callback) {\\n\\tvar self = this;\\n\\t// Check if the adaptor supports getStatus()\\n\\tif(this.syncadaptor && this.syncadaptor.getStatus) {\\n\\t\\t// Mark us as not logged in\\n\\t\\tthis.wiki.addTiddler({title: this.titleIsLoggedIn,text: \\\"no\\\"});\\n\\t\\t// Get login status\\n\\t\\tthis.syncadaptor.getStatus(function(err,isLoggedIn,username,isReadOnly,isAnonymous) {\\n\\t\\t\\tif(err) {\\n\\t\\t\\t\\tself.displayError(\\\"Get Status Error\\\",err);\\n\\t\\t\\t} else {\\n\\t\\t\\t\\t// Set the various status tiddlers\\n\\t\\t\\t\\tself.wiki.addTiddler({title: self.titleIsReadOnly,text: isReadOnly ? \\\"yes\\\" : \\\"no\\\"});\\n\\t\\t\\t\\tself.wiki.addTiddler({title: self.titleIsAnonymous,text: isAnonymous ? \\\"yes\\\" : \\\"no\\\"});\\n\\t\\t\\t\\tself.wiki.addTiddler({title: self.titleIsLoggedIn,text: isLoggedIn ? \\\"yes\\\" : \\\"no\\\"});\\n\\t\\t\\t\\tif(isLoggedIn) {\\n\\t\\t\\t\\t\\tself.wiki.addTiddler({title: self.titleUserName,text: username || \\\"\\\"});\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\t// Invoke the callback\\n\\t\\t\\tif(callback) {\\n\\t\\t\\t\\tcallback(err,isLoggedIn,username);\\n\\t\\t\\t}\\n\\t\\t});\\n\\t} else {\\n\\t\\tcallback(null,true,\\\"UNAUTHENTICATED\\\");\\n\\t}\\n};\\n\\n/*\\nSynchronise from the server by reading the skinny tiddler list and queuing up loads for any tiddlers that we don't already have up to date\\n*/\\nSyncer.prototype.syncFromServer = function() {\\n\\tvar self = this,\\n\\t\\tcancelNextSync = function() {\\n\\t\\t\\tif(self.pollTimerId) {\\n\\t\\t\\t\\tclearTimeout(self.pollTimerId);\\n\\t\\t\\t\\tself.pollTimerId = null;\\n\\t\\t\\t}\\n\\t\\t},\\n\\t\\ttriggerNextSync = function() {\\n\\t\\t\\tself.pollTimerId = setTimeout(function() {\\n\\t\\t\\t\\tself.pollTimerId = null;\\n\\t\\t\\t\\tself.syncFromServer.call(self);\\n\\t\\t\\t},self.pollTimerInterval);\\n\\t\\t},\\n\\t\\tsyncSystemFromServer = (self.wiki.getTiddlerText(\\\"$:/config/SyncSystemTiddlersFromServer\\\") === \\\"yes\\\" ? true : false);\\n\\tif(this.syncadaptor && this.syncadaptor.getUpdatedTiddlers) {\\n\\t\\tthis.logger.log(\\\"Retrieving updated tiddler list\\\");\\n\\t\\tcancelNextSync();\\n\\t\\tthis.syncadaptor.getUpdatedTiddlers(self,function(err,updates) {\\n\\t\\t\\ttriggerNextSync();\\n\\t\\t\\tif(err) {\\n\\t\\t\\t\\tself.displayError($tw.language.getString(\\\"Error/RetrievingSkinny\\\"),err);\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\t\\t\\tif(updates) {\\n\\t\\t\\t\\t$tw.utils.each(updates.modifications,function(title) {\\n\\t\\t\\t\\t\\tself.titlesToBeLoaded[title] = true;\\n\\t\\t\\t\\t});\\n\\t\\t\\t\\t$tw.utils.each(updates.deletions,function(title) {\\n\\t\\t\\t\\t\\tif(syncSystemFromServer || !self.wiki.isSystemTiddler(title)) {\\n\\t\\t\\t\\t\\t\\tdelete self.tiddlerInfo[title];\\n\\t\\t\\t\\t\\t\\tself.logger.log(\\\"Deleting tiddler missing from server:\\\",title);\\n\\t\\t\\t\\t\\t\\tself.wiki.deleteTiddler(title);\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t});\\n\\t\\t\\t\\tif(updates.modifications.length > 0 || updates.deletions.length > 0) {\\n\\t\\t\\t\\t\\tself.processTaskQueue();\\n\\t\\t\\t\\t}\\t\\t\\t\\t\\n\\t\\t\\t}\\n\\t\\t});\\n\\t}
2731 else if(this.syncadaptor && this.syncadaptor.getSkinnyTiddlers) {\\n\\t\\tthis.logger.log(\\\"Retrieving skinny tiddler list\\\");\\n\\t\\tcancelNextSync();\\n\\t\\tthis.syncadaptor.getSkinnyTiddlers(function(err,tiddlers) {\\n\\t\\t\\ttriggerNextSync();\\n\\t\\t\\t// Check for errors\\n\\t\\t\\tif(err) {\\n\\t\\t\\t\\tself.displayError($tw.language.getString(\\\"Error/RetrievingSkinny\\\"),err);\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\t\\t\\t// Keep track of which tiddlers we already know about have been reported this time\\n\\t\\t\\tvar previousTitles = Object.keys(self.tiddlerInfo);\\n\\t\\t\\t// Process each incoming tiddler\\n\\t\\t\\tfor(var t=0; t\u003Ctiddlers.length; t++) {\\n\\t\\t\\t\\t// Get the incoming tiddler fields, and the existing tiddler\\n\\t\\t\\t\\tvar tiddlerFields = tiddlers[t],\\n\\t\\t\\t\\t\\tincomingRevision = tiddlerFields.revision + \\\"\\\",\\n\\t\\t\\t\\t\\ttiddler = self.wiki.tiddlerExists(tiddlerFields.title) && self.wiki.getTiddler(tiddlerFields.title),\\n\\t\\t\\t\\t\\ttiddlerInfo = self.tiddlerInfo[tiddlerFields.title],\\n\\t\\t\\t\\t\\tcurrRevision = tiddlerInfo ? tiddlerInfo.revision : null,\\n\\t\\t\\t\\t\\tindexInPreviousTitles = previousTitles.indexOf(tiddlerFields.title);\\n\\t\\t\\t\\tif(indexInPreviousTitles !== -1) {\\n\\t\\t\\t\\t\\tpreviousTitles.splice(indexInPreviousTitles,1);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t// Ignore the incoming tiddler if it's the same as the revision we've already got\\n\\t\\t\\t\\tif(currRevision !== incomingRevision) {\\n\\t\\t\\t\\t\\t// Only load the skinny version if we don't already have a fat version of the tiddler\\n\\t\\t\\t\\t\\tif(!tiddler || tiddler.fields.text === undefined) {\\n\\t\\t\\t\\t\\t\\tself.storeTiddler(tiddlerFields);\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t// Do a full load of this tiddler\\n\\t\\t\\t\\t\\tself.titlesToBeLoaded[tiddlerFields.title] = true;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\t// Delete any tiddlers that were previously reported but missing this time\\n\\t\\t\\t$tw.utils.each(previousTitles,function(title) {\\n\\t\\t\\t\\tif(syncSystemFromServer || !self.wiki.isSystemTiddler(title)) {\\n\\t\\t\\t\\t\\tdelete self.tiddlerInfo[title];\\n\\t\\t\\t\\t\\tself.logger.log(\\\"Deleting tiddler missing from server:\\\",title);\\n\\t\\t\\t\\t\\tself.wiki.deleteTiddler(title);\\n\\t\\t\\t\\t}\\n\\t\\t\\t});\\n\\t\\t\\tself.processTaskQueue();\\n\\t\\t});\\n\\t}\\n};\\n\\n/*\\nForce load a tiddler from the server\\n*/\\nSyncer.prototype.enqueueLoadTiddler = function(title) {\\n\\tthis.titlesToBeLoaded[title] = true;\\n\\tthis.processTaskQueue();\\n};\\n\\n/*\\nLazily load a skinny tiddler if we can\\n*/\\nSyncer.prototype.handleLazyLoadEvent = function(title) {\\n\\t// Ignore if the syncadaptor doesn't handle it\\n\\tif(!this.syncadaptor.supportsLazyLoading) {\\n\\t\\treturn;\\n\\t}\\n\\t// Don't lazy load the same tiddler twice\\n\\tif(!this.titlesHaveBeenLazyLoaded[title]) {\\n\\t\\t// Don't lazy load if the tiddler isn't included in the sync filter\\n\\t\\tif(this.getSyncedTiddlers().indexOf(title) !== -1) {\\n\\t\\t\\t// Mark the tiddler as needing loading, and having already been lazily loaded\\n\\t\\t\\tthis.titlesToBeLoaded[title] = true;\\n\\t\\t\\tthis.titlesHaveBeenLazyLoaded[title] = true;\\n\\t\\t\\tthis.processTaskQueue();\\n\\t\\t}\\n\\t}\\n};\\n\\n/*\\nDispay a password prompt and allow the user to login\\n*/\\nSyncer.prototype.handleLoginEvent = function() {\\n\\tvar self = this;\\n\\tthis.getStatus(function(err,isLoggedIn,username) {\\n\\t\\tif(!err && !isLoggedIn) {\\n\\t\\t\\tif(self.syncadaptor && self.syncadaptor.displayLoginPrompt) {\\n\\t\\t\\t\\tself.syncadaptor.displayLoginPrompt(self);\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tself.displayLoginPrompt();\\n\\t\\t\\t}\\n\\t\\t}\\n\\t});\\n};\\n\\n/*\\nDispay a password prompt\\n*/\\nSyncer.prototype.displayLoginPrompt = function() {\\n\\tvar self = this;\\n\\tvar promptInfo = $tw.passwordPrompt.createPrompt({\\n\\t\\tserviceName: $tw.language.getString(\\\"LoginToTiddlySpace\\\"),\\n\\t\\tcallback: function(data) {\\n\\t\\t\\tself.login(data.username,data.password,function(err,isLoggedIn) {\\n\\t\\t\\t\\tself.syncFromServer();\\n\\t\\t\\t});\\n\\t\\t\\treturn true; // Get rid of the password prompt\\n\\t\\t}\\n\\t});\\n};
2731\\n\\n/*\\nAttempt to login to TiddlyWeb.\\n\\tusername: username\\n\\tpassword: password\\n\\tcallback: invoked with arguments (err,isLoggedIn)\\n*/\\nSyncer.prototype.login = function(username,password,callback) {\\n\\tthis.logger.log(\\\"Attempting to login as\\\",username);\\n\\tvar self = this;\\n\\tif(this.syncadaptor.login) {\\n\\t\\tthis.syncadaptor.login(username,password,function(err) {\\n\\t\\t\\tif(err) {\\n\\t\\t\\t\\treturn callback(err);\\n\\t\\t\\t}\\n\\t\\t\\tself.getStatus(function(err,isLoggedIn,username) {\\n\\t\\t\\t\\tif(callback) {\\n\\t\\t\\t\\t\\tcallback(err,isLoggedIn);\\n\\t\\t\\t\\t}\\n\\t\\t\\t});\\n\\t\\t});\\n\\t} else {\\n\\t\\tcallback(null,true);\\n\\t}\\n};\\n\\n/*\\nAttempt to log out of TiddlyWeb\\n*/\\nSyncer.prototype.handleLogoutEvent = function() {\\n\\tthis.logger.log(\\\"Attempting to logout\\\");\\n\\tvar self = this;\\n\\tif(this.syncadaptor.logout) {\\n\\t\\tthis.syncadaptor.logout(function(err) {\\n\\t\\t\\tif(err) {\\n\\t\\t\\t\\tself.displayError(\\\"Logout Error\\\",err);\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tself.getStatus();\\n\\t\\t\\t}\\n\\t\\t});\\n\\t}\\n};\\n\\n/*\\nImmediately refresh from the server\\n*/\\nSyncer.prototype.handleRefreshEvent = function() {\\n\\tthis.syncFromServer();\\n};\\n\\n/*\\nProcess the next task\\n*/\\nSyncer.prototype.processTaskQueue = function() {\\n\\tvar self = this;\\n\\t// Only process a task if the sync adaptor is fully initialised and we're not already performing\\n\\t// a task. If we are already performing a task then we'll dispatch the next one when it completes\\n\\tif((!this.syncadaptor.isReady || this.syncadaptor.isReady()) && this.numTasksInProgress === 0) {\\n\\t\\t// Choose the next task to perform\\n\\t\\tvar task = this.chooseNextTask();\\n\\t\\t// Perform the task if we had one\\n\\t\\tif(typeof task === \\\"object\\\" && task !== null) {\\n\\t\\t\\tthis.numTasksInProgress += 1;\\n\\t\\t\\ttask.run(function(err) {\\n\\t\\t\\t\\tself.numTasksInProgress -= 1;\\n\\t\\t\\t\\tif(err) {\\n\\t\\t\\t\\t\\tself.displayError(\\\"Sync error while processing \\\" + task.type + \\\" of '\\\" + task.title + \\\"'\\\",err);\\n\\t\\t\\t\\t\\tself.updateDirtyStatus();\\n\\t\\t\\t\\t\\tself.triggerTimeout(self.errorRetryInterval);\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tself.updateDirtyStatus();\\n\\t\\t\\t\\t\\t// Process the next task\\n\\t\\t\\t\\t\\tself.processTaskQueue.call(self);\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t}\\n\\t\\t\\t});\\n\\t\\t} else {\\n\\t\\t\\t// No task is ready so update the status\\n\\t\\t\\tthis.updateDirtyStatus();\\n\\t\\t\\t// And trigger a timeout if there is a pending task\\n\\t\\t\\tif(task === true) {\\n\\t\\t\\t\\tthis.triggerTimeout();\\t\\t\\t\\t\\n\\t\\t\\t}\\n\\t\\t}\\n\\t} else {\\n\\t\\tthis.updateDirtyStatus();\\t\\t\\n\\t}\\n};\\n\\nSyncer.prototype.triggerTimeout = function(interval) {\\n\\tvar self = this;\\n\\tif(!this.taskTimerId) {\\n\\t\\tthis.taskTimerId = setTimeout(function() {\\n\\t\\t\\tself.taskTimerId = null;\\n\\t\\t\\tself.processTaskQueue.call(self);\\n\\t\\t},interval || self.taskTimerInterval);\\n\\t}\\n};\\n\\n/*\\nChoose the next sync task. We prioritise saves, then deletes, then loads from the server\\n\\nReturns either a task object, null if there's no upcoming tasks, or the boolean true if there are pending tasks that aren't yet due\\n*/\\nSyncer.prototype.chooseNextTask = function() {\\n\\tvar thresholdLastSaved = (new Date()) - this.throttleInterval,\\n\\t\\thavePending = null;\\n\\t// First we look for tiddlers that have been modified locally and need saving back to the server\\n\\tvar titles = this.getSyncedTiddlers();\\n\\tfor(var index=0; index\u003Ctitles.length; index++) {\\n\\t\\tvar title = titles[index],\\n\\t\\t\\ttiddler = this.wiki.tiddlerExists(title) && this.wiki.getTiddler(title),\\n\\t\\t\\ttiddlerInfo = this.tiddlerInfo[title];\\n\\t\\tif(tiddler) {\\n\\t\\t\\t// If the tiddler is not known on the server, or has been modified locally no more recently than the threshold then it needs to be saved to the server\\n\\t\\t\\tvar hasChanged = !tiddlerInfo || this.wiki.getChangeCount(title) > tiddlerInfo.changeCount,\\n\\t\\t\\t\\tisReadyToSave = !tiddlerInfo || !tiddlerInfo.timestampLastSaved || tiddlerInfo.timestampLastSaved \u003C thresholdLastSaved;\\n\\t\\t\\tif(hasChanged) {\\n\\t\\t\\t\\tif(isReadyToSave) {\\n\\t\\t\\t\\t\\treturn new SaveTiddlerTask(this,title); \\t\\t\\t\\t\\t\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\thavePending = true;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\t// Second, we check tiddlers that are known from the server but not currently in the store, and so need deleting on the server\\n\\ttitles = Object.keys(this.tiddlerInfo);\\n\\tfor(index=0; index\u003Ctitles.length; index++) {\\n\\t\\ttitle = titles[index];\\n\\t\\ttiddlerInfo = this.tiddlerInfo[title];\\n\\t\\ttiddler = this.wiki.tiddlerExists(title) && this.wiki.getTiddler(title);\\n\\t\\tif(!tiddler) {\\n\\t\\t\\treturn new DeleteTiddlerTask(this,title);\\n\\t\\t}\\n\\t}\\n\\t// Check for tiddlers that need loading\\n\\ttitle = Object.keys(this.titlesToBeLoaded)[0];\\n\\tif(title) {\\n\\t\\tdelete this.titlesToBeLoaded[title];\\n\\t\\treturn new LoadTiddlerTask(this,title);\\n\\t}\\n\\t// No tasks are ready\\n\\treturn havePending;\\n};\\n\\nfunction SaveTiddlerTask(syncer,title) {\\n\\tthis.syncer = syncer;\\n\\tthis.title = title;\\n\\tthis.type = \\\"save\\\";\\n}\\n\\nSaveTiddlerTask.prototype.run = function(callback) {\\n\\tvar self = this,\\n\\t\\tchangeCount = this.syncer.wiki.getChangeCount(this.title),\\n\\t\\ttiddler = this.syncer.wiki.tiddlerExists(this.title) && this.syncer.wiki.getTiddler(this.title);\\n\\tthis.syncer.logger.log(\\\"Dispatching 'save' task:\\\",this.title);
2731\\n\\tif(tiddler) {\\n\\t\\tthis.syncer.syncadaptor.saveTiddler(tiddler,function(err,adaptorInfo,revision) {\\n\\t\\t\\t// If there's an error, exit without changing any internal state\\n\\t\\t\\tif(err) {\\n\\t\\t\\t\\treturn callback(err);\\n\\t\\t\\t}\\n\\t\\t\\t// Adjust the info stored about this tiddler\\n\\t\\t\\tself.syncer.tiddlerInfo[self.title] = {\\n\\t\\t\\t\\tchangeCount: changeCount,\\n\\t\\t\\t\\tadaptorInfo: adaptorInfo,\\n\\t\\t\\t\\trevision: revision,\\n\\t\\t\\t\\ttimestampLastSaved: new Date()\\n\\t\\t\\t};\\n\\t\\t\\t// Invoke the callback\\n\\t\\t\\tcallback(null);\\n\\t\\t},{\\n\\t\\t\\ttiddlerInfo: self.syncer.tiddlerInfo[self.title]\\n\\t\\t});\\n\\t} else {\\n\\t\\tthis.syncer.logger.log(\\\" Not Dispatching 'save' task:\\\",this.title,\\\"tiddler does not exist\\\");\\n\\t\\t$tw.utils.nextTick(callback(null));\\n\\t}\\n};\\n\\nfunction DeleteTiddlerTask(syncer,title) {\\n\\tthis.syncer = syncer;\\n\\tthis.title = title;\\n\\tthis.type = \\\"delete\\\";\\n}\\n\\nDeleteTiddlerTask.prototype.run = function(callback) {\\n\\tvar self = this;\\n\\tthis.syncer.logger.log(\\\"Dispatching 'delete' task:\\\",this.title);\\n\\tthis.syncer.syncadaptor.deleteTiddler(this.title,function(err) {\\n\\t\\t// If there's an error, exit without changing any internal state\\n\\t\\tif(err) {\\n\\t\\t\\treturn callback(err);\\n\\t\\t}\\n\\t\\t// Remove the info stored about this tiddler\\n\\t\\tdelete self.syncer.tiddlerInfo[self.title];\\n\\t\\t// Invoke the callback\\n\\t\\tcallback(null);\\n\\t},{\\n\\t\\ttiddlerInfo: self.syncer.tiddlerInfo[this.title]\\n\\t});\\n};\\n\\nfunction LoadTiddlerTask(syncer,title) {\\n\\tthis.syncer = syncer;\\n\\tthis.title = title;\\n\\tthis.type = \\\"load\\\";\\n}\\n\\nLoadTiddlerTask.prototype.run = function(callback) {\\n\\tvar self = this;\\n\\tthis.syncer.logger.log(\\\"Dispatching 'load' task:\\\",this.title);\\n\\tthis.syncer.syncadaptor.loadTiddler(this.title,function(err,tiddlerFields) {\\n\\t\\t// If there's an error, exit without changing any internal state\\n\\t\\tif(err) {\\n\\t\\t\\treturn callback(err);\\n\\t\\t}\\n\\t\\t// Update the info stored about this tiddler\\n\\t\\tif(tiddlerFields) {\\n\\t\\t\\tself.syncer.storeTiddler(tiddlerFields);\\n\\t\\t}\\n\\t\\t// Invoke the callback\\n\\t\\tcallback(null);\\n\\t});\\n};\\n\\nexports.Syncer = Syncer;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"global\"},\"$:/core/modules/tiddler.js\":{\"title\":\"$:/core/modules/tiddler.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/tiddler.js\\ntype: application/javascript\\nmodule-type: tiddlermethod\\n\\nExtension methods for the $tw.Tiddler object (constructor and methods required at boot time are in boot/boot.js)\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.hasTag = function(tag) {\\n\\treturn this.fields.tags && this.fields.tags.indexOf(tag) !== -1;\\n};\\n\\nexports.isPlugin = function() {\\n\\treturn this.fields.type === \\\"application/json\\\" && this.hasField(\\\"plugin-type\\\");\\n};\\n\\nexports.isDraft = function() {\\n\\treturn this.hasField(\\\"draft.of\\\");\\n};\\n\\nexports.getFieldString = function(field,defaultValue) {\\n\\tvar value = this.fields[field];\\n\\t// Check for a missing field\\n\\tif(value === undefined || value === null) {\\n\\t\\treturn defaultValue || \\\"\\\";\\n\\t}\\n\\t// Stringify the field with the associated tiddler field module (if any)\\n\\tvar fieldModule = $tw.Tiddler.fieldModules[field];\\n\\tif(fieldModule && fieldModule.stringify) {\\n\\t\\treturn fieldModule.stringify.call(this,value);\\n\\t} else {\\n\\t\\treturn value.toString();\\n\\t}\\n};\\n\\n/*\\nGet the value of a field as a list\\n*/\\nexports.getFieldList = function(field) {\\n\\tvar value = this.fields[field];\\n\\t// Check for a missing field\\n\\tif(value === undefined || value === null) {\\n\\t\\treturn [];\\n\\t}\\n\\treturn $tw.utils.parseStringArray(value);\\n};\\n\\n/*\\nGet all the fields as a hashmap of strings. Options:\\n\\texclude: an array of field names to exclude\\n*/\\nexports.getFieldStrings = function(options) {\\n\\toptions = options || {};\\n\\tvar exclude = options.exclude || [];\\n\\tvar fields = {};\\n\\tfor(var field in this.fields) {\\n\\t\\tif($tw.utils.hop(this.fields,field)) {\\n\\t\\t\\tif(exclude.indexOf(field) === -1) {\\n\\t\\t\\t\\tfields[field] = this.getFieldString(field);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\treturn fields;\\n};
2731\\n\\n/*\\nGet all the fields as a name:value block. Options:\\n\\texclude: an array of field names to exclude\\n*/\\nexports.getFieldStringBlock = function(options) {\\n\\toptions = options || {};\\n\\tvar exclude = options.exclude || [],\\n\\t\\tfields = Object.keys(this.fields).sort(),\\n\\t\\tresult = [];\\n\\tfor(var t=0; t\u003Cfields.length; t++) {\\n\\t\\tvar field = fields[t];\\n\\t\\tif(exclude.indexOf(field) === -1) {\\n\\t\\t\\tresult.push(field + \\\": \\\" + this.getFieldString(field));\\n\\t\\t}\\n\\t}\\n\\treturn result.join(\\\"\\\\n\\\");\\n};\\n\\nexports.getFieldDay = function(field) {\\n\\tif(this.cache && this.cache.day && $tw.utils.hop(this.cache.day,field) ) {\\n\\t\\treturn this.cache.day[field];\\n\\t}\\n\\tvar day = \\\"\\\";\\n\\tif(this.fields[field]) {\\n\\t\\tday = (new Date($tw.utils.parseDate(this.fields[field]))).setHours(0,0,0,0);\\n\\t}\\n\\tthis.cache.day = this.cache.day || {};\\n\\tthis.cache.day[field] = day;\\n\\treturn day;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"tiddlermethod\"},\"$:/core/modules/upgraders/plugins.js\":{\"title\":\"$:/core/modules/upgraders/plugins.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/upgraders/plugins.js\\ntype: application/javascript\\nmodule-type: upgrader\\n\\nUpgrader module that checks that plugins are newer than any already installed version\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar UPGRADE_LIBRARY_TITLE = \\\"$:/UpgradeLibrary\\\";\\n\\nvar BLOCKED_PLUGINS = {\\n\\t\\\"$:/themes/tiddlywiki/stickytitles\\\": {\\n\\t\\tversions: [\\\"*\\\"]\\n\\t},\\n\\t\\\"$:/plugins/tiddlywiki/fullscreen\\\": {\\n\\t\\tversions: [\\\"*\\\"]\\n\\t}\\n};\\n\\nexports.upgrade = function(wiki,titles,tiddlers) {\\n\\tvar self = this,\\n\\t\\tmessages = {},\\n\\t\\tupgradeLibrary,\\n\\t\\tgetLibraryTiddler = function(title) {\\n\\t\\t\\tif(!upgradeLibrary) {\\n\\t\\t\\t\\tupgradeLibrary = wiki.getTiddlerData(UPGRADE_LIBRARY_TITLE,{});\\n\\t\\t\\t\\tupgradeLibrary.tiddlers = upgradeLibrary.tiddlers || {};\\n\\t\\t\\t}\\n\\t\\t\\treturn upgradeLibrary.tiddlers[title];\\n\\t\\t};\\n\\n\\t// Go through all the incoming tiddlers\\n\\t$tw.utils.each(titles,function(title) {\\n\\t\\tvar incomingTiddler = tiddlers[title];\\n\\t\\t// Check if we're dealing with a plugin\\n\\t\\tif(incomingTiddler && incomingTiddler[\\\"plugin-type\\\"]) {\\n\\t\\t\\t// Check whether the plugin contains JS modules\\n\\t\\t\\tvar requiresReload = wiki.doesPluginInfoRequireReload($tw.utils.parseJSONSafe(incomingTiddler.text)) ? (wiki.getTiddlerText(\\\"$:/language/ControlPanel/Plugins/PluginWillRequireReload\\\") + \\\" \\\") : \\\"\\\";\\n\\t\\t\\tmessages[title] = requiresReload;\\n\\t\\t\\tif(incomingTiddler.version) {\\n\\t\\t\\t\\t// Upgrade the incoming plugin if it is in the upgrade library\\n\\t\\t\\t\\tvar libraryTiddler = getLibraryTiddler(title);\\n\\t\\t\\t\\tif(libraryTiddler && libraryTiddler[\\\"plugin-type\\\"] && libraryTiddler.version) {\\n\\t\\t\\t\\t\\ttiddlers[title] = libraryTiddler;\\n\\t\\t\\t\\t\\tmessages[title] = requiresReload + $tw.language.getString(\\\"Import/Upgrader/Plugins/Upgraded\\\",{variables: {incoming: incomingTiddler.version, upgraded: libraryTiddler.version}});\\n\\t\\t\\t\\t\\treturn;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t// Suppress the incoming plugin if it is older than the currently installed one\\n\\t\\t\\t\\tvar existingTiddler = wiki.getTiddler(title);\\n\\t\\t\\t\\tif(existingTiddler && existingTiddler.hasField(\\\"plugin-type\\\") && existingTiddler.hasField(\\\"version\\\")) {\\n\\t\\t\\t\\t\\t// Reject the incoming plugin by blanking all its fields\\n\\t\\t\\t\\t\\tif($tw.utils.checkVersions(existingTiddler.fields.version,incomingTiddler.version)) {\\n\\t\\t\\t\\t\\t\\ttiddlers[title] = Object.create(null);\\n\\t\\t\\t\\t\\t\\tmessages[title] = $tw.language.getString(\\\"Import/Upgrader/Plugins/Suppressed/Version\\\",{variables: {incoming: incomingTiddler.version, existing: existingTiddler.fields.version}});\\n\\t\\t\\t\\t\\t\\treturn;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\t// Check whether the plugin is on the blocked list\\n\\t\\t\\tvar blockInfo = BLOCKED_PLUGINS[title];\\n\\t\\t\\tif(blockInfo) {\\n\\t\\t\\t\\tif(blockInfo.versions.indexOf(\\\"*\\\") !== -1 || (incomingTiddler.version && blockInfo.versions.indexOf(incomingTiddler.version) !== -1)) {\\n\\t\\t\\t\\t\\ttiddlers[title] = Object.create(null);\\n\\t\\t\\t\\t\\tmessages[title] = $tw.language.getString(\\\"Import/Upgrader/Plugins/Suppressed/Incompatible\\\");\\n\\t\\t\\t\\t\\treturn;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t});\\n\\treturn messages;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"upgrader\"},\"$:/core/modules/upgraders/system.js\":{\"title\":\"$:/core/modules/upgraders/system.js\",\"text\":\"/*\\\\\\ntitle: $
2731:/core/modules/upgraders/system.js\\ntype: application/javascript\\nmodule-type: upgrader\\n\\nUpgrader module that suppresses certain system tiddlers that shouldn't be imported\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar DONT_IMPORT_LIST = [\\\"$:/Import\\\"],\\n\\tUNSELECT_PREFIX_LIST = [\\\"$:/temp/\\\",\\\"$:/state/\\\",\\\"$:/StoryList\\\",\\\"$:/HistoryList\\\"],\\n\\tWARN_IMPORT_PREFIX_LIST = [\\\"$:/core/modules/\\\"];\\n\\nexports.upgrade = function(wiki,titles,tiddlers) {\\n\\tvar self = this,\\n\\t\\tmessages = {},\\n\\t\\tshowAlert = false;\\n\\t// Check for tiddlers on our list\\n\\t$tw.utils.each(titles,function(title) {\\n\\t\\tif(DONT_IMPORT_LIST.indexOf(title) !== -1) {\\n\\t\\t\\ttiddlers[title] = Object.create(null);\\n\\t\\t\\tmessages[title] = $tw.language.getString(\\\"Import/Upgrader/System/Suppressed\\\");\\n\\t\\t} else {\\n\\t\\t\\tfor(var t=0; t\u003CUNSELECT_PREFIX_LIST.length; t++) {\\n\\t\\t\\t\\tvar prefix = UNSELECT_PREFIX_LIST[t];\\n\\t\\t\\t\\tif(title.substr(0,prefix.length) === prefix) {\\n\\t\\t\\t\\t\\tmessages[title] = $tw.language.getString(\\\"Import/Upgrader/Tiddler/Unselected\\\");\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\tfor(var t=0; t\u003CWARN_IMPORT_PREFIX_LIST.length; t++) {\\n\\t\\t\\t\\tvar prefix = WARN_IMPORT_PREFIX_LIST[t];\\n\\t\\t\\t\\tif(title.substr(0,prefix.length) === prefix && wiki.isShadowTiddler(title)) {\\n\\t\\t\\t\\t\\tshowAlert = true;\\n\\t\\t\\t\\t\\tmessages[title] = $tw.language.getString(\\\"Import/Upgrader/System/Warning\\\");\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t});\\n\\tif(showAlert) {\\n\\t\\tvar logger = new $tw.utils.Logger(\\\"import\\\");\\n\\t\\tlogger.alert($tw.language.getString(\\\"Import/Upgrader/System/Alert\\\"));\\n\\t}\\n\\treturn messages;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"upgrader\"},\"$:/core/modules/upgraders/themetweaks.js\":{\"title\":\"$:/core/modules/upgraders/themetweaks.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/upgraders/themetweaks.js\\ntype: application/javascript\\nmodule-type: upgrader\\n\\nUpgrader module that handles the change in theme tweak storage introduced in 5.0.14-beta.\\n\\nPreviously, theme tweaks were stored in two data tiddlers:\\n\\n* $:/themes/tiddlywiki/vanilla/metrics\\n* $:/themes/tiddlywiki/vanilla/settings\\n\\nNow, each tweak is stored in its own separate tiddler.\\n\\nThis upgrader copies any values from the old format to the new. The old data tiddlers are not deleted in case they have been used to store additional indexes.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar MAPPINGS = {\\n\\t\\\"$:/themes/tiddlywiki/vanilla/metrics\\\": {\\n\\t\\t\\\"fontsize\\\": \\\"$:/themes/tiddlywiki/vanilla/metrics/fontsize\\\",\\n\\t\\t\\\"lineheight\\\": \\\"$:/themes/tiddlywiki/vanilla/metrics/lineheight\\\",\\n\\t\\t\\\"storyleft\\\": \\\"$:/themes/tiddlywiki/vanilla/metrics/storyleft\\\",\\n\\t\\t\\\"storytop\\\": \\\"$:/themes/tiddlywiki/vanilla/metrics/storytop\\\",\\n\\t\\t\\\"storyright\\\": \\\"$:/themes/tiddlywiki/vanilla/metrics/storyright\\\",\\n\\t\\t\\\"storywidth\\\": \\\"$:/themes/tiddlywiki/vanilla/metrics/storywidth\\\",\\n\\t\\t\\\"tiddlerwidth\\\": \\\"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth\\\"\\n\\t},\\n\\t\\\"$:/themes/tiddlywiki/vanilla/settings\\\": {\\n\\t\\t\\\"fontfamily\\\": \\\"$:/themes/tiddlywiki/vanilla/settings/fontfamily\\\"\\n\\t}\\n};\\n\\nexports.upgrade = function(wiki,titles,tiddlers) {\\n\\tvar self = this,\\n\\t\\tmessages = {};\\n\\t// Check for tiddlers on our list\\n\\t$tw.utils.each(titles,function(title) {\\n\\t\\tvar mapping = MAPPINGS[title];\\n\\t\\tif(mapping) {\\n\\t\\t\\tvar tiddler = new $tw.Tiddler(tiddlers[title]),\\n\\t\\t\\t\\ttiddlerData = wiki.getTiddlerDataCached(tiddler,{});\\n\\t\\t\\tfor(var index in mapping) {\\n\\t\\t\\t\\tvar mappedTitle = mapping[index];\\n\\t\\t\\t\\tif(!tiddlers[mappedTitle] || tiddlers[mappedTitle].title !== mappedTitle) {\\n\\t\\t\\t\\t\\ttiddlers[mappedTitle] = {\\n\\t\\t\\t\\t\\t\\ttitle: mappedTitle,\\n\\t\\t\\t\\t\\t\\ttext: tiddlerData[index]\\n\\t\\t\\t\\t\\t};\\n\\t\\t\\t\\t\\tmessages[mappedTitle] = $tw.language.getString(\\\"Import/Upgrader/ThemeTweaks/Created\\\",{variables: {\\n\\t\\t\\t\\t\\t\\tfrom: title + \\\"##\\\" + index\\n\\t\\t\\t\\t\\t}});\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t});\\n\\treturn messages;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"upgrader\"},\"$:/core/modules/utils/base64-utf8/base64-utf8.module.js\":{\"text\":\"(function(){// From https://gist.github.com/Nijikokun/5192472\\n//\\n// UTF8 Module\\n//\\n// Cleaner and modularized utf-8 encoding and decoding library for javascript.\\n//\\n// copyright: MIT\\n// author: Nijiko Yonskai, @nijikokun, [email protected]\\n!function(r,e,o,t){void 0!==o.module&&o.module.exports?o.module.exports=e.apply(o):void 0!==o.define&&\\\"function\\\"===o.define&&o.define.amd?define(\\\"utf8\\\",[],e):o.utf8=e.apply(o)}(0,function(){return{encode:function(r){if(\\\"string\\\"!=typeof r)return r;r=r.replace(/\\\\r\\\\n/g,\\\"\\\\n\\\");for(var e,o=\\\"\\\",t=0;t\u003Cr.length;t++)if((e=r.charCodeAt(t))\u003C128)o+=String.fromCharCode(e);else if(e>127&&e\u003C2048)o+=String.fromCharCode(e>>6|192),o+=String.fromCharCode(63&e|128);else if(e>55295&&e\u003C57344&&r.length>t+1){var i=e,n=r.charCodeAt(t+1);t++;var d=65536+(i-55296\u003C\u003C10|n-56320);o+=String.fromCharCode(d>>18|240),o+=String.fromCharCode(d>>12&63|128),o+=String.fromCharCode(d>>6&63|128),o+=String.fromCharCode(63&d|128)}else o+=String.fromCharCode(e>>12|224),o+=String.fromCharCode(e>>6&63|128),o+=String.fromCharCode(63&e|128);return o},decode:function(r){if(\\\"string\\\"!=typeof r)return r;for(var e=\\\"\\\",o=0,t=0;o\u003Cr.length;)if((t=r.charCodeAt(o))\u003C128)e+=String.fromCharCode(t),o++;else if(t>191&&t\u003C224)e+=String.fromCharCode((31&t)\u003C\u003C6|63&r.charCodeAt(o+1)),o+=2;else if(t>
2731223&&t\u003C240)e+=String.fromCharCode((15&t)\u003C\u003C12|(63&r.charCodeAt(o+1))\u003C\u003C6|63&r.charCodeAt(o+2)),o+=3;else{var i=(7&t)\u003C\u003C18|(63&r.charCodeAt(o+1))\u003C\u003C12|(63&r.charCodeAt(o+2))\u003C\u003C6|63&r.charCodeAt(o+3);e+=String.fromCharCode(55296+(i-65536>>10))+String.fromCharCode(56320+(i-65536&1023)),o+=4}return e}}},this),function(r,e,o,t){if(void 0!==o.module&&o.module.exports){if(t&&o.require)for(var i=0;i\u003Ct.length;i++)o[t[i]]=o.require(t[i]);o.module.exports=e.apply(o)}else void 0!==o.define&&\\\"function\\\"===o.define&&o.define.amd?define(\\\"base64\\\",t||[],e):o.base64=e.apply(o)}(0,function(r){var e=r||this.utf8,o=\\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\\\";return{encode:function(r){if(void 0===e)throw{error:\\\"MissingMethod\\\",message:\\\"UTF8 Module is missing.\\\"};if(\\\"string\\\"!=typeof r)return r;r=e.encode(r);for(var t,i,n,d,f,a,h,C=\\\"\\\",c=0;c\u003Cr.length;)d=(t=r.charCodeAt(c++))>>2,f=(3&t)\u003C\u003C4|(i=r.charCodeAt(c++))>>4,a=(15&i)\u003C\u003C2|(n=r.charCodeAt(c++))>>6,h=63&n,isNaN(i)?a=h=64:isNaN(n)&&(h=64),C+=o.charAt(d)+o.charAt(f)+o.charAt(a)+o.charAt(h);return C},decode:function(r){if(void 0===e)throw{error:\\\"MissingMethod\\\",message:\\\"UTF8 Module is missing.\\\"};if(\\\"string\\\"!=typeof r)return r;r=r.replace(/[^A-Za-z0-9\\\\+\\\\/\\\\=]/g,\\\"\\\");for(var t,i,n,d,f,a,h=\\\"\\\",C=0;C\u003Cr.length;)t=o.indexOf(r.charAt(C++))\u003C\u003C2|(d=o.indexOf(r.charAt(C++)))>>4,i=(15&d)\u003C\u003C4|(f=o.indexOf(r.charAt(C++)))>>2,n=(3&f)\u003C\u003C6|(a=o.indexOf(r.charAt(C++))),h+=String.fromCharCode(t),64!=f&&(h+=String.fromCharCode(i)),64!=a&&(h+=String.fromCharCode(n));return e.decode(h)}}},this,[\\\"utf8\\\"]);}).call(exports);\",\"type\":\"application/javascript\",\"title\":\"$:/core/modules/utils/base64-utf8/base64-utf8.module.js\",\"module-type\":\"library\"},\"$:/core/modules/utils/crypto.js\":{\"title\":\"$:/core/modules/utils/crypto.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/utils/crypto.js\\ntype: application/javascript\\nmodule-type: utils\\n\\nUtility functions related to crypto.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nLook for an encrypted store area in the text of a TiddlyWiki file\\n*/\\nexports.extractEncryptedStoreArea = function(text) {\\n\\tvar encryptedStoreAreaStartMarker = \\\"\u003Cpre id=\\\\\\\"encryptedStoreArea\\\\\\\" type=\\\\\\\"text/plain\\\\\\\" style=\\\\\\\"display:none;\\\\\\\">\\\",\\n\\t\\tencryptedStoreAreaStart = text.indexOf(encryptedStoreAreaStartMarker);\\n\\tif(encryptedStoreAreaStart !== -1) {\\n\\t\\tvar encryptedStoreAreaEnd = text.indexOf(\\\"\u003C/pre>\\\",encryptedStoreAreaStart);\\n\\t\\tif(encryptedStoreAreaEnd !== -1) {\\n\\t\\t\\treturn $tw.utils.htmlDecode(text.substring(encryptedStoreAreaStart + encryptedStoreAreaStartMarker.length,encryptedStoreAreaEnd));\\n\\t\\t}\\n\\t}\\n\\treturn null;\\n};
2731\\n\\n/*\\nAttempt to extract the tiddlers from an encrypted store area using the current password. If the password is not provided then the password in the password store will be used\\n*/\\nexports.decryptStoreArea = function(encryptedStoreArea,password) {\\n\\tvar decryptedText = $tw.crypto.decrypt(encryptedStoreArea,password);\\n\\tif(decryptedText) {\\n\\t\\tvar json = $tw.utils.parseJSONSafe(decryptedText),\\n\\t\\t\\ttiddlers = [];\\n\\t\\tfor(var title in json) {\\n\\t\\t\\tif(title !== \\\"$:/isEncrypted\\\") {\\n\\t\\t\\t\\ttiddlers.push(json[title]);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\treturn tiddlers;\\n\\t} else {\\n\\t\\treturn null;\\n\\t}\\n};\\n\\n\\n/*\\nAttempt to extract the tiddlers from an encrypted store area using the current password. If that fails, the user is prompted for a password.\\nencryptedStoreArea: text of the TiddlyWiki encrypted store area\\ncallback: function(tiddlers) called with the array of decrypted tiddlers\\n\\nThe following configuration settings are supported:\\n\\n$tw.config.usePasswordVault: causes any password entered by the user to also be put into the system password vault\\n*/\\nexports.decryptStoreAreaInteractive = function(encryptedStoreArea,callback,options) {\\n\\t// Try to decrypt with the current password\\n\\tvar tiddlers = $tw.utils.decryptStoreArea(encryptedStoreArea);\\n\\tif(tiddlers) {\\n\\t\\tcallback(tiddlers);\\n\\t} else {\\n\\t\\t// Prompt for a new password and keep trying\\n\\t\\t$tw.passwordPrompt.createPrompt({\\n\\t\\t\\tserviceName: \\\"Enter a password to decrypt the imported TiddlyWiki\\\",\\n\\t\\t\\tnoUserName: true,\\n\\t\\t\\tcanCancel: true,\\n\\t\\t\\tsubmitText: \\\"Decrypt\\\",\\n\\t\\t\\tcallback: function(data) {\\n\\t\\t\\t\\t// Exit if the user cancelled\\n\\t\\t\\t\\tif(!data) {\\n\\t\\t\\t\\t\\treturn false;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t// Attempt to decrypt the tiddlers\\n\\t\\t\\t\\tvar tiddlers = $tw.utils.decryptStoreArea(encryptedStoreArea,data.password);\\n\\t\\t\\t\\tif(tiddlers) {\\n\\t\\t\\t\\t\\tif($tw.config.usePasswordVault) {\\n\\t\\t\\t\\t\\t\\t$tw.crypto.setPassword(data.password);\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tcallback(tiddlers);\\n\\t\\t\\t\\t\\t// Exit and remove the password prompt\\n\\t\\t\\t\\t\\treturn true;\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t// We didn't decrypt everything, so continue to prompt for password\\n\\t\\t\\t\\t\\treturn false;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t});\\n\\t}\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"utils\"},\"$:/core/modules/utils/csv.js\":{\"title\":\"$:/core/modules/utils/csv.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/utils/csv.js\\ntype: application/javascript\\nmodule-type: utils\\n\\nA barebones CSV parser\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar QUOTE = '\\\"';\\n\\nvar getCellInfo = function(text, start, length, SEPARATOR) {\\n\\tvar isCellQuoted = text.charAt(start) === QUOTE;\\n\\tvar cellStart = isCellQuoted ? start + 1 : start;\\n\\t\\n\\tif (text.charAt(i) === SEPARATOR) {\\n\\t\\treturn [cellStart, cellStart, false];\\n\\t}\\n\\t\\n\\tfor (var i = cellStart; i \u003C length; i++) {\\n\\t\\tvar cellCharacter = text.charAt(i);\\n\\t\\tvar isEOL = cellCharacter === \\\"\\\\n\\\" || cellCharacter === \\\"\\\\r\\\";\\n\\t\\t\\n\\t\\tif (isEOL && !isCellQuoted) {\\n\\t\\t\\treturn [cellStart, i, false];\\n\\t\\t\\t\\n\\t\\t} else if (cellCharacter === SEPARATOR && !isCellQuoted) {\\n\\t\\t\\treturn [cellStart, i, false];\\n\\t\\t\\t\\n\\t\\t} else if (cellCharacter === QUOTE && isCellQuoted) {\\n\\t\\t\\tvar nextCharacter = i + 1 \u003C length ? text.charAt(i + 1) : '';\\n\\t\\t\\tif (nextCharacter !== QUOTE) {\\n\\t\\t\\t\\treturn [cellStart, i, true];\\n\\t\\t\\t} else {\\n\\t\\t\\t\\ti++;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\t\\n\\treturn [cellStart, i, isCellQuoted];\\n}\\n\\t\\nexports.parseCsvString = function(text, options) {\\n\\tif (!text) {\\n\\t\\treturn [];\\n\\t}\\n\\t\\n\\toptions = options || {};\\n\\tvar SEPARATOR = options.separator || \\\",\\\",\\n\\t\\tlength = text.length,\\n\\t\\trows = [],\\n\\t\\tnextRow = [];\\n\\t\\t\\n\\tfor (var i = 0; i \u003C length; i++) {\\n\\t\\tvar cellInfo = getCellInfo(text, i, length, SEPARATOR);\\n\\t\\tvar cellText = text.substring(cellInfo[0], cellInfo[1]);\\n\\t\\tif (cellInfo[2]) {\\n\\t\\t\\tcellText = cellText.replace(/\\\"\\\"/g, '\\\"');\\n\\t\\t\\tcellInfo[1]++;\\n\\t\\t}\\n\\t\\tnextRow.push(cellText);\\n\\t\\t\\n\\t\\ti = cellInfo[1];\\n\\t\\t\\n\\t\\tvar character = text.charAt(i);\\n\\t\\tvar nextCharacter = i + 1 \u003C length ? text.charAt(i + 1) : '';\\n\\t\\t\\n\\t\\tif (character === \\\"\\\\r\\\" || character === \\\"\\\\n\\\") {\\n\\t\\t\\t// Edge case for empty rows\\n\\t\\t\\tif (nextRow.length === 1 && nextRow[0] === '') {\\n\\t\\t\\t\\tnextRow.length = 0;\\n\\t\\t\\t}\\n\\t\\t\\trows.push(nextRow);\\n\\t\\t\\tnextRow = [];\\n\\t\\t\\t\\n\\t\\t\\tif (character === \\\"\\\\r\\\") {\\n\\t\\t\\t\\tvar nextCharacter = i + 1 \u003C length ? text.charAt(i + 1) : '';\\n\\t\\t\\t\\t\\n\\t\\t\\t\\tif (nextCharacter === \\\"\\\\n\\\") {\\n\\t\\t\\t\\t\\ti++;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\t\\n\\t// Special case if last cell in last row is an empty cell\\n\\tif (text.charAt(length - 1) === SEPARATOR) {\\n\\t\\tnextRow.push(\\\"\\\");\\n\\t}\\n\\t\\n\\trows.push(nextRow);\\n\\t\\n\\treturn rows;\\n}\\n\\n/*\\nParse a CSV string with a header row and return an array of hashmaps.\\n*/\\nexports.parseCsvStringWithHeader = function(text,options) {\\n\\tvar csv = $tw.utils.parseCsvString(text, options);\\n\\tvar headers = csv[0];\\n\\t\\n\\tcsv = csv.slice(1);\\n\\tfor (var i = 0; i \u003C csv.length; i++) {\\n\\t\\tvar row = csv[i];\\n\\t\\tvar rowObject = Object.create(null);\\n\\n\\t\\tfor(var columnIndex=0; columnIndex\u003Cheaders.length; columnIndex++) {\\n\\t\\t\\tvar columnName = headers[columnIndex];\\n\\t\\t\\tif (columnName) {\\n\\t\\t\\t\\trowObject[columnName] = $tw.utils.trim(row[columnIndex] || \\\"\\\");\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tcsv[i] = rowObject;\\n\\t}\\n\\treturn csv;\\n}\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"utils\"},\"$:/core/modules/utils/diff-match-patch/diff_match_patch.js\":{\"text\":\"(function(){function diff_match_patch(){this.Diff_Timeout=1;this.Diff_EditCost=4;this.Match_Threshold=.5;this.Match_Distance=1E3;this.Patch_DeleteThreshold=.5;this.Patch_Margin=4;this.Match_MaxBits=32}
2731var DIFF_DELETE=-1,DIFF_INSERT=1,DIFF_EQUAL=0;\\ndiff_match_patch.prototype.diff_main=function(a,b,c,d){\\\"undefined\\\"==typeof d&&(d=0>=this.Diff_Timeout?Number.MAX_VALUE:(new Date).getTime()+1E3*this.Diff_Timeout);if(null==a||null==b)throw Error(\\\"Null input. (diff_main)\\\");if(a==b)return a?[[DIFF_EQUAL,a]]:[];\\\"undefined\\\"==typeof c&&(c=!0);var e=c,f=this.diff_commonPrefix(a,b);c=a.substring(0,f);a=a.substring(f);b=b.substring(f);f=this.diff_commonSuffix(a,b);var g=a.substring(a.length-f);a=a.substring(0,a.length-f);b=b.substring(0,b.length-f);a=this.diff_compute_(a,\\nb,e,d);c&&a.unshift([DIFF_EQUAL,c]);g&&a.push([DIFF_EQUAL,g]);this.diff_cleanupMerge(a);return a};\\ndiff_match_patch.prototype.diff_compute_=function(a,b,c,d){if(!a)return[[DIFF_INSERT,b]];if(!b)return[[DIFF_DELETE,a]];var e=a.length>b.length?a:b,f=a.length>b.length?b:a,g=e.indexOf(f);return-1!=g?(c=[[DIFF_INSERT,e.substring(0,g)],[DIFF_EQUAL,f],[DIFF_INSERT,e.substring(g+f.length)]],a.length>b.length&&(c[0][0]=c[2][0]=DIFF_DELETE),c):1==f.length?[[DIFF_DELETE,a],[DIFF_INSERT,b]]:(e=this.diff_halfMatch_(a,b))?(b=e[1],f=e[3],a=e[4],e=this.diff_main(e[0],e[2],c,d),c=this.diff_main(b,f,c,d),e.concat([[DIFF_EQUAL,\\na]],c)):c&&100\u003Ca.length&&100\u003Cb.length?this.diff_lineMode_(a,b,d):this.diff_bisect_(a,b,d)};\\ndiff_match_patch.prototype.diff_lineMode_=function(a,b,c){var d=this.diff_linesToChars_(a,b);a=d.chars1;b=d.chars2;d=d.lineArray;a=this.diff_main(a,b,!1,c);this.diff_charsToLines_(a,d);this.diff_cleanupSemantic(a);a.push([DIFF_EQUAL,\\\"\\\"]);for(var e=d=b=0,f=\\\"\\\",g=\\\"\\\";b\u003Ca.length;){switch(a[b][0]){case DIFF_INSERT:e++;g+=a[b][1];break;case DIFF_DELETE:d++;f+=a[b][1];break;case DIFF_EQUAL:if(1\u003C=d&&1\u003C=e){a.splice(b-d-e,d+e);b=b-d-e;d=this.diff_main(f,g,!1,c);for(e=d.length-1;0\u003C=e;e--)a.splice(b,0,d[e]);b+=\\nd.length}d=e=0;g=f=\\\"\\\"}b++}a.pop();return a};\\ndiff_match_patch.prototype.diff_bisect_=function(a,b,c){for(var d=a.length,e=b.length,f=Math.ceil((d+e)/2),g=2*f,h=Array(g),l=Array(g),k=0;k\u003Cg;k++)h[k]=-1,l[k]=-1;h[f+1]=0;l[f+1]=0;k=d-e;for(var m=0!=k%2,p=0,x=0,w=0,q=0,t=0;t\u003Cf&&!((new Date).getTime()>c);t++){for(var v=-t+p;v\u003C=t-x;v+=2){var n=f+v;var r=v==-t||v!=t&&h[n-1]\u003Ch[n+1]?h[n+1]:h[n-1]+1;for(var y=r-v;r\u003Cd&&y\u003Ce&&a.charAt(r)==b.charAt(y);)r++,y++;h[n]=r;if(r>d)x+=2;else if(y>e)p+=2;else if(m&&(n=f+k-v,0\u003C=n&&n\u003Cg&&-1!=l[n])){var u=d-l[n];if(r>=\\nu)return this.diff_bisectSplit_(a,b,r,y,c)}}
2731for(v=-t+w;v\u003C=t-q;v+=2){n=f+v;u=v==-t||v!=t&&l[n-1]\u003Cl[n+1]?l[n+1]:l[n-1]+1;for(r=u-v;u\u003Cd&&r\u003Ce&&a.charAt(d-u-1)==b.charAt(e-r-1);)u++,r++;l[n]=u;if(u>d)q+=2;else if(r>e)w+=2;else if(!m&&(n=f+k-v,0\u003C=n&&n\u003Cg&&-1!=h[n]&&(r=h[n],y=f+r-n,u=d-u,r>=u)))return this.diff_bisectSplit_(a,b,r,y,c)}}return[[DIFF_DELETE,a],[DIFF_INSERT,b]]};\\ndiff_match_patch.prototype.diff_bisectSplit_=function(a,b,c,d,e){var f=a.substring(0,c),g=b.substring(0,d);a=a.substring(c);b=b.substring(d);f=this.diff_main(f,g,!1,e);e=this.diff_main(a,b,!1,e);return f.concat(e)};\\ndiff_match_patch.prototype.diff_linesToChars_=function(a,b){function c(a){for(var b=\\\"\\\",c=0,f=-1,g=d.length;f\u003Ca.length-1;){f=a.indexOf(\\\"\\\\n\\\",c);-1==f&&(f=a.length-1);var h=a.substring(c,f+1);c=f+1;(e.hasOwnProperty?e.hasOwnProperty(h):void 0!==e[h])?b+=String.fromCharCode(e[h]):(b+=String.fromCharCode(g),e[h]=g,d[g++]=h)}return b}var d=[],e={};d[0]=\\\"\\\";var f=c(a),g=c(b);return{chars1:f,chars2:g,lineArray:d}};\\ndiff_match_patch.prototype.diff_charsToLines_=function(a,b){for(var c=0;c\u003Ca.length;c++){for(var d=a[c][1],e=[],f=0;f\u003Cd.length;f++)e[f]=b[d.charCodeAt(f)];a[c][1]=e.join(\\\"\\\")}};diff_match_patch.prototype.diff_commonPrefix=function(a,b){if(!a||!b||a.charAt(0)!=b.charAt(0))return 0;for(var c=0,d=Math.min(a.length,b.length),e=d,f=0;c\u003Ce;)a.substring(f,e)==b.substring(f,e)?f=c=e:d=e,e=Math.floor((d-c)/2+c);return e};\\ndiff_match_patch.prototype.diff_commonSuffix=function(a,b){if(!a||!b||a.charAt(a.length-1)!=b.charAt(b.length-1))return 0;for(var c=0,d=Math.min(a.length,b.length),e=d,f=0;c\u003Ce;)a.substring(a.length-e,a.length-f)==b.substring(b.length-e,b.length-f)?f=c=e:d=e,e=Math.floor((d-c)/2+c);return e};\\ndiff_match_patch.prototype.diff_commonOverlap_=function(a,b){var c=a.length,d=b.length;if(0==c||0==d)return 0;c>d?a=a.substring(c-d):c\u003Cd&&(b=b.substring(0,c));c=Math.min(c,d);if(a==b)return c;d=0;for(var e=1;;){var f=a.substring(c-e);f=b.indexOf(f);if(-1==f)return d;e+=f;if(0==f||a.substring(c-e)==b.substring(0,e))d=e,e++}};\\ndiff_match_patch.prototype.diff_halfMatch_=function(a,b){function c(a,b,c){for(var d=a.substring(c,c+Math.floor(a.length/4)),e=-1,g=\\\"\\\",h,k,l,m;-1!=(e=b.indexOf(d,e+1));){var p=f.diff_commonPrefix(a.substring(c),b.substring(e)),u=f.diff_commonSuffix(a.substring(0,c),b.substring(0,e));g.length\u003Cu+p&&(g=b.substring(e-u,e)+b.substring(e,e+p),h=a.substring(0,c-u),k=a.substring(c+p),l=b.substring(0,e-u),m=b.substring(e+p))}return 2*g.length>=a.length?[h,k,l,m,g]:null}if(0>=this.Diff_Timeout)return null;\\nvar d=a.length>b.length?a:b,e=a.length>b.length?b:a;if(4>d.length||2*e.length\u003Cd.length)return null;var f=this,g=c(d,e,Math.ceil(d.length/4));d=c(d,e,Math.ceil(d.length/2));if(g||d)g=d?g?g[4].length>d[4].length?g:d:d:g;else return null;if(a.length>b.length){d=g[0];e=g[1];var h=g[2];var l=g[3]}else h=g[0],l=g[1],d=g[2],e=g[3];return[d,e,h,l,g[4]]};\\ndiff_match_patch.prototype.diff_cleanupSemantic=function(a){for(var b=!1,c=[],d=0,e=null,f=0,g=0,h=0,l=0,k=0;f\u003Ca.length;)a[f][0]==DIFF_EQUAL?(c[d++]=f,g=l,h=k,k=l=0,e=a[f][1]):(a[f][0]==DIFF_INSERT?l+=a[f][1].length:k+=a[f][1].length,e&&e.length\u003C=Math.max(g,h)&&e.length\u003C=Math.max(l,k)&&(a.splice(c[d-1],0,[DIFF_DELET
2731E,e]),a[c[d-1]+1][0]=DIFF_INSERT,d--,d--,f=0\u003Cd?c[d-1]:-1,k=l=h=g=0,e=null,b=!0)),f++;b&&this.diff_cleanupMerge(a);this.diff_cleanupSemanticLossless(a);for(f=1;f\u003Ca.length;){if(a[f-1][0]==\\nDIFF_DELETE&&a[f][0]==DIFF_INSERT){b=a[f-1][1];c=a[f][1];d=this.diff_commonOverlap_(b,c);e=this.diff_commonOverlap_(c,b);if(d>=e){if(d>=b.length/2||d>=c.length/2)a.splice(f,0,[DIFF_EQUAL,c.substring(0,d)]),a[f-1][1]=b.substring(0,b.length-d),a[f+1][1]=c.substring(d),f++}else if(e>=b.length/2||e>=c.length/2)a.splice(f,0,[DIFF_EQUAL,b.substring(0,e)]),a[f-1][0]=DIFF_INSERT,a[f-1][1]=c.substring(0,c.length-e),a[f+1][0]=DIFF_DELETE,a[f+1][1]=b.substring(e),f++;f++}f++}};\\ndiff_match_patch.prototype.diff_cleanupSemanticLossless=function(a){function b(a,b){if(!a||!b)return 6;var c=a.charAt(a.length-1),d=b.charAt(0),e=c.match(diff_match_patch.nonAlphaNumericRegex_),f=d.match(diff_match_patch.nonAlphaNumericRegex_),g=e&&c.match(diff_match_patch.whitespaceRegex_),h=f&&d.match(diff_match_patch.whitespaceRegex_);c=g&&c.match(diff_match_patch.linebreakRegex_);d=h&&d.match(diff_match_patch.linebreakRegex_);var k=c&&a.match(diff_match_patch.blanklineEndRegex_),l=d&&b.match(diff_match_patch.blanklineStartRegex_);\\nreturn k||l?5:c||d?4:e&&!g&&h?3:g||h?2:e||f?1:0}for(var c=1;c\u003Ca.length-1;){if(a[c-1][0]==DIFF_EQUAL&&a[c+1][0]==DIFF_EQUAL){var d=a[c-1][1],e=a[c][1],f=a[c+1][1],g=this.diff_commonSuffix(d,e);if(g){var h=e.substring(e.length-g);d=d.substring(0,d.length-g);e=h+e.substring(0,e.length-g);f=h+f}g=d;h=e;for(var l=f,k=b(d,e)+b(e,f);e.charAt(0)===f.charAt(0);){d+=e.charAt(0);e=e.substring(1)+f.charAt(0);f=f.substring(1);var m=b(d,e)+b(e,f);m>=k&&(k=m,g=d,h=e,l=f)}a[c-1][1]!=g&&(g?a[c-1][1]=g:(a.splice(c-\\n1,1),c--),a[c][1]=h,l?a[c+1][1]=l:(a.splice(c+1,1),c--))}c++}};diff_match_patch.nonAlphaNumericRegex_=/[^a-zA-Z0-9]/;diff_match_patch.whitespaceRegex_=/\\\\s/;diff_match_patch.linebreakRegex_=/[\\\\r\\\\n]/;diff_match_patch.blanklineEndRegex_=/\\\\n\\\\r?\\\\n$/;diff_match_patch.blanklineStartRegex_=/^\\\\r?\\\\n\\\\r?\\\\n/;\\ndiff_match_patch.prototype.diff_cleanupEfficiency=function(a){for(var b=!1,c=[],d=0,e=null,f=0,g=!1,h=!1,l=!1,k=!1;f\u003Ca.length;)a[f][0]==DIFF_EQUAL?(a[f][1].length\u003Cthis.Diff_EditCost&&(l||k)?(c[d++]=f,g=l,h=k,e=a[f][1]):(d=0,e=null),l=k=!1):(a[f][0]==DIFF_DELETE?k=!0:l=!0,e&&(g&&h&&l&&k||e.length\u003Cthis.Diff_EditCost/2&&3==g+h+l+k)&&(a.splice(c[d-1],0,[DIFF_DELET
2731E,e]),a[c[d-1]+1][0]=DIFF_INSERT,d--,e=null,g&&h?(l=k=!0,d=0):(d--,f=0\u003Cd?c[d-1]:-1,l=k=!1),b=!0)),f++;b&&this.diff_cleanupMerge(a)};\\ndiff_match_patch.prototype.diff_cleanupMerge=function(a){a.push([DIFF_EQUAL,\\\"\\\"]);for(var b=0,c=0,d=0,e=\\\"\\\",f=\\\"\\\",g;b\u003Ca.length;)switch(a[b][0]){case DIFF_INSERT:d++;f+=a[b][1];b++;break;case DIFF_DELETE:c++;e+=a[b][1];b++;break;case DIFF_EQUAL:1\u003Cc+d?(0!==c&&0!==d&&(g=this.diff_commonPrefix(f,e),0!==g&&(0\u003Cb-c-d&&a[b-c-d-1][0]==DIFF_EQUAL?a[b-c-d-1][1]+=f.substring(0,g):(a.splice(0,0,[DIFF_EQUAL,f.substring(0,g)]),b++),f=f.substring(g),e=e.substring(g)),g=this.diff_commonSuffix(f,e),0!==g&&(a[b][1]=f.substring(f.length-\\ng)+a[b][1],f=f.substring(0,f.length-g),e=e.substring(0,e.length-g))),0===c?a.splice(b-d,c+d,[DIFF_INSERT,f]):0===d?a.splice(b-c,c+d,[DIFF_DELETE,e]):a.splice(b-c-d,c+d,[DIFF_DELETE,e],[DIFF_INSERT,f]),b=b-c-d+(c?1:0)+(d?1:0)+1):0!==b&&a[b-1][0]==DIFF_EQUAL?(a[b-1][1]+=a[b][1],a.splice(b,1)):b++,c=d=0,f=e=\\\"\\\"}\\\"\\\"===a[a.length-1][1]&&a.pop();c=!1;for(b=1;b\u003Ca.length-1;)a[b-1][0]==DIFF_EQUAL&&a[b+1][0]==DIFF_EQUAL&&(a[b][1].substring(a[b][1].length-a[b-1][1].length)==a[b-1][1]?(a[b][1]=a[b-1][1]+a[b][1].substring(0,\\na[b][1].length-a[b-1][1].length),a[b+1][1]=a[b-1][1]+a[b+1][1],a.splice(b-1,1),c=!0):a[b][1].substring(0,a[b+1][1].length)==a[b+1][1]&&(a[b-1][1]+=a[b+1][1],a[b][1]=a[b][1].substring(a[b+1][1].length)+a[b+1][1],a.splice(b+1,1),c=!0)),b++;c&&this.diff_cleanupMerge(a)};\\ndiff_match_patch.prototype.diff_xIndex=function(a,b){var c=0,d=0,e=0,f=0,g;for(g=0;g\u003Ca.length;g++){a[g][0]!==DIFF_INSERT&&(c+=a[g][1].length);a[g][0]!==DIFF_DELETE&&(d+=a[g][1].length);if(c>b)break;e=c;f=d}return a.length!=g&&a[g][0]===DIFF_DELETE?f:f+(b-e)};\\ndiff_match_patch.prototype.diff_prettyHtml=function(a){for(var b=[],c=/&/g,d=/\u003C/g,e=/>/g,f=/\\\\n/g,g=0;g\u003Ca.length;g++){var h=a[g][0],l=a[g][1].replace(c,\\\"&amp;\\\").replace(d,\\\"&lt;\\\").replace(e,\\\"&gt;\\\").replace(f,\\\"&para;\u003Cbr>\\\");switch(h){case DIFF_INSERT:b[g]='\u003Cins style=\\\"background:#e6ffe6;\\\">'+l+\\\"\u003C/ins>\\\";break;case DIFF_DELETE:b[g]='\u003Cdel style=\\\"background:#ffe6e6;\\\">'+l+\\\"\u003C/del>\\\";break;case DIFF_EQUAL:b[g]=\\\"\u003Cspan>\\\"+l+\\\"\u003C/span>\\\"}}return b.join(\\\"\\\")};\\ndiff_match_patch.prototype.diff_text1=function(a){for(var b=[],c=0;c\u003Ca.length;c++)a[c][0]!==DIFF_INSERT&&(b[c]=a[c][1]);return b.join(\\\"\\\")};diff_match_patch.prototype.diff_text2=function(a){for(var b=[],c=0;c\u003Ca.length;c++)a[c][0]!==DIFF_DELETE&&(b[c]=a[c][1]);return b.join(\\\"\\\")};\\ndiff_match_patch.prototype.diff_levenshtein=function(a){for(var b=0,c=0,d=0,e=0;e\u003Ca.length;e++){var f=a[e][1];switch(a[e][0]){case DIFF_INSERT:c+=f.length;break;case DIFF_DELETE:d+=f.length;break;case DIFF_EQUAL:b+=Math.max(c,d),d=c=0}}return b+=Math.max(c,d)};\\ndiff_match_patch.prototype.diff_toDelta=function(a){for(var b=[],c=0;c\u003Ca.length;c++)switch(a[c][0]){case DIFF_INSERT:b[c]=\\\"+\\\"+encodeURI(a[c][1]);break;case DIFF_DELETE:b[c]=\\\"-\\\"+a[c][1].length;break;case DIFF_EQUAL:b[c]=\\\"=\\\"+a[c][1].length}return b.join(\\\"\\\\t\\\").replace(/%20/g,\\\" \\\")};\\ndiff_match_patch.prototype.diff_fromDelta=function(a,b){for(var c=[],d=0,e=0,f=b.split(/\\\\t/g),g=0;g\u003Cf.length;g++){var h=f[g].substring(1);switch(f[g].charAt(0)){case \\\"+\\\":try{c[d++]=[DIFF_INSERT,decodeURI(h)]}catch(k){throw Error(\\\"Illegal escape in diff_fromDelta: \\\"+h);}break;case \\\"-\\\":case \\\"=\\\":var l=parseInt(h,10);if(isNaN(l)||0>l)throw Error(\\\"Invalid number in diff_fromDelta: \\\"+h);h=a.substring(e,e+=l);\\\"=\\\"==f[g].charAt(0)?c[d++]=[DIFF_EQUAL,h]:c[d++]=[DIFF_DELETE,h];break;default:if(f[g])throw Error(\\\"Invalid diff operation in diff_fromDelta: \\\"+\\nf[g]);}}if(e!=a.length)throw Error(\\\"Delta length (\\\"+e+\\\") does not equal source text length (\\\"+a.length+\\\").\\\");return c};diff_match_patch.prototype.match_main=function(a,b,c){if(null==a||null==b||null==c)throw Error(\\\"Null input. (match_main)\\\");c=Math.max(0,Math.min(c,a.length));return a==b?0:a.length?a.substring(c,c+b.length)==b?c:this.match_bitap_(a,b,c):-1};\\ndiff_match_patch.prototype.match_bitap_=function(a,b,c){function d(a,d){var e=a/b.length,g=Math.abs(c-d);return f.Match_Distance?e+g/f.Match_Distance:g?1:e}if(b.length>this.Match_MaxBits)throw Error(\\\"Pattern too long for this browser.\\\");var e=this.match_alphabet_(b),f=this,g=this.Match_Threshold,h=a.indexOf(b,c);
2731-1!=h&&(g=Math.min(d(0,h),g),h=a.lastIndexOf(b,c+b.length),-1!=h&&(g=Math.min(d(0,h),g)));var l=1\u003C\u003Cb.length-1;h=-1;for(var k,m,p=b.length+a.length,x,w=0;w\u003Cb.length;w++){k=0;for(m=p;k\u003Cm;)d(w,\\nc+m)\u003C=g?k=m:p=m,m=Math.floor((p-k)/2+k);p=m;k=Math.max(1,c-m+1);var q=Math.min(c+m,a.length)+b.length;m=Array(q+2);for(m[q+1]=(1\u003C\u003Cw)-1;q>=k;q--){var t=e[a.charAt(q-1)];m[q]=0===w?(m[q+1]\u003C\u003C1|1)&t:(m[q+1]\u003C\u003C1|1)&t|(x[q+1]|x[q])\u003C\u003C1|1|x[q+1];if(m[q]&l&&(t=d(w,q-1),t\u003C=g))if(g=t,h=q-1,h>c)k=Math.max(1,2*c-h);else break}if(d(w+1,c)>g)break;x=m}return h};\\ndiff_match_patch.prototype.match_alphabet_=function(a){for(var b={},c=0;c\u003Ca.length;c++)b[a.charAt(c)]=0;for(c=0;c\u003Ca.length;c++)b[a.charAt(c)]|=1\u003C\u003Ca.length-c-1;return b};\\ndiff_match_patch.prototype.patch_addContext_=function(a,b){if(0!=b.length){for(var c=b.substring(a.start2,a.start2+a.length1),d=0;b.indexOf(c)!=b.lastIndexOf(c)&&c.length\u003Cthis.Match_MaxBits-this.Patch_Margin-this.Patch_Margin;)d+=this.Patch_Margin,c=b.substring(a.start2-d,a.start2+a.length1+d);d+=this.Patch_Margin;(c=b.substring(a.start2-d,a.start2))&&a.diffs.unshift([DIFF_EQUAL,c]);(d=b.substring(a.start2+a.length1,a.start2+a.length1+d))&&a.diffs.push([DIFF_EQUAL,d]);a.start1-=c.length;a.start2-=\\nc.length;a.length1+=c.length+d.length;a.length2+=c.length+d.length}};\\ndiff_match_patch.prototype.patch_make=function(a,b,c){if(\\\"string\\\"==typeof a&&\\\"string\\\"==typeof b&&\\\"undefined\\\"==typeof c){var d=a;b=this.diff_main(d,b,!0);2\u003Cb.length&&(this.diff_cleanupSemantic(b),this.diff_cleanupEfficiency(b))}else if(a&&\\\"object\\\"==typeof a&&\\\"undefined\\\"==typeof b&&\\\"undefined\\\"==typeof c)b=a,d=this.diff_text1(b);else if(\\\"string\\\"==typeof a&&b&&\\\"object\\\"==typeof b&&\\\"undefined\\\"==typeof c)d=a;else if(\\\"string\\\"==typeof a&&\\\"string\\\"==typeof b&&c&&\\\"object\\\"==typeof c)d=a,b=c;else throw Error(\\\"Unknown call format to patch_make.\\\");\\nif(0===b.length)return[];c=[];a=new diff_match_patch.patch_obj;for(var e=0,f=0,g=0,h=d,l=0;l\u003Cb.length;l++){var k=b[l][0],m=b[l][1];e||k===DIFF_EQUAL||(a.start1=f,a.start2=g);switch(k){case DIFF_INSERT:a.diffs[e++]=b[l];a.length2+=m.length;d=d.substring(0,g)+m+d.substring(g);break;case DIFF_DELETE:a.length1+=m.length;a.diffs[e++]=b[l];d=d.substring(0,g)+d.substring(g+m.length);break;case DIFF_EQUAL:m.length\u003C=2*this.Patch_Margin&&e&&b.length!=l+1?(a.diffs[e++]=b[l],a.length1+=m.length,a.length2+=m.length):\\nm.length>=2*this.Patch_Margin&&e&&(this.patch_addContext_(a,h),c.push(a),a=new diff_match_patch.patch_obj,e=0,h=d,f=g)}k!==DIFF_INSERT&&(f+=m.length);k!==DIFF_DELETE&&(g+=m.length)}e&&(this.patch_addContext_(a,h),c.push(a));return c};\\ndiff_match_patch.prototype.patch_deepCopy=function(a){for(var b=[],c=0;c\u003Ca.length;c++){var d=a[c],e=new diff_match_patch.patch_obj;e.diffs=[];for(var f=0;f\u003Cd.diffs.length;f++)e.diffs[f]=d.diffs[f].slice();e.start1=d.start1;e.start2=d.start2;e.length1=d.length1;e.length2=d.length2;b[c]=e}return b};\\ndiff_match_patch.prototype.patch_apply=function(a,b){if(0==a.length)return[b,[]];a=this.patch_deepCopy(a);var c=this.patch_addPadding(a);b=c+b+c;this.patch_splitMax(a);for(var d=0,e=[],f=0;f\u003Ca.length;f++){var g=a[f].start2+d,h=this.diff_text1(a[f].diffs),l=-1;if(h.length>this.Match_MaxBits){var k=this.match_main(b,h.substring(0,this.Match_MaxBits),g);-1!=k&&(l=this.match_main(b,h.substring(h.length-this.Match_MaxBits),g+h.length-this.Match_MaxBits),-1==l||k>=l)&&(k=-1)}else k=this.match_main(b,h,\\ng);if(-1==k)e[f]=!1,d-=a[f].length2-a[f].length1;else if(e[f]=!0,d=k-g,g=-1==l?b.substring(k,k+h.length):b.substring(k,l+this.Match_MaxBits),h==g)b=b.substring(0,k)+this.diff_text2(a[f].diffs)+b.substring(k+h.length);else if(g=this.diff_main(h,g,!1),h.length>this.Match_MaxBits&&this.diff_levenshtein(g)/h.length>this.Patch_DeleteThreshold)e[f]=!1;else{this.diff_cleanupSemanticLossless(g);h=0;var m;for(l=0;l\u003Ca[f].diffs.length;l++){var p=a[f].diffs[l];p[0]!==DIFF_EQUAL&&(m=this.diff_xIndex(g,h));p[0]===\\nDIFF_INSERT?b=b.substring(0,k+m)+p[1]+b.substring(k+m):p[0]===DIFF_DELET
2731E&&(b=b.substring(0,k+m)+b.substring(k+this.diff_xIndex(g,h+p[1].length)));p[0]!==DIFF_DELETE&&(h+=p[1].length)}}}b=b.substring(c.length,b.length-c.length);return[b,e]};\\ndiff_match_patch.prototype.patch_addPadding=function(a){for(var b=this.Patch_Margin,c=\\\"\\\",d=1;d\u003C=b;d++)c+=String.fromCharCode(d);for(d=0;d\u003Ca.length;d++)a[d].start1+=b,a[d].start2+=b;d=a[0];var e=d.diffs;if(0==e.length||e[0][0]!=DIFF_EQUAL)e.unshift([DIFF_EQUAL,c]),d.start1-=b,d.start2-=b,d.length1+=b,d.length2+=b;else if(b>e[0][1].length){var f=b-e[0][1].length;e[0][1]=c.substring(e[0][1].length)+e[0][1];d.start1-=f;d.start2-=f;d.length1+=f;d.length2+=f}d=a[a.length-1];e=d.diffs;0==e.length||e[e.length-\\n1][0]!=DIFF_EQUAL?(e.push([DIFF_EQUAL,c]),d.length1+=b,d.length2+=b):b>e[e.length-1][1].length&&(f=b-e[e.length-1][1].length,e[e.length-1][1]+=c.substring(0,f),d.length1+=f,d.length2+=f);return c};\\ndiff_match_patch.prototype.patch_splitMax=function(a){for(var b=this.Match_MaxBits,c=0;c\u003Ca.length;c++)if(!(a[c].length1\u003C=b)){var d=a[c];a.splice(c--,1);for(var e=d.start1,f=d.start2,g=\\\"\\\";0!==d.diffs.length;){var h=new diff_match_patch.patch_obj,l=!0;h.start1=e-g.length;h.start2=f-g.length;\\\"\\\"!==g&&(h.length1=h.length2=g.length,h.diffs.push([DIFF_EQUAL,g]));for(;0!==d.diffs.length&&h.length1\u003Cb-this.Patch_Margin;){g=d.diffs[0][0];var k=d.diffs[0][1];g===DIFF_INSERT?(h.length2+=k.length,f+=k.length,h.diffs.push(d.diffs.shift()),\\nl=!1):g===DIFF_DELETE&&1==h.diffs.length&&h.diffs[0][0]==DIFF_EQUAL&&k.length>2*b?(h.length1+=k.length,e+=k.length,l=!1,h.diffs.push([g,k]),d.diffs.shift()):(k=k.substring(0,b-h.length1-this.Patch_Margin),h.length1+=k.length,e+=k.length,g===DIFF_EQUAL?(h.length2+=k.length,f+=k.length):l=!1,h.diffs.push([g,k]),k==d.diffs[0][1]?d.diffs.shift():d.diffs[0][1]=d.diffs[0][1].substring(k.length))}g=this.diff_text2(h.diffs);g=g.substring(g.length-this.Patch_Margin);k=this.diff_text1(d.diffs).substring(0,\\nthis.Patch_Margin);\\\"\\\"!==k&&(h.length1+=k.length,h.length2+=k.length,0!==h.diffs.length&&h.diffs[h.diffs.length-1][0]===DIFF_EQUAL?h.diffs[h.diffs.length-1][1]+=k:h.diffs.push([DIFF_EQUAL,k]));l||a.splice(++c,0,h)}}};diff_match_patch.prototype.patch_toText=function(a){for(var b=[],c=0;c\u003Ca.length;c++)b[c]=a[c];return b.join(\\\"\\\")};\\ndiff_match_patch.prototype.patch_fromText=function(a){var b=[];if(!a)return b;a=a.split(\\\"\\\\n\\\");for(var c=0,d=/^@@ -(\\\\d+),?(\\\\d*) \\\\+(\\\\d+),?(\\\\d*) @@$/;c\u003Ca.length;){var e=a[c].match(d);if(!e)throw Error(\\\"Invalid patch string: \\\"+a[c]);var f=new diff_match_patch.patch_obj;b.push(f);f.start1=parseInt(e[1],10);\\\"\\\"===e[2]?(f.start1--,f.length1=1):\\\"0\\\"==e[2]?f.length1=0:(f.start1--,f.length1=parseInt(e[2],10));f.start2=parseInt(e[3],10);\\\"\\\"===e[4]?(f.start2--,f.length2=1):\\\"0\\\"==e[4]?f.length2=0:(f.start2--,f.length2=\\nparseInt(e[4],10));for(c++;c\u003Ca.length;){e=a[c].charAt(0);try{var g=decodeURI(a[c].substring(1))}catch(h){throw Error(\\\"Illegal escape in patch_fromText: \\\"+g);}if(\\\"-\\\"==e)f.diffs.push([DIFF_DELETE,g]);else if(\\\"+\\\"==e)f.diffs.push([DIFF_INSERT,g]);else if(\\\" \\\"==e)f.diffs.push([DIFF_EQUAL,g]);else if(\\\"@\\\"==e)break;else if(\\\"\\\"!==e)throw Error('Invalid patch mode \\\"'+e+'\\\" in: '+g);c++}}return b};diff_match_patch.patch_obj=function(){this.diffs=[];this.start2=this.start1=null;this.length2=this.length1=0};\\ndiff_match_patch.patch_obj.prototype.toString=function(){for(var a=[\\\"@@ -\\\"+(0===this.length1?this.start1+\\\",0\\\":1==this.length1?this.start1+1:this.start1+1+\\\",\\\"+this.length1)+\\\" +\\\"+(0===this.length2?this.start2+\\\",0\\\":1==this.length2?this.start2+1:this.start2+1+\\\",\\\"+this.length2)+\\\" @@\\\\n\\\"],b,c=0;c\u003Cthis.diffs.length;c++){switch(this.diffs[c][0]){case DIFF_INSERT:b=\\\"+\\\";break;case DIFF_DELETE:b=\\\"-\\\";break;case DIFF_EQUAL:b=\\\" \\\"}a[c+1]=b+encodeURI(this.diffs[c][1])+\\\"\\\\n\\\"}return a.join(\\\"\\\").replace(/%20/g,\\\" \\\")};\\nthis.diff_match_patch=diff_match_patch;this.DIFF_DELETE=DIFF_DELETE;this.DIFF_INSERT=DIFF_INSERT;this.DIFF_EQUAL=DIFF_EQUAL;\\n}).call(exports);\",\"type\":\"application/javascript\",\"title\":\"$:/core/modules/utils/diff-match-patch/diff_match_patch.js\",\"module-type\":\"library\"},\"$:/core/modules/utils/dom/animations/slide.js\":{\"title\":\"$:/core/modules/utils/dom/animations/slide.js\",\"text\":\"/*\\\\\\ntitle: $
2731:/core/modules/utils/dom/animations/slide.js\\ntype: application/javascript\\nmodule-type: animation\\n\\nA simple slide animation that varies the height of the element\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nfunction slideOpen(domNode,options) {\\n\\toptions = options || {};\\n\\tvar duration = options.duration || $tw.utils.getAnimationDuration();\\n\\t// Get the current height of the domNode\\n\\tvar computedStyle = window.getComputedStyle(domNode),\\n\\t\\tcurrMarginBottom = parseInt(computedStyle.marginBottom,10),\\n\\t\\tcurrMarginTop = parseInt(computedStyle.marginTop,10),\\n\\t\\tcurrPaddingBottom = parseInt(computedStyle.paddingBottom,10),\\n\\t\\tcurrPaddingTop = parseInt(computedStyle.paddingTop,10),\\n\\t\\tcurrHeight = domNode.offsetHeight;\\n\\t// Reset the margin once the transition is over\\n\\tsetTimeout(function() {\\n\\t\\t$tw.utils.setStyle(domNode,[\\n\\t\\t\\t{transition: \\\"none\\\"},\\n\\t\\t\\t{marginBottom: \\\"\\\"},\\n\\t\\t\\t{marginTop: \\\"\\\"},\\n\\t\\t\\t{paddingBottom: \\\"\\\"},\\n\\t\\t\\t{paddingTop: \\\"\\\"},\\n\\t\\t\\t{height: \\\"auto\\\"},\\n\\t\\t\\t{opacity: \\\"\\\"}\\n\\t\\t]);\\n\\t\\tif(options.callback) {\\n\\t\\t\\toptions.callback();\\n\\t\\t}\\n\\t},duration);\\n\\t// Set up the initial position of the element\\n\\t$tw.utils.setStyle(domNode,[\\n\\t\\t{transition: \\\"none\\\"},\\n\\t\\t{marginTop: \\\"0px\\\"},\\n\\t\\t{marginBottom: \\\"0px\\\"}
2731,\\n\\t\\t{paddingTop: \\\"0px\\\"},\\n\\t\\t{paddingBottom: \\\"0px\\\"},\\n\\t\\t{height: \\\"0px\\\"},\\n\\t\\t{opacity: \\\"0\\\"}\\n\\t]);\\n\\t$tw.utils.forceLayout(domNode);\\n\\t// Transition to the final position\\n\\t$tw.utils.setStyle(domNode,[\\n\\t\\t{transition: \\\"margin-top \\\" + duration + \\\"ms ease-in-out, \\\" +\\n\\t\\t\\t\\t\\t\\\"margin-bottom \\\" + duration + \\\"ms ease-in-out, \\\" +\\n\\t\\t\\t\\t\\t\\\"padding-top \\\" + duration + \\\"ms ease-in-out, \\\" +\\n\\t\\t\\t\\t\\t\\\"padding-bottom \\\" + duration + \\\"ms ease-in-out, \\\" +\\n\\t\\t\\t\\t\\t\\\"height \\\" + duration + \\\"ms ease-in-out, \\\" +\\n\\t\\t\\t\\t\\t\\\"opacity \\\" + duration + \\\"ms ease-in-out\\\"},\\n\\t\\t{marginBottom: currMarginBottom + \\\"px\\\"},\\n\\t\\t{marginTop: currMarginTop + \\\"px\\\"},\\n\\t\\t{paddingBottom: currPaddingBottom + \\\"px\\\"},\\n\\t\\t{paddingTop: currPaddingTop + \\\"px\\\"},\\n\\t\\t{height: currHeight + \\\"px\\\"},\\n\\t\\t{opacity: \\\"1\\\"}\\n\\t]);\\n}\\n\\nfunction slideClosed(domNode,options) {\\n\\toptions = options || {};\\n\\tvar duration = options.duration || $tw.utils.getAnimationDuration(),\\n\\t\\tcurrHeight = domNode.offsetHeight;\\n\\t// Clear the properties we've set when the animation is over\\n\\tsetTimeout(function() {\\n\\t\\t$tw.utils.setStyle(domNode,[\\n\\t\\t\\t{transition: \\\"none\\\"},\\n\\t\\t\\t{marginBottom: \\\"\\\"},\\n\\t\\t\\t{marginTop: \\\"\\\"},\\n\\t\\t\\t{paddingBottom: \\\"\\\"},\\n\\t\\t\\t{paddingTop: \\\"\\\"},\\n\\t\\t\\t{height: \\\"auto\\\"},\\n\\t\\t\\t{opacity: \\\"\\\"}\\n\\t\\t]);\\n\\t\\tif(options.callback) {\\n\\t\\t\\toptions.callback();\\n\\t\\t}\\n\\t},duration);\\n\\t// Set up the initial position of the element\\n\\t$tw.utils.setStyle(domNode,[\\n\\t\\t{height: currHeight + \\\"px\\\"},\\n\\t\\t{opacity: \\\"1\\\"}\\n\\t]);\\n\\t$tw.utils.forceLayout(domNode);\\n\\t// Transition to the final position\\n\\t$tw.utils.setStyle(domNode,[\\n\\t\\t{transition: \\\"margin-top \\\" + duration + \\\"ms ease-in-out, \\\" +\\n\\t\\t\\t\\t\\t\\\"margin-bottom \\\" + duration + \\\"ms ease-in-out, \\\" +\\n\\t\\t\\t\\t\\t\\\"padding-top \\\" + duration + \\\"ms ease-in-out, \\\" +\\n\\t\\t\\t\\t\\t\\\"padding-bottom \\\" + duration + \\\"ms ease-in-out, \\\" +\\n\\t\\t\\t\\t\\t\\\"height \\\" + duration + \\\"ms ease-in-out, \\\" +\\n\\t\\t\\t\\t\\t\\\"opacity \\\" + duration + \\\"ms ease-in-out\\\"},\\n\\t\\t{marginTop: \\\"0px\\\"},\\n\\t\\t{marginBottom: \\\"0px\\\"}
2731,\\n\\t\\t{paddingTop: \\\"0px\\\"},\\n\\t\\t{paddingBottom: \\\"0px\\\"},\\n\\t\\t{height: \\\"0px\\\"},\\n\\t\\t{opacity: \\\"0\\\"}\\n\\t]);\\n}\\n\\nexports.slide = {\\n\\topen: slideOpen,\\n\\tclose: slideClosed\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"animation\"},\"$:/core/modules/utils/dom/animator.js\":{\"title\":\"$:/core/modules/utils/dom/animator.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/utils/dom/animator.js\\ntype: application/javascript\\nmodule-type: utils\\n\\nOrchestrates animations and transitions\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nfunction Animator() {\\n\\t// Get the registered animation modules\\n\\tthis.animations = {};\\n\\t$tw.modules.applyMethods(\\\"animation\\\",this.animations);\\n}\\n\\nAnimator.prototype.perform = function(type,domNode,options) {\\n\\toptions = options || {};\\n\\t// Find an animation that can handle this type\\n\\tvar chosenAnimation;\\n\\t$tw.utils.each(this.animations,function(animation,name) {\\n\\t\\tif($tw.utils.hop(animation,type)) {\\n\\t\\t\\tchosenAnimation = animation[type];\\n\\t\\t}\\n\\t});\\n\\tif(!chosenAnimation) {\\n\\t\\tchosenAnimation = function(domNode,options) {\\n\\t\\t\\tif(options.callback) {\\n\\t\\t\\t\\toptions.callback();\\n\\t\\t\\t}\\n\\t\\t};\\n\\t}\\n\\t// Call the animation\\n\\tchosenAnimation(domNode,options);\\n};\\n\\nexports.Animator = Animator;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"utils\"},\"$:/core/modules/utils/dom/browser.js\":{\"title\":\"$:/core/modules/utils/dom/browser.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/utils/dom/browser.js\\ntype: application/javascript\\nmodule-type: utils\\n\\nBrowser feature detection\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nSet style properties of an element\\n\\telement: dom node\\n\\tstyles: ordered array of {name: value} pairs\\n*/\\nexports.setStyle = function(element,styles) {\\n\\tif(element.nodeType === 1) { // Element.ELEMENT_NODE\\n\\t\\tfor(var t=0; t\u003Cstyles.length; t++) {\\n\\t\\t\\tfor(var styleName in styles[t]) {\\n\\t\\t\\t\\telement.style[$tw.utils.convertStyleNameToPropertyName(styleName)] = styles[t][styleName];\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n};\\n\\n/*\\nConverts a standard CSS property name into the local browser-specific equivalent. For example:\\n\\t\\\"background-color\\\" --> \\\"backgroundColor\\\"\\n\\t\\\"transition\\\" --> \\\"webkitTransition\\\"\\n*/\\n\\nvar styleNameCache = {}; // We'll cache the style name conversions\\n\\nexports.convertStyleNameToPropertyName = function(styleName) {\\n\\t// Return from the cache if we can\\n\\tif(styleNameCache[styleName]) {\\n\\t\\treturn styleNameCache[styleName];\\n\\t}\\n\\t// Convert it by first removing any hyphens\\n\\tvar propertyName = $tw.utils.unHyphenate
2731Css(styleName);\\n\\t// Then check if it needs a prefix\\n\\tif($tw.browser && document.body.style[propertyName] === undefined) {\\n\\t\\tvar prefixes = [\\\"O\\\",\\\"MS\\\",\\\"Moz\\\",\\\"webkit\\\"];\\n\\t\\tfor(var t=0; t\u003Cprefixes.length; t++) {\\n\\t\\t\\tvar prefixedName = prefixes[t] + propertyName.substr(0,1).toUpperCase() + propertyName.substr(1);\\n\\t\\t\\tif(document.body.style[prefixedName] !== undefined) {\\n\\t\\t\\t\\tpropertyName = prefixedName;\\n\\t\\t\\t\\tbreak;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\t// Put it in the cache too\\n\\tstyleNameCache[styleName] = propertyName;\\n\\treturn propertyName;\\n};\\n\\n/*\\nConverts a JS format CSS property name back into the dashed form used in CSS declarations. For example:\\n\\t\\\"backgroundColor\\\" --> \\\"background-color\\\"\\n\\t\\\"webkitTransform\\\" --> \\\"-webkit-transform\\\"\\n*/\\nexports.convertPropertyNameToStyleName = function(propertyName) {\\n\\t// Rehyphenate the name\\n\\tvar styleName = $tw.utils.hyphenateCss(propertyName);\\n\\t// If there's a webkit prefix, add a dash (other browsers have uppercase prefixes, and so get the dash automatically)\\n\\tif(styleName.indexOf(\\\"webkit\\\") === 0) {\\n\\t\\tstyleName = \\\"-\\\" + styleName;\\n\\t} else if(styleName.indexOf(\\\"-m-s\\\") === 0) {\\n\\t\\tstyleName = \\\"-ms\\\" + styleName.substr(4);\\n\\t}\\n\\treturn styleName;\\n};
2731\\n\\n/*\\nRound trip a stylename to a property name and back again. For example:\\n\\t\\\"transform\\\" --> \\\"webkitTransform\\\" --> \\\"-webkit-transform\\\"\\n*/\\nexports.roundTripPropertyName = function(propertyName) {\\n\\treturn $tw.utils.convertPropertyNameToStyleName($tw.utils.convertStyleNameToPropertyName(propertyName));\\n};\\n\\n/*\\nConverts a standard event name into the local browser specific equivalent. For example:\\n\\t\\\"animationEnd\\\" --> \\\"webkitAnimationEnd\\\"\\n*/\\n\\nvar eventNameCache = {}; // We'll cache the conversions\\n\\nvar eventNameMappings = {\\n\\t\\\"transitionEnd\\\": {\\n\\t\\tcorrespondingCssProperty: \\\"transition\\\",\\n\\t\\tmappings: {\\n\\t\\t\\ttransition: \\\"transitionend\\\",\\n\\t\\t\\tOTransition: \\\"oTransitionEnd\\\",\\n\\t\\t\\tMSTransition: \\\"msTransitionEnd\\\",\\n\\t\\t\\tMozTransition: \\\"transitionend\\\",\\n\\t\\t\\twebkitTransition: \\\"webkitTransitionEnd\\\"\\n\\t\\t}\\n\\t},\\n\\t\\\"animationEnd\\\": {\\n\\t\\tcorrespondingCssProperty: \\\"animation\\\",\\n\\t\\tmappings: {\\n\\t\\t\\tanimation: \\\"animationend\\\",\\n\\t\\t\\tOAnimation: \\\"oAnimationEnd\\\",\\n\\t\\t\\tMSAnimation: \\\"msAnimationEnd\\\",\\n\\t\\t\\tMozAnimation: \\\"animationend\\\",\\n\\t\\t\\twebkitAnimation: \\\"webkitAnimationEnd\\\"\\n\\t\\t}\\n\\t}\\n};\\n\\nexports.convertEventName = function(eventName) {\\n\\tif(eventNameCache[eventName]) {\\n\\t\\treturn eventNameCache[eventName];\\n\\t}\\n\\tvar newEventName = eventName,\\n\\t\\tmappings = eventNameMappings[eventName];\\n\\tif(mappings) {\\n\\t\\tvar convertedProperty = $tw.utils.convertStyleNameToPropertyName(mappings.correspondingCssProperty);\\n\\t\\tif(mappings.mappings[convertedProperty]) {\\n\\t\\t\\tnewEventName = mappings.mappings[convertedProperty];\\n\\t\\t}\\n\\t}\\n\\t// Put it in the cache too\\n\\teventNameCache[eventName] = newEventName;\\n\\treturn newEventName;\\n};
2731\\n\\n/*\\nReturn the names of the fullscreen APIs\\n*/\\nexports.getFullScreenApis = function() {\\n\\tvar d = document,\\n\\t\\tdb = d.body,\\n\\t\\tresult = {\\n\\t\\t\\\"_requestFullscreen\\\": db.webkitRequestFullscreen !== undefined ? \\\"webkitRequestFullscreen\\\" :\\n\\t\\t\\t\\t\\t\\t\\tdb.mozRequestFullScreen !== undefined ? \\\"mozRequestFullScreen\\\" :\\n\\t\\t\\t\\t\\t\\t\\tdb.msRequestFullscreen !== undefined ? \\\"msRequestFullscreen\\\" :\\n\\t\\t\\t\\t\\t\\t\\tdb.requestFullscreen !== undefined ? \\\"requestFullscreen\\\" : \\\"\\\",\\n\\t\\t\\\"_exitFullscreen\\\": d.webkitExitFullscreen !== undefined ? \\\"webkitExitFullscreen\\\" :\\n\\t\\t\\t\\t\\t\\t\\td.mozCancelFullScreen !== undefined ? \\\"mozCancelFullScreen\\\" :\\n\\t\\t\\t\\t\\t\\t\\td.msExitFullscreen !== undefined ? \\\"msExitFullscreen\\\" :\\n\\t\\t\\t\\t\\t\\t\\td.exitFullscreen !== undefined ? \\\"exitFullscreen\\\" : \\\"\\\",\\n\\t\\t\\\"_fullscreenElement\\\": d.webkitFullscreenElement !== undefined ? \\\"webkitFullscreenElement\\\" :\\n\\t\\t\\t\\t\\t\\t\\td.mozFullScreenElement !== undefined ? \\\"mozFullScreenElement\\\" :\\n\\t\\t\\t\\t\\t\\t\\td.msFullscreenElement !== undefined ? \\\"msFullscreenElement\\\" :\\n\\t\\t\\t\\t\\t\\t\\td.fullscreenElement !== undefined ? \\\"fullscreenElement\\\" : \\\"\\\",\\n\\t\\t\\\"_fullscreenChange\\\": d.webkitFullscreenElement !== undefined ? \\\"webkitfullscreenchange\\\" :\\n\\t\\t\\t\\t\\t\\t\\td.mozFullScreenElement !== undefined ? \\\"mozfullscreenchange\\\" :\\n\\t\\t\\t\\t\\t\\t\\td.msFullscreenElement !== undefined ? \\\"MSFullscreenChange\\\" :\\n\\t\\t\\t\\t\\t\\t\\td.fullscreenElement !== undefined ? \\\"fullscreenchange\\\" : \\\"\\\"\\n\\t};\\n\\tif(!result._requestFullscreen || !result._exitFullscreen || !result._fullscreenElement || !result._fullscreenChange) {\\n\\t\\treturn null;\\n\\t} else {\\n\\t\\treturn result;\\n\\t}\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"utils\"},\"$:/core/modules/utils/dom/csscolorparser.js\":{\"title\":\"$:/core/modules/utils/dom/csscolorparser.js\",\"text\":\"// (c) Dean McNamee \[email protected]>, 2012.\\n//\\n// https://github.com/deanm/css-color-parser-js\\n//\\n// Permission is hereby granted, free of charge, to any person obtaining a copy\\n// of this software and associated documentation files (the \\\"Software\\\"), to\\n// deal in the Software without restriction, including without limitation the\\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\\n// sell copies of the Software, and to permit persons to whom the Software is\\n// furnished to do so, subject to the following conditions:\\n//\\n// The above copyright notice and this permission notice shall be included in\\n// all copies or substantial portions of the Software.\\n//\\n// THE SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\\n// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\\n// IN THE SOFTWARE.\\n\\n// http://www.w3.org/TR/css3-color/\\nvar kCSSColorTable = {\\n  \\\"transparent\\\": [0,0,0,0], \\\"aliceblue\\\": [240,248,255,1],\\n  \\\"antiquewhite\\\": [250,235,215,1], \\\"aqua\\\": [0,255,255,1],\\n  \\\"aquamarine\\\": [127,255,212,1], \\\"azure\\\": [240,255,255,1],\\n  \\\"beige\\\": [245,245,220,1], \\\"bisque\\\": [255,228,196,1],\\n  \\\"black\\\": [0,0,0,1], \\\"blanchedalmond\\\": [255,235,205,1],\\n  \\\"blue\\\": [0,0,255,1], \\\"blueviolet\\\": [138,43,226,1],\\n  \\\"brown\\\": [165,42,42,1], \\\"burlywood\\\": [222,184,135,1],\\n  \\\"cadetblue\\\": [95,158,160,1], \\\"chartreuse\\\": [127,255,0,1],\\n  \\\"chocolate\\\": [210,105,30,1], \\\"coral\\\": [255,127,80,1],\\n  \\\"cornflowerblue\\\": [100,149,237,1], \\\"cornsilk\\\": [255,248,220,1],\\n  \\\"crimson\\\": [220,20,60,1], \\\"cyan\\\": [0,255,255,1],\\n  \\\"darkblue\\\": [0,0,139,1], \\\"darkcyan\\\": [0,139,139,1],\\n  \\\"darkgoldenrod\\\": [184,134,11,1], \\\"darkgray\\\": [169,169,169,1],\\n  \\\"darkgreen\\\": [0,100,0,1], \\\"darkgrey\\\": [169,169,169,1],\\n  \\\"darkkhaki\\\": [189,183,107,1], \\\"darkmagenta\\\": [139,0,139,1],\\n  \\\"darkolivegreen\\\": [85,107,47,1], \\\"darkorange\\\": [255,140,0,1],\\n  \\\"darkorchid\\\": [153,50,204,1], \\\"darkred\\\": [139,0,0,1],\\n  \\\"darksalmon\\\": [233,150,122,1], \\\"darkseagreen\\\": [143,188,143,1],\\n  \\\"darkslateblue\\\": [72,61,139,1], \\\"darkslategray\\\": [47,79,79,1],\\n  \\\"darkslategrey\\\": [47,79,79,1], \\\"darkturquoise\\\": [0,206,209,1],\\n  \\\"darkviolet\\\": [148,0,211,1], \\\"deeppink\\\": [255,20,147,1],\\n  \\\"deepskyblue\\\": [0,191,255,1], \\\"dimgray\\\": [105,105,105,1],\\n  \\\"dimgrey\\\": [105,105,105,1], \\\"dodgerblue\\\": [30,144,255,1],\\n  \\\"firebrick\\\": [178,34,34,1], \\\"floralwhite\\\": [255,250,240,1],\\n  \\\"forestgreen\\\": [34,139,34,1], \\\"fuchsia\\\": [255,0,255,1],\\n  \\\"gainsboro\\\": [220,220,220,1], \\\"ghostwhite\\\": [248,248,255,1],\\n  \\\"gold\\\": [255,215,0,1], \\\"goldenrod\\\": [218,165,32,1],\\n  \\\"gray\\\": [128,128,128,1], \\\"green\\\": [0,128,0,1],\\n  \\\"greenyellow\\\": [173,255,47,1], \\\"grey\\\": [128,128,128,1],\\n  \\\"honeydew\\\": [240,255,240,1], \\\"hotpink\\\": [255,105,180,1],\\n  \\\"indianred\\\": [205,92,92,1], \\\"indigo\\\": [75,0,130,1],\\n  \\\"ivory\\\": [255,255,240,1], \\\"khaki\\\": [240,230,140,1],\\n  \\\"lavender\\\": [230,230,250,1], \\\"lavenderblush\\\": [255,240,245,1],\\n  \\\"lawngreen\\\": [124,252,0,1], \\\"lemonchiffon\\\": [255,250,205,1],\\n  \\\"lightblue\\\": [173,216,230,1], \\\"lightcoral\\\": [240,128,128,1],\\n  \\\"lightcyan\\\": [224,255,255,1], \\\"lightgoldenrodyellow\\\": [250,250,210,1],\\n  \\\"lightgray\\\": [211,211,211,1], \\\"lightgreen\\\": [144,238,144,1],\\n  \\\"lightgrey\\\": [211,211,211,1], \\\"lightpink\\\": [255,182,193,1],\\n  \\\"lightsalmon\\\": [255,160,122,1], \\\"lightseagreen\\\": [32,178,170,1],\\n  \\\"lightskyblue\\\": [135,206,250,1], \\\"lightslategray\\\": [119,136,153,1],\\n  \\\"lightslategrey\\\": [119,136,153,1], \\\"lightsteelblue\\\": [176,196,222,1],\\n  \\\"lightyellow\\\": [255,255,224,1], \\\"lime\\\": [0,255,0,1],\\n  \\\"limegreen\\\": [50,205,50,1], \\\"linen\\\": [250,240,230,1],\\n  \\\"magenta\\\": [255,0,255,1], \\\"maroon\\\": [128,0,0,1],\\n  \\\"mediumaquamarine\\\": [102,205,170,1], \\\"mediumblue\\\": [0,0,205,1],\\n  \\\"mediumorchid\\\": [186,85,211,1], \\\"mediumpurple\\\": [147,112,219,1],\\n  \\\"mediumseagreen\\\": [60,179,113,1], \\\"mediumslateblue\\\": [123,104,238,1],\\n  \\\"mediumspringgreen\\\": [0,250,154,1], \\\"mediumturquoise\\\": [72,209,204,1],\\n  \\\"mediumvioletred\\\": [199,21,133,1], \\\"midnightblue\\\": [25,25,112,1],\\n  \\\"mintcream\\\": [245,255,250,1], \\\"mistyrose\\\": [255,228,225,1],\\n  \\\"moccasin\\\": [255,228,181,1], \\\"navajowhite\\\": [255,222,173,1],\\n  \\\"navy\\\": [0,0,128,1], \\\"oldlace\\\": [253,245,230,1],\\n  \\\"olive\\\": [128,128,0,1], \\\"olivedrab\\\": [107,142,35,1],\\n  \\\"orange\\\": [255,165,0,1], \\\"orangered\\\": [255,69,0,1],\\n  \\\"orchid\\\": [218,112,214,1], \\\"palegoldenrod\\\": [238,232,170,1],\\n  \\\"palegreen\\\": [152,251,152,1], \\\"paleturquoise\\\": [175,238,238,1],\\n  \\\"palevioletred\\\": [219,112,147,1], \\\"papayawhip\\\": [255,239,213,1],\\n  \\\"peachpuff\\\": [255,218,185,1], \\\"peru\\\": [205,133,63,1],\\n  \\\"pink\\\": [255,192,203,1], \\\"plum\\\": [221,160,221,1],\\n  \\\"powderblue\\\": [176,224,230,1], \\\"purple\\\": [128,0,128,1],\\n  \\\"red\\\": [255,0,0,1], \\\"rosybrown\\\": [188,143,143,1],\\n  \\\"royalblue\\\": [65,105,225,1], \\\"saddlebrown\\\": [139,69,19,1],\\n  \\\"salmon\\\": [250,128,114,1], \\\"sandybrown\\\": [244,164,96,1],\\n  \\\"seagreen\\\": [46,139,87,1], \\\"seashell\\\": [255,245,238,1],\\n  \\\"sienna\\\": [160,82,45,1], \\\"silver\\\": [192,192,192,1],\\n  \\\"skyblue\\\": [135,206,235,1], \\\"slateblue\\\": [106,9
27310,205,1],\\n  \\\"slategray\\\": [112,128,144,1], \\\"slategrey\\\": [112,128,144,1],\\n  \\\"snow\\\": [255,250,250,1], \\\"springgreen\\\": [0,255,127,1],\\n  \\\"steelblue\\\": [70,130,180,1], \\\"tan\\\": [210,180,140,1],\\n  \\\"teal\\\": [0,128,128,1], \\\"thistle\\\": [216,191,216,1],\\n  \\\"tomato\\\": [255,99,71,1], \\\"turquoise\\\": [64,224,208,1],\\n  \\\"violet\\\": [238,130,238,1], \\\"wheat\\\": [245,222,179,1],\\n  \\\"white\\\": [255,255,255,1], \\\"whitesmoke\\\": [245,245,245,1],\\n  \\\"yellow\\\": [255,255,0,1], \\\"yellowgreen\\\": [154,205,50,1]}\\n\\nfunction clamp_css_byte(i) {  // Clamp to integer 0 .. 255.\\n  i = Math.round(i);  // Seems to be what Chrome does (vs truncation).\\n  return i \u003C 0 ? 0 : i > 255 ? 255 : i;\\n}\\n\\nfunction clamp_css_float(f) {  // Clamp to float 0.0 .. 1.0.\\n  return f \u003C 0 ? 0 : f > 1 ? 1 : f;\\n}\\n\\nfunction parse_css_int(str) {  // int or percentage.\\n  if (str[str.length - 1] === '%')\\n    return clamp_css_byte(parseFloat(str) / 100 * 255);\\n  return clamp_css_byte(parseInt(str));\\n}\\n\\nfunction parse_css_float(str) {  // float or percentage.\\n  if (str[str.length - 1] === '%')\\n    return clamp_css_float(parseFloat(str) / 100);\\n  return clamp_css_float(parseFloat(str));\\n}\\n\\nfunction css_hue_to_rgb(m1, m2, h) {\\n  if (h \u003C 0) h += 1;\\n  else if (h > 1) h -= 1;\\n\\n  if (h * 6 \u003C 1) return m1 + (m2 - m1) * h * 6;\\n  if (h * 2 \u003C 1) return m2;\\n  if (h * 3 \u003C 2) return m1 + (m2 - m1) * (2/3 - h) * 6;\\n  return m1;\\n}\\n\\nfunction parseCSSColor(css_str) {\\n  // Remove all whitespace, not compliant, but should just be more accepting.\\n  var str = css_str.replace(/ /g, '').toLowerCase();\\n\\n  // Color keywords (and transparent) lookup.\\n  if (str in kCSSColorTable) return kCSSColorTable[str].slice();  // dup.\\n\\n  // #abc and #abc123 syntax.\\n  if (str[0] === '#') {\\n    if (str.length === 4) {\\n      var iv = parseInt(str.substr(1), 16);  // TODO(deanm): Stricter parsing.\\n      if (!(iv >= 0 && iv \u003C= 0xfff)) return null;  // Covers NaN.\\n      return [((iv & 0xf00) >> 4) | ((iv & 0xf00) >> 8),\\n              (iv & 0xf0) | ((iv & 0xf0) >> 4),\\n              (iv & 0xf) | ((iv & 0xf) \u003C\u003C 4),\\n              1];\\n    } else if (str.length === 7) {\\n      var iv = parseInt(str.substr(1), 16);  // TODO(deanm): Stricter parsing.\\n      if (!(iv >= 0 && iv \u003C= 0xffffff)) return null;  // Covers NaN.\\n      return [(iv & 0xff0000) >> 16,\\n              (iv & 0xff00) >> 8,\\n              iv & 0xff,\\n              1];\\n    }\\n\\n    return null;\\n  }\\n\\n  var op = str.indexOf('('), ep = str.indexOf(')');\\n  if (op !== -1 && ep + 1 === str.length) {\\n    var fname = str.substr(0, op);\\n    var params = str.substr(op+1, ep-(op+1)).split(',');\\n    var alpha = 1;  // To allow case fallthrough.\\n    switch (fname) {\\n      case 'rgba':\\n        if (params.length !== 4) return null;\\n        alpha = parse_css_float(params.pop());\\n        // Fall through.\\n      case 'rgb':\\n        if (params.length !== 3) return null;\\n        return [parse_css_int(params[0]),\\n                parse_css_int(params[1]),\\n                parse_css_int(params[2]),\\n                alpha];\\n      case 'hsla':\\n        if (params.length !== 4) return null;\\n        alpha = parse_css_float(params.pop());\\n        // Fall through.\\n      case 'hsl':\\n        if (params.length !== 3) return null;\\n        var h = (((parseFloat(params[0]) % 360) + 360) % 360) / 360;  // 0 .. 1\\n        // NOTE(deanm): According to the CSS spec s/l should only be\\n        // percentages, but we don't bother and let float or percentage.\\n        var s = parse_css_float(params[1]);\\n        var l = parse_css_float(params[2]);\\n        var m2 = l \u003C= 0.5 ? l * (s + 1) : l + s - l * s;\\n        var m1 = l * 2 - m2;\\n        return [clamp_css_byte(css_hue_to_rgb(m1, m2, h+1/3) * 255),\\n                clamp_css_byte(css_hue_to_rgb(m1, m2, h) * 255),\\n                clamp_css_byte(css_hue_to_rgb(m1, m2, h-1/3) * 25
27315),\\n                alpha];\\n      default:\\n        return null;\\n    }\\n  }\\n\\n  return null;\\n}\\n\\ntry { exports.parseCSSColor = parseCSSColor } catch(e) { }\\n\",\"type\":\"application/javascript\",\"module-type\":\"utils\"},\"$:/core/modules/utils/dom.js\":{\"title\":\"$:/core/modules/utils/dom.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/utils/dom.js\\ntype: application/javascript\\nmodule-type: utils\\n\\nVarious static DOM-related utility functions.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Popup = require(\\\"$:/core/modules/utils/dom/popup.js\\\");\\n\\n/*\\nDetermines whether element 'a' contains element 'b'\\nCode thanks to John Resig, http://ejohn.org/blog/comparing-document-position/\\n*/\\nexports.domContains = function(a,b) {\\n\\treturn a.contains ?\\n\\t\\ta !== b && a.contains(b) :\\n\\t\\t!!(a.compareDocumentPosition(b) & 16);\\n};\\n\\nexports.domMatchesSelector = function(node,selector) {\\n\\treturn node.matches ? node.matches(selector) : node.msMatchesSelector(selector);\\n};\\n\\n/*\\nSelect text in a an input or textarea (setSelectionRange crashes on certain input types)\\n*/\\nexports.setSelectionRangeSafe = function(node,start,end,direction) {\\n\\ttry {\\n\\t\\tnode.setSelectionRange(start,end,direction);\\n\\t} catch(e) {\\n\\t\\tnode.select();\\n\\t}\\n};\\n\\n/*\\nSelect the text in an input or textarea by position\\n*/\\nexports.setSelectionByPosition = function(node,selectFromStart,selectFromEnd) {\\n\\t$tw.utils.setSelectionRangeSafe(node,selectFromStart,node.value.length - selectFromEnd);\\n};\\n\\nexports.removeChildren = function(node) {\\n\\twhile(node.hasChildNodes()) {\\n\\t\\tnode.removeChild(node.firstChild);\\n\\t}\\n};\\n\\nexports.hasClass = function(el,className) {\\n\\treturn el && el.hasAttribute && el.hasAttribute(\\\"class\\\") && el.getAttribute(\\\"class\\\").split(\\\" \\\").indexOf(className) !== -1;\\n};\\n\\nexports.addClass = function(el,className) {\\n\\tvar c = (el.getAttribute(\\\"class\\\") || \\\"\\\").split(\\\" \\\");\\n\\tif(c.indexOf(className) === -1) {\\n\\t\\tc.push(className);\\n\\t\\tel.setAttribute(\\\"class\\\",c.join(\\\" \\\"));\\n\\t}\\n};\\n\\nexports.removeClass = function(el,className) {\\n\\tvar c = (el.getAttribute(\\\"class\\\") || \\\"\\\").split(\\\" \\\"),\\n\\t\\tp = c.indexOf(className);\\n\\tif(p !== -1) {\\n\\t\\tc.splice(p,1);\\n\\t\\tel.setAttribute(\\\"class\\\",c.join(\\\" \\\"));\\n\\t}\\n};\\n\\nexports.toggleClass = function(el,className,status) {\\n\\tif(status === undefined) {\\n\\t\\tstatus = !exports.hasClass(el,className);\\n\\t}\\n\\tif(status) {\\n\\t\\texports.addClass(el,className);\\n\\t} else {\\n\\t\\texports.removeClass(el,className);\\n\\t}\\n};\\n\\n/*\\nGet the first parent element that has scrollbars or use the body as fallback.\\n*/\\nexports.getScrollContainer = function(el) {\\n\\tvar doc = el.ownerDocument;\\n\\twhile(el.parentNode) {\\n\\t\\tel = el.parentNode;\\n\\t\\tif(el.scrollTop) {\\n\\t\\t\\treturn el;\\n\\t\\t}\\n\\t}\\n\\treturn doc.body;\\n};\\n\\n/*\\nGet the scroll position of the viewport\\nReturns:\\n\\t{\\n\\t\\tx: horizontal scroll position in pixels,\\n\\t\\ty: vertical scroll position in pixels\\n\\t}\\n*/\\nexports.getScrollPosition = function(srcWindow) {\\n\\tvar scrollWindow = srcWindow || window;\\n\\tif(\\\"scrollX\\\" in scrollWindow) {\\n\\t\\treturn {x: scrollWindow.scrollX, y: scrollWindow.scrollY};\\n\\t} else {\\n\\t\\treturn {x: scrollWindow.document.documentElement.scrollLeft, y: scrollWindow.document.documentElement.scrollTop};\\n\\t}\\n};\\n\\n/*\\nAdjust the height of a textarea to fit its content, preserving scroll position, and return the height\\n*/\\nexports.resizeTextAreaToFit = function(domNode,minHeight) {\\n\\t// Get the scroll container and register the current scroll position\\n\\tvar container = $tw.utils.getScrollContainer(domNode),\\n\\t\\tscrollTop = container.scrollTop;\\n    // Measure the specified minimum height\\n\\tdomNode.style.height = minHeight;
2731\\n\\tvar measuredHeight = domNode.offsetHeight || parseInt(minHeight,10);\\n\\t// Set its height to auto so that it snaps to the correct height\\n\\tdomNode.style.height = \\\"auto\\\";\\n\\t// Calculate the revised height\\n\\tvar newHeight = Math.max(domNode.scrollHeight + domNode.offsetHeight - domNode.clientHeight,measuredHeight);\\n\\t// Only try to change the height if it has changed\\n\\tif(newHeight !== domNode.offsetHeight) {\\n\\t\\tdomNode.style.height = newHeight + \\\"px\\\";\\n\\t\\t// Make sure that the dimensions of the textarea are recalculated\\n\\t\\t$tw.utils.forceLayout(domNode);\\n\\t\\t// Set the container to the position we registered at the beginning\\n\\t\\tcontainer.scrollTop = scrollTop;\\n\\t}\\n\\treturn newHeight;\\n};\\n\\n/*\\nGets the bounding rectangle of an element in absolute page coordinates\\n*/\\nexports.getBoundingPageRect = function(element) {\\n\\tvar scrollPos = $tw.utils.getScrollPosition(element.ownerDocument.defaultView),\\n\\t\\tclientRect = element.getBoundingClientRect();\\n\\treturn {\\n\\t\\tleft: clientRect.left + scrollPos.x,\\n\\t\\twidth: clientRect.width,\\n\\t\\tright: clientRect.right + scrollPos.x,\\n\\t\\ttop: clientRect.top + scrollPos.y,\\n\\t\\theight: clientRect.height,\\n\\t\\tbottom: clientRect.bottom + scrollPos.y\\n\\t};\\n};\\n\\n/*\\nSaves a named password in the browser\\n*/\\nexports.savePassword = function(name,password) {\\n\\tvar done = false;\\n\\ttry {\\n\\t\\twindow.localStorage.setItem(\\\"tw5-password-\\\" + name,password);\\n\\t\\tdone = true;\\n\\t} catch(e) {\\n\\t}\\n\\tif(!done) {\\n\\t\\t$tw.savedPasswords = $tw.savedPasswords || Object.create(null);\\n\\t\\t$tw.savedPasswords[name] = password;\\n\\t}\\n};\\n\\n/*\\nRetrieve a named password from the browser\\n*/\\nexports.getPassword = function(name) {\\n\\tvar value;\\n\\ttry {\\n\\t\\tvalue = window.localStorage.getItem(\\\"tw5-password-\\\" + name);\\n\\t} catch(e) {\\n\\t}\\n\\tif(value !== undefined) {\\n\\t\\treturn value;\\n\\t} else {\\n\\t\\treturn ($tw.savedPasswords || Object.create(null))[name] || \\\"\\\";\\n\\t}\\n};\\n\\n/*\\nForce layout of a dom node and its descendents\\n*/\\nexports.forceLayout = function(element) {\\n\\tvar dummy = element.offsetWidth;\\n};\\n\\n/*\\nPulse an element for debugging purposes\\n*/\\nexports.pulseElement = function(element) {\\n\\t// Event handler to remove the class at the end\\n\\telement.addEventListener($tw.browser.animationEnd,function handler(event) {\\n\\t\\telement.removeEventListener($tw.browser.animationEnd,handler,false);\\n\\t\\t$tw.utils.removeClass(element,\\\"pulse\\\");\\n\\t},false);\\n\\t// Apply the pulse class\\n\\t$tw.utils.removeClass(element,\\\"pulse\\\");\\n\\t$tw.utils.forceLayout(element);\\n\\t$tw.utils.addClass(element,\\\"pulse\\\");\\n};\\n\\n/*\\nAttach specified event handlers to a DOM node\\ndomNode: where to attach the event handlers\\nevents: array of event handlers to be added (see below)\\nEach entry in the events array is an object with these properties:\\nhandlerFunction: optional event handler function\\nhandlerObject: optional event handler object\\nhandlerMethod: optionally specifies object handler method name (defaults to `handleEvent`)\\n*/\\nexports.addEventListeners = function(domNode,events) {\\n\\t$tw.utils.each(events,function(eventInfo) {\\n\\t\\tvar handler;\\n\\t\\tif(eventInfo.handlerFunction) {\\n\\t\\t\\thandler = eventInfo.handlerFunction;\\n\\t\\t} else if(eventInfo.handlerObject) {\\n\\t\\t\\tif(eventInfo.handlerMethod) {\\n\\t\\t\\t\\thandler = function(event) {\\n\\t\\t\\t\\t\\teventInfo.handlerObject[eventInfo.handlerMethod].call(eventInfo.handlerObject,event);\\n\\t\\t\\t\\t};\\n\\t\\t\\t} else {\\n\\t\\t\\t\\thandler = eventInfo.handlerObject;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tdomNode.addEventListener(eventInfo.name,handler,false);\\n\\t});\\n};\\n\\n/*\\nGet the computed styles applied to an element as an array of strings of individual CSS properties\\n*/\\nexports.getComputedStyles = function(domNode) {\\n\\tvar textAreaStyles = window.getComputedStyle(domNode,null),\\n\\t\\t
2731styleDefs = [],\\n\\t\\tname;\\n\\tfor(var t=0; t\u003CtextAreaStyles.length; t++) {\\n\\t\\tname = textAreaStyles[t];\\n\\t\\tstyleDefs.push(name + \\\": \\\" + textAreaStyles.getPropertyValue(name) + \\\";\\\");\\n\\t}\\n\\treturn styleDefs;\\n};\\n\\n/*\\nApply a set of styles passed as an array of strings of individual CSS properties\\n*/\\nexports.setStyles = function(domNode,styleDefs) {\\n\\tdomNode.style.cssText = styleDefs.join(\\\"\\\");\\n};\\n\\n/*\\nCopy the computed styles from a source element to a destination element\\n*/\\nexports.copyStyles = function(srcDomNode,dstDomNode) {\\n\\t$tw.utils.setStyles(dstDomNode,$tw.utils.getComputedStyles(srcDomNode));\\n};\\n\\n/*\\nCopy plain text to the clipboard on browsers that support it\\n*/\\nexports.copyToClipboard = function(text,options) {\\n\\toptions = options || {};\\n\\tvar textArea = document.createElement(\\\"textarea\\\");\\n\\ttextArea.style.position = \\\"fixed\\\";\\n\\ttextArea.style.top = 0;\\n\\ttextArea.style.left = 0;\\n\\ttextArea.style.fontSize = \\\"12pt\\\";\\n\\ttextArea.style.width = \\\"2em\\\";\\n\\ttextArea.style.height = \\\"2em\\\";\\n\\ttextArea.style.padding = 0;\\n\\ttextArea.style.border = \\\"none\\\";\\n\\ttextArea.style.outline = \\\"none\\\";\\n\\ttextArea.style.boxShadow = \\\"none\\\";\\n\\ttextArea.style.background = \\\"transparent\\\";\\n\\ttextArea.value = text;\\n\\tdocument.body.appendChild(textArea);\\n\\ttextArea.select();\\n\\ttextArea.setSelectionRange(0,text.length);\\n\\tvar succeeded = false;\\n\\ttry {\\n\\t\\tsucceeded = document.execCommand(\\\"copy\\\");\\n\\t} catch (err) {\\n\\t}\\n\\tif(!options.doNotNotify) {\\n\\t\\t$tw.notifier.display(succeeded ? \\\"$:/language/Notifications/CopiedToClipboard/Succeeded\\\" : \\\"$:/language/Notifications/CopiedToClipboard/Failed\\\");\\n\\t}\\n\\tdocument.body.removeChild(textArea);\\n};\\n\\nexports.getLocationPath = function() {\\n\\treturn window.location.toString().split(\\\"#\\\")[0];\\n};\\n\\n/*\\nCollect DOM variables\\n*/\\nexports.collectDOMVariables = function(selectedNode,domNode,event) {\\n\\tvar variables = {},\\n\\t    selectedNodeRect,\\n\\t    domNodeRect;\\n\\tif(selectedNode) {\\n\\t\\t$tw.utils.each(selectedNode.attributes,function(attribute) {\\n\\t\\t\\tvariables[\\\"dom-\\\" + attribute.name] = attribute.value.toString();\\n\\t\\t});\\n\\t\\t\\n\\t\\tif(selectedNode.offsetLeft) {\\n\\t\\t\\t// Add variables with a (relative and absolute) popup coordinate string for the selected node\\n\\t\\t\\tvar nodeRect = {\\n\\t\\t\\t\\tleft: selectedNode.offsetLeft,\\n\\t\\t\\t\\ttop: selectedNode.offsetTop,\\n\\t\\t\\t\\twidth: selectedNode.offsetWidth,\\n\\t\\t\\t\\theight: selectedNode.offsetHeight\\n\\t\\t\\t};\\n\\t\\t\\tvariables[\\\"tv-popup-coords\\\"] = Popup.buildCoordinates(Popup.coordinatePrefix.csOffsetParent,nodeRect);\\n\\n\\t\\t\\tvar absRect = $tw.utils.extend({}, nodeRect);\\n\\t\\t\\tfor (var currentNode = selectedNode.offsetParent; currentNode; currentNode = currentNode.offsetParent) {\\n\\t\\t\\t\\tabsRect.left += currentNode.offsetLeft;\\n\\t\\t\\t\\tabsRect.top += currentNode.offsetTop;\\n\\t\\t\\t}\\n\\t\\t\\tvariables[\\\"tv-popup-abs-coords\\\"] = Popup.buildCoordinates(Popup.coordinatePrefix.csAbsolute,absRect);\\n\\n\\t\\t\\t// Add variables for offset of selected node\\n\\t\\t\\tvariables[\\\"tv-selectednode-posx\\\"] = selectedNode.offsetLeft.toString();\\n\\t\\t\\tvariables[\\\"tv-selectednode-posy\\\"] = selectedNode.offsetTop.toString();\\n\\t\\t\\tvariables[\\\"tv-selectednode-width\\\"] = selectedNode.offsetWidth.toString();\\n\\t\\t\\tvariables[\\\"tv-selectednode-height\\\"] = selectedNode.offsetHeight.toString();\\n\\t\\t}\\n\\t}\\n\\t\\n\\tif(domNode && domNode.offsetWidth) {\\n\\t\\tvariables[\\\"tv-widgetnode-width\\\"] = domNode.offsetWidth.toString();\\n\\t\\tvariables[\\\"tv-widgetnode-height\\\"] = domNode.offsetHeight.toString();\\n\\t}\\n\\n\\tif(event && event.clientX && event.clientY) {\\n\\t\\tif(selectedNode) {\\n\\t\\t\\t// Add variables for event X and Y position relative to selected node\\n\\t\\t\\tselectedNodeRect = selectedNode.getBoundingClientRect();\\n\\t\\t\\tvariables[\\\"event-fromselected-posx\\\"] = (event.clientX - selectedNodeRect.left).toString();\\n\\t\\t\\tvariables[\\\"event-fromselected-posy\\\"] = (event.clientY - selectedNodeRect.top).toString();\\n\\t\\t}\\n\\t\\t\\n\\t\\tif(domNode) {\\n\\t\\t\\t// Add variables for event X and Y position relative to event catcher node\\n\\t\\t\\tdomNodeRect = domNode.getBoundingClientRect();\\n\\t\\t\\tvariables[\\\"event-fromcatcher-posx\\\"] = (event.clientX - domNodeRect.left).toString();\\n\\t\\t\\tvariables[\\\"event-fromcatcher-posy\\\"] = (event.clientY - domNodeRect.top).toString();\\n\\t\\t}\\n\\n\\t\\t// Add variables for event X and Y position relative to the viewport\\n\\t\\tvariables[\\\"event-fromviewport-posx\\\"] = event.clientX.toString();\\n\\t\\tvariables[\\\"event-fromviewport-posy\\\"] = event.clientY.toString();\\n\\t}\\n\\treturn variables;\\n};
2731\\n\\n/*\\nMake sure the CSS selector is not invalid\\n*/\\nexports.querySelectorSafe = function(selector,baseElement) {\\n\\tbaseElement = baseElement || document;\\n\\ttry {\\n\\t\\treturn baseElement.querySelector(selector);\\n\\t} catch(e) {\\n\\t\\tconsole.log(\\\"Invalid selector: \\\",selector);\\n\\t}\\n};\\n\\nexports.querySelectorAllSafe = function(selector,baseElement) {\\n\\tbaseElement = baseElement || document;\\n\\ttry {\\n\\t\\treturn baseElement.querySelectorAll(selector);\\n\\t} catch(e) {\\n\\t\\tconsole.log(\\\"Invalid selector: \\\",selector);\\n\\t}\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"utils\"},\"$:/core/modules/utils/dom/dragndrop.js\":{\"title\":\"$:/core/modules/utils/dom/dragndrop.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/utils/dom/dragndrop.js\\ntype: application/javascript\\nmodule-type: utils\\n\\nBrowser data transfer utilities, used with the clipboard and drag and drop\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nOptions:\\n\\ndomNode: dom node to make draggable\\nselector: CSS selector to identify element within domNode to be used as drag handle (optional)\\ndragImageType: \\\"pill\\\", \\\"blank\\\" or \\\"dom\\\" (the default)\\ndragTiddlerFn: optional function to retrieve the title of tiddler to drag\\ndragFilterFn: optional function to retreive the filter defining a list of tiddlers to drag\\nwidget: widget to use as the context for the filter\\n*/\\nexports.makeDraggable = function(options) {\\n\\tvar dragImageType = options.dragImageType || \\\"dom\\\",\\n\\t\\tdragImage,\\n\\t\\tdomNode = options.domNode;\\n\\t// Make the dom node draggable (not necessary for anchor tags)\\n\\tif(!options.selector && ((domNode.tagName || \\\"\\\").toLowerCase() !== \\\"a\\\")) {\\n\\t\\tdomNode.setAttribute(\\\"draggable\\\",\\\"true\\\");\\n\\t}\\n\\t// Add event handlers\\n\\t$tw.utils.addEventListeners(domNode,[\\n\\t\\t{name: \\\"dragstart\\\", handlerFunction: function(event) {\\n\\t\\t\\tif(event.dataTransfer === undefined) {\\n\\t\\t\\t\\treturn false;\\n\\t\\t\\t}\\n\\t\\t\\t// Collect the tiddlers being dragged\\n\\t\\t\\tvar dragTiddler = options.dragTiddlerFn && options.dragTiddlerFn(),\\n\\t\\t\\t\\tdragFilter = options.dragFilterFn && options.dragFilterFn(),\\n\\t\\t\\t\\ttitles = dragTiddler ? [dragTiddler] : [],\\n\\t\\t\\t\\tstartActions = options.startActions,\\n\\t\\t\\t\\tvariables,\\n\\t\\t\\t\\tdomNodeRect;\\n\\t\\t\\tif(dragFilter) {\\n\\t\\t\\t\\ttitles.push.apply(titles,options.widget.wiki.filterTiddlers(dragFilter,options.widget));\\n\\t\\t\\t}\\n\\t\\t\\tvar titleString = $tw.utils.stringifyList(titles);\\n\\t\\t\\t// Check that we've something to drag\\n\\t\\t\\tif(titles.length > 0 && (options.selector && $tw.utils.domMatchesSelector(event.target,options.selector) || event.target === domNode)) {\\n\\t\\t\\t\\t// Mark the drag in progress\\n\\t\\t\\t\\t$tw.dragInProgress = domNode;\\n\\t\\t\\t\\t// Set the dragging class on the element being dragged\\n\\t\\t\\t\\t$tw.utils.addClass(domNode,\\\"tc-dragging\\\");\\n\\t\\t\\t\\t// Invoke drag-start actions if given\\n\\t\\t\\t\\tif(startActions !== undefined) {\\n\\t\\t\\t\\t\\t// Collect our variables\\n\\t\\t\\t\\t\\tvariables = $tw.utils.collectDOMVariables(domNode,null,event);\\n\\t\\t\\t\\t\\tvariables.modifier = $tw.keyboardManager.getEventModifierKeyDescriptor(event);\\n\\t\\t\\t\\t\\tvariables[\\\"actionTiddler\\\"] = titleString;\\n\\t\\t\\t\\t\\toptions.widget.invokeActionString(startActions,options.widget,event,variables);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t// Create the drag image elements\\n\\t\\t\\t\\tdragImage = options.widget.document.createElement(\\\"div\\\");\\n\\t\\t\\t\\tdragImage.className = \\\"tc-tiddler-dragger\\\";\\n\\t\\t\\t\\tvar inner = options.widget.document.createElement(\\\"div\\\");\\n\\t\\t\\t\\tinner.className = \\\"tc-tiddler-dragger-inner\\\";\\n\\t\\t\\t\\tinner.appendChild(options.widget.document.createTextNode(\\n\\t\\t\\t\\t\\ttitles.length === 1 ? \\n\\t\\t\\t\\t\\t\\ttitles[0] :\\n\\t\\t\\t\\t\\t\\ttitles.length + \\\" tiddlers\\\"\\n\\t\\t\\t\\t));\\n\\t\\t\\t\\tdragImage.appendChild(inner);\\n\\t\\t\\t\\toptions.widget.document.body.appendChild(dragImage);\\n\\t\\t\\t\\t// Set the data transfer properties\\n\\t\\t\\t\\tvar dataTransfer = event.dataTransfer;\\n\\t\\t\\t\\t// Set up the image\\n\\t\\t\\t\\tdataTransfer.effectAllowed = \\\"all\\\";\\n\\t\\t\\t\\tif(dataTransfer.setDragImage) {\\n\\t\\t\\t\\t\\tif(dragImageType === \\\"pill\\\") {\\n\\t\\t\\t\\t\\t\\tdataTransfer.setDragImage(dragImage.firstChild,-16,-16);\\n\\t\\t\\t\\t\\t} else if(dragImageType === \\\"blank\\\") {\\n\\t\\t\\t\\t\\t\\tdragImage.removeChild(dragImage.firstChild);
2731\\n\\t\\t\\t\\t\\t\\tdataTransfer.setDragImage(dragImage,0,0);\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\tvar r = domNode.getBoundingClientRect();\\n\\t\\t\\t\\t\\t\\tdataTransfer.setDragImage(domNode,event.clientX-r.left,event.clientY-r.top);\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t// Set up the data transfer\\n\\t\\t\\t\\tif(dataTransfer.clearData) {\\n\\t\\t\\t\\t\\tdataTransfer.clearData();\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tvar jsonData = [];\\n\\t\\t\\t\\tif(titles.length > 1) {\\n\\t\\t\\t\\t\\ttitles.forEach(function(title) {\\n\\t\\t\\t\\t\\t\\tjsonData.push(options.widget.wiki.getTiddlerAsJson(title));\\n\\t\\t\\t\\t\\t});\\n\\t\\t\\t\\t\\tjsonData = \\\"[\\\" + jsonData.join(\\\",\\\") + \\\"]\\\";\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tjsonData = options.widget.wiki.getTiddlerAsJson(titles[0]);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t// IE doesn't like these content types\\n\\t\\t\\t\\tif(!$tw.browser.isIE) {\\n\\t\\t\\t\\t\\tdataTransfer.setData(\\\"text/vnd.tiddler\\\",jsonData);\\n\\t\\t\\t\\t\\tdataTransfer.setData(\\\"text/plain\\\",titleString);\\n\\t\\t\\t\\t\\tdataTransfer.setData(\\\"text/x-moz-url\\\",\\\"data:text/vnd.tiddler,\\\" + encodeURIComponent(jsonData));\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t// If browser is Chrome-like and has a touch-input device do NOT .setData\\n\\t\\t\\t\\tif(!($tw.browser.isMobileChrome)) {\\n\\t\\t\\t\\t\\tdataTransfer.setData(\\\"URL\\\",\\\"data:text/vnd.tiddler,\\\" + encodeURIComponent(jsonData));\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tdataTransfer.setData(\\\"Text\\\",titleString);\\n\\t\\t\\t\\tevent.stopPropagation();\\n\\t\\t\\t}\\n\\t\\t\\treturn false;\\n\\t\\t}},\\n\\t\\t{name: \\\"dragend\\\", handlerFunction: function(event) {\\n\\t\\t\\tif((options.selector && $tw.utils.domMatchesSelector(event.target,options.selector)) || event.target === domNode) {\\n\\t\\t\\t\\t// Collect the tiddlers being dragged\\n\\t\\t\\t\\tvar dragTiddler = options.dragTiddlerFn && options.dragTiddlerFn(),\\n\\t\\t\\t\\t\\tdragFilter = options.dragFilterFn && options.dragFilterFn(),\\n\\t\\t\\t\\t\\ttitles = dragTiddler ? [dragTiddler] : [],\\n\\t\\t\\t\\t\\tendActions = options.endActions,\\n\\t\\t\\t\\t\\tvariables;\\n\\t\\t\\t\\tif(dragFilter) {\\n\\t\\t\\t\\t\\ttitles.push.apply(titles,options.widget.wiki.filterTiddlers(dragFilter,options.widget));\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tvar titleString = $tw.utils.stringifyList(titles);\\n\\t\\t\\t\\t$tw.dragInProgress = null;\\n\\t\\t\\t\\t// Invoke drag-end actions if given\\n\\t\\t\\t\\tif(endActions !== undefined) {\\n\\t\\t\\t\\t\\tvariables = $tw.utils.collectDOMVariables(domNode,null,event);\\n\\t\\t\\t\\t\\tvariables.modifier = $tw.keyboardManager.getEventModifierKeyDescriptor(event);\\n\\t\\t\\t\\t\\tvariables[\\\"actionTiddler\\\"] = titleString;\\n\\t\\t\\t\\t\\toptions.widget.invokeActionString(endActions,options.widget,event,variables);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t// Remove the dragging class on the element being dragged\\n\\t\\t\\t\\t$tw.utils.removeClass(domNode,\\\"tc-dragging\\\");\\n\\t\\t\\t\\t// Delete the drag image element\\n\\t\\t\\t\\tif(dragImage) {\\n\\t\\t\\t\\t\\tdragImage.parentNode.removeChild(dragImage);\\n\\t\\t\\t\\t\\tdragImage = null;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\treturn false;\\n\\t\\t}}\\n\\t]);\\n};\\n\\nexports.importDataTransfer = function(dataTransfer,fallbackTitle,callback) {\\n\\t// Try each provided data type in turn\\n\\tif($tw.log.IMPORT) {\\n\\t\\tconsole.log(\\\"Available data types:\\\");\\n\\t\\tfor(var type=0; type\u003CdataTransfer.types.length; type++) {\\n\\t\\t\\tconsole.log(\\\"type\\\",dataTransfer.types[type],dataTransfer.getData(dataTransfer.types[type]))\\n\\t\\t}\\n\\t}\\n\\tfor(var t=0; t\u003CimportDataTypes.length; t++) {\\n\\t\\tif(!$tw.browser.isIE || importDataTypes[t].IECompatible) {\\n\\t\\t\\t// Get the data\\n\\t\\t\\tvar dataType = importDataTypes[t];\\n\\t\\t\\tvar data = dataTransfer.getData(dataType.type);\\n\\t\\t\\t// Import the tiddlers in the data\\n\\t\\t\\tif(data !== \\\"\\\" && data !== null) {\\n\\t\\t\\t\\tif($tw.log.IMPORT) {\\n\\t\\t\\t\\t\\tconsole.log(\\\"Importing data type '\\\" + dataType.type + \\\"', data: '\\\" + data + \\\"'\\\")\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tvar tiddlerFields = dataType.toTiddlerFieldsArray(data,fallbackTitle);\\n\\t\\t\\t\\tcallback(tiddlerFields);\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n};\\n\\nexports.importPaste = function(item,fallbackTitle,callback) {\\n\\t// Try each provided data type in turn\\n\\tfor(var t=0; t\u003CimportDataTypes.length; t++) {\\n\\t\\tif(item.type === importDataTypes[t].type) {\\n\\t\\t\\t// Get the data\\n\\t\\t\\tvar dataType = importDataTypes[t];\\n\\n\\t\\t\\titem.getAsString(function(data){\\n\\t\\t\\t\\tif($tw.log.IMPORT) {\\n\\t\\t\\t\\t\\tconsole.log(\\\"Importing data type '\\\" + dataType.type + \\\"', data: '\\\" + data + \\\"'\\\")\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tvar tiddlerFields = dataType.toTiddlerFieldsArray(data,fallbackTitle);\\n\\t\\t\\t\\tcallback(tiddlerFields);\\n\\t\\t\\t});\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\t}\\n};\\n\\nexports.itemHasValidDataType = function(item) {\\n\\tfor(var t=0; t\u003CimportDataTypes.length; t++) {\\n\\t\\tif(!$tw.browser.isIE || importDataTypes[t].IECompatible) {\\n\\t\\t\\tif(item.type === importDataTypes[t].type) {\\n\\t\\t\\t\\treturn true;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\treturn false;\\n}\\n\\nvar importDataTypes = [\\n\\t{type: \\\"text/vnd.tiddler\\\", IECompatible: false, toT
2731iddlerFieldsArray: function(data,fallbackTitle) {\\n\\t\\treturn parseJSONTiddlers(data,fallbackTitle);\\n\\t}},\\n\\t{type: \\\"URL\\\", IECompatible: true, toTiddlerFieldsArray: function(data,fallbackTitle) {\\n\\t\\t// Check for tiddler data URI\\n\\t\\tvar match = $tw.utils.decodeURIComponentSafe(data).match(/^data\\\\:text\\\\/vnd\\\\.tiddler,(.*)/i);\\n\\t\\tif(match) {\\n\\t\\t\\treturn parseJSONTiddlers(match[1],fallbackTitle);\\n\\t\\t} else {\\n\\t\\t\\treturn [{title: fallbackTitle, text: data}]; // As URL string\\n\\t\\t}\\n\\t}},\\n\\t{type: \\\"text/x-moz-url\\\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\\n\\t\\t// Check for tiddler data URI\\n\\t\\tvar match = $tw.utils.decodeURIComponentSafe(data).match(/^data\\\\:text\\\\/vnd\\\\.tiddler,(.*)/i);\\n\\t\\tif(match) {\\n\\t\\t\\treturn parseJSONTiddlers(match[1],fallbackTitle);\\n\\t\\t} else {\\n\\t\\t\\treturn [{title: fallbackTitle, text: data}]; // As URL string\\n\\t\\t}\\n\\t}},\\n\\t{type: \\\"text/html\\\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\\n\\t\\treturn [{title: fallbackTitle, text: data}];\\n\\t}},\\n\\t{type: \\\"text/plain\\\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\\n\\t\\treturn [{title: fallbackTitle, text: data}];\\n\\t}},\\n\\t{type: \\\"Text\\\", IECompatible: true, toTiddlerFieldsArray: function(data,fallbackTitle) {\\n\\t\\treturn [{title: fallbackTitle, text: data}];\\n\\t}}
2731,\\n\\t{type: \\\"text/uri-list\\\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\\n\\t\\t// Check for tiddler data URI\\n\\t\\tvar match = $tw.utils.decodeURIComponentSafe(data).match(/^data\\\\:text\\\\/vnd\\\\.tiddler,(.*)/i);\\n\\t\\tif(match) {\\n\\t\\t\\treturn parseJSONTiddlers(match[1],fallbackTitle);\\n\\t\\t} else {\\n\\t\\t\\treturn [{title: fallbackTitle, text: data}]; // As URL string\\n\\t\\t}\\n\\t}}\\n];\\n\\nfunction parseJSONTiddlers(json,fallbackTitle) {\\n\\tvar data = $tw.utils.parseJSONSafe(json);\\n\\tif(!$tw.utils.isArray(data)) {\\n\\t\\tdata = [data];\\n\\t}\\n\\tdata.forEach(function(fields) {\\n\\t\\tfields.title = fields.title || fallbackTitle;\\n\\t});\\n\\treturn data;\\n};\\n\\nfunction dragEventContainsType(event,targetType) {\\n\\tif(event.dataTransfer.types) {\\n\\t\\tfor(var i=0; i\u003Cevent.dataTransfer.types.length; i++) {\\n\\t\\t\\tif(event.dataTransfer.types[i] === targetType) {\\n\\t\\t\\t\\treturn true;\\n\\t\\t\\t\\tbreak;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\treturn false;\\n};\\n\\nexports.dragEventContainsFiles = function(event) {\\n\\treturn (dragEventContainsType(event,\\\"Files\\\") && !dragEventContainsType(event,\\\"text/plain\\\"));\\n};\\n\\nexports.dragEventContainsType = dragEventContainsType;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"utils\"},\"$:/core/modules/utils/dom/http.js\":{\"title\":\"$:/core/modules/utils/dom/http.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/utils/dom/http.js\\ntype: application/javascript\\nmodule-type: utils\\n\\nHTTP support\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nManage tm-http-request events. Options include:\\nwiki: Reference to the wiki to be used for state tiddler tracking\\nstateTrackerTitle: Title of tiddler to be used for state tiddler tracking\\n*/\\nfunction HttpClient(options) {\\n\\toptions = options || {};\\n\\tthis.nextId = 1;\\n\\tthis.wiki = options.wiki || $tw.wiki;\\n\\tthis.stateTrackerTitle = options.stateTrackerTitle || \\\"$:/state/http-requests\\\";\\n\\tthis.requests = []; // Array of {id: string,request: HttpClientRequest}\\n\\tthis.updateRequestTracker();\\n}\\n\\n/*\\nReturn the index into this.requests[] corresponding to a given ID. Returns null if not found\\n*/\\nHttpClient.prototype.getRequestIndex = function(targetId) {\\n\\tvar targetIndex = null;\\n\\t$tw.utils.each(this.requests,function(requestInfo,index) {\\n\\t\\tif(requestInfo.id === targetId) {\\n\\t\\t\\ttargetIndex = index;\\n\\t\\t}\\n\\t});\\n\\treturn targetIndex;\\n};\\n\\n/*\\nUpdate the state tiddler that is tracking the outstanding requests\\n*/\\nHttpClient.prototype.updateRequestTracker = function() {\\n\\tthis.wiki.addTiddler({title: this.stateTrackerTitle, text: \\\"\\\" + this.requests.length});\\n};\\n\\nHttpClient.prototype.initiateHttpRequest = function(options) {\\n\\tvar self = this,\\n\\t\\tid = this.nextId,\\n\\t\\trequest = new HttpClientRequest(options);\\n\\tthis.nextId += 1;\\n\\tthis.requests.push({id: id, request: request});\\n\\tthis.updateRequestTracker();\\n\\trequest.send(function(err) {\\n\\t\\tvar targetIndex = self.getRequestIndex(id);\\n\\t\\tif(targetIndex !== null) {\\n\\t\\t\\tself.requests.splice(targetIndex,1);\\n\\t\\t\\tself.updateRequestTracker();\\n\\t\\t}\\n\\t});\\n\\treturn id;\\n};\\n\\nHttpClient.prototype.cancelAllHttpRequests = function() {\\n\\tvar self = this;\\n\\tif(this.requests.length > 0) {\\n\\t\\tfor(var t=this.requests.length - 1; t--; t>=0) {\\n\\t\\t\\tvar requestInfo = this.requests[t];\\n\\t\\t\\trequestInfo.request.cancel();\\n\\t\\t}\\t\\n\\t}\\n\\tthis.requests = [];\\n\\tthis.updateRequestTracker();\\n};\\n\\nHttpClient.prototype.cancelHttpRequest = function(targetId) {\\n\\tvar targetIndex = this.getRequestIndex(targetId);\\n\\tif(targetIndex !== null) {\\n\\t\\tthis.requests[targetIndex].request.cancel();\\n\\t\\tthis.requests.splice(targetIndex,1);\\n\\t\\tthis.updateRequestTracker();\\n\\t}\\n};\\n\\n/*\\nInitiate an HTTP request. Options:\\nwiki: wiki to be used for executing action strings\\nurl: URL for request\\nmethod: method eg GET, POST\\nbody: text of request body\\nbinary: set to \\\"yes\\\" to force binary processing of response payload\\noncompletion: action string to be invoked on completion\\nonprogress: action string to be invoked on progress updates\\nbindStatus: optional title of tiddler to which status (\\\"pending\\\", \\\"complete\\\", \\\"error\\\") should be written\\nbindProgress: optional title of tiddler to which the progress of the request (0 to 100) should be bound\\
2731nvariables: hashmap of variable name to string value passed to action strings\\nheaders: hashmap of header name to header value to be sent with the request\\npasswordHeaders: hashmap of header name to password store name to be sent with the request\\nqueryStrings: hashmap of query string parameter name to parameter value to be sent with the request\\npasswordQueryStrings: hashmap of query string parameter name to password store name to be sent with the request\\n*/\\nfunction HttpClientRequest(options) {\\n\\tvar self = this;\\n\\tconsole.log(\\\"Initiating an HTTP request\\\",options)\\n\\tthis.wiki = options.wiki;\\n\\tthis.completionActions = options.oncompletion;\\n\\tthis.progressActions = options.onprogress;\\n\\tthis.bindStatus = options[\\\"bindStatus\\\"];\\n\\tthis.bindProgress = options[\\\"bindProgress\\\"];\\n\\tthis.method = options.method || \\\"GET\\\";\\n\\tthis.body = options.body || \\\"\\\";\\n\\tthis.binary = options.binary || \\\"\\\";\\n\\tthis.variables = options.variables;\\n\\tvar url = options.url;\\n\\t$tw.utils.each(options.queryStrings,function(value,name) {\\n\\t\\turl = $tw.utils.setQueryStringParameter(url,name,value);\\n\\t});\\n\\t$tw.utils.each(options.passwordQueryStrings,function(value,name) {\\n\\t\\turl = $tw.utils.setQueryStringParameter(url,name,$tw.utils.getPassword(value) || \\\"\\\");\\n\\t});\\n\\tthis.url = url;\\n\\tthis.requestHeaders = {};\\n\\t$tw.utils.each(options.headers,function(value,name) {\\n\\t\\tself.requestHeaders[name] = value;\\n\\t});\\n\\t$tw.utils.each(options.passwordHeaders,function(value,name) {\\n\\t\\tself.requestHeaders[name] = $tw.utils.getPassword(value) || \\\"\\\";\\n\\t});\\n}\\n\\nHttpClientRequest.prototype.send = function(callback) {\\n\\tvar self = this,\\n\\t\\tsetBinding = function(title,text) {\\n\\t\\t\\tif(title) {\\n\\t\\t\\t\\tself.wiki.addTiddler(new $tw.Tiddler({title: title, text: text}));\\n\\t\\t\\t}\\n\\t\\t};\\n\\tif(this.url) {\\n\\t\\tsetBinding(this.bindStatus,\\\"pending\\\");\\n\\t\\tsetBinding(this.bindProgress,\\\"0\\\");\\n\\t\\t// Set the request tracker tiddler\\n\\t\\tvar requestTrackerTitle = this.wiki.generateNewTitle(\\\"$:/temp/HttpRequest\\\");\\n\\t\\tthis.wiki.addTiddler({\\n\\t\\t\\ttitle: requestTrackerTitle,\\n\\t\\t\\ttags: \\\"$:/tags/HttpRequest\\\",\\n\\t\\t\\ttext: JSON.stringify({\\n\\t\\t\\t\\turl: this.url,\\n\\t\\t\\t\\ttype: this.method,\\n\\t\\t\\t\\tstatus: \\\"inprogress\\\",\\n\\t\\t\\t\\theaders: this.requestHeaders,\\n\\t\\t\\t\\tdata: this.body\\n\\t\\t\\t})\\n\\t\\t});\\n\\t\\tthis.xhr = $tw.utils.httpRequest({\\n\\t\\t\\turl: this.url,\\n\\t\\t\\ttype: this.method,\\n\\t\\t\\theaders: this.requestHeaders,\\n\\t\\t\\tdata: this.body,\\n\\t\\t\\treturnProp: this.binary === \\\"\\\" ? \\\"responseText\\\" : \\\"response\\\",\\n\\t\\t\\tresponseType: this.binary === \\\"\\\" ? \\\"text\\\" : \\\"arraybuffer\\\",\\n\\t\\t\\tcallback: function(err,data,xhr) {\\n\\t\\t\\t\\tvar hasSucceeded = xhr.status >= 200 && xhr.status \u003C 300,\\n\\t\\t\\t\\t\\tcompletionCode = hasSucceeded ? \\\"complete\\\" : \\\"error\\\",\\n\\t\\t\\t\\t\\theaders = {};\\n\\t\\t\\t\\t$tw.utils.each(xhr.getAllResponseHeaders().split(\\\"\\\\r\\\\n\\\"),function(line) {\\n\\t\\t\\t\\t\\tvar pos = line.indexOf(\\\":\\\");\\n\\t\\t\\t\\t\\tif(pos !== -1) {\\n\\t\\t\\t\\t\\t\\theaders[line.substr(0,pos)] = line.substr(pos + 1).trim();\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t});\\n\\t\\t\\t\\tsetBinding(self.bindStatus,completionCode);\\n\\t\\t\\t\\tsetBinding(self.bindProgress,\\\"100\\\");\\n\\t\\t\\t\\tvar resultVariables = {\\n\\t\\t\\t\\t\\tstatus: xhr.status.toString(),\\n\\t\\t\\t\\t\\tstatusText: xhr.statusText,\\n\\t\\t\\t\\t\\terror: (err || \\\"\\\").toString(),\\n\\t\\t\\t\\t\\tdata: (data || \\\"\\\").toString(),\\n\\t\\t\\t\\t\\theaders: JSON.stringify(headers)\\n\\t\\t\\t\\t};\\n\\t\\t\\t\\t/* Convert data from binary to base64 */\\n\\t\\t\\t\\tif (xhr.responseType === \\\"arraybuffer\\\") {\\n\\t\\t\\t\\t\\tvar binary = \\\"\\\",\\n\\t\\t\\t\\t\\t\\tbytes = new Uint8Array(data),\\n\\t\\t\\t\\t\\t\\tlen = bytes.byteLength;\\n\\t\\t\\t\\t\\tfor (var i=0; i\u003Clen; i++) {\\n\\t\\t\\t\\t\\t\\tbinary += String.fromCharCode(bytes[i]);\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tresultVariables.data = window.btoa(binary);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tself.wiki.addTiddler(new $tw.Tiddler(self.wiki.getTiddler(requestTrackerTitle),{\\n\\t\\t\\t\\t\\tstatus: completionCode,\\n\\t\\t\\t\\t}));\\n\\t\\t\\t\\tself.wiki.invokeActionString(self.completionActions,undefined,$tw.utils.extend({},self.variables,resultVariables),{parentWidget: $tw.rootWidget});\\n\\t\\t\\t\\tcallback(hasSucceeded ? null : xhr.statusText);\\n\\t\\t\\t\\t// console.log(\\\"Back!\\\",err,data,xhr);\\n\\t\\t\\t},\\n\\t\\t\\tprogress: function(lengthComputable,loaded,total) {\\n\\t\\t\\t\\tif(lengthComputable) {\\n\\t\\t\\t\\t\\tsetBinding(self.bindProgress,\\\"\\\" + Math.floor((loaded/total) * 100))\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tself.wiki.invokeActionString(self.progressActions,undefined,{\\n\\t\\t\\t\\t\\tlengthComputable: lengthComputable ? \\\"yes\\\" : \\\"no\\\",\\n\\t\\t\\t\\t\\tloaded: loaded,\\n\\t\\t\\t\\t\\ttotal: total\\n\\t\\t\\t\\t},{parentWidget: $tw.rootWidget});\\n\\t\\t\\t}\\n\\t\\t});\\n\\t}\\n};\\n\\nHttpClientRequest.prototype.cancel = function() {\\n\\tif(this.xhr) {\\n\\t\\tthis.xhr.abort();\\n\\t}\\n};\\n\\nexports.HttpClient = HttpClient;\\n\\n/*\\nMake an HTTP request. Options are:\\n\\turl: URL to retrieve\\n\\theaders: hashmap of headers to send\\n\\ttype: GET, PUT, PO
2731ST etc\\n\\tcallback: function invoked with (err,data,xhr)\\n\\tprogress: optional function invoked with (lengthComputable,loaded,total)\\n\\treturnProp: string name of the property to return as first argument of callback\\n\\tresponseType: \\\"text\\\" or \\\"arraybuffer\\\"\\n*/\\nexports.httpRequest = function(options) {\\n\\tvar type = options.type || \\\"GET\\\",\\n\\t\\turl = options.url,\\n\\t\\theaders = options.headers || {accept: \\\"application/json\\\"},\\n\\t\\thasHeader = function(targetHeader) {\\n\\t\\t\\ttargetHeader = targetHeader.toLowerCase();\\n\\t\\t\\tvar result = false;\\n\\t\\t\\t$tw.utils.each(headers,function(header,headerTitle,object) {\\n\\t\\t\\t\\tif(headerTitle.toLowerCase() === targetHeader) {\\n\\t\\t\\t\\t\\tresult = true;\\n\\t\\t\\t\\t}\\n\\t\\t\\t});\\n\\t\\t\\treturn result;\\n\\t\\t},\\n\\t\\tgetHeader = function(targetHeader) {\\n\\t\\t\\treturn headers[targetHeader] || headers[targetHeader.toLowerCase()];\\n\\t\\t},\\n\\t\\tisSimpleRequest = function(type,headers) {\\n\\t\\t\\tif([\\\"GET\\\",\\\"HEAD\\\",\\\"POST\\\"].indexOf(type) === -1) {\\n\\t\\t\\t\\treturn false;\\n\\t\\t\\t}\\n\\t\\t\\tfor(var header in headers) {\\n\\t\\t\\t\\tif([\\\"accept\\\",\\\"accept-language\\\",\\\"content-language\\\",\\\"content-type\\\"].indexOf(header.toLowerCase()) === -1) {\\n\\t\\t\\t\\t\\treturn false;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\tif(hasHeader(\\\"Content-Type\\\") && [\\\"application/x-www-form-urlencoded\\\",\\\"multipart/form-data\\\",\\\"text/plain\\\"].indexOf(getHeader[\\\"Content-Type\\\"]) === -1) {\\n\\t\\t\\t\\treturn false;\\n\\t\\t\\t}\\n\\t\\t\\treturn true;\\t\\n\\t\\t},\\n\\t\\treturnProp = options.returnProp || \\\"responseText\\\",\\n\\t\\trequest = new XMLHttpRequest(),\\n\\t\\tdata = \\\"\\\",\\n\\t\\tf,results;\\n\\t// Massage the data hashmap into a string\\n\\tif(options.data) {\\n\\t\\tif(typeof options.data === \\\"string\\\") { // Already a string\\n\\t\\t\\tdata = options.data;\\n\\t\\t} else { // A hashmap of strings\\n\\t\\t\\tresults = [];\\n\\t\\t\\t$tw.utils.each(options.data,function(dataItem,dataItemTitle) {\\n\\t\\t\\t\\tresults.push(dataItemTitle + \\\"=\\\" + encodeURIComponent(dataItem));\\n\\t\\t\\t});\\n\\t\\t\\tif(type === \\\"GET\\\" || type === \\\"HEAD\\\") {\\n\\t\\t\\t\\turl += \\\"?\\\" + results.join(\\\"&\\\");\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tdata = results.join(\\\"&\\\");\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\trequest.responseType = options.responseType || \\\"text\\\";\\n\\t// Set up the state change handler\\n\\trequest.onreadystatechange = function() {\\n\\t\\tif(this.readyState === 4) {\\n\\t\\t\\tif(this.status === 200 || this.status === 201 || this.status === 204) {\\n\\t\\t\\t\\t// Success!\\n\\t\\t\\t\\toptions.callback(null,this[returnProp],this);\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\t\\t// Something went wrong\\n\\t\\toptions.callback($tw.language.getString(\\\"Error/XMLHttpRequest\\\") + \\\": \\\" + this.status,null,this);\\n\\t\\t}\\n\\t};\\n\\t// Handle progress\\n\\tif(options.progress) {\\n\\t\\trequest.onprogress = function(event) {\\n\\t\\t\\tconsole.log(\\\"Progress event\\\",event)\\n\\t\\t\\toptions.progress(event.lengthComputable,event.loaded,event.total);\\n\\t\\t};\\n\\t}\\n\\t// Make the request\\n\\trequest.open(type,url,true);\\n\\t// Headers\\n\\tif(headers) {\\n\\t\\t$tw.utils.each(headers,function(header,headerTitle,object) {\\n\\t\\t\\trequest.setRequestHeader(headerTitle,header);\\n\\t\\t});\\n\\t}\\n\\tif(data && !hasHeader(\\\"Content-Type\\\")) {\\n\\t\\trequest.setRequestHeader(\\\"Content-Type\\\",\\\"application/x-www-form-urlencoded; charset=UTF-8\\\");\\n\\t}\\n\\tif(!hasHeader(\\\"X-Requested-With\\\") && !isSimpleRequest(type,headers)) {\\n\\t\\trequest.setRequestHeader(\\\"X-Requested-With\\\",\\\"TiddlyWiki\\\");\\n\\t}\\n\\t// Send data\\n\\ttry {\\n\\t\\trequest.send(data);\\n\\t} catch(e) {\\n\\t\\toptions.callback(e,null,this);\\n\\t}\\n\\treturn request;\\n};\\n\\nexports.setQueryStringParameter = function(url,paramName,paramValue) {\\n\\tvar URL = $tw.browser ? window.URL : require(\\\"url\\\").URL,\\n\\t\\tnewUrl;\\n\\ttry {\\n\\t\\tnewUrl = new URL(url);\\n\\t} catch(e) {\\n\\t}\\n\\tif(newUrl && paramName) {\\n\\t\\tnewUrl.searchParams.set(paramName,paramValue || \\\"\\\");\\n\\t\\treturn newUrl.toString();\\n\\t} else {\\n\\t\\treturn url;\\n\\t}\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"utils\"},\"$:/core/modules/utils/dom/keyboard.js\":{\"title\":\"$:/core/modules/utils/dom/keyboard.js\",\"text\":\"/*\\\\\\ntitle: $
2731:/core/modules/utils/dom/keyboard.js\\ntype: application/javascript\\nmodule-type: utils\\n\\nKeyboard utilities; now deprecated. Instead, use $tw.keyboardManager\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n[\\\"parseKeyDescriptor\\\",\\\"checkKeyDescriptor\\\"].forEach(function(method) {\\n\\texports[method] = function() {\\n\\t\\tif($tw.keyboardManager) {\\n\\t\\t\\treturn $tw.keyboardManager[method].apply($tw.keyboardManager,Array.prototype.slice.call(arguments,0));\\n\\t\\t} else {\\n\\t\\t\\treturn null\\n\\t\\t}\\n\\t};\\n});\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"utils\"},\"$:/core/modules/utils/dom/modal.js\":{\"title\":\"$:/core/modules/utils/dom/modal.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/utils/dom/modal.js\\ntype: application/javascript\\nmodule-type: utils\\n\\nModal message mechanism\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar widget = require(\\\"$:/core/modules/widgets/widget.js\\\");\\nvar navigator = require(\\\"$:/core/modules/widgets/navigator.js\\\");\\n\\nvar Modal = function(wiki) {\\n\\tthis.wiki = wiki;\\n\\tthis.modalCount = 0;\\n};\\n\\n/*\\nDisplay a modal dialogue\\n\\ttitle: Title of tiddler to display\\n\\toptions: see below\\nOptions include:\\n\\tdownloadLink: Text of a big download link to include\\n\\tevent: widget event\\n\\tvariables: from event.paramObject\\n*/\\nModal.prototype.display = function(title,options) {\\n\\toptions = options || {};\\n\\tthis.srcDocument = options.variables && (options.variables.rootwindow === \\\"true\\\" ||\\n\\t\\t\\t\\toptions.variables.rootwindow === \\\"yes\\\") ? document :\\n\\t\\t\\t\\t(options.event && options.event.event && options.event.event.target ? options.event.event.target.ownerDocument : document);\\n\\tthis.srcWindow = this.srcDocument.defaultView;\\n\\tvar self = this,\\n\\t\\trefreshHandler,\\n\\t\\tduration = $tw.utils.getAnimationDuration(),\\n\\t\\ttiddler = this.wiki.getTiddler(title);\\n\\t// Don't do anything if the tiddler doesn't exist\\n\\tif(!tiddler) {\\n\\t\\treturn;\\n\\t}\\n\\t// Create the variables\\n\\tvar variables = $tw.utils.extend({\\n\\t\\t\\tcurrentTiddler: title,\\n\\t\\t\\t\\\"tv-story-list\\\": (options.event && options.event.widget ? options.event.widget.getVariable(\\\"tv-story-list\\\") : \\\"\\\"),\\n\\t\\t\\t\\\"tv-history-list\\\": (options.event && options.event.widget ? options.event.widget.getVariable(\\\"tv-history-list\\\") : \\\"\\\")\\n\\t\\t},options.variables);\\n\\n\\t// Create the wrapper divs\\n\\tvar wrapper = this.srcDocument.createElement(\\\"div\\\"),\\n\\t\\tmodalBackdrop = this.srcDocument.createElement(\\\"div\\\"),\\n\\t\\tmodalWrapper = this.srcDocument.createElement(\\\"div\\\"),\\n\\t\\tmodalHeader = this.srcDocument.createElement(\\\"div\\\"),\\n\\t\\theaderTitle = this.srcDocument.createElement(\\\"h3\\\"),\\n\\t\\tmodalBody = this.srcDocument.createElement(\\\"div\\\"),\\n\\t\\tmodalLink = this.srcDocument.createElement(\\\"a\\\"),\\n\\t\\tmodalFooter = this.srcDocument.createElement(\\\"div\\\"),\\n\\t\\tmodalFooterHelp = this.srcDocument.createElement(\\\"span\\\"),\\n\\t\\tmodalFooterButtons = this.srcDocument.createElement(\\\"span\\\");\\n\\t// Up the modal count and adjust the body class\\n\\tthis.modalCount++;\\n\\tthis.adjustPageClass();\\n\\t// Add classes\\n\\t$tw.utils.addClass(wrapper,\\\"tc-modal-wrapper\\\");\\n\\tif(tiddler.fields && tiddler.fields.class) {\\n\\t\\t$tw.utils.addClass(wrapper,tiddler.fields.class);\\n\\t}\\n\\t$tw.utils.addClass(modalBackdrop,\\\"tc-modal-backdrop\\\");\\n\\t$tw.utils.addClass(modalWrapper,\\\"tc-modal\\\");\\n\\t$tw.utils.addClass(modalHeader,\\\"tc-modal-header\\\");\\n\\t$tw.utils.addClass(modalBody,\\\"tc-modal-body\\\");\\n\\t$tw.utils.addClass(modalFooter,\\\"tc-modal-footer\\\");\\n\\t// Join them together\\n\\twrapper.appendChild(modalBackdrop);\\n\\twrapper.appendChild(modalWrapper);\\n\\tmodalHeader.appendChild(headerTitle);\\n\\tmodalWrapper.appendChild(modalHeader);\\n\\tmodalWrapper.appendChild(modalBody);\\n\\tmodalFooter.appendChild(modalFooterHelp);\\n\\tmodalFooter.appendChild(modalFooterButtons);\\n\\tmodalWrapper.appendChild(modalFooter);\\n\\tvar navigatorTree = {\\n\\t\\t\\\"type\\\": \\\"navigator\\\",\\n\\t\\t\\\"attributes\\\": {\\n\\t\\t\\t\\\"story\\\": {\\n\\t\\t\\t\\t\\\"name\\\": \\\"story\\\",\\n\\t\\t\\t\\t\\\"type\\\": \\\"string\\\",\\n\\t\\t\\t\\t\\\"value\\\": variables[\\\"tv-story-list\\\"]\\n\\t\\t\\t},\\n\\t\\t\\t\\\"history\\\": {\\n\\t\\t\\t\\t\\\"name\\\": \\\"history\\\",\\n\\t\\t\\t\\t\\\"type\\\": \\\"string\\\",\\n\\t\\t\\t\\t\\\"value\\\": variables[\\\"tv-history-list\\\"]\\n\\t\\t\\t}\\n\\t\\t},\\n\\t\\t\\\"tag\\\": \\\"$navigator\\\",\\n\\t\\t\\\"isBlock\\\": true,\\n\\t\\t\\\"children\\\": []\\n\\t};\\n\\tvar navigatorWidgetNode = new navigator.navigator(navigatorTree, {\\n\\t\\twiki: this.wiki,\\n\\t\\tdocument : this.srcDocument,\\n\\t\\tparentWidget: $tw.rootWidget\\n\\t});\\n\\tnavigatorWidgetNode.render(modalBody,null);\\n\\n\\t// Render the title of the message\\n\\tvar headerWidget
2731Node = this.wiki.makeTranscludeWidget(title,{\\n\\t\\tfield: \\\"subtitle\\\",\\n\\t\\tmode: \\\"inline\\\",\\n\\t\\tchildren: [{\\n\\t\\t\\ttype: \\\"text\\\",\\n\\t\\t\\tattributes: {\\n\\t\\t\\t\\ttext: {\\n\\t\\t\\t\\t\\ttype: \\\"string\\\",\\n\\t\\t\\t\\t\\tvalue: title\\n\\t\\t}}}],\\n\\t\\tparentWidget: navigatorWidgetNode,\\n\\t\\tdocument: this.srcDocument,\\n\\t\\tvariables: variables,\\n\\t\\timportPageMacros: true\\n\\t});\\n\\theaderWidgetNode.render(headerTitle,null);\\n\\t// Render the body of the message\\n\\tvar bodyWidgetNode = this.wiki.makeTranscludeWidget(title,{\\n\\t\\tparentWidget: navigatorWidgetNode,\\n\\t\\tdocument: this.srcDocument,\\n\\t\\tvariables: variables,\\n\\t\\timportPageMacros: true\\n\\t});\\n\\n\\tbodyWidgetNode.render(modalBody,null);\\n\\t// Setup the link if present\\n\\tif(options.downloadLink) {\\n\\t\\tmodalLink.href = options.downloadLink;\\n\\t\\tmodalLink.appendChild(this.srcDocument.createTextNode(\\\"Right-click to save changes\\\"));\\n\\t\\tmodalBody.appendChild(modalLink);\\n\\t}\\n\\t// Render the footer of the message\\n\\tif(tiddler.fields && tiddler.fields.help) {\\n\\t\\tvar link = this.srcDocument.createElement(\\\"a\\\");\\n\\t\\tlink.setAttribute(\\\"href\\\",tiddler.fields.help);\\n\\t\\tlink.setAttribute(\\\"target\\\",\\\"_blank\\\");\\n\\t\\tlink.setAttribute(\\\"rel\\\",\\\"noopener noreferrer\\\");\\n\\t\\tlink.appendChild(this.srcDocument.createTextNode(\\\"Help\\\"));\\n\\t\\tmodalFooterHelp.appendChild(link);\\n\\t\\tmodalFooterHelp.style.float = \\\"left\\\";\\n\\t}\\n\\tvar footerWidgetNode = this.wiki.makeTranscludeWidget(title,{\\n\\t\\tfield: \\\"footer\\\",\\n\\t\\tmode: \\\"inline\\\",\\n\\t\\tchildren: [{\\n\\t\\t\\ttype: \\\"button\\\",\\n\\t\\t\\tattributes: {\\n\\t\\t\\t\\tmessage: {\\n\\t\\t\\t\\t\\ttype: \\\"string\\\",\\n\\t\\t\\t\\t\\tvalue: \\\"tm-close-tiddler\\\"\\n\\t\\t\\t\\t}\\n\\t\\t\\t},\\n\\t\\t\\tchildren: [{\\n\\t\\t\\t\\ttype: \\\"text\\\",\\n\\t\\t\\t\\tattributes: {\\n\\t\\t\\t\\t\\ttext: {\\n\\t\\t\\t\\t\\t\\ttype: \\\"string\\\",\\n\\t\\t\\t\\t\\t\\tvalue: $tw.language.getString(\\\"Buttons/Close/Caption\\\")\\n\\t\\t\\t}}}\\n\\t\\t]}],\\n\\t\\tparentWidget: navigatorWidgetNode,\\n\\t\\tdocument: this.srcDocument,\\n\\t\\tvariables: variables,\\n\\t\\timportPageMacros: true\\n\\t});\\n\\tfooterWidgetNode.render(modalFooterButtons,null);\\n\\t// Set up the refresh handler\\n\\trefreshHandler = function(changes) {\\n\\t\\theaderWidgetNode.refresh(changes,modalHeader,null);\\n\\t\\tbodyWidgetNode.refresh(changes,modalBody,null);\\n\\t\\tfooterWidgetNode.refresh(changes,modalFooterButtons,null);\\n\\t};\\n\\tthis.wiki.addEventListener(\\\"change\\\",refreshHandler);\\n\\t// Add the close event handler\\n\\tvar closeHandler = function(event) {\\n\\t\\t// Remove our refresh handler\\n\\t\\tself.wiki.removeEventListener(\\\"change\\\",refreshHandler);\\n\\t\\t// Decrease the modal count and adjust the body class\\n\\t\\tself.modalCount--;\\n\\t\\tself.adjustPageClass();\\n\\t\\t// Force layout and animate the modal message away\\n\\t\\t$tw.utils.forceLayout(modalBackdrop);\\n\\t\\t$tw.utils.forceLayout(modalWrapper);\\n\\t\\t$tw.utils.setStyle(modalBackdrop,[\\n\\t\\t\\t{opacity: \\\"0\\\"}\\n\\t\\t]);\\n\\t\\t$tw.utils.setStyle(modalWrapper,[\\n\\t\\t\\t{transform: \\\"translateY(\\\" + self.srcWindow.innerHeight + \\\"px)\\\"}\\n\\t\\t]);\\n\\t\\t// Set up an event for the transition end\\n\\t\\tself.srcWindow.setTimeout(function() {\\n\\t\\t\\tif(wrapper.parentNode) {\\n\\t\\t\\t\\t// Remove the modal message from the DOM\\n\\t\\t\\t\\tself.srcDocument.body.removeChild(wrapper);\\n\\t\\t\\t}\\n\\t\\t},duration);\\n\\t\\t// Don't let anyone else handle the tm-close-tiddler message\\n\\t\\treturn false;\\n\\t};\\n\\theaderWidgetNode.addEventListener(\\\"tm-close-tiddler\\\",closeHandler,false);\\n\\tbodyWidgetNode.addEventListener(\\\"tm-close-tiddler\\\",closeHandler,false);\\n\\tfooterWidgetNode.addEventListener(\\\"tm-close-tiddler\\\",closeHandler,false);\\n\\t// Whether to close the modal dialog when the mask (area outside the modal) is clicked\\n\\tif(tiddler.fields && (tiddler.fields[\\\"mask-closable\\\"] === \\\"yes\\\" || tiddler.fields[\\\"mask-closable\\\"] === \\\"true\\\")) {\\n\\t\\tmodalBackdrop.addEventListener(\\\"click\\\",closeHandler,false);\\n\\t}\\n\\t// Set the initial styles for the message\\n\\t$tw.utils.setStyle(modalBackdrop,[\\n\\t\\t{opacity: \\\"0\\\"}\\n\\t]);\\n\\t$tw.utils.setStyle(modalWrapper,[\\n\\t\\t{transformOrigin: \\\"0% 0%\\\"},\\n\\t\\t{transform: \\\"translateY(\\\" + (-this.srcWindow.innerHeight) + \\\"px)\\\"}\\n\\t]);\\n\\t// Put the message into the document\\n\\tthis.srcDocument.body.appendChild(wrapper);\\n\\t// Set up animation for the styles\\n\\t$tw.utils.setStyle(modalBackdrop,[\\n\\t\\t{transition: \\\"opacity \\\" + duration + \\\"ms ease-out\\\"}\\n\\t]);\\n\\t$tw.utils.setStyle(modalWrapper,[\\n\\t\\t{transition: $tw.utils.roundTripPropertyName(\\\"transform\\\") + \\\" \\\" + duration + \\\"ms ease-in-out\\\"}\\n\\t]);\\n\\t// Force layout\\n\\t$tw.utils.forceLayout(modalBackdrop);\\n\\t$tw.utils.forceLayout(modalWrapper);\\n\\t// Set final animated styles\\n\\t$tw.utils.setStyle(modalBackdrop,[\\n\\t\\t{opacity: \\\"0.7\\\"}\\n\\t]);\\n\\t$tw.utils.setStyle(modalWrapper,[\\n\\t\\t{transform: \\\"translateY(0px)\\\"}\\n\\t]);\\n};\\n\\nModal.prototype.adjustPageClass = function() {\\n\\tvar windowContainer = $tw.pageContainer ? ($tw.pageContainer === this.srcDocument.body.firstChild ? $tw.pageContainer : this.srcDocument.body.firstChild) : null;\\n\\tif(windowContainer) {\\n\\t\\t$tw.utils.toggleClass(windowContainer,\\\"tc-modal-displayed\\\",this.modalCount > 0);\\n\\t}\\n\\t$tw.utils.toggleClass(this.srcDocument.body,\\\"tc-modal-prevent-scroll\\\",this.modalCount > 0);\\n};\\n\\nexports.Modal = Modal;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"utils\"},\"$:/core/modules/utils/dom/notifier.js\":{\"title\":\"$:/core/modules/utils/dom/notifier.js\",\"text\":\"/*\\\\\\ntitle: $
2731:/core/modules/utils/dom/notifier.js\\ntype: application/javascript\\nmodule-type: utils\\n\\nNotifier mechanism\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar widget = require(\\\"$:/core/modules/widgets/widget.js\\\");\\n\\nvar Notifier = function(wiki) {\\n\\tthis.wiki = wiki;\\n};\\n\\n/*\\nDisplay a notification\\n\\ttitle: Title of tiddler containing the notification text\\n\\toptions: see below\\nOptions include:\\n*/\\nNotifier.prototype.display = function(title,options) {\\n\\toptions = options || {};\\n\\t// Create the wrapper divs\\n\\tvar self = this,\\n\\t\\tnotification = document.createElement(\\\"div\\\"),\\n\\t\\ttiddler = this.wiki.getTiddler(title),\\n\\t\\tduration = $tw.utils.getAnimationDuration(),\\n\\t\\trefreshHandler;\\n\\t// Don't do anything if the tiddler doesn't exist\\n\\tif(!tiddler) {\\n\\t\\treturn;\\n\\t}\\n\\t// Add classes and roles\\n\\t$tw.utils.addClass(notification,\\\"tc-notification\\\");\\n\\tnotification.setAttribute(\\\"role\\\",\\\"alert\\\");\\n\\t// Create the variables\\n\\tvar variables = $tw.utils.extend({currentTiddler: title},options.variables);\\n\\t// Render the body of the notification\\n\\tvar widgetNode = this.wiki.makeTranscludeWidget(title,{\\n\\t\\tparentWidget: $tw.rootWidget,\\n\\t\\tdocument: document,\\n\\t\\tvariables: variables,\\n\\t\\timportPageMacros: true});\\n\\twidgetNode.render(notification,null);\\n\\trefreshHandler = function(changes) {\\n\\t\\twidgetNode.refresh(changes,notification,null);\\n\\t};\\n\\tthis.wiki.addEventListener(\\\"change\\\",refreshHandler);\\n\\t// Set the initial styles for the notification\\n\\t$tw.utils.setStyle(notification,[\\n\\t\\t{opacity: \\\"0\\\"},\\n\\t\\t{transformOrigin: \\\"0% 0%\\\"},\\n\\t\\t{transform: \\\"translateY(\\\" + (-window.innerHeight) + \\\"px)\\\"},\\n\\t\\t{transition: \\\"opacity \\\" + duration + \\\"ms ease-out, \\\" + $tw.utils.roundTripPropertyName(\\\"transform\\\") + \\\" \\\" + duration + \\\"ms ease-in-out\\\"}\\n\\t]);\\n\\t// Add the notification to the DOM\\n\\tdocument.body.appendChild(notification);\\n\\t// Force layout\\n\\t$tw.utils.forceLayout(notification);\\n\\t// Set final animated styles\\n\\t$tw.utils.setStyle(notification,[\\n\\t\\t{opacity: \\\"1.0\\\"},\\n\\t\\t{transform: \\\"translateY(0px)\\\"}\\n\\t]);\\n\\t// Set a timer to remove the notification\\n\\twindow.setTimeout(function() {\\n\\t\\t// Remove our change event handler\\n\\t\\tself.wiki.removeEventListener(\\\"change\\\",refreshHandler);\\n\\t\\t// Force layout and animate the notification away\\n\\t\\t$tw.utils.forceLayout(notification);\\n\\t\\t$tw.utils.setStyle(notification,[\\n\\t\\t\\t{opacity: \\\"0.0\\\"},\\n\\t\\t\\t{transform: \\\"translateX(\\\" + (notification.offsetWidth) + \\\"px)\\\"}\\n\\t\\t]);\\n\\t\\t// Remove the modal message from the DOM once the transition ends\\n\\t\\tsetTimeout(function() {\\n\\t\\t\\tif(notification.parentNode) {\\n\\t\\t\\t\\tdocument.body.removeChild(notification);\\n\\t\\t\\t}\\n\\t\\t},duration);\\n\\t},$tw.config.preferences.notificationDuration);\\n};\\n\\nexports.Notifier = Notifier;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"utils\"},\"$:/core/modules/utils/dom/popup.js\":{\"title\":\"$:/core/modules/utils/dom/popup.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/utils/dom/popup.js\\ntype: application/javascript\\nmodule-type: utils\\n\\nModule that creates a $tw.utils.Popup object prototype that manages popups in the browser\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nCreates a Popup object with these options:\\n\\trootElement: the DOM element to which the popup zapper should be attached\\n*/\\nvar Popup = function(options) {\\n\\toptions = options || {};\\n\\tthis.rootElement = options.rootElement || document.documentElement;\\n\\tthis.popups = []; // Array of {title:,wiki:,domNode:} objects\\n};\\n\\n/*\\nGlobal regular expression for parsing the location of a popup.\\nThis is also used by the Reveal widget.\\n*/\\nexports.popupLocationRegExp = /^(@?)\\\\((-?[0-9\\\\.E]+),(-?[0-9\\\\.E]+),(-?[0-9\\\\.E]+),(-?[0-9\\\\.E]+)\\\\)$/\\n\\n/*\\nObjekt containing the available prefixes for coordinates build with the `buildCoordinates` function:\\n - csOffsetParent: Uses a coordinate system based on the offset parent (no prefix).\\n - csAbsolute: Use an absolute coordinate system (prefix \\\"@\\\").\\n*/\\nexports.coordinatePrefix = { csOffsetParent: \\\"\\\", csAbsolute: \\\"@\\\" }\\n\\n/*\\nTrigger a popup open or closed. Parameters are in a hashmap:\\n\\ttitle: title of the tiddler where the popup details are stored\\n\\tdomNode: dom node to which the popup will be positioned (one of domNode or domNo
2731deRect is required)\\n\\tdomNodeRect: rectangle to which the popup will be positioned\\n\\twiki: wiki\\n\\tforce: if specified, forces the popup state to true or false (instead of toggling it)\\n\\tfloating: if true, skips registering the popup, meaning that it will need manually clearing\\n*/\\nPopup.prototype.triggerPopup = function(options) {\\n\\t// Check if this popup is already active\\n\\tvar index = this.findPopup(options.title);\\n\\t// Compute the new state\\n\\tvar state = index === -1;\\n\\tif(options.force !== undefined) {\\n\\t\\tstate = options.force;\\n\\t}\\n\\t// Show or cancel the popup according to the new state\\n\\tif(state) {\\n\\t\\tthis.show(options);\\n\\t} else {\\n\\t\\tthis.cancel(index);\\n\\t}\\n};\\n\\nPopup.prototype.findPopup = function(title) {\\n\\tvar index = -1;\\n\\tfor(var t=0; t\u003Cthis.popups.length; t++) {\\n\\t\\tif(this.popups[t].title === title) {\\n\\t\\t\\tindex = t;\\n\\t\\t}\\n\\t}\\n\\treturn index;\\n};\\n\\nPopup.prototype.handleEvent = function(event) {\\n\\tif(event.type === \\\"click\\\") {\\n\\t\\t// Find out what was clicked on\\n\\t\\tvar info = this.popupInfo(event.target),\\n\\t\\t\\tcancelLevel = info.popupLevel - 1;\\n\\t\\t// Don't remove the level that was clicked on if we clicked on a handle\\n\\t\\tif(info.isHandle) {\\n\\t\\t\\tcancelLevel++;\\n\\t\\t}\\n\\t\\t// Cancel\\n\\t\\tthis.cancel(cancelLevel);\\n\\t}\\n};\\n\\n/*\\nFind the popup level containing a DOM node. Returns:\\npopupLevel: count of the number of nested popups containing the specified element\\nisHandle: true if the specified element is within a popup handle\\n*/\\nPopup.prototype.popupInfo = function(domNode) {\\n\\tvar isHandle = false,\\n\\t\\tpopupCount = 0,\\n\\t\\tnode = domNode;\\n\\t// First check ancestors to see if we're within a popup handle\\n\\twhile(node) {\\n\\t\\tif($tw.utils.hasClass(node,\\\"tc-popup-handle\\\")) {\\n\\t\\t\\tisHandle = true;\\n\\t\\t\\tpopupCount++;\\n\\t\\t}\\n\\t\\tif($tw.utils.hasClass(node,\\\"tc-popup-keep\\\")) {\\n\\t\\t\\tisHandle = true;\\n\\t\\t}\\n\\t\\tnode = node.parentNode;\\n\\t}\\n\\t// Then count the number of ancestor popups\\n\\tnode = domNode;\\n\\twhile(node) {\\n\\t\\tif($tw.utils.hasClass(node,\\\"tc-popup\\\")) {\\n\\t\\t\\tpopupCount++;\\n\\t\\t}\\n\\t\\tnode = node.parentNode;\\n\\t}\\n\\tvar info = {\\n\\t\\tpopupLevel: popupCount,\\n\\t\\tisHandle: isHandle\\n\\t};\\n\\treturn info;\\n};\\n\\n/*\\nDisplay a popup by adding it to the stack\\n*/\\nPopup.prototype.show = function(options) {\\n\\t// Find out what was clicked on\\n\\tvar info = this.popupInfo(options.domNode);\\n\\t// Cancel any higher level popups\\n\\tthis.cancel(info.popupLevel);\\n\\n\\t// Store the popup details if not already there\\n\\tif(!options.floating && this.findPopup(options.title) === -1) {\\n\\t\\tthis.popups.push({\\n\\t\\t\\ttitle: options.title,\\n\\t\\t\\twiki: options.wiki,\\n\\t\\t\\tdomNode: options.domNode,\\n\\t\\t\\tnoStateReference: options.noStateReference\\n\\t\\t});\\n\\t}\\n\\t// Set the state tiddler\\n\\tvar rect;\\n\\tif(options.domNodeRect) {\\n\\t\\trect = options.domNodeRect;\\n\\t} else {\\n\\t\\trect = {\\n\\t\\t\\tleft: options.domNode.offsetLeft,\\n\\t\\t\\ttop: options.domNode.offsetTop,\\n\\t\\t\\twidth: options.domNode.offsetWidth,\\n\\t\\t\\theight: options.domNode.offsetHeight\\n\\t\\t};\\n\\t}\\n\\tif(options.absolute && options.domNode) {\\n\\t\\t// Walk the offsetParent chain and add the position of the offsetParents to make\\n\\t\\t// the position absolute to the root node of the page.\\n\\t\\tvar currentNode = options.domNode.offsetParent;\\n\\t\\twhile(currentNode) {\\n\\t\\t\\trect.left += currentNode.offsetLeft;\\n\\t\\t\\trect.top += currentNode.offsetTop;\\n\\t\\t\\tcurrentNode = currentNode.offsetParent;\\n\\t\\t}\\n\\t}\\n\\tvar popupRect = exports.buildCoordinates(options.absolute?exports.coordinatePrefix.csAbsolute:exports.coordinatePrefix.csOffsetParent,rect);\\n\\tif(options.noStateReference) {\\n\\t\\toptions.wiki.setText(options.title,\\\"text\\\",undefined,popupRect);\\n\\t} else {\\n\\t\\toptions.wiki.setTextReference(options.title,popupRect);\\n\\t}\\n\\t// Add the click handler if we have any popups\\n\\tif(this.popups.length > 0) {\\n\\t\\tthis.rootElement.addEventListener(\\\"click\\\",this,true);\\n\\t}\\n};
2731\\n\\n/*\\nCancel all popups at or above a specified level or DOM node\\nlevel: popup level to cancel (0 cancels all popups)\\n*/\\nPopup.prototype.cancel = function(level) {\\n\\tvar numPopups = this.popups.length;\\n\\tlevel = Math.max(0,Math.min(level,numPopups));\\n\\tfor(var t=level; t\u003CnumPopups; t++) {\\n\\t\\tvar popup = this.popups.pop();\\n\\t\\tif(popup.title) {\\n\\t\\t\\tif(popup.noStateReference) {\\n\\t\\t\\t\\tpopup.wiki.deleteTiddler(popup.title);\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tpopup.wiki.deleteTiddler($tw.utils.parseTextReference(popup.title).title);\\n        \\t\\t}\\n\\t\\t}\\n\\t}\\n\\tif(this.popups.length === 0) {\\n\\t\\tthis.rootElement.removeEventListener(\\\"click\\\",this,false);\\n\\t}\\n};\\n\\n/*\\nReturns true if the specified title and text identifies an active popup.\\nThis function is safe to call, even if the popup class was not initialized.\\n*/\\nexports.readPopupState = function(text) {\\n\\treturn exports.popupLocationRegExp.test(text);\\n};\\n\\n/*\\nParses a coordinate string in the format `(x,y,w,h)` or `@(x,y,z,h)` and returns\\nan object containing the position, width and height. The absolute-Mark is boolean\\nvalue that indicates the coordinate system of the coordinates. If they start with\\nan `@`, `absolute` is set to true and the coordinates are relative to the root\\nelement. If the initial `@` is missing, they are relative to the offset parent\\nelement and `absoute` is false.\\nThis function is safe to call, even if the popup class was not initialized.\\n*/\\nexports.parseCoordinates = function(coordinates) {\\n\\tvar match = exports.popupLocationRegExp.exec(coordinates);\\n\\tif(match) {\\n\\t\\treturn {\\n\\t\\t\\tabsolute: (match[1] === \\\"@\\\"),\\n\\t\\t\\tleft: parseFloat(match[2]),\\n\\t\\t\\ttop: parseFloat(match[3]),\\n\\t\\t\\twidth: parseFloat(match[4]),\\n\\t\\t\\theight: parseFloat(match[5])\\n\\t\\t};\\n\\t} else {\\n\\t\\treturn false;\\n\\t}\\n}\\n\\n/*\\nBuilds a coordinate string from a coordinate system identifier and an object\\ncontaining the left, top, width and height values.\\nUse constants defined in coordinatePrefix to specify a coordinate system.\\nIf one of the parameters is invalid for building a coordinate string `(0,0,0,0)`\\nwill be returned.\\nThis function is safe to call, even if the popup class was not initialized.\\n*/\\nexports.buildCoordinates = function(prefix,position) {\\n\\tvar coord = prefix + \\\"(\\\" + position.left + \\\",\\\" + position.top + \\\",\\\" + position.width + \\\",\\\" + position.height + \\\")\\\";\\n\\tif (exports.popupLocationRegExp.test(coord)) {\\n\\t\\treturn coord;\\n\\t} else {\\n\\t\\treturn \\\"(0,0,0,0)\\\";\\n\\t}\\n}\\n\\nexports.Popup = Popup;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"utils\"},\"$:/core/modules/utils/dom/scroller.js\":{\"title\":\"$:/core/modules/utils/dom/scroller.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/utils/dom/scroller.js\\ntype: application/javascript\\nmodule-type: utils\\n\\nModule that creates a $tw.utils.Scroller object prototype that manages scrolling in the browser\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nEvent handler for when the `tm-scroll` event hits the document body\\n*/\\nvar PageScroller = function() {\\n\\tthis.idRequestFrame = null;\\n\\tthis.requestAnimationFrame = window.requestAnimationFrame ||\\n\\t\\twindow.webkitRequestAnimationFrame ||\\n\\t\\twindow.mozRequestAnimationFrame ||\\n\\t\\tfunction(callback) {\\n\\t\\t\\treturn window.setTimeout(callback, 1000/60);\\n\\t\\t};\\n\\tthis.cancelAnimationFrame = window.cancelAnimationFrame ||\\n\\t\\twindow.webkitCancelAnimationFrame ||\\n\\t\\twindow.webkitCancelRequestAnimationFrame ||\\n\\t\\twindow.mozCancelAnimationFrame ||\\n\\t\\twindow.mozCancelRequestAnimationFrame ||\\n\\t\\tfunction(id) {\\n\\t\\t\\twindow.clearTimeout(id);\\n\\t\\t};\\n};\\n\\nPageScroller.prototype.isScrolling = function() {\\n\\treturn this.idRequestFrame !== null;\\n}\\n\\nPageScroller.prototype.cancelScroll = function(srcWindow) {\\n\\tif(this.idRequestFrame) {\\n\\t\\tthis.cancelAnimationFrame.call(srcWindow,this.idRequestFrame);\\n\\t\\tthis.idRequestFrame = null;\\n\\t}\\n};
2731\\n\\n/*\\nHandle an event\\n*/\\nPageScroller.prototype.handleEvent = function(event) {\\n\\tif(event.type === \\\"tm-scroll\\\") {\\n\\t\\tvar options = {};\\n\\t\\tif($tw.utils.hop(event.paramObject,\\\"animationDuration\\\")) {\\n\\t\\t\\toptions.animationDuration = event.paramObject.animationDuration;\\n\\t\\t}\\n\\t\\tif(event.paramObject && event.paramObject.selector) {\\n\\t\\t\\tthis.scrollSelectorIntoView(null,event.paramObject.selector,null,options);\\n\\t\\t} else {\\n\\t\\t\\tthis.scrollIntoView(event.target,null,options);\\n\\t\\t}\\n\\t\\treturn false; // Event was handled\\n\\t}\\n\\treturn true;\\n};\\n\\n/*\\nHandle a scroll event hitting the page document\\n*/\\nPageScroller.prototype.scrollIntoView = function(element,callback,options) {\\n\\tvar self = this,\\n\\t\\tduration = $tw.utils.hop(options,\\\"animationDuration\\\") ? parseInt(options.animationDuration) : $tw.utils.getAnimationDuration(),\\n\\t\\tsrcWindow = element ? element.ownerDocument.defaultView : window;\\n\\t// Now get ready to scroll the body\\n\\tthis.cancelScroll(srcWindow);\\n\\tthis.startTime = Date.now();\\n\\t// Get the height of any position:fixed toolbars\\n\\tvar toolbar = srcWindow.document.querySelector(\\\".tc-adjust-top-of-scroll\\\"),\\n\\t\\toffset = 0;\\n\\tif(toolbar) {\\n\\t\\toffset = toolbar.offsetHeight;\\n\\t}\\n\\t// Get the client bounds of the element and adjust by the scroll position\\n\\tvar getBounds = function() {\\n\\t\\t\\tvar clientBounds = typeof callback === 'function' ? callback() : element.getBoundingClientRect(),\\n\\t\\t\\t\\tscrollPosition = $tw.utils.getScrollPosition(srcWindow);\\n\\t\\t\\treturn {\\n\\t\\t\\t\\tleft: clientBounds.left + scrollPosition.x,\\n\\t\\t\\t\\ttop: clientBounds.top + scrollPosition.y - offset,\\n\\t\\t\\t\\twidth: clientBounds.width,\\n\\t\\t\\t\\theight: clientBounds.height\\n\\t\\t\\t};\\n\\t\\t},\\n\\t\\t// We'll consider the horizontal and vertical scroll directions separately via this function\\n\\t\\t// targetPos/targetSize - position and size of the target element\\n\\t\\t// currentPos/currentSize - position and size of the current scroll viewport\\n\\t\\t// returns: new position of the scroll viewport\\n\\t\\tgetEndPos = function(targetPos,targetSize,currentPos,currentSize) {\\n\\t\\t\\tvar newPos = targetPos;\\n\\t\\t\\t// If we are scrolling within 50 pixels of the top/left then snap to zero\\n\\t\\t\\tif(newPos \u003C 50) {\\n\\t\\t\\t\\tnewPos = 0;\\n\\t\\t\\t}\\n\\t\\t\\treturn newPos;\\n\\t\\t},\\n\\t\\tdrawFrame = function drawFrame() {\\n\\t\\t\\tvar t;\\n\\t\\t\\tif(duration \u003C= 0) {\\n\\t\\t\\t\\tt = 1;\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tt = ((Date.now()) - self.startTime) / duration;\\n\\t\\t\\t}\\n\\t\\t\\tif(t >= 1) {\\n\\t\\t\\t\\tself.cancelScroll(srcWindow);\\n\\t\\t\\t\\tt = 1;\\n\\t\\t\\t}\\n\\t\\t\\tt = $tw.utils.slowInSlowOut(t);\\n\\t\\t\\tvar scrollPosition = $tw.utils.getScrollPosition(srcWindow),\\n\\t\\t\\t\\tbounds = getBounds(),\\n\\t\\t\\t\\tendX = getEndPos(bounds.left,bounds.width,scrollPosition.x,srcWindow.innerWidth),\\n\\t\\t\\t\\tendY = getEndPos(bounds.top,bounds.height,scrollPosition.y,srcWindow.innerHeight);\\n\\t\\t\\tsrcWindow.scrollTo(scrollPosition.x + (endX - scrollPosition.x) * t,scrollPosition.y + (endY - scrollPosition.y) * t);\\n\\t\\t\\tif(t \u003C 1) {\\n\\t\\t\\t\\tself.idRequestFrame = self.requestAnimationFrame.call(srcWindow,drawFrame);\\n\\t\\t\\t}\\n\\t\\t};\\n\\tdrawFrame();\\n};\\n\\nPageScroller.prototype.scrollSelectorIntoView = function(baseElement,selector,callback,options) {\\n\\tbaseElement = baseElement || document;\\n\\tvar element = $tw.utils.querySelectorSafe(selector,baseElement);\\n\\tif(element) {\\n\\t\\tthis.scrollIntoView(element,callback,options);\\n\\t}\\n};\\n\\nexports.PageScroller = PageScroller;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"utils\"},\"$:/core/modules/utils/edition-info.js\":{\"title\":\"$:/core/modules/utils/edition-info.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/utils/edition-info.js\\ntype: application/javascript\\nmodule-type: utils-node\\n\\nInformation about the available editions\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar fs = require(\\\"fs\\\"),\\n\\tpath = require(\\\"path\\\");\\n\\nvar editionInfo;\\n\\nexports.getEditionInfo = function() {\\n\\tif(!editionInfo) {\\n\\t\\t// Enumerate the edition paths\\n\\t\\tvar editionPaths = $tw.getLibraryItemSearchPaths($tw.config.editionsPath,$tw.config.editionsEnvVar);\\n\\t\\teditionInfo = {};\\n\\t\\tfor(var editionIndex=0; editionIndex\u003CeditionPaths.length; editionIndex++) {\\n\\t\\t\\tvar editionPath = editionPaths[editionIndex];\\n\\t\\t\\t// Enumerate the folders\\n\\t\\t\\tvar entries = fs.readdirSync(editionPath);\\n\\t\\t\\tfor(var entryIndex=0; entryIndex\u003Centries.length; entryIndex++) {\\n\\t\\t\\t\\tvar entry = entries[entryIndex];\\n\\t\\t\\t\\t// Check if directories have a valid tiddlywiki.info\\n\\t\\t\\t\\tif(!editionInfo[entry] && $tw.utils.isDirectory(path.resolve(editionPath,entry))) {\\n\\t\\t\\t\\t\\tvar info = $tw.utils.parseJSONSafe(fs.readFileSync(path.resolve(editionPath,entry,\\\"tiddlywiki.info\\\"),\\\"utf8\\\"),null);\\n\\t\\t\\t\\t\\tif(info) {\\n\\t\\t\\t\\t\\t\\teditionInfo[entry] = info;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\treturn editionInfo;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"utils-node\"},\"$:/core/modules/utils/escapecss.js\":{\"title\":\"$:/core/modules/utils/escapecss.js\",\"text\":\"/*\\\\\\ntitle: $
2731:/core/modules/utils/escapecss.js\\ntype: application/javascript\\nmodule-type: utils\\n\\nProvides CSS.escape() functionality.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false, window: false */\\n\\\"use strict\\\";\\n\\nexports.escapeCSS = (function() {\\n\\t// use browser's native CSS.escape() function if available\\n\\tif ($tw.browser && window.CSS && window.CSS.escape) {\\n\\t\\treturn window.CSS.escape;\\n\\t}\\n\\n\\t// otherwise, a utility method is provided\\n\\t// see also https://drafts.csswg.org/cssom/#serialize-an-identifier\\n\\n\\t/*! https://mths.be/cssescape v1.5.1 by @mathias | MIT license */\\n\\treturn function(value) {\\n\\t\\tif (arguments.length == 0) {\\n\\t\\t\\tthrow new TypeError('`CSS.escape` requires an argument.');\\n\\t\\t}\\n\\t\\tvar string = String(value);\\n\\t\\tvar length = string.length;\\n\\t\\tvar index = -1;\\n\\t\\tvar codeUnit;\\n\\t\\tvar result = '';\\n\\t\\tvar firstCodeUnit = string.charCodeAt(0);\\n\\t\\twhile (++index \u003C length) {\\n\\t\\t\\tcodeUnit = string.charCodeAt(index);\\n\\t\\t\\t// Note: there’s no need to special-case astral symbols, surrogate\\n\\t\\t\\t// pairs, or lone surrogates.\\n\\n\\t\\t\\t// If the character is NULL (U+0000), then the REPLACEMENT CHARACTER\\n\\t\\t\\t// (U+FFFD).\\n\\t\\t\\tif (codeUnit == 0x0000) {\\n\\t\\t\\t\\tresult += '\\\\uFFFD';\\n\\t\\t\\t\\tcontinue;\\n\\t\\t\\t}\\n\\n\\t\\t\\tif (\\n\\t\\t\\t\\t// If the character is in the range [\\\\1-\\\\1F] (U+0001 to U+001F) or is\\n\\t\\t\\t\\t// U+007F, […]\\n\\t\\t\\t\\t(codeUnit >= 0x0001 && codeUnit \u003C= 0x001F) || codeUnit == 0x007F ||\\n\\t\\t\\t\\t// If the character is the first character and is in the range [0-9]\\n\\t\\t\\t\\t// (U+0030 to U+0039), […]\\n\\t\\t\\t\\t(index == 0 && codeUnit >= 0x0030 && codeUnit \u003C= 0x0039) ||\\n\\t\\t\\t\\t// If the character is the second character and is in the range [0-9]\\n\\t\\t\\t\\t// (U+0030 to U+0039) and the first character is a `-` (U+002D), […]\\n\\t\\t\\t\\t(\\n\\t\\t\\t\\t\\tindex == 1 &&\\n\\t\\t\\t\\t\\tcodeUnit >= 0x0030 && codeUnit \u003C= 0x0039 &&\\n\\t\\t\\t\\t\\tfirstCodeUnit == 0x002D\\n\\t\\t\\t\\t)\\n\\t\\t\\t) {\\n\\t\\t\\t\\t// https://drafts.csswg.org/cssom/#escape-a-character-as-code-point\\n\\t\\t\\t\\tresult += '\\\\\\\\' + codeUnit.toString(16) + ' ';\\n\\t\\t\\t\\tcontinue;\\n\\t\\t\\t}\\n\\n\\t\\t\\tif (\\n\\t\\t\\t\\t// If the character is the first character and is a `-` (U+002D), and\\n\\t\\t\\t\\t// there is no second character, […]\\n\\t\\t\\t\\tindex == 0 &&\\n\\t\\t\\t\\tlength == 1 &&\\n\\t\\t\\t\\tcodeUnit == 0x002D\\n\\t\\t\\t) {\\n\\t\\t\\t\\tresult += '\\\\\\\\' + string.charAt(index);\\n\\t\\t\\t\\tcontinue;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// If the character is not handled by one of the above rules and is\\n\\t\\t\\t// greater than or equal to U+0080, is `-` (U+002D) or `_` (U+005F), or\\n\\t\\t\\t// is in one of the ranges [0-9] (U+0030 to U+0039), [A-Z] (U+0041 to\\n\\t\\t\\t// U+005A), or [a-z] (U+0061 to U+007A), […]\\n\\t\\t\\tif (\\n\\t\\t\\t\\tcodeUnit >= 0x0080 ||\\n\\t\\t\\t\\tcodeUnit == 0x002D ||\\n\\t\\t\\t\\tcodeUnit == 0x005F ||\\n\\t\\t\\t\\tcodeUnit >= 0x0030 && codeUnit \u003C= 0x0039 ||\\n\\t\\t\\t\\tcodeUnit >= 0x0041 && codeUnit \u003C= 0x005A ||\\n\\t\\t\\t\\tcodeUnit >= 0x0061 && codeUnit \u003C= 0x007A\\n\\t\\t\\t) {\\n\\t\\t\\t\\t// the character itself\\n\\t\\t\\t\\tresult += string.charAt(index);\\n\\t\\t\\t\\tcontinue;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Otherwise, the escaped character.\\n\\t\\t\\t// https://drafts.csswg.org/cssom/#escape-a-character\\n\\t\\t\\tresult += '\\\\\\\\' + string.charAt(index);\\n\\n\\t\\t}\\n\\t\\treturn result;\\n\\t};\\n})();\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"utils\"},\"$:/core/modules/utils/fakedom.js\":{\"title\":\"$:/core/modules/utils/fakedom.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/utils/fakedom.js\\ntype: application/javascript\\nmodule-type: global\\n\\nA barebones implementation of DOM interfaces needed by the rendering mechanism.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n// Sequence number used to enable us to track objects for testing\\nvar sequenceNumber = null;\\n\\nvar bumpSequenceNumber = function(object) {\\n\\tif(sequenceNumber !== null) {\\n\\t\\tobject.sequenceNumber = sequenceNumber++;\\n\\t}\\n};\\n\\nvar TW_Node = function (){\\n\\tthrow TypeError(\\\"Illegal constructor\\\");\\n};\\n\\nObject.defineProperty(TW_Node.prototype, 'ELEMENT_NODE', {\\n\\tget: function() {\\n\\t\\treturn 1;\\n\\t}\\n});\\n\\nObject.defineProperty(TW_Node.prototype, 'TEXT_NODE', {\\n\\tget: function() {\\n\\t\\treturn 3;\\n\\t}\\n});\\n\\nvar TW_TextNode = function(text) {\\n\\tbumpSequenceNumber(this);\\n\\tthis.textContent = text + \\\"\\\";\\n};\\n\\nObject.setPrototypeOf(TW_TextNode,TW_Node.prototype);\\n\\nObject.defineProperty(TW_TextNode.prototype, \\\"nodeType\\\", {\\n\\tget: function() {\\n\\t\\treturn this.TEXT_NODE;\\n\\t}\\n});\\n\\nObject.defineProperty(TW_TextNode.prototype, \\\"formattedTextContent\\\", {\\n\\tget: function() {\\n\\t\\treturn this.textContent.replace(/(\\\\r?\\\\n)/g,\\\"\\\");\\n\\t}\\n});\\n\\nvar TW_Element = function(tag,namespace) {\\n\\tbumpSequenceNumber(this);\\n\\tthis.isTiddlyWikiFakeDom = true;\\n\\tthis.tag = tag;\\n\\tthis.attributes = {};\\n\\tthis.isRaw = false;\\n\\tthis.children = [];\\n\\tthis._style = {};\\n\\tthis.namespaceURI = namespace || \\\"http://www.w3.org/1999/xhtml\\\";\\n};\\n\\nObject.setPrototypeOf(TW_Element,TW_Node.prototype);\\n\\nObject.defineProperty(TW_Element.prototype, \\\"style\\\", {\\n\\tget: function() {\\n\\t\\treturn this._style;\\n\\t},\\n\\tset: function(str) {\\n\\t\\tvar self = this;
2731\\n\\t\\tstr = str || \\\"\\\";\\n\\t\\t$tw.utils.each(str.split(\\\";\\\"),function(declaration) {\\n\\t\\t\\tvar parts = declaration.split(\\\":\\\"),\\n\\t\\t\\t\\tname = $tw.utils.trim(parts[0]),\\n\\t\\t\\t\\tvalue = $tw.utils.trim(parts[1]);\\n\\t\\t\\tif(name && value) {\\n\\t\\t\\t\\tself._style[$tw.utils.convertStyleNameToPropertyName(name)] = value;\\n\\t\\t\\t}\\n\\t\\t});\\n\\t}\\n});\\n\\nObject.defineProperty(TW_Element.prototype, \\\"nodeType\\\", {\\n\\tget: function() {\\n\\t\\treturn this.ELEMENT_NODE;\\n\\t}\\n});\\n\\nTW_Element.prototype.getAttribute = function(name) {\\n\\tif(this.isRaw) {\\n\\t\\tthrow \\\"Cannot getAttribute on a raw TW_Element\\\";\\n\\t}\\n\\treturn this.attributes[name];\\n};\\n\\nTW_Element.prototype.setAttribute = function(name,value) {\\n\\tif(this.isRaw) {\\n\\t\\tthrow \\\"Cannot setAttribute on a raw TW_Element\\\";\\n\\t}\\n\\tthis.attributes[name] = value + \\\"\\\";\\n};\\n\\nTW_Element.prototype.setAttributeNS = function(namespace,name,value) {\\n\\tthis.setAttribute(name,value);\\n};\\n\\nTW_Element.prototype.removeAttribute = function(name) {\\n\\tif(this.isRaw) {\\n\\t\\tthrow \\\"Cannot removeAttribute on a raw TW_Element\\\";\\n\\t}\\n\\tif($tw.utils.hop(this.attributes,name)) {\\n\\t\\tdelete this.attributes[name];\\n\\t}\\n};\\n\\nTW_Element.prototype.appendChild = function(node) {\\n\\tthis.children.push(node);\\n\\tnode.parentNode = this;\\n};\\n\\nTW_Element.prototype.insertBefore = function(node,nextSibling) {\\n\\tif(nextSibling) {\\n\\t\\tvar p = this.children.indexOf(nextSibling);\\n\\t\\tif(p !== -1) {\\n\\t\\t\\tthis.children.splice(p,0,node);\\n\\t\\t\\tnode.parentNode = this;\\n\\t\\t} else {\\n\\t\\t\\tthis.appendChild(node);\\n\\t\\t}\\n\\t} else {\\n\\t\\tthis.appendChild(node);\\n\\t}\\n};\\n\\nTW_Element.prototype.removeChild = function(node) {\\n\\tvar p = this.children.indexOf(node);\\n\\tif(p !== -1) {\\n\\t\\tthis.children.splice(p,1);\\n\\t}\\n};\\n\\nTW_Element.prototype.hasChildNodes = function() {\\n\\treturn !!this.children.length;\\n};\\n\\nObject.defineProperty(TW_Element.prototype, \\\"childNodes\\\", {\\n\\tget: function() {\\n\\t\\treturn this.children;\\n\\t}\\n});\\n\\nObject.defineProperty(TW_Element.prototype, \\\"firstChild\\\", {\\n\\tget: function() {\\n\\t\\treturn this.children[0];\\n\\t}\\n});\\n\\nTW_Element.prototype.addEventListener = function(type,listener,useCapture) {\\n\\t// Do nothing\\n};\\n\\nObject.defineProperty(TW_Element.prototype, \\\"tagName\\\", {\\n\\tget: function() {\\n\\t\\treturn this.tag || \\\"\\\";\\n\\t}\\n});\\n\\nObject.defineProperty(TW_Element.prototype, \\\"className\\\", {\\n\\tget: function() {\\n\\t\\treturn this.attributes[\\\"class\\\"] || \\\"\\\";\\n\\t},\\n\\tset: function(value) {\\n\\t\\tthis.attributes[\\\"class\\\"] = value + \\\"\\\";\\n\\t}\\n});\\n\\nObject.defineProperty(TW_Element.prototype, \\\"value\\\", {\\n\\tget: function() {\\n\\t\\treturn this.attributes.value || \\\"\\\";\\n\\t},\\n\\tset: function(value) {\\n\\t\\tthis.attributes.value = value + \\\"\\\";\\n\\t}\\n});\\n\\nObject.defineProperty(TW_Element.prototype, \\\"outerHTML\\\", {\\n\\tget: function() {\\n\\t\\tvar output = [],attr,a,v;\\n\\t\\toutput.push(\\\"\u003C\\\",this.tag);\\n\\t\\tif(this.attributes) {\\n\\t\\t\\tattr = [];\\n\\t\\t\\tfor(a in this.attributes) {\\n\\t\\t\\t\\tattr.push(a);\\n\\t\\t\\t}\\n\\t\\t\\tattr.sort();\\n\\t\\t\\tfor(a=0; a\u003Cattr.length; a++) {\\n\\t\\t\\t\\tv = this.attributes[attr[a]];\\n\\t\\t\\t\\tif(v !== undefined) {\\n\\t\\t\\t\\t\\toutput.push(\\\" \\\",attr[a],\\\"=\\\\\\\"\\\",$tw.utils.htmlEncode(v),\\\"\\\\\\\"\\\");\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tif(this._style) {\\n\\t\\t\\tvar style = [];\\n\\t\\t\\tfor(var s in this._style) {\\n\\t\\t\\t\\tstyle.push($tw.utils.convertPropertyNameToStyleName(s) + \\\":\\\" + this._style[s] + \\\";\\\");\\n\\t\\t\\t}\\n\\t\\t\\tif(style.length > 0) {\\n\\t\\t\\t\\toutput.push(\\\" style=\\\\\\\"\\\",style.join(\\\"\\\"),\\\"\\\\\\\"\\\");\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\toutput.push(\\\">\\\");\\n\\t\\tif($tw.config.htmlVoidElements.indexOf(this.tag) === -1) {\\n\\t\\t\\toutput.push(this.innerHTML);\\n\\t\\t\\toutput.push(\\\"\u003C/\\\",this.tag,\\\">\\\");\\n\\t\\t}\\n\\t\\treturn output.join(\\\"\\\");\\n\\t}\\n});\\n\\nObject.defineProperty(TW_Element.prototype, \\\"innerHTML\\\", {\\n\\tget: function() {\\n\\t\\tif(this.isRaw) {\\n\\t\\t\\treturn this.rawHTML;\\n\\t\\t} else {\\n\\t\\t\\tvar b = [];
2731\\n\\t\\t\\t$tw.utils.each(this.children,function(node) {\\n\\t\\t\\t\\tif(node instanceof TW_Element) {\\n\\t\\t\\t\\t\\tb.push(node.outerHTML);\\n\\t\\t\\t\\t} else if(node instanceof TW_TextNode) {\\n\\t\\t\\t\\t\\tb.push($tw.utils.htmlTextEncode(node.textContent));\\n\\t\\t\\t\\t}\\n\\t\\t\\t});\\n\\t\\t\\treturn b.join(\\\"\\\");\\n\\t\\t}\\n\\t},\\n\\tset: function(value) {\\n\\t\\tthis.isRaw = true;\\n\\t\\tthis.rawHTML = value;\\n\\t\\tthis.rawTextContent = null;\\n\\t}\\n});\\n\\nObject.defineProperty(TW_Element.prototype, \\\"textInnerHTML\\\", {\\n\\tset: function(value) {\\n\\t\\tif(this.isRaw) {\\n\\t\\t\\tthis.rawTextContent = value;\\n\\t\\t} else {\\n\\t\\t\\tthrow \\\"Cannot set textInnerHTML of a non-raw TW_Element\\\";\\n\\t\\t}\\n\\t}\\n});\\n\\nObject.defineProperty(TW_Element.prototype, \\\"textContent\\\", {\\n\\tget: function() {\\n\\t\\tif(this.isRaw) {\\n\\t\\t\\tif(this.rawTextContent === null) {\\n\\t\\t\\t\\treturn \\\"\\\";\\n\\t\\t\\t} else {\\n\\t\\t\\t\\treturn this.rawTextContent;\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\t\\t\\tvar b = [];\\n\\t\\t\\t$tw.utils.each(this.children,function(node) {\\n\\t\\t\\t\\tb.push(node.textContent);\\n\\t\\t\\t});\\n\\t\\t\\treturn b.join(\\\"\\\");\\n\\t\\t}\\n\\t},\\n\\tset: function(value) {\\n\\t\\tthis.children = [new TW_TextNode(value)];\\n\\t}\\n});\\n\\nObject.defineProperty(TW_Element.prototype, \\\"formattedTextContent\\\", {\\n\\tget: function() {\\n\\t\\tif(this.isRaw) {\\n\\t\\t\\treturn \\\"\\\";\\n\\t\\t} else {\\n\\t\\t\\tvar b = [],\\n\\t\\t\\t\\tisBlock = $tw.config.htmlBlockElements.indexOf(this.tag) !== -1;\\n\\t\\t\\tif(isBlock) {\\n\\t\\t\\t\\tb.push(\\\"\\\\n\\\");\\n\\t\\t\\t}\\n\\t\\t\\tif(this.tag === \\\"li\\\") {\\n\\t\\t\\t\\tb.push(\\\"* \\\");\\n\\t\\t\\t}\\n\\t\\t\\t$tw.utils.each(this.children,function(node) {\\n\\t\\t\\t\\tb.push(node.formattedTextContent);\\n\\t\\t\\t});\\n\\t\\t\\tif(isBlock) {\\n\\t\\t\\t\\tb.push(\\\"\\\\n\\\");\\n\\t\\t\\t}\\n\\t\\t\\treturn b.join(\\\"\\\");\\n\\t\\t}\\n\\t}\\n});\\n\\nvar document = {\\n\\tsetSequenceNumber: function(value) {\\n\\t\\tsequenceNumber = value;\\n\\t},\\n\\tcreateElementNS: function(namespace,tag) {\\n\\t\\treturn new TW_Element(tag,namespace);\\n\\t},\\n\\tcreateElement: function(tag) {\\n\\t\\treturn new TW_Element(tag);\\n\\t},\\n\\tcreateTextNode: function(text) {\\n\\t\\treturn new TW_TextNode(text);\\n\\t},\\n\\tcompatMode: \\\"CSS1Compat\\\", // For KaTeX to know that we're not a browser in quirks mode\\n\\tisTiddlyWikiFakeDom: true\\n};\\n\\nexports.fakeDocument = document;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"global\"},\"$:/core/modules/utils/filesystem.js\":{\"title\":\"$:/core/modules/utils/filesystem.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/utils/filesystem.js\\ntype: application/javascript\\nmodule-type: utils-node\\n\\nFile system utilities\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar fs = require(\\\"fs\\\"),\\n\\tpath = require(\\\"path\\\");\\n\\n/*\\nReturn the subdirectories of a path\\n*/\\nexports.getSubdirectories = function(dirPath) {\\n\\tif(!$tw.utils.isDirectory(dirPath)) {\\n\\t\\treturn null;\\n\\t}\\n\\tvar subdirs = [];\\n\\t$tw.utils.each(fs.readdirSync(dirPath),function(item) {\\n\\t\\tif($tw.utils.isDirectory(path.resolve(dirPath,item))) {\\n\\t\\t\\tsubdirs.push(item);\\n\\t\\t}\\n\\t});\\n\\treturn subdirs;\\n}\\n\\n/*\\nRecursively (and synchronously) copy a directory and all its content\\n*/\\nexports.copyDirectory = function(srcPath,dstPath) {\\n\\t// Remove any trailing path separators\\n\\tsrcPath = path.resolve($tw.utils.removeTrailingSeparator(srcPath));\\n\\tdstPath = path.resolve($tw.utils.removeTrailingSeparator(dstPath));\\n\\t// Check that neither director is within the other\\n\\tif(srcPath.substring(0,dstPath.length) === dstPath || dstPath.substring(0,srcPath.length) === srcPath) {\\n\\t\\treturn \\\"Cannot copy nested directories\\\";\\n\\t}\\n\\t// Create the destination directory\\n\\tvar err = $tw.utils.createDirectory(dstPath);\\n\\tif(err) {\\n\\t\\treturn err;\\n\\t}\\n\\t// Function to copy a folder full of files\\n\\tvar copy = function(srcPath,dstPath) {\\n\\t\\tvar srcStats = fs.lstatSync(srcPath),\\n\\t\\t\\tdstExists = fs.existsSync(dstPath);
2731\\n\\t\\tif(srcStats.isFile()) {\\n\\t\\t\\t$tw.utils.copyFile(srcPath,dstPath);\\n\\t\\t} else if(srcStats.isDirectory()) {\\n\\t\\t\\tvar items = fs.readdirSync(srcPath);\\n\\t\\t\\tfor(var t=0; t\u003Citems.length; t++) {\\n\\t\\t\\t\\tvar item = items[t],\\n\\t\\t\\t\\t\\terr = copy(srcPath + path.sep + item,dstPath + path.sep + item);\\n\\t\\t\\t\\tif(err) {\\n\\t\\t\\t\\t\\treturn err;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t};\\n\\tcopy(srcPath,dstPath);\\n\\treturn null;\\n};\\n\\n/*\\nCopy a file\\n*/\\nvar FILE_BUFFER_LENGTH = 64 * 1024,\\n\\tfileBuffer;\\n\\nexports.copyFile = function(srcPath,dstPath) {\\n\\t// Create buffer if required\\n\\tif(!fileBuffer) {\\n\\t\\tfileBuffer = Buffer.alloc(FILE_BUFFER_LENGTH);\\n\\t}\\n\\t// Create any directories in the destination\\n\\t$tw.utils.createDirectory(path.dirname(dstPath));\\n\\t// Copy the file\\n\\tvar srcFile = fs.openSync(srcPath,\\\"r\\\"),\\n\\t\\tdstFile = fs.openSync(dstPath,\\\"w\\\"),\\n\\t\\tbytesRead = 1,\\n\\t\\tpos = 0;\\n\\twhile (bytesRead > 0) {\\n\\t\\tbytesRead = fs.readSync(srcFile,fileBuffer,0,FILE_BUFFER_LENGTH,pos);\\n\\t\\tfs.writeSync(dstFile,fileBuffer,0,bytesRead);\\n\\t\\tpos += bytesRead;\\n\\t}\\n\\tfs.closeSync(srcFile);\\n\\tfs.closeSync(dstFile);\\n\\treturn null;\\n};
2731\\n\\n/*\\nRemove trailing path separator\\n*/\\nexports.removeTrailingSeparator = function(dirPath) {\\n\\tvar len = dirPath.length;\\n\\tif(dirPath.charAt(len-1) === path.sep) {\\n\\t\\tdirPath = dirPath.substr(0,len-1);\\n\\t}\\n\\treturn dirPath;\\n};\\n\\n/*\\nRecursively create a directory\\n*/\\nexports.createDirectory = function(dirPath) {\\n\\tif(dirPath.substr(dirPath.length-1,1) !== path.sep) {\\n\\t\\tdirPath = dirPath + path.sep;\\n\\t}\\n\\tvar pos = 1;\\n\\tpos = dirPath.indexOf(path.sep,pos);\\n\\twhile(pos !== -1) {\\n\\t\\tvar subDirPath = dirPath.substr(0,pos);\\n\\t\\tif(!$tw.utils.isDirectory(subDirPath)) {\\n\\t\\t\\ttry {\\n\\t\\t\\t\\tfs.mkdirSync(subDirPath);\\n\\t\\t\\t} catch(e) {\\n\\t\\t\\t\\treturn \\\"Error creating directory '\\\" + subDirPath + \\\"'\\\";\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tpos = dirPath.indexOf(path.sep,pos + 1);\\n\\t}\\n\\treturn null;\\n};\\n\\n/*\\nRecursively create directories needed to contain a specified file\\n*/\\nexports.createFileDirectories = function(filePath) {\\n\\treturn $tw.utils.createDirectory(path.dirname(filePath));\\n};\\n\\n/*\\nRecursively delete a directory\\n*/\\nexports.deleteDirectory = function(dirPath) {\\n\\tif(fs.existsSync(dirPath)) {\\n\\t\\tvar entries = fs.readdirSync(dirPath);\\n\\t\\tfor(var entryIndex=0; entryIndex\u003Centries.length; entryIndex++) {\\n\\t\\t\\tvar currPath = dirPath + path.sep + entries[entryIndex];\\n\\t\\t\\tif(fs.lstatSync(currPath).isDirectory()) {\\n\\t\\t\\t\\t$tw.utils.deleteDirectory(currPath);\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tfs.unlinkSync(currPath);\\n\\t\\t\\t}\\n\\t\\t}\\n\\tfs.rmdirSync(dirPath);\\n\\t}\\n\\treturn null;\\n};
2731\\n\\n/*\\nCheck if a path identifies a directory\\n*/\\nexports.isDirectory = function(dirPath) {\\n\\treturn fs.existsSync(dirPath) && fs.statSync(dirPath).isDirectory();\\n};\\n\\n/*\\nCheck if a path identifies a directory that is empty\\n*/\\nexports.isDirectoryEmpty = function(dirPath) {\\n\\tif(!$tw.utils.isDirectory(dirPath)) {\\n\\t\\treturn false;\\n\\t}\\n\\tvar files = fs.readdirSync(dirPath),\\n\\t\\tempty = true;\\n\\t$tw.utils.each(files,function(file,index) {\\n\\t\\tif(file.charAt(0) !== \\\".\\\") {\\n\\t\\t\\tempty = false;\\n\\t\\t}\\n\\t});\\n\\treturn empty;\\n};\\n\\n/*\\nRecursively delete a tree of empty directories\\n*/\\nexports.deleteEmptyDirs = function(dirpath,callback) {\\n\\tvar self = this;\\n\\tfs.readdir(dirpath,function(err,files) {\\n\\t\\tif(err) {\\n\\t\\t\\treturn callback(err);\\n\\t\\t}\\n\\t\\tif(files.length > 0) {\\n\\t\\t\\treturn callback(null);\\n\\t\\t}\\n\\t\\tfs.rmdir(dirpath,function(err) {\\n\\t\\t\\tif(err) {\\n\\t\\t\\t\\treturn callback(err);\\n\\t\\t\\t}\\n\\t\\t\\tself.deleteEmptyDirs(path.dirname(dirpath),callback);\\n\\t\\t});\\n\\t});\\n};\\n\\n/*\\nCreate a fileInfo object for saving a tiddler:\\n\\tfilepath: the absolute path to the file containing the tiddler\\n\\ttype: the type of the tiddler file on disk (NOT the type of the tiddler)\\n\\thasMetaFile: true if the file also has a companion .meta file\\n\\tisEditableFile: true if the tiddler was loaded via non-standard options & marked editable\\nOptions include:\\n\\tdirectory: absolute path of root directory to which we are saving\\n\\tpathFilters: optional array of filters to be used to generate the base path\\n\\textFilters: optional array of filters to be used to generate the base path\\n\\twiki: optional wiki for evaluating the pathFilters,\\n\\tfileInfo: an existing fileInfo to check against\\n*/\\nexports.generateTiddlerFileInfo = function(tiddler,options) {\\n\\tvar fileInfo = {}, metaExt;\\n\\t// Propagate the isEditableFile flag\\n\\tif(options.fileInfo && !!options.fileInfo.isEditableFile) {\\n\\t\\tfileInfo.isEditableFile = true;\\n\\t\\tfileInfo.originalpath = options.fileInfo.originalpath;\\n\\t}\\n\\t// Check if the tiddler has any unsafe fields that can't be expressed in a .tid or .meta file: containing control characters, or leading/trailing whitespace\\n\\tvar hasUnsafeFields = false;\\n\\t$tw.utils.each(tiddler.getFieldStrings(),function(value,fieldName) {\\n\\t\\tif(fieldName !== \\\"text\\\") {\\n\\t\\t\\thasUnsafeFields = hasUnsafeFields || /[\\\\x00-\\\\x1F]/mg.test(value);\\n\\t\\t\\thasUnsafeFields = hasUnsafeFields || ($tw.utils.trim(value) !== value);\\n\\t\\t}\\n\\t\\thasUnsafeFields = hasUnsafeFields || /:|#/mg.test(fieldName);\\n\\t});\\n\\t// Check for field values \\n\\tif(hasUnsafeFields) {\\n\\t\\t// Save as a JSON file\\n\\t\\tfileInfo.type = \\\"application/json\\\";\\n\\t\\tfileInfo.hasMetaFile = false;\\n\\t} else {\\n\\t\\t// Save as a .tid or a text/binary file plus a .meta file\\n\\t\\tvar tiddlerType = ti
2731ddler.fields.type || \\\"text/vnd.tiddlywiki\\\";\\n\\t\\tif(tiddlerType === \\\"text/vnd.tiddlywiki\\\" || tiddler.hasField(\\\"_canonical_uri\\\")) {\\n\\t\\t\\t// Save as a .tid file\\n\\t\\t\\tfileInfo.type = \\\"application/x-tiddler\\\";\\n\\t\\t\\tfileInfo.hasMetaFile = false;\\n\\t\\t} else {\\n\\t\\t\\t// Save as a text/binary file and a .meta file\\n\\t\\t\\tfileInfo.type = tiddlerType;\\n\\t\\t\\tfileInfo.hasMetaFile = true;\\n\\t\\t}\\n\\t\\tif(options.extFilters) {\\n\\t\\t\\t// Check for extension overrides\\n\\t\\t\\tmetaExt = $tw.utils.generateTiddlerExtension(tiddler.fields.title,{\\n\\t\\t\\t\\textFilters: options.extFilters,\\n\\t\\t\\t\\twiki: options.wiki\\n\\t\\t\\t});\\n\\t\\t\\tif(metaExt) {\\n\\t\\t\\t\\tif(metaExt === \\\".tid\\\") {\\n\\t\\t\\t\\t\\t// Overriding to the .tid extension needs special handling\\n\\t\\t\\t\\t\\tfileInfo.type = \\\"application/x-tiddler\\\";\\n\\t\\t\\t\\t\\tfileInfo.hasMetaFile = false;\\n\\t\\t\\t\\t} else if (metaExt === \\\".json\\\") {\\n\\t\\t\\t\\t\\t// Overriding to the .json extension needs special handling\\n\\t\\t\\t\\t\\tfileInfo.type = \\\"application/json\\\";\\n\\t\\t\\t\\t\\tfileInfo.hasMetaFile = false;\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t//If the new type matches a known extention, use that MIME type's encoding\\n\\t\\t\\t\\t\\tvar extInfo = $tw.utils.getFileExtensionInfo(metaExt);\\n\\t\\t\\t\\t\\tfileInfo.type = extInfo ? extInfo.type : null;\\n\\t\\t\\t\\t\\tfileInfo.encoding = $tw.utils.getTypeEncoding(metaExt);\\n\\t\\t\\t\\t\\tfileInfo.hasMetaFile = true;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\t// Take the file extension from the tiddler content type or metaExt\\n\\tvar contentTypeInfo = $tw.config.contentTypeInfo[fileInfo.type] || {extension: \\\"\\\"};\\n\\t// Generate the filepath\\n\\tfileInfo.filepath = $tw.utils.generateTiddlerFilepath(tiddler.fields.title,{\\n\\t\\textension: metaExt || contentTypeInfo.extension,\\n\\t\\tdirectory: options.directory,\\n\\t\\tpathFilters: options.pathFilters,\\n\\t\\twiki: options.wiki,\\n\\t\\tfileInfo: options.fileInfo\\n\\t});\\n\\treturn fileInfo;\\n};\\n\\n/*\\nGenerate the file extension for saving a tiddler\\nOptions include:\\n\\textFilters: optional array of filters to be used to generate the extention\\n\\twiki: optional wiki for evaluating the extFilters\\n*/\\nexports.generateTiddlerExtension = function(title,options) {\\n\\tvar extension;\\n\\t// Check if any of the extFilters applies\\n\\tif(options.extFilters && options.wiki) { \\n\\t\\t$tw.utils.each(options.extFilters,function(filter) {\\n\\t\\t\\tif(!extension) {\\n\\t\\t\\t\\tvar source = options.wiki.makeTiddlerIterator([title]),\\n\\t\\t\\t\\t\\tresult = options.wiki.filterTiddlers(filter,null,source);\\n\\t\\t\\t\\tif(result.length > 0) {\\n\\t\\t\\t\\t\\textension = result[0];\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t});\\n\\t}\\n\\treturn extension;\\n};\\n\\n/*\\nGenerate the filepath for saving a tiddler\\nOptions include:\\n\\textension: file extension to be added the finished filepath\\n\\tdirectory: absolute path of root directory to which we are saving\\n\\tpathFilters: optional array of filters to be used to generate the base path\\n\\twiki: optional wiki for evaluating the pathFilters\\n\\tfileInfo: an existing fileInfo object to check against\\n*/\\nexports.generateTiddlerFilepath = function(title,options) {\\n\\tvar directory = options.directory || \\\"\\\",\\n\\t\\textension = options.extension || \\\"\\\",\\n\\t\\toriginalpath = (options.fileInfo && options.fileInfo.originalpath) ? options.fileInfo.originalpath : \\\"\\\",\\n\\t\\tfilepath;\\n\\t// Check if any of the pathFilters applies\\n\\tif(options.pathFilters && options.wiki) {\\n\\t\\t$tw.utils.each(options.pathFilters,function(filter) {\\n\\t\\t\\tif(!filepath) {\\n\\t\\t\\t\\tvar source = options.wiki.makeTiddlerIterator([title]),\\n\\t\\t\\t\\t\\tresult = options.wiki.filterTiddlers(filter,null,source);\\n\\t\\t\\t\\tif(result.length > 0) {\\n\\t\\t\\t\\t\\tfilepath = result[0];\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t});\\n\\t}\\n\\tif(!filepath && !!originalpath) {\\n\\t\\t//Use the originalpath without the extension\\n\\t\\tvar ext = path.extname(originalpath);\\n\\t\\tfilepath = originalpath.substring(0,originalpath.length - ext.length);\\n\\t} else if(!filepath) {\\n\\t\\tfilepath = title;\\n\\t\\t// Remove any forward or backward slashes so we don't create directories\\n\\t\\tfilepath = filepath.replace(/\\\\/|\\\\\\\\/g,\\\"_\\\");\\n\\t}\\n\\t// Replace any Windows control codes\\n\\tfilepath = filepath.replace(/^(con|prn|aux|nul|com[0-9]|lpt[0-9])$/i,\\\"_$1_\\\");
2731\\n\\t// Replace any leading spaces with the same number of underscores\\n\\tfilepath = filepath.replace(/^ +/,function (u) { return u.replace(/ /g, \\\"_\\\")});\\n\\t//If the path does not start with \\\".\\\" or \\\"..\\\" && a path seperator, then\\n\\tif(!/^\\\\.{1,2}[/\\\\\\\\]/g.test(filepath)) {\\n\\t\\t// Don't let the filename start with any dots because such files are invisible on *nix\\n\\t\\tfilepath = filepath.replace(/^\\\\.+/g,function (u) { return u.replace(/\\\\./g, \\\"_\\\")});\\n\\t}\\n\\t// Replace any Unicode control codes\\n\\tfilepath = filepath.replace(/[\\\\x00-\\\\x1f\\\\x80-\\\\x9f]/g,\\\"_\\\");\\n\\t// Replace any characters that can't be used in cross-platform filenames\\n\\tfilepath = $tw.utils.transliterate(filepath.replace(/\u003C|>|~|\\\\:|\\\\\\\"|\\\\||\\\\?|\\\\*|\\\\^/g,\\\"_\\\"));\\n\\t// Replace any dots or spaces at the end of the extension with the same number of underscores\\n\\textension = extension.replace(/[\\\\. ]+$/, function (u) { return u.replace(/[\\\\. ]/g, \\\"_\\\")});\\n\\t// Truncate the extension if it is too long\\n\\tif(extension.length > 32) {\\n\\t\\textension = extension.substr(0,32);\\n\\t}\\n\\t// If the filepath already ends in the extension then remove it\\n\\tif(filepath.substring(filepath.length - extension.length) === extension) {\\n\\t\\tfilepath = filepath.substring(0,filepath.length - extension.length);\\n\\t}\\n\\t// Truncate the filename if it is too long\\n\\tif(filepath.length > 200) {\\n\\t\\tfilepath = filepath.substr(0,200);\\n\\t}\\n\\t// If the resulting filename is blank (eg because the title is just punctuation)\\n\\tif(!filepath || /^_+$/g.test(filepath)) {\\n\\t\\t// ...then just use the character codes of the title\\n\\t\\tfilepath = \\\"\\\";\\n\\t\\t$tw.utils.each(title.split(\\\"\\\"),function(char) {\\n\\t\\t\\tif(filepath) {\\n\\t\\t\\t\\tfilepath += \\\"-\\\";\\n\\t\\t\\t}\\n\\t\\t\\tfilepath += char.charCodeAt(0).toString();\\n\\t\\t});\\n\\t}\\n\\t// Add a uniquifier if the file already exists\\n\\tvar fullPath, oldPath = (options.fileInfo) ? options.fileInfo.filepath : undefined,\\n\\t\\tcount = 0;\\n\\tdo {\\n\\t\\tfullPath = path.resolve(directory,filepath + (count ? \\\"_\\\" + count : \\\"\\\") + extension);\\n\\t\\tif(oldPath && oldPath == fullPath) {\\n\\t\\t\\tbreak;\\n\\t\\t}\\n\\t\\tcount++;\\n\\t} while(fs.existsSync(fullPath));\\n\\t// If the last write failed with an error, or if path does not start with:\\n\\t//\\tthe resolved options.directory, the resolved wikiPath directory, the wikiTiddlersPath directory, \\n\\t//\\tor the 'originalpath' directory, then $tw.utils.encodeURIComponentExtended() and resolve to tiddler directory.\\n\\tvar writePath = $tw.hooks.invokeHook(\\\"th-make-tiddler-path\\\",fullPath,fullPath),\\n\\t\\tencode = (options.fileInfo || {writeError: false}).writeError == true;\\n\\tif(!encode) {\\n\\t\\tencode = !(writePath.indexOf($tw.boot.wikiTiddlersPath) == 0 ||\\n\\t\\t\\twritePath.indexOf(path.resolve(directory)) == 0 ||\\n\\t\\t\\twritePath.indexOf(path.resolve($tw.boot.wikiPath)) == 0 ||\\n\\t\\t\\twritePath.indexOf(path.resolve($tw.boot.wikiTiddlersPath,originalpath)) == 0 );\\n\\t\\t}\\n\\tif(encode) {\\n\\t\\twritePath = path.resolve(directory,$tw.utils.encodeURIComponentExtended(fullPath));\\n\\t}\\n\\t// Return the full path to the file\\n\\treturn writePath;\\n};\\n\\n/*\\nSave a tiddler to a file described by the fileInfo:\\n\\tfilepath: the absolute path to the file containing the tiddler\\n\\ttype: the type of the tiddler file (NOT the type of the tiddler)\\n\\thasMetaFile: true if the file also has a companion .meta file\\n*/\\nexports.saveTiddlerToFile = function(tiddler,fileInfo,callback) {\\n\\t$tw.utils.createDirectory(path.dirname(fileInfo.filepath));\\n\\tif(fileInfo.hasMetaFile) {\\n\\t\\t// Save the tiddler as a separate body and meta file\\n\\t\\tvar typeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || \\\"text/plain\\\"] || {encoding: \\\"utf8\\\"};\\n\\t\\tfs.writeFile(fileInfo.filepath,tiddler.fields.text || \\\"\\\",typeInfo.encoding,function(err) {\\n\\t\\t\\tif(err) {\\n\\t\\t\\t\\treturn callback(err);\\n\\t\\t\\t}\\n\\t\\t\\tfs.writeFile(fileInfo.filepath + \\\".meta\\\",tiddler.getFieldStringBlock({exclude: [\\\"text\\\",\\\"bag\\\"]}),\\\"utf8\\\",function(err) {\\n\\t\\t\\t\\tif(err) {\\n\\t\\t\\t\\t\\treturn callback(err);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn callback(null,fileInfo);\\n\\t\\t\\t});\\n\\t\\t});\\n\\t} else {\\n\\t\\t// Save the tiddler as a self contained templated file\\n\\t\\tif(fileInfo.type === \\\"application/x-tiddler\\\") {\\n\\t\\t\\tfs.writeFile(fileInfo.filepath,tiddler.getFieldStringBlock({exclude: [\\\"text\\\",\\\"bag\\\"]}) + (!!tiddler.fields.text ? \\\"\\\\n\\\\n\\\" + tiddler.fields.text : \\\"\\\"),\\\"utf8\\\",function(err) {\\n\\t\\t\\t\\tif(err) {\\n\\t\\t\\t\\t\\treturn callback(err);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn callback(null,fileInfo);\\n\\t\\t\\t});\\n\\t\\t} else {\\n\\t\\t\\tfs.writeFile(fileInfo.filepath,JSON.stringify([tid
2731dler.getFieldStrings({exclude: [\\\"bag\\\"]})],null,$tw.config.preferences.jsonSpaces),\\\"utf8\\\",function(err) {\\n\\t\\t\\t\\tif(err) {\\n\\t\\t\\t\\t\\treturn callback(err);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn callback(null,fileInfo);\\n\\t\\t\\t});\\n\\t\\t}\\n\\t}\\n};\\n\\n/*\\nSave a tiddler to a file described by the fileInfo:\\n\\tfilepath: the absolute path to the file containing the tiddler\\n\\ttype: the type of the tiddler file (NOT the type of the tiddler)\\n\\thasMetaFile: true if the file also has a companion .meta file\\n*/\\nexports.saveTiddlerToFileSync = function(tiddler,fileInfo) {\\n\\t$tw.utils.createDirectory(path.dirname(fileInfo.filepath));\\n\\tif(fileInfo.hasMetaFile) {\\n\\t\\t// Save the tiddler as a separate body and meta file\\n\\t\\tvar typeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || \\\"text/plain\\\"] || {encoding: \\\"utf8\\\"};\\n\\t\\tfs.writeFileSync(fileInfo.filepath,tiddler.fields.text || \\\"\\\",typeInfo.encoding);\\n\\t\\tfs.writeFileSync(fileInfo.filepath + \\\".meta\\\",tiddler.getFieldStringBlock({exclude: [\\\"text\\\",\\\"bag\\\"]}),\\\"utf8\\\");\\n\\t} else {\\n\\t\\t// Save the tiddler as a self contained templated file\\n\\t\\tif(fileInfo.type === \\\"application/x-tiddler\\\") {\\n\\t\\t\\tfs.writeFileSync(fileInfo.filepath,tiddler.getFieldStringBlock({exclude: [\\\"text\\\",\\\"bag\\\"]}) + (!!tiddler.fields.text ? \\\"\\\\n\\\\n\\\" + tiddler.fields.text : \\\"\\\"),\\\"utf8\\\");\\n\\t\\t} else {\\n\\t\\t\\tfs.writeFileSync(fileInfo.filepath,JSON.stringify([tiddler.getFieldStrings({exclude: [\\\"bag\\\"]})],null,$tw.config.preferences.jsonSpaces),\\\"utf8\\\");\\n\\t\\t}\\n\\t}\\n\\treturn fileInfo;\\n};\\n\\n/*\\nDelete a file described by the fileInfo if it exits\\n*/\\nexports.deleteTiddlerFile = function(fileInfo,callback) {\\n\\t//Only attempt to delete files that exist on disk\\n\\tif(!fileInfo.filepath || !fs.existsSync(fileInfo.filepath)) {\\n\\t\\t//For some reason, the tiddler is only in memory or we can't modify the file at this path\\n\\t\\t$tw.syncer.displayError(\\\"Server deleteTiddlerFile task failed for filepath: \\\"+fileInfo.filepath);\\n\\t\\treturn callback(null,fileInfo);\\n\\t}\\n\\t// Delete the file\\n\\tfs.unlink(fileInfo.filepath,function(err) {\\n\\t\\tif(err) {\\n\\t\\t\\treturn callback(err);\\n\\t\\t}\\n\\t\\t// Delete the metafile if present\\n\\t\\tif(fileInfo.hasMetaFile && fs.existsSync(fileInfo.filepath + \\\".meta\\\")) {\\n\\t\\t\\tfs.unlink(fileInfo.filepath + \\\".meta\\\",function(err) {\\n\\t\\t\\t\\tif(err) {\\n\\t\\t\\t\\t\\treturn callback(err);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn $tw.utils.deleteEmptyDirs(path.dirname(fileInfo.filepath),function(err) {\\n\\t\\t\\t\\t\\tif(err) {\\n\\t\\t\\t\\t\\t\\treturn callback(err);\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\treturn callback(null,fileInfo);\\n\\t\\t\\t\\t});\\n\\t\\t\\t});\\n\\t\\t} else {\\n\\t\\t\\treturn $tw.utils.deleteEmptyDirs(path.dirname(fileInfo.filepath),function(err) {\\n\\t\\t\\t\\tif(err) {\\n\\t\\t\\t\\t\\treturn callback(err);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn callback(null,fileInfo);\\n\\t\\t\\t});\\n\\t\\t}\\n\\t});\\n};\\n\\n/*\\nCleanup old files on disk, by comparing the options values:\\n\\tadaptorInfo from $tw.syncer.tiddlerInfo\\n\\tbootInfo from $tw.boot.files\\n*/\\nexports.cleanupTiddlerFiles = function(options,callback) {\\n\\tvar adaptorInfo = options.adaptorInfo || {},\\n\\tbootInfo = options.bootInfo || {},\\n\\ttitle = options.title || \\\"undefined\\\";\\n\\tif(adaptorInfo.filepath && bootInfo.filepath && adaptorInfo.filepath !== bootInfo.filepath) {\\n\\t\\t$tw.utils.deleteTiddlerFile(adaptorInfo,function(err) {\\n\\t\\t\\tif(err) {\\n\\t\\t\\t\\tif ((err.code == \\\"EPERM\\\" || err.code == \\\"EACCES\\\") && err.syscall == \\\"unlink\\\") {\\n\\t\\t\\t\\t\\t// Error deleting the previous file on disk, should fail gracefully\\n\\t\\t\\t\\t\\t$tw.syncer.displayError(\\\"Server desynchronized. Error cleaning up previous file for tiddler: \\\\\\\"\\\"+title+\\\"\\\\\\\"\\\",err);\\n\\t\\t\\t\\t\\treturn callback(null,bootInfo);\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\treturn callback(err);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\treturn callback(null,bootInfo);\\n\\t\\t});\\n\\t} else {\\n\\t\\treturn callback(null,bootInfo);\\n\\t}\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"utils-node\"},\"$:/core/modules/utils/linkedlist.js\":{\"title\":\"$:/core/modules/utils/linkedlist.js\",\"text\":\"/*\\\\\\nmodule-type: utils\\ntitle: $
2731:/core/modules/utils/linkedlist.js\\ntype: application/javascript\\n\\nThis is a doubly-linked indexed list intended for manipulation, particularly\\npushTop, which it does with significantly better performance than an array.\\n\\n\\\\*/\\n(function(){\\n\\nfunction LinkedList() {\\n\\tthis.clear();\\n};\\n\\nLinkedList.prototype.clear = function() {\\n\\t// LinkedList performs the duty of both the head and tail node\\n\\tthis.next = new LLMap();\\n\\tthis.prev = new LLMap();\\n\\t// Linked list head initially points to itself\\n\\tthis.next.set(null, null);\\n\\tthis.prev.set(null, null);\\n\\tthis.length = 0;\\n};\\n\\nLinkedList.prototype.remove = function(value) {\\n\\tif($tw.utils.isArray(value)) {\\n\\t\\tfor(var t=0; t\u003Cvalue.length; t++) {\\n\\t\\t\\t_assertString(value[t]);\\n\\t\\t}\\n\\t\\tfor(var t=0; t\u003Cvalue.length; t++) {\\n\\t\\t\\t_removeOne(this,value[t]);\\n\\t\\t}\\n\\t} else {\\n\\t\\t_assertString(value);\\n\\t\\t_removeOne(this,value);\\n\\t}\\n};\\n\\n/*\\nPush behaves like array.push and accepts multiple string arguments. But it also\\naccepts a single array argument too, to be consistent with its other methods.\\n*/\\nLinkedList.prototype.push = function(/* values */) {\\n\\tvar i, values = arguments;\\n\\tif($tw.utils.isArray(values[0])) {\\n\\t\\tvalues = values[0];\\n\\t}\\n\\tfor(i = 0; i \u003C values.length; i++) {\\n\\t\\t_assertString(values[i]);\\n\\t}\\n\\tfor(i = 0; i \u003C values.length; i++) {\\n\\t\\t_linkToEnd(this,values[i]);\\n\\t}\\n\\treturn this.length;\\n};\\n\\nLinkedList.prototype.pushTop = function(value) {\\n\\tvar t;\\n\\tif($tw.utils.isArray(value)) {\\n\\t\\tfor (t=0; t\u003Cvalue.length; t++) {\\n\\t\\t\\t_assertString(value[t]);\\n\\t\\t}\\n\\t\\tfor(t=0; t\u003Cvalue.length; t++) {\\n\\t\\t\\t_removeOne(this,value[t]);\\n\\t\\t}\\n\\t\\tfor(t=0; t\u003Cvalue.length; t++) {\\n\\t\\t\\t_linkToEnd(this,value[t]);\\n\\t\\t}\\n\\t} else {\\n\\t\\t_assertString(value);\\n\\t\\t_removeOne(this,value);\\n\\t\\t_linkToEnd(this,value);\\n\\t}\\n};\\n\\nLinkedList.prototype.each = function(callback) {\\n\\tvar visits = Object.create(null),\\n\\t\\tvalue = this.next.get(null);\\n\\twhile(value !== null) {\\n\\t\\tcallback(value);\\n\\t\\tvar next = this.next.get(value);\\n\\t\\tif(Array.isArray(next)) {\\n\\t\\t\\tvar i = visits[value] || 0;\\n\\t\\t\\tvisits[value] = i+1;\\n\\t\\t\\tvalue = next[i];\\n\\t\\t} else {\\n\\t\\t\\tvalue = next;\\n\\t\\t}\\n\\t}\\n};\\n\\nLinkedList.prototype.toArray = function() {\\n\\tvar output = new Array(this.length),\\n\\t\\tindex = 0;\\n\\tthis.each(function(value) { output[index++] = value; });\\n\\treturn output;\\n};\\n\\nLinkedList.prototype.makeTiddlerIterator = function(wiki) {\\n\\tvar self = this;\\n\\treturn function(callback) {\\n\\t\\tself.each(function(title) {\\n\\t\\t\\tcallback(wiki.getTiddler(title),title);\\n\\t\\t});\\n\\t};\\n};\\n\\nfunction _removeOne(list,value) {\\n\\tvar nextEntry = list.next.get(value);\\n\\tif(nextEntry === undefined) {\\n\\t\\treturn;\\n\\t}\\n\\tvar prevEntry = list.prev.get(value),\\n\\t\\tprev = prevEntry,\\n\\t\\tnext = nextEntry,\\n\\t\\tref;\\n\\tif(Array.isArray(nextEntry)) {\\n\\t\\tnext = nextEntry[0];\\n\\t\\tprev = prevEntry[0];\\n\\t}\\n\\t// Relink preceding element.\\n\\tref = list.next.get(prev);\\n\\tif(Array.isArray(ref)) {\\n\\t\\tvar i = ref.indexOf(value);\\n\\t\\tref[i] = next;\\n\\t} else {\\n\\t\\tlist.next.set(prev,next);\\n\\t}\\n\\n\\t// Now relink following element\\n\\tref = list.prev.get(next);\\n\\tif(Array.isArray(ref)) {\\n\\t\\tvar i = ref.indexOf(value);\\n\\t\\tref[i] = prev;\\n\\t} else {\\n\\t\\tlist.prev.set(next,prev);\\n\\t}\\n\\n\\t// Delink actual value. If it uses arrays, just remove first entries.\\n\\tif(Array.isArray(nextEntry) && nextEntry.length > 1) {\\n\\t\\tnextEntry.shift();\\n\\t\\tprevEntry.shift();\\n\\t} else {\\n\\t\\tlist.next.set(value,undefined);\\n\\t\\tlist.prev.set(value,undefined);\\n\\t}\\n\\tlist.length -= 1;\\n};\\n\\n// Sticks the given node onto the end of the list.\\nfunction _linkToEnd(list,value) {\\n\\tvar old = list.next.get(value);\\n\\tvar last = list.prev.get(null);\\n\\t// Does it already exists?\\n\\tif(old !== undefined) {\\n\\t\\tif(!Array.isArray(old)) {\\n\\t\\t\\told = [old];\\n\\t\\t\\tlist.next.set(value,old);\\n\\t\\t\\tlist.prev.set(value,[list.prev.get(value)]);\\n\\t\\t}\\n\\t\\told.push(null);\\n\\t\\tlist.prev.get(value).push(last);\\n\\t} else {\\n\\t\\tlist.next.set(value,null);\\n\\t\\tlist.prev.set(value,last);\\n\\t}\\n\\t// Make the old last point to this new one.\\n\\tif(value !== last) {\\n\\t\\tvar array = list.next.get(last);\\n\\t\\tif(Array.isArray(array)) {\\n\\t\\t\\tarray[array.length-1] = value;\\n\\t\\t} else {\\n\\t\\t\\tlist.next.set(last,value);\\n\\t\\t}\\n\\t\\tlist.prev.set(null,value);\\n\\t} else {\\n\\t\\t// Edge case, the pushed value was already the last value.\\n\\t\\t// The second-to-last nextPtr for that value must point to itself now.\\n\\t\\tvar array = list.next.get(last);\\n\\t\\tarray[array.length-2] = value;\\n\\t}\\n\\tlist.length += 1;\\n};\\n\\nfunction _assertString(value) {\\n\\tif(typeof value !== \\\"string\\\") {\\n\\t\\tthrow \\\"Linked List only accepts string values, not \\\" + value;\\n\\t}\\n};\\n\\nvar LLMap = function() {\\n\\tthis.map = Object.create(null);\\n};
2731\\n\\n// Just a wrapper so our object map can also accept null.\\nLLMap.prototype = {\\n\\tset: function(key,val) {\\n\\t\\t(key === null) ? (this.null = val) : (this.map[key] = val);\\n\\t},\\n\\tget: function(key) {\\n\\t\\treturn (key === null) ? this.null : this.map[key];\\n\\t}\\n};\\n\\nexports.LinkedList = LinkedList;\\n\\n})();\\n\",\"module-type\":\"utils\",\"type\":\"application/javascript\"},\"$:/core/modules/utils/logger.js\":{\"title\":\"$:/core/modules/utils/logger.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/utils/logger.js\\ntype: application/javascript\\nmodule-type: utils\\n\\nA basic logging implementation\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar ALERT_TAG = \\\"$:/tags/Alert\\\";\\n\\n/*\\nMake a new logger\\n*/\\nfunction Logger(componentName,options) {\\n\\toptions = options || {};\\n\\tthis.componentName = componentName || \\\"\\\";\\n\\tthis.colour = options.colour || \\\"white\\\";\\n\\tthis.enable = \\\"enable\\\" in options ? options.enable : true;\\n\\tthis.save = \\\"save\\\" in options ? options.save : true;\\n\\tthis.saveLimit = options.saveLimit || 100 * 1024;\\n\\tthis.saveBufferLogger = this;\\n\\tthis.buffer = \\\"\\\";\\n\\tthis.alertCount = 0;\\n}\\n\\nLogger.prototype.setSaveBuffer = function(logger) {\\n\\tthis.saveBufferLogger = logger;\\n};
2731\\n\\n/*\\nLog a message\\n*/\\nLogger.prototype.log = function(/* args */) {\\n\\tvar self = this;\\n\\tif(this.enable) {\\n\\t\\tif(this.saveBufferLogger.save) {\\n\\t\\t\\tthis.saveBufferLogger.buffer += $tw.utils.formatDateString(new Date(),\\\"YYYY MM DD 0hh:0mm:0ss.0XXX\\\") + \\\":\\\";\\n\\t\\t\\t$tw.utils.each(Array.prototype.slice.call(arguments,0),function(arg,index) {\\n\\t\\t\\t\\tself.saveBufferLogger.buffer += \\\" \\\" + arg;\\n\\t\\t\\t});\\n\\t\\t\\tthis.saveBufferLogger.buffer += \\\"\\\\n\\\";\\n\\t\\t\\tthis.saveBufferLogger.buffer = this.saveBufferLogger.buffer.slice(-this.saveBufferLogger.saveLimit);\\n\\t\\t}\\n\\t\\tif(console !== undefined && console.log !== undefined) {\\n\\t\\t\\tvar logMessage = [$tw.utils.terminalColour(this.colour) + this.componentName + \\\":\\\"].concat(Array.prototype.slice.call(arguments,0));\\n\\t\\t\\tlogMessage[logMessage.length-1] += $tw.utils.terminalColour();\\n\\t\\t\\treturn Function.apply.call(console.log, console, logMessage);\\n\\t\\t}\\n\\t} \\n};\\n\\n/*\\nRead the message buffer\\n*/\\nLogger.prototype.getBuffer = function() {\\n\\treturn this.saveBufferLogger.buffer;\\n};
2731\\n\\n/*\\nLog a structure as a table\\n*/\\nLogger.prototype.table = function(value) {\\n\\t(console.table || console.log)(value);\\n};\\n\\n/*\\nAlert a message\\n*/\\nLogger.prototype.alert = function(/* args */) {\\n\\tif(this.enable) {\\n\\t\\t// Prepare the text of the alert\\n\\t\\tvar text = Array.prototype.join.call(arguments,\\\" \\\");\\n\\t\\t// Create alert tiddlers in the browser\\n\\t\\tif($tw.browser) {\\n\\t\\t\\t// Check if there is an existing alert with the same text and the same component\\n\\t\\t\\tvar existingAlerts = $tw.wiki.getTiddlersWithTag(ALERT_TAG),\\n\\t\\t\\t\\talertFields,\\n\\t\\t\\t\\texistingCount,\\n\\t\\t\\t\\tself = this;\\n\\t\\t\\t$tw.utils.each(existingAlerts,function(title) {\\n\\t\\t\\t\\tvar tiddler = $tw.wiki.getTiddler(title);\\n\\t\\t\\t\\tif(tiddler.fields.text === text && tiddler.fields.component === self.componentName && tiddler.fields.modified && (!alertFields || tiddler.fields.modified \u003C alertFields.modified)) {\\n\\t\\t\\t\\t\\t\\talertFields = $tw.utils.extend({},tiddler.fields);\\n\\t\\t\\t\\t}\\n\\t\\t\\t});\\n\\t\\t\\tif(alertFields) {\\n\\t\\t\\t\\texistingCount = alertFields.count || 1;\\n\\t\\t\\t} else {\\n\\t\\t\\t\\talertFields = {\\n\\t\\t\\t\\t\\ttitle: $tw.wiki.generateNewTitle(\\\"$:/temp/alerts/alert\\\",{prefix: \\\"\\\"}),\\n\\t\\t\\t\\t\\ttext: text,\\n\\t\\t\\t\\t\\ttags: [ALERT_TAG],\\n\\t\\t\\t\\t\\tcomponent: this.componentName\\n\\t\\t\\t\\t};\\n\\t\\t\\t\\texistingCount = 0;\\n\\t\\t\\t\\tthis.alertCount += 1;\\n\\t\\t\\t}\\n\\t\\t\\talertFields.modified = new Date();\\n\\t\\t\\tif(++existingCount > 1) {\\n\\t\\t\\t\\talertFields.count = existingCount;\\n\\t\\t\\t} else {\\n\\t\\t\\t\\talertFields.count = undefined;\\n\\t\\t\\t}\\n\\t\\t\\t$tw.wiki.addTiddler(new $tw.Tiddler(alertFields));\\n\\t\\t\\t// Log the alert as well\\n\\t\\t\\tthis.log.apply(this,Array.prototype.slice.call(arguments,0));\\n\\t\\t} else {\\n\\t\\t\\t// Print an orange message to the console if not in the browser\\n\\t\\t\\tconsole.error(\\\"\\\\x1b[1;33m\\\" + text + \\\"\\\\x1b[0m\\\");\\n\\t\\t}\\n\\t}\\n};\\n\\n/*\\nClear outstanding alerts\\n*/\\nLogger.prototype.clearAlerts = function() {\\n\\tvar self = this;\\n\\tif($tw.browser && this.alertCount > 0) {\\n\\t\\t$tw.utils.each($tw.wiki.getTiddlersWithTag(ALERT_TAG),function(title) {\\n\\t\\t\\tvar tiddler = $tw.wiki.getTiddler(title);\\n\\t\\t\\tif(tiddler.fields.component === self.componentName) {\\n\\t\\t\\t\\t$tw.wiki.deleteTiddler(title);\\n\\t\\t\\t}\\n\\t\\t});\\n\\t\\tthis.alertCount = 0;\\n\\t}\\n};\\n\\nexports.Logger = Logger;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"utils\"},\"$:/core/modules/utils/parsetree.js\":{\"title\":\"$:/core/modules/utils/parsetree.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/utils/parsetree.js\\ntype: application/javascript\\nmodule-type: utils\\n\\nParse tree utility functions.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nAdd attribute to parse tree node\\nCan be invoked as (node,name,value) or (node,attr)\\n*/\\nexports.addAttributeToParseTreeNode = function(node,name,value) {\\n\\tvar attribute = typeof name === \\\"object\\\" ? name : {name: name, type: \\\"string\\\", value: value};\\n\\tname = attribute.name;\\n\\tnode.attributes = node.attributes || {};\\n\\tnode.orderedAttributes = node.orderedAttributes || [];\\n\\tnode.attributes[name] = attribute;\\n\\tvar foundIndex = -1;\\n\\t$tw.utils.each(node.orderedAttributes,function(attr,index) {\\n\\t\\tif(attr.name === name) {\\n\\t\\t\\tfoundIndex = index;\\n\\t\\t}\\n\\t});\\n\\tif(foundIndex === -1) {\\n\\t\\tnode.orderedAttributes.push(attribute);\\n\\t} else {\\n\\t\\tnode.orderedAttributes[foundIndex] = attribute;\\n\\t}\\n};\\n\\nexports.getOrderedAttributesFromParseTreeNode = function(node) {\\n\\tif(node.orderedAttributes) {\\n\\t\\treturn node.orderedAttributes;\\n\\t} else {\\n\\t\\tvar attributes = [];\\n\\t\\t$tw.utils.each(node.attributes,function(attribute) {\\n\\t\\t\\tattributes.push(attribute);\\n\\t\\t});\\n\\t\\treturn attributes.sort(function(a,b) {\\n\\t\\t\\treturn a.name \u003C b.name ? -1 : (a.name > b.name ? 1 : 0);\\n\\t\\t});\\n\\t}\\n};\\n\\nexports.getAttributeValueFromParseTreeNode = function(node,name,defaultValue) {\\n\\tif(node.attributes && node.attributes[name] && node.attributes[name].value !== undefined) {\\n\\t\\treturn node.attributes[name].value;\\n\\t}\\n\\treturn defaultValue;\\n};\\n\\nexports.addClassToParseTreeNode = function(node,classString) {\\n\\tvar classes = [],\\n\\t\\tattribute;\\n\\tnode.attributes = node.attributes || {};
2731\\n\\tattribute = node.attributes[\\\"class\\\"];\\n\\tif(!attribute) {\\n\\t\\t// If the class attribute does not exist, we must create it first.\\n\\t\\tattribute = {name: \\\"class\\\", type: \\\"string\\\", value: \\\"\\\"};\\n\\t\\tnode.attributes[\\\"class\\\"] = attribute;\\n\\t\\tnode.orderedAttributes = node.orderedAttributes || [];\\n\\t\\tnode.orderedAttributes.push(attribute);\\n\\t}\\n\\tif(attribute.type === \\\"string\\\") {\\n\\t\\tif(attribute.value !== \\\"\\\") {\\n\\t\\t\\tclasses = attribute.value.split(\\\" \\\");\\n\\t\\t}\\n\\t\\tif(classString !== \\\"\\\") {\\n\\t\\t\\t$tw.utils.pushTop(classes,classString.split(\\\" \\\"));\\n\\t\\t}\\n\\t\\tattribute.value = classes.join(\\\" \\\");\\n\\t}\\n};\\n\\nexports.addStyleToParseTreeNode = function(node,name,value) {\\n\\tvar attribute;\\n\\tnode.attributes = node.attributes || {};\\n\\tattribute = node.attributes.style;\\n\\tif(!attribute) {\\n\\t\\tattribute = {name: \\\"style\\\", type: \\\"string\\\", value: \\\"\\\"};\\n\\t\\tnode.attributes.style = attribute;\\n\\t\\tnode.orderedAttributes = node.orderedAttributes || [];\\n\\t\\tnode.orderedAttributes.push(attribute);\\n\\t}\\n\\tif(attribute.type === \\\"string\\\") {\\n\\t\\tattribute.value += name + \\\":\\\" + value + \\\";\\\";\\n\\t}\\n};\\n\\nexports.findParseTreeNode = function(nodeArray,search) {\\n\\tfor(var t=0; t\u003CnodeArray.length; t++) {\\n\\t\\tif(nodeArray[t].type === search.type && nodeArray[t].tag === search.tag) {\\n\\t\\t\\treturn nodeArray[t];\\n\\t\\t}\\n\\t}\\n\\treturn undefined;\\n};\\n\\n/*\\nHelper to get the text of a parse tree node or array of nodes\\n*/\\nexports.getParseTreeText = function getParseTreeText(tree) {\\n\\tvar output = [];\\n\\tif($tw.utils.isArray(tree)) {\\n\\t\\t$tw.utils.each(tree,function(node) {\\n\\t\\t\\toutput.push(getParseTreeText(node));\\n\\t\\t});\\n\\t} else {\\n\\t\\tif(tree.type === \\\"text\\\") {\\n\\t\\t\\toutput.push(tree.text);\\n\\t\\t}\\n\\t\\tif(tree.children) {\\n\\t\\t\\treturn getParseTreeText(tree.children);\\n\\t\\t}\\n\\t}\\n\\treturn output.join(\\\"\\\");\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"utils\"},\"$:/core/modules/utils/performance.js\":{\"title\":\"$:/core/modules/utils/performance.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/utils/performance.js\\ntype: application/javascript\\nmodule-type: global\\n\\nPerformance measurement.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nfunction Performance(enabled) {\\n\\tthis.enabled = !!enabled;\\n\\tthis.measures = {}; // Hashmap by measurement name of {time:, invocations:}\\n\\tthis.logger = new $tw.utils.Logger(\\\"performance\\\");\\n\\tthis.showGreeting();\\n}\\n\\nPerformance.prototype.showGreeting = function() {\\n\\tif($tw.browser) {\\n\\t\\tthis.logger.log(\\\"Execute $tw.perf.log(); to see filter execution timings\\\");\\n\\t}\\n};\\n\\n/*\\nWrap performance reporting around a top level function\\n*/\\nPerformance.prototype.report = function(name,fn) {\\n\\tvar self = this;\\n\\tif(this.enabled) {\\n\\t\\treturn function() {\\n\\t\\t\\tvar startTime = $tw.utils.timer(),\\n\\t\\t\\t\\tresult = fn.apply(this,arguments);\\n\\t\\t\\tself.logger.log(name + \\\": \\\" + $tw.utils.timer(startTime).toFixed(2) + \\\"ms\\\");\\n\\t\\t\\treturn result;\\n\\t\\t};\\n\\t} else {\\n\\t\\treturn fn;\\n\\t}\\n};\\n\\nPerformance.prototype.log = function() {\\n\\tvar self = this,\\n\\t\\ttotalTime = 0,\\n\\t\\torderedMeasures = Object.keys(this.measures).sort(function(a,b) {\\n\\t\\t\\tif(self.measures[a].time > self.measures[b].time) {\\n\\t\\t\\t\\treturn -1;\\n\\t\\t\\t} else if (self.measures[a].time \u003C self.measures[b].time) {\\n\\t\\t\\t\\treturn + 1;\\n\\t\\t\\t} else {\\n\\t\\t\\t\\treturn 0;\\n\\t\\t\\t}\\n\\t\\t});\\n\\t$tw.utils.each(orderedMeasures,function(name) {\\n\\t\\ttotalTime += self.measures[name].time;\\n\\t});\\n\\tvar results = []\\n\\t$tw.utils.each(orderedMeasures,function(name) {\\n\\t\\tvar measure = self.measures[name];\\n\\t\\tresults.push({name: name,invocations: measure.invocations, avgTime: measure.time / measure.invocations, totalTime: measure.time, percentTime: (measure.time / totalTime) * 100})\\n\\t});\\n\\tself.logger.table(results);\\n};
2731\\n\\n/*\\nWrap performance measurements around a subfunction\\n*/\\nPerformance.prototype.measure = function(name,fn) {\\n\\tvar self = this;\\n\\tif(this.enabled) {\\n\\t\\treturn function() {\\n\\t\\t\\tvar startTime = $tw.utils.timer(),\\n\\t\\t\\t\\tresult = fn.apply(this,arguments);\\n\\t\\t\\tif(!(name in self.measures)) {\\n\\t\\t\\t\\tself.measures[name] = {time: 0, invocations: 0};\\n\\t\\t\\t}\\n\\t\\t\\tself.measures[name].time += $tw.utils.timer(startTime);\\n\\t\\t\\tself.measures[name].invocations++;\\n\\t\\t\\treturn result;\\n\\t\\t};\\n\\t} else {\\n\\t\\treturn fn;\\n\\t}\\n};\\n\\nexports.Performance = Performance;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"global\"},\"$:/core/modules/utils/pluginmaker.js\":{\"title\":\"$:/core/modules/utils/pluginmaker.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/utils/pluginmaker.js\\ntype: application/javascript\\nmodule-type: utils\\n\\nA quick and dirty way to pack up plugins within the browser.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nRepack a plugin, and then delete any non-shadow payload tiddlers\\n*/\\nexports.repackPlugin = function(title,additionalTiddlers,excludeTiddlers) {\\n\\tadditionalTiddlers = additionalTiddlers || [];\\n\\texcludeTiddlers = excludeTiddlers || [];\\n\\t// Get the plugin tiddler\\n\\tvar pluginTiddler = $tw.wiki.getTiddler(title);\\n\\tif(!pluginTiddler) {\\n\\t\\tthrow \\\"No such tiddler as \\\" + title;\\n\\t}\\n\\t// Extract the JSON\\n\\tvar jsonPluginTiddler = $tw.utils.parseJSONSafe(pluginTiddler.fields.text,null);\\n\\tif(!jsonPluginTiddler) {\\n\\t\\tthrow \\\"Cannot parse plugin tiddler \\\" + title + \\\"\\\\n\\\" + $tw.language.getString(\\\"Error/Caption\\\") + \\\": \\\" + e;\\n\\t}\\n\\t// Get the list of tiddlers\\n\\tvar tiddlers = Object.keys(jsonPluginTiddler.tiddlers);\\n\\t// Add the additional tiddlers\\n\\t$tw.utils.pushTop(tiddlers,additionalTiddlers);\\n\\t// Remove any excluded tiddlers\\n\\tfor(var t=tiddlers.length-1; t>=0; t--) {\\n\\t\\tif(excludeTiddlers.indexOf(tiddlers[t]) !== -1) {\\n\\t\\t\\ttiddlers.splice(t,1);\\n\\t\\t}\\n\\t}\\n\\t// Pack up the tiddlers into a block of JSON\\n\\tvar plugins = {};\\n\\t$tw.utils.each(tiddlers,function(title) {\\n\\t\\tvar tiddler = $tw.wiki.getTiddler(title),\\n\\t\\t\\tfields = {};\\n\\t\\t$tw.utils.each(tiddler.fields,function (value,name) {\\n\\t\\t\\tfields[name] = tiddler.getFieldString(name);\\n\\t\\t});\\n\\t\\tplugins[title] = fields;\\n\\t});\\n\\t// Retrieve and bump the version number\\n\\tvar pluginVersion = $tw.utils.parseVersion(pluginTiddler.getFieldString(\\\"version\\\") || \\\"0.0.0\\\") || {\\n\\t\\t\\tmajor: \\\"0\\\",\\n\\t\\t\\tminor: \\\"0\\\",\\n\\t\\t\\tpatch: \\\"0\\\"\\n\\t\\t};\\n\\tpluginVersion.patch++;\\n\\tvar version = pluginVersion.major + \\\".\\\" + pluginVersion.minor + \\\".\\\" + pluginVersion.patch;\\n\\tif(pluginVersion.prerelease) {\\n\\t\\tversion += \\\"-\\\" + pluginVersion.prerelease;\\n\\t}\\n\\tif(pluginVersion.build) {\\n\\t\\tversion += \\\"+\\\" + pluginVersion.build;\\n\\t}\\n\\t// Save the tiddler\\n\\t$tw.wiki.addTiddler(new $tw.Tiddler(pluginTiddler,{text: JSON.stringify({tiddlers: plugins},null,4), version: version}));\\n\\t// Delete any non-shadow constituent tiddlers\\n\\t$tw.utils.each(tiddlers,function(title) {\\n\\t\\tif($tw.wiki.tiddlerExists(title)) {\\n\\t\\t\\t$tw.wiki.deleteTiddler(title);\\n\\t\\t}\\n\\t});\\n\\t// Trigger an autosave\\n\\t$tw.rootWidget.dispatchEvent({type: \\\"tm-auto-save-wiki\\\"});\\n\\t// Return a heartwarming confirmation\\n\\treturn \\\"Plugin \\\" + title + \\\" successfully saved\\\";\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"utils\"},\"$:/core/modules/utils/transliterate.js\":{\"title\":\"$:/core/modules/utils/transliterate.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/utils/transliterate.js\\ntype: application/javascript\\nmodule-type: utils\\n\\nTransliteration static utility functions.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nTransliterate string to ASCII\\n\\n(Some pairs taken from http://semplicewebsites.com/removing-accents-javascript)\\n*/\\nexports.transliterationPairs = {\\n\\t\\\"Á\\\":\\\"A\\\",\\n\\t\\\"Ă\\\":\\\"A\\\",\\n\\t\\\"Ắ\\\":\\\"A\\\",\\n\\t\\\"Ặ\\\":\\\"A\\\",\\n\\t\\\"Ằ\\\":\\\"A\\\",\\n\\t\\\"Ẳ\\\":\\\"A\\\",\\n\\t\\\"Ẵ\\\":\\\"A\\\",\\n\\t\\\"Ǎ\\\":\\\"A\\\",\\n\\t\\\"Â\\\":\\\"A\\\",\\n\\t\\\"Ấ\\\":\\\"A\\\",\\n\\t\\\"Ậ\\\":\\\"A\\\",\\n\\t\\\"Ầ\\\":\\\"A\\\",\\n\\t\\\"Ẩ\\\":\\\"A\\\",\\n\\t\\\"Ẫ\\\":\\\"A\\\",\\n\\t\\\"Ä\\\":\\\"A\\\",\\n\\t\\\"Ǟ\\\":\\\"A\\\",\\n\\t\\\"Ȧ\\\":\\\"A\\\",\\n\\t\\\"Ǡ\\\":\\\"A\\\",\\n\\t\\\"Ạ\\\":\\\"A\\\",\\n\\t\\\"Ȁ\\\":\\\"A\\\",\\n\\t\\\"À\\\":\\\"A\\\",\\n\\t\\\"Ả\\\":\\\"A\\\",\\n\\t\\\"Ȃ\\\":\\\"A\\\",\\n\\t\\\"Ā\\\":\\\"A\\\",\\n\\t\\\"Ą\\\":\\\"A\\\",\\n\\t\\\"Å\\\":\\\"A\\\",\\n\\t\\\"Ǻ\\\":\\\"A\\\",\\n\\t\\\"Ḁ\\\":\\\"A\\\",\\n\\t\\\"Ⱥ\\\":\\\"A\\\",\\n\\t\\\"Ã\\\":\\\"A\\\",\\n\\t\\\"Ꜳ\\\":\\\"AA\\\",\\n\\t\\\"Æ\\\":\\\"AE\\\",\\n\\t\\\"Ǽ\\\":\\\"AE\\\",\\n\\t\\\"Ǣ\\\":\\\"AE\\\",\\n\\t\\\"Ꜵ\\\":\\\"AO\\\",\\n\\t\\\"Ꜷ\\\":\\\"AU\\\",\\n\\t\\\"Ꜹ\\\":\\\"AV\\\",\\n\\t\\\"Ꜻ\\\":\\\"AV\\\",\\n\\t\\\"Ꜽ\\\":\\\"AY\\\",\\n\\t\\\"Ḃ\\\":\\\"B\\\",\\n\\t\\\"Ḅ\\\":\\\"B\\\",\\n\\t\\\"Ɓ\\\":\\\"B\\\",\\n\\t\\\"Ḇ\\\":\\\"B\\\",\\n\\t\\\"Ƀ\\\":\\\"B\\\",\\n\\t\\\"Ƃ\\\":\\\"B\\\",\\n\\t\\\"Ć\\\":\\\"C\\\",\\n\\t\\\"Č\\\":\\\"C\\\",\\n\\t\\\"Ç\\\":\\\"C\\\",\\n\\t\\\"Ḉ\\\":\\\"C\\\",\\n\\t\\\"Ĉ\\\":\\\"C\\\",\\n\\t\\\"Ċ\\\":\\\"C\\\",\\n\\t\\\"Ƈ\\\":\\\"C\\\",\\n\\t\\\"Ȼ\\\":\\\"C\\\",\\n\\t\\\"Ď\\\":\\\"D\\\",\\n\\t\\\"Ḑ\\\":\\\"D\\\",\\n\\t\\\"Ḓ\\\":\\\"D\\\",\\n\\t\\\"Ḋ\\\":\\\"D\\\",\\n\\t\\\"Ḍ\\\":\\\"D\\\",\\n\\t\\\"Ɗ\\\":\\\"D\\\",\\n\\t\\\"Ḏ\\\":\\\"D\\\",\\n\\t\\\"Dz\\\":\\\"D\\\",\\n\\t\\\"Dž\\\":\\\"D\\\",\\n\\t\\\"Đ\\\":\\\"D\\\",\\n\\t\\\"Ƌ\\\":\\\"D\\\",\\n\\t\\\"DZ\\\":\\\"DZ\\\",\\n\\t\\\"DŽ\\\":\\\"DZ\\\",\\n\\t\\\"É\\\":\\\"E\\\",\\n\\t\\\"Ĕ\\\":\\\"E\\\",\\n\\t\\\"Ě\\\":\\\"E\\\",\\n\\t\\\"Ȩ\\\":\\\"E\\\",\\n\\t\\\"Ḝ\\\":\\\"E\\\",\\n\\t\\\"Ê\\\":\\\"E\\\",\\n\\t\\\"Ế\\\":\\\"E\\\",\\n\\t\\\"Ệ\\\":\\\"E\\\",\\n\\t\\\"Ề\\\":\\\"E\\\",\\n\\t\\\"Ể\\\":\\\"E\\\",\\n\\t\\\"Ễ\\\":\\\"E\\\",\\n\\t\\\"Ḙ\\\":\\\"E\\\",\\n\\t\\\"Ë\\\":\\\"E\\\",\\n\\t\\\"Ė\\\":\\\"E\\\",\\n\\t\\\"Ẹ\\\":\\\"E\\\",\\n\\t\\\"Ȅ\\\":\\\"E\\\",\\n\\t\\\"È\\\":\\\"E\\\",\\n\\t\\\"Ẻ\\\":\\\"E\\\",\\n\\t\\\"Ȇ\\\":\\\"E\\\",\\n\\t\\\"Ē\\\":\\\"E\\\",\\n\\t\\\"Ḗ\\\":\\\"E\\\",\\n\\t\\\"Ḕ\\\":\\\"E\\\",\\n\\t\\\"Ę\\\":\\\"E\\\",\\n\\t\\\"Ɇ\\\":\\\"E\\\",\\n\\t\\\"Ẽ\\\":\\\"E\\\",\\n\\t\\\"Ḛ\\\":\\\"E\\\",\\n\\t\\\"Ꝫ\\\":\\\"ET\\\",\\n\\t\\\"Ḟ\\\":\\\"F\\\",\\n\\t\\\"Ƒ\\\":\\\"F\\\",\\n\\t\\\"Ǵ\\\":\\\"G\\\",\\n\\t\\\"Ğ\\\":\\\"G\\\",\\n\\t\\\"Ǧ\\\":\\\"G\\\",\\n\\t\\\"Ģ\\\":\\\"G\\\",\\n\\t\\\"Ĝ\\\":\\\"G\\\",\\n\\t\\\"Ġ\\\":\\\"G\\\",\\n\\t\\\"Ɠ\\\":\\\"G\\\",\\n\\t\\\"Ḡ\\\":\\\"G\\\",\\n\\t\\\"Ǥ\\\":\\\"G\\\",\\n\\t\\\"Ḫ\\\":\\\"H\\\",\\n\\t\\\"Ȟ\\\":\\\"H\\\",\\n\\t\\\"Ḩ\\\":\\\"H\\\",\\n\\t\\\"Ĥ\\\":\\\"H\\\",\\n\\t\\\"Ⱨ\\\":\\\"H\\\",\\n\\t\\\"Ḧ\\\":\\\"H\\\",\\n\\t\\\"Ḣ\\\":\\\"H\\\",\\n\\t\\\"Ḥ\\\":\\\"H\\\",\\n\\t\\\"Ħ\\\":\\\"H\\\",\\n\\t\\\"Í\\\":\\\"I\\\",\\n\\t\\\"Ĭ\\\":\\\"I\\\",\\n\\t\\\"Ǐ\\\":\\\"I\\\",\\n\\t\\\"Î\\\":\\\"I\\\",\\n\\t\\\"Ï\\\":\\\"I\\\",\\n\\t\\\"Ḯ\\\":\\\"I\\\",\\n\\t\\\"İ\\\":\\\"I\\\",\\n\\t\\\"Ị\\\":\\\"I\\\",\\n\\t\\\"Ȉ\\\":\\\"I\\\",\\n\\t\\\"Ì\\\":\\\"I\\\",\\n\\t\\\"Ỉ\\\":\\\"I\\\",\\n\\t\\\"Ȋ\\\":\\\"I\\\",\\n\\t\\\"Ī\\\":\\\"I\\\",\\n\\t\\\"Į\\\":\\\"I\\\",\\n\\t\\\"Ɨ\\\":\\\"I\\\",\\n\\t\\\"Ĩ\\\":\\\"I\\\",\\n\\t\\\"Ḭ\\\":\\\"I\\\",\\n\\t\\\"Ꝺ\\\":\\\"D\\\",\\n\\t\\\"Ꝼ\\\":\\\"F\\\",\\n\\t\\\"Ᵹ\\\":\\\"G\\\",\\n\\t\\\"Ꞃ\\\":\\\"R\\\",\\n\\t\\\"Ꞅ\\\":\\\"S\\\",\\n\\t\\\"Ꞇ\\\":\\\"T\\\",\\n\\t\\\"Ꝭ\\\":\\\"IS\\\",\\n\\t\\\"Ĵ\\\":\\\"J\\\",\\n\\t\\\"Ɉ\\\":\\\"J\\\",\\n\\t\\\"Ḱ\\\":\\\"K\\\",\\n\\t\\\"Ǩ\\\":\\\"K\\\",\\n\\t\\\"Ķ\\\":\\\"K\\\",\\n\\t\\\"Ⱪ\\\":\\\"K\\\",\\n\\t\\\"Ꝃ\\\":\\\"K\\\",\\n\\t\\\"Ḳ\\\":\\\"K\\\",\\n\\t\\\"Ƙ\\\":\\\"K\\\",\\n\\t\\\"Ḵ\\\":\\\"K\\\",\\n\\t\\\"Ꝁ\\\":\\\"K\\\",\\n\\t\\\"Ꝅ\\\":\\\"K\\\",\\n\\t\\\"Ĺ\\\":\\\"L\\\",\\n\\t\\\"Ƚ\\\":\\\"L\\\",\\n\\t\\\"Ľ\\\":\\\"L\\\",\\n\\t\\\"Ļ\\\":\\\"L\\\",\\n\\t\\\"Ḽ\\\":\\\"L\\\",\\n\\t\\\"Ḷ\\\":\\\"L\\\",\\n\\t\\\"Ḹ\\\":\\\"L\\\",\\n\\t\\\"Ⱡ\\\":\\\"L\\\",\\n\\t\\\"Ꝉ\\\":\\\"L\\\",\\n\\t\\\"Ḻ\\\":\\\"L\\\",\\n\\t\\\"Ŀ\\\":\\\"L\\\",\\n\\t\\\"Ɫ\\\":\\\"L\\\",\\n\\t\\\"Lj\\\":\\\"L\\\",\\n\\t\\\"Ł\\\":\\\"L\\\",\\n\\t\\\"LJ\\\":\\\"LJ\\\",\\n\\t\\\"Ḿ\\\":\\\"M\\\",\\n\\t\\\"Ṁ\\\":\\\"M\\\",\\n\\t\\\"Ṃ\\\":\\\"M\\\",\\n\\t\\\"Ɱ\\\":\\\"M\\\",\\n\\t\\\"Ń\\\":\\\"N\\\",\\n\\t\\\"Ň\\\":\\\"N\\\",\\n\\t\\\"Ņ\\\":\\\"N\\\",\\n\\t\\\"Ṋ\\\":\\\"N\\\",\\n\\t\\\"Ṅ\\\":\\\"N\\\",\\n\\t\\\"Ṇ\\\":\\\"N\\\",\\n\\t\\\"Ǹ\\\":\\\"N\\\",\\n\\t\\\"Ɲ\\\":\\\"N\\\",\\n\\t\\\"Ṉ\\\":\\\"N\\\",\\n\\t\\\"Ƞ\\\":\\\"N\\\",\\n\\t\\\"Nj\\\":\\\"N\\\",\\n\\t\\\"Ñ\\\":\\\"N\\\",\\n\\t\\\"NJ\\\":\\\"NJ\\\",\\n\\t\\\"ð\\\":\\\"d\\\",\\n\\t\\\"Ð\\\":\\\"D\\\",\\n\\t\\\"Ó\\\":\\\"O\\\",\\n\\t\\\"Ŏ\\\":\\\"O\\\",\\n\\t\\\"Ǒ\\\":\\\"O\\\",\\n\\t\\\"Ô\\\":\\\"O\\\",\\n\\t\\\"Ố\\\":\\\"O\\\",\\n\\t\\\"Ộ\\\":\\\"O\\\",\\n\\t\\\"Ồ\\\":\\\"O\\\",\\n\\t\\\"Ổ\\\":\\\"O\\\",\\n\\t\\\"Ỗ\\\":\\\"O\\\",\\n\\t\\\"Ö\\\":\\\"O\\\",\\n\\t\\\"Ȫ\\\":\\\"O\\\",\\n\\t\\\"Ȯ\\\":\\\"O\\\",\\n\\t\\\"Ȱ\\\":\\\"O\\\",\\n\\t\\\"Ọ\\\":\\\"O\\\",\\n\\t\\\"Ő\\\":\\\"O\\\",\\n\\t\\\"Ȍ\\\":\\\"O\\\",\\n\\t\\\"Ò\\\":\\\"O\\\",\\n\\t\\\"Ỏ\\\":\\\"O\\\",\\n\\t\\\"Ơ\\\":\\\"O\\\",\\n\\t\\\"Ớ\\\":\\\"O\\\",\\n\\t\\\"Ợ\\\":\\\"O\\\",\\n\\t\\\"Ờ\\\":\\\"O\\\",\\n\\t\\\"Ở\\\":\\\"O\\\",\\n\\t\\\"Ỡ\\\":\\\"O\\\",\\n\\t\\\"Ȏ\\\":\\\"O\\\",\\n\\t\\\"Ꝋ\\\":\\\"O\\\",\\n\\t\\\"Ꝍ\\\":\\\"O\\\",\\n\\t\\\"Ō\\\":\\\"O\\\",\\n\\t\\\"Ṓ\\\":\\\"O\\\",\\n\\t\\\"Ṑ\\\":\\\"O\\\",\\n\\t\\\"Ɵ\\\":\\\"O\\\",\\n\\t\\\"Ǫ\\\":\\\"O\\\",\\n\\t\\\"Ǭ\\\":\\\"O\\\",\\n\\t\\\"Ø\\\":\\\"O\\\",\\n\\t\\\"Ǿ\\\":\\\"O\\\",\\n\\t\\\"Õ\\\":\\\"O\\\",\\n\\t\\\"Ṍ\\\":\\\"O\\\",\\n\\t\\\"Ṏ\\\":\\\"O\\\",\\n\\t\\\"Ȭ\\\":\\\"O\\\",\\n\\t\\\"Ƣ\\\":\\\"OI\\\",\\n\\t\\\"Ꝏ\\\":\\\"OO\\\",\\n\\t\\\"Ɛ\\\":\\\"E\\\",\\n\\t\\\"Ɔ\\\":\\\"O\\\",\\n\\t\\\"Ȣ\\\":\\\"OU\\\",\\n\\t\\\"Ṕ\\\":\\\"P\\\",\\n\\t\\\"Ṗ\\\":\\\"P\\\",\\n\\t\\\"Ꝓ\\\":\\\"P\\\",\\n\\t\\\"Ƥ\\\":\\\"P\\\",\\n\\t\\\"Ꝕ\\\":\\\"P\\\",\\n\\t\\\"Ᵽ\\\":\\\"P\\\",\\n\\t\\\"Ꝑ\\\":\\\"P\\\",\\n\\t\\\"Ꝙ\\\":\\\"Q\\\",\\n\\t\\\"Ꝗ\\\":\\\"Q\\\",\\n\\t\\\"Ŕ\\\":\\\"R\\\",\\n\\t\\\"Ř\\\":\\\"R\\\",\\n\\t\\\"Ŗ\\\":\\\"R\\\",\\n\\t\\\"Ṙ\\\":\\\"R\\\",\\n\\t\\\"Ṛ\\\":\\\"R\\\",\\n\\t\\\"Ṝ\\\":\\\"R\\\",\\n\\t\\\"Ȑ\\\":\\\"R\\\",\\n\\t\\\"Ȓ\\\":\\\"R\\\",\\n\\t\\\"Ṟ\\\":\\\"R\\\",\\n\\t\\\"Ɍ\\\":\\\"R\\\",\\n\\t\\\"Ɽ\\\":\\\"R\\\",\\n\\t\\\"Ꜿ\\\":\\\"C\\\",\\n\\t\\\"Ǝ\\\":\\\"E\\\",\\n\\t\\\"ß\\\":\\\"ss\\\",\\n\\t\\\"ẞ\\\":\\\"SS\\\",\\n\\t\\\"Ś\\\":\\\"S\\\",\\n\\t\\\"Ṥ\\\":\\\"S\\\",\\n\\t\\\"Š\\\":\\\"S\\\",\\n\\t\\\"Ṧ\\\":\\\"S\\\",\\n\\t\\\"Ş\\\":\\\"S\\\",\\n\\t\\\"Ŝ\\\":\\\"S\\\",\\n\\t\\\"Ș\\\":\\\"S\\\",\\n\\t\\\"Ṡ\\\":\\\"S\\\",\\n\\t\\\"Ṣ\\\":\\\"S\\\",\\n\\t\\\"Ṩ\\\":\\\"S\\\",\\n\\t\\\"þ\\\": \\\"th\\\",\\n\\t\\\"Þ\\\": \\\"TH\\\",\\n\\t\\\"Ť\\\":\\\"T\\\",\\n\\t\\\"Ţ\\\":\\\"T\\\",\\n\\t\\\"Ṱ\\\":\\\"T\\\",\\n\\t\\\"Ț\\\":\\\"T\\\",\\n\\t\\\"Ⱦ\\\":\\\"T\\\",\\n\\t\\\"Ṫ\\\":\\\"T\\\",\\n\\t\\\"Ṭ\\\":\\\"T\\\",\\n\\t\\\"Ƭ\\\":\\\"T\\\",\\n\\t\\\"Ṯ\\\":\\\"T\\\",\\n\\t\\\"Ʈ\\\":\\\"T\\\",\\n\\t\\\"Ŧ\\\":\\\"T\\\",\\n\\t\\\"Ɐ\\\":\\\"A\\\",\\n\\t\\\"Ꞁ\\\":\\\"L\\\",\\n\\t\\\"Ɯ\\\":\\\"M\\\",\\n\\t\\\"Ʌ\\\":\\\"V\\\",\\n\\t\\\"Ꜩ\\\":\\\"TZ\\\",\\n\\t\\\"Ú\\\":\\\"U\\\",\\n\\t\\\"Ŭ\\\":\\\"U\\\",\\n\\t\\\"Ǔ\\\":\\\"U\\\",\\n\\t\\\"Û\\\":\\\"U\\\",\\n\\t\\\"Ṷ\\\":\\\"U\\\",\\n\\t\\\"Ü\\\":\\\"U\\\",\\n\\t\\\"Ǘ\\\":\\\"U\\\",\\n\\t\\\"Ǚ\\\":\\\"U\\\",\\n\\t\\\"Ǜ\\\":\\\"U\\\",\\n\\t\\\"Ǖ\\\":\\\"U\\\",\\n\\t\\\"Ṳ\\\":\\\"U\\\",\\n\\t\\\"Ụ\\\":\\\"U\\\",\\n\\t\\\"Ű\\\":\\\"U\\\",\\n\\t\\\"Ȕ\\\":\\\"U\\\",\\n\\t\\\"Ù\\\":\\\"U\\\",\\n\\t\\\"Ủ\\\":\\\"U\\\",\\n\\t\\\"Ư\\\":\\\"U\\\",\\n\\t\\\"Ứ\\\":\\\"U\\\",\\n\\t\\\"Ự\\\":\\\"U\\\",\\n\\t\\\"Ừ\\\":\\\"U\\\",\\n\\t\\\"Ử\\\":\\\"U\\\",\\n\\t\\\"Ữ\\\":\\\"U\\\",\\n\\t\\\"Ȗ\\\":\\\"U\\\",\\n\\t\\\"Ū\\\":\\\"U\\\",\\n\\t\\\"Ṻ\\\":\\\"U\\\",\\n\\t\\\"Ų\\\":\\\"U\\\",\\n\\t\\\"Ů\\\":\\\"U\\\",\\n\\t\\\"Ũ\\\":\\\"U\\\",\\n\\t\\\"Ṹ\\\":\\\"U\\\",\\n\\t\\\"Ṵ\\\":\\\"U\\\",\\n\\t\\\"Ꝟ\\\":\\\"V\\\",\\n\\t\\\"Ṿ\\\":\\\"V\\\",\\n\\t\\\"Ʋ\\\":\\\"V\\\",\\n\\t\\\"Ṽ\\\":\\\"V\\\",\\n\\t\\\"Ꝡ\\\":\\\"VY\\\",\\n\\t\\\"Ẃ\\\":\\\"W\\\",\\n\\t\\\"Ŵ\\\":\\\"W\\\",\\n\\t\\\"Ẅ\\\":\\\"W\\\",\\n\\t\\\"Ẇ\\\":\\\"W\\\",\\n\\t\\\"Ẉ\\\":\\\"W\\\",\\n\\t\\\"Ẁ\\\":\\\"W\\\",\\n\\t\\\"Ⱳ\\\":\\\"W\\\",\\n\\t\\\"Ẍ\\\":\\\"X\\\",\\n\\t\\\"Ẋ\\\":\\\"X\\\",\\n\\t\\\"Ý\\\":\\\"Y\\\",\\n\\t\\\"Ŷ\\\":\\\"Y\\\",\\n\\t\\\"Ÿ\\\":\\\"Y\\\",\\n\\t\\\"Ẏ\\\":\\\"Y\\\",\\n\\t\\\"Ỵ\\\":\\\"Y\\\",\\n\\t\\\"Ỳ\\\":\\\"Y\\\",\\n\\t\\\"Ƴ\\\":\\\"Y\\\",\\n\\t\\\"Ỷ\\\":\\\"Y\\\",\\n\\t\\\"Ỿ\\\":\\\"Y\\\",\\n\\t\\\"Ȳ\\\":\\\"Y\\\",\\n\\t\\\"Ɏ\\\":\\\"Y\\\",\\n\\t\\\"Ỹ\\\":\\\"Y\\\",\\n\\t\\\"Ź\\\":\\\"Z\\\",\\n\\t\\\"Ž\\\":\\\"Z\\\",\\n\\t\\\"Ẑ\\\":\\\"Z\\\",\\n\\t\\\"Ⱬ\\\":\\\"Z\\\",\\n\\t\\\"Ż\\\":\\\"Z\\\",\\n\\t\\\"Ẓ\\\":\\\"Z\\\",\\n\\t\\\"Ȥ\\\":\\\"Z\\\",\\n\\t\\\"Ẕ\\\":\\\"Z\\\",\\n\\t\\\"Ƶ\\\":\\\"Z\\\",\\n\\t\\\"IJ\\\":\\\"IJ\\\",\\n\\t\\\"Œ\\\":\\\"OE\\\",\\n\\t\\\"ᴀ\\\":\\\"A\\\",\\n\\t\\\"ᴁ\\\":\\\"AE\\\",\\n\\t\\\"ʙ\\\":\\\"B\\\",\\n\\t\\\"ᴃ\\\":\\\"B\\\",\\n\\t\\\"ᴄ\\\":\\\"C\\\",\\n\\t\\\"ᴅ\\\":\\\"D\\\",\\n\\t\\\"ᴇ\\\":\\\"E\\\",\\n\\t\\\"ꜰ\\\":\\\"F\\\",\\n\\t\\\"ɢ\\\":\\\"G\\\",\\n\\t\\\"ʛ\\\":\\\"G\\\",\\n\\t\\\"ʜ\\\":\\\"H\\\",\\n\\t\\\"ɪ\\\":\\\"I\\\",\\n\\t\\\"ʁ\\\":\\\"R\\\",\\n\\t\\\"ᴊ\\\":\\\"J\\\",\\n\\t\\\"ᴋ\\\":\\\"K\\\",\\n\\t\\\"ʟ\\\":\\\"L\\\",\\n\\t\\\"ᴌ\\\":\\\"L\\\",\\n\\t\\\"ᴍ\\\":\\\"M\\\",\\n\\t\\\"ɴ\\\":\\\"N\\\",\\n\\t\\\"ᴏ\\\":\\\"O\\\",\\n\\t\\\"ɶ\\\":\\\"OE\\\",\\n\\t\\\"ᴐ\\\":\\\"O\\\",\\n\\t\\\"ᴕ\\\":\\\"OU\\\",\\n\\t\\\"ᴘ\\\":\\\"P\\\",\\n\\t\\\"ʀ\\\":\\\"R\\\",\\n\\t\\\"ᴎ\\\":\\\"N\\\",\\n\\t\\\"ᴙ\\\":\\\"R\\\",\\n\\t\\\"ꜱ\\\":\\\"S\\\",\\n\\t\\\"ᴛ\\\":\\\"T\\\",\\n\\t\\\"ⱻ\\\":\\\"E\\\",\\n\\t\\\"ᴚ\\\":\\\"R\\\",\\n\\t\\\"ᴜ\\\":\\\"U\\\",\\n\\t\\\"ᴠ\\\":\\\"V\\\",\\n\\t\\\"ᴡ\\\":\\\"W\\\",\\n\\t\\\"ʏ\\\":\\\"Y\\\",\\n\\t\\\"ᴢ\\\":\\\"Z\\\",\\n\\t\\\"á\\\":\\\"a\\\",\\n\\t\\\"ă\\\":\\\"a\\\",\\n\\t\\\"ắ\\\":\\\"a\\\",\\n\\t\\\"ặ\\\":\\\"a\\\",\\n\\t\\\"ằ\\\":\\\"a\\\",\\n\\t\\\"ẳ\\\":\\\"a\\\",\\n\\t\\\"ẵ\\\":\\\"a\\\",\\n\\t\\\"ǎ\\\":\\\"a\\\",\\n\\t\\\"â\\\":\\\"a\\\",\\n\\t\\\"ấ\\\":\\\"a\\\",\\n\\t\\\"ậ\\\":\\\"a\\\",\\n\\t\\\"ầ\\\":\\\"a\\\",\\n\\t\\\"ẩ\\\":\\\"a\\\",\\n\\t\\\"ẫ\\\":\\\"a\\\",\\n\\t\\\"ä\\\":\\\"a\\\",\\n\\t\\\"ǟ\\\":\\\"a\\\",\\n\\t\\\"ȧ\\\":\\\"a\\\",\\n\\t\\\"ǡ\\\":\\\"a\\\",\\n\\t\\\"ạ\\\":\\\"a\\\",\\n\\t\\\"ȁ\\\":\\\"a\\\",\\n\\t\\\"à\\\":\\\"a\\\",\\n\\t\\\"ả\\\":\\\"a\\\",\\n\\t\\\"ȃ\\\":\\\"a\\\",\\n\\t\\\"ā\\\":\\\"a\\\",\\n\\t\\\"ą\\\":\\\"a\\\",\\n\\t\\\"ᶏ\\\":\\\"a\\\",\\n\\t\\\"ẚ\\\":\\\"a\\\",\\n\\t\\\"å\\\":\\\"a\\\",\\n\\t\\\"ǻ\\\":\\\"a\\\",\\n\\t\\\"ḁ\\\":\\\"a\\\",\\n\\t\\\"ⱥ\\\":\\\"a\\\",\\n\\t\\\"ã\\\":\\\"a\\\",\\n\\t\\\"ꜳ\\\":\\\"aa\\\",\\n\\t\\\"æ\\\":\\\"ae\\\",\\n\\t\\\"ǽ\\\":\\\"ae\\\",\\n\\t\\\"ǣ\\\":\\\"ae\\\",\\n\\t\\\"ꜵ\\\":\\\"ao\\\",\\n\\t\\\"ꜷ\\\":\\\"au\\\",\\n\\t\\\"ꜹ\\\":\\\"av\\\",\\n\\t\\\"ꜻ\\\":\\\"av\\\",\\n\\t\\\"ꜽ\\\":\\\"ay\\\",\\n\\t\\\"ḃ\\\":\\\"b\\\",\\n\\t\\\"ḅ\\\":\\\"b\\\",\\n\\t\\\"ɓ\\\":\\\"b\\\",\\n\\t\\\"ḇ\\\":\\\"b\\\",\\n\\t\\\"ᵬ\\\":\\\"b\\\",\\n\\t\\\"ᶀ\\\":\\\"b\\\",\\n\\t\\\"ƀ\\\":\\\"b\\\",\\n\\t\\\"ƃ\\\":\\\"b\\\",\\n\\t\\\"ɵ\\\":\\\"o\\\",\\n\\t\\\"ć\\\":\\\"c\\\",\\n\\t\\\"č\\\":\\\"c\\\",\\n\\t\\\"ç\\\":\\\"c\\\",\\n\\t\\\"ḉ\\\":\\\"c\\\",\\n\\t\\\"ĉ
2731\\\":\\\"c\\\",\\n\\t\\\"ɕ\\\":\\\"c\\\",\\n\\t\\\"ċ\\\":\\\"c\\\",\\n\\t\\\"ƈ\\\":\\\"c\\\",\\n\\t\\\"ȼ\\\":\\\"c\\\",\\n\\t\\\"ď\\\":\\\"d\\\",\\n\\t\\\"ḑ\\\":\\\"d\\\",\\n\\t\\\"ḓ\\\":\\\"d\\\",\\n\\t\\\"È¡\\\":\\\"d\\\",\\n\\t\\\"ḋ\\\":\\\"d\\\",\\n\\t\\\"ḍ\\\":\\\"d\\\",\\n\\t\\\"ɗ\\\":\\\"d\\\",\\n\\t\\\"ᶑ\\\":\\\"d\\\",\\n\\t\\\"ḏ\\\":\\\"d\\\",\\n\\t\\\"áµ­\\\":\\\"d\\\",\\n\\t\\\"ᶁ\\\":\\\"d\\\",\\n\\t\\\"đ\\\":\\\"d\\\",\\n\\t\\\"ɖ\\\":\\\"d\\\",\\n\\t\\\"ƌ\\\":\\\"d\\\",\\n\\t\\\"ı\\\":\\\"i\\\",\\n\\t\\\"È·\\\":\\\"j\\\",\\n\\t\\\"ɟ\\\":\\\"j\\\",\\n\\t\\\"ʄ\\\":\\\"j\\\",\\n\\t\\\"dz\\\":\\\"dz\\\",\\n\\t\\\"dž\\\":\\\"dz\\\",\\n\\t\\\"é\\\":\\\"e\\\",\\n\\t\\\"ĕ\\\":\\\"e\\\",\\n\\t\\\"ě\\\":\\\"e\\\",\\n\\t\\\"È©\\\":\\\"e\\\",\\n\\t\\\"ḝ\\\":\\\"e\\\",\\n\\t\\\"ê\\\":\\\"e\\\",\\n\\t\\\"ế\\\":\\\"e\\\",\\n\\t\\\"ệ\\\":\\\"e\\\",\\n\\t\\\"ề\\\":\\\"e\\\",\\n\\t\\\"ể\\\":\\\"e\\\",\\n\\t\\\"ễ\\\":\\\"e\\\",\\n\\t\\\"ḙ\\\":\\\"e\\\",\\n\\t\\\"ë\\\":\\\"e\\\",\\n\\t\\\"ė\\\":\\\"e\\\",\\n\\t\\\"ẹ\\\":\\\"e\\\",\\n\\t\\\"ȅ\\\":\\\"e\\\",\\n\\t\\\"è\\\":\\\"e\\\",\\n\\t\\\"ẻ\\\":\\\"e\\\",\\n\\t\\\"ȇ\\\":\\\"e\\\",\\n\\t\\\"ē\\\":\\\"e\\\",\\n\\t\\\"ḗ\\\":\\\"e\\\",\\n\\t\\\"ḕ\\\":\\\"e\\\",\\n\\t\\\"ⱸ\\\":\\\"e\\\",\\n\\t\\\"ę\\\":\\\"e\\\",\\n\\t\\\"ᶒ\\\":\\\"e\\\",\\n\\t\\\"ɇ\\\":\\\"e\\\",\\n\\t\\\"ẽ\\\":\\\"e\\\",\\n\\t\\\"ḛ\\\":\\\"e\\\",\\n\\t\\\"ꝫ\\\":\\\"et\\\",\\n\\t\\\"ḟ\\\":\\\"f\\\",\\n\\t\\\"ƒ\\\":\\\"f\\\",\\n\\t\\\"áµ®\\\":\\\"f\\\",\\n\\t\\\"ᶂ\\\":\\\"f\\\",\\n\\t\\\"ǵ\\\":\\\"g\\\",\\n\\t\\\"ğ\\\":\\\"g\\\",\\n\\t\\\"ǧ\\\":\\\"g\\\",\\n\\t\\\"Ä£\\\":\\\"g\\\",\\n\\t\\\"ĝ\\\":\\\"g\\\",\\n\\t\\\"Ä¡\\\":\\\"g\\\",\\n\\t\\\"É \\\":\\\"g\\\",\\n\\t\\\"ḡ\\\":\\\"g\\\",\\n\\t\\\"ᶃ\\\":\\\"g\\\",\\n\\t\\\"Ç¥\\\":\\\"g\\\",\\n\\t\\\"ḫ\\\":\\\"h\\\",\\n\\t\\\"ȟ\\\":\\\"h\\\",\\n\\t\\\"ḩ\\\":\\\"h\\\",\\n\\t\\\"Ä¥\\\":\\\"h\\\",\\n\\t\\\"ⱨ\\\":\\\"h\\\",\\n\\t\\\"ḧ\\\":\\\"h\\\",\\n\\t\\\"ḣ\\\":\\\"h\\\",\\n\\t\\\"ḥ\\\":\\\"h\\\",\\n\\t\\\"ɦ\\\":\\\"h\\\",\\n\\t\\\"ẖ\\\":\\\"h\\\",\\n\\t\\\"ħ\\\":\\\"h\\\",\\n\\t\\\"ƕ\\\":\\\"hv\\\",\\n\\t\\\"í\\\":\\\"i\\\",\\n\\t\\\"Ä­\\\":\\\"i\\\",\\n\\t\\\"ǐ\\\":\\\"i\\\",\\n\\t\\\"î\\\":\\\"i\\\",\\n\\t\\\"ï\\\":\\\"i\\\",\\n\\t\\\"ḯ\\\":\\\"i\\\",\\n\\t\\\"ị\\\":\\\"i\\\",\\n\\t\\\"ȉ\\\":\\\"i\\\",\\n\\t\\\"ì\\\":\\\"i\\\",\\n\\t\\\"ỉ\\\":\\\"i\\\",\\n\\t\\\"ȋ\\\":\\\"i\\\",\\n\\t\\\"Ä«\\\":\\\"i\\\",\\n\\t\\\"į\\\":\\\"i\\\",\\n\\t\\\"ᶖ\\\":\\\"i\\\",\\n\\t\\\"ɨ\\\":\\\"i\\\",\\n\\t\\\"Ä©\\\":\\\"i\\\",\\n\\t\\\"ḭ\\\":\\\"i\\\",\\n\\t\\\"ꝺ\\\":\\\"d\\\",\\n\\t\\\"ꝼ\\\":\\\"f\\\",\\n\\t\\\"áµ¹\\\":\\\"g\\\",\\n\\t\\\"ꞃ\\\":\\\"r\\\",\\n\\t\\\"ꞅ\\\":\\\"s\\\",\\n\\t\\\"ꞇ\\\":\\\"t\\\",\\n\\t\\\"ꝭ\\\":\\\"is\\\",\\n\\t\\\"ǰ\\\":\\\"j\\\",\\n\\t\\\"ĵ\\\":\\\"j\\\",\\n\\t\\\"ʝ\\\":\\\"j\\\",\\n\\t\\\"ɉ\\\":\\\"j\\\",\\n\\t\\\"ḱ\\\":\\\"k\\\",\\n\\t\\\"Ç©\\\":\\\"k\\\",\\n\\t\\\"Ä·\\\":\\\"k\\\",\\n\\t\\\"ⱪ\\\":\\\"k\\\",\\n\\t\\\"ꝃ\\\":\\\"k\\\",\\n\\t\\\"ḳ\\\":\\\"k\\\",\\n\\t\\\"ƙ\\\":\\\"k\\\",\\n\\t\\\"ḵ\\\":\\\"k\\\",\\n\\t\\\"ᶄ\\\":\\\"k\\\",\\n\\t\\\"ꝁ\\\":\\\"k\\\",\\n\\t\\\"ꝅ\\\":\\\"k\\\",\\n\\t\\\"ĺ\\\":\\\"l\\\",\\n\\t\\\"ƚ\\\":\\\"l\\\",\\n\\t\\\"ɬ\\\":\\\"l\\\",\\n\\t\\\"ľ\\\":\\\"l\\\",\\n\\t\\\"ļ\\\":\\\"l\\\",\\n\\t\\\"ḽ\\\":\\\"l\\\",\\n\\t\\\"È´\\\":\\\"l\\\",\\n\\t\\\"ḷ\\\":\\\"l\\\",\\n\\t\\\"ḹ\\\":\\\"l\\\",\\n\\t\\\"ⱡ\\\":\\\"l\\\",\\n\\t\\\"ꝉ\\\":\\\"l\\\",\\n\\t\\\"ḻ\\\":\\\"l\\\",\\n\\t\\\"ŀ\\\":\\\"l\\\",\\n\\t\\\"É«\\\":\\\"l\\\",\\n\\t\\\"ᶅ\\\":\\\"l\\\",\\n\\t\\\"É­\\\":\\\"l\\\",\\n\\t\\\"ł\\\":\\\"l\\\",\\n\\t\\\"lj\\\":\\\"lj\\\",\\n\\t\\\"Å¿\\\":\\\"s\\\",\\n\\t\\\"ẜ\\\":\\\"s\\\",\\n\\t\\\"ẛ\\\":\\\"s\\\",\\n\\t\\\"ẝ\\\":\\\"s\\\",\\n\\t\\\"ḿ\\\":\\\"m\\\",\\n\\t\\\"ṁ\\\":\\\"m\\\",\\n\\t\\\"ṃ\\\":\\\"m\\\",\\n\\t\\\"ɱ\\\":\\\"m\\\",\\n\\t\\\"ᵯ\\\":\\\"m\\\",\\n\\t\\\"ᶆ\\\":\\\"m\\\",\\n\\t\\\"ń\\\":\\\"n\\\",\\n\\t\\\"ň\\\":\\\"n\\\",\\n\\t\\\"ņ\\\":\\\"n\\\",\\n\\t\\\"ṋ\\\":\\\"n\\\",\\n\\t\\\"ȵ\\\":\\\"n\\\",\\n\\t\\\"ṅ\\\":\\\"n\\\",\\n\\t\\\"ṇ\\\":\\\"n\\\",\\n\\t\\\"ǹ\\\":\\\"n\\\",\\n\\t\\\"ɲ\\\":\\\"n\\\",\\n\\t\\\"ṉ\\\":\\\"n\\\",\\n\\t\\\"ƞ\\\":\\\"n\\\",\\n\\t\\\"áµ°\\\":\\\"n\\\",\\n\\t\\\"ᶇ\\\":\\\"n\\\",\\n\\t\\\"ɳ\\\":\\\"n\\\",\\n\\t\\\"ñ\\\":\\\"n\\\",\\n\\t\\\"nj\\\":\\\"nj\\\",\\n\\t\\\"ó\\\":\\\"o\\\",\\n\\t\\\"ŏ\\\":\\\"o\\\",\\n\\t\\\"ǒ\\\":\\\"o\\\",\\n\\t\\\"ô\\\":\\\"o\\\",\\n\\t\\\"ố\\\":\\\"o\\\",\\n\\t\\\"ộ\\\":\\\"o\\\",\\n\\t\\\"ồ\\\":\\\"o\\\",\\n\\t\\\"ổ\\\":\\\"o\\\",\\n\\t\\\"ỗ\\\":\\\"o\\\",\\n\\t\\\"ö\\\":\\\"o\\\",\\n\\t\\\"È«\\\":\\\"o\\\",\\n\\t\\\"ȯ\\\":\\\"o\\\",\\n\\t\\\"ȱ\\\":\\\"o\\\",\\n\\t\\\"ọ\\\":\\\"o\\\",\\n\\t\\\"ő\\\":\\\"o\\\",\\n\\t\\\"ȍ\\\":\\\"o\\\",\\n\\t\\\"ò\\\":\\\"o\\\",\\n\\t\\\"ỏ\\\":\\\"o\\\",\\n\\t\\\"Æ¡\\\":\\\"o\\\",\\n\\t\\\"ớ\\\":\\\"o\\\",\\n\\t\\\"ợ\\\":\\\"o\\\",\\n\\t\\\"ờ\\\":\\\"o\\\",\\n\\t\\\"ở\\\":\\\"o\\\",\\n\\t\\\"ỡ\\\":\\\"o\\\",\\n\\t\\\"ȏ\\\":\\\"o\\\",\\n\\t\\\"ꝋ\\\":\\\"o\\\",\\n\\t\\\"ꝍ\\\":\\\"o\\\",\\n\\t\\\"ⱺ\\\":\\\"o\\\",\\n\\t\\\"ō\\\":\\\"o\\\",\\n\\t\\\"ṓ\\\":\\\"o\\\",\\n\\t\\\"ṑ\\\":\\\"o\\\",\\n\\t\\\"Ç«\\\":\\\"o\\\",\\n\\t\\\"Ç­\\\":\\\"o\\\",\\n\\t\\\"ø\\\":\\\"o\\\",\\n\\t\\\"Ç
2731¿\\\":\\\"o\\\",\\n\\t\\\"õ\\\":\\\"o\\\",\\n\\t\\\"ṍ\\\":\\\"o\\\",\\n\\t\\\"ṏ\\\":\\\"o\\\",\\n\\t\\\"È­\\\":\\\"o\\\",\\n\\t\\\"Æ£\\\":\\\"oi\\\",\\n\\t\\\"ꝏ\\\":\\\"oo\\\",\\n\\t\\\"ɛ\\\":\\\"e\\\",\\n\\t\\\"ᶓ\\\":\\\"e\\\",\\n\\t\\\"ɔ\\\":\\\"o\\\",\\n\\t\\\"ᶗ\\\":\\\"o\\\",\\n\\t\\\"È£\\\":\\\"ou\\\",\\n\\t\\\"ṕ\\\":\\\"p\\\",\\n\\t\\\"ṗ\\\":\\\"p\\\",\\n\\t\\\"ꝓ\\\":\\\"p\\\",\\n\\t\\\"Æ¥\\\":\\\"p\\\",\\n\\t\\\"áµ±\\\":\\\"p\\\",\\n\\t\\\"ᶈ\\\":\\\"p\\\",\\n\\t\\\"ꝕ\\\":\\\"p\\\",\\n\\t\\\"áµ½\\\":\\\"p\\\",\\n\\t\\\"ꝑ\\\":\\\"p\\\",\\n\\t\\\"ꝙ\\\":\\\"q\\\",\\n\\t\\\"Ê \\\":\\\"q\\\",\\n\\t\\\"ɋ\\\":\\\"q\\\",\\n\\t\\\"ꝗ\\\":\\\"q\\\",\\n\\t\\\"ŕ\\\":\\\"r\\\",\\n\\t\\\"ř\\\":\\\"r\\\",\\n\\t\\\"ŗ\\\":\\\"r\\\",\\n\\t\\\"ṙ\\\":\\\"r\\\",\\n\\t\\\"ṛ\\\":\\\"r\\\",\\n\\t\\\"ṝ\\\":\\\"r\\\",\\n\\t\\\"ȑ\\\":\\\"r\\\",\\n\\t\\\"ɾ\\\":\\\"r\\\",\\n\\t\\\"áµ³\\\":\\\"r\\\",\\n\\t\\\"ȓ\\\":\\\"r\\\",\\n\\t\\\"ṟ\\\":\\\"r\\\",\\n\\t\\\"ɼ\\\":\\\"r\\\",\\n\\t\\\"áµ²\\\":\\\"r\\\",\\n\\t\\\"ᶉ\\\":\\\"r\\\",\\n\\t\\\"ɍ\\\":\\\"r\\\",\\n\\t\\\"ɽ\\\":\\\"r\\\",\\n\\t\\\"ↄ\\\":\\\"c\\\",\\n\\t\\\"ꜿ\\\":\\\"c\\\",\\n\\t\\\"ɘ\\\":\\\"e\\\",\\n\\t\\\"É¿\\\":\\\"r\\\",\\n\\t\\\"ś\\\":\\\"s\\\",\\n\\t\\\"á¹¥\\\":\\\"s\\\",\\n\\t\\\"Å¡\\\":\\\"s\\\",\\n\\t\\\"á¹§\\\":\\\"s\\\",\\n\\t\\\"ş\\\":\\\"s\\\",\\n\\t\\\"ŝ\\\":\\\"s\\\",\\n\\t\\\"ș\\\":\\\"s\\\",\\n\\t\\\"ṡ\\\":\\\"s\\\",\\n\\t\\\"á¹£\\\":\\\"s\\\",\\n\\t\\\"ṩ\\\":\\\"s\\\",\\n\\t\\\"ʂ\\\":\\\"s\\\",\\n\\t\\\"áµ´\\\":\\\"s\\\",\\n\\t\\\"ᶊ\\\":\\\"s\\\",\\n\\t\\\"È¿\\\":\\\"s\\\",\\n\\t\\\"É¡\\\":\\\"g\\\",\\n\\t\\\"ᴑ\\\":\\\"o\\\",\\n\\t\\\"ᴓ\\\":\\\"o\\\",\\n\\t\\\"ᴝ\\\":\\\"u\\\",\\n\\t\\\"Å¥\\\":\\\"t\\\",\\n\\t\\\"Å£\\\":\\\"t\\\",\\n\\t\\\"á¹±\\\":\\\"t\\\",\\n\\t\\\"ț\\\":\\\"t\\\",\\n\\t\\\"ȶ\\\":\\\"t\\\",\\n\\t\\\"ẗ\\\":\\\"t\\\",\\n\\t\\\"ⱦ\\\":\\\"t\\\",\\n\\t\\\"ṫ\\\":\\\"t\\\",\\n\\t\\\"á¹­\\\":\\\"t\\\",\\n\\t\\\"Æ­\\\":\\\"t\\\",\\n\\t\\\"ṯ\\\":\\\"t\\\",\\n\\t\\\"áµµ\\\":\\\"t\\\",\\n\\t\\\"Æ«\\\":\\\"t\\\",\\n\\t\\\"ʈ\\\":\\\"t\\\",\\n\\t\\\"ŧ\\\":\\\"t\\\",\\n\\t\\\"ᵺ\\\":\\\"th\\\",\\n\\t\\\"ɐ\\\":\\\"a\\\",\\n\\t\\\"ᴂ\\\":\\\"ae\\\",\\n\\t\\\"ǝ\\\":\\\"e\\\",\\n\\t\\\"áµ·\\\":\\\"g\\\",\\n\\t\\\"É¥\\\":\\\"h\\\",\\n\\t\\\"Ê®\\\":\\\"h\\\",\\n\\t\\\"ʯ\\\":\\\"h\\\",\\n\\t\\\"ᴉ\\\":\\\"i\\\",\\n\\t\\\"ʞ\\\":\\\"k\\\",\\n\\t\\\"ꞁ\\\":\\\"l\\\",\\n\\t\\\"ɯ\\\":\\\"m\\\",\\n\\t\\\"ɰ\\\":\\\"m\\\",\\n\\t\\\"ᴔ\\\":\\\"oe\\\",\\n\\t\\\"ɹ\\\":\\\"r\\\",\\n\\t\\\"É»\\\":\\\"r\\\",\\n\\t\\\"ɺ\\\":\\\"r\\\",\\n\\t\\\"â±¹\\\":\\\"r\\\",\\n\\t\\\"ʇ\\\":\\\"t\\\",\\n\\t\\\"ʌ\\\":\\\"v\\\",\\n\\t\\\"ʍ\\\":\\\"w\\\",\\n\\t\\\"ʎ\\\":\\\"y\\\",\\n\\t\\\"ꜩ\\\":\\\"tz\\\",\\n\\t\\\"ú\\\":\\\"u\\\",\\n\\t\\\"Å­\\\":\\\"u\\\",\\n\\t\\\"ǔ\\\":\\\"u\\\",\\n\\t\\\"û\\\":\\\"u\\\",\\n\\t\\\"á¹·\\\":\\\"u\\\",\\n\\t\\\"ü\\\":\\\"u\\\",\\n\\t\\\"ǘ\\\":\\\"u\\\",\\n\\t\\\"ǚ\\\":\\\"u\\\",\\n\\t\\\"ǜ\\\":\\\"u\\\",\\n\\t\\\"ǖ\\\":\\\"u\\\",\\n\\t\\\"á¹³\\\":\\\"u\\\",\\n\\t\\\"ụ\\\":\\\"u\\\",\\n\\t\\\"ű\\\":\\\"u\\\",\\n\\t\\\"ȕ\\\":\\\"u\\\",\\n\\t\\\"ù\\\":\\\"u\\\",\\n\\t\\\"á»§\\\":\\\"u\\\",\\n\\t\\\"ư\\\":\\\"u\\\",\\n\\t\\\"ứ\\\":\\\"u\\\",\\n\\t\\\"á»±\\\":\\\"u\\\",\\n\\t\\\"ừ\\\":\\\"u\\\",\\n\\t\\\"á»­\\\":\\\"u\\\",\\n\\t\\\"ữ\\\":\\\"u\\\",\\n\\t\\\"ȗ\\\":\\\"u\\\",\\n\\t\\\"Å«\\\":\\\"u\\\",\\n\\t\\\"á¹»\\\":\\\"u\\\",\\n\\t\\\"ų\\\":\\\"u\\\",\\n\\t\\\"ᶙ\\\":\\\"u\\\",\\n\\t\\\"ů\\\":\\\"u\\\",\\n\\t\\\"Å©\\\":\\\"u\\\",\\n\\t\\\"á¹¹\\\":\\\"u\\\",\\n\\t\\\"á¹µ\\\":\\\"u\\\",\\n\\t\\\"ᵫ\\\":\\\"ue\\\",\\n\\t\\\"ꝸ\\\":\\\"um\\\",\\n\\t\\\"â±´\\\":\\\"v\\\",\\n\\t\\\"ꝟ\\\":\\\"v\\\",\\n\\t\\\"ṿ\\\":\\\"v\\\",\\n\\t\\\"ʋ\\\":\\\"v\\\",\\n\\t\\\"ᶌ\\\":\\\"v\\\",\\n\\t\\\"â±±\\\":\\\"v\\\",\\n\\t\\\"á¹½\\\":\\\"v\\\",\\n\\t\\\"ꝡ\\\":\\\"vy\\\",\\n\\t\\\"ẃ\\\":\\\"w\\\",\\n\\t\\\"ŵ\\\":\\\"w\\\",\\n\\t\\\"ẅ\\\":\\\"w\\\",\\n\\t\\\"ẇ\\\":\\\"w\\\",\\n\\t\\\"ẉ\\\":\\\"w\\\",\\n\\t\\\"ẁ\\\":\\\"w\\\",\\n\\t\\\"â±³\\\":\\\"w\\\",\\n\\t\\\"ẘ\\\":\\\"w\\\",\\n\\t\\\"ẍ\\\":\\\"x\\\",\\n\\t\\\"ẋ\\\":\\\"x\\\",\\n\\t\\\"ᶍ\\\":\\\"x\\\",\\n\\t\\\"ý\\\":\\\"y\\\",\\n\\t\\\"Å·\\\":\\\"y\\\",\\n\\t\\\"ÿ\\\":\\\"y\\\",\\n\\t\\\"ẏ\\\":\\\"y\\\",\\n\\t\\\"ỵ\\\":\\\"y\\\",\\n\\t\\\"ỳ\\\":\\\"y\\\",\\n\\t\\\"Æ´\\\":\\\"y\\\",\\n\\t\\\"á»·\\\":\\\"y\\\",\\n\\t\\\"ỿ\\\":\\\"y\\\",\\n\\t\\\"ȳ\\\":\\\"y\\\",\\n\\t\\\"ẙ\\\":\\\"y\\\",\\n\\t\\\"ɏ\\\":\\\"y\\\",\\n\\t\\\"ỹ\\\":\\\"y\\\",\\n\\t\\\"ź\\\":\\\"z\\\",\\n\\t\\\"ž\\\":\\\"z\\\",\\n\\t\\\"ẑ\\\":\\\"z\\\",\\n\\t\\\"ʑ\\\":\\\"z\\\",\\n\\t\\\"ⱬ\\\":\\\"z\\\",\\n\\t\\\"ż\\\":\\\"z\\\",\\n\\t\\\"ẓ\\\":\\\"z\\\",\\n\\t\\\"È¥\\\":\\\"z\\\",\\n\\t\\\"ẕ\\\":\\\"z\\\",\\n\\t\\\"áµ¶\\\":\\\"z\\\",\\n\\t\\\"ᶎ\\\":\\\"z\\\",\\n\\t\\\"ʐ\\\":\\\"z\\\",\\n\\t\\\"ƶ\\\":\\\"z\\\",\\n\\t\\\"ɀ\\\":\\\"z\\\",\\n\\t\\\"ff\\\":\\\"ff\\\",\\n\\t\\\"ffi\\\":\\\"ffi\\\",\\n\\t\\\"ffl\\\":\\\"ffl\\\",\\n\\t\\\"fi\\\":\\\"fi\\\",\\n\\t\\\"fl\\\":\\\"fl\\\",\\n\\t\\\"ij\\\":\\\"ij\\\",\\n\\t\\\"œ\\\":\\\"oe\\\",\\n\\t\\\"st\\\":\\\"st\\\",\\n\\t\\\"ₐ\\\":\\\"a\\\",\\n\\t\\\"ₑ\\\":\\\"e\\\",\\n\\t\\\"áµ¢\\\":\\\"i\\\",\\n\\t\\\"â±¼\\\":\\\"j\\\",\\n\\t\\\"ₒ\\\":\\\"o\\\",\\n\\t\\\"áµ£\\\":\\\"r\\\",\\n\\t\\\"ᵤ\\\":\\\"u\\\",\\n\\t\\\"áµ¥\\\":\\\"v\\\",\\n\\t\\\"ₓ\\\":\\\"x\\\",\\n\\t\\\"Ё\\\":\\\"YO\\\",\\n\\t\\\"Й\\\":\\\"I\\\",\\n\\t\\\"Ц\\\":\\\"TS\\\",\\n\\t\\\"У\\\":\\\"U\\\",\\n\\t\\\"К\\\":\\\"K\\\",\\n\\t\\\"Е\\\":\\\"E\\\",\\n\\t\\\"Н\\\":\\\"N\\\",\\n\\t\\\"Г\\\":\\\"G\\\",\\n\\t\\\"Ш\\\":\\\"SH\\\",\\n\\t\\\"Щ\\\":\\\"SCH\\\",\\n\\t\\\"З\\\":\\\"Z\\\",\\n\\t\\\"Ð¥\\\":\\\"H\\\",\\n\\t\\\"Ъ\\\":\\\"'\\\",\\n\\t\\\"ё\\\":\\\"yo\\\",\\n\\t\\\"й\\\":\\\"i\\\",\\n\\t\\\"ц\\\":\\\"ts\\\",\\n\\t\\\"у\\\":\\\"u\\\",\\n\\t\\\"к\\\":\\\"k\\\",\\n\\t\\\"е\\\":\\\"e\\\",\\n\\t\\\"н\\\":\\\"n\\\",\\n\\t\\\"г\\\":\\\"g\\\",\\n\\t\\\"ш\\\":\\\"sh\\\",\\n\\t\\\"щ\\\":\\\"sch\\\",\\n\\t\\\"з\\\":\\\"z\\\",\\n\\t\\\"х\\\":\\\"h\\\",\\n\\t\\\"ъ\\\":\\\"'\\\",\\n\\t\\\"Ф\\\":\\\"F\\\",\\n\\t\\\"Ы\\\":\\\"I\\\",\\n\\t\\\"В\\\":\\\"V\\\",\\n\\t\\\"А\\\":\\\"a\\\",\\n\\t\\\"П\\\":\\\"P\\\",\\n\\t\\\"Р\\\":\\\"R\\\",\\n\\t\\\"О\\\":\\\"O\\\",\\n\\t\\\"Л\\\":\\\"L\\\",\\n\\t\\\"Д\\\":\\\"D\\\",\\n\\t\\\"Ж\\\":\\\"ZH\\\",\\n\\t\\\"Э\\\":\\\"E\\\",\\n\\t\\\"ф\\\":\\\"f\\\",\\n\\t\\\"ы\\\":\\\"i\\\",\\n\\t\\\"в\\\":\\\"v\\\",\\n\\t\\\"а\\\":\\\"a\\\",\\n\\t\\\"п\\\":\\\"p\\\",\\n\\t\\\"р\\\":\\\"r\\\",\\n\\t\\\"о\\\":\\\"o\\\",\\n\\t\\\"л\\\":\\\"l\\\",\\n\\t\\\"д\\\":\\\"d\\\",\\n\\t\\\"ж\\\":\\\"zh\\\",\\n\\t\\\"э\\\":\\\"e\\\",\\n\\t\\\"Я\\\":\\\"Ya\\\",\\n\\t\\\"Ч\\\":\\\"CH\\\",\\n\\t\\\"С\\\":\\\"S\\\",\\n\\t\\\"М\\\":\\\"M\\\",\\n\\t\\\"И\\\":\\\"I\\\",\\n\\t\\\"Т\\\":\\\"T\\\",\\n\\t\\\"Ь\\\":\\\"'\\\",\\n\\t\\\"Б\\\":\\\"B\\\",\\n\\t\\\"Ю\\\":\\\"YU\\\",\\n\\t\\\"я\\\":\\\"ya\\\",\\n\\t\\\"ч\\\":\\\"ch\\\",\\n\\t\\\"с\\\":\\\"s\\\",\\n\\t\\\"м\\\":\\\"m\\\",\\n\\t\\\"и\\\":\\\"i\\\",\\n\\t\\\"т\\\":\\\"t\\\",\\n\\t\\\"ь\\\":\\\"'\\\",\\n\\t\\\"б\\\":\\\"b\\\",\\n\\t\\\"ю\\\":\\\"yu\\\",\\n\\t\\\"…\\\":\\\"...\\\"\\n};\\n\\nexports.transliterate = function(str) {\\n\\treturn str.replace(/[^A-Za-z0-9\\\\[\\\\] ]/g,function(ch) {\\n\\t\\treturn exports.transliterationPairs[ch] || ch\\n\\t});\\n};\\n\\nexports.transliterateToSafeASCII = function(str) {\\n\\treturn str.replace(/[^\\\\x00-\\\\x7F]/g,function(ch) {\\n\\t\\treturn exports.transliterationPairs[ch] || \\\"\\\"\\n\\t});\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"utils\"},\"$:/core/modules/utils/utils.js\":{\"title\":\"$:/core/modules/utils/utils.js\",\"text\":\"/*\\\\\\ntitle: $
2731:/core/modules/utils/utils.js\\ntype: application/javascript\\nmodule-type: utils\\n\\nVarious static utility functions.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar base64utf8 = require(\\\"$:/core/modules/utils/base64-utf8/base64-utf8.module.js\\\");\\n\\n/*\\nDisplay a message, in colour if we're on a terminal\\n*/\\nexports.log = function(text,colour) {\\n\\tconsole.log($tw.node ? exports.terminalColour(colour) + text + exports.terminalColour() : text);\\n};\\n\\nexports.terminalColour = function(colour) {\\n\\tif(!$tw.browser && $tw.node && process.stdout.isTTY) {\\n\\t\\tif(colour) {\\n\\t\\t\\tvar code = exports.terminalColourLookup[colour];\\n\\t\\t\\tif(code) {\\n\\t\\t\\t\\treturn \\\"\\\\x1b[\\\" + code + \\\"m\\\";\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\t\\t\\treturn \\\"\\\\x1b[0m\\\"; // Cancel colour\\n\\t\\t}\\n\\t}\\n\\treturn \\\"\\\";\\n};\\n\\nexports.terminalColourLookup = {\\n\\t\\\"black\\\": \\\"0;30\\\",\\n\\t\\\"red\\\": \\\"0;31\\\",\\n\\t\\\"green\\\": \\\"0;32\\\",\\n\\t\\\"brown/orange\\\": \\\"0;33\\\",\\n\\t\\\"blue\\\": \\\"0;34\\\",\\n\\t\\\"purple\\\": \\\"0;35\\\",\\n\\t\\\"cyan\\\": \\\"0;36\\\",\\n\\t\\\"light gray\\\": \\\"0;37\\\"\\n};\\n\\n/*\\nDisplay a warning, in colour if we're on a terminal\\n*/\\nexports.warning = function(text) {\\n\\texports.log(text,\\\"brown/orange\\\");\\n};\\n\\n/*\\nLog a table of name: value pairs\\n*/\\nexports.logTable = function(data) {\\n\\tif(console.table) {\\n\\t\\tconsole.table(data);\\n\\t} else {\\n\\t\\t$tw.utils.each(data,function(value,name) {\\n\\t\\t\\tconsole.log(name + \\\": \\\" + value);\\n\\t\\t});\\n\\t}\\n}\\n\\n/*\\nReturn the integer represented by the str (string).\\nReturn the dflt (default) parameter if str is not a base-10 number.\\n*/\\nexports.getInt = function(str,deflt) {\\n\\tvar i = parseInt(str,10);\\n\\treturn isNaN(i) ? deflt : i;\\n}\\n\\n/*\\nRepeatedly replaces a substring within a string. Like String.prototype.replace, but without any of the default special handling of $ sequences in the replace string\\n*/\\nexports.replaceString = function(text,search,replace) {\\n\\treturn text.replace(search,function() {\\n\\t\\treturn replace;\\n\\t});\\n};\\n\\n/*\\nRepeats a string\\n*/\\nexports.repeat = function(str,count) {\\n\\tvar result = \\\"\\\";\\n\\tfor(var t=0;t\u003Ccount;t++) {\\n\\t\\tresult += str;\\n\\t}\\n\\treturn result;\\n};
2731\\n\\n/*\\nCheck if a string starts with another string\\n*/\\nexports.startsWith = function(str,search) {\\n\\treturn str.substring(0, search.length) === search;\\n};\\n\\n/*\\nCheck if a string ends with another string\\n*/\\nexports.endsWith = function(str,search) {\\n\\treturn str.substring(str.length - search.length) === search;\\n};\\n\\n/*\\nTrim whitespace from the start and end of a string\\nThanks to Steven Levithan, http://blog.stevenlevithan.com/archives/faster-trim-javascript\\n*/\\nexports.trim = function(str) {\\n\\tif(typeof str === \\\"string\\\") {\\n\\t\\treturn str.replace(/^\\\\s\\\\s*/, '').replace(/\\\\s\\\\s*$/, '');\\n\\t} else {\\n\\t\\treturn str;\\n\\t}\\n};\\n\\nexports.trimPrefix = function(str,unwanted) {\\n\\tif(typeof str === \\\"string\\\" && typeof unwanted === \\\"string\\\") {\\n\\t\\tif(unwanted === \\\"\\\") {\\n\\t\\t\\treturn str.replace(/^\\\\s\\\\s*/, '');\\n\\t\\t} else {\\n\\t\\t\\t// Safely regexp-escape the unwanted text\\n\\t\\t\\tunwanted = unwanted.replace(/[\\\\\\\\^$*+?.()|[\\\\]{}]/g, '\\\\\\\\$&');\\n\\t\\t\\tvar regex = new RegExp('^(' + unwanted + ')+');\\n\\t\\t\\treturn str.replace(regex, '');\\n\\t\\t}\\n\\t} else {\\n\\t\\treturn str;\\n\\t}\\n};\\n\\nexports.trimSuffix = function(str,unwanted) {\\n\\tif(typeof str === \\\"string\\\" && typeof unwanted === \\\"string\\\") {\\n\\t\\tif(unwanted === \\\"\\\") {\\n\\t\\t\\treturn str.replace(/\\\\s\\\\s*$/, '');\\n\\t\\t} else {\\n\\t\\t\\t// Safely regexp-escape the unwanted text\\n\\t\\t\\tunwanted = unwanted.replace(/[\\\\\\\\^$*+?.()|[\\\\]{}]/g, '\\\\\\\\$&');\\n\\t\\t\\tvar regex = new RegExp('(' + unwanted + ')+$');\\n\\t\\t\\treturn str.replace(regex, '');\\n\\t\\t}\\n\\t} else {\\n\\t\\treturn str;\\n\\t}\\n};\\n\\n/*\\nConvert a string to sentence case (ie capitalise first letter)\\n*/\\nexports.toSentenceCase = function(str) {\\n\\treturn (str || \\\"\\\").replace(/^\\\\S/, function(c) {return c.toUpperCase();});\\n}\\n\\n/*\\nConvert a string to title case (ie capitalise each initial letter)\\n*/\\nexports.toTitleCase = function(str) {\\n\\treturn (str || \\\"\\\").replace(/(^|\\\\s)\\\\S/g, function(c) {return c.toUpperCase();});\\n}\\n\\n/*\\nFind the line break preceding a given position in a string\\nReturns position immediately after that line break, or the start of the string\\n*/\\nexports.findPrecedingLineBreak = function(text,pos) {\\n\\tvar result = text.lastIndexOf(\\\"\\\\n\\\",pos - 1);\\n\\tif(result === -1) {\\n\\t\\tresult = 0;\\n\\t} else {\\n\\t\\tresult++;\\n\\t\\tif(text.charAt(result) === \\\"\\\\r\\\") {\\n\\t\\t\\tresult++;\\n\\t\\t}\\n\\t}\\n\\treturn result;\\n};
2731\\n\\n/*\\nFind the line break following a given position in a string\\n*/\\nexports.findFollowingLineBreak = function(text,pos) {\\n\\t// Cut to just past the following line break, or to the end of the text\\n\\tvar result = text.indexOf(\\\"\\\\n\\\",pos);\\n\\tif(result === -1) {\\n\\t\\tresult = text.length;\\n\\t} else {\\n\\t\\tif(text.charAt(result) === \\\"\\\\r\\\") {\\n\\t\\t\\tresult++;\\n\\t\\t}\\n\\t}\\n\\treturn result;\\n};\\n\\n/*\\nReturn the number of keys in an object\\n*/\\nexports.count = function(object) {\\n\\treturn Object.keys(object || {}).length;\\n};\\n\\n/*\\nDetermine whether an array-item is an object-property\\n*/\\nexports.hopArray = function(object,array) {\\n\\tfor(var i=0; i\u003Carray.length; i++) {\\n\\t\\tif($tw.utils.hop(object,array[i])) {\\n\\t\\t\\treturn true;\\n\\t\\t}\\n\\t}\\n\\treturn false;\\n};\\n\\n/*\\nRemove entries from an array\\n\\tarray: array to modify\\n\\tvalue: a single value to remove, or an array of values to remove\\n*/\\nexports.removeArrayEntries = function(array,value) {\\n\\tvar t,p;\\n\\tif($tw.utils.isArray(value)) {\\n\\t\\tfor(t=0; t\u003Cvalue.length; t++) {\\n\\t\\t\\tp = array.indexOf(value[t]);\\n\\t\\t\\tif(p !== -1) {\\n\\t\\t\\t\\tarray.splice(p,1);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t} else {\\n\\t\\tp = array.indexOf(value);\\n\\t\\tif(p !== -1) {\\n\\t\\t\\tarray.splice(p,1);\\n\\t\\t}\\n\\t}\\n\\treturn array;\\n};\\n\\n/*\\nCheck whether any members of a hashmap are present in another hashmap\\n*/\\nexports.checkDependencies = function(dependencies,changes) {\\n\\tvar hit = false;\\n\\t$tw.utils.each(changes,function(change,title) {\\n\\t\\tif($tw.utils.hop(dependencies,title)) {\\n\\t\\t\\thit = true;\\n\\t\\t}\\n\\t});\\n\\treturn hit;\\n};\\n\\nexports.extend = function(object /* [, src] */) {\\n\\t$tw.utils.each(Array.prototype.slice.call(arguments, 1), function(source) {\\n\\t\\tif(source) {\\n\\t\\t\\tfor(var property in source) {\\n\\t\\t\\t\\tobject[property] = source[property];\\n\\t\\t\\t}\\n\\t\\t}\\n\\t});\\n\\treturn object;\\n};\\n\\nexports.deepCopy = function(object) {\\n\\tvar result,t;\\n\\tif($tw.utils.isArray(object)) {\\n\\t\\t// Copy arrays\\n\\t\\tresult = object.slice(0);\\n\\t} else if(typeof object === \\\"object\\\") {\\n\\t\\tresult = {};\\n\\t\\tfor(t in object) {\\n\\t\\t\\tif(object[t] !== undefined) {\\n\\t\\t\\t\\tresult[t] = $tw.utils.deepCopy(object[t]);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t} else {\\n\\t\\tresult = object;\\n\\t}\\n\\treturn result;\\n};\\n\\nexports.extendDeepCopy = function(object,extendedProperties) {\\n\\tvar result = $tw.utils.deepCopy(object),t;\\n\\tfor(t in extendedProperties) {\\n\\t\\tif(extendedProperties[t] !== undefined) {\\n\\t\\t\\tresult[t] = $tw.utils.deepCopy(extendedProperties[t]);\\n\\t\\t}\\n\\t}\\n\\treturn result;\\n};\\n\\nexports.deepFreeze = function deepFreeze(object) {\\n\\tvar property, key;\\n\\tif(object) {\\n\\t\\tObject.freeze(object);\\n\\t\\tfor(key in object) {\\n\\t\\t\\tproperty = object[key];\\n\\t\\t\\tif($tw.utils.hop(object,key) && (typeof property === \\\"object\\\") && !Object.isFrozen(property)) {\\n\\t\\t\\t\\tdeepFreeze(property);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n};\\n\\nexports.slowInSlowOut = function(t) {\\n\\treturn (1 - ((Math.cos(t * Math.PI) + 1) / 2));\\n};\\n\\nexports.formatTitleString = function(template,options) {\\n\\tvar base = options.base || \\\"\\\",\\n\\t\\tseparator = options.separator || \\\"\\\",\\n\\t\\tcounter = options.counter || \\\"\\\";\\n\\tvar result = \\\"\\\",\\n\\t\\tt = template,\\n\\t\\tmatches = [\\n\\t\\t\\t[/^\\\\$basename\\\\$/i, function() {\\n\\t\\t\\t\\treturn base;\\n\\t\\t\\t}],\\n\\t\\t\\t[/^\\\\$count:(\\\\d+)\\\\$/i, function(match) {\\n\\t\\t\\t\\treturn $tw.utils.pad(counter,match[1]);\\n\\t\\t\\t}],\\n\\t\\t\\t[/^\\\\$separator\\\\$/i, function() {\\n\\t\\t\\t\\treturn separator;\\n\\t\\t\\t}],\\n\\t\\t\\t[/^\\\\$count\\\\$/i, function() {\\n\\t\\t\\t\\treturn counter + \\\"\\\";\\n\\t\\t\\t}]\\n\\t\\t];\\n\\twhile(t.length){\\n\\t\\tvar matchString = \\\"\\\";\\n\\t\\t$tw.utils.each(matches, function(m) {\\n\\t\\t\\tvar match = m[0].exec(t);\\n\\t\\t\\tif(match) {\\n\\t\\t\\t\\tmatchString = m[1].call(null,match);\\n\\t\\t\\t\\tt = t.substr(match[0].length);\\n\\t\\t\\t\\treturn false;\\n\\t\\t\\t}\\n\\t\\t});\\n\\t\\tif(matchString) {\\n\\t\\t\\tresult += matchString;\\n\\t\\t} else {\\n\\t\\t\\tresult += t.charAt(0);\\n\\t\\t\\tt = t.substr(1);\\n\\t\\t}\\n\\t}\\n\\tresult = result.replace(/\\\\\\\\(.)/g,\\\"$1\\\");\\n\\treturn result;\\n};\\n\\nexports.formatDateString = function(date,template) {\\n\\tvar result = \\\"\\\",\\n\\t\\tt = template,\\n\\t\\tmatches = [\\n\\t\\t\\t[/^TIMESTAMP/, function() {\\n\\t\\t\\t\\treturn date.getTime();\\n\\t\\t\\t}],\\n\\t\\t\\t[/^0hh12/, function() {\\n\\t\\t\\t\\treturn $tw.utils.pad($tw.utils.getHours12(date));\\n\\t\\t\\t}],\\n\\t\\t\\t[/^wYYYY/, function() {\\n\\t\\t\\t\\treturn $tw.utils.pad($tw.utils.getYearForWeekNo(date),4);\\n\\t\\t\\t}],\\n\\t\\t\\t[/^hh12/, function() {\\n\\t\\t\\t\\treturn $tw.utils.getHours12(date);\\n\\t\\t\\t}],\\n\\t\\t\\t[/^DDth/, function() {\\n\\t\\t\\t\\treturn date.getDate() + $tw.utils.getDaySuffix(date);\\n\\t\\t\\t}],\\n\\t\\t\\t[/^YYYY/, function() {\\n\\t\\t\\t\\treturn $tw.utils.pad(date.getFullYear(),4);\\n\\t\\t\\t}],\\n\\t\\t\\t[/^aYYYY/, function() {\\n\\t\\t\\t\\treturn $tw.utils.pad(Math.abs(date.getFullYear()),4);\\n\\t\\t\\t}],\\n\\t\\t\\t[/^\\\\{era:([^,\\\\|}]*)\\\\|([^}\\\\|]*)\\\\|([^}]*)\\\\}/, function(match) {\\n\\t\\t\\t\\tvar year = date.getFullYear();\\n\\t\\t\\t\\treturn year === 0 ? match[2] : (year \u003C 0 ? match[1] : match[3]);\\n\\t\\t\\t}],\\n\\t\\t\\t[/^0hh/, function() {\\n\\t\\t\\t\\treturn $tw.utils.pad(date.getHours());\\n\\t\\t\\t}],\\n\\t\\t\\t[/^0mm/, function() {\\n\\t\\t\\t\\treturn $tw.utils.pad(date.getMinutes());\\n\\t\\t\\t}],\\n\\t\\t\\t[/^0ss/, function() {\\n\\t\\t\\t\\treturn $tw.utils.pad(date.getSeconds());\\n\\t\\t\\t}],\\n\\t\\t\\t[/^0XXX/, function() {\\n\\t\\t\\t\\treturn $tw.utils.pad(date.getMilliseconds(),3);\\n\\t\\t\\t}],\\n\\t\\t\\t[/^0DD/, function() {\\n\\t\\t\\t\\treturn $tw.utils.pad(date.getDate());\\n\\t\\t\\t}],\\n\\t\\t\\t[/^0MM/, function() {\\n\\t\\t\\t\\treturn $tw.utils.pad(date.getMonth()+1);\\n\\t\\t\\t}],\\n\\t\\t\\t[/^0WW/, function() {\\n\\t\\t\\t\\treturn $tw.utils.pad($tw.utils.getWeek(date));\\n\\t\\t\\t}],\\n\\t\\t\\t[/^0ddddd/, function() {\\n\\t\\t\\t\\treturn $tw.utils.pad(Math.floor((date - new Date(date.getFullYear(), 0, 0)) / 1000 / 60 / 60 / 24),3);\\n\\t\\t\\t}],\\n\\t\\t\\t[/^ddddd/, function() {\\n\\t\\t\\t\\treturn Math.floor((date - new Date(date.getFullYear(), 0, 0)) / 1000 / 60 / 60 / 24);\\n\\t\\t\\t}],\\n\\t\\t\\t[/^dddd/, function() {\\n\\t\\t\\t\\treturn [7,1,2,3,4,5,6][date.getDay()];\\n\\t\\t\\t}],\\n\\t\\t\\t[/^ddd/, function() {\\n\\t\\t\\t\\treturn $tw.language.getString(\\\"Date/Short/Day/\\\" + date.getDay());\\n\\t\\t\\t}],\\n\\t\\t\\t[/^mmm/, function() {\\n\\t\\t\\t\\treturn $tw.language.getString(\\\"Date/Short/Month/\\\" + (date.getMonth() + 1));\\n\\t\\t\\t}],\\n\\t\\t\\t[/^DDD/, function() {\\n\\t\\t\\t\\treturn $tw.language.getString(\\\"Date/Long/Day/\\\" + date.getDay());\\n\\t\\t\\t}],\\n\\t\\t\\t[/^MMM/, function() {\\n\\t\\t\\t\\treturn $tw.language.getString(\\\"Date/Long/Month/\\\" + (date.getMonth() + 1));\\n\\t\\t\\t}],\\n\\t\\t\\t[/^TZD/, function() {\\n\\t\\t\\t\\tvar tz = date.getTimezoneOffset(),\\n\\t\\t\\t\\tatz = Math.abs(tz);\\n\\t\\t\\t\\treturn (tz \u003C 0 ? '+' : '-') + $tw.utils.pad(Math.floor(atz / 60)) + ':' + $tw.utils.pad(atz % 60);\\n\\t\\t\\t}],\\n\\t\\t\\t[/^wYY/, function() {\\n\\t\\t\\t\\treturn $tw.utils.pad($tw.utils.getYearForWeekNo(date) - 2000);\\n\\t\\t\\t}],\\n\\t\\t\\t[/^[ap]m/, function() {\\n\\t\\t\\t\\treturn $tw.utils.getAmPm(date).toLowerCase();\\n\\t\\t\\t}],\\n\\t\\t\\t[/^hh/, function() {\\n\\t\\t\\t\\treturn date.getHours();\\n\\t\\t\\t}],\\n\\t\\t\\t[/^mm/, function() {\\n\\t\\t\\t\\treturn date.getMinutes();\\n\\t\\t\\t}],\\n\\t\\t\\t[/^ss/, function() {\\n\\t\\t\\t\\treturn date.getSeconds();\\n\\t\\t\\t}],\\n\\t\\t\\t[/^XXX/, function() {\\n\\t\\t\\t\\treturn date.getMilliseconds();\\n\\t\\t\\t}],\\n\\t\\t\\t[/^[AP]M/, function() {\\n\\t\\t\\t\\treturn $tw.utils.getAmPm(date).toUpperCase();\\n\\t\\t\\t}],\\n\\t\\t\\t[/^DD/, function() {\\n\\t\\t\\t\\treturn date.getDate();\\n\\t\\t\\t}],\\n\\t\\t\\t[/^MM/, function() {\\n\\t\\t\\t\\treturn date.getMonth() + 1;\\n\\t\\t\\t}],\\n\\t\\t\\t[/^WW/, function() {\\n\\t\\t\\t\\treturn $tw.utils.getWeek(date);\\n\\t\\t\\t}],\\n\\t\\t\\t[/^YY/, function() {\\n\\t\\t\\t\\treturn $tw.utils.pad(date.getFullYear() - 2000);\\n\\t\\t\\t}]\\n\\t\\t];\\n\\t// If the user wants everything in UTC, shift the datestamp\\n\\t// Optimize for format str
2731ing that essentially means\\n\\t// 'return raw UTC (tiddlywiki style) date string.'\\n\\tif(t.indexOf(\\\"[UTC]\\\") == 0 ) {\\n\\t\\tif(t == \\\"[UTC]YYYY0MM0DD0hh0mm0ssXXX\\\")\\n\\t\\t\\treturn $tw.utils.stringifyDate(date || new Date());\\n\\t\\tvar offset = date.getTimezoneOffset() ; // in minutes\\n\\t\\tdate = new Date(date.getTime()+offset*60*1000) ;\\n\\t\\tt = t.substr(5) ;\\n\\t}\\n\\twhile(t.length){\\n\\t\\tvar matchString = \\\"\\\";\\n\\t\\t$tw.utils.each(matches, function(m) {\\n\\t\\t\\tvar match = m[0].exec(t);\\n\\t\\t\\tif(match) {\\n\\t\\t\\t\\tmatchString = m[1].call(null,match);\\n\\t\\t\\t\\tt = t.substr(match[0].length);\\n\\t\\t\\t\\treturn false;\\n\\t\\t\\t}\\n\\t\\t});\\n\\t\\tif(matchString) {\\n\\t\\t\\tresult += matchString;\\n\\t\\t} else {\\n\\t\\t\\tresult += t.charAt(0);\\n\\t\\t\\tt = t.substr(1);\\n\\t\\t}\\n\\t}\\n\\tresult = result.replace(/\\\\\\\\(.)/g,\\\"$1\\\");\\n\\treturn result;\\n};\\n\\nexports.getAmPm = function(date) {\\n\\treturn $tw.language.getString(\\\"Date/Period/\\\" + (date.getHours() >= 12 ? \\\"pm\\\" : \\\"am\\\"));\\n};\\n\\nexports.getDaySuffix = function(date) {\\n\\treturn $tw.language.getString(\\\"Date/DaySuffix/\\\" + date.getDate());\\n};\\n\\nexports.getWeek = function(date) {\\n\\tvar dt = new Date(date.getTime());\\n\\tvar d = dt.getDay();\\n\\tif(d === 0) {\\n\\t\\td = 7; // JavaScript Sun=0, ISO Sun=7\\n\\t}\\n\\tdt.setTime(dt.getTime() + (4 - d) * 86400000);// shift day to Thurs of same week to calculate weekNo\\n\\tvar x = new Date(dt.getFullYear(),0,1);\\n\\tvar n = Math.floor((dt.getTime() - x.getTime()) / 86400000);\\n\\treturn Math.floor(n / 7) + 1;\\n};\\n\\nexports.getYearForWeekNo = function(date) {\\n\\tvar dt = new Date(date.getTime());\\n\\tvar d = dt.getDay();\\n\\tif(d === 0) {\\n\\t\\td = 7; // JavaScript Sun=0, ISO Sun=7\\n\\t}\\n\\tdt.setTime(dt.getTime() + (4 - d) * 86400000);// shift day to Thurs of same week\\n\\treturn dt.getFullYear();\\n};\\n\\nexports.getHours12 = function(date) {\\n\\tvar h = date.getHours();\\n\\treturn h > 12 ? h-12 : ( h > 0 ? h : 12 );\\n};\\n\\n/*\\nConvert a date delta in milliseconds into a string representation of \\\"23 seconds ago\\\", \\\"27 minutes ago\\\" etc.\\n\\tdelta: delta in milliseconds\\nReturns an object with these members:\\n\\tdescription: string describing the delta period\\n\\tupdatePeriod: time in millisecond until the string will be inaccurate\\n*/\\nexports.getRelativeDate = function(delta) {\\n\\tvar futurep = false;\\n\\tif(delta \u003C 0) {\\n\\t\\tdelta = -1 * delta;\\n\\t\\tfuturep = true;\\n\\t}\\n\\tvar units = [\\n\\t\\t{name: \\\"Years\\\",   duration:      365 * 24 * 60 * 60 * 1000},\\n\\t\\t{name: \\\"Months\\\",  duration: (365/12) * 24 * 60 * 60 * 1000},\\n\\t\\t{name: \\\"Days\\\",    duration:            24 * 60 * 60 * 1000},\\n\\t\\t{name: \\\"Hours\\\",   duration:                 60 * 60 * 1000},\\n\\t\\t{name: \\\"Minutes\\\", duration:                      60 * 1000},\\n\\t\\t{name: \\\"Seconds\\\", duration:                           1000}\\n\\t];\\n\\tfor(var t=0; t\u003Cunits.length; t++) {\\n\\t\\tvar result = Math.floor(delta / units[t].duration);\\n\\t\\tif(result >= 2) {\\n\\t\\t\\treturn {\\n\\t\\t\\t\\tdelta: delta,\\n\\t\\t\\t\\tdescription: $tw.language.getString(\\n\\t\\t\\t\\t\\t\\\"RelativeDate/\\\" + (futurep ? \\\"Future\\\" : \\\"Past\\\") + \\\"/\\\" + units[t].name,\\n\\t\\t\\t\\t\\t{variables:\\n\\t\\t\\t\\t\\t\\t{period: result.toString()}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t),\\n\\t\\t\\t\\tupdatePeriod: units[t].duration\\n\\t\\t\\t};\\n\\t\\t}\\n\\t}\\n\\treturn {\\n\\t\\tdelta: delta,\\n\\t\\tdescription: $tw.language.getString(\\n\\t\\t\\t\\\"RelativeDate/\\\" + (futurep ? \\\"Future\\\" : \\\"Past\\\") + \\\"/Second\\\",\\n\\t\\t\\t{variables:\\n\\t\\t\\t\\t{period: \\\"1\\\"}\\n\\t\\t\\t}\\n\\t\\t),\\n\\t\\tupdatePeriod: 1000\\n\\t};\\n};\\n\\n// Convert & to \\\"&amp;\\\", \u003C to \\\"&lt;\\\", > to \\\"&gt;\\\", \\\" to \\\"&quot;\\\"\\nexports.htmlEncode = function(s) {\\n\\tif(s) {\\n\\t\\treturn s.toString().replace(/&/mg,\\\"&amp;\\\").replace(/\u003C/mg,\\\"&lt;\\\").replace(/>/mg,\\\"&gt;\\\").replace(/\\\\\\\"/mg,\\\"&quot;\\\");\\n\\t} else {\\n\\t\\treturn \\\"\\\";\\n\\t}\\n};
2731\\n\\n// Converts like htmlEncode, but forgets the double quote for brevity\\nexports.htmlTextEncode = function(s) {\\n\\tif(s) {\\n\\t\\treturn s.toString().replace(/&/mg,\\\"&amp;\\\").replace(/\u003C/mg,\\\"&lt;\\\").replace(/>/mg,\\\"&gt;\\\");\\n\\t} else {\\n\\t\\treturn \\\"\\\";\\n\\t}\\n};\\n\\n// Converts all HTML entities to their character equivalents\\nexports.entityDecode = function(s) {\\n\\tvar converter = String.fromCodePoint || String.fromCharCode,\\n\\t\\te = s.substr(1,s.length-2), // Strip the & and the ;\\n\\t\\tc;\\n\\tif(e.charAt(0) === \\\"#\\\") {\\n\\t\\tif(e.charAt(1) === \\\"x\\\" || e.charAt(1) === \\\"X\\\") {\\n\\t\\t\\tc = parseInt(e.substr(2),16);\\n\\t\\t} else {\\n\\t\\t\\tc = parseInt(e.substr(1),10);\\n\\t\\t}\\n\\t\\tif(isNaN(c)) {\\n\\t\\t\\treturn s;\\n\\t\\t} else {\\n\\t\\t\\treturn converter(c);\\n\\t\\t}\\n\\t} else {\\n\\t\\tc = $tw.config.htmlEntities[e];\\n\\t\\tif(c) {\\n\\t\\t\\treturn converter(c);\\n\\t\\t} else {\\n\\t\\t\\treturn s; // Couldn't convert it as an entity, just return it raw\\n\\t\\t}\\n\\t}\\n};\\n\\nexports.unescapeLineBreaks = function(s) {\\n\\treturn s.replace(/\\\\\\\\n/mg,\\\"\\\\n\\\").replace(/\\\\\\\\b/mg,\\\" \\\").replace(/\\\\\\\\s/mg,\\\"\\\\\\\\\\\").replace(/\\\\r/mg,\\\"\\\");\\n};\\n\\n/*\\n * Returns an escape sequence for given character. Uses \\\\x for characters \u003C=\\n * 0xFF to save space, \\\\u for the rest.\\n *\\n * The code needs to be in sync with th code template in the compilation\\n * function for \\\"action\\\" nodes.\\n */\\n// Copied from peg.js, thanks to David Majda\\nexports.escape = function(ch) {\\n\\tvar charCode = ch.charCodeAt(0);\\n\\tif(charCode \u003C= 0xFF) {\\n\\t\\treturn '\\\\\\\\x' + $tw.utils.pad(charCode.toString(16).toUpperCase());\\n\\t} else {\\n\\t\\treturn '\\\\\\\\u' + $tw.utils.pad(charCode.toString(16).toUpperCase(),4);\\n\\t}\\n};\\n\\n// Turns a string into a legal JavaScript string\\n// Copied from peg.js, thanks to David Majda\\nexports.stringify = function(s, rawUnicode) {\\n\\t/*\\n\\t* ECMA-262, 5th ed., 7.8.4: All characters may appear literally in a string\\n\\t* literal except for the closing quote character, backslash, carriage return,\\n\\t* line separator, paragraph separator, and line feed. Any character may\\n\\t* appear in the form of an escape sequence.\\n\\t*\\n\\t* For portability, we also escape all non-ASCII characters.\\n\\t*/\\n\\tvar regex = rawUnicode ? /[\\\\x00-\\\\x1f]/g : /[\\\\x00-\\\\x1f\\\\x80-\\\\uFFFF]/g;\\n\\treturn (s || \\\"\\\")\\n\\t\\t.replace(/\\\\\\\\/g, '\\\\\\\\\\\\\\\\')            // backslash\\n\\t\\t.replace(/\\\"/g, '\\\\\\\\\\\"')              // double quote character\\n\\t\\t.replace(/'/g, \\\"\\\\\\\\'\\\")              // single quote character\\n\\t\\t.replace(/\\\\r/g, '\\\\\\\\r')             // carriage return\\n\\t\\t.replace(/\\\\n/g, '\\\\\\\\n')             // line feed\\n\\t\\t.replace(regex, exports.escape);   // non-ASCII characters\\n};\\n\\n// Turns a string into a legal JSON string\\n// Derived from peg.js, thanks to David Majda\\nexports.jsonStringify = function(s, rawUnicode) {\\n\\t// See http://www.json.org/\\n\\tvar regex = rawUnicode ? /[\\\\x00-\\\\x1f]/g : /[\\\\x00-\\\\x1f\\\\x80-\\\\uFFFF]/g;\\n\\treturn (s || \\\"\\\")\\n\\t\\t.replace(/\\\\\\\\/g, '\\\\\\\\\\\\\\\\')            // backslash\\n\\t\\t.replace(/\\\"/g, '\\\\\\\\\\\"')              // double quote character\\n\\t\\t.replace(/\\\\r/g, '\\\\\\\\r')             // carriage return\\n\\t\\t.replace(/\\\\n/g, '\\\\\\\\n')             // line feed\\n\\t\\t.replace(/\\\\x08/g, '\\\\\\\\b')           // backspace\\n\\t\\t.replace(/\\\\x0c/g, '\\\\\\\\f')           // formfeed\\n\\t\\t.replace(/\\\\t/g, '\\\\\\\\t')             // tab\\n\\t\\t.replace(regex,function(s) {\\n\\t\\t\\treturn '\\\\\\\\u' + $tw.utils.pad(s.charCodeAt(0).toString(16).toUpperCase(),4);\\n\\t\\t}); // non-ASCII characters\\n};\\n\\n/*\\nEscape the RegExp special characters with a preceding backslash\\n*/\\nexports.escapeRegExp = function(s) {\\n    return s.replace(/[\\\\-\\\\/\\\\\\\\\\\\^\\\\$\\\\*\\\\+\\\\?\\\\.\\\\(\\\\)\\\\|\\\\[\\\\]\\\\{\\\\}]/g, '\\\\\\\\$&');\\n};
2731\\n\\n/*\\nExtended version of encodeURIComponent that encodes additional characters including\\nthose that are illegal within filepaths on various platforms including Windows\\n*/\\nexports.encodeURIComponentExtended = function(s) {\\n\\treturn encodeURIComponent(s).replace(/[!'()*]/g,function(c) {\\n\\t\\treturn \\\"%\\\" + c.charCodeAt(0).toString(16).toUpperCase();\\n\\t});\\n};\\n\\n// Checks whether a link target is external, i.e. not a tiddler title\\nexports.isLinkExternal = function(to) {\\n\\tvar externalRegExp = /^(?:file|http|https|mailto|ftp|irc|news|obsidian|data|skype):[^\\\\s\u003C>{}\\\\[\\\\]`|\\\"\\\\\\\\^]+(?:\\\\/|\\\\b)/i;\\n\\treturn externalRegExp.test(to);\\n};\\n\\nexports.nextTick = function(fn) {\\n/*global window: false */\\n\\tif(typeof process === \\\"undefined\\\") {\\n\\t\\t// Apparently it would be faster to use postMessage - http://dbaron.org/log/20100309-faster-timeouts\\n\\t\\twindow.setTimeout(fn,0);\\n\\t} else {\\n\\t\\tprocess.nextTick(fn);\\n\\t}\\n};\\n\\n/*\\nConvert a hyphenated CSS property name into a camel case one\\n*/\\nexports.unHyphenate
2731Css = function(propName) {\\n\\treturn propName.replace(/-([a-z])/gi, function(match0,match1) {\\n\\t\\treturn match1.toUpperCase();\\n\\t});\\n};\\n\\n/*\\nConvert a camelcase CSS property name into a dashed one (\\\"backgroundColor\\\" --> \\\"background-color\\\")\\n*/\\nexports.hyphenateCss = function(propName) {\\n\\treturn propName.replace(/([A-Z])/g, function(match0,match1) {\\n\\t\\treturn \\\"-\\\" + match1.toLowerCase();\\n\\t});\\n};\\n\\n/*\\nParse a text reference of one of these forms:\\n* title\\n* !!field\\n* title!!field\\n* title##index\\n* etc\\nReturns an object with the following fields, all optional:\\n* title: tiddler title\\n* field: tiddler field name\\n* index: JSON property index\\n*/\\nexports.parseTextReference = function(textRef) {\\n\\t// Separate out the title, field name and/or JSON indices\\n\\tvar reTextRef = /(?:(.*?)!!(.+))|(?:(.*?)##(.+))|(.*)/mg,\\n\\t\\tmatch = reTextRef.exec(textRef),\\n\\t\\tresult = {};\\n\\tif(match && reTextRef.lastIndex === textRef.length) {\\n\\t\\t// Return the parts\\n\\t\\tif(match[1]) {\\n\\t\\t\\tresult.title = match[1];\\n\\t\\t}\\n\\t\\tif(match[2]) {\\n\\t\\t\\tresult.field = match[2];\\n\\t\\t}\\n\\t\\tif(match[3]) {\\n\\t\\t\\tresult.title = match[3];\\n\\t\\t}\\n\\t\\tif(match[4]) {\\n\\t\\t\\tresult.index = match[4];\\n\\t\\t}\\n\\t\\tif(match[5]) {\\n\\t\\t\\tresult.title = match[5];\\n\\t\\t}\\n\\t} else {\\n\\t\\t// If we couldn't parse it\\n\\t\\tresult.title = textRef\\n\\t}\\n\\treturn result;\\n};
2731\\n\\n/*\\nChecks whether a string is a valid fieldname\\n*/\\nexports.isValidFieldName = function(name) {\\n\\tif(!name || typeof name !== \\\"string\\\") {\\n\\t\\treturn false;\\n\\t}\\n\\t// Since v5.2.x, there are no restrictions on characters in field names\\n\\treturn name;\\n};\\n\\n/*\\nExtract the version number from the meta tag or from the boot file\\n*/\\n\\n// Browser version\\nexports.extractVersionInfo = function() {\\n\\tif($tw.packageInfo) {\\n\\t\\treturn $tw.packageInfo.version;\\n\\t} else {\\n\\t\\tvar metatags = document.getElementsByTagName(\\\"meta\\\");\\n\\t\\tfor(var t=0; t\u003Cmetatags.length; t++) {\\n\\t\\t\\tvar m = metatags[t];\\n\\t\\t\\tif(m.name === \\\"tiddlywiki-version\\\") {\\n\\t\\t\\t\\treturn m.content;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\treturn null;\\n};\\n\\n/*\\nGet the animation duration in ms\\n*/\\nexports.getAnimationDuration = function() {\\n\\treturn parseInt($tw.wiki.getTiddlerText(\\\"$:/config/AnimationDuration\\\",\\\"400\\\"),10) || 0;\\n};\\n\\n/*\\nHash a string to a number\\nDerived from http://stackoverflow.com/a/15710692\\n*/\\nexports.hashString = function(str) {\\n\\treturn str.split(\\\"\\\").reduce(function(a,b) {\\n\\t\\ta = ((a \u003C\u003C 5) - a) + b.charCodeAt(0);\\n\\t\\treturn a & a;\\n\\t},0);\\n};\\n\\n/*\\nDecode a base64 string\\n*/\\nexports.base64Decode = function(string64) {\\n\\treturn base64utf8.base64.decode.call(base64utf8,string64);\\n};\\n\\n/*\\nEncode a string to base64\\n*/\\nexports.base64Encode = function(string64) {\\n\\treturn base64utf8.base64.encode.call(base64utf8,string64);\\n};\\n\\n/*\\nConvert a hashmap into a tiddler dictionary format sequence of name:value pairs\\n*/\\nexports.makeTiddlerDictionary = function(data) {\\n\\tvar output = [];\\n\\tfor(var name in data) {\\n\\t\\toutput.push(name + \\\": \\\" + data[name]);\\n\\t}\\n\\treturn output.join(\\\"\\\\n\\\");\\n};\\n\\n/*\\nHigh resolution microsecond timer for profiling\\n*/\\nexports.timer = function(base) {\\n\\tvar m;\\n\\tif($tw.node) {\\n\\t\\tvar r = process.hrtime();\\n\\t\\tm =  r[0] * 1e3 + (r[1] / 1e6);\\n\\t} else if(window.performance) {\\n\\t\\tm = performance.now();\\n\\t} else {\\n\\t\\tm = Date.now();\\n\\t}\\n\\tif(typeof base !== \\\"undefined\\\") {\\n\\t\\tm = m - base;\\n\\t}\\n\\treturn m;\\n};
2731\\n\\n/*\\nConvert text and content type to a data URI\\n*/\\nexports.makeDataUri = function(text,type,_canonical_uri) {\\n\\ttype = type || \\\"text/vnd.tiddlywiki\\\";\\n\\tvar typeInfo = $tw.config.contentTypeInfo[type] || $tw.config.contentTypeInfo[\\\"text/plain\\\"],\\n\\t\\tisBase64 = typeInfo.encoding === \\\"base64\\\",\\n\\t\\tparts = [];\\n\\tif(_canonical_uri) {\\n\\t\\tparts.push(_canonical_uri);\\n\\t} else {\\n\\t\\tparts.push(\\\"data:\\\");\\n\\t\\tparts.push(type);\\n\\t\\tparts.push(isBase64 ? \\\";base64\\\" : \\\"\\\");\\n\\t\\tparts.push(\\\",\\\");\\n\\t\\tparts.push(isBase64 ? text : encodeURIComponent(text));\\n\\t}\\n\\treturn parts.join(\\\"\\\");\\n};\\n\\n/*\\nUseful for finding out the fully escaped CSS selector equivalent to a given tag. For example:\\n\\n$tw.utils.tagToCssSelector(\\\"$:/tags/Stylesheet\\\") --> tc-tagged-\\\\%24\\\\%3A\\\\%2Ftags\\\\%2FStylesheet\\n*/\\nexports.tagToCssSelector = function(tagName) {\\n\\treturn \\\"tc-tagged-\\\" + encodeURIComponent(tagName).replace(/[!\\\"#$%&'()*+,\\\\-./:;\u003C=>?@[\\\\\\\\\\\\]^`{\\\\|}~,]/mg,function(c) {\\n\\t\\treturn \\\"\\\\\\\\\\\" + c;\\n\\t});\\n};\\n\\n/*\\nIE does not have sign function\\n*/\\nexports.sign = Math.sign || function(x) {\\n\\tx = +x; // convert to a number\\n\\tif (x === 0 || isNaN(x)) {\\n\\t\\treturn x;\\n\\t}\\n\\treturn x > 0 ? 1 : -1;\\n};\\n\\n/*\\nIE does not have an endsWith function\\n*/\\nexports.strEndsWith = function(str,ending,position) {\\n\\tif(str.endsWith) {\\n\\t\\treturn str.endsWith(ending,position);\\n\\t} else {\\n\\t\\tif (typeof position !== 'number' || !isFinite(position) || Math.floor(position) !== position || position > str.length) {\\n\\t\\t\\tposition = str.length;\\n\\t\\t}\\n\\t\\tposition -= ending.length;\\n\\t\\tvar lastIndex = str.indexOf(ending, position);\\n\\t\\treturn lastIndex !== -1 && lastIndex === position;\\n\\t}\\n};\\n\\n/*\\nReturn system information useful for debugging\\n*/\\nexports.getSystemInfo = function(str,ending,position) {\\n\\tvar results = [],\\n\\t\\tsave = function(desc,value) {\\n\\t\\t\\tresults.push(desc + \\\": \\\" + value);\\n\\t\\t};\\n\\tif($tw.browser) {\\n\\t\\tsave(\\\"User Agent\\\",navigator.userAgent);\\n\\t\\tsave(\\\"Online Status\\\",window.navigator.onLine);\\n\\t}\\n\\tif($tw.node) {\\n\\t\\tsave(\\\"Node Version\\\",process.version);\\n\\t}\\n\\treturn results.join(\\\"\\\\n\\\");\\n};\\n\\nexports.parseNumber = function(str) {\\n\\treturn parseFloat(str) || 0;\\n};\\n\\nexports.parseInt = function(str) {\\n\\treturn parseInt(str,10) || 0;\\n};\\n\\nexports.stringifyNumber = function(num) {\\n\\treturn num + \\\"\\\";\\n};\\n\\nexports.makeCompareFunction = function(type,options) {\\n\\toptions = options || {};\\n\\t// set isCaseSensitive to true if not defined in options\\n\\tvar isCaseSensitive = (options.isCaseSensitive === false) ? false : true,\\n\\t\\tgt = options.invert ? -1 : +1,\\n\\t\\tlt = options.invert ? +1 : -1,\\n\\t\\tcompare = function(a,b) {\\n\\t\\t\\tif(a > b) {\\n\\t\\t\\t\\treturn gt ;\\n\\t\\t\\t} else if(a \u003C b) {\\n\\t\\t\\t\\treturn lt;\\n\\t\\t\\t} else {\\n\\t\\t\\t\\treturn 0;\\n\\t\\t\\t}\\n\\t\\t},\\n\\t\\ttypes = {\\n\\t\\t\\t\\\"number\\\": function(a,b) {\\n\\t\\t\\t\\treturn compare($tw.utils.parseNumber(a),$tw.utils.parseNumber(b));\\n\\t\\t\\t},\\n\\t\\t\\t\\\"integer\\\": function(a,b) {\\n\\t\\t\\t\\treturn compare($tw.utils.parseInt(a),$tw.utils.parseInt(b));\\n\\t\\t\\t},\\n\\t\\t\\t\\\"string\\\": function(a,b) {\\n\\t\\t\\t\\tif(!isCaseSensitive) {\\n\\t\\t\\t\\t\\ta = a.toLowerCase();\\n\\t\\t\\t\\t\\tb = b.toLowerCase();\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn compare(\\\"\\\" + a,\\\"\\\" + b);\\n\\t\\t\\t},\\n\\t\\t\\t\\\"date\\\": function(a,b) {\\n\\t\\t\\t\\tvar dateA = $tw.utils.parseDate(a),\\n\\t\\t\\t\\t\\tdateB = $tw.utils.parseDate(b);\\n\\t\\t\\t\\tif(!isFinite(dateA)) {\\n\\t\\t\\t\\t\\tdateA = new Date(0);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tif(!isFinite(dateB)) {\\n\\t\\t\\t\\t\\tdateB = new Date(0);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn compare(dateA,dateB);\\n\\t\\t\\t}
2731,\\n\\t\\t\\t\\\"version\\\": function(a,b) {\\n\\t\\t\\t\\treturn $tw.utils.compareVersions(a,b);\\n\\t\\t\\t},\\n\\t\\t\\t\\\"alphanumeric\\\": function(a,b) {\\n\\t\\t\\t\\tif(!isCaseSensitive) {\\n\\t\\t\\t\\t\\ta = a.toLowerCase();\\n\\t\\t\\t\\t\\tb = b.toLowerCase();\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn options.invert ? b.localeCompare(a,undefined,{numeric: true,sensitivity: \\\"base\\\"}) : a.localeCompare(b,undefined,{numeric: true,sensitivity: \\\"base\\\"});\\n\\t\\t\\t}\\n\\t\\t};\\n\\treturn (types[type] || types[options.defaultType] || types.number);\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"utils\"},\"$:/core/modules/widgets/action-confirm.js\":{\"title\":\"$:/core/modules/widgets/action-confirm.js\",\"text\":\"/*\\\\\\n\\ntitle: $:/core/modules/widgets/action-confirm.js\\ntype: application/javascript\\nmodule-type: widget\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar ConfirmWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nConfirmWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nConfirmWidget.prototype.render = function(parent,nextSibling) {\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n\\tthis.parentDomNode = parent;\\n\\tthis.renderChildren(parent,nextSibling);\\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nConfirmWidget.prototype.execute = function() {\\n\\tthis.message = this.getAttribute(\\\"$message\\\",$tw.language.getString(\\\"ConfirmAction\\\"));\\n\\tthis.prompt = (this.getAttribute(\\\"$prompt\\\",\\\"yes\\\") == \\\"no\\\" ? false : true);\\n\\tthis.makeChildWidgets();\\n};\\n\\n/*\\nRefresh the widget by ensuring our attributes are up to date\\n*/\\nConfirmWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes();\\n\\tif(changedAttributes[\\\"$message\\\"] || changedAttributes[\\\"$prompt\\\"]) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t}\\n\\treturn this.refreshChildren(changedTiddlers);\\n};\\n\\n/*\\nInvoke the action associated with this widget\\n*/\\nConfirmWidget.prototype.invokeAction = function(triggeringWidget,event) {\\n\\tvar invokeActions = true,\\n\\t\\thandled = true,\\n\\t    \\twin = event && event.event && event.event.view ? event.event.view : window;\\n\\tif(this.prompt) {\\n\\t\\tinvokeActions = win.confirm(this.message);\\n\\t}\\n\\tif(invokeActions) {\\n\\t\\thandled = this.invokeActions(triggeringWidget,event);\\n\\t}\\n\\treturn handled;\\n};\\n\\nConfirmWidget.prototype.allowActionPropagation = function() {\\n\\treturn false;\\n};\\n\\nexports[\\\"action-confirm\\\"] = ConfirmWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/action-createtiddler.js\":{\"title\":\"$:/core/modules/widgets/action-createtiddler.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/action-createtiddler.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nAction widget to create a new tiddler with a unique name and specified fields.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw:false, require:false, exports:false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar CreateTiddlerWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nCreateTiddlerWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nCreateTiddlerWidget.prototype.render = function(parent,nextSibling) {\\n\\tthis.parentDomNode = parent;\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n\\t// Render children\\n\\tthis.renderChildren(parent,nextSibling);\\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nCreateTiddlerWidget.prototype.execute = function() {\\n\\tthis.actionBaseTitle = this.getAttribute(\\\"$basetitle\\\");\\n\\tthis.hasBase = !!this.actionBaseTitle;\\n\\tthis.actionSaveTitle = this.getAttribute(\\\"$savetitle\\\");\\n\\tthis.actionSaveDraftTitle = this.getAttribute(\\\"$savedrafttitle\\\");\\n\\tthis.actionTimestamp = this.getAttribute(\\\"$timestamp\\\",\\\"yes\\\") === \\\"yes\\\";\\n\\t//Following params are new since 5.1.22\\n\\tthis.actionTemplate = this.getAttribute(\\\"$template\\\");\\n\\tthis.useTemplate = !!this.actionTemplate;\\n\\tthis.actionOverwrite = this.getAttribute(\\\"$overwrite\\\",\\\"no\\\");\\n\\t// Construct the child widgets\\n\\tthis.makeChildWidgets();\\n};
2731\\n\\n/*\\nRefresh the widget by ensuring our attributes are up to date\\n*/\\nCreateTiddlerWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes();\\n\\tif($tw.utils.count(changedAttributes) > 0) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t}\\n\\treturn this.refreshChildren(changedTiddlers);\\n};\\n\\n/*\\nInvoke the action associated with this widget\\n*/\\nCreateTiddlerWidget.prototype.invokeAction = function(triggeringWidget,event) {\\n\\tvar title = this.wiki.getTiddlerText(\\\"$:/language/DefaultNewTiddlerTitle\\\"), // Get the initial new-tiddler title\\n\\t\\tfields = {},\\n\\t\\tcreationFields,\\n\\t\\tmodificationFields;\\n\\t$tw.utils.each(this.attributes,function(attribute,name) {\\n\\t\\tif(name.charAt(0) !== \\\"$\\\") {\\n\\t\\t\\tfields[name] = attribute;\\n\\t\\t}\\n\\t});\\n\\tif(this.actionTimestamp) {\\n\\t\\tcreationFields = this.wiki.getCreationFields();\\n\\t\\tmodificationFields = this.wiki.getModificationFields();\\n\\t}\\n\\tif(this.hasBase && this.actionOverwrite === \\\"no\\\") {\\n\\t\\ttitle = this.wiki.generateNewTitle(this.actionBaseTitle);\\n\\t} else if (this.hasBase && this.actionOverwrite === \\\"yes\\\") {\\n\\t\\ttitle = this.actionBaseTitle\\n\\t}\\n\\t// NO $basetitle BUT $template parameter is available\\n\\t// the title MUST be unique, otherwise the template would be overwritten\\n\\tif (!this.hasBase && this.useTemplate) {\\n\\t\\ttitle = this.wiki.generateNewTitle(this.actionTemplate);\\n\\t} else if (!this.hasBase && !this.useTemplate) {\\n\\t\\t// If no $basetitle and no $template then use initial title\\n\\t\\ttitle = this.wiki.generateNewTitle(title);\\n\\t}\\n\\tvar templateTiddler = this.wiki.getTiddler(this.actionTemplate) || {};\\n\\tthis.wiki.addTiddler(new $tw.Tiddler(templateTiddler.fields,creationFields,fields,modificationFields,{title: title}));\\n\\tvar draftTitle = this.wiki.generateDraftTitle(title);\\n\\tif(this.actionSaveTitle) {\\n\\t\\tthis.wiki.setTextReference(this.actionSaveTitle,title,this.getVariable(\\\"currentTiddler\\\"));\\n\\t}\\n\\tif(this.actionSaveDraftTitle) {\\n\\t\\tthis.wiki.setTextReference(this.actionSaveDraftTitle,draftTitle,this.getVariable(\\\"currentTiddler\\\"));\\n\\t}\\n\\tthis.setVariable(\\\"createTiddler-title\\\",title);\\n\\tthis.setVariable(\\\"createTiddler-draftTitle\\\",draftTitle);\\n\\tthis.refreshChildren();\\n\\treturn true; // Action was invoked\\n};\\n\\nexports[\\\"action-createtiddler\\\"] = CreateTiddlerWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/action-deletefield.js\":{\"title\":\"$:/core/modules/widgets/action-deletefield.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/action-deletefield.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nAction widget to delete fields of a tiddler.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar DeleteFieldWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nDeleteFieldWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nDeleteFieldWidget.prototype.render = function(parent,nextSibling) {\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nDeleteFieldWidget.prototype.execute = function() {\\n\\tthis.actionTiddler = this.getAttribute(\\\"$tiddler\\\",this.getVariable(\\\"currentTiddler\\\"));\\n\\tthis.actionField = this.getAttribute(\\\"$field\\\",null);\\n};\\n\\n/*\\nRefresh the widget by ensuring our attributes are up to date\\n*/\\nDeleteFieldWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes();\\n\\tif(changedAttributes[\\\"$tiddler\\\"]) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t}\\n\\treturn this.refreshChildren(changedTiddlers);\\n};
2731\\n\\n/*\\nInvoke the action associated with this widget\\n*/\\nDeleteFieldWidget.prototype.invokeAction = function(triggeringWidget,event) {\\n\\tvar self = this,\\n\\t\\ttiddler = this.wiki.getTiddler(self.actionTiddler),\\n\\t\\tremoveFields = {},\\n\\t\\thasChanged = false;\\n\\tif((this.actionField !== null) && tiddler) {\\n\\t\\tremoveFields[this.actionField] = undefined;\\n\\t\\tif(this.actionField in tiddler.fields) {\\n\\t\\t\\thasChanged = true;\\n\\t\\t}\\n\\t}\\n\\tif(tiddler) {\\n\\t\\t$tw.utils.each(this.attributes,function(attribute,name) {\\n\\t\\t\\tif(name.charAt(0) !== \\\"$\\\" && name !== \\\"title\\\") {\\n\\t\\t\\t\\tremoveFields[name] = undefined;\\n\\t\\t\\t\\thasChanged = true;\\n\\t\\t\\t}\\n\\t\\t});\\n\\t\\tif(hasChanged) {\\n\\t\\t\\tthis.wiki.addTiddler(new $tw.Tiddler(this.wiki.getCreationFields(),tiddler,removeFields,this.wiki.getModificationFields()));\\n\\t\\t}\\n\\t}\\n\\treturn true; // Action was invoked\\n};\\n\\nexports[\\\"action-deletefield\\\"] = DeleteFieldWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/action-deletetiddler.js\":{\"title\":\"$:/core/modules/widgets/action-deletetiddler.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/action-deletetiddler.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nAction widget to delete a tiddler.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar DeleteTiddlerWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nDeleteTiddlerWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nDeleteTiddlerWidget.prototype.render = function(parent,nextSibling) {\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nDeleteTiddlerWidget.prototype.execute = function() {\\n\\tthis.actionFilter = this.getAttribute(\\\"$filter\\\");\\n\\tthis.actionTiddler = this.getAttribute(\\\"$tiddler\\\");\\n};\\n\\n/*\\nRefresh the widget by ensuring our attributes are up to date\\n*/\\nDeleteTiddlerWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes();\\n\\tif(changedAttributes[\\\"$filter\\\"] || changedAttributes[\\\"$tiddler\\\"]) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t}\\n\\treturn this.refreshChildren(changedTiddlers);\\n};\\n\\n/*\\nInvoke the action associated with this widget\\n*/\\nDeleteTiddlerWidget.prototype.invokeAction = function(triggeringWidget,event) {\\n\\tvar tiddlers = [];\\n\\tif(this.actionFilter) {\\n\\t\\ttiddlers = this.wiki.filterTiddlers(this.actionFilter,this);\\n\\t}\\n\\tif(this.actionTiddler) {\\n\\t\\ttiddlers.push(this.actionTiddler);\\n\\t}\\n\\tfor(var t=0; t\u003Ctiddlers.length; t++) {\\n\\t\\tthis.wiki.deleteTiddler(tiddlers[t]);\\n\\t}\\n\\treturn true; // Action was invoked\\n};\\n\\nexports[\\\"action-deletetiddler\\\"] = DeleteTiddlerWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/action-listops.js\":{\"title\":\"$:/core/modules/widgets/action-listops.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/action-listops.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nAction widget to apply list operations to any tiddler field (defaults to the 'list' field of the current tiddler)\\n\\n\\\\*/\\n(function() {\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\nvar ActionListopsWidget = function(parseTreeNode, options) {\\n\\tthis.initialise(parseTreeNode, options);\\n};\\n/**\\n * Inherit from the base widget class\\n */\\nActionListopsWidget.prototype = new Widget();\\n/**\\n * Render this widget into the DOM\\n */\\nActionListopsWidget.prototype.render = function(parent, nextSibling) {\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n};\\n/**\\n * Compute the internal state of the widget\\n */\\nActionListopsWidget.prototype.execute = function() {\\n\\t// Get our parameters\\n\\tthis.target = this.getAttribute(\\\"$tiddler\\\", this.getVariable(\\n\\t\\t\\\"currentTiddler\\\"));\\n\\tthis.filter = this.getAttribute(\\\"$filter\\\");\\n\\tthis.subfilter = this.getAttribute(\\\"$subfilter\\\");\\n\\tthis.listField = this.getAttribute(\\\"$field\\\", \\\"list\\\");\\n\\tthis.listIndex = this.getAttribute(\\\"$index\\\");\\n\\tthis.filtertags = this.getAttribute(\\\"$tags\\\");\\n};\\n/**\\n * \\tRefresh the widget by ensuring our attributes are up to date\\n */\\nActionListopsWidget.prototype.refresh = function(ch
2731angedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes();\\n\\tif($tw.utils.count(changedAttributes) > 0) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t}\\n\\treturn this.refreshChildren(changedTiddlers);\\n};\\n/**\\n * \\tInvoke the action associated with this widget\\n */\\nActionListopsWidget.prototype.invokeAction = function(triggeringWidget,\\n\\tevent) {\\n\\t//Apply the specified filters to the lists\\n\\tvar field = this.listField,\\n\\t\\tindex,\\n\\t\\tlist = this.listField;\\n\\tif(this.listIndex) {\\n\\t\\tfield = undefined;\\n\\t\\tindex = this.listIndex;\\n\\t\\tlist = this.listIndex;\\n\\t}\\n\\tif(this.filter) {\\n\\t\\tthis.wiki.setText(this.target, field, index, $tw.utils.stringifyList(\\n\\t\\t\\tthis.wiki\\n\\t\\t\\t.filterTiddlers(this.filter, this)));\\n\\t}\\n\\tif(this.subfilter) {\\n\\t\\tvar inputList = this.wiki.getTiddlerList(this.target,field,index),\\n\\t\\t\\tsubfilter = \\\"[all[]] \\\" + this.subfilter;\\n\\t\\tthis.wiki.setText(this.target, field, index, $tw.utils.stringifyList(this.wiki.filterTiddlers(subfilter,this,this.wiki.makeTiddlerIterator(inputList))));\\n\\t}\\n\\tif(this.filtertags) {\\n\\t\\tvar tiddler = this.wiki.getTiddler(this.target),\\n\\t\\t\\toldtags = tiddler ? (tiddler.fields.tags || []).slice(0) : [],\\n\\t\\t\\ttagfilter = $tw.utils.stringifyList(oldtags) + \\\" \\\" + this.filtertags,\\n\\t\\t\\tnewtags = this.wiki.filterTiddlers(tagfilter,this);\\n\\t\\tif($tw.utils.stringifyList(oldtags.sort()) !== $tw.utils.stringifyList(newtags.sort())) {\\n\\t\\t\\tthis.wiki.setText(this.target,\\\"tags\\\",undefined,$tw.utils.stringifyList(newtags));\\n\\t\\t}\\n\\t}\\n\\treturn true; // Action was invoked\\n};\\n\\nexports[\\\"action-listops\\\"] = ActionListopsWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/action-log.js\":{\"title\":\"$:/core/modules/widgets/action-log.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/action-log.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nAction widget to log debug messages\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar LogWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nLogWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nLogWidget.prototype.render = function(parent,nextSibling) {\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n};\\n\\nLogWidget.prototype.execute = function(){\\n\\tthis.message = this.getAttribute(\\\"$$message\\\",\\\"debug\\\");\\n\\tthis.logAll = this.getAttribute(\\\"$$all\\\",\\\"no\\\") === \\\"yes\\\" ? true : false;\\n\\tthis.filter = this.getAttribute(\\\"$$filter\\\");\\n}\\n\\n/*\\nRefresh the widget by ensuring our attributes are up to date\\n*/\\nLogWidget.prototype.refresh = function(changedTiddlers) {\\n\\tthis.refreshSelf();\\n\\treturn true;\\n};
2731\\n\\n/*\\nInvoke the action associated with this widget\\n*/\\nLogWidget.prototype.invokeAction = function(triggeringWidget,event) {\\n\\tthis.log();\\n\\treturn true; // Action was invoked\\n};\\n\\nLogWidget.prototype.log = function() {\\n\\tvar data = {},\\n\\t\\tdataCount,\\n\\t\\tallVars = {},\\n\\t\\tfilteredVars;\\n\\n\\t$tw.utils.each(this.attributes,function(attribute,name) {\\n\\t\\tif(name.substring(0,2) !== \\\"$$\\\") {\\n\\t\\t\\tdata[name] = attribute;\\n\\t\\t}\\n\\t});\\n\\n\\tfor(var v in this.variables) {\\n\\t\\tallVars[v] = this.getVariable(v,{defaultValue:\\\"\\\"});\\n\\t}\\n\\tif(this.filter) {\\n\\t\\tfilteredVars = this.wiki.compileFilter(this.filter).call(this.wiki,this.wiki.makeTiddlerIterator(allVars));\\n\\t\\t$tw.utils.each(filteredVars,function(name) {\\n\\t\\t\\tdata[name] = allVars[name];\\n\\t\\t});\\n\\t}\\n\\tdataCount = $tw.utils.count(data);\\n\\n\\tconsole.group(this.message);\\n\\tif(dataCount > 0) {\\n\\t\\t$tw.utils.logTable(data);\\n\\t}\\n\\tif(this.logAll || !dataCount) {\\n\\t\\tconsole.groupCollapsed(\\\"All variables\\\");\\n\\t\\t$tw.utils.logTable(allVars);\\n\\t\\tconsole.groupEnd();\\n\\t}\\n\\tconsole.groupEnd();\\n}\\n\\nexports[\\\"action-log\\\"] = LogWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/action-navigate.js\":{\"title\":\"$:/core/modules/widgets/action-navigate.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/action-navigate.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nAction widget to navigate to a tiddler\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar NavigateWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nNavigateWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nNavigateWidget.prototype.render = function(parent,nextSibling) {\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nNavigateWidget.prototype.execute = function() {\\n\\tthis.actionTo = this.getAttribute(\\\"$to\\\");\\n\\tthis.actionScroll = this.getAttribute(\\\"$scroll\\\");\\n};\\n\\n/*\\nRefresh the widget by ensuring our attributes are up to date\\n*/\\nNavigateWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes();\\n\\tif(changedAttributes[\\\"$to\\\"] || changedAttributes[\\\"$scroll\\\"]) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t}\\n\\treturn this.refreshChildren(changedTiddlers);\\n};\\n\\n/*\\nInvoke the action associated with this widget\\n*/\\nNavigateWidget.prototype.invokeAction = function(triggeringWidget,event) {\\n\\tevent = event || {};\\n\\tvar bounds = triggeringWidget && triggeringWidget.getBoundingClientRect && triggeringWidget.getBoundingClientRect(),\\n\\t\\tsuppressNavigation = event.metaKey || event.ctrlKey || (event.button === 1);\\n\\tif(this.actionScroll === \\\"yes\\\") {\\n\\t\\tsuppressNavigation = false;\\n\\t} else if(this.actionScroll === \\\"no\\\") {\\n\\t\\tsuppressNavigation = true;\\n\\t}\\n\\tthis.dispatchEvent({\\n\\t\\ttype: \\\"tm-navigate\\\",\\n\\t\\tnavigateTo: this.actionTo === undefined ? this.getVariable(\\\"currentTiddler\\\") : this.actionTo,\\n\\t\\tnavigateFromTitle: this.getVariable(\\\"storyTiddler\\\"),\\n\\t\\tnavigateFromNode: triggeringWidget,\\n\\t\\tnavigateFromClientRect: bounds && { top: bounds.top, left: bounds.left, width: bounds.width, right: bounds.right, bottom: bounds.bottom, height: bounds.height\\n\\t\\t},\\n\\t\\tnavigateFromClientTop: bounds && bounds.top,\\n\\t\\tnavigateFromClientLeft: bounds && bounds.left,\\n\\t\\tnavigateFromClientWidth: bounds && bounds.width,\\n\\t\\tnavigateFromClientRight: bounds && bounds.right,\\n\\t\\tnavigateFromClientBottom: bounds && bounds.bottom,\\n\\t\\tnavigateFromClientHeight: bounds && bounds.height,\\n\\t\\tnavigateSuppressNavigation: suppressNavigation,\\n\\t\\tmetaKey: event.metaKey,\\n\\t\\tctrlKey: event.ctrlKey,\\n\\t\\taltKey: event.altKey,\\n\\t\\t
2731shiftKey: event.shiftKey,\\n\\t\\tevent: event\\n\\t});\\n\\treturn true; // Action was invoked\\n};\\n\\nexports[\\\"action-navigate\\\"] = NavigateWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/action-popup.js\":{\"title\":\"$:/core/modules/widgets/action-popup.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/action-popup.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nAction widget to trigger a popup.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar Popup = require(\\\"$:/core/modules/utils/dom/popup.js\\\");\\n\\nvar ActionPopupWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nActionPopupWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nActionPopupWidget.prototype.render = function(parent,nextSibling) {\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nActionPopupWidget.prototype.execute = function() {\\n\\tthis.actionState = this.getAttribute(\\\"$state\\\");\\n\\tthis.actionCoords = this.getAttribute(\\\"$coords\\\");\\n\\tthis.floating = this.getAttribute(\\\"$floating\\\",\\\"no\\\") === \\\"yes\\\";\\n};
2731\\n\\n/*\\nRefresh the widget by ensuring our attributes are up to date\\n*/\\nActionPopupWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes();\\n\\tif(changedAttributes[\\\"$state\\\"] || changedAttributes[\\\"$coords\\\"]) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t}\\n\\treturn this.refreshChildren(changedTiddlers);\\n};\\n\\n/*\\nInvoke the action associated with this widget\\n*/\\nActionPopupWidget.prototype.invokeAction = function(triggeringWidget,event) {\\n\\t// Trigger the popup\\n\\tvar coordinates = Popup.parseCoordinates(this.actionCoords || \\\"\\\");\\n\\tif(coordinates) {\\n\\t\\t$tw.popup.triggerPopup({\\n\\t\\t\\tdomNode: null,\\n\\t\\t\\tdomNodeRect: {\\n\\t\\t\\t\\tleft: coordinates.left,\\n\\t\\t\\t\\ttop: coordinates.top,\\n\\t\\t\\t\\twidth: coordinates.width,\\n\\t\\t\\t\\theight: coordinates.height\\n\\t\\t\\t},\\n\\t\\t\\ttitle: this.actionState,\\n\\t\\t\\twiki: this.wiki,\\n\\t\\t\\tfloating: this.floating,\\n\\t\\t\\tabsolute: coordinates.absolute\\n\\t\\t});\\n\\t} else {\\n\\t\\t$tw.popup.cancel(0);\\n\\t}\\n\\treturn true; // Action was invoked\\n};\\n\\nexports[\\\"action-popup\\\"] = ActionPopupWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/action-sendmessage.js\":{\"title\":\"$:/core/modules/widgets/action-sendmessage.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/action-sendmessage.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nAction widget to send a message\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar SendMessageWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nSendMessageWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nSendMessageWidget.prototype.render = function(parent,nextSibling) {\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nSendMessageWidget.prototype.execute = function() {\\n\\tthis.actionMessage = this.getAttribute(\\\"$message\\\");\\n\\tthis.actionParam = this.getAttribute(\\\"$param\\\");\\n\\tthis.actionName = this.getAttribute(\\\"$name\\\");\\n\\tthis.actionValue = this.getAttribute(\\\"$value\\\",\\\"\\\");\\n\\tthis.actionNames = this.getAttribute(\\\"$names\\\");\\n\\tthis.actionValues = this.getAttribute(\\\"$values\\\");\\n};\\n\\n/*\\nRefresh the widget by ensuring our attributes are up to date\\n*/\\nSendMessageWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes();\\n\\tif(Object.keys(changedAttributes).length) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t}\\n\\treturn this.refreshChildren(changedTiddlers);\\n};\\n\\n/*\\nInvoke the action associated with this widget\\n*/\\nSendMessageWidget.prototype.invokeAction = function(triggeringWidget,event) {\\n\\t// Get the string parameter\\n\\tvar param = this.actionParam;\\n\\t// Assemble the parameters as a hashmap\\n\\tvar paramObject = Object.create(null);\\n\\t// Add names/values pairs if present\\n\\tif(this.actionNames && this.actionValues) {\\n\\t\\tvar names = this.wiki.filterTiddlers(this.actionNames,this),\\n\\t\\t\\tvalues = this.wiki.filterTiddlers(this.actionValues,this);\\n\\t\\t$tw.utils.each(names,function(name,index) {\\n\\t\\t\\tparamObject[name] = values[index] || \\\"\\\";\\n\\t\\t});\\n\\t}\\n\\t// Add raw parameters\\n\\t$tw.utils.each(this.attributes,function(attribute,name) {\\n\\t\\tif(name.charAt(0) !== \\\"$\\\") {\\n\\t\\t\\tparamObject[name] = attribute;\\n\\t\\t}\\n\\t});\\n\\t// Add name/value pair if present\\n\\tif(this.actionName) {\\n\\t\\tparamObject[this.actionName] = this.actionValue;\\n\\t}\\n\\t// Dispatch the message\\n\\tvar params = {\\n\\t\\ttype: this.actionMessage,\\n\\t\\tparam: param,\\n\\t\\tparamObject: paramObject,\\n\\t\\tevent: event,\\n\\t\\ttiddlerTitle: this.getVariable(\\\"currentTiddler\\\"),\\n\\t\\tnavigateFromTitle: this.getVariable(\\\"storyTiddler\\\")\\n\\t};\\n\\tthis.dispatchEvent(params);\\n\\treturn true; // Action was invoked\\n};\\n\\nexports[\\\"action-sendmessage\\\"] = SendMessageWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/action-setfield.js\":{\"title\":\"$:/core/modules/widgets/action-setfield.js\",\"text\":\"/*\\\\\\ntitle: $
2731:/core/modules/widgets/action-setfield.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nAction widget to set a single field or index on a tiddler.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar SetFieldWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nSetFieldWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nSetFieldWidget.prototype.render = function(parent,nextSibling) {\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nSetFieldWidget.prototype.execute = function() {\\n\\tthis.actionTiddler = this.getAttribute(\\\"$tiddler\\\") || (!this.hasParseTreeNodeAttribute(\\\"$tiddler\\\") && this.getVariable(\\\"currentTiddler\\\"));\\n\\tthis.actionField = this.getAttribute(\\\"$field\\\");\\n\\tthis.actionIndex = this.getAttribute(\\\"$index\\\");\\n\\tthis.actionValue = this.getAttribute(\\\"$value\\\");\\n\\tthis.actionTimestamp = this.getAttribute(\\\"$timestamp\\\",\\\"yes\\\") === \\\"yes\\\";\\n};
2731\\n\\n/*\\nRefresh the widget by ensuring our attributes are up to date\\n*/\\nSetFieldWidget.prototype.refresh = function(changedTiddlers) {\\n\\t// Nothing to refresh\\n\\treturn this.refreshChildren(changedTiddlers);\\n};\\n\\n/*\\nInvoke the action associated with this widget\\n*/\\nSetFieldWidget.prototype.invokeAction = function(triggeringWidget,event) {\\n\\tvar self = this,\\n\\t\\toptions = {};\\n\\tif(this.actionTiddler) {\\n\\t\\toptions.suppressTimestamp = !this.actionTimestamp;\\n\\t\\tif((typeof this.actionField == \\\"string\\\") || (typeof this.actionIndex == \\\"string\\\")  || (typeof this.actionValue == \\\"string\\\")) {\\n\\t\\t\\tthis.wiki.setText(this.actionTiddler,this.actionField,this.actionIndex,this.actionValue,options);\\n\\t\\t}\\n\\t\\t$tw.utils.each(this.attributes,function(attribute,name) {\\n\\t\\t\\tif(name.charAt(0) !== \\\"$\\\") {\\n\\t\\t\\t\\tself.wiki.setText(self.actionTiddler,name,undefined,attribute,options);\\n\\t\\t\\t}\\n\\t\\t});\\n\\t}\\n\\treturn true; // Action was invoked\\n};\\n\\nexports[\\\"action-setfield\\\"] = SetFieldWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/action-setmultiplefields.js\":{\"title\":\"$:/core/modules/widgets/action-setmultiplefields.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/action-setmultiplefields.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nAction widget to set multiple fields or indexes on a tiddler\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar SetMultipleFieldsWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nSetMultipleFieldsWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nSetMultipleFieldsWidget.prototype.render = function(parent,nextSibling) {\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nSetMultipleFieldsWidget.prototype.execute = function() {\\n\\tthis.actionTiddler = this.getAttribute(\\\"$tiddler\\\",this.getVariable(\\\"currentTiddler\\\"));\\n\\tthis.actionFields = this.getAttribute(\\\"$fields\\\");\\n\\tthis.actionIndexes = this.getAttribute(\\\"$indexes\\\");\\n\\tthis.actionValues = this.getAttribute(\\\"$values\\\");\\n\\tthis.actionTimestamp = this.getAttribute(\\\"$timestamp\\\",\\\"yes\\\") === \\\"yes\\\";\\n};
2731\\n\\n/*\\nRefresh the widget by ensuring our attributes are up to date\\n*/\\nSetMultipleFieldsWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes();\\n\\tif(changedAttributes[\\\"$tiddler\\\"] || changedAttributes[\\\"$fields\\\"] || changedAttributes[\\\"$indexes\\\"] || changedAttributes[\\\"$values\\\"] || changedAttributes[\\\"$timestamp\\\"]) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t}\\n\\treturn this.refreshChildren(changedTiddlers);\\n};\\n\\n/*\\nInvoke the action associated with this widget\\n*/\\nSetMultipleFieldsWidget.prototype.invokeAction = function(triggeringWidget,event) {\\n\\tvar tiddler = this.wiki.getTiddler(this.actionTiddler),\\n\\t\\tnames, values = this.wiki.filterTiddlers(this.actionValues,this);\\n\\tif(this.actionFields) {\\n\\t\\tvar additions = {};\\n\\t\\tnames = this.wiki.filterTiddlers(this.actionFields,this);\\n\\t\\t$tw.utils.each(names,function(fieldname,index) {\\n\\t\\t\\tadditions[fieldname] = values[index] || \\\"\\\";\\n\\t\\t});\\n\\t\\tvar creationFields = this.actionTimestamp ? this.wiki.getCreationFields() : undefined,\\n\\t\\t\\tmodificationFields = this.actionTimestamp ? this.wiki.getModificationFields() : undefined;\\n\\t\\tthis.wiki.addTiddler(new $tw.Tiddler(creationFields,tiddler,{title: this.actionTiddler},modificationFields,additions));\\n\\t} else if(this.actionIndexes) {\\n\\t\\tvar data = this.wiki.getTiddlerData(this.actionTiddler,Object.create(null));\\n\\t\\tnames = this.wiki.filterTiddlers(this.actionIndexes,this);\\n\\t\\t$tw.utils.each(names,function(name,index) {\\n\\t\\t\\tdata[name] = values[index] || \\\"\\\";\\n\\t\\t});\\n\\t\\tthis.wiki.setTiddlerData(this.actionTiddler,data,{},{suppressTimestamp: !this.actionTimestamp});\\n\\t}\\n\\treturn true; // Action was invoked\\n};\\n\\nexports[\\\"action-setmultiplefields\\\"] = SetMultipleFieldsWidget;\\n\\n})();\\n\\t\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/browse.js\":{\"title\":\"$:/core/modules/widgets/browse.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/browse.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nBrowse widget for browsing for files to import\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar BrowseWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nBrowseWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nBrowseWidget.prototype.render = function(parent,nextSibling) {\\n\\tvar self = this;\\n\\t// Remember parent\\n\\tthis.parentDomNode = parent;\\n\\t// Compute attributes and execute state\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n\\t// Create element\\n\\tvar domNode = this.document.createElement(\\\"input\\\");\\n\\tdomNode.setAttribute(\\\"type\\\",\\\"file\\\");\\n\\tif(this.browseMultiple) {\\n\\t\\tdomNode.setAttribute(\\\"multiple\\\",\\\"multiple\\\");\\n\\t}\\n\\tif(this.tooltip) {\\n\\t\\tdomNode.setAttribute(\\\"title\\\",this.tooltip);\\n\\t}\\n\\t// Nw.js supports \\\"nwsaveas\\\" to force a \\\"save as\\\" dialogue that allows a new or existing file to be selected\\n\\tif(this.nwsaveas) {\\n\\t\\tdomNode.setAttribute(\\\"nwsaveas\\\",this.nwsaveas);\\n\\t}\\n\\tif(this.accept) {\\n\\t\\tdomNode.setAttribute(\\\"accept\\\",this.accept);\\n\\t}\\n\\t// Nw.js supports \\\"webkitdirectory\\\" and \\\"nwdirectory\\\" to allow a directory to be selected\\n\\tif(this.webkitdirectory) {\\n\\t\\tdomNode.setAttribute(\\\"webkitdirectory\\\",this.webkitdirectory);\\n\\t}\\n\\tif(this.nwdirectory) {\\n\\t\\tdomNode.setAttribute(\\\"nwdirectory\\\",this.nwdirectory);\\n\\t}\\n\\t// Add a click event handler\\n\\tdomNode.addEventListener(\\\"change\\\",function (event) {\\n\\t\\tif(self.message) {\\n\\t\\t\\tself.dispatchEvent({type: self.message, param: self.param, files: event.target.files});\\n\\t\\t} else {\\n\\t\\t\\tself.wiki.readFiles(event.target.files,{\\n\\t\\t\\t\\tcallback: function(tiddlerFieldsArray) {\\n\\t\\t\\t\\t\\tself.dis
2731patchEvent({type: \\\"tm-import-tiddlers\\\", param: JSON.stringify(tiddlerFieldsArray)});\\n\\t\\t\\t\\t},\\n\\t\\t\\t\\tdeserializer: self.deserializer\\n\\t\\t\\t});\\n\\t\\t}\\n\\t\\treturn false;\\n\\t},false);\\n\\t// Insert element\\n\\tparent.insertBefore(domNode,nextSibling);\\n\\tthis.renderChildren(domNode,null);\\n\\tthis.domNodes.push(domNode);\\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nBrowseWidget.prototype.execute = function() {\\n\\tthis.browseMultiple = this.getAttribute(\\\"multiple\\\");\\n\\tthis.deserializer = this.getAttribute(\\\"deserializer\\\");\\n\\tthis.message = this.getAttribute(\\\"message\\\");\\n\\tthis.param = this.getAttribute(\\\"param\\\");\\n\\tthis.tooltip = this.getAttribute(\\\"tooltip\\\");\\n\\tthis.nwsaveas = this.getAttribute(\\\"nwsaveas\\\");\\n\\tthis.accept = this.getAttribute(\\\"accept\\\");\\n\\tthis.webkitdirectory = this.getAttribute(\\\"webkitdirectory\\\");\\n\\tthis.nwdirectory = this.getAttribute(\\\"nwdirectory\\\");\\n};\\n\\n/*\\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n*/\\nBrowseWidget.prototype.refresh = function(changedTiddlers) {\\n\\treturn false;\\n};\\n\\nexports.browse = BrowseWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/button.js\":{\"title\":\"$:/core/modules/widgets/button.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/button.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nButton widget\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar Popup = require(\\\"$:/core/modules/utils/dom/popup.js\\\");\\n\\nvar ButtonWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nButtonWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nButtonWidget.prototype.render = function(parent,nextSibling) {\\n\\tvar self = this,\\n\\t\\ttag = \\\"button\\\",\\n\\t\\tdomNode;\\n\\t// Remember parent\\n\\tthis.parentDomNode = parent;\\n\\t// Compute attributes and execute state\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n\\t// Create element\\n\\tif(this.buttonTag && $tw.config.htmlUnsafeElements.indexOf(this.buttonTag) === -1) {\\n\\t\\ttag = this.buttonTag;\\n\\t}\\n\\tdomNode = this.document.createElement(tag);\\n\\tthis.domNode = domNode;\\n\\t// Assign classes\\n\\tvar classes = this[\\\"class\\\"].split(\\\" \\\") || [],\\n\\t\\tisPoppedUp = (this.popup || this.popupTitle) && this.isPoppedUp();\\n\\tif(this.selectedClass) {\\n\\t\\tif((this.set || this.setTitle) && this.setTo && this.isSelected()) {\\n\\t\\t\\t$tw.utils.pushTop(classes, this.selectedClass.split(\\\" \\\"));\\n\\t\\t\\tdomNode.setAttribute(\\\"aria-checked\\\", \\\"true\\\");\\n\\t\\t}\\n\\t\\tif(isPoppedUp) {\\n\\t\\t\\t$tw.utils.pushTop(classes,this.selectedClass.split(\\\" \\\"));\\n\\t\\t}\\n\\t}\\n\\tif(isPoppedUp) {\\n\\t\\t$tw.utils.pushTop(classes,\\\"tc-popup-handle\\\");\\n\\t}\\n\\tdomNode.className = classes.join(\\\" \\\");\\n\\t// Assign other attributes\\n\\tif(this.style) {\\n\\t\\tdomNode.setAttribute(\\\"style\\\",this.style);\\n\\t}\\n\\tif(this.tooltip) {\\n\\t\\tdomNode.setAttribute(\\\"title\\\",this.tooltip);\\n\\t}\\n\\tif(this[\\\"aria-label\\\"]) {\\n\\t\\tdomNode.setAttribute(\\\"aria-label\\\",this[\\\"aria-label\\\"]);\\n\\t}\\n\\tif (this.role) {\\n\\t\\tdomNode.setAttribute(\\\"role\\\", this.role);\\n\\t}\\n\\tif(this.popup || this.popupTitle) {\\n\\t\\tdomNode.setAttribute(\\\"aria-expanded\\\",isPoppedUp ? \\\"true\\\" : \\\"false\\\");\\n\\t}\\n\\t// Set the tabindex\\n\\tif(this.tabIndex) {\\n\\t\\tdomNode.setAttribute(\\\"tabindex\\\",this.tabIndex);\\n\\t}\\n\\tif(this.isDisabled === \\\"yes\\\") {\\n\\t\\tdomNode.setAttribute(\\\"disabled\\\",true);\\n\\t}\\n\\t// Add a click event handler\\n\\tdomNode.addEventListener(\\\"click\\\",function (event) {\\n\\t\\tvar handled = false;\\n\\t\\tif(self.invokeActions(self,event)) {\\n\\t\\t\\thandled = true;\\n\\t\\t}\\n\\t\\tif(self.to) {\\n\\t\\t\\tself.navigateTo(event);\\n\\t\\t\\thandled = true;\\n\\t\\t}
2731\\n\\t\\tif(self.message) {\\n\\t\\t\\tself.dispatchMessage(event);\\n\\t\\t\\thandled = true;\\n\\t\\t}\\n\\t\\tif(self.popup || self.popupTitle) {\\n\\t\\t\\tself.triggerPopup(event);\\n\\t\\t\\thandled = true;\\n\\t\\t}\\n\\t\\tif(self.set || self.setTitle) {\\n\\t\\t\\tself.setTiddler();\\n\\t\\t\\thandled = true;\\n\\t\\t}\\n\\t\\tif(self.actions) {\\n\\t\\t\\tvar modifierKey = $tw.keyboardManager.getEventModifierKeyDescriptor(event);\\n\\t\\t\\tself.invokeActionString(self.actions,self,event,{modifier: modifierKey});\\n\\t\\t}\\n\\t\\tif(handled) {\\n\\t\\t\\tevent.preventDefault();\\n\\t\\t\\tevent.stopPropagation();\\n\\t\\t}\\n\\t\\treturn handled;\\n\\t},false);\\n\\t// Make it draggable if required\\n\\tif(this.dragTiddler || this.dragFilter) {\\n\\t\\t$tw.utils.makeDraggable({\\n\\t\\t\\tdomNode: domNode,\\n\\t\\t\\tdragTiddlerFn: function() {return self.dragTiddler;},\\n\\t\\t\\tdragFilterFn: function() {return self.dragFilter;},\\n\\t\\t\\twidget: this\\n\\t\\t});\\n\\t}\\n\\t// Insert element\\n\\tparent.insertBefore(domNode,nextSibling);\\n\\tthis.renderChildren(domNode,null);\\n\\tthis.domNodes.push(domNode);\\n};\\n\\n/*\\nWe don't allow actions to propagate because we trigger actions ourselves\\n*/\\nButtonWidget.prototype.allowActionPropagation = function() {\\n\\treturn false;\\n};\\n\\nButtonWidget.prototype.getBoundingClientRect = function() {\\n\\treturn this.domNodes[0].getBoundingClientRect();\\n};\\n\\nButtonWidget.prototype.isSelected = function() {\\n    return this.setTitle ? (this.setField ? this.wiki.getTiddler(this.setTitle).getFieldString(this.setField) === this.setTo :\\n\\t\\t(this.setIndex ? this.wiki.extractTiddlerDataItem(this.setTitle,this.setIndex) === this.setTo :\\n\\t\\t\\tthis.wiki.getTiddlerText(this.setTitle))) || this.defaultSetValue || this.getVariable(\\\"currentTiddler\\\") :\\n\\t\\tthis.wiki.getTextReference(this.set,this.defaultSetValue,this.getVariable(\\\"currentTiddler\\\")) === this.setTo;\\n};\\n\\nButtonWidget.prototype.isPoppedUp = function() {\\n\\tvar tiddler = this.popupTitle ? this.wiki.getTiddler(this.popupTitle) : this.wiki.getTiddler(this.popup);\\n\\tvar result = tiddler && tiddler.fields.text ? Popup.readPopupState(tiddler.fields.text) : false;\\n\\treturn result;\\n};\\n\\nButtonWidget.prototype.navigateTo = function(event) {\\n\\tvar bounds = this.getBoundingClientRect();\\n\\tthis.dispatchEvent({\\n\\t\\ttype: \\\"tm-navigate\\\",\\n\\t\\tnavigateTo: this.to,\\n\\t\\tnavigateFromTitle: this.getVariable(\\\"storyTiddler\\\"),\\n\\t\\tnavigateFromNode: this,\\n\\t\\tnavigateFromClientRect: { top: bounds.top, left: bounds.left, width: bounds.width, right: bounds.right, bottom: bounds.bottom, height: bounds.height\\n\\t\\t},\\n\\t\\tnavigateSuppressNavigation: event.metaKey || event.ctrlKey || (event.button === 1),\\n\\t\\tevent: event\\n\\t});\\n};\\n\\nButtonWidget.prototype.dispatchMessage = function(event) {\\n\\tthis.dispatchEvent({type: this.message, param: this.param, tiddlerTitle: this.getVariable(\\\"currentTiddler\\\"), event: event});\\n};\\n\\nButtonWidget.prototype.triggerPopup = function(event) {\\n\\tif(this.popupTitle) {\\n\\t\\t$tw.popup.triggerPopup({\\n\\t\\t\\tdomNode: this.domNodes[0],\\n\\t\\t\\tabsolute: (this.popupAbsCoords === \\\"yes\\\"),\\n\\t\\t\\ttitle: this.popupTitle,\\n\\t\\t\\twiki: this.wiki,\\n\\t\\t\\tnoStateReference: true\\n\\t\\t});\\n\\t} else {\\n\\t\\t$tw.popup.triggerPopup({\\n\\t\\t\\tdomNode: this.domNodes[0],\\n\\t\\t\\tabsolute: (this.popupAbsCoords === \\\"yes\\\"),\\n\\t\\t\\ttitle: this.popup,\\n\\t\\t\\twiki: this.wiki\\n\\t\\t});\\n\\t}\\n};\\n\\nButtonWidget.prototype.setTiddler = function() {\\n\\tif(this.setTitle) {\\n\\t\\tthis.setField ? this.wiki.setText(this.setTitle,this.setField,undefined,this.setTo) :\\n\\t\\t\\t\\t(this.setIndex ? this.wiki.setText(this.setTitle,undefined,this.setIndex,this.setTo) :\\n\\t\\t\\t\\tthis.wiki.setText(this.setTitle,\\\"text\\\",undefined,this.setTo));\\n\\t} else {\\n\\t\\tthis.wiki.setTextReference(this.set,this.setTo,this.getVariable(\\\"currentTiddler\\\"));\\n\\t}\\n};
2731\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nButtonWidget.prototype.execute = function() {\\n\\t// Get attributes\\n\\tthis.actions = this.getAttribute(\\\"actions\\\");\\n\\tthis.to = this.getAttribute(\\\"to\\\");\\n\\tthis.message = this.getAttribute(\\\"message\\\");\\n\\tthis.param = this.getAttribute(\\\"param\\\");\\n\\tthis.set = this.getAttribute(\\\"set\\\");\\n\\tthis.setTo = this.getAttribute(\\\"setTo\\\");\\n\\tthis.popup = this.getAttribute(\\\"popup\\\");\\n\\tthis.hover = this.getAttribute(\\\"hover\\\");\\n\\tthis[\\\"aria-label\\\"] = this.getAttribute(\\\"aria-label\\\");\\n\\tthis.role = this.getAttribute(\\\"role\\\");\\n\\tthis.tooltip = this.getAttribute(\\\"tooltip\\\");\\n\\tthis.style = this.getAttribute(\\\"style\\\");\\n\\tthis[\\\"class\\\"] = this.getAttribute(\\\"class\\\",\\\"\\\");\\n\\tthis.selectedClass = this.getAttribute(\\\"selectedClass\\\");\\n\\tthis.defaultSetValue = this.getAttribute(\\\"default\\\",\\\"\\\");\\n\\tthis.buttonTag = this.getAttribute(\\\"tag\\\");\\n\\tthis.dragTiddler = this.getAttribute(\\\"dragTiddler\\\");\\n\\tthis.dragFilter = this.getAttribute(\\\"dragFilter\\\");\\n\\tthis.setTitle = this.getAttribute(\\\"setTitle\\\");\\n\\tthis.setField = this.getAttribute(\\\"setField\\\");\\n\\tthis.setIndex = this.getAttribute(\\\"setIndex\\\");\\n\\tthis.popupTitle = this.getAttribute(\\\"popupTitle\\\");\\n\\tthis.popupAbsCoords = this.getAttribute(\\\"popupAbsCoords\\\", \\\"no\\\");\\n\\tthis.tabIndex = this.getAttribute(\\\"tabindex\\\");\\n\\tthis.isDisabled = this.getAttribute(\\\"disabled\\\",\\\"no\\\");\\n\\t// Make child widgets\\n\\tthis.makeChildWidgets();\\n};\\n\\nButtonWidget.prototype.updateDomNodeClasses = function() {\\n\\tvar domNodeClasses = this.domNode.className.split(\\\" \\\"),\\n\\t\\toldClasses = this.class.split(\\\" \\\"),\\n\\t\\tnewClasses;\\n\\tthis[\\\"class\\\"] = this.getAttribute(\\\"class\\\",\\\"\\\");\\n\\tnewClasses = this.class.split(\\\" \\\");\\n\\t//Remove classes assigned from the old value of class attribute\\n\\t$tw.utils.each(oldClasses,function(oldClass){\\n\\t\\tvar i = domNodeClasses.indexOf(oldClass);\\n\\t\\tif(i !== -1) {\\n\\t\\t\\tdomNodeClasses.splice(i,1);\\n\\t\\t}\\n\\t});\\n\\t//Add new classes from updated class attribute.\\n\\t$tw.utils.pushTop(domNodeClasses,newClasses);\\n\\tthis.domNode.className = domNodeClasses.join(\\\" \\\");\\n}\\n\\n/*\\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n*/\\nButtonWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes();\\n\\tif(changedAttributes.actions || changedAttributes.to || changedAttributes.message || changedAttributes.param || changedAttributes.set || changedAttributes.setTo || changedAttributes.popup || changedAttributes.hover || changedAttributes.selectedClass || changedAttributes.style || changedAttributes.dragFilter || changedAttributes.dragTiddler || (this.set && changedTiddlers[this.set]) || (this.popup && changedTiddlers[this.popup]) || (this.popupTitle && changedTiddlers[this.popupTitle]) || changedAttributes.popupAbsCoords || changedAttributes.setTitle || changedAttributes.setField || changedAttributes.setIndex || changedAttributes.popupTitle || changedAttributes.disabled || changedAttributes[\\\"default\\\"]) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t} else if(changedAttributes[\\\"class\\\"]) {\\n\\t\\tthis.updateDomNodeClasses();\\n\\t}\\n\\treturn this.refreshChildren(changedTiddlers);\\n};\\n\\nexports.button = ButtonWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/checkbox.js\":{\"title\":\"$:/core/modules/widgets/checkbox.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/checkbox.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nCheckbox widget\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar CheckboxWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};
2731\\n\\n/*\\nInherit from the base widget class\\n*/\\nCheckboxWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nCheckboxWidget.prototype.render = function(parent,nextSibling) {\\n\\tvar isChecked;\\n\\t// Save the parent dom node\\n\\tthis.parentDomNode = parent;\\n\\t// Compute our attributes\\n\\tthis.computeAttributes();\\n\\t// Execute our logic\\n\\tthis.execute();\\n\\t// Create our elements\\n\\tthis.labelDomNode = this.document.createElement(\\\"label\\\");\\n\\tthis.labelDomNode.setAttribute(\\\"class\\\",\\\"tc-checkbox \\\" + this.checkboxClass);\\n\\tthis.inputDomNode = this.document.createElement(\\\"input\\\");\\n\\tthis.inputDomNode.setAttribute(\\\"type\\\",\\\"checkbox\\\");\\n\\tisChecked = this.getValue();\\n\\tif(isChecked) {\\n\\t\\tthis.inputDomNode.setAttribute(\\\"checked\\\",\\\"true\\\");\\n\\t\\t$tw.utils.addClass(this.labelDomNode,\\\"tc-checkbox-checked\\\");\\n\\t}\\n\\tif(isChecked === undefined && this.checkboxIndeterminate === \\\"yes\\\") {\\n\\t\\tthis.inputDomNode.indeterminate = true;\\n\\t}\\n\\tif(this.isDisabled === \\\"yes\\\") {\\n\\t\\tthis.inputDomNode.setAttribute(\\\"disabled\\\",true);\\n\\t}\\n\\tthis.labelDomNode.appendChild(this.inputDomNode);\\n\\tthis.spanDomNode = this.document.createElement(\\\"span\\\");\\n\\tthis.labelDomNode.appendChild(this.spanDomNode);\\n\\t// Add a click event handler\\n\\t$tw.utils.addEventListeners(this.inputDomNode,[\\n\\t\\t{name: \\\"change\\\", handlerObject: this, handlerMethod: \\\"handleChangeEvent\\\"}\\n\\t]);\\n\\t// Insert the label into the DOM and render any children\\n\\tparent.insertBefore(this.labelDomNode,nextSibling);\\n\\tthis.renderChildren(this.spanDomNode,null);\\n\\tthis.domNodes.push(this.labelDomNode);\\n};\\n\\nCheckboxWidget.prototype.getValue = function() {\\n\\tvar tiddler = this.wiki.getTiddler(this.checkboxTitle);\\n\\tif(tiddler || this.checkboxFilter) {\\n\\t\\tif(tiddler && this.checkboxTag) {\\n\\t\\t\\tif(this.checkboxInvertTag === \\\"yes\\\") {\\n\\t\\t\\t\\treturn !tiddler.hasTag(this.checkboxTag);\\n\\t\\t\\t} else {\\n\\t\\t\\t\\treturn tiddler.hasTag(this.checkboxTag);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tif(tiddler && (this.checkboxField || this.checkboxIndex)) {\\n\\t\\t\\t// Same logic applies to fields and indexes\\n\\t\\t\\tvar value;\\n\\t\\t\\tif(this.checkboxField) {\\n\\t\\t\\t\\tif($tw.utils.hop(tiddler.fields,this.checkboxField)) {\\n\\t\\t\\t\\t\\tvalue = tiddler.fields[this.checkboxField] || \\\"\\\";\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tvalue = this.checkboxDefault || \\\"\\\";\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tvalue = this.wiki.extractTiddlerDataItem(tiddler,this.checkboxIndex,this.checkboxDefault || \\\"\\\");\\n\\t\\t\\t}\\n\\t\\t\\tif(value === this.checkboxChecked) {\\n\\t\\t\\t\\treturn true;\\n\\t\\t\\t}\\n\\t\\t\\tif(value === this.checkboxUnchecked) {\\n\\t\\t\\t\\treturn false;\\n\\t\\t\\t}\\n\\t\\t\\t// Neither value found: were both specified?\\n\\t\\t\\tif(this.checkboxChecked && !this.checkboxUnchecked) {\\n\\t\\t\\t\\treturn false; // Absence of checked value\\n\\t\\t\\t}\\n\\t\\t\\tif(this.checkboxUnchecked && !this.checkboxChecked) {\\n\\t\\t\\t\\treturn true; // Absence of unchecked value\\n\\t\\t\\t}\\n\\t\\t\\tif(this.checkboxChecked && this.checkboxUnchecked) {\\n\\t\\t\\t\\t// Both specified but neither found: indeterminate or false, depending\\n\\t\\t\\t\\tif(this.checkboxIndeterminate === \\\"yes\\\") {\\n\\t\\t\\t\\t\\treturn undefined;\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\treturn false;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tif(this.checkboxListField || this.checkboxListIndex || this.checkboxFilter) {\\n\\t\\t\\t// Same logic applies to lists and filters\\n\\t\\t\\tvar list;\\n\\t\\t\\tif(this.checkboxListField) {\\n\\t\\t\\t\\tif($tw.utils.hop(tiddler.fields,this.checkboxListField)) {\\n\\t\\t\\t\\t\\tlist = tiddler.getFieldList(this.checkboxListField) || [];\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tlist = $tw.utils.parseStringArray(this.checkboxDefault || \\\"\\\") || [];\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else if(this.checkboxListIndex) {\\n\\t\\t\\t\\tlist = $tw.utils.parseStringArray(this.wiki.extractTiddlerDataItem(tiddler,this.checkboxListIndex,this.checkboxDefault || \\\"\\\")) || [];\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tlist = this.wiki.filterTiddlers(this.checkboxFilter,this) || [];\\n\\t\\t\\t}\\n\\t\\t\\tif(list.indexOf(this.checkboxChecked) !== -1) {\\n\\t\\t\\t\\treturn true;\\n\\t\\t\\t}\\n\\t\\t\\tif(list.indexOf(this.checkboxUnchecked) !== -1) {\\n\\t\\t\\t\\treturn false;\\n\\t\\t\\t}\\n\\t\\t\\t// Neither one present\\n\\t\\t\\tif(this.checkboxChecked && !this.checkboxUnchecked) {\\n\\t\\t\\t\\treturn false; // Absence of checked value\\n\\t\\t\\t}\\n\\t\\t\\tif(this.checkboxUnchecked && !this.checkboxChecked) {\\n\\t\\t\\t\\treturn true; // Absence of unchecked value\\n\\t\\t\\t}\\n\\t\\t\\tif(this.checkboxChecked && this.checkboxUnchecked) {\\n\\t\\t\\t\\t// Both specified but neither found: indeterminate or false, depending\\n\\t\\t\\t\\tif(this.checkboxIndeterminate === \\\"yes\\\") {\\n\\t\\t\\t\\t\\treturn undefined;\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\treturn false;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\t// Neither specified, so empty list is false, non-empty is true\\n\\t\\t\\treturn !!list.length;\\n\\t\\t}\\n\\t} else {\\n\\t\\tif(this.checkboxTag) {\\n\\t\\t\\treturn false;\\n\\t\\t}\\n\\t\\tif(this.checkboxField) {\\n\\t\\t\\tif(this.checkboxDefault === this.checkboxChecked) {\\n\\t\\t\\t\\treturn true;\\n\\t\\t\\t}\\n\\t\\t\\tif(this.checkboxDefault === this.checkboxUnchecked) {\\n\\t\\t\\t\\treturn false;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\treturn false;\\n};\\n\\nCheckboxWidget.prototype.handleChangeEvent = function(event) {\\n\\tvar checked = this.inputDomNode.checked,\\n\\t\\ttiddler = this.wiki.getTiddler(this.checkboxTitle),\\n\\t\\tfallbackFields = {text: \\\"\\\"},\\n\\t\\tnewFields = {title: this.checkboxTitle},\\n\\t\\thasChanged = false,\\n\\t\\ttagCheck = false,\\n\\t\\thasTag = tiddler && tiddler.hasTag(this.checkboxTag),\\n\\t\\tvalue = checked ? this.checkboxChecked : this.checkboxUnchecked,\\n\\t\\tnotValue = checked ? this.checkboxUnchecked : this.checkboxChecked;\\n\\tif(this.checkboxTag && this.checkboxInvertTag === \\\"yes\\\") {\\n\\t\\ttagCheck = hasTag === checked;\\n\\t} else {\\n\\t\\ttagCheck = hasTag !== checked;\\n\\t}\\n\\t// Set the tag if specified\\n\\tif(this.checkboxTag && (!tiddler || tagCheck)) {\\n\\t\\tnewFields.tags = tiddler ? (tiddler.fields.tags || []).slice(0) : [];\\n\\t\\tvar pos = newFields.tags.indexOf(this.checkboxTag);\\n\\t\\tif(pos !== -1) {\\n\\t\\t\\tnewFields.tags.splice(pos,1);\\n\\t\\t}\\n\\t\\tif(this.checkboxInvertTag === \\\"yes\\\" && !checked) {\\n\\t\\t\\tnewFields.tags.push(this.checkboxTag);\\n\\t\\t} else if(this.checkboxInvertTag !== \\\"yes\\\" && checked) {\\n\\t\\t\\tnewFields.tags.push(this.checkboxTag);\\n\\t\\t}\\n\\t\\thasChanged = true;\\n\\t}\\n\\t// Set the field if specified\\n\\tif(this.checkboxField) {\\n\\t\\tif(!tiddler || tiddler.fields[this.checkboxField] !== value) {\\n\\t\\t\\tnewFields[this.checkboxField] = value;\\n\\t\\t\\thasChanged = true;\\n\\t\\t}\\n\\t}\\n\\t// Set the index if specified\\n\\tif(this.checkboxIndex) {\\n\\t\\tvar indexValue = this.wiki.extractTiddlerDataItem(this.checkboxTitle,this.checkboxIndex);\\n\\t\\tif(!tiddler || indexValue !== value) {\\n\\t\\t\\thasChanged = true;\\n\\t\\t}\\n\\t}\\n\\t// Set the list field (or index) if specified\\n\\tif(this.checkboxListField || this.checkboxListIndex) {\\n\\t\\tvar fieldContents, listContents, oldPos, newPos;\\n\\t\\tif(this.checkboxListField) {\\n\\t\\t\\tfieldContents = (tiddler ? tiddler.fields[this.checkboxListField] : undefined) || [];\\n\\t\\t} else {\\n\\t\\t\\tfieldContents = this.wiki.extractTiddlerDataItem(this.checkboxTitle,this.checkboxListIndex);\\n\\t\\t}\\n\\t\\tif($tw.utils.isArray(fieldContents)) {\\n\\t\\t\\t// Make a copy so we can modify it without changing original that's refrenced elsewhere\\n\\t\\t\\tlistContents = fieldContents.slice(0);\\n\\t\\t} else if(fieldContents === undefined) {\\n\\t\\t\\tlistContents = [];\\n\\t\\t} else if(typeof fieldContents === \\\"string\\\") {\\n\\t\\t\\tlistContents = $tw.utils.parseStringArray(fieldContents);\\n\\t\\t\\t// No need to copy since parseStringArray returns a fresh array, not refrenced elsewhere\\n\\t\\t} else {\\n\\t\\t\\t// Field was neither an array nor a string; it's probably something that shouldn't become\\n\\t\\t\\t// an array (such as a date field), so bail out *without* triggering actions\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\t\\toldPos = notValue ? listContents.indexOf(notValue) : -1;\\n\\t\\tnewPos = value ? listContents.indexOf(value) : -1;\\n\\t\\tif(oldPos === -1 && newPos !== -1) {\\n\\t\\t\\t// old value absent, new value present: no change needed\\n\\t\\t} else if(oldPos === -1) {\\n\\t\\t\\t// neither one was present\\n\\t\\t\\tif(value) {\\n\\t\\t\\t\\tlistContents.push(value);\\n\\t\\t\\t\\thasChanged = true;\\n\\t\\t\\t} else {\\n\\t\\t\\t\\t// value unspecified? then leave list unchanged\\n\\t\\t\\t}\\n\\t\\t} else if(newPos === -1) {\\n\\t\\t\\t// old value present, new value absent\\n\\t\\t\\tif(value) {\\n\\t\\t\\t\\tlistContents[oldPos] = value;\\n\\t\\t\\t\\thasChanged = true;\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tlistContents.splice(oldPos, 1)\\n\\t\\t\\t\\thasChanged = true;\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\t\\t\\t// both were present: just remove the old one, leave new alone\\n\\t\\t\\tlistContents.splice(oldPos, 1)\\n\\t\\t\\thasChanged = true;\\n\\t\\t}\\n\\t\\tif(this.checkboxListField) {\\n\\t\\t\\tnewFields[this.checkboxListField] = $tw.utils.stringifyList(listContents);\\n\\t\\t}\\n\\t\\t// The listIndex case will be handled in the if(hasChanged) block below\\n\\t}\\n\\tif(hasChanged) {\\n\\t\\tif(this.checkboxIndex) {\\n\\t\\t\\tthis.wiki.setText(this.checkboxTitle,\\\"\\\",this.checkboxIndex,value);\\n\\t\\t} else if(this.checkboxListIndex) {\\n\\t\\t\\tvar listIndexValue = (listContents && listContents.length) ? $tw.utils.stringifyList(listContents) : undefined;\\n\\t\\t\\tthis.wiki.setText(this.checkboxTitle,\\\"\\\",this.checkboxListIndex,listIndexValue);\\n\\t\\t} else {\\n\\t\\t\\tthis.wiki.addTiddler(new $tw.Tiddler(this.wiki.getCreationFields(),fallbackFields,tiddler,newFields,this.wiki.getModificationFields()));\\n\\t\\t}\\n\\t}\\n\\t// Trigger actions\\n\\tif(this.checkboxActions) {\\n\\t\\tthis.invokeActionString(this.checkboxActions,this,event);\\n\\t}\\n\\tif(this.checkboxCheckActions && checked) {\\n\\t\\tthis.invokeActionString(this.checkboxCheckActions,this,event);\\n\\t}
2731\\n\\tif(this.checkboxUncheckActions && !checked) {\\n\\t\\tthis.invokeActionString(this.checkboxUncheckActions,this,event);\\n\\t}\\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nCheckboxWidget.prototype.execute = function() {\\n\\t// Get the parameters from the attributes\\n\\tthis.checkboxActions = this.getAttribute(\\\"actions\\\");\\n\\tthis.checkboxCheckActions = this.getAttribute(\\\"checkactions\\\");\\n\\tthis.checkboxUncheckActions = this.getAttribute(\\\"uncheckactions\\\");\\n\\tthis.checkboxTitle = this.getAttribute(\\\"tiddler\\\",this.getVariable(\\\"currentTiddler\\\"));\\n\\tthis.checkboxTag = this.getAttribute(\\\"tag\\\");\\n\\tthis.checkboxField = this.getAttribute(\\\"field\\\");\\n\\tthis.checkboxIndex = this.getAttribute(\\\"index\\\");\\n\\tthis.checkboxListField = this.getAttribute(\\\"listField\\\");\\n\\tthis.checkboxListIndex = this.getAttribute(\\\"listIndex\\\");\\n\\tthis.checkboxFilter = this.getAttribute(\\\"filter\\\");\\n\\tthis.checkboxChecked = this.getAttribute(\\\"checked\\\");\\n\\tthis.checkboxUnchecked = this.getAttribute(\\\"unchecked\\\");\\n\\tthis.checkboxDefault = this.getAttribute(\\\"default\\\");\\n\\tthis.checkboxIndeterminate = this.getAttribute(\\\"indeterminate\\\",\\\"no\\\");\\n\\tthis.checkboxClass = this.getAttribute(\\\"class\\\",\\\"\\\");\\n\\tthis.checkboxInvertTag = this.getAttribute(\\\"invertTag\\\",\\\"\\\");\\n\\tthis.isDisabled = this.getAttribute(\\\"disabled\\\",\\\"no\\\");\\n\\t// Make the child widgets\\n\\tthis.makeChildWidgets();\\n};\\n\\n/*\\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n*/\\nCheckboxWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes();\\n\\tif(changedAttributes.tiddler || changedAttributes.tag || changedAttributes.invertTag || changedAttributes.field || changedAttributes.index || changedAttributes.listField || changedAttributes.listIndex || changedAttributes.filter || changedAttributes.checked || changedAttributes.unchecked || changedAttributes[\\\"default\\\"] || changedAttributes.indeterminate || changedAttributes[\\\"class\\\"] || changedAttributes.disabled) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t} else {\\n\\t\\tvar refreshed = false;\\n\\t\\tif(changedTiddlers[this.checkboxTitle]) {\\n\\t\\t\\tvar isChecked = this.getValue();\\n\\t\\t\\tthis.inputDomNode.checked = !!isChecked;\\n\\t\\t\\tthis.inputDomNode.indeterminate = (isChecked === undefined);\\n\\t\\t\\trefreshed = true;\\n\\t\\t\\tif(isChecked) {\\n\\t\\t\\t\\t$tw.utils.addClass(this.labelDomNode,\\\"tc-checkbox-checked\\\");\\n\\t\\t\\t} else {\\n\\t\\t\\t\\t$tw.utils.removeClass(this.labelDomNode,\\\"tc-checkbox-checked\\\");\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\treturn this.refreshChildren(changedTiddlers) || refreshed;\\n\\t}\\n};\\n\\nexports.checkbox = CheckboxWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/codeblock.js\":{\"title\":\"$:/core/modules/widgets/codeblock.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/codeblock.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nCode block node widget\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar CodeBlockWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nCodeBlockWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nCodeBlockWidget.prototype.render = function(parent,nextSibling) {\\n\\tthis.parentDomNode = parent;\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n\\tvar codeNode = this.document.createElement(\\\"code\\\"),\\n\\t\\tdomNode = this.document.createElement(\\\"pre\\\");\\n\\tcodeNode.appendChild(this.document.createTextNode(this.getAttribute(\\\"code\\\")));\\n\\tdomNode.appendChild(codeNode);\\n\\tparent.insertBefore(domNode,nextSibling);\\n\\tthis.domNodes.push(domNode);\\n\\tif(this.postRender) {\\n\\t\\tthis.postRender();\\n\\t}\\n};
2731\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nCodeBlockWidget.prototype.execute = function() {\\n\\tthis.language = this.getAttribute(\\\"language\\\");\\n};\\n\\n/*\\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n*/\\nCodeBlockWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes();\\n\\tif(changedAttributes.code || changedAttributes.language) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t} else {\\n\\t\\treturn false;\\n\\t}\\n};\\n\\nexports.codeblock = CodeBlockWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/count.js\":{\"title\":\"$:/core/modules/widgets/count.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/count.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nCount widget\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar CountWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nCountWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nCountWidget.prototype.render = function(parent,nextSibling) {\\n\\tthis.parentDomNode = parent;\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n\\tvar textNode = this.document.createTextNode(this.currentCount);\\n\\tparent.insertBefore(textNode,nextSibling);\\n\\tthis.domNodes.push(textNode);\\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nCountWidget.prototype.execute = function() {\\n\\t// Get parameters from our attributes\\n\\tthis.filter = this.getAttribute(\\\"filter\\\");\\n\\t// Execute the filter\\n\\tif(this.filter) {\\n\\t\\tthis.currentCount = this.wiki.filterTiddlers(this.filter,this).length;\\n\\t} else {\\n\\t\\tthis.currentCount = \\\"0\\\";\\n\\t}\\n};\\n\\n/*\\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n*/\\nCountWidget.prototype.refresh = function(changedTiddlers) {\\n\\t// Re-execute the filter to get the count\\n\\tthis.computeAttributes();\\n\\tvar oldCount = this.currentCount;\\n\\tthis.execute();\\n\\tif(this.currentCount !== oldCount) {\\n\\t\\t// Regenerate and rerender the widget and replace the existing DOM node\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t} else {\\n\\t\\treturn false;\\n\\t}\\n\\n};\\n\\nexports.count = CountWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/diff-text.js\":{\"title\":\"$:/core/modules/widgets/diff-text.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/diff-text.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nWidget to display a diff between two texts\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget,\\n\\tdmp = require(\\\"$:/core/modules/utils/diff-match-patch/diff_match_patch.js\\\");\\n\\nvar DiffTextWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nDiffTextWidget.prototype = new Widget();\\n\\nDiffTextWidget.prototype.invisibleCharacters = {\\n\\t\\\"\\\\n\\\": \\\"↩︎\\\\n\\\",\\n\\t\\\"\\\\r\\\": \\\"⇠\\\",\\n\\t\\\"\\\\t\\\": \\\"⇥\\\\t\\\"\\n};\\n\\n/*\\nRender this widget into the DOM\\n*/\\nDiffTextWidget.prototype.render = function(parent,nextSibling) {\\n\\tthis.parentDomNode = parent;\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n\\t// Create the diff\\n\\tvar dmpObject = new dmp.diff_match_patch(),\\n\\t\\tdiffs = dmpObject.diff_main(this.getAttribute(\\\"source\\\",\\\"\\\"),this.getAttribute(\\\"dest\\\",\\\"\\\"));\\n\\t// Apply required cleanup\\n\\tswitch(this.getAttribute(\\\"cleanup\\\",\\\"semantic\\\")) {\\n\\t\\tcase \\\"none\\\":\\n\\t\\t\\t// No cleanup\\n\\t\\t\\tbreak;
2731\\n\\t\\tcase \\\"efficiency\\\":\\n\\t\\t\\tdmpObject.diff_cleanupEfficiency(diffs);\\n\\t\\t\\tbreak;\\n\\t\\tdefault: // case \\\"semantic\\\"\\n\\t\\t\\tdmpObject.diff_cleanupSemantic(diffs);\\n\\t\\t\\tbreak;\\n\\t}\\n\\t// Create the elements\\n\\tvar domContainer = this.document.createElement(\\\"div\\\"), \\n\\t\\tdomDiff = this.createDiffDom(diffs);\\n\\tparent.insertBefore(domContainer,nextSibling);\\n\\t// Set variables\\n\\tthis.setVariable(\\\"diff-count\\\",diffs.reduce(function(acc,diff) {\\n\\t\\tif(diff[0] !== dmp.DIFF_EQUAL) {\\n\\t\\t\\tacc++;\\n\\t\\t}\\n\\t\\treturn acc;\\n\\t},0).toString());\\n\\t// Render child widgets\\n\\tthis.renderChildren(domContainer,null);\\n\\t// Render the diff\\n\\tdomContainer.appendChild(domDiff);\\n\\t// Save our container\\n\\tthis.domNodes.push(domContainer);\\n};\\n\\n/*\\nCreate DOM elements representing a list of diffs\\n*/\\nDiffTextWidget.prototype.createDiffDom = function(diffs) {\\n\\tvar self = this;\\n\\t// Create the element and assign the attributes\\n\\tvar domPre = this.document.createElement(\\\"pre\\\"),\\n\\t\\tdomCode = this.document.createElement(\\\"code\\\");\\n\\t$tw.utils.each(diffs,function(diff) {\\n\\t\\tvar tag = diff[0] === dmp.DIFF_INSERT ? \\\"ins\\\" : (diff[0] === dmp.DIFF_DELETE ? \\\"del\\\" : \\\"span\\\"),\\n\\t\\t\\tclassName = diff[0] === dmp.DIFF_INSERT ? \\\"tc-diff-insert\\\" : (diff[0] === dmp.DIFF_DELETE ? \\\"tc-diff-delete\\\" : \\\"tc-diff-equal\\\"),\\n\\t\\t\\tdom = self.document.createElement(tag),\\n\\t\\t\\ttext = diff[1],\\n\\t\\t\\tcurrPos = 0,\\n\\t\\t\\tre = /([\\\\x00-\\\\x1F])/mg,\\n\\t\\t\\tmatch = re.exec(text),\\n\\t\\t\\tspan,\\n\\t\\t\\tprintable;\\n\\t\\tdom.className = className;\\n\\t\\twhile(match) {\\n\\t\\t\\tif(currPos \u003C match.index) {\\n\\t\\t\\t\\tdom.appendChild(self.document.createTextNode(text.slice(currPos,match.index)));\\n\\t\\t\\t}\\n\\t\\t\\tspan = self.document.createElement(\\\"span\\\");\\n\\t\\t\\tspan.className = \\\"tc-diff-invisible\\\";\\n\\t\\t\\tprintable = self.invisibleCharacters[match[0]] || (\\\"[0x\\\" + match[0].charCodeAt(0).toString(16) + \\\"]\\\");\\n\\t\\t\\tspan.appendChild(self.document.createTextNode(printable));\\n\\t\\t\\tdom.appendChild(span);\\n\\t\\t\\tcurrPos = match.index + match[0].length;\\n\\t\\t\\tmatch = re.exec(text);\\n\\t\\t}\\n\\t\\tif(currPos \u003C text.length) {\\n\\t\\t\\tdom.appendChild(self.document.createTextNode(text.slice(currPos)));\\n\\t\\t}\\n\\t\\tdomCode.appendChild(dom);\\n\\t});\\n\\tdomPre.appendChild(domCode);\\n\\treturn domPre;\\n};
2731\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nDiffTextWidget.prototype.execute = function() {\\n\\t// Make child widgets\\n\\tvar parseTreeNodes;\\n\\tif(this.parseTreeNode && this.parseTreeNode.children && this.parseTreeNode.children.length > 0) {\\n\\t\\tparseTreeNodes = this.parseTreeNode.children;\\n\\t} else {\\n\\t\\tparseTreeNodes = [{\\n\\t\\t\\ttype: \\\"transclude\\\",\\n\\t\\t\\tattributes: {\\n\\t\\t\\t\\ttiddler: {type: \\\"string\\\", value: \\\"$:/language/Diffs/CountMessage\\\"}\\n\\t\\t\\t}\\n\\t\\t}];\\n\\t}\\n\\tthis.makeChildWidgets(parseTreeNodes);\\n};\\n\\n/*\\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n*/\\nDiffTextWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes();\\n\\tif(changedAttributes.source || changedAttributes.dest || changedAttributes.cleanup) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t} else {\\n\\t\\treturn this.refreshChildren(changedTiddlers);\\n\\t}\\n};\\n\\nexports[\\\"diff-text\\\"] = DiffTextWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/draggable.js\":{\"title\":\"$:/core/modules/widgets/draggable.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/draggable.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nDraggable widget\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar DraggableWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nDraggableWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nDraggableWidget.prototype.render = function(parent,nextSibling) {\\n\\tvar self = this,\\n\\t\\ttag,\\n\\t\\tdomNode,\\n\\t\\tclasses = [];\\n\\t// Save the parent dom node\\n\\tthis.parentDomNode = parent;\\n\\t// Compute our attributes\\n\\tthis.computeAttributes();\\n\\t// Execute our logic\\n\\tthis.execute();\\n\\t// Sanitise the specified tag\\n\\ttag = this.draggableTag;\\n\\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\\n\\t\\ttag = \\\"div\\\";\\n\\t}\\n\\t// Create our element\\n\\tdomNode = this.document.createElement(tag);\\n\\t// Assign classes\\n\\tif(this.draggableClasses) {\\n\\t\\tclasses.push(this.draggableClasses);\\n\\t}\\n\\tif(!this.dragHandleSelector && this.dragEnable) {\\n\\t\\tclasses.push(\\\"tc-draggable\\\");\\n\\t}\\n\\tdomNode.setAttribute(\\\"class\\\",classes.join(\\\" \\\"));\\n\\t// Insert the node into the DOM and render any children\\n\\tparent.insertBefore(domNode,nextSibling);\\n\\tthis.renderChildren(domNode,null);\\n\\t// Add event handlers\\n\\tif(this.dragEnable) {\\n\\t\\t$tw.utils.makeDraggable({\\n\\t\\t\\tdomNode: domNode,\\n\\t\\t\\tdragTiddlerFn: function() {return self.getAttribute(\\\"tiddler\\\");},\\n\\t\\t\\tdragFilterFn: function() {return self.getAttribute(\\\"filter\\\");},\\n\\t\\t\\tstartActions: self.startActions,\\n\\t\\t\\tendActions: self.endActions,\\n\\t\\t\\tdragImageType: self.dragImageType,\\n\\t\\t\\twidget: this,\\n\\t\\t\\tselector: self.dragHandleSelector\\n\\t\\t});\\n\\t}\\n\\tthis.domNodes.push(domNode);\\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nDraggableWidget.prototype.execute = function() {\\n\\t// Pick up our attributes\\n\\tthis.draggableTag = this.getAttribute(\\\"tag\\\",\\\"div\\\");\\n\\tthis.draggableClasses = this.getAttribute(\\\"class\\\");\\n\\tthis.startActions = this.getAttribute(\\\"startactions\\\");\\n\\tthis.endActions = this.getAttribute(\\\"endactions\\\");\\n\\tthis.dragImageType = this.getAttribute(\\\"dragimagetype\\\");\\n\\tthis.dragHandleSelector = this.getAttribute(\\\"selector\\\");\\n\\tthis.dragEnable = this.getAttribute(\\\"enable\\\",\\\"yes\\\") === \\\"yes\\\";\\n\\t// Make the child widgets\\n\\tthis.makeChildWidgets();\\n};\\n\\n\\nDraggableWidget.prototype.updateDomNodeClasses = function() {\\n\\tvar domNo
2731deClasses = this.domNodes[0].className.split(\\\" \\\"),\\n\\t\\toldClasses = this.draggableClasses.split(\\\" \\\");\\n\\tthis.draggableClasses = this.getAttribute(\\\"class\\\");\\n\\t//Remove classes assigned from the old value of class attribute\\n\\t$tw.utils.each(oldClasses,function(oldClass){\\n\\t\\tvar i = domNodeClasses.indexOf(oldClass);\\n\\t\\tif(i !== -1) {\\n\\t\\t\\tdomNodeClasses.splice(i,1);\\n\\t\\t}\\n\\t});\\n\\t//Add new classes from updated class attribute.\\n\\t$tw.utils.pushTop(domNodeClasses,this.draggableClasses);\\n\\tthis.domNodes[0].setAttribute(\\\"class\\\",domNodeClasses.join(\\\" \\\"))\\n}\\n\\n/*\\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n*/\\nDraggableWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes(),\\n\\t\\tchangedAttributesCount = $tw.utils.count(changedAttributes);\\n\\tif(changedAttributesCount === 1 && changedAttributes[\\\"class\\\"]) {\\n\\t\\tthis.updateDomNodeClasses();\\n\\t} else if(changedAttributesCount > 0) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t}\\n\\treturn this.refreshChildren(changedTiddlers);\\n};\\n\\nexports.draggable = DraggableWidget;\\n\\n})();\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/droppable.js\":{\"title\":\"$:/core/modules/widgets/droppable.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/droppable.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nDroppable widget\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar DroppableWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nDroppableWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nDroppableWidget.prototype.render = function(parent,nextSibling) {\\n\\tvar self = this,\\n\\t\\ttag = this.parseTreeNode.isBlock ? \\\"div\\\" : \\\"span\\\",\\n\\t\\tdomNode;\\n\\t// Remember parent\\n\\tthis.parentDomNode = parent;\\n\\t// Compute attributes and execute state\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n\\tif(this.droppableTag && $tw.config.htmlUnsafeElements.indexOf(this.droppableTag) === -1) {\\n\\t\\ttag = this.droppableTag;\\n\\t}\\n\\t// Create element and assign classes\\n\\tdomNode = this.document.createElement(tag);\\n\\tthis.domNode = domNode;\\n\\tthis.assignDomNodeClasses();\\n\\t// Add event handlers\\n\\tif(this.droppableEnable) {\\n\\t\\t$tw.utils.addEventListeners(domNode,[\\n\\t\\t\\t{name: \\\"dragenter\\\", handlerObject: this, handlerMethod: \\\"handleDragEnterEvent\\\"},\\n\\t\\t\\t{name: \\\"dragover\\\", handlerObject: this, handlerMethod: \\\"handleDragOverEvent\\\"},\\n\\t\\t\\t{name: \\\"dragleave\\\", handlerObject: this, handlerMethod: \\\"handleDragLeaveEvent\\\"},\\n\\t\\t\\t{name: \\\"drop\\\", handlerObject: this, handlerMethod: \\\"handleDropEvent\\\"}\\n\\t\\t]);\\n\\t} else {\\n\\t\\t$tw.utils.addClass(this.domNode,this.disabledClass);\\n\\t}\\n\\t// Insert element\\n\\tparent.insertBefore(domNode,nextSibling);\\n\\tthis.renderChildren(domNode,null);\\n\\tthis.domNodes.push(domNode);\\n\\t// Stack of outstanding enter/leave events\\n\\tthis.currentlyEntered = [];\\n};\\n\\nDroppableWidget.prototype.enterDrag = function(event) {\\n\\tif(this.currentlyEntered.indexOf(event.target) === -1) {\\n\\t\\tthis.currentlyEntered.push(event.target);\\n\\t}\\n\\t// If we're entering for the first time we need to apply highlighting\\n\\t$tw.utils.addClass(this.domNodes[0],\\\"tc-dragover\\\");\\n};\\n\\nDroppableWidget.prototype.leaveDrag = function(event) {\\n\\tvar pos = this.currentlyEntered.indexOf(event.target);\\n\\tif(pos !== -1) {\\n\\t\\tthis.currentlyEntered.splice(pos,1);\\n\\t}\\n\\t// Remove highlighting if we're leaving externally. The hacky second condition is to resolve a problem with Firefox whereby there is an erroneous dragenter event if the node being dragged is within the dropzone\\n\\tif(this.currentlyEntered.length === 0 || (this.currentlyEntered.length === 1 && this.currentlyEntered[0] === $tw.dragInProgress)) {\\n\\t\\tthis.currentlyEntered = [];
2731\\n\\t\\tif(this.domNodes[0]) {\\n\\t\\t\\t$tw.utils.removeClass(this.domNodes[0],\\\"tc-dragover\\\");\\n\\t\\t}\\n\\t}\\n};\\n\\nDroppableWidget.prototype.handleDragEnterEvent  = function(event) {\\n\\tthis.enterDrag(event);\\n\\t// Tell the browser that we're ready to handle the drop\\n\\tevent.preventDefault();\\n\\t// Tell the browser not to ripple the drag up to any parent drop handlers\\n\\tevent.stopPropagation();\\n\\treturn false;\\n};\\n\\nDroppableWidget.prototype.handleDragOverEvent  = function(event) {\\n\\t// Check for being over a TEXTAREA or INPUT\\n\\tif([\\\"TEXTAREA\\\",\\\"INPUT\\\"].indexOf(event.target.tagName) !== -1) {\\n\\t\\treturn false;\\n\\t}\\n\\t// Tell the browser that we're still interested in the drop\\n\\tevent.preventDefault();\\n\\t// Set the drop effect\\n\\tevent.dataTransfer.dropEffect = this.droppableEffect;\\n\\treturn false;\\n};\\n\\nDroppableWidget.prototype.handleDragLeaveEvent  = function(event) {\\n\\tthis.leaveDrag(event);\\n\\treturn false;\\n};\\n\\nDroppableWidget.prototype.handleDropEvent  = function(event) {\\n\\tvar self = this;\\n\\tthis.leaveDrag(event);\\n\\t// Check for being over a TEXTAREA or INPUT\\n\\tif([\\\"TEXTAREA\\\",\\\"INPUT\\\"].indexOf(event.target.tagName) !== -1) {\\n\\t\\treturn false;\\n\\t}\\n\\tvar dataTransfer = event.dataTransfer;\\n\\t// Remove highlighting\\n\\t$tw.utils.removeClass(this.domNodes[0],\\\"tc-dragover\\\");\\n\\t// Try to import the various data types we understand\\n\\t$tw.utils.importDataTransfer(dataTransfer,null,function(fieldsArray) {\\n\\t\\tfieldsArray.forEach(function(fields) {\\n\\t\\t\\tself.performActions(fields.title || fields.text,event);\\n\\t\\t});\\n\\t});\\n\\t// Tell the browser that we handled the drop\\n\\tevent.preventDefault();\\n\\t// Stop the drop ripple up to any parent handlers\\n\\tevent.stopPropagation();\\n\\treturn false;\\n};\\n\\nDroppableWidget.prototype.performActions = function(title,event) {\\n\\tif(this.droppableActions) {\\n\\t\\tvar modifierKey = $tw.keyboardManager.getEventModifierKeyDescriptor(event);\\n\\t\\tthis.invokeActionString(this.droppableActions,this,event,{actionTiddler: title, modifier: modifierKey});\\n\\t}\\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nDroppableWidget.prototype.execute = function() {\\n\\tthis.droppableActions = this.getAttribute(\\\"actions\\\");\\n\\tthis.droppableEffect = this.getAttribute(\\\"effect\\\",\\\"copy\\\");\\n\\tthis.droppableTag = this.getAttribute(\\\"tag\\\");\\n\\tthis.droppableEnable = (this.getAttribute(\\\"enable\\\") || \\\"yes\\\") === \\\"yes\\\";\\n\\tthis.disabledClass = this.getAttribute(\\\"disabledClass\\\",\\\"\\\");\\n\\t// Make child widgets\\n\\tthis.makeChildWidgets();\\n};\\n\\nDroppableWidget.prototype.assignDomNodeClasses = function() {\\n\\tvar classes = this.getAttribute(\\\"class\\\",\\\"\\\").split(\\\" \\\");\\n\\tclasses.push(\\\"tc-droppable\\\");\\n\\tthis.domNode.className = classes.join(\\\" \\\");\\n};\\n\\n/*\\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n*/\\nDroppableWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes();\\n\\tif(changedAttributes.tag || changedAttributes.enable || changedAttributes.disabledClass || changedAttributes.actions || changedAttributes.effect) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t} else if(changedAttributes[\\\"class\\\"]) {\\n\\t\\tthis.assignDomNodeClasses();\\n\\t}\\n\\treturn this.refreshChildren(changedTiddlers);\\n};\\n\\nexports.droppable = DroppableWidget;\\n\\n})();\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/dropzone.js\":{\"title\":\"$:/core/modules/widgets/dropzone.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/dropzone.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nDropzone widget\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar IMPORT_TITLE = \\\"$:/Import\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar DropZoneWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};
2731\\n\\n/*\\nInherit from the base widget class\\n*/\\nDropZoneWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nDropZoneWidget.prototype.render = function(parent,nextSibling) {\\n\\tvar self = this;\\n\\t// Remember parent\\n\\tthis.parentDomNode = parent;\\n\\t// Compute attributes and execute state\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n\\t// Create element\\n\\tvar domNode = this.document.createElement(\\\"div\\\");\\n\\tthis.domNode = domNode;\\n\\tdomNode.className = this.dropzoneClass || \\\"tc-dropzone\\\";\\n\\t// Add event handlers\\n\\tif(this.dropzoneEnable) {\\n\\t\\t$tw.utils.addEventListeners(domNode,[\\n\\t\\t\\t{name: \\\"dragenter\\\", handlerObject: this, handlerMethod: \\\"handleDragEnterEvent\\\"},\\n\\t\\t\\t{name: \\\"dragover\\\", handlerObject: this, handlerMethod: \\\"handleDragOverEvent\\\"},\\n\\t\\t\\t{name: \\\"dragleave\\\", handlerObject: this, handlerMethod: \\\"handleDragLeaveEvent\\\"},\\n\\t\\t\\t{name: \\\"drop\\\", handlerObject: this, handlerMethod: \\\"handleDropEvent\\\"},\\n\\t\\t\\t{name: \\\"paste\\\", handlerObject: this, handlerMethod: \\\"handlePasteEvent\\\"},\\n\\t\\t\\t{name: \\\"dragend\\\", handlerObject: this, handlerMethod: \\\"handleDragEndEvent\\\"}\\n\\t\\t]);\\n\\t}\\n\\t// Insert element\\n\\tparent.insertBefore(domNode,nextSibling);\\n\\tthis.renderChildren(domNode,null);\\n\\tthis.domNodes.push(domNode);\\n\\t// Stack of outstanding enter/leave events\\n\\tthis.currentlyEntered = [];\\n};\\n\\n// Handler for transient event listeners added when the dropzone has an active drag in progress\\nDropZoneWidget.prototype.handleEvent = function(event) {\\n\\tif(event.type === \\\"click\\\") {\\n\\t\\tif(this.currentlyEntered.length) {\\n\\t\\t\\tthis.resetState();\\n\\t\\t}\\n\\t} else if(event.type === \\\"dragenter\\\") {\\n\\t\\tif(event.target && event.target !== this.domNode && !$tw.utils.domContains(this.domNode,event.target)) {\\n\\t\\t\\tthis.resetState();\\n\\t\\t}\\n\\t} else if(event.type === \\\"dragleave\\\") {\\n\\t\\t// Check if drag left the window\\n\\t\\tif(event.relatedTarget === null || (event.relatedTarget && event.relatedTarget.nodeName === \\\"HTML\\\")) {\\n\\t\\t\\tthis.resetState();\\n\\t\\t}\\n\\t}\\n};\\n\\n// Reset the state of the dropzone after a drag has ended\\nDropZoneWidget.prototype.resetState = function() {\\n\\t$tw.utils.removeClass(this.domNode,\\\"tc-dragover\\\");\\n\\tthis.currentlyEntered = [];\\n\\tthis.document.body.removeEventListener(\\\"click\\\",this,true);\\n\\tthis.document.body.removeEventListener(\\\"dragenter\\\",this,true);\\n\\tthis.document.body.removeEventListener(\\\"dragleave\\\",this,true);\\n\\tthis.dragInProgress = false;\\n};\\n\\nDropZoneWidget.prototype.enterDrag = function(event) {\\n\\tif(this.currentlyEntered.indexOf(event.target) === -1) {\\n\\t\\tthis.currentlyEntered.push(event.target);\\n\\t}\\n\\tif(!this.dragInProgress) {\\n\\t\\tthis.dragInProgress = true;\\n\\t\\t// If we're entering for the first time we need to apply highlighting\\n\\t\\t$tw.utils.addClass(this.domNodes[0],\\\"tc-dragover\\\");\\n\\t\\tthis.document.body.addEventListener(\\\"click\\\",this,true);\\n\\t\\tthis.document.body.addEventListener(\\\"dragenter\\\",this,true);\\n\\t\\tthis.document.body.addEventListener(\\\"dragleave\\\",this,true);\\n\\t}\\n};\\n\\nDropZoneWidget.prototype.leaveDrag = function(event) {\\n\\tvar pos = this.currentlyEntered.indexOf(event.target);\\n\\tif(pos !== -1) {\\n\\t\\tthis.currentlyEntered.splice(pos,1);\\n\\t}\\n\\t// Remove highlighting if we're leaving externally\\n\\tif(this.currentlyEntered.length === 0) {\\n\\t\\tthis.resetState();\\n\\t}\\n};\\n\\nDropZoneWidget.prototype.handleDragEnterEvent  = function(event) {\\n\\tif($tw.dragInProgress) {\\n\\t\\treturn false;\\n\\t}\\n\\tif(this.filesOnly && !$tw.utils.dragEventContainsFiles(event)) {\\n\\t\\treturn false;\\n\\t}\\n\\tthis.enterDrag(event);\\n\\t// Tell the browser that we're ready to handle the drop\\n\\tevent.preventDefault();\\n\\t// Tell the browser not to ripple the drag up to any parent drop handlers\\n\\tevent.stopPropagation();\\n};\\n\\nDropZoneWidget.prototype.handleDragOverEvent  = function(event) {\\n\\t// Check for being over a TEXTAREA or INPUT\\n\\tif([\\\"TEXTAREA\\\",\\\"INPUT\\\"].indexOf(event.target.tagName) !== -1) {\\n\\t\\treturn false;\\n\\t}\\n\\t// Check for this window being the source of the drag\\n\\tif($tw.dragInProgress) {\\n\\t\\treturn false;\\n\\t}\\n\\t// Tell the browser that we're still interested in the drop\\n\\tevent.preventDefault();\\n\\t// Check if this is a synthetic event, IE does not allow accessing dropEffect outside of original event handler\\n\\tif(event.isTrusted) {\\n\\t\\tevent.dataTransfer.dropEffect = \\\"copy\\\"; // Explicitly show this is a copy\\n\\t}\\n};\\n\\nDropZoneWidget.prototype.handleDragLeaveEvent  = function(event) {\\n\\tthis.leaveDrag(event);\\n};\\n\\nDropZoneWidget.prototype.handleDragEndEvent = function(event) {\\n\\tthis.resetState();\\n};\\n\\nDropZoneWidget.prototype.filterByContentTypes = function(tiddlerFieldsArray) {\\n\\tvar filteredTypes,\\n\\t\\tfiltered = [],\\n\\t\\ttypes = [];\\n\\t$tw.utils.each(tiddlerFieldsArray,function(tiddlerFields) {\\n\\t\\ttypes.push(tiddlerFields.type || \\\"\\\");\\n\\t});\\n\\tfilteredTypes = this.wiki.filterTiddlers(this.contentTypesFilter,this,this.wiki.makeTiddlerIterator(types));\\n\\t$tw.utils.each(tiddlerFieldsArray,function(tiddlerFields) {\\n\\t\\tif(filteredTypes.indexOf(tiddlerFields.type) !== -1) {\\n\\t\\t\\tfiltered.push(tiddlerFields);\\n\\t\\t}\\n\\t});\\n\\treturn filtered;\\n};\\n\\nDropZoneWidget.prototype.readFileCallback = function(tiddlerFieldsArray) {\\n\\tif(this.contentTypesFilter) {\\n\\t\\ttiddlerFieldsArray = this.filterByContentTypes(tiddlerFieldsArray);\\n\\t}\\n\\tif(tiddlerFieldsArray.length) {\\n\\t\\tthis.dispatchEvent({type: \\\"tm-import-tiddlers\\\", param: JSON.stringify(tiddlerFieldsArray), autoOpenOnImport: this.autoOpenOnImport, importTitle: this.importTitle});\\n\\t\\tif(this.actions) {\\n\\t\\t\\tthis.invokeActionString(this.actions,this,event,{importTitle: this.importTitle});\\n\\t\\t}\\n\\t}\\n};\\n\\nDropZoneWidget.prototype.handleDropEvent  = function(event) {\\n\\tvar self = this,\\n\\t\\treadFileCallback = function(tiddlerFieldsArray) {\\n\\t\\t\\tself.readFileCallback(tiddlerFieldsArray);\\n\\t\\t};\\n\\tthis.leaveDrag(event);\\n\\t// Check for being over a TEXTAREA or INPUT\\n\\tif([\\\"TEXTAREA\\\",\\\"INPUT\\\"].indexOf(event.target.tagName) !== -1) {\\n\\t\\treturn false;\\n\\t}\\n\\t// Check for this window being the source of the drag\\n\\tif($tw.dragInProgress) {\\n\\t\\treturn false;\\n\\t}\\n\\tvar self = this,\\n\\t\\tdataTransfer = event.dataTransfer;\\n\\t// Remove highlighting\\n\\tthis.resetState();\\n\\t// Import any files in the drop\\n\\tvar numFiles = 0;\\n\\t// If we have type text/vnd.tiddlywiki then skip trying to import files\\n\\tif(dataTransfer.files && !$tw.utils.dragEventContainsType(event,\\\"text/vnd.tiddler\\\")) {\\n\\t\\tnumFiles = this.wiki.readFiles(dataTransfer.files,{\\n\\t\\t\\tcallback: readFileCallback,\\n\\t\\t\\tdeserializer: this.dropzoneDeserializer\\n\\t\\t});\\n\\t}\\n\\t// Try to import the various data types we understand\\n\\tif(numFiles === 0) {\\n\\t\\tvar fallbackTitle = self.wiki.generateNewTitle(\\\"Untitled\\\");\\n\\t\\t//Use the deserializer specified if any\\n\\t\\tif(this.dropzoneDeserializer) {\\n\\t\\t\\tfor(var t= 0; t\u003CdataTransfer.items.length; t++) {\\n\\t\\t\\t\\tvar item = dataTransfer.items[t];\\n\\t\\t\\t\\tif(item.kind === \\\"string\\\") {\\n\\t\\t\\t\\t\\titem.getAsString(function(str){\\n\\t\\t\\t\\t\\t\\tvar tiddlerFields = self.wiki.deserializeTiddlers(null,str,{title: fallbackTitle},{deserializer:self.dropzoneDeserializer});\\n\\t\\t\\t\\t\\t\\tif(tiddlerFields && tiddlerFields.length) {\\n\\t\\t\\t\\t\\t\\t\\treadFileCallback(tiddlerFields);\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t})\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}
2731 else {\\n\\t\\t\\t$tw.utils.importDataTransfer(dataTransfer,fallbackTitle,readFileCallback);\\n\\t\\t}\\n\\t}\\n\\t// Tell the browser that we handled the drop\\n\\tevent.preventDefault();\\n\\t// Stop the drop ripple up to any parent handlers\\n\\tevent.stopPropagation();\\n};\\n\\nDropZoneWidget.prototype.handlePasteEvent  = function(event) {\\n\\tvar self = this;\\n\\tvar\\treadFileCallback = function(tiddlerFieldsArray) {\\n\\t\\t\\tself.readFileCallback(tiddlerFieldsArray);\\n\\t\\t};\\n\\tvar getItem = function(type) {\\n\\t\\t\\ttype = type || \\\"text/plain\\\";\\n\\t\\t\\treturn function(str) {\\n\\t\\t\\t\\t// Use the deserializer specified if any\\n\\t\\t\\t\\tif(self.dropzoneDeserializer) {\\n\\t\\t\\t\\t\\ttiddlerFields = self.wiki.deserializeTiddlers(null,str,{title: self.wiki.generateNewTitle(\\\"Untitled \\\" + type)},{deserializer:self.dropzoneDeserializer});\\n\\t\\t\\t\\t\\tif(tiddlerFields && tiddlerFields.length) {\\n\\t\\t\\t\\t\\t\\treadFileCallback(tiddlerFields);\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\ttiddlerFields = {\\n\\t\\t\\t\\t\\t\\ttitle: self.wiki.generateNewTitle(\\\"Untitled \\\" + type),\\n\\t\\t\\t\\t\\t\\ttext: str,\\n\\t\\t\\t\\t\\t\\ttype: type\\n\\t\\t\\t\\t\\t};\\n\\t\\t\\t\\t\\tif($tw.log.IMPORT) {\\n\\t\\t\\t\\t\\t\\tconsole.log(\\\"Importing string '\\\" + str + \\\"', type: '\\\" + type + \\\"'\\\");\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\treadFileCallback([tiddlerFields]);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t};\\n\\t// Let the browser handle it if we're in a textarea or input box\\n\\tif([\\\"TEXTAREA\\\",\\\"INPUT\\\"].indexOf(event.target.tagName) == -1 && !event.target.isContentEditable && !event.twEditor) {\\n\\t\\tvar self = this,\\n\\t\\t\\titems = event.clipboardData.items;\\n\\t\\t// Enumerate the clipboard items\\n\\t\\tfor(var t = 0; t\u003Citems.length; t++) {\\n\\t\\t\\tvar item = items[t];\\n\\t\\t\\tif(item.kind === \\\"file\\\") {\\n\\t\\t\\t\\t// Import any files\\n\\t\\t\\t\\tthis.wiki.readFile(item.getAsFile(),{\\n\\t\\t\\t\\t\\tcallback: readFileCallback,\\n\\t\\t\\t\\t\\tdeserializer: this.dropzoneDeserializer\\n\\t\\t\\t\\t});\\n\\t\\t\\t} else if(item.kind === \\\"string\\\" && ![\\\"text/html\\\", \\\"text/plain\\\", \\\"Text\\\"].includes(item.type) && $tw.utils.itemHasValidDataType(item)) {\\n\\t\\t\\t\\t// Try to import the various data types we understand\\n\\t\\t\\t\\tvar fallbackTitle = self.wiki.generateNewTitle(\\\"Untitled\\\");\\n\\t\\t\\t\\t//Use the deserializer specified if any\\n\\t\\t\\t\\tif(this.dropzoneDeserializer) {\\n\\t\\t\\t\\t\\titem.getAsString(function(str){\\n\\t\\t\\t\\t\\t\\tvar tiddlerFields = self.wiki.deserializeTiddlers(null,str,{title: fallbackTitle},{deserializer:self.dropzoneDeserializer});\\n\\t\\t\\t\\t\\t\\tif(tiddlerFields && tiddlerFields.length) {\\n\\t\\t\\t\\t\\t\\t\\treadFileCallback(tiddlerFields);\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t});\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t$tw.utils.importPaste(item,fallbackTitle,readFileCallback);\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else if(item.kind === \\\"string\\\") {\\n\\t\\t\\t\\t// Create tiddlers from string items\\n\\t\\t\\t\\tvar tiddlerFields;\\n\\t\\t\\t\\t// It's important to give getAsString a closure with the right type\\n\\t\\t\\t\\t// So it can be added to the import queue\\n\\t\\t\\t\\titem.getAsString(getItem(item.type));\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\t// Tell the browser that we've handled the paste\\n\\t\\tevent.stopPropagation();\\n\\t\\tevent.preventDefault();\\n\\t}\\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nDropZoneWidget.prototype.execute = function() {\\n\\tthis.dropzoneClass = this.getAttribute(\\\"class\\\");\\n\\tthis.dropzoneDeserializer = this.getAttribute(\\\"deserializer\\\");\\n\\tthis.dropzoneEnable = (this.getAttribute(\\\"enable\\\") || \\\"yes\\\") === \\\"yes\\\";\\n\\tthis.autoOpenOnImport = this.getAttribute(\\\"autoOpenOnImport\\\");\\n\\tthis.importTitle = this.getAttribute(\\\"importTitle\\\",IMPORT_TITLE);\\n\\tthis.actions = this.getAttribute(\\\"actions\\\");\\n\\tthis.contentTypesFilter = this.getAttribute(\\\"contentTypesFilter\\\");\\n\\tthis.filesOnly = this.getAttribute(\\\"filesOnly\\\",\\\"no\\\") === \\\"yes\\\";\\n\\t// Make child widgets\\n\\tthis.makeChildWidgets();\\n};
2731\\n\\n/*\\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n*/\\nDropZoneWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes();\\n\\tif($tw.utils.count(changedAttributes) > 0) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t}\\n\\treturn this.refreshChildren(changedTiddlers);\\n};\\n\\nexports.dropzone = DropZoneWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/edit-binary.js\":{\"title\":\"$:/core/modules/widgets/edit-binary.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/edit-binary.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nEdit-binary widget; placeholder for editing binary tiddlers\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar BINARY_WARNING_MESSAGE = \\\"$:/core/ui/BinaryWarning\\\";\\nvar EXPORT_BUTTON_IMAGE = \\\"$:/core/images/export-button\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar EditBinaryWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nEditBinaryWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nEditBinaryWidget.prototype.render = function(parent,nextSibling) {\\n\\tvar self = this;\\n\\t// Save the parent dom node\\n\\tthis.parentDomNode = parent;\\n\\t// Compute our attributes\\n\\tthis.computeAttributes();\\n\\t// Execute our logic\\n\\tthis.execute();\\n\\tthis.renderChildren(parent,nextSibling);\\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nEditBinaryWidget.prototype.execute = function() {\\n\\t// Get our parameters\\n\\tvar editTitle = this.getAttribute(\\\"tiddler\\\",this.getVariable(\\\"currentTiddler\\\"));\\n\\tvar tiddler = this.wiki.getTiddler(editTitle);\\n\\tvar type = tiddler.fields.type;\\n\\tvar text = tiddler.fields.text;\\n\\t// Transclude the binary data tiddler warning message\\n\\tvar warn = {\\n\\t\\ttype: \\\"element\\\",\\n\\t\\ttag: \\\"p\\\",\\n\\t\\tchildren: [{\\n\\t\\t\\ttype: \\\"transclude\\\",\\n\\t\\t\\tattributes: {\\n\\t\\t\\t\\ttiddler: {type: \\\"string\\\", value: BINARY_WARNING_MESSAGE}\\n\\t\\t\\t}\\n\\t\\t}]\\n\\t};\\n\\t// Create download link based on draft tiddler title\\n\\tvar link = {\\n\\t\\ttype: \\\"element\\\",\\n\\t\\ttag: \\\"a\\\",\\n\\t\\tattributes: {\\n\\t\\t\\ttitle: {type: \\\"indirect\\\", textReference: \\\"!!draft.title\\\"},\\n\\t\\t\\tdownload: {type: \\\"indirect\\\", textReference: \\\"!!draft.title\\\"}\\n\\t\\t},\\n\\t\\tchildren: [{\\n\\t\\ttype: \\\"transclude\\\",\\n\\t\\t\\tattributes: {\\n\\t\\t\\t\\ttiddler: {type: \\\"string\\\", value: EXPORT_BUTTON_IMAGE}\\n\\t\\t\\t}\\n\\t\\t}]\\n\\t};\\n\\t// Set the link href to internal data URI (no external)\\n\\tif(text) {\\n\\t\\tlink.attributes.href = {\\n\\t\\t\\ttype: \\\"string\\\", \\n\\t\\t\\tvalue: \\\"data:\\\" + type + \\\";base64,\\\" + text\\n\\t\\t};\\n\\t}\\n\\t// Combine warning message and download link in a div\\n\\tvar element = {\\n\\t\\ttype: \\\"element\\\",\\n\\t\\ttag: \\\"div\\\",\\n\\t\\tattributes: {\\n\\t\\t\\tclass: {type: \\\"string\\\", value: \\\"tc-binary-warning\\\"}\\n\\t\\t},\\n\\t\\tchildren: [warn, link]\\n\\t}\\n\\t// Construct the child widgets\\n\\tthis.makeChildWidgets([element]);\\n};\\n\\n/*\\nRefresh by refreshing our child widget\\n*/\\nEditBinaryWidget.prototype.refresh = function(changedTiddlers) {\\n\\treturn this.refreshChildren(changedTiddlers);\\n};\\n\\nexports[\\\"edit-binary\\\"] = EditBinaryWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/edit-bitmap.js\":{\"title\":\"$:/core/modules/widgets/edit-bitmap.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/edit-bitmap.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nEdit-bitmap widget\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n// Default image sizes\\nvar DEFAULT_IMAGE_WIDTH = 600,\\n\\tDEFAULT_IMAGE_HEIGHT = 370,\\n\\tDEFAULT_IMAGE_TYPE = \\\"image/png\\\";\\n\\n// Configuration tiddlers\\nvar LINE_WIDTH_TITLE = \\\"$:/config/BitmapEditor/LineWidth\\\",\\n\\tLINE_COLOUR_TITLE = \\\"$:/config/BitmapEditor/Colour\\\",\\n\\tLINE_OPACITY_TITLE = \\\"$:/config/BitmapEditor/Opacity\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar EditBitmapWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};
2731\\n\\n/*\\nInherit from the base widget class\\n*/\\nEditBitmapWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nEditBitmapWidget.prototype.render = function(parent,nextSibling) {\\n\\tvar self = this;\\n\\t// Initialise the editor operations if they've not been done already\\n\\tif(!this.editorOperations) {\\n\\t\\tEditBitmapWidget.prototype.editorOperations = {};\\n\\t\\t$tw.modules.applyMethods(\\\"bitmapeditoroperation\\\",this.editorOperations);\\n\\t}\\n\\t// Save the parent dom node\\n\\tthis.parentDomNode = parent;\\n\\t// Compute our attributes\\n\\tthis.computeAttributes();\\n\\t// Execute our logic\\n\\tthis.execute();\\n\\t// Create the wrapper for the toolbar and render its content\\n\\tthis.toolbarNode = this.document.createElement(\\\"div\\\");\\n\\tthis.toolbarNode.className = \\\"tc-editor-toolbar\\\";\\n\\tparent.insertBefore(this.toolbarNode,nextSibling);\\n\\tthis.domNodes.push(this.toolbarNode);\\n\\t// Create the on-screen canvas\\n\\tthis.canvasDomNode = $tw.utils.domMaker(\\\"canvas\\\",{\\n\\t\\tdocument: this.document,\\n\\t\\t\\\"class\\\":\\\"tc-edit-bitmapeditor\\\",\\n\\t\\teventListeners: [{\\n\\t\\t\\tname: \\\"touchstart\\\", handlerObject: this, handlerMethod: \\\"handleTouchStartEvent\\\"\\n\\t\\t},{\\n\\t\\t\\tname: \\\"touchmove\\\", handlerObject: this, handlerMethod: \\\"handleTouchMoveEvent\\\"\\n\\t\\t},{\\n\\t\\t\\tname: \\\"touchend\\\", handlerObject: this, handlerMethod: \\\"handleTouchEndEvent\\\"\\n\\t\\t},{\\n\\t\\t\\tname: \\\"mousedown\\\", handlerObject: this, handlerMethod: \\\"handleMouseDownEvent\\\"\\n\\t\\t},{\\n\\t\\t\\tname: \\\"mousemove\\\", handlerObject: this, handlerMethod: \\\"handleMouseMoveEvent\\\"\\n\\t\\t},{\\n\\t\\t\\tname: \\\"mouseup\\\", handlerObject: this, handlerMethod: \\\"handleMouseUpEvent\\\"\\n\\t\\t}]\\n\\t});\\n\\t// Set the width and height variables\\n\\tthis.setVariable(\\\"tv-bitmap-editor-width\\\",this.canvasDomNode.width + \\\"px\\\");\\n\\tthis.setVariable(\\\"tv-bitmap-editor-height\\\",this.canvasDomNode.height + \\\"px\\\");\\n\\t// Render toolbar child widgets\\n\\tthis.renderChildren(this.toolbarNode,null);\\n\\t// // Insert the elements into the DOM\\n\\tparent.insertBefore(this.canvasDomNode,nextSibling);\\n\\tthis.domNodes.push(this.canvasDomNode);\\n\\t// Load the image into the canvas\\n\\tif($tw.browser) {\\n\\t\\tthis.loadCanvas();\\n\\t}\\n\\t// Add widget message listeners\\n\\tthis.addEventListeners([\\n\\t\\t{type: \\\"tm-edit-bitmap-operation\\\", handler: \\\"handleEditBitmapOperationMessage\\\"}\\n\\t]);\\n};\\n\\n/*\\nHandle an edit bitmap operation message from the toolbar\\n*/\\nEditBitmapWidget.prototype.handleEditBitmapOperationMessage = function(event) {\\n\\t// Invoke the handler\\n\\tvar handler = this.editorOperations[event.param];\\n\\tif(handler) {\\n\\t\\thandler.call(this,event);\\n\\t}\\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nEditBitmapWidget.prototype.execute = function() {\\n\\t// Get our parameters\\n\\tthis.editTitle = this.getAttribute(\\\"tiddler\\\",this.getVariable(\\\"currentTiddler\\\"));\\n\\t// Make the child widgets\\n\\tthis.makeChildWidgets();\\n};\\n\\n/*\\nJust refresh the toolbar\\n*/\\nEditBitmapWidget.prototype.refresh = function(changedTiddlers) {\\n\\treturn this.refreshChildren(changedTiddlers);\\n};\\n\\n/*\\nSet the bitmap size variables and refresh the toolbar\\n*/\\nEditBitmapWidget.prototype.refreshToolbar = function() {\\n\\t// Set the width and height variables\\n\\tthis.setVariable(\\\"tv-bitmap-editor-width\\\",this.canvasDomNode.width + \\\"px\\\");\\n\\tthis.setVariable(\\\"tv-bitmap-editor-height\\\",this.canvasDomNode.height + \\\"px\\\");\\n\\t// Refresh each of our child widgets\\n\\t$tw.utils.each(this.children,function(childWidget) {\\n\\t\\tchildWidget.refreshSelf();\\n\\t});\\n};\\n\\nEditBitmapWidget.prototype.loadCanvas = function() {\\n\\tvar tiddler = this.wiki.getTiddler(this.editTitle),\\n\\t\\tcurrImage = new Image();\\n\\t// Set up event handlers for loading the image\\n\\tvar self = this;\\n\\tcurrImage.onload = function() {\\n\\t\\t// Copy the image to the on-screen canvas\\n\\t\\t
2731self.initCanvas(self.canvasDomNode,currImage.width,currImage.height,currImage);\\n\\t\\t// And also copy the current bitmap to the off-screen canvas\\n\\t\\tself.currCanvas = self.document.createElement(\\\"canvas\\\");\\n\\t\\tself.initCanvas(self.currCanvas,currImage.width,currImage.height,currImage);\\n\\t\\t// Set the width and height input boxes\\n\\t\\tself.refreshToolbar();\\n\\t};\\n\\tcurrImage.onerror = function() {\\n\\t\\t// Set the on-screen canvas size and clear it\\n\\t\\tself.initCanvas(self.canvasDomNode,DEFAULT_IMAGE_WIDTH,DEFAULT_IMAGE_HEIGHT);\\n\\t\\t// Set the off-screen canvas size and clear it\\n\\t\\tself.currCanvas = self.document.createElement(\\\"canvas\\\");\\n\\t\\tself.initCanvas(self.currCanvas,DEFAULT_IMAGE_WIDTH,DEFAULT_IMAGE_HEIGHT);\\n\\t\\t// Set the width and height input boxes\\n\\t\\tself.refreshToolbar();\\n\\t};\\n\\t// Get the current bitmap into an image object\\n\\tif(tiddler && tiddler.fields.type && tiddler.fields.text) {\\n\\t\\tcurrImage.src = \\\"data:\\\" + tiddler.fields.type + \\\";base64,\\\" + tiddler.fields.text;\\n\\t} else {\\n\\t\\tcurrImage.width = DEFAULT_IMAGE_WIDTH;\\n\\t\\tcurrImage.height = DEFAULT_IMAGE_HEIGHT;\\n\\t\\tcurrImage.onerror();\\n\\t}\\n};\\n\\nEditBitmapWidget.prototype.initCanvas = function(canvas,width,height,image) {\\n\\tcanvas.width = width;\\n\\tcanvas.height = height;\\n\\tvar ctx = canvas.getContext(\\\"2d\\\");
2731\\n\\tif(image) {\\n\\t\\tctx.drawImage(image,0,0);\\n\\t} else {\\n\\t\\tctx.fillStyle = \\\"#fff\\\";\\n\\t\\tctx.fillRect(0,0,canvas.width,canvas.height);\\n\\t}\\n};\\n\\n/*\\n** Change the size of the canvas, preserving the current image\\n*/\\nEditBitmapWidget.prototype.changeCanvasSize = function(newWidth,newHeight) {\\n\\t// Create and size a new canvas\\n\\tvar newCanvas = this.document.createElement(\\\"canvas\\\");\\n\\tthis.initCanvas(newCanvas,newWidth,newHeight);\\n\\t// Copy the old image\\n\\tvar ctx = newCanvas.getContext(\\\"2d\\\");\\n\\tctx.drawImage(this.currCanvas,0,0);\\n\\t// Set the new canvas as the current one\\n\\tthis.currCanvas = newCanvas;\\n\\t// Set the size of the onscreen canvas\\n\\tthis.canvasDomNode.width = newWidth;\\n\\tthis.canvasDomNode.height = newHeight;\\n\\t// Paint the onscreen canvas with the offscreen canvas\\n\\tctx = this.canvasDomNode.getContext(\\\"2d\\\");\\n\\tctx.drawImage(this.currCanvas,0,0);\\n};\\n\\n/*\\n** Rotate the canvas left by 90 degrees\\n*/\\nEditBitmapWidget.prototype.rotateCanvasLeft = function() {\\n\\t// Get the current size of the image\\n\\tvar origWidth = this.currCanvas.width,\\n\\t\\torigHeight = this.currCanvas.height;\\n\\t// Create and size a new canvas\\n\\tvar newCanvas = this.document.createElement(\\\"canvas\\\"),\\n\\t\\tnewWidth = origHeight,\\n\\t\\tnewHeight = origWidth;\\n\\tthis.initCanvas(newCanvas,newWidth,newHeight);\\n\\t// Copy the old image\\n\\tvar ctx = newCanvas.getContext(\\\"2d\\\");\\n\\tctx.save();\\n\\tctx.translate(newWidth / 2,newHeight / 2);\\n\\tctx.rotate(-Math.PI / 2);\\n\\tctx.drawImage(this.currCanvas,-origWidth / 2,-origHeight / 2);\\n\\tctx.restore();\\n\\t// Set the new canvas as the current one\\n\\tthis.currCanvas = newCanvas;\\n\\t// Set the size of the onscreen canvas\\n\\tthis.canvasDomNode.width = newWidth;\\n\\tthis.canvasDomNode.height = newHeight;\\n\\t// Paint the onscreen canvas with the offscreen canvas\\n\\tctx = this.canvasDomNode.getContext(\\\"2d\\\");\\n\\tctx.drawImage(this.currCanvas,0,0);\\n};\\n\\nEditBitmapWidget.prototype.handleTouchStartEvent = function(event) {\\n\\tthis.brushDown = true;\\n\\tthis.strokeStart(event.touches[0].clientX,event.touches[0].clientY);\\n\\tevent.preventDefault();\\n\\tevent.stopPropagation();\\n\\treturn false;\\n};\\n\\nEditBitmapWidget.prototype.handleTouchMoveEvent = function(event) {\\n\\tif(this.brushDown) {\\n\\t\\tthis.strokeMove(event.touches[0].clientX,event.touches[0].clientY);\\n\\t}\\n\\tevent.preventDefault();\\n\\tevent.stopPropagation();\\n\\treturn false;\\n};\\n\\nEditBitmapWidget.prototype.handleTouchEndEvent = function(event) {\\n\\tif(this.brushDown) {\\n\\t\\tthis.brushDown = false;\\n\\t\\tthis.strokeEnd();\\n\\t}\\n\\tevent.preventDefault();\\n\\tevent.stopPropagation();\\n\\treturn false;\\n};\\n\\nEditBitmapWidget.prototype.handleMouseDownEvent = function(event) {\\n\\tthis.strokeStart(event.clientX,event.clientY);\\n\\tthis.brushDown = true;\\n\\tevent.preventDefault();\\n\\tevent.stopPropagation();\\n\\treturn false;\\n};\\n\\nEditBitmapWidget.prototype.handleMouseMoveEvent = function(event) {\\n\\tif(this.brushDown) {\\n\\t\\tthis.strokeMove(event.clientX,event.clientY);\\n\\t\\tevent.preventDefault();\\n\\t\\tevent.stopPropagation();\\n\\t\\treturn false;\\n\\t}\\n\\treturn true;\\n};\\n\\nEditBitmapWidget.prototype.handleMouseUpEvent = function(event) {\\n\\tif(this.brushDown) {\\n\\t\\tthis.brushDown = false;\\n\\t\\tthis.strokeEnd();\\n\\t\\tevent.preventDefault();\\n\\t\\tevent.stopPropagation();\\n\\t\\treturn false;\\n\\t}\\n\\treturn true;\\n};\\n\\nEditBitmapWidget.prototype.adjustCoordinates = function(x,y) {\\n\\tvar canvasRect = this.canvasDomNode.getBoundingClientRect(),\\n\\t\\tscale = this.canvasDomNode.width/canvasRect.width;\\n\\treturn {x: (x - canvasRect.left) * scale, y: (y - canvasRect.top) * scale};\\n};\\n\\nEditBitmapWidget.prototype.strokeStart = function(x,y) {\\n\\t// Start off a new stroke\\n\\tthis.stroke = [this.adjustCoordinates(x,y)];\\n};\\n\\nEditBitmapWidget.prototype.strokeMove = function(x,y) {\\n\\tvar ctx = this.canvasDomNode.getContext(\\\"2d\\\"),\\n\\t\\tt;\\n\\t// Add the new position to the end of the stroke\\n\\tthis.stroke.push(this.adjustCoordinates(x,y));\\n\\t// Redraw the previous image\\n\\tctx.drawImage(this.currCanvas,0,0);\\n\\t// Render the stroke\\n\\tctx.globalAlpha = parseFloat(this.wiki.getTiddlerText(LINE_OPACITY_TITLE,\\\"1.0\\\"));\\n\\tctx.strokeStyle = this.wiki.getTiddlerText(LINE_COLOUR_TITLE,\\\"#ff0\\\");\\n\\tctx.lineWidth = parseFloat(this.wiki.getTiddlerText(LINE_WIDTH_TITLE,\\\"3\\\"));\\n\\tctx.lineCap = \\\"round\\\";\\n\\tctx.lineJoin = \\\"round\\\";\\n\\tctx.beginPath();\\n\\tctx.moveTo(this.stroke[0].x,this.stroke[0].y);\\n\\tfor(t=1; t\u003Cthis.stroke.length-1; t++) {\\n\\t\\tvar s1 = this.stroke[t],\\n\\t\\t\\ts2 = this.stroke[t-1],\\n\\t\\t\\ttx = (s1.x + s2.x)/2,\\n\\t\\t\\tty = (s1.y + s2.y
2731)/2;\\n\\t\\tctx.quadraticCurveTo(s2.x,s2.y,tx,ty);\\n\\t}\\n\\tctx.stroke();\\n};\\n\\nEditBitmapWidget.prototype.strokeEnd = function() {\\n\\t// Copy the bitmap to the off-screen canvas\\n\\tvar ctx = this.currCanvas.getContext(\\\"2d\\\");\\n\\tctx.drawImage(this.canvasDomNode,0,0);\\n\\t// Save the image into the tiddler\\n\\tthis.saveChanges();\\n};\\n\\nEditBitmapWidget.prototype.saveChanges = function() {\\n\\tvar tiddler = this.wiki.getTiddler(this.editTitle) || new $tw.Tiddler({title: this.editTitle,type: DEFAULT_IMAGE_TYPE});\\n\\t// data URIs look like \\\"data:\u003Ctype>;base64,\u003Ctext>\\\"\\n\\tvar dataURL = this.canvasDomNode.toDataURL(tiddler.fields.type),\\n\\t\\tposColon = dataURL.indexOf(\\\":\\\"),\\n\\t\\tposSemiColon = dataURL.indexOf(\\\";\\\"),\\n\\t\\tposComma = dataURL.indexOf(\\\",\\\"),\\n\\t\\ttype = dataURL.substring(posColon+1,posSemiColon),\\n\\t\\ttext = dataURL.substring(posComma+1);\\n\\tvar update = {type: type, text: text};\\n\\tthis.wiki.addTiddler(new $tw.Tiddler(this.wiki.getModificationFields(),tiddler,update,this.wiki.getCreationFields()));\\n};\\n\\nexports[\\\"edit-bitmap\\\"] = EditBitmapWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/edit-shortcut.js\":{\"title\":\"$:/core/modules/widgets/edit-shortcut.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/edit-shortcut.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nWidget to display an editable keyboard shortcut\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar EditShortcutWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nEditShortcutWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nEditShortcutWidget.prototype.render = function(parent,nextSibling) {\\n\\tthis.parentDomNode = parent;\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n\\tthis.inputNode = this.document.createElement(\\\"input\\\");\\n\\t// Assign classes\\n\\tif(this.shortcutClass) {\\n\\t\\tthis.inputNode.className = this.shortcutClass;\\n\\t}\\n\\t// Assign other attributes\\n\\tif(this.shortcutStyle) {\\n\\t\\tthis.inputNode.setAttribute(\\\"style\\\",this.shortcutStyle);\\n\\t}\\n\\tif(this.shortcutTooltip) {\\n\\t\\tthis.inputNode.setAttribute(\\\"title\\\",this.shortcutTooltip);\\n\\t}\\n\\tif(this.shortcutPlaceholder) {\\n\\t\\tthis.inputNode.setAttribute(\\\"placeholder\\\",this.shortcutPlaceholder);\\n\\t}\\n\\tif(this.shortcutAriaLabel) {\\n\\t\\tthis.inputNode.setAttribute(\\\"aria-label\\\",this.shortcutAriaLabel);\\n\\t}\\n\\t// Assign the current shortcut\\n\\tthis.updateInputNode();\\n\\t// Add event handlers\\n\\t$tw.utils.addEventListeners(this.inputNode,[\\n\\t\\t{name: \\\"keydown\\\", handlerObject: this, handlerMethod: \\\"handleKeydownEvent\\\"}\\n\\t]);\\n\\t// Link into the DOM\\n\\tparent.insertBefore(this.inputNode,nextSibling);\\n\\tthis.domNodes.push(this.inputNode);\\n\\t// Focus the input Node if focus === \\\"yes\\\" or focus === \\\"true\\\"\\n\\tif(this.shortcutFocus === \\\"yes\\\" || this.shortcutFocus === \\\"true\\\") {\\n\\t\\tthis.focus();\\n\\t}\\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nEditShortcutWidget.prototype.execute = function() {\\n\\tthis.shortcutTiddler = this.getAttribute(\\\"tiddler\\\");\\n\\tthis.shortcutField = this.getAttribute(\\\"field\\\");\\n\\tthis.shortcutIndex = this.getAttribute(\\\"index\\\");\\n\\tthis.shortcutPlaceholder = this.getAttribute(\\\"placeholder\\\");\\n\\tthis.shortcutDefault = this.getAttribute(\\\"default\\\",\\\"\\\");\\n\\tthis.shortcutClass = this.getAttribute(\\\"class\\\");\\n\\tthis.shortcutStyle = this.getAttribute(\\\"style\\\");\\n\\tthis.shortcutTooltip = this.getAttribute(\\\"tooltip\\\");\\n\\tthis.shortcutAriaLabel = this.getAttribute(\\\"aria-label\\\");\\n\\tthis.shortcutFocus = this.getAttribute(\\\"focus\\\");\\n};
2731\\n\\n/*\\nUpdate the value of the input node\\n*/\\nEditShortcutWidget.prototype.updateInputNode = function() {\\n\\tif(this.shortcutField) {\\n\\t\\tvar tiddler = this.wiki.getTiddler(this.shortcutTiddler);\\n\\t\\tif(tiddler && $tw.utils.hop(tiddler.fields,this.shortcutField)) {\\n\\t\\t\\tthis.inputNode.value = tiddler.getFieldString(this.shortcutField);\\n\\t\\t} else {\\n\\t\\t\\tthis.inputNode.value = this.shortcutDefault;\\n\\t\\t}\\n\\t} else if(this.shortcutIndex) {\\n\\t\\tthis.inputNode.value = this.wiki.extractTiddlerDataItem(this.shortcutTiddler,this.shortcutIndex,this.shortcutDefault);\\n\\t} else {\\n\\t\\tthis.inputNode.value = this.wiki.getTiddlerText(this.shortcutTiddler,this.shortcutDefault);\\n\\t}\\n};\\n\\n/*\\nHandle a dom \\\"keydown\\\" event\\n*/\\nEditShortcutWidget.prototype.handleKeydownEvent = function(event) {\\n\\t// Ignore shift, ctrl, meta, alt\\n\\tif(event.keyCode && $tw.keyboardManager.getModifierKeys().indexOf(event.keyCode) === -1) {\\n\\t\\t// Get the shortcut text representation\\n\\t\\tvar value = $tw.keyboardManager.getPrintableShortcuts([{\\n\\t\\t\\tctrlKey: event.ctrlKey,\\n\\t\\t\\tshiftKey: event.shiftKey,\\n\\t\\t\\taltKey: event.altKey,\\n\\t\\t\\tmetaKey: event.metaKey,\\n\\t\\t\\tkeyCode: event.keyCode\\n\\t\\t}]);\\n\\t\\tif(value.length > 0) {\\n\\t\\t\\tthis.wiki.setText(this.shortcutTiddler,this.shortcutField,this.shortcutIndex,value[0]);\\n\\t\\t}\\n\\t\\t// Ignore the keydown if it was already handled\\n\\t\\tevent.preventDefault();\\n\\t\\tevent.stopPropagation();\\n\\t\\treturn true;\\n\\t} else {\\n\\t\\treturn false;\\n\\t}\\n};\\n\\n/*\\nfocus the input node\\n*/\\nEditShortcutWidget.prototype.focus = function() {\\n\\tif(this.inputNode.focus && this.inputNode.select) {\\n\\t\\tthis.inputNode.focus();\\n\\t\\tthis.inputNode.select();\\n\\t}\\n};\\n\\n/*\\nSelectively refreshes the widget if needed. Returns true if the widget needed re-rendering\\n*/\\nEditShortcutWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes();\\n\\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.placeholder || changedAttributes[\\\"default\\\"] || changedAttributes[\\\"class\\\"] || changedAttributes.style || changedAttributes.tooltip || changedAttributes[\\\"aria-label\\\"] || changedAttributes.focus) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t} else if(changedTiddlers[this.shortcutTiddler]) {\\n\\t\\tthis.updateInputNode();\\n\\t\\treturn true;\\n\\t} else {\\n\\t\\treturn false;\\n\\t}\\n};\\n\\nexports[\\\"edit-shortcut\\\"] = EditShortcutWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/edit-text.js\":{\"title\":\"$:/core/modules/widgets/edit-text.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/edit-text.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nEdit-text widget\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar editTextWidgetFactory = require(\\\"$:/core/modules/editor/factory.js\\\").editTextWidgetFactory,\\n\\tFramedEngine = require(\\\"$:/core/modules/editor/engines/framed.js\\\").FramedEngine,\\n\\tSimpleEngine = require(\\\"$:/core/modules/editor/engines/simple.js\\\").SimpleEngine;\\n\\nexports[\\\"edit-text\\\"] = editTextWidgetFactory(FramedEngine,SimpleEngine);\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/edit.js\":{\"title\":\"$:/core/modules/widgets/edit.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/edit.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nEdit widget is a meta-widget chooses the appropriate actual editting widget\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar EditWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};
2731\\n\\n/*\\nInherit from the base widget class\\n*/\\nEditWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nEditWidget.prototype.render = function(parent,nextSibling) {\\n\\tthis.parentDomNode = parent;\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n\\tthis.renderChildren(parent,nextSibling);\\n};\\n\\n// Mappings from content type to editor type are stored in tiddlers with this prefix\\nvar EDITOR_MAPPING_PREFIX = \\\"$:/config/EditorTypeMappings/\\\";\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nEditWidget.prototype.execute = function() {\\n\\t// Get our parameters\\n\\tthis.editTitle = this.getAttribute(\\\"tiddler\\\",this.getVariable(\\\"currentTiddler\\\"));\\n\\tthis.editField = this.getAttribute(\\\"field\\\",\\\"text\\\");\\n\\tthis.editIndex = this.getAttribute(\\\"index\\\");\\n\\tthis.editClass = this.getAttribute(\\\"class\\\");\\n\\tthis.editPlaceholder = this.getAttribute(\\\"placeholder\\\");\\n\\tthis.editTabIndex = this.getAttribute(\\\"tabindex\\\");\\n\\tthis.editFocus = this.getAttribute(\\\"focus\\\",\\\"\\\");\\n\\tthis.editCancelPopups = this.getAttribute(\\\"cancelPopups\\\",\\\"\\\");\\n\\tthis.editInputActions = this.getAttribute(\\\"inputActions\\\");\\n\\tthis.editRefreshTitle = this.getAttribute(\\\"refreshTitle\\\");\\n\\tthis.editAutoComplete = this.getAttribute(\\\"autocomplete\\\");\\n\\t// Choose the appropriate edit widget\\n\\tthis.editorType = this.getEditorType();\\n\\t// Make the child widgets\\n\\tthis.makeChildWidgets([{\\n\\t\\ttype: \\\"edit-\\\" + this.editorType,\\n\\t\\tattributes: this.parseTreeNode.attributes,\\n\\t\\tchildren: this.parseTreeNode.children\\n\\t}]);\\n};\\n\\nEditWidget.prototype.getEditorType = function() {\\n\\t// Get the content type of the thing we're editing\\n\\tvar type;\\n\\tif(this.editField === \\\"text\\\") {\\n\\t\\tvar tiddler = this.wiki.getTiddler(this.editTitle);\\n\\t\\tif(tiddler) {\\n\\t\\t\\ttype = tiddler.fields.type;\\n\\t\\t}\\n\\t}\\n\\ttype = type || \\\"text/vnd.tiddlywiki\\\";\\n\\tvar editorType = this.wiki.getTiddlerText(EDITOR_MAPPING_PREFIX + type);\\n\\tif(!editorType) {\\n\\t\\tvar typeInfo = $tw.config.contentTypeInfo[type];\\n\\t\\tif(typeInfo && typeInfo.encoding === \\\"base64\\\") {\\n\\t\\t\\teditorType = \\\"binary\\\";\\n\\t\\t} else {\\n\\t\\t\\teditorType = \\\"text\\\";\\n\\t\\t}\\n\\t}\\n\\treturn editorType;\\n};
2731\\n\\n/*\\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n*/\\nEditWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes();\\n\\t// Refresh if an attribute has changed, or the type associated with the target tiddler has changed\\n\\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.tabindex || changedAttributes.cancelPopups || changedAttributes.inputActions || changedAttributes.refreshTitle || changedAttributes.autocomplete || (changedTiddlers[this.editTitle] && this.getEditorType() !== this.editorType)) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t} else {\\n\\t\\treturn this.refreshChildren(changedTiddlers);\\n\\t}\\n};\\n\\nexports.edit = EditWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/element.js\":{\"title\":\"$:/core/modules/widgets/element.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/element.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nElement widget\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar ElementWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nElementWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nElementWidget.prototype.render = function(parent,nextSibling) {\\n\\tthis.parentDomNode = parent;\\n\\tthis.computeAttributes();\\n\\t// Neuter blacklisted elements\\n\\tthis.tag = this.parseTreeNode.tag;\\n\\tif($tw.config.htmlUnsafeElements.indexOf(this.tag) !== -1) {\\n\\t\\tthis.tag = \\\"safe-\\\" + this.tag;\\n\\t}\\n\\t// Restrict tag name to digits, letts and dashes\\n\\tthis.tag = this.tag.replace(/[^0-9a-zA-Z\\\\-]/mg,\\\"\\\");\\n\\t// Default to a span\\n\\tthis.tag = this.tag || \\\"span\\\";\\n\\t// Adjust headings by the current base level\\n\\tvar headingLevel = [\\\"h1\\\",\\\"h2\\\",\\\"h3\\\",\\\"h4\\\",\\\"h5\\\",\\\"h6\\\"].indexOf(this.tag);\\n\\tif(headingLevel !== -1) {\\n\\t\\tvar baseLevel = parseInt(this.getVariable(\\\"tv-adjust-heading-level\\\",\\\"0\\\"),10) || 0;\\n\\t\\theadingLevel = Math.min(Math.max(headingLevel + 1 + baseLevel,1),6);\\n\\t\\tthis.tag = \\\"h\\\" + headingLevel;\\n\\t}\\n\\t// Select the namespace for the tag\\n\\tvar XHTML_NAMESPACE = \\\"http://www.w3.org/1999/xhtml\\\",\\n\\t\\ttagNamespaces = {\\n\\t\\t\\tsvg: \\\"http://www.w3.org/2000/svg\\\",\\n\\t\\t\\tmath: \\\"http://www.w3.org/1998/Math/MathML\\\",\\n\\t\\t\\tbody: XHTML_NAMESPACE\\n\\t\\t};\\n\\tthis.namespace = tagNamespaces[this.tag];\\n\\tif(this.namespace) {\\n\\t\\tthis.setVariable(\\\"namespace\\\",this.namespace);\\n\\t} else {\\n\\t\\tif(this.hasAttribute(\\\"xmlns\\\")) {\\n\\t\\t\\tthis.namespace = this.getAttribute(\\\"xmlns\\\");\\n\\t\\t\\tthis.setVariable(\\\"namespace\\\",this.namespace);\\n\\t\\t} else {\\n\\t\\t\\tthis.namespace = this.getVariable(\\\"namespace\\\",{defaultValue: XHTML_NAMESPACE});\\n\\t\\t}\\n\\t}\\n\\t// Invoke the th-rendering-element hook\\n\\tvar parseTreeNodes = $tw.hooks.invokeHook(\\\"th-rendering-element\\\",null,this);\\n\\tthis.isReplaced = !!parseTreeNodes;\\n\\tif(parseTreeNodes) {\\n\\t\\t// Use the parse tree nodes provided by the hook\\n\\t\\tthis.makeChildWidgets(parseTreeNodes);\\n\\t\\tthis.renderChildren(this.parentDomNode,null);\\n\\t\\treturn;\\n\\t}\\n\\t// Make the child widgets\\n\\tthis.makeChildWidgets();\\n\\t// Create the DOM node and render children\\n\\tvar domNode = this.document.createElementNS(this.namespace,this.tag);\\n\\tthis.assignAttributes(domNode,{excludeEventAttributes: true});\\n\\tparent.insertBefore(domNode,nextSibling);\\n\\tthis.renderChildren(domNode,null);\\n\\tthis.domNodes.push(domNode);\\n};\\n\\n/*\\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n*/\\nElementWidget.prototype.refresh = function(ch
2731angedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes(),\\n\\t\\thasChangedAttributes = $tw.utils.count(changedAttributes) > 0;\\n\\tif(hasChangedAttributes) {\\n\\t\\tif(!this.isReplaced) {\\n\\t\\t\\t// Update our attributes\\n\\t\\t\\tthis.assignAttributes(this.domNodes[0],{excludeEventAttributes: true});\\n\\t\\t} else {\\n\\t\\t\\t// If we were replaced then completely refresh ourselves\\n\\t\\t\\treturn this.refreshSelf();\\n\\t\\t}\\n\\t}\\n\\treturn this.refreshChildren(changedTiddlers) || hasChangedAttributes;\\n};\\n\\nexports.element = ElementWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/encrypt.js\":{\"title\":\"$:/core/modules/widgets/encrypt.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/encrypt.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nEncrypt widget\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar EncryptWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nEncryptWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nEncryptWidget.prototype.render = function(parent,nextSibling) {\\n\\tthis.parentDomNode = parent;\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n\\tvar textNode = this.document.createTextNode(this.encryptedText);\\n\\tparent.insertBefore(textNode,nextSibling);\\n\\tthis.domNodes.push(textNode);\\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nEncryptWidget.prototype.execute = function() {\\n\\t// Get parameters from our attributes\\n\\tthis.filter = this.getAttribute(\\\"filter\\\",\\\"[!is[system]]\\\");\\n\\t// Encrypt the filtered tiddlers\\n\\tvar tiddlers = this.wiki.filterTiddlers(this.filter),\\n\\t\\tjson = {},\\n\\t\\tself = this;\\n\\t$tw.utils.each(tiddlers,function(title) {\\n\\t\\tvar tiddler = self.wiki.getTiddler(title),\\n\\t\\t\\tjsonTiddler = {};\\n\\t\\tfor(var f in tiddler.fields) {\\n\\t\\t\\tjsonTiddler[f] = tiddler.getFieldString(f);\\n\\t\\t}\\n\\t\\tjson[title] = jsonTiddler;\\n\\t});\\n\\tthis.encryptedText = $tw.utils.htmlEncode($tw.crypto.encrypt(JSON.stringify(json)));\\n};\\n\\n/*\\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n*/\\nEncryptWidget.prototype.refresh = function(changedTiddlers) {\\n\\t// We don't need to worry about refreshing because the encrypt widget isn't for interactive use\\n\\treturn false;\\n};\\n\\nexports.encrypt = EncryptWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/entity.js\":{\"title\":\"$:/core/modules/widgets/entity.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/entity.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nHTML entity widget\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar EntityWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nEntityWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nEntityWidget.prototype.render = function(parent,nextSibling) {\\n\\tthis.parentDomNode = parent;\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n\\tvar entityString = this.getAttribute(\\\"entity\\\",this.parseTreeNode.entity || \\\"\\\"),\\n\\t\\ttextNode = this.document.createTextNode($tw.utils.entityDecode(entityString));\\n\\tparent.insertBefore(textNode,nextSibling);\\n\\tthis.domNodes.push(textNode);\\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nEntityWidget.prototype.execute = function() {\\n};
2731\\n\\n/*\\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n*/\\nEntityWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes();\\n\\tif(changedAttributes.entity) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t} else {\\n\\t\\treturn false;\\n\\t}\\n};\\n\\nexports.entity = EntityWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/error.js\":{\"title\":\"$:/core/modules/widgets/error.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/error.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nError widget\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar ErrorWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nErrorWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nErrorWidget.prototype.render = function(parent,nextSibling) {\\n\\tthis.parentDomNode = parent;\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n\\tvar message = this.getAttribute(\\\"$message\\\",\\\"Unknown error\\\"),\\n\\t\\tdomNode = this.document.createElement(\\\"span\\\");\\n\\tdomNode.appendChild(this.document.createTextNode(message));\\n\\tdomNode.className = \\\"tc-error\\\";\\n\\tparent.insertBefore(domNode,nextSibling);\\n\\tthis.domNodes.push(domNode);\\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nErrorWidget.prototype.execute = function() {\\n\\t// Nothing to do for a text node\\n};\\n\\n/*\\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n*/\\nErrorWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes();\\n\\tif(changedAttributes[\\\"$message\\\"]) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t} else {\\n\\t\\treturn false;\\n\\t}\\n};\\n\\nexports.error = ErrorWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/eventcatcher.js\":{\"title\":\"$:/core/modules/widgets/eventcatcher.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/eventcatcher.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nEvent handler widget\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar EventWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nEventWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nEventWidget.prototype.render = function(parent,nextSibling) {\\n\\tvar self = this;\\n\\t// Remember parent\\n\\tthis.parentDomNode = parent;\\n\\t// Compute attributes and execute state\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n\\t// Create element\\n\\tvar tag = this.parseTreeNode.isBlock ? \\\"div\\\" : \\\"span\\\";\\n\\tif(this.elementTag && $tw.config.htmlUnsafeElements.indexOf(this.elementTag) === -1) {\\n\\t\\ttag = this.elementTag;\\n\\t}\\n\\tvar domNode = this.document.createElement(tag);\\n\\tthis.domNode = domNode;\\n\\t// Assign classes\\n\\tthis.assignDomNodeClasses();\\n\\t// Add our event handler\\n\\t$tw.utils.each(this.types,function(type) {\\n\\t\\tdomNode.addEventListener(type,function(event) {\\n\\t\\t\\tvar selector = self.getAttribute(\\\"selector\\\"),\\n\\t\\t\\t\\tmatchSelector = self.getAttribute(\\\"matchSelector\\\"),\\n\\t\\t\\t\\tactions = self.getAttribute(\\\"$\\\"+type) || self.getAttribute(\\\"actions-\\\"+type),\\n\\t\\t\\t\\tstopPropagation = self.getAttribute(\\\"stopPropagation\\\",\\\"onaction\\\"),\\n\\t\\t\\t\\tselectedNode = event.target,\\n\\t\\t\\t\\tselectedNodeRect,\\n\\t\\t\\t\\tcatcherNodeRect,\\n\\t\\t\\t\\tvariables = {};\\n\\t\\t\\t// Firefox can fire dragover and dragenter events on text nodes instead of their parents\\n\\t\\t\\tif(selectedNode.nodeType === 3) {\\n\\t\\t\\t\\tselectedNode = selectedNode.parentNode;\\n\\t\\t\\t}\\n\\t\\t\\t// Check that the selected node matches any matchSelector\\n\\t\\t\\tif(matchSelector && !$tw.utils.domMatchesSelector(selectedNode,matchSelector)) {\\n\\t\\t\\t\\treturn false;\\n\\t\\t\\t}\\n\\t\\t\\tif(selector) {\\n\\t\\t\\t\\t// Search ancestors for a node that matches the selector\\n\\t\\t\\t\\twhile(!$tw.utils.domMatchesSelector(selectedNode,selector) && selectedNode !== domNode) {\\n\\t\\t\\t\\t\\tselectedNode = selectedNode.parentNode;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t// Exit if we didn't find one\\n\\t\\t\\t\\tif(selectedNode === domNode) {\\n\\t\\t\\t\\t\\treturn false;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t// Only set up variables if we have actions to invoke\\n\\t\\t\\t\\tif(actions) {\\n\\t\\t\\t\\t\\tvariables = $tw.utils.collectDOMVariables(selectedNode,self.domNode,event);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\t// Execute our actions with the variables\\n\\t\\t\\tif(actions) {\\n\\t\\t\\t\\t// Add a variable for the modifier key\\n\\t\\t\\t\\tvariables.modifier = $tw.keyboardManager.getEventModifierKeyDescriptor(event);\\n\\t\\t\\t\\t// Add a variable for the mouse button\\n\\t\\t\\t\\tif(\\\"button\\\" in event) {\\n\\t\\t\\t\\t\\tif(event.button === 0) {\\n\\t\\t\\t\\t\\t\\tvariables[\\\"event-mousebutton\\\"] = \\\"left\\\";\\n\\t\\t\\t\\t\\t} else if(event.button === 1) {\\n\\t\\t\\t\\t\\t\\tvariables[\\\"event-mousebutton\\\"] = \\\"middle\\\";\\n\\t\\t\\t\\t\\t} else if(event.button === 2) {\\n\\t\\t\\t\\t\\t\\tvariables[\\\"event-mousebutton\\\"] = \\\"right\\\";\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tvariables[\\\"event-type\\\"] = event.type.toString();\\n\\t\\t\\t\\tif(typeof event.detail === \\\"object\\\" && !!event.detail) {\\n\\t\\t\\t\\t\\t$t
2731w.utils.each(event.detail,function(detailValue,detail) {\\n\\t\\t\\t\\t\\t\\tvariables[\\\"event-detail-\\\" + detail] = detailValue.toString();\\n\\t\\t\\t\\t\\t});\\n\\t\\t\\t\\t} else if(!!event.detail) {\\n\\t\\t\\t\\t\\tvariables[\\\"event-detail\\\"] = event.detail.toString();\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tself.invokeActionString(actions,self,event,variables);\\n\\t\\t\\t}\\n\\t\\t\\tif((actions && stopPropagation === \\\"onaction\\\") || stopPropagation === \\\"always\\\") {\\n\\t\\t\\t\\tevent.preventDefault();\\n\\t\\t\\t\\tevent.stopPropagation();\\n\\t\\t\\t\\treturn true;\\n\\t\\t\\t}\\n\\t\\t\\treturn false;\\n\\t\\t},false);\\n\\t});\\n\\t// Insert element\\n\\tparent.insertBefore(domNode,nextSibling);\\n\\tthis.renderChildren(domNode,null);\\n\\tthis.domNodes.push(domNode);\\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nEventWidget.prototype.execute = function() {\\n\\tvar self = this;\\n\\t// Get attributes that require a refresh on change\\n\\tthis.types = [];\\n\\t$tw.utils.each(this.attributes,function(value,key) {\\n\\t\\tif(key.charAt(0) === \\\"$\\\") {\\n\\t\\t\\tself.types.push(key.slice(1));\\n\\t\\t}\\n\\t});\\n\\tif(!this.types.length) {\\n\\t\\tthis.types = this.getAttribute(\\\"events\\\",\\\"\\\").split(\\\" \\\");\\n\\t}\\n\\tthis.elementTag = this.getAttribute(\\\"tag\\\");\\n\\t// Make child widgets\\n\\tthis.makeChildWidgets();\\n};\\n\\nEventWidget.prototype.assignDomNodeClasses = function() {\\n\\tvar classes = this.getAttribute(\\\"class\\\",\\\"\\\").split(\\\" \\\");\\n\\tclasses.push(\\\"tc-eventcatcher\\\");\\n\\tthis.domNode.className = classes.join(\\\" \\\");\\n};\\n\\n/*\\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n*/\\nEventWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes(),\\n\\t\\tchangedAttributesCount = $tw.utils.count(changedAttributes);\\n\\tif(changedAttributesCount === 1 && changedAttributes[\\\"class\\\"]) {\\n\\t\\tthis.assignDomNodeClasses();\\n\\t} else if(changedAttributesCount > 0) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t}\\n\\treturn this.refreshChildren(changedTiddlers);\\n};\\n\\nexports.eventcatcher = EventWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/fieldmangler.js\":{\"title\":\"$:/core/modules/widgets/fieldmangler.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/fieldmangler.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nField mangler widget\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar FieldManglerWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nFieldManglerWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nFieldManglerWidget.prototype.render = function(parent,nextSibling) {\\n\\tthis.addEventListeners([\\n\\t\\t{type: \\\"tm-remove-field\\\", handler: \\\"handleRemoveFieldEvent\\\"},\\n\\t\\t{type: \\\"tm-add-field\\\", handler: \\\"handleAddFieldEvent\\\"},\\n\\t\\t{type: \\\"tm-remove-tag\\\", handler: \\\"handleRemoveTagEvent\\\"},\\n\\t\\t{type: \\\"tm-add-tag\\\", handler: \\\"handleAddTagEvent\\\"}\\n\\t]);\\n\\tthis.parentDomNode = parent;\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n\\tthis.renderChildren(parent,nextSibling);\\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nFieldManglerWidget.prototype.execute = function() {\\n\\t// Get our parameters\\n\\tthis.mangleTitle = this.getAttribute(\\\"tiddler\\\",this.getVariable(\\\"currentTiddler\\\"));\\n\\t// Construct the child widgets\\n\\tthis.makeChildWidgets();\\n};\\n\\n/*\\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n*/\\nFieldManglerWidget.prototype.refresh = function(ch
2731angedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes();\\n\\tif(changedAttributes.tiddler) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t} else {\\n\\t\\treturn this.refreshChildren(changedTiddlers);\\n\\t}\\n};\\n\\nFieldManglerWidget.prototype.handleRemoveFieldEvent = function(event) {\\n\\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\\n\\t\\tdeletion = {};\\n\\tdeletion[event.param] = undefined;\\n\\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,deletion));\\n\\treturn false;\\n};\\n\\nFieldManglerWidget.prototype.handleAddFieldEvent = function(event) {\\n\\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\\n\\t\\taddition = this.wiki.getModificationFields(),\\n\\t\\taddField = function(name,value) {\\n\\t\\t\\tvar trimmedName = name.trim();\\n\\t\\t\\tif(!value && tiddler) {\\n\\t\\t\\t\\tvalue = tiddler.fields[trimmedName];\\n\\t\\t\\t}\\n\\t\\t\\taddition[trimmedName] = value || \\\"\\\";\\n\\t\\t\\treturn;\\n\\t\\t};\\n\\taddition.title = this.mangleTitle;\\n\\tif(typeof event.param === \\\"string\\\") {\\n\\t\\taddField(event.param,\\\"\\\");\\n\\t}\\n\\tif(typeof event.paramObject === \\\"object\\\") {\\n\\t\\tfor(var name in event.paramObject) {\\n\\t\\t\\taddField(name,event.paramObject[name]);\\n\\t\\t}\\n\\t}\\n\\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,addition));\\n\\treturn false;\\n};\\n\\nFieldManglerWidget.prototype.handleRemoveTagEvent = function(event) {\\n\\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\\n\\t\\tmodification = this.wiki.getModificationFields();\\n\\tif(tiddler && tiddler.fields.tags) {\\n\\t\\tvar p = tiddler.fields.tags.indexOf(event.param);\\n\\t\\tif(p !== -1) {\\n\\t\\t\\tmodification.tags = (tiddler.fields.tags || []).slice(0);\\n\\t\\t\\tmodification.tags.splice(p,1);\\n\\t\\t\\tif(modification.tags.length === 0) {\\n\\t\\t\\t\\tmodification.tags = undefined;\\n\\t\\t\\t}\\n\\t\\t\\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,modification));\\n\\t\\t}\\n\\t}\\n\\treturn false;\\n};\\n\\nFieldManglerWidget.prototype.handleAddTagEvent = function(event) {\\n\\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\\n\\t\\tmodification = this.wiki.getModificationFields();\\n\\tif(tiddler && typeof event.param === \\\"string\\\") {\\n\\t\\tvar tag = event.param.trim();\\n\\t\\tif(tag !== \\\"\\\") {\\n\\t\\t\\tmodification.tags = (tiddler.fields.tags || []).slice(0);\\n\\t\\t\\t$tw.utils.pushTop(modification.tags,tag);\\n\\t\\t\\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,modification));\\n\\t\\t}\\n\\t} else if(typeof event.param === \\\"string\\\" && event.param.trim() !== \\\"\\\" && this.mangleTitle.trim() !== \\\"\\\") {\\n\\t\\tvar tag = [];\\n\\t\\ttag.push(event.param.trim());\\n\\t\\tthis.wiki.addTiddler(new $tw.Tiddler({title: this.mangleTitle, tags: tag},modification));\\n\\t}\\n\\treturn false;\\n};\\n\\nexports.fieldmangler = FieldManglerWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/fields.js\":{\"title\":\"$:/core/modules/widgets/fields.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/fields.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nFields widget\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar FieldsWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nFieldsWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nFieldsWidget.prototype.render = function(parent,nextSibling) {\\n\\tthis.parentDomNode = parent;\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n\\tvar textNode = this.document.createTextNode(this.text);\\n\\tparent.insertBefore(textNode,nextSibling);\\n\\tthis.domNodes.push(textNode);\\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nFieldsWidget.prototype.execute = function() {\\n\\t// Get parameters from our attributes\\n\\tthis.tiddlerTitle = this.getAttribute(\\\"tiddler\\\",this.getVariable(\\\"currentTiddler\\\"));\\n\\tthis.template = this.getAttribute(\\\"template\\\");\\n\\tthis.sort = this.getAttribute(\\\"sort\\\",\\\"yes\\\") === \\\"yes\\\";\\n\\tthis.sortReverse = this.getAttribute(\\\"sortReverse\\\",\\\"no\\\") === \\\"yes\\\";\\n\\tthis.exclude = this.getAttribute(\\\"exclude\\\");\\n\\tthis.include = this.getAttribute(\\\"include\\\",null);\\n\\tthis.stripTitlePrefix = this.getAttribute(\\\"stripTitlePrefix\\\",\\\"no\\\") === \\\"yes\\\";\\n\\t// Get the value to display\\n\\tvar tiddler = this.wiki.getTiddler(this.tiddlerTitle);\\n\\n\\t// Get the inclusion and exclusion list\\n\\tvar excludeArr = (this.exclude) ? this.exclude.split(\\\" \\\") : [\\\"text\\\"];\\n\\t// Include takes precedence\\n\\tvar includeArr = (this.include) ? this.include.split(\\\" \\\") : null;\\n\\n\\t// Compose the template\\n\\tvar text = [];\\n\\tif(this.template && tiddler) {\\n\\t\\tvar fields = [];\\n\\t\\tif (includeArr) { // Include takes precedence\\n\\t\\t\\tfor(var i=0; i\u003CincludeArr.length; i++) {\\n\\t\\t\\t\\tif(tiddler.fields[includeArr[i]]) {\\n\\t\\t\\t\\t\\tfields.push(includeArr[i]);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\t\\t\\tfor(var fieldName in tiddler.fields) {\\n\\t\\t\\t\\tif(excludeArr.indexOf(fieldName) === -1) {\\n\\t\\t\\t\\t\\tfields.push(fieldName);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tif (this.sort) fields.sort();\\n\\t\\tif (this.sortReverse) fields.reverse();\\n\\t\\tfor(var f=0, fmax=fields.length; f\u003Cfmax; f++) {\\n\\t\\t\\tfieldName = fields[f];\\n\\t\\t\\tvar row = this.template,\\n\\t\\t\\t\\tvalue = tiddler.getFieldString(fieldName);\\n\\t\\t\\tif(this.stripTitlePrefix && fieldName === \\\"title\\\") {\\n\\t\\t\\t\\tvar reStrip = /^\\\\{[^\\\\}]+\\\\}
2731(.+)/mg,\\n\\t\\t\\t\\t\\treMatch = reStrip.exec(value);\\n\\t\\t\\t\\tif(reMatch) {\\n\\t\\t\\t\\t\\tvalue = reMatch[1];\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\trow = $tw.utils.replaceString(row,\\\"$name$\\\",fieldName);\\n\\t\\t\\trow = $tw.utils.replaceString(row,\\\"$value$\\\",value);\\n\\t\\t\\trow = $tw.utils.replaceString(row,\\\"$encoded_value$\\\",$tw.utils.htmlEncode(value));\\n\\t\\t\\ttext.push(row);\\n\\t\\t}\\n\\t}\\n\\tthis.text = text.join(\\\"\\\");\\n};\\n\\n/*\\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n*/\\nFieldsWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes();\\n\\tif( changedAttributes.tiddler || changedAttributes.template || changedAttributes.exclude ||\\n\\t\\tchangedAttributes.include || changedAttributes.sort || changedAttributes.sortReverse ||\\n\\t\\tchangedTiddlers[this.tiddlerTitle] || changedAttributes.stripTitlePrefix) {\\n\\t\\t\\tthis.refreshSelf();\\n\\t\\t\\treturn true;\\n\\t} else {\\n\\t\\treturn false;\\n\\t}\\n};\\n\\nexports.fields = FieldsWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/fill.js\":{\"title\":\"$:/core/modules/widgets/fill.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/fill.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nSub-widget used by the transclude widget for specifying values for slots within transcluded content. It doesn't do anything by itself because the transclude widget only ever deals with the parse tree nodes, and doesn't instantiate the widget itself\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar FillWidget = function(parseTreeNode,options) {\\n\\t// Initialise\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nFillWidget.prototype = new Widget();\\n\\nexports.fill = FillWidget;\\n\\n})();\\n\\t\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/genesis.js\":{\"title\":\"$:/core/modules/widgets/genesis.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/genesis.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nGenesis widget for dynamically creating widgets\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar GenesisWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nGenesisWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nGenesisWidget.prototype.render = function(parent,nextSibling) {\\n\\tthis.parentDomNode = parent;\\n\\tthis.computeAttributes({filterFn: function(name) {\\n\\t\\t// Only compute our own attributes which start with a single dollar\\n\\t\\treturn name.charAt(0) === \\\"$\\\" && name.charAt(1) !== \\\"$\\\";\\n\\t}});\\n\\tthis.execute();\\n\\tthis.renderChildren(parent,nextSibling);\\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nGenesisWidget.prototype.execute = function() {\\n\\tvar self = this;\\n\\t// Collect attributes\\n\\tthis.genesisType = this.getAttribute(\\\"$type\\\");\\n\\tthis.genesisRemappable = this.getAttribute(\\\"$remappable\\\",\\\"yes\\\") === \\\"yes\\\";\\n\\tthis.genesisNames = this.getAttribute(\\\"$names\\\",\\\"\\\");\\n\\tthis.genesisValues = this.getAttribute(\\\"$values\\\",\\\"\\\");\\n\\tthis.genesisIsBlock = this.getAttribute(\\\"$mode\\\",this.parseTreeNode.isBlock && \\\"block\\\") === \\\"block\\\";\\n\\t// Do not create a child widget if the $type attribute is missing or blank\\n\\tif(!this.genesisType) {\\n\\t\\tthis.makeChildWidgets(this.parseTreeNode.children);\\n\\t\\treturn;\\n\\t}\\n\\t// Construct parse tree\\n\\tvar isElementWidget = this.genesisType.charAt(0) !== \\\"$\\\",\\n\\t\\tnodeType = isElementWidget ? \\\"element\\\" : this.genesisType.substr(1),\\n\\t\\tnodeTag = isElementWidget ? this.genesisType : undefined;\\n\\tvar parseTreeNodes = [{\\n\\t\\ttype: nodeType,\\n\\t\\ttag: nodeTag,\\n\\t\\tattributes: {},\\n\\t\\torderedAttributes: [],\\n\\t\\tisBlock: this.genesisIsBlock,\\n\\t\\tchildren: this.parseTreeNode.children || [],\\n\\t\\tisNotRemappable: !this.genesisRemappable\\n\\t}];\\n\\t// Apply explicit attributes\\n\\t$tw.utils.each($tw.utils.getOrderedAttributesFromParseTreeNode(this.parseTreeNode),function(attribute) {\\n\\t\\tvar name = attribute.name;\\n\\t\\tif(name.charAt(0) === \\\"$\\\") {\\n\\t\\t\\tif(name.charAt(1) === \\\"$\\\") {\\n\\t\\t\\t\\t// Double $$ is changed to a single $\\n\\t\\t\\t\\tname = name.substr(1);\\n\\t\\t\\t} else {\\n\\t\\t\\t\\t// Single dollar is ignored\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\t$tw.utils.addAttributeToParseTreeNode(parseTreeNodes[0],$tw.utils.extend({},attribute,{name: name}));\\n\\t});\\n\\t// Apply attributes in $names/$values\\n\\tthis.attributeNames = [];\\n\\tthis.attributeValues = [];\\n\\tif(this.genesisNames && this.genesisValues) {\\n\\t\\tthis.attributeNames = this.wiki.filterTiddlers(self.genesisNames,this);\\n\\t\\tthis.attributeValues = this.wiki.filterTiddlers(self.genesisValues,this);\\n\\t\\t$tw.utils.each(this.attributeNames,function(varname,index) {\\n\\t\\t\\t$t
2731w.utils.addAttributeToParseTreeNode(parseTreeNodes[0],varname,self.attributeValues[index] || \\\"\\\");\\n\\t\\t});\\n\\t}\\n\\t// Construct the child widgets\\n\\tthis.makeChildWidgets(parseTreeNodes);\\n};\\n\\n/*\\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n*/\\nGenesisWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes(),\\n\\t\\tfilterNames = this.getAttribute(\\\"$names\\\",\\\"\\\"),\\n\\t\\tfilterValues = this.getAttribute(\\\"$values\\\",\\\"\\\"),\\n\\t\\tattributeNames = this.wiki.filterTiddlers(filterNames,this),\\n\\t\\tattributeValues = this.wiki.filterTiddlers(filterValues,this);\\n\\tif($tw.utils.count(changedAttributes) > 0 || !$tw.utils.isArrayEqual(this.attributeNames,attributeNames) || !$tw.utils.isArrayEqual(this.attributeValues,attributeValues)) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t} else {\\n\\t\\treturn this.refreshChildren(changedTiddlers);\\n\\t}\\n};\\n\\nexports.genesis = GenesisWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/image.js\":{\"title\":\"$:/core/modules/widgets/image.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/image.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nThe image widget displays an image referenced with an external URI or with a local tiddler title.\\n\\n```\\n\u003C$image src=\\\"TiddlerTitle\\\" width=\\\"320\\\" height=\\\"400\\\" class=\\\"classnames\\\">\\n```\\n\\nThe image source can be the title of an existing tiddler or the URL of an external image.\\n\\nExternal images always generate an HTML `\u003Cimg>` tag.\\n\\nTiddlers that have a _canonical_uri field generate an HTML `\u003Cimg>` tag with the src attribute containing the URI.\\n\\nTiddlers that contain image data generate an HTML `\u003Cimg>` tag with the src attribute containing a base64 representation of the image.\\n\\nTiddlers that contain wikitext could be rendered to a DIV of the usual size of a tiddler, and then transformed to the size requested.\\n\\nThe width and height attributes are interpreted as a number of pixels, and do not need to include the \\\"px\\\" suffix.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar ImageWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nImageWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nImageWidget.prototype.render = function(parent,nextSibling) {\\n\\tthis.parentDomNode = parent;\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n\\t// Create element\\n\\t// Determine what type of image it is\\n\\tvar tag = \\\"img\\\", src = \\\"\\\",\\n\\t\\ttiddler = this.wiki.getTiddler(this.imageSource);\\n\\tif(!tiddler) {\\n\\t\\t// The source isn't the title of a tiddler, so we'll assume it's a URL\\n\\t\\tsrc = this.getVariable(\\\"tv-get-export-image-link\\\",{params: [{name: \\\"src\\\",value: this.imageSource}],defaultValue: this.imageSource});\\n\\t} else {\\n\\t\\t// Check if it is an image tiddler\\n\\t\\tif(this.wiki.isImageTiddler(this.imageSource)) {\\n\\t\\t\\tvar type = tiddler.fields.type,\\n\\t\\t\\t\\ttext = tiddler.fields.text,\\n\\t\\t\\t\\t_canonical_uri = tiddler.fields._canonical_uri;\\n\\t\\t\\t// If the tiddler has body text then it doesn't need to be lazily loaded\\n\\t\\t\\tif(text) {\\n\\t\\t\\t\\t// Render the appropriate element for the image type\\n\\t\\t\\t\\tswitch(type) {\\n\\t\\t\\t\\t\\tcase \\\"application/pdf\\\":\\n\\t\\t\\t\\t\\t\\ttag = \\\"embed\\\";\\n\\t\\t\\t\\t\\t\\tsrc = \\\"data:application/pdf;base64,\\\" + text;\\n\\t\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t\\tcase \\\"image/svg+xml\\\":\\n\\t\\t\\t\\t\\t\\tsrc = \\\"data:image/svg+xml,\\\" + encodeURIComponent(text);\\n\\t\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t\\tdefault:\\n\\t\\t\\t\\t\\t\\tsrc = \\\"data:\\\" + type + \\\";base64,\\\" + text;\\n\\t\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else if(_canonical_uri) {\\n\\t\\t\\t\\tswitch(type) {\\n\\t\\t\\t\\t\\tcase \\\"application/pdf\\\":\\n\\t\\t\\t\\t\\t\\ttag = \\\"embed\\\";
2731\\n\\t\\t\\t\\t\\t\\tsrc = _canonical_uri;\\n\\t\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t\\tcase \\\"image/svg+xml\\\":\\n\\t\\t\\t\\t\\t\\tsrc = _canonical_uri;\\n\\t\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t\\tdefault:\\n\\t\\t\\t\\t\\t\\tsrc = _canonical_uri;\\n\\t\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else {\\n\\t\\t\\t\\t// Just trigger loading of the tiddler\\n\\t\\t\\t\\tthis.wiki.getTiddlerText(this.imageSource);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\t// Create the element and assign the attributes\\n\\tvar domNode = this.document.createElement(tag);\\n\\tdomNode.setAttribute(\\\"src\\\",src);\\n\\tif(this.imageClass) {\\n\\t\\tdomNode.setAttribute(\\\"class\\\",this.imageClass);\\n\\t}\\n\\tif(this.imageWidth) {\\n\\t\\tdomNode.setAttribute(\\\"width\\\",this.imageWidth);\\n\\t}\\n\\tif(this.imageHeight) {\\n\\t\\tdomNode.setAttribute(\\\"height\\\",this.imageHeight);\\n\\t}\\n\\tif(this.imageTooltip) {\\n\\t\\tdomNode.setAttribute(\\\"title\\\",this.imageTooltip);\\n\\t}\\n\\tif(this.imageAlt) {\\n\\t\\tdomNode.setAttribute(\\\"alt\\\",this.imageAlt);\\n\\t}\\n\\tif(this.lazyLoading && tag === \\\"img\\\") {\\n\\t\\tdomNode.setAttribute(\\\"loading\\\",this.lazyLoading);\\n\\t}
2731\\n\\t// Add classes when the image loads or fails\\n\\t$tw.utils.addClass(domNode,\\\"tc-image-loading\\\");\\n\\tdomNode.addEventListener(\\\"load\\\",function() {\\n\\t\\t$tw.utils.removeClass(domNode,\\\"tc-image-loading\\\");\\n\\t\\t$tw.utils.addClass(domNode,\\\"tc-image-loaded\\\");\\n\\t},false);\\n\\tdomNode.addEventListener(\\\"error\\\",function() {\\n\\t\\t$tw.utils.removeClass(domNode,\\\"tc-image-loading\\\");\\n\\t\\t$tw.utils.addClass(domNode,\\\"tc-image-error\\\");\\n\\t},false);\\n\\t// Insert element\\n\\tparent.insertBefore(domNode,nextSibling);\\n\\tthis.domNodes.push(domNode);\\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nImageWidget.prototype.execute = function() {\\n\\t// Get our parameters\\n\\tthis.imageSource = this.getAttribute(\\\"source\\\");\\n\\tthis.imageWidth = this.getAttribute(\\\"width\\\");\\n\\tthis.imageHeight = this.getAttribute(\\\"height\\\");\\n\\tthis.imageClass = this.getAttribute(\\\"class\\\");\\n\\tthis.imageTooltip = this.getAttribute(\\\"tooltip\\\");\\n\\tthis.imageAlt = this.getAttribute(\\\"alt\\\");\\n\\tthis.lazyLoading = this.getAttribute(\\\"loading\\\");\\n};\\n\\n/*\\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n*/\\nImageWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes();\\n\\tif(changedAttributes.source || changedAttributes.width || changedAttributes.height || changedAttributes[\\\"class\\\"] || changedAttributes.tooltip || changedTiddlers[this.imageSource]) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t} else {\\n\\t\\treturn false;\\n\\t}\\n};\\n\\nexports.image = ImageWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/importvariables.js\":{\"title\":\"$:/core/modules/widgets/importvariables.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/importvariables.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nImport variable definitions from other tiddlers\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar ImportVariablesWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nImportVariablesWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nImportVariablesWidget.prototype.render = function(parent,nextSibling) {\\n\\tthis.parentDomNode = parent;\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n\\tthis.renderChildren(parent,nextSibling);\\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nImportVariablesWidget.prototype.execute = function(tiddlerList) {\\n\\tvar widgetPointer = this;\\n\\t// Got to flush all the accumulated variables\\n\\tthis.variables = Object.create(null);\\n\\tif(this.parentWidget) {\\n\\t\\tObject.setPrototypeOf(this.variables,this.parentWidget.variables);\\n\\t}\\n\\t// Get our parameters\\n\\tthis.filter = this.getAttribute(\\\"filter\\\");\\n\\t// Compute the filter\\n\\tthis.tiddlerList = tiddlerList || this.wiki.filterTiddlers(this.filter,this);\\n\\t// Accumulate the \u003C$set> widgets from each tiddler\\n\\t$tw.utils.each(this.tiddlerList,function(title) {\\n\\t\\tvar parser = widgetPointer.wiki.parseTiddler(title,{parseAsInline:true, configTrimWhiteSpace:true});\\n\\t\\tif(parser) {\\n\\t\\t\\tvar parseTreeNode = parser.tree[0];\\n\\t\\t\\twhile(parseTreeNode && [\\\"setvariable\\\",\\\"set\\\",\\\"parameters\\\"].indexOf(parseTreeNode.type) !== -1) {\\n\\t\\t\\t\\tvar node = {\\n\\t\\t\\t\\t\\ttype: \\\"set\\\",\\n\\t\\t\\t\\t\\tattributes: parseTreeNode.attributes,\\n\\t\\t\\t\\t\\tparams: parseTreeNode.params,\\n\\t\\t\\t\\t\\tisMacroDefinition: parseTreeNode.isMacroDefinition,\\n\\t\\t\\t\\t\\tisFunctionDefinition: parseTreeNode.isFunctionDefinition,\\n\\t\\t\\t\\t\\tisProcedureDefinition: parseTreeNode.isProcedureDefinition,\\n\\t\\t\\t\\t\\tisWidgetDefinition: parseTreeNode.isWidgetDefinition,\\n\\t\\t\\t\\t\\tconfigTrimWhiteSpace: parseTreeNode.configTrimWhiteSpace\\n\\t\\t\\t\\t};\\n\\t\\t\\t\\tif(parseTreeNode.type === \\\"set\\\" || parseTreeNode.type === \\\"setvariable\\\") {\\n\\t\\t\\t\\t\\tif(parseTreeNode.isMacroDefinition || parseTreeNode.isProcedureDefinition || parseTreeNode.isWidgetDefinition || parseTreeNode.isFunctionDefinition) {\\n\\t\\t\\t\\t\\t\\t// Macro definitions can be folded into\\n\\t\\t\\t\\t\\t\\t// current widget instead of adding\\n\\t\\t\\t\\t\\t\\t// another link to the chain.\\n\\t\\t\\t\\t\\t\\tvar widget = widgetPointer.makeChildWidget(node);\\n\\t\\t\\t\\t\\t\\twidget.computeAttributes();\\n\\t\\t\\t\\t\\t\\twidget.execute();\\n\\t\\t\\t\\t\\t\\t// We SHALLOW copy over all variables\\n\\t\\t\\t\\t\\t\\t// in widget. We can't use\\n\\t\\t\\t\\t\\t\\t// $tw.utils.assign, because that c
2731opies\\n\\t\\t\\t\\t\\t\\t// up the prototype chain, which we\\n\\t\\t\\t\\t\\t\\t// don't want.\\n\\t\\t\\t\\t\\t\\t$tw.utils.each(Object.keys(widget.variables), function(key) {\\n\\t\\t\\t\\t\\t\\t\\twidgetPointer.variables[key] = widget.variables[key];\\n\\t\\t\\t\\t\\t\\t});\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\twidgetPointer.children = [widgetPointer.makeChildWidget(node)];\\n\\t\\t\\t\\t\\t\\t// No more regenerating children for\\n\\t\\t\\t\\t\\t\\t// this widget. If it needs to refresh,\\n\\t\\t\\t\\t\\t\\t// it'll do so along with the the whole\\n\\t\\t\\t\\t\\t\\t// importvariable tree.\\n\\t\\t\\t\\t\\t\\tif (widgetPointer != this) {\\n\\t\\t\\t\\t\\t\\t\\twidgetPointer.makeChildWidgets = function(){};\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\twidgetPointer = widgetPointer.children[0];\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tparseTreeNode = parseTreeNode.children && parseTreeNode.children[0];\\n\\t\\t\\t}\\n\\t\\t} \\n\\t});\\n\\n\\tif (widgetPointer != this) {\\n\\t\\twidgetPointer.parseTreeNode.children = this.parseTreeNode.children;\\n\\t} else {\\n\\t\\twidgetPointer.makeChildWidgets();\\n\\t}\\n};\\n\\n/*\\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n*/\\nImportVariablesWidget.prototype.refresh = function(changedTiddlers) {\\n\\t// Recompute our attributes and the filter list\\n\\tvar changedAttributes = this.computeAttributes(),\\n\\t\\ttiddlerList = this.wiki.filterTiddlers(this.getAttribute(\\\"filter\\\"),this);\\n\\t// Refresh if the filter has changed, or the list of tiddlers has changed, or any of the tiddlers in the list has changed\\n\\tfunction haveListedTiddlersChanged() {\\n\\t\\tvar changed = false;\\n\\t\\ttiddlerList.forEach(function(title) {\\n\\t\\t\\tif(changedTiddlers[title]) {\\n\\t\\t\\t\\tchanged = true;\\n\\t\\t\\t}\\n\\t\\t});\\n\\t\\treturn changed;\\n\\t}\\n\\tif(changedAttributes.filter || !$tw.utils.isArrayEqual(this.tiddlerList,tiddlerList) || haveListedTiddlersChanged()) {\\n\\t\\t// Compute the filter\\n\\t\\tthis.removeChildDomNodes();\\n\\t\\tthis.execute(tiddlerList);\\n\\t\\tthis.renderChildren(this.parentDomNode,this.findNextSiblingDomNode());\\n\\t\\treturn true;\\n\\t} else {\\n\\t\\treturn this.refreshChildren(changedTiddlers);\\n\\t}\\n};\\n\\nexports.importvariables = ImportVariablesWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/jsontiddler.js\":{\"title\":\"$:/core/modules/widgets/jsontiddler.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/jsontiddler.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nRender a tiddler as JSON text\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar JSONTiddlerWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nJSONTiddlerWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nJSONTiddlerWidget.prototype.render = function(parent,nextSibling) {\\n\\tvar self = this;\\n\\tthis.parentDomNode = parent;\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n\\t// Collect the fields from the optional base tiddler\\n\\tvar fields = this.getTiddlerFields();\\n\\t// Add custom fields specified in attributes starting with $\\n\\t$tw.utils.each(this.attributes,function(attribute,name) {\\n\\t\\tif(name.charAt(0) === \\\"$\\\") {\\n\\t\\t\\tfields[name.slice(1)] = attribute;\\n\\t\\t}\\n\\t});\\n\\t// JSONify\\n\\tvar json = JSON.stringify(fields);\\n\\t// Escape unsafe script characters\\n\\tif(this.attEscapeUnsafeScriptChars) {\\n\\t\\tjson = json.replace(/\u003C/g,\\\"\\\\\\\\u003C\\\");\\n\\t}\\n\\t// Update the DOM\\n\\tvar textNode = this.document.createTextNode(json);\\n\\tparent.insertBefore(textNode,nextSibling);\\n\\tthis.domNodes.push(textNode);\\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nJSONTiddlerWidget.prototype.execute = function() {\\n\\tthis.attTiddler = this.getAttribute(\\\"tiddler\\\");\\n\\tthis.attExclude = this.getAttribute(\\\"exclude\\\",\\\"\\\");\\n\\tthis.attEscapeUnsafeScriptChars = this.getAttribute(\\\"escapeUnsafeScriptChars\\\",\\\"no\\\") === \\\"yes\\\";\\n};
2731\\n\\n/*\\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n*/\\nJSONTiddlerWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes();\\n\\tif($tw.utils.count(changedAttributes) > 0 || (this.attTiddler && changedTiddlers[this.attTiddler])) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t} else {\\n\\t\\treturn false;\\n\\t}\\n};\\n\\nJSONTiddlerWidget.prototype.getTiddlerFields = function() {\\n\\tvar fields = {};\\n\\tif(this.attTiddler) {\\n\\t\\tvar tiddler = this.wiki.getTiddler(this.attTiddler);\\n\\t\\tif(tiddler) {\\n\\t\\t\\tfields = tiddler.getFieldStrings({exclude: this.attExclude.split(\\\" \\\")});\\n\\t\\t} else {\\n\\t\\t\\tfields = {title: this.attTiddler};\\n\\t\\t}\\n\\t}\\n\\treturn fields;\\n};\\n\\nexports.jsontiddler = JSONTiddlerWidget;\\n\\n})();\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/keyboard.js\":{\"title\":\"$:/core/modules/widgets/keyboard.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/keyboard.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nKeyboard shortcut widget\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar KeyboardWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nKeyboardWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nKeyboardWidget.prototype.render = function(parent,nextSibling) {\\n\\tvar self = this;\\n\\t// Remember parent\\n\\tthis.parentDomNode = parent;\\n\\t// Compute attributes and execute state\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n\\tvar tag = this.parseTreeNode.isBlock ? \\\"div\\\" : \\\"span\\\";\\n\\tif(this.tag && $tw.config.htmlUnsafeElements.indexOf(this.tag) === -1) {\\n\\t\\ttag = this.tag;\\n\\t}\\n\\t// Create element\\n\\tvar domNode = this.document.createElement(tag);\\n\\t// Assign classes\\n\\tthis.domNode = domNode;\\n\\tthis.assignDomNodeClasses();\\n\\t// Add a keyboard event handler\\n\\t$tw.utils.addEventListeners(domNode,[\\n\\t\\t{name: \\\"keydown\\\", handlerObject: this, handlerMethod: \\\"handleChangeEvent\\\"}\\n\\t]);\\n\\t// Insert element\\n\\tparent.insertBefore(domNode,nextSibling);\\n\\tthis.renderChildren(domNode,null);\\n\\tthis.domNodes.push(domNode);\\n};\\n\\nKeyboardWidget.prototype.handleChangeEvent = function(event) {\\n\\tif ($tw.keyboardManager.handleKeydownEvent(event, {onlyPriority: true})) {\\n\\t\\treturn true;\\n\\t}\\n\\n\\tvar keyInfo = $tw.keyboardManager.getMatchingKeyDescriptor(event,this.keyInfoArray);\\n\\tif(keyInfo) {\\n\\t\\tvar handled = this.invokeActions(this,event);\\n\\t\\tif(this.actions) {\\n\\t\\t\\tvar variables = {\\n\\t\\t\\t\\t\\t\\\"event-key\\\": event.key,\\n\\t\\t\\t\\t\\t\\\"event-code\\\": event.code,\\n\\t\\t\\t\\t\\t\\\"modifier\\\": $tw.keyboardManager.getEventModifierKeyDescriptor(event)\\n\\t\\t\\t\\t};\\n\\t\\t\\tif(keyInfo.keyDescriptor) {\\n\\t\\t\\t\\tvariables[\\\"event-key-descriptor\\\"] = keyInfo.keyDescriptor;\\n\\t\\t\\t}\\n\\t\\t\\tthis.invokeActionString(this.actions,this,event,variables);\\n\\t\\t}\\n\\t\\tthis.dispatchMessage(event);\\n\\t\\tif(handled || this.actions || this.message) {\\n\\t\\t\\tevent.preventDefault();\\n\\t\\t\\tevent.stopPropagation();\\n\\t\\t}\\n\\t\\treturn true;\\n\\t}\\n\\treturn false;\\n}\\n\\nKeyboardWidget.prototype.dispatchMessage = function(event) {\\n\\tthis.dispatchEvent({type: this.message, param: this.param, tiddlerTitle: this.getVariable(\\\"currentTiddler\\\")});\\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nKeyboardWidget.prototype.execute = function() {\\n\\tvar self = this;\\n\\t// Get attributes\\n\\tthis.actions = this.getAttribute(\\\"actions\\\",\\\"\\\");\\n\\tthis.message = this.getAttribute(\\\"message\\\",\\\"\\\");\\n\\tthis.param = this.getAttribute(\\\"param\\\",\\\"\\\");\\n\\tthis.key = this.getAttribute(\\\"key\\\",\\\"\\\");\\n\\tthis.tag = this.getAttribute(\\\"tag\\\",\\\"\\\");\\n\\tthis.keyInfoArray = $tw.keyboardManager.parseKeyDescriptors(this.key);\\n\\tif(this.key.substr(0,2) === \\\"((\\\" && this.key.substr(-2,2) === \\\"))\\\") {\\n\\t\\tthis.shortcutTiddlers = [];\\n\\t\\tvar name = this.key.substring(2,this.key.length -2);\\n\\t\\t$tw.utils.each($tw.keyboardManager.lookupNames,function(platformDescriptor) {\\n\\t\\t\\tself.shortcutTiddlers.push(\\\"$:/config/\\\" + platformDescriptor + \\\"/\\\" + n
2731ame);\\n\\t\\t});\\n\\t}\\n\\t// Make child widgets\\n\\tthis.makeChildWidgets();\\n};\\n\\nKeyboardWidget.prototype.assignDomNodeClasses = function() {\\n\\tvar classes = this.getAttribute(\\\"class\\\",\\\"\\\").split(\\\" \\\");\\n\\tclasses.push(\\\"tc-keyboard\\\");\\n\\tthis.domNode.className = classes.join(\\\" \\\");\\n};\\n\\n/*\\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n*/\\nKeyboardWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes();\\n\\tif(changedAttributes.message || changedAttributes.param || changedAttributes.key || changedAttributes.tag) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t} else if(changedAttributes[\\\"class\\\"]) {\\n\\t\\tthis.assignDomNodeClasses();\\n\\t}\\n\\t// Update the keyInfoArray if one of its shortcut-config-tiddlers has changed\\n\\tif(this.shortcutTiddlers && $tw.utils.hopArray(changedTiddlers,this.shortcutTiddlers)) {\\n\\t\\tthis.keyInfoArray = $tw.keyboardManager.parseKeyDescriptors(this.key);\\n\\t}\\n\\treturn this.refreshChildren(changedTiddlers);\\n};\\n\\nexports.keyboard = KeyboardWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/let.js\":{\"title\":\"$:/core/modules/widgets/let.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/let.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nThis widget allows defining multiple variables at once, while allowing\\nthe later variables to depend upon the earlier ones.\\n\\n```\\n\\\\define helloworld() Hello world!\\n\u003C$let currentTiddler=\\\"target\\\" value={{!!value}} currentTiddler=\\\"different\\\">\\n  {{!!value}} will be different from \u003C\u003Cvalue>>\\n\u003C/$let>\\n```\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar LetWidget = function(parseTreeNode,options) {\\n\\t// Initialise\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nLetWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nLetWidget.prototype.render = function(parent,nextSibling) {\\n\\tthis.parentDomNode = parent;\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n\\tthis.renderChildren(parent,nextSibling);\\n};\\n\\nLetWidget.prototype.computeAttributes = function() {\\n\\t// Before computing attributes, we must make clear that none of the\\n\\t// existing attributes are staged for lookup, even on a refresh\\n\\tvar changedAttributes = {},\\n\\t\\tself = this;\\n\\tthis.currentValueFor = Object.create(null);\\n\\t$tw.utils.each($tw.utils.getOrderedAttributesFromParseTreeNode(this.parseTreeNode),function(attribute) {\\n\\t\\tvar value = self.computeAttribute(attribute),\\n\\t\\t\\tname = attribute.name;\\n\\t\\t// Now that it's prepped, we're allowed to look this variable up\\n\\t\\t// when defining later variables\\n\\t\\tif(value !== undefined) {\\n\\t\\t\\tself.currentValueFor[name] = value;\\n\\t\\t}\\n\\t});\\n\\t// Run through again, setting variables and looking for differences\\n\\t$tw.utils.each(this.currentValueFor,function(value,name) {\\n\\t\\tif (self.attributes[name] !== value) {\\n\\t\\t\\tself.attributes[name] = value;\\n\\t\\t\\tself.setVariable(name,value);\\n\\t\\t\\tchangedAttributes[name] = true;\\n\\t\\t}\\n\\t});\\n\\treturn changedAttributes;\\n};\\n\\nLetWidget.prototype.getVariableInfo = function(name,options) {\\n\\t// Special handling: If this variable exists in this very $let, we can\\n\\t// use it, but only if it's been staged.\\n\\tif ($tw.utils.hop(this.currentValueFor,name)) {\\n\\t\\treturn {\\n\\t\\t\\ttext: this.currentValueFor[name]\\n\\t\\t};\\n\\t}\\n\\treturn Widget.prototype.getVariableInfo.call(this,name,options);\\n};\\n\\n/*\\nRefresh the widget by ensuring our attributes are up to date\\n*/\\nLetWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes();\\n\\tif($tw.utils.count(changedAttributes) > 0) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t}\\n\\treturn this.refreshChildren(changedTiddlers);\\n};\\n\\nexports[\\\"let\\\"] = LetWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/link.js\":{\"title\":\"$:/core/modules/widgets/link.js\",\"text\":\"/*\\\\\\ntitle: $
2731:/core/modules/widgets/link.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nLink widget\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar LinkWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nLinkWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nLinkWidget.prototype.render = function(parent,nextSibling) {\\n\\t// Save the parent dom node\\n\\tthis.parentDomNode = parent;\\n\\t// Compute our attributes\\n\\tthis.computeAttributes();\\n\\t// Execute our logic\\n\\tthis.execute();\\n\\t// Get the value of the tv-wikilinks configuration macro\\n\\tvar wikiLinksMacro = this.getVariable(\\\"tv-wikilinks\\\"),\\n\\t\\tuseWikiLinks = wikiLinksMacro ? (wikiLinksMacro.trim() !== \\\"no\\\") : true,\\n\\t\\tmissingLinksEnabled = !(this.hideMissingLinks && this.isMissing && !this.isShadow);\\n\\t// Render the link if required\\n\\tif(useWikiLinks && missingLinksEnabled) {\\n\\t\\tthis.renderLink(parent,nextSibling);\\n\\t} else {\\n\\t\\t// Just insert the link text\\n\\t\\tvar domNode = this.document.createElement(\\\"span\\\");\\n\\t\\tparent.insertBefore(domNode,nextSibling);\\n\\t\\tthis.renderChildren(domNode,null);\\n\\t\\tthis.domNodes.push(domNode);\\n\\t}\\n};\\n\\n/*\\nRender this widget into the DOM\\n*/\\nLinkWidget.prototype.renderLink = function(parent,nextSibling) {\\n\\tvar self = this;\\n\\t// Sanitise the specified tag\\n\\tvar tag = this.linkTag;\\n\\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\\n\\t\\ttag = \\\"a\\\";\\n\\t}\\n\\t// Create our element\\n\\tvar namespace = this.getVariable(\\\"namespace\\\",{defaultValue: \\\"http://www.w3.org/1999/xhtml\\\"}),\\n\\t\\tdomNode = this.document.createElementNS(namespace,tag);\\n\\t// Assign classes\\n\\tvar classes = [];\\n\\tif(this.overrideClasses === undefined) {\\n\\t\\tclasses.push(\\\"tc-tiddlylink\\\");\\n\\t\\tif(this.isShadow) {\\n\\t\\t\\tclasses.push(\\\"tc-tiddlylink-shadow\\\");\\n\\t\\t}\\n\\t\\tif(this.isMissing && !this.isShadow) {\\n\\t\\t\\tclasses.push(\\\"tc-tiddlylink-missing\\\");\\n\\t\\t} else {\\n\\t\\t\\tif(!this.isMissing) {\\n\\t\\t\\t\\tclasses.push(\\\"tc-tiddlylink-resolves\\\");\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tif(this.linkClasses) {\\n\\t\\t\\tclasses.push(this.linkClasses);\\n\\t\\t}\\n\\t} else if(this.overrideClasses !== \\\"\\\") {\\n\\t\\tclasses.push(this.overrideClasses)\\n\\t}\\n\\tif(classes.length > 0) {\\n\\t\\tdomNode.setAttribute(\\\"class\\\",classes.join(\\\" \\\"));\\n\\t}\\n\\t// Set an href\\n\\tvar wikilinkTransformFilter = this.getVariable(\\\"tv-filter-export-link\\\"),\\n\\t\\twikiLinkText;\\n\\tif(wikilinkTransformFilter) {\\n\\t\\t// Use the filter to construct the href\\n\\t\\twikiLinkText = this.wiki.filterTiddlers(wikilinkTransformFilter,this,function(iterator) {\\n\\t\\t\\titerator(self.wiki.getTiddler(self.to),self.to)\\n\\t\\t})[0];\\n\\t} else {\\n\\t\\t// Expand the tv-wikilink-template variable to construct the href\\n\\t\\tvar wikiLinkTemplateMacro = this.getVariable(\\\"tv-wikilink-template\\\"),\\n\\t\\t\\twikiLinkTemplate = wikiLinkTemplateMacro ? wikiLinkTemplateMacro.trim() : \\\"#$uri_encoded$\\\";\\n\\t\\twikiLinkText = $tw.utils.replaceString(wikiLinkTemplate,\\\"$uri_encoded$\\\",$tw.utils.encodeURIComponentExtended(this.to));\\n\\t\\twikiLinkText = $tw.utils.replaceString(wikiLinkText,\\\"$uri_doubleencoded$\\\",$tw.utils.encodeURIComponentExtended($tw.utils.encodeURIComponentExtended(this.to)));\\n\\t}\\n\\t// Override with the value of tv-get-export-link if defined\\n\\twikiLinkText = this.getVariable(\\\"tv-get-export-link\\\",{params: [{name: \\\"to\\\",value: this.to}],defaultValue: wikiLinkText});\\n\\tif(tag === \\\"a\\\") {\\n\\t\\tvar namespaceHref = (namespace === \\\"http://www.w3.org/2000/svg\\\") ? \\\"http://www.w3.org/1999/xlink\\\" : undefined;\\n\\t\\tdomNode.setAttributeNS(namespaceHref,\\\"href\\\",wikiLinkText);\\n\\t}\\n\\t// Set the tabindex\\n\\tif(this.tabIndex) {\\n\\t\\tdomNode.setAttribute(\\\"tabindex\\\",this.tabIndex);\\n\\t}\\n\\t// Set the tooltip\\n\\t// HACK: Performance issues with re-parsing the tooltip prevent us defaulting the tooltip to \\\"\u003C$transclude field='tooltip'>\u003C$transclude field='title'/>\u003C/$transclude>\\\"\\n\\tvar tooltipWikiText = this.tooltip || this.getVariable(\\\"tv-wikilink-tooltip\\\");\\n\\tif(tooltipWikiText) {\\n\\t\\tvar tooltipText = this.wiki.renderText(\\\"text/plain\\\",\\\"text/vnd.tiddlywiki\\\",tooltipWikiText,{\\n\\t\\t\\t\\tparseAsInline: true,\\n\\t\\t\\t\\tvariables: {\\n\\t\\t\\t\\t\\tcurrentTiddler: this.to\\n\\t\\t\\t\\t},\\n\\t\\t\\t\\tparentWidget: this\\n\\t\\t\\t});\\n\\t\\tdomNode.setAttribute(\\\"title\\\",tooltipText);\\n\\t}\\n\\tif(this[\\\"aria-label\\\"]) {\\n\\t\\tdomNode.setAttribute(\\\"aria-label\\\",this[\\\"aria-label\\\"]);\\n\\t}\\n\\t// Add a click event handler\\n\\t$tw.utils.addEventListeners(domNode,[\\n\\t\\t{name: \\\"click\\\", handlerObject: this, handlerMethod: \\\"handleClickEvent\\\"},\\n\\t]);\\n\\t// Make the link draggable if required\\n\\tif(this.draggable === \\\"yes\\\") {\\n\\t\\t$tw.utils.makeDraggable({\\n\\t\\t\\tdomNode: domNode,\\n\\t\\t\\tdragTiddlerFn: function() {return self.to;},\\n\\t\\t\\twidget: this\\n\\t\\t});\\n\\t}\\n\\t// Insert the link into the DOM and render any children\\n\\tparent.insertBefore(domNode,nextSibling);\\n\\tthis.renderChildren(domNode,null);\\n\\tthis.domNodes.push(domNode);\\n};\\n\\nLinkWidget.prototype.handleClickEvent = function(event) {\\n\\t// Send the click on its way as a navigate event\\n\\tvar bounds = this.domNodes[0].getBoundingClientRect();\\n\\tthis.dispatchEvent({\\n\\t\\ttype: \\\"tm-navigate\\\",\\n\\t\\tnavigateTo: this.to,\\n\\t\\tnavigateFromTitle: this.getVariable(\\\"storyTiddler\\\"),\\n\\t\\tnavigateFromNode: this,\\n\\t\\tnavigateFromClientRect: { top: bounds.top, left: bounds.left, width: bounds.width, right: bounds.right, bottom: bounds.bottom, height: bounds.height\\n\\t\\t},\\n\\t\\tnavigateFromClientTop: bounds.top,\\n\\t\\tnavigateFromClientLeft: bounds.left,\\n\\t\\tnavigateFromClientWidth: bounds.width,\\n\\t\\tnavigateFromClientRight: bounds.right,\\n\\t\\tnavigateFromClientBottom: bounds.bottom,\\n\\t\\tnavigateFromClientHeight: bounds.height,\\n\\t\\tnavigateSuppressNavigation: event.metaKey || event.ctrlKey || (event.button === 1),\\n\\t\\tmetaKey: event.metaKey,\\n\\t\\tctrlKey: event.ctrlKey,\\n\\t\\taltKey: event.altKey,\\n\\t\\t
2731shiftKey: event.shiftKey,\\n\\t\\tevent: event\\n\\t});\\n\\tif(this.domNodes[0].hasAttribute(\\\"href\\\")) {\\n\\t\\tevent.preventDefault();\\n\\t}\\n\\tevent.stopPropagation();\\n\\treturn false;\\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nLinkWidget.prototype.execute = function() {\\n\\t// Pick up our attributes\\n\\tthis.to = this.getAttribute(\\\"to\\\",this.getVariable(\\\"currentTiddler\\\"));\\n\\tthis.tooltip = this.getAttribute(\\\"tooltip\\\");\\n\\tthis[\\\"aria-label\\\"] = this.getAttribute(\\\"aria-label\\\");\\n\\tthis.linkClasses = this.getAttribute(\\\"class\\\");\\n\\tthis.overrideClasses = this.getAttribute(\\\"overrideClass\\\");\\n\\tthis.tabIndex = this.getAttribute(\\\"tabindex\\\");\\n\\tthis.draggable = this.getAttribute(\\\"draggable\\\",\\\"yes\\\");\\n\\tthis.linkTag = this.getAttribute(\\\"tag\\\",\\\"a\\\");\\n\\t// Determine the link characteristics\\n\\tthis.isMissing = !this.wiki.tiddlerExists(this.to);\\n\\tthis.isShadow = this.wiki.isShadowTiddler(this.to);\\n\\tthis.hideMissingLinks = (this.getVariable(\\\"tv-show-missing-links\\\") || \\\"yes\\\") === \\\"no\\\";\\n\\t// Make the child widgets\\n\\tvar templateTree;\\n\\tif(this.parseTreeNode.children && this.parseTreeNode.children.length > 0) {\\n\\t\\ttemplateTree = this.parseTreeNode.children;\\n\\t} else {\\n\\t\\t// Default template is a link to the title\\n\\t\\ttemplateTree = [{type: \\\"text\\\", text: this.to}];\\n\\t}\\n\\tthis.makeChildWidgets(templateTree);\\n};\\n\\n/*\\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n*/\\nLinkWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes();\\n\\tif(changedAttributes.to || changedTiddlers[this.to] || changedAttributes[\\\"aria-label\\\"] || changedAttributes.tooltip ||\\n\\t\\tchangedAttributes[\\\"class\\\"] || changedAttributes.tabindex || changedAttributes.draggable || changedAttributes.tag) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t}\\n\\treturn this.refreshChildren(changedTiddlers);\\n};\\n\\nexports.link = LinkWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/linkcatcher.js\":{\"title\":\"$:/core/modules/widgets/linkcatcher.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/linkcatcher.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nLinkcatcher widget\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar LinkCatcherWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nLinkCatcherWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nLinkCatcherWidget.prototype.render = function(parent,nextSibling) {\\n\\tthis.addEventListeners([\\n\\t\\t{type: \\\"tm-navigate\\\", handler: \\\"handleNavigateEvent\\\"}\\n\\t]);\\n\\tthis.parentDomNode = parent;\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n\\tthis.renderChildren(parent,nextSibling);\\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nLinkCatcherWidget.prototype.execute = function() {\\n\\t// Get our parameters\\n\\tthis.catchTo = this.getAttribute(\\\"to\\\");\\n\\tthis.catchMessage = this.getAttribute(\\\"message\\\");\\n\\tthis.catchSet = this.getAttribute(\\\"set\\\");\\n\\tthis.catchSetTo = this.getAttribute(\\\"setTo\\\");\\n\\tthis.catchActions = this.getAttribute(\\\"actions\\\");\\n\\t// Construct the child widgets\\n\\tthis.makeChildWidgets();\\n\\t// When executing actions we avoid trapping navigate events, so that we don't trigger ourselves recursively\\n\\tthis.executingActions = false;\\n};
2731\\n\\n/*\\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n*/\\nLinkCatcherWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes();\\n\\tif(changedAttributes.to || changedAttributes.message || changedAttributes.set || changedAttributes.setTo) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t} else {\\n\\t\\treturn this.refreshChildren(changedTiddlers);\\n\\t}\\n};\\n\\n/*\\nHandle a tm-navigate event\\n*/\\nLinkCatcherWidget.prototype.handleNavigateEvent = function(event) {\\n\\tif(!this.executingActions) {\\n\\t\\t// Execute the actions\\n\\t\\tif(this.catchTo) {\\n\\t\\t\\tthis.wiki.setTextReference(this.catchTo,event.navigateTo,this.getVariable(\\\"currentTiddler\\\"));\\n\\t\\t}\\n\\t\\tif(this.catchMessage && this.parentWidget) {\\n\\t\\t\\tthis.parentWidget.dispatchEvent({\\n\\t\\t\\t\\ttype: this.catchMessage,\\n\\t\\t\\t\\tparam: event.navigateTo,\\n\\t\\t\\t\\tnavigateTo: event.navigateTo\\n\\t\\t\\t});\\n\\t\\t}\\n\\t\\tif(this.catchSet) {\\n\\t\\t\\tvar tiddler = this.wiki.getTiddler(this.catchSet);\\n\\t\\t\\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,{title: this.catchSet, text: this.catchSetTo}));\\n\\t\\t}\\n\\t\\tif(this.catchActions) {\\n\\t\\t\\tthis.executingActions = true;\\n\\t\\t\\tvar modifierKey = $tw.keyboardManager.getEventModifierKeyDescriptor(event);\\n\\t\\t\\tthis.invokeActionString(this.catchActions,this,event,{navigateTo: event.navigateTo, modifier: modifierKey});\\n\\t\\t\\tthis.executingActions = false;\\n\\t\\t}\\n\\t} else {\\n\\t\\t\\t// This is a navigate event generated by the actions of this linkcatcher,\\n\\t\\t\\t// so we don't trap it again, but just pass it to the parent\\n\\t\\t\\tthis.parentWidget.dispatchEvent(event);\\n\\t}\\n\\treturn false;\\n};\\n\\nexports.linkcatcher = LinkCatcherWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/list.js\":{\"title\":\"$:/core/modules/widgets/list.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/list.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nList and list item widgets\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\n/*\\nThe list widget creates list element sub-widgets that reach back into the list widget for their configuration\\n*/\\n\\nvar ListWidget = function(parseTreeNode,options) {\\n\\t// Main initialisation inherited from widget.js\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nListWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nListWidget.prototype.render = function(parent,nextSibling) {\\n\\t// Initialise the storyviews if they've not been done already\\n\\tif(!this.storyViews) {\\n\\t\\tListWidget.prototype.storyViews = {};\\n\\t\\t$tw.modules.applyMethods(\\\"storyview\\\",this.storyViews);\\n\\t}\\n\\tthis.parentDomNode = parent;\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n\\tthis.renderChildren(parent,nextSibling);\\n\\t// Construct the storyview\\n\\tvar StoryView = this.storyViews[this.storyViewName];\\n\\tif(this.storyViewName && !StoryView) {\\n\\t\\tStoryView = this.storyViews[\\\"classic\\\"];\\n\\t}\\n\\tif(StoryView && !this.document.isTiddlyWikiFakeDom) {\\n\\t\\tthis.storyview = new StoryView(this);\\n\\t} else {\\n\\t\\tthis.storyview = null;\\n\\t}\\n\\tif(this.storyview && this.storyview.renderEnd) {\\n\\t\\tthis.storyview.renderEnd();\\n\\t}\\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nListWidget.prototype.execute = function() {\\n\\t// Get our attributes\\n\\tthis.template = this.getAttribute(\\\"template\\\");\\n\\tthis.editTemplate = this.getAttribute(\\\"editTemplate\\\");\\n\\tthis.variableName = this.getAttribute(\\\"variable\\\",\\\"currentTiddler\\\");\\n\\tthis.counterName = this.getAttribute(\\\"counter\\\");\\n\\tthis.storyViewName = this.getAttribute(\\\"storyview\\\");\\n\\tthis.historyTitle = this.getAttribute(\\\"history\\\");\\n\\t// Compose the list elements\\n\\tthis.list = this.getTiddlerList();
2731\\n\\tvar members = [],\\n\\t\\tself = this;\\n\\t// Check for an empty list\\n\\tif(this.list.length === 0) {\\n\\t\\tmembers = this.getEmptyMessage();\\n\\t} else {\\n\\t\\t$tw.utils.each(this.list,function(title,index) {\\n\\t\\t\\tmembers.push(self.makeItemTemplate(title,index));\\n\\t\\t});\\n\\t}\\n\\t// Construct the child widgets\\n\\tthis.makeChildWidgets(members);\\n\\t// Clear the last history\\n\\tthis.history = [];\\n};\\n\\nListWidget.prototype.getTiddlerList = function() {\\n\\tvar defaultFilter = \\\"[!is[system]sort[title]]\\\";\\n\\treturn this.wiki.filterTiddlers(this.getAttribute(\\\"filter\\\",defaultFilter),this);\\n};\\n\\nListWidget.prototype.getEmptyMessage = function() {\\n\\tvar parser,\\n\\t\\temptyMessage = this.getAttribute(\\\"emptyMessage\\\",\\\"\\\");\\n\\t// this.wiki.parseText() calls \\n\\t// new Parser(..), which should only be done, if needed, because it's heavy!\\n\\tif (emptyMessage === \\\"\\\") {\\n\\t\\treturn [];\\n\\t}\\n\\tparser = this.wiki.parseText(\\\"text/vnd.tiddlywiki\\\",emptyMessage,{parseAsInline: true});\\n\\tif(parser) {\\n\\t\\treturn parser.tree;\\n\\t} else {\\n\\t\\treturn [];\\n\\t}\\n};\\n\\n/*\\nCompose the template for a list item\\n*/\\nListWidget.prototype.makeItemTemplate = function(title,index) {\\n\\t// Check if the tiddler is a draft\\n\\tvar tiddler = this.wiki.getTiddler(title),\\n\\t\\tisDraft = tiddler && tiddler.hasField(\\\"draft.of\\\"),\\n\\t\\ttemplate = this.template,\\n\\t\\ttemplateTree;\\n\\tif(isDraft && this.editTemplate) {\\n\\t\\ttemplate = this.editTemplate;\\n\\t}\\n\\t// Compose the transclusion of the template\\n\\tif(template) {\\n\\t\\ttemplateTree = [{type: \\\"transclude\\\", attributes: {tiddler: {type: \\\"string\\\", value: template}}}];\\n\\t} else {\\n\\t\\tif(this.parseTreeNode.children && this.parseTreeNode.children.length > 0) {\\n\\t\\t\\ttemplateTree = this.parseTreeNode.children;\\n\\t\\t} else {\\n\\t\\t\\t// Default template is a link to the title\\n\\t\\t\\ttemplateTree = [{type: \\\"element\\\", tag: this.parseTreeNode.isBlock ? \\\"div\\\" : \\\"span\\\", children: [{type: \\\"link\\\", attributes: {to: {type: \\\"string\\\", value: title}}, children: [\\n\\t\\t\\t\\t\\t{type: \\\"text\\\", text: title}\\n\\t\\t\\t]}]}];\\n\\t\\t}\\n\\t}\\n\\t// Return the list item\\n\\tvar parseTreeNode = {type: \\\"listitem\\\", itemTitle: title, variableName: this.variableName, children: templateTree};\\n\\tif(this.counterName) {\\n\\t\\tparseTreeNode.counter = (index + 1).toString();\\n\\t\\tparseTreeNode.counterName = this.counterName;\\n\\t\\tparseTreeNode.isFirst = index === 0;\\n\\t\\tparseTreeNode.isLast = index === this.list.length - 1;\\n\\t}\\n\\treturn parseTreeNode;\\n};
2731\\n\\n/*\\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n*/\\nListWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes(),\\n\\t\\tresult;\\n\\t// Call the storyview\\n\\tif(this.storyview && this.storyview.refreshStart) {\\n\\t\\tthis.storyview.refreshStart(changedTiddlers,changedAttributes);\\n\\t}\\n\\t// Completely refresh if any of our attributes have changed\\n\\tif(changedAttributes.filter || changedAttributes.variable || changedAttributes.counter || changedAttributes.template || changedAttributes.editTemplate || changedAttributes.emptyMessage || changedAttributes.storyview || changedAttributes.history) {\\n\\t\\tthis.refreshSelf();\\n\\t\\tresult = true;\\n\\t} else {\\n\\t\\t// Handle any changes to the list\\n\\t\\tresult = this.handleListChanges(changedTiddlers);\\n\\t\\t// Handle any changes to the history stack\\n\\t\\tif(this.historyTitle && changedTiddlers[this.historyTitle]) {\\n\\t\\t\\tthis.handleHistoryChanges();\\n\\t\\t}\\n\\t}\\n\\t// Call the storyview\\n\\tif(this.storyview && this.storyview.refreshEnd) {\\n\\t\\tthis.storyview.refreshEnd(changedTiddlers,changedAttributes);\\n\\t}\\n\\treturn result;\\n};
2731\\n\\n/*\\nHandle any changes to the history list\\n*/\\nListWidget.prototype.handleHistoryChanges = function() {\\n\\t// Get the history data\\n\\tvar newHistory = this.wiki.getTiddlerDataCached(this.historyTitle,[]);\\n\\t// Ignore any entries of the history that match the previous history\\n\\tvar entry = 0;\\n\\twhile(entry \u003C newHistory.length && entry \u003C this.history.length && newHistory[entry].title === this.history[entry].title) {\\n\\t\\tentry++;\\n\\t}\\n\\t// Navigate forwards to each of the new tiddlers\\n\\twhile(entry \u003C newHistory.length) {\\n\\t\\tif(this.storyview && this.storyview.navigateTo) {\\n\\t\\t\\tthis.storyview.navigateTo(newHistory[entry]);\\n\\t\\t}\\n\\t\\tentry++;\\n\\t}\\n\\t// Update the history\\n\\tthis.history = newHistory;\\n};\\n\\n/*\\nProcess any changes to the list\\n*/\\nListWidget.prototype.handleListChanges = function(changedTiddlers) {\\n\\t// Get the new list\\n\\tvar prevList = this.list;\\n\\tthis.list = this.getTiddlerList();\\n\\t// Check for an empty list\\n\\tif(this.list.length === 0) {\\n\\t\\t// Check if it was empty before\\n\\t\\tif(prevList.length === 0) {\\n\\t\\t\\t// If so, just refresh the empty message\\n\\t\\t\\treturn this.refreshChildren(changedTiddlers);\\n\\t\\t} else {\\n\\t\\t\\t// Replace the previous content with the empty message\\n\\t\\t\\tfor(t=this.children.length-1; t>=0; t--) {\\n\\t\\t\\t\\tthis.removeListItem(t);\\n\\t\\t\\t}\\n\\t\\t\\tvar nextSibling = this.findNextSiblingDomNode();\\n\\t\\t\\tthis.makeChildWidgets(this.getEmptyMessage());\\n\\t\\t\\tthis.renderChildren(this.parentDomNode,nextSibling);\\n\\t\\t\\treturn true;\\n\\t\\t}\\n\\t} else {\\n\\t\\t// If the list was empty then we need to remove the empty message\\n\\t\\tif(prevList.length === 0) {\\n\\t\\t\\tthis.removeChildDomNodes();\\n\\t\\t\\tthis.children = [];\\n\\t\\t}\\n\\t\\t// If we are providing an counter variable then we must refresh the items, otherwise we can rearrange them\\n\\t\\tvar hasRefreshed = false,t;\\n\\t\\tif(this.counterName) {\\n\\t\\t\\t// Cycle through the list and remove and re-insert the first item that has changed, and all the remaining items\\n\\t\\t\\tfor(t=0; t\u003Cthis.list.length; t++) {\\n\\t\\t\\t\\tif(hasRefreshed || !this.children[t] || this.children[t].parseTreeNode.itemTitle !== this.list[t]) {\\n\\t\\t\\t\\t\\tif(this.children[t]) {\\n\\t\\t\\t\\t\\t\\tthis.removeListItem(t);\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tthis.insertListItem(t,this.list[t]);\\n\\t\\t\\t\\t\\thasRefreshed = true;\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t// Refresh the item we're reusing\\n\\t\\t\\t\\t\\tvar refreshed = this.children[t].refresh(changedTiddlers);\\n\\t\\t\\t\\t\\thasRefreshed = hasRefreshed || refreshed;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\t// If there are items to remove and we have not refreshed then recreate the item that will now be at the last position\\n\\t\\t\\tif(!hasRefreshed && this.children.length > this.list.length) {\\n\\t\\t\\t\\tthis.removeListItem(this.list.length-1);\\n\\t\\t\\t\\tthis.insertListItem(this.list.length-1,this.list[this.list.length-1]);\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\t\\t\\t// Cycle through the list, inserting and removing list items as needed\\n\\t\\t\\tfor(t=0; t\u003Cthis.list.length; t++) {\\n\\t\\t\\t\\tvar index = this.findListItem(t,this.list[t]);\\n\\t\\t\\t\\tif(index === undefined) {\\n\\t\\t\\t\\t\\t// The list item must be inserted\\n\\t\\t\\t\\t\\tthis.insertListItem(t,this.list[t]);\\n\\t\\t\\t\\t\\thasRefreshed = true;\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t// There are intervening list items that must be removed\\n\\t\\t\\t\\t\\tfor(var n=index-1; n>=t; n--) {\\n\\t\\t\\t\\t\\t\\tthis.removeListItem(n);\\n\\t\\t\\t\\t\\t\\thasRefreshed = true;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t// Refresh the item we're reusing\\n\\t\\t\\t\\t\\tvar refreshed = this.children[t].refresh(changedTiddlers);\\n\\t\\t\\t\\t\\thasRefreshed = hasRefreshed || refreshed;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\t// Remove any left over items\\n\\t\\tfor(t=this.children.length-1; t>=this.list.length; t--) {\\n\\t\\t\\tthis.removeListItem(t);\\n\\t\\t\\thasRefreshed = true;\\n\\t\\t}\\n\\t\\treturn hasRefreshed;\\n\\t}\\n};
2731\\n\\n/*\\nFind the list item with a given title, starting from a specified position\\n*/\\nListWidget.prototype.findListItem = function(startIndex,title) {\\n\\twhile(startIndex \u003C this.children.length) {\\n\\t\\tif(this.children[startIndex].parseTreeNode.itemTitle === title) {\\n\\t\\t\\treturn startIndex;\\n\\t\\t}\\n\\t\\tstartIndex++;\\n\\t}\\n\\treturn undefined;\\n};\\n\\n/*\\nInsert a new list item at the specified index\\n*/\\nListWidget.prototype.insertListItem = function(index,title) {\\n\\t// Create, insert and render the new child widgets\\n\\tvar widget = this.makeChildWidget(this.makeItemTemplate(title,index));\\n\\twidget.parentDomNode = this.parentDomNode; // Hack to enable findNextSiblingDomNode() to work\\n\\tthis.children.splice(index,0,widget);\\n\\tvar nextSibling = widget.findNextSiblingDomNode();\\n\\twidget.render(this.parentDomNode,nextSibling);\\n\\t// Animate the insertion if required\\n\\tif(this.storyview && this.storyview.insert) {\\n\\t\\tthis.storyview.insert(widget);\\n\\t}\\n\\treturn true;\\n};
2731\\n\\n/*\\nRemove the specified list item\\n*/\\nListWidget.prototype.removeListItem = function(index) {\\n\\tvar widget = this.children[index];\\n\\t// Animate the removal if required\\n\\tif(this.storyview && this.storyview.remove) {\\n\\t\\tthis.storyview.remove(widget);\\n\\t} else {\\n\\t\\twidget.removeChildDomNodes();\\n\\t}\\n\\t// Remove the child widget\\n\\tthis.children.splice(index,1);\\n};\\n\\nexports.list = ListWidget;\\n\\nvar ListItemWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nListItemWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nListItemWidget.prototype.render = function(parent,nextSibling) {\\n\\tthis.parentDomNode = parent;\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n\\tthis.renderChildren(parent,nextSibling);\\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nListItemWidget.prototype.execute = function() {\\n\\t// Set the current list item title\\n\\tthis.setVariable(this.parseTreeNode.variableName,this.parseTreeNode.itemTitle);\\n\\tif(this.parseTreeNode.counterName) {\\n\\t\\tthis.setVariable(this.parseTreeNode.counterName,this.parseTreeNode.counter);\\n\\t\\tthis.setVariable(this.parseTreeNode.counterName + \\\"-first\\\",this.parseTreeNode.isFirst ? \\\"yes\\\" : \\\"no\\\");\\n\\t\\tthis.setVariable(this.parseTreeNode.counterName + \\\"-last\\\",this.parseTreeNode.isLast ? \\\"yes\\\" : \\\"no\\\");\\n\\t}\\n\\t// Construct the child widgets\\n\\tthis.makeChildWidgets();\\n};\\n\\n/*\\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n*/\\nListItemWidget.prototype.refresh = function(changedTiddlers) {\\n\\treturn this.refreshChildren(changedTiddlers);\\n};\\n\\nexports.listitem = ListItemWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/log.js\":{\"title\":\"$:/core/modules/widgets/log.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/log.js\\ntype: application/javascript\\nmodule-type: widget-subclass\\n\\nWidget to log debug messages\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.baseClass = \\\"action-log\\\";\\n\\nexports.name = \\\"log\\\";\\n\\nexports.constructor = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n}\\n\\nexports.prototype = {};\\n\\nexports.prototype.render = function(event) {\\n\\tObject.getPrototypeOf(Object.getPrototypeOf(this)).render.call(this,event);\\n\\tObject.getPrototypeOf(Object.getPrototypeOf(this)).log.call(this);\\n}\\n\\n})();\",\"type\":\"application/javascript\",\"module-type\":\"widget-subclass\"},\"$:/core/modules/widgets/macrocall.js\":{\"title\":\"$:/core/modules/widgets/macrocall.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/macrocall.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nMacrocall widget\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar MacroCallWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nMacroCallWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nMacroCallWidget.prototype.render = function(parent,nextSibling) {\\n\\tthis.parentDomNode = parent;\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n\\tthis.renderChildren(parent,nextSibling);\\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nMacroCallWidget.prototype.execute = function() {\\n\\tthis.macroName = this.parseTreeNode.name || this.getAttribute(\\\"$name\\\"),\\n\\tthis.parseType = this.getAttribute(\\\"$type\\\",\\\"text/vnd.tiddlywiki\\\");\\n\\tthis.renderOutput = this.getAttribute(\\\"$output\\\",\\\"text/html\\\");\\n\\t// Merge together the parameters specified in the parse tree with the specified attributes\\n\\tvar params = this.parseTreeNode.params ? this.parseTreeNode.params.slice(0) : [];\\n\\t$tw.utils.each(this.attributes,function(attribute,name) {\\n\\t\\tif(name.charAt(0) !== \\\"$\\\") {\\n\\t\\t\\tparams.push({name: name, value: attribute});\\n\\t\\t}\\n\\t});\\n\\t// Make a transclude widget\\n\\tvar positionalName = 0,\\n\\t\\tparseTreeNodes = [{\\n\\t\\t\\ttype: \\\"transclude\\\",\\n\\t\\t\\tisBlock: this.parseTreeNode.isBlock,\\n\\t\\t\\tchildren: this.parseTreeNode.children\\n\\t\\t}];\\n\\t$tw.utils.addAttributeToParseTreeNode(parseTreeNodes[0],\\\"$variable\\\",this.macroName);\\n\\t$tw.utils.addAttributeToParseTreeNode(parseTreeNodes[0],\\\"$type\\\",this.parseType);\\n\\t$tw.utils.addAttributeToParseTreeNode(parseTreeNodes[0],\\\"$output\\\",this.renderOutput);\\n\\t$tw.utils.each(params,function(param) {\\n\\t\\tvar name = param.name;\\n\\t\\tif(name) {\\n\\t\\t\\tif(name.charAt(0) === \\\"$\\\") {\\n\\t\\t\\t\\tname = \\\"$\\\" + name;\\n\\t\\t\\t}
2731\\n\\t\\t\\t$tw.utils.addAttributeToParseTreeNode(parseTreeNodes[0],name,param.value);\\n\\t\\t} else {\\n\\t\\t\\t$tw.utils.addAttributeToParseTreeNode(parseTreeNodes[0],(positionalName++) + \\\"\\\",param.value);\\n\\t\\t}\\n\\t});\\n\\t// Construct the child widgets\\n\\tthis.makeChildWidgets(parseTreeNodes);\\n};\\n\\n/*\\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n*/\\nMacroCallWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes();\\n\\tif($tw.utils.count(changedAttributes) > 0) {\\n\\t\\t// Rerender ourselves\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t} else {\\n\\t\\treturn this.refreshChildren(changedTiddlers);\\n\\t}\\n};\\n\\nexports.macrocall = MacroCallWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/messagecatcher.js\":{\"title\":\"$:/core/modules/widgets/messagecatcher.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/messagecatcher.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nMessage catcher widget\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar MessageCatcherWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nMessageCatcherWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nMessageCatcherWidget.prototype.render = function(parent,nextSibling) {\\n\\tvar self = this;\\n\\t// Remember parent\\n\\tthis.parentDomNode = parent;\\n\\t// Compute attributes and execute state\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n\\t// Helper to add an event handler\\n\\tvar addEventHandler = function(type,actions) {\\n\\t\\tif(type && actions) {\\n\\t\\t\\tvar isActionStringExecuting = false;\\n\\t\\t\\tself.addEventListener(\\n\\t\\t\\t\\ttype,\\n\\t\\t\\t\\tfunction(event) {\\n\\t\\t\\t\\t\\t// Don't trap the event if it came from one of our action handlers\\n\\t\\t\\t\\t\\tif(isActionStringExecuting) {\\n\\t\\t\\t\\t\\t\\treturn true;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t// Collect all the event properties into variables\\n\\t\\t\\t\\t\\tvar collectProps = function(obj,prefix) {\\n\\t\\t\\t\\t\\t\\tprefix = prefix || \\\"\\\";\\n\\t\\t\\t\\t\\t\\tvar props = {},\\n\\t\\t\\t\\t\\t\\t\\tnames = [];\\n\\t\\t\\t\\t\\t\\t$tw.utils.each(obj,function(value,name) {\\n\\t\\t\\t\\t\\t\\t\\tif([\\\"string\\\",\\\"boolean\\\",\\\"number\\\"].indexOf(typeof value) !== -1) {\\n\\t\\t\\t\\t\\t\\t\\t\\tnames.push(name);
2731\\n\\t\\t\\t\\t\\t\\t\\t\\tprops[prefix + \\\"-\\\" + name] = value.toString();\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t});\\n\\t\\t\\t\\t\\t\\tprops[\\\"list-\\\" + prefix] = $tw.utils.stringifyList(names);\\n\\t\\t\\t\\t\\t\\treturn props;\\n\\t\\t\\t\\t\\t};\\n\\t\\t\\t\\t\\tvar variables = $tw.utils.extend(\\n\\t\\t\\t\\t\\t\\t{},\\n\\t\\t\\t\\t\\t\\tcollectProps(event.paramObject,\\\"event-paramObject\\\"),\\n\\t\\t\\t\\t\\t\\tcollectProps(event,\\\"event\\\"),\\n\\t\\t\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\t\\t\\tmodifier: $tw.keyboardManager.getEventModifierKeyDescriptor(event)\\n\\t\\t\\t\\t\\t\\t});\\n\\t\\t\\t\\t\\tisActionStringExecuting = true;\\n\\t\\t\\t\\t\\tself.invokeActionString(actions,self,event,variables);\\n\\t\\t\\t\\t\\tisActionStringExecuting = false;\\n\\t\\t\\t\\t\\treturn false;\\n\\t\\t\\t\\t}\\n\\t\\t\\t);\\n\\t\\t}\\n\\t}\\n\\t// Add the main event handler\\n\\taddEventHandler(this.getAttribute(\\\"type\\\"),this.getAttribute(\\\"actions\\\"));\\n\\t// Add any other event handlers\\n\\t$tw.utils.each(this.attributes,function(value,key) {\\n\\t\\tif(key.charAt(0) === \\\"$\\\") {\\n\\t\\t\\taddEventHandler(key.slice(1),value);\\n\\t\\t}\\n\\t});\\n\\t// Render children\\n\\tthis.renderChildren(parent,nextSibling);\\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nMessageCatcherWidget.prototype.execute = function() {\\n\\t// Make child widgets\\n\\tthis.makeChildWidgets();\\n};\\n\\n/*\\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n*/\\nMessageCatcherWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes();\\n\\tif($tw.utils.count(changedAttributes) > 0) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t}\\n\\treturn this.refreshChildren(changedTiddlers);\\n};\\n\\nexports.messagecatcher = MessageCatcherWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/navigator.js\":{\"title\":\"$:/core/modules/widgets/navigator.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/navigator.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nNavigator widget\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar IMPORT_TITLE = \\\"$:/Import\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar NavigatorWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nNavigatorWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nNavigatorWidget.prototype.render = function(parent,nextSibling) {\\n\\tthis.addEventListeners([\\n\\t\\t{type: \\\"tm-navigate\\\", handler: \\\"handleNavigateEvent\\\"},\\n\\t\\t{type: \\\"tm-edit-tiddler\\\", handler: \\\"handleEditTiddlerEvent\\\"},\\n\\t\\t{type: \\\"tm-delete-tiddler\\\", handler: \\\"handleDeleteTiddlerEvent\\\"},\\n\\t\\t{type: \\\"tm-save-tiddler\\\", handler: \\\"handleSaveTiddlerEvent\\\"},\\n\\t\\t{type: \\\"tm-cancel-tiddler\\\", handler: \\\"handleCancelTiddlerEvent\\\"},\\n\\t\\t{type: \\\"tm-close-tiddler\\\", handler: \\\"handleCloseTiddlerEvent\\\"},\\n\\t\\t{type: \\\"tm-close-all-tiddlers\\\", handler: \\\"handleCloseAllTiddlersEvent\\\"},\\n\\t\\t{type: \\\"tm-close-other-tiddlers\\\", handler: \\\"handleCloseOtherTiddlersEvent\\\"},\\n\\t\\t{type: \\\"tm-new-tiddler\\\", handler: \\\"handleNewTiddlerEvent\\\"},\\n\\t\\t{type: \\\"tm-import-tiddlers\\\", handler: \\\"handleImportTiddlersEvent\\\"},\\n\\t\\t{type: \\\"tm-perform-import\\\", handler: \\\"handlePerformImportEvent\\\"},\\n\\t\\t{type: \\\"tm-fold-tiddler\\\", handler: \\\"handleFoldTiddlerEvent\\\"},\\n\\t\\t{type: \\\"tm-fold-other-tiddlers\\\", handler: \\\"handleFoldOtherTiddlersEvent\\\"},\\n\\t\\t{type: \\\"tm-fold-all-tiddlers\\\", handler: \\\"handleFoldAllTiddlersEvent\\\"},\\n\\t\\t{type: \\\"tm-unfold-all-tiddlers\\\", handler: \\\"handleUnfoldAllTiddlersEvent\\\"}\\n\\t]);\\n\\tthis.parentDomNode = parent;\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n\\tthis.renderChildren(parent,nextSibling);\\n};
2731\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nNavigatorWidget.prototype.execute = function() {\\n\\t// Get our parameters\\n\\tthis.storyTitle = this.getAttribute(\\\"story\\\");\\n\\tthis.historyTitle = this.getAttribute(\\\"history\\\");\\n\\tthis.setVariable(\\\"tv-story-list\\\",this.storyTitle);\\n\\tthis.setVariable(\\\"tv-history-list\\\",this.historyTitle);\\n\\tthis.story = new $tw.Story({\\n\\t\\twiki: this.wiki,\\n\\t\\tstoryTitle: this.storyTitle,\\n\\t\\thistoryTitle: this.historyTitle\\n\\t});\\n\\t// Construct the child widgets\\n\\tthis.makeChildWidgets();\\n};\\n\\n/*\\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n*/\\nNavigatorWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes();\\n\\tif(changedAttributes.story || changedAttributes.history) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t} else {\\n\\t\\treturn this.refreshChildren(changedTiddlers);\\n\\t}\\n};\\n\\nNavigatorWidget.prototype.getStoryList = function() {\\n\\treturn this.storyTitle ? this.wiki.getTiddlerList(this.storyTitle) : null;\\n};\\n\\nNavigatorWidget.prototype.saveStoryList = function(storyList) {\\n\\tif(this.storyTitle) {\\n\\t\\tvar storyTiddler = this.wiki.getTiddler(this.storyTitle);\\n\\t\\tthis.wiki.addTiddler(new $tw.Tiddler(\\n\\t\\t\\t{title: this.storyTitle},\\n\\t\\t\\tstoryTiddler,\\n\\t\\t\\t{list: storyList}\\n\\t\\t));\\n\\t}\\n};\\n\\nNavigatorWidget.prototype.removeTitleFromStory = function(storyList,title) {\\n\\tif(storyList) {\\n\\t\\tvar p = storyList.indexOf(title);\\n\\t\\twhile(p !== -1) {\\n\\t\\t\\tstoryList.splice(p,1);\\n\\t\\t\\tp = storyList.indexOf(title);\\n\\t\\t}\\n\\t}\\n};\\n\\nNavigatorWidget.prototype.replaceFirstTitleInStory = function(storyList,oldTitle,newTitle) {\\n\\tif(storyList) {\\n\\t\\tvar pos = storyList.indexOf(oldTitle);\\n\\t\\tif(pos !== -1) {\\n\\t\\t\\tstoryList[pos] = newTitle;\\n\\t\\t\\tdo {\\n\\t\\t\\t\\tpos = storyList.indexOf(oldTitle,pos + 1);\\n\\t\\t\\t\\tif(pos !== -1) {\\n\\t\\t\\t\\t\\tstoryList.splice(pos,1);\\n\\t\\t\\t\\t}\\n\\t\\t\\t} while(pos !== -1);\\n\\t\\t} else {\\n\\t\\t\\tstoryList.splice(0,0,newTitle);\\n\\t\\t}\\n\\t}\\n};\\n\\nNavigatorWidget.prototype.addToStory = function(title,fromTitle) {\\n\\tif(this.storyTitle) {\\n\\t\\tthis.story.addToStory(title,fromTitle,{\\n\\t\\t\\topenLinkFromInsideRiver: this.getAttribute(\\\"openLinkFromInsideRiver\\\",\\\"top\\\"),\\n\\t\\t\\topenLinkFromOutsideRiver: this.getAttribute(\\\"openLinkFromOutsideRiver\\\",\\\"top\\\")\\n\\t\\t});\\n\\t}\\n};\\n\\n/*\\nAdd a new record to the top of the history stack\\ntitle: a title string or an array of title strings\\nfromPageRect: page coordinates of the origin of the navigation\\n*/\\nNavigatorWidget.prototype.addToHistory = function(title,fromPageRect) {\\n\\tthis.story.addToHistory(title,fromPageRect,this.historyTitle);\\n};\\n\\n/*\\nHandle a tm-navigate event\\n*/\\nNavigatorWidget.prototype.handleNavigateEvent = function(event) {\\n\\tevent = $tw.hooks.invokeHook(\\\"th-navigating\\\",event);\\n\\tif(event.navigateTo) {\\n\\t\\tthis.addToStory(event.navigateTo,event.navigateFromTitle);\\n\\t\\tif(!event.navigateSuppressNavigation) {\\n\\t\\t\\tthis.addToHistory(event.navigateTo,event.navigateFromClientRect);\\n\\t\\t}\\n\\t}\\n\\treturn false;\\n};
2731\\n\\n// Close a specified tiddler\\nNavigatorWidget.prototype.handleCloseTiddlerEvent = function(event) {\\n\\tevent = $tw.hooks.invokeHook(\\\"th-closing-tiddler\\\",event);\\n\\tvar title = event.param || event.tiddlerTitle,\\n\\t\\tstoryList = this.getStoryList();\\n\\t// Look for tiddlers with this title to close\\n\\tthis.removeTitleFromStory(storyList,title);\\n\\tthis.saveStoryList(storyList);\\n\\treturn false;\\n};\\n\\n// Close all tiddlers\\nNavigatorWidget.prototype.handleCloseAllTiddlersEvent = function(event) {\\n\\tthis.saveStoryList([]);\\n\\treturn false;\\n};\\n\\n// Close other tiddlers\\nNavigatorWidget.prototype.handleCloseOtherTiddlersEvent = function(event) {\\n\\tvar title = event.param || event.tiddlerTitle;\\n\\tthis.saveStoryList([title]);\\n\\treturn false;\\n};\\n\\n// Place a tiddler in edit mode\\nNavigatorWidget.prototype.handleEditTiddlerEvent = function(event) {\\n\\tvar editTiddler = $tw.hooks.invokeHook(\\\"th-editing-tiddler\\\",event),\\n\\t    win = event.event && event.event.view ? event.event.view : window;\\n\\tif(!editTiddler) {\\n\\t\\treturn false;\\n\\t}\\n\\tvar self = this;\\n\\tfunction isUnmodifiedShadow(title) {\\n\\t\\treturn self.wiki.isShadowTiddler(title) && !self.wiki.tiddlerExists(title);\\n\\t}\\n\\tfunction confirmEditShadow(title) {\\n\\t\\treturn win.confirm($tw.language.getString(\\n\\t\\t\\t\\\"ConfirmEditShadowTiddler\\\",\\n\\t\\t\\t{variables:\\n\\t\\t\\t\\t{title: title}\\n\\t\\t\\t}\\n\\t\\t));\\n\\t}\\n\\tvar title = event.param || event.tiddlerTitle;\\n\\tif(isUnmodifiedShadow(title) && !confirmEditShadow(title)) {\\n\\t\\treturn false;\\n\\t}\\n\\t// Replace the specified tiddler with a draft in edit mode\\n\\tvar draftTiddler = this.makeDraftTiddler(title);\\n\\t// Update the story and history if required\\n\\tif(!event.paramObject || event.paramObject.suppressNavigation !== \\\"yes\\\") {\\n\\t\\tvar draftTitle = draftTiddler.fields.title,\\n\\t\\t\\tstoryList = this.getStoryList();\\n\\t\\tthis.removeTitleFromStory(storyList,draftTitle);\\n\\t\\tthis.replaceFirstTitleInStory(storyList,title,draftTitle);\\n\\t\\tthis.addToHistory(draftTitle,event.navigateFromClientRect);\\n\\t\\tthis.saveStoryList(storyList);\\n\\t\\treturn false;\\n\\t}\\n};\\n\\n// Delete a tiddler\\nNavigatorWidget.prototype.handleDeleteTiddlerEvent = function(event) {\\n\\t// Get the tiddler we're deleting\\n\\tvar title = event.param || event.tiddlerTitle,\\n\\t\\ttiddler = this.wiki.getTiddler(title),\\n\\t\\tstoryList = this.getStoryList(),\\n\\t\\toriginalTitle = tiddler ? tiddler.fields[\\\"draft.of\\\"] : \\\"\\\",\\n\\t\\toriginalTiddler = originalTitle ? this.wiki.getTiddler(originalTitle) : undefined,\\n\\t\\tconfirmationTitle,\\n\\t\\twin = event.event && event.event.view ? event.event.view : window;\\n\\t// Check if the tiddler we're deleting is in draft mode\\n\\tif(originalTitle) {\\n\\t\\t// If so, we'll prompt for confirmation referencing the original tiddler\\n\\t\\tconfirmationTitle = originalTitle;\\n\\t} else {\\n\\t\\t// If not a draft, then prompt for confirmation referencing the specified tiddler\\n\\t\\tconfirmationTitle = title;\\n\\t}\\n\\t// Seek confirmation\\n\\tif(((originalTitle && this.wiki.getTiddler(originalTitle)) || (tiddler && ((tiddler.fields.text || \\\"\\\") !== \\\"\\\"))) && !win.confirm($tw.language.getString(\\n\\t\\t\\t\\t\\\"ConfirmDeleteTiddler\\\",\\n\\t\\t\\t\\t{variables:\\n\\t\\t\\t\\t\\t{title: confirmationTitle}\\n\\t\\t\\t\\t}\\n\\t\\t\\t))) {\\n\\t\\treturn false;\\n\\t}\\n\\t// Delete the original tiddler\\n\\tif(originalTitle) {\\n\\t\\tif(originalTiddler) {\\n\\t\\t\\t$tw.hooks.invokeHook(\\\"th-deleting-tiddler\\\",originalTiddler);\\n\\t\\t}\\n\\t\\tthis.wiki.deleteTiddler(originalTitle);\\n\\t\\tthis.removeTitleFromStory(storyList,originalTitle);\\n\\t}\\n\\t// Invoke the hook function and delete this tiddler\\n\\tif(tiddler) {\\n\\t\\t$tw.hooks.invokeHook(\\\"th-deleting-tiddler\\\",tiddler);\\n\\t\\tthis.wiki.deleteTiddler(title);\\t\\n\\t}\\n\\t// Remove the closed tiddler from the story\\n\\tthis.removeTitleFromStory(storyList,title);\\n\\tthis.saveStoryList(storyList);
2731\\n\\t// Trigger an autosave\\n\\t$tw.rootWidget.dispatchEvent({type: \\\"tm-auto-save-wiki\\\"});\\n\\treturn false;\\n};\\n\\n/*\\nCreate/reuse the draft tiddler for a given title\\n*/\\nNavigatorWidget.prototype.makeDraftTiddler = function(targetTitle) {\\n\\t// See if there is already a draft tiddler for this tiddler\\n\\tvar draftTitle = this.wiki.findDraft(targetTitle);\\n\\tif(draftTitle) {\\n\\t\\treturn this.wiki.getTiddler(draftTitle);\\n\\t}\\n\\t// Get the current value of the tiddler we're editing\\n\\tvar tiddler = this.wiki.getTiddler(targetTitle);\\n\\t// Save the initial value of the draft tiddler\\n\\tdraftTitle = this.generateDraftTitle(targetTitle);\\n\\tvar draftTiddler = new $tw.Tiddler({\\n\\t\\t\\t\\ttext: \\\"\\\",\\n\\t\\t\\t},\\n\\t\\t\\ttiddler,\\n\\t\\t\\t{\\n\\t\\t\\t\\ttitle: draftTitle,\\n\\t\\t\\t\\t\\\"draft.title\\\": targetTitle,\\n\\t\\t\\t\\t\\\"draft.of\\\": targetTitle\\n\\t\\t\\t},\\n\\t\\t\\tthis.wiki.getModificationFields()\\n\\t\\t);\\n\\tthis.wiki.addTiddler(draftTiddler);\\n\\treturn draftTiddler;\\n};
2731\\n\\n/*\\nGenerate a title for the draft of a given tiddler\\n*/\\nNavigatorWidget.prototype.generateDraftTitle = function(title) {\\n\\treturn this.wiki.generateDraftTitle(title);\\n};\\n\\n// Take a tiddler out of edit mode, saving the changes\\nNavigatorWidget.prototype.handleSaveTiddlerEvent = function(event) {\\n\\tvar title = event.param || event.tiddlerTitle,\\n\\t\\ttiddler = this.wiki.getTiddler(title),\\n\\t\\tstoryList = this.getStoryList(),\\n\\t    \\twin = event.event && event.event.view ? event.event.view : window;\\n\\t// Replace the original tiddler with the draft\\n\\tif(tiddler) {\\n\\t\\tvar draftTitle = (tiddler.fields[\\\"draft.title\\\"] || \\\"\\\").trim(),\\n\\t\\t\\tdraftOf = (tiddler.fields[\\\"draft.of\\\"] || \\\"\\\").trim();\\n\\t\\tif(draftTitle) {\\n\\t\\t\\tvar isRename = draftOf !== draftTitle,\\n\\t\\t\\t\\tisConfirmed = true;\\n\\t\\t\\tif(isRename && this.wiki.tiddlerExists(draftTitle)) {\\n\\t\\t\\t\\tisConfirmed = win.confirm($tw.language.getString(\\n\\t\\t\\t\\t\\t\\\"ConfirmOverwriteTiddler\\\",\\n\\t\\t\\t\\t\\t{variables:\\n\\t\\t\\t\\t\\t\\t{title: draftTitle}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t));\\n\\t\\t\\t}\\n\\t\\t\\tif(isConfirmed) {\\n\\t\\t\\t\\t// Create the new tiddler and pass it through the th-saving-tiddler hook\\n\\t\\t\\t\\tvar newTiddler = new $tw.Tiddler(this.wiki.getCreationFields(),tiddler,{\\n\\t\\t\\t\\t\\ttitle: draftTitle,\\n\\t\\t\\t\\t\\t\\\"draft.title\\\": undefined,\\n\\t\\t\\t\\t\\t\\\"draft.of\\\": undefined\\n\\t\\t\\t\\t},this.wiki.getModificationFields());\\n\\t\\t\\t\\tnewTiddler = $tw.hooks.invokeHook(\\\"th-saving-tiddler\\\",newTiddler,tiddler);\\n\\t\\t\\t\\tthis.wiki.addTiddler(newTiddler);\\n\\t\\t\\t\\t// If enabled, relink references to renamed tiddler\\n\\t\\t\\t\\tvar shouldRelink = this.getAttribute(\\\"relinkOnRename\\\",\\\"no\\\").toLowerCase().trim() === \\\"yes\\\";\\n\\t\\t\\t\\tif(isRename && shouldRelink && this.wiki.tiddlerExists(draftOf)) {\\n\\t\\t\\t\\t\\tthis.wiki.relinkTiddler(draftOf,draftTitle);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t// Remove the draft tiddler\\n\\t\\t\\t\\tthis.wiki.deleteTiddler(title);\\n\\t\\t\\t\\t// Remove the original tiddler if we're renaming it\\n\\t\\t\\t\\tif(isRename) {\\n\\t\\t\\t\\t\\tthis.wiki.deleteTiddler(draftOf);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t// #2381 always remove new title & old\\n\\t\\t\\t\\tthis.removeTitleFromStory(storyList,draftTitle);\\n\\t\\t\\t\\tthis.removeTitleFromStory(storyList,draftOf);\\n\\t\\t\\t\\tif(!event.paramObject || event.paramObject.suppressNavigation !== \\\"yes\\\") {\\n\\t\\t\\t\\t\\t// Replace the draft in the story with the original\\n\\t\\t\\t\\t\\tthis.replaceFirstTitleInStory(storyList,title,draftTitle);\\n\\t\\t\\t\\t\\tthis.addToHistory(draftTitle,event.navigateFromClientRect);\\n\\t\\t\\t\\t\\tif(draftTitle !== this.storyTitle) {\\n\\t\\t\\t\\t\\t\\tthis.saveStoryList(storyList);\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t// Trigger an autosave\\n\\t\\t\\t\\t$tw.rootWidget.dispatchEvent({type: \\\"tm-auto-save-wiki\\\"});\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\treturn false;\\n};
2731\\n\\n// Take a tiddler out of edit mode without saving the changes\\nNavigatorWidget.prototype.handleCancelTiddlerEvent = function(event) {\\n\\tevent = $tw.hooks.invokeHook(\\\"th-cancelling-tiddler\\\", event);\\n\\tvar win = event.event && event.event.view ? event.event.view : window;\\n\\t// Flip the specified tiddler from draft back to the original\\n\\tvar draftTitle = event.param || event.tiddlerTitle,\\n\\t\\tdraftTiddler = this.wiki.getTiddler(draftTitle),\\n\\t\\toriginalTitle = draftTiddler && draftTiddler.fields[\\\"draft.of\\\"];\\n\\tif(draftTiddler && originalTitle) {\\n\\t\\t// Ask for confirmation if the tiddler text has changed\\n\\t\\tvar isConfirmed = true,\\n\\t\\t\\toriginalTiddler = this.wiki.getTiddler(originalTitle),\\n\\t\\t\\tstoryList = this.getStoryList();\\n\\t\\tif(this.wiki.isDraftModified(draftTitle)) {\\n\\t\\t\\tisConfirmed = win.confirm($tw.language.getString(\\n\\t\\t\\t\\t\\\"ConfirmCancelTiddler\\\",\\n\\t\\t\\t\\t{variables:\\n\\t\\t\\t\\t\\t{title: draftTitle}\\n\\t\\t\\t\\t}\\n\\t\\t\\t));\\n\\t\\t}\\n\\t\\t// Remove the draft tiddler\\n\\t\\tif(isConfirmed) {\\n\\t\\t\\tthis.wiki.deleteTiddler(draftTitle);\\n\\t\\t\\tif(!event.paramObject || event.paramObject.suppressNavigation !== \\\"yes\\\") {\\n\\t\\t\\t\\tif(originalTiddler) {\\n\\t\\t\\t\\t\\tthis.replaceFirstTitleInStory(storyList,draftTitle,originalTitle);\\n\\t\\t\\t\\t\\tthis.addToHistory(originalTitle,event.navigateFromClientRect);\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tthis.removeTitleFromStory(storyList,draftTitle);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tthis.saveStoryList(storyList);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\treturn false;\\n};
2731\\n\\n// Create a new draft tiddler\\n// event.param can either be the title of a template tiddler, or a hashmap of fields.\\n//\\n// The title of the newly created tiddler follows these rules:\\n// * If a hashmap was used and a title field was specified, use that title\\n// * If a hashmap was used without a title field, use a default title, if necessary making it unique with a numeric suffix\\n// * If a template tiddler was used, use the title of the template, if necessary making it unique with a numeric suffix\\n//\\n// If a draft of the target tiddler already exists then it is reused\\nNavigatorWidget.prototype.handleNewTiddlerEvent = function(event) {\\n\\tevent = $tw.hooks.invokeHook(\\\"th-new-tiddler\\\", event);\\n\\t// Get the story details\\n\\tvar storyList = this.getStoryList(),\\n\\t\\ttemplateTiddler, additionalFields, title, draftTitle, existingTiddler;\\n\\t// Get the template tiddler (if any)\\n\\tif(typeof event.param === \\\"string\\\") {\\n\\t\\t// Get the template tiddler\\n\\t\\ttemplateTiddler = this.wiki.getTiddler(event.param);\\n\\t\\t// Generate a new title\\n\\t\\ttitle = this.wiki.generateNewTitle(event.param || $tw.language.getString(\\\"DefaultNewTiddlerTitle\\\"));\\n\\t}\\n\\t// Get the specified additional fields\\n\\tif(typeof event.paramObject === \\\"object\\\") {\\n\\t\\tadditionalFields = event.paramObject;\\n\\t}\\n\\tif(typeof event.param === \\\"object\\\") { // Backwards compatibility with 5.1.3\\n\\t\\tadditionalFields = event.param;\\n\\t}\\n\\tif(additionalFields && additionalFields.title) {\\n\\t\\ttitle = additionalFields.title;\\n\\t}\\n\\t// Make a copy of the additional fields excluding any blank ones\\n\\tvar filteredAdditionalFields = $tw.utils.extend({},additionalFields);\\n\\tObject.keys(filteredAdditionalFields).forEach(function(fieldName) {\\n\\t\\tif(filteredAdditionalFields[fieldName] === \\\"\\\") {\\n\\t\\t\\tdelete filteredAdditionalFields[fieldName];\\n\\t\\t}\\n\\t});\\n\\t// Generate a title if we don't have one\\n\\ttitle = title || this.wiki.generateNewTitle($tw.language.getString(\\\"DefaultNewTiddlerTitle\\\"));\\n\\t// Find any existing draft for this tiddler\\n\\tdraftTitle = this.wiki.findDraft(title);\\n\\t// Pull in any existing tiddler\\n\\tif(draftTitle) {\\n\\t\\texistingTiddler = this.wiki.getTiddler(draftTitle);\\n\\t} else {\\n\\t\\tdraftTitle = this.generateDraftTitle(title);\\n\\t\\texistingTiddler = this.wiki.getTiddler(title);\\n\\t}\\n\\t// Merge the tags\\n\\tvar mergedTags = [];\\n\\tif(existingTiddler && existingTiddler.fields.tags) {\\n\\t\\t$tw.utils.pushTop(mergedTags,existingTiddler.fields.tags);\\n\\t}\\n\\tif(additionalFields && additionalFields.tags) {\\n\\t\\t// Merge tags\\n\\t\\tmergedTags = $tw.utils.pushTop(mergedTags,$tw.utils.parseStringArray(additionalFields.tags));\\n\\t}\\n\\tif(templateTiddler && templateTiddler.fields.tags) {\\n\\t\\t// Merge tags\\n\\t\\tmergedTags = $tw.utils.pushTop(mergedTags,templateTiddler.fields.tags);\\n\\t}\\n\\t// Save the draft tiddler\\n\\tvar draftTiddler = new $tw.Tiddler({\\n\\t\\t\\ttext: \\\"\\\",\\n\\t\\t\\t\\\"draft.title\\\": title\\n\\t\\t},\\n\\t\\ttemplateTiddler,\\n\\t\\tadditionalFields,\\n\\t\\tthis.wiki.getCreationFields(),\\n\\t\\texistingTiddler,\\n\\t\\tfilteredAdditionalFields,\\n\\t\\t{\\n\\t\\t\\ttitle: draftTitle,\\n\\t\\t\\t\\\"draft.of\\\": title,\\n\\t\\t\\ttags: mergedTags\\n\\t\\t},this.wiki.getModificationFields());\\n\\tthis.wiki.addTiddler(draftTiddler);\\n\\t// Update the story to insert the new draft at the top and remove any existing tiddler\\n\\tif(storyList && storyList.indexOf(draftTitle) === -1) {\\n\\t\\tvar slot = storyList.indexOf(event.navigateFromTitle);\\n\\t\\tif(slot === -1) {\\n\\t\\t\\tslot = this.getAttribute(\\\"openLinkFromOutsideRiver\\\",\\\"top\\\") === \\\"bottom\\\" ? storyList.length - 1 : slot;\\n\\t\\t}\\n\\t\\tstoryList.splice(slot + 1,0,draftTitle);\\n\\t}\\n\\tif(storyList && storyList.indexOf(title) !== -1) {\\n\\t\\tstoryList.splice(storyList.indexOf(title),1);\\n\\t}\\n\\tthis.saveStoryList(storyList);\\n\\t// Add a new record to the top of the history stack\\n\\tthis.addToHistory(draftTitle);\\n\\treturn false;\\n};
2731\\n\\n// Import JSON tiddlers into a pending import tiddler\\nNavigatorWidget.prototype.handleImportTiddlersEvent = function(event) {\\n\\t// Get the tiddlers\\n\\tvar tiddlers = $tw.utils.parseJSONSafe(event.param,[]);\\n\\t// Get the current $:/Import tiddler\\n\\tvar paramObject = event.paramObject || {},\\n\\t\\timportTitle = event.importTitle || paramObject.importTitle || IMPORT_TITLE,\\n\\t\\timportTiddler = this.wiki.getTiddler(importTitle),\\n\\t\\timportData = this.wiki.getTiddlerData(importTitle,{}),\\n\\t\\tnewFields = new Object({\\n\\t\\t\\ttitle: importTitle,\\n\\t\\t\\ttype: \\\"application/json\\\",\\n\\t\\t\\t\\\"plugin-type\\\": \\\"import\\\",\\n\\t\\t\\t\\\"status\\\": \\\"pending\\\"\\n\\t\\t}),\\n\\t\\tincomingTiddlers = [];\\n\\t// Process each tiddler\\n\\timportData.tiddlers = importData.tiddlers || {};\\n\\t$tw.utils.each(tiddlers,function(tiddlerFields) {\\n\\t\\ttiddlerFields.title = $tw.utils.trim(tiddlerFields.title);\\n\\t\\tvar title = tiddlerFields.title;\\n\\t\\tif(title) {\\n\\t\\t\\tincomingTiddlers.push(title);\\n\\t\\t\\timportData.tiddlers[title] = tiddlerFields;\\n\\t\\t}\\n\\t});\\n\\t// Give the active upgrader modules a chance to process the incoming tiddlers\\n\\tvar messages = this.wiki.invokeUpgraders(incomingTiddlers,importData.tiddlers);\\n\\t// Deselect any disabled, but _not_ suppressed tiddlers\\n\\tvar systemMessage = $tw.language.getString(\\\"Import/Upgrader/Tiddler/Unselected\\\");\\n\\t$tw.utils.each(messages,function(message,title) {\\n\\t\\tnewFields[\\\"message-\\\" + title] = message;\\n\\t\\tif (message.indexOf(systemMessage) !== -1) {\\n\\t\\t\\tnewFields[\\\"selection-\\\" + title] = \\\"unchecked\\\";\\n\\t\\t}\\n\\t});\\n\\t// Deselect suppressed tiddlers ... they have been removed and can't be selected anymore\\n\\t$tw.utils.each(importData.tiddlers,function(tiddler,title) {\\n\\t\\tif($tw.utils.count(tiddler) === 0) {\\n\\t\\t\\tnewFields[\\\"selection-\\\" + title] = \\\"unchecked\\\";\\n\\t\\t\\tnewFields[\\\"suppressed-\\\" + title] = \\\"yes\\\";\\n\\t\\t}\\n\\t});\\n\\t// Save the $:/Import tiddler\\n\\tnewFields.text = JSON.stringify(importData,null,$tw.config.preferences.jsonSpaces);\\n\\tthis.wiki.addTiddler(new $tw.Tiddler(importTiddler,newFields));\\n\\t// Update the story and history details\\n\\tvar autoOpenOnImport = event.autoOpenOnImport || paramObject.autoOpenOnImport || this.getVariable(\\\"tv-auto-open-on-import\\\");\\n\\tif(autoOpenOnImport !== \\\"no\\\") {\\n\\t\\tvar storyList = this.getStoryList(),\\n\\t\\t\\thistory = [];\\n\\t\\t// Add it to the story\\n\\t\\tif(storyList && storyList.indexOf(importTitle) === -1) {\\n\\t\\t\\tstoryList.unshift(importTitle);\\n\\t\\t}\\n\\t\\t// And to history\\n\\t\\thistory.push(importTitle);\\n\\t\\t// Save the updated story and history\\n\\t\\tthis.saveStoryList(storyList);\\n\\t\\tthis.addToHistory(history);\\n\\t}\\n\\treturn false;\\n};
2731\\n\\n//\\nNavigatorWidget.prototype.handlePerformImportEvent = function(event) {\\n\\tvar self = this,\\n\\t\\timportTiddler = this.wiki.getTiddler(event.param),\\n\\t\\timportData,\\n\\t\\timportReport = [];\\n\\timportReport.push($tw.language.getString(\\\"Import/Imported/Hint\\\") + \\\"\\\\n\\\");\\n\\t// If you need to modify the import tiddler payload then consider th-importing-tiddler instead\\n\\timportTiddler = $tw.hooks.invokeHook(\\\"th-before-importing\\\",importTiddler);\\n\\timportData = this.wiki.getTiddlerDataCached(event.param,{tiddlers: {}}),\\n\\t$tw.utils.each(importData.tiddlers,function(tiddlerFields) {\\n\\t\\tvar title = tiddlerFields.title;\\n\\t\\tif(title && importTiddler && importTiddler.fields[\\\"selection-\\\" + title] !== \\\"unchecked\\\") {\\n\\t\\t\\tif($tw.utils.hop(importTiddler.fields,[\\\"rename-\\\" + title])) {\\n\\t\\t\\t\\tvar tiddler = new $tw.Tiddler(tiddlerFields,{title : importTiddler.fields[\\\"rename-\\\" + title]});\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tvar tiddler = new $tw.Tiddler(tiddlerFields);\\n\\t\\t\\t}\\n\\t\\t\\t// th-importing-tiddler doesn't allow user interaction by default\\n\\t\\t\\t// If you want to use the default UI then use: $:/core/modules/upgraders/ instead\\n\\t\\t\\ttiddler = $tw.hooks.invokeHook(\\\"th-importing-tiddler\\\",tiddler);\\n\\t\\t\\t// Add the tiddlers to the store\\n\\t\\t\\tself.wiki.addTiddler(tiddler);\\n\\t\\t\\timportReport.push(\\\"# [[\\\" + tiddler.fields.title + \\\"]]\\\");\\n\\t\\t}\\n\\t});\\n\\t// Replace the $:/Import tiddler with an import report\\n\\tthis.wiki.addTiddler(new $tw.Tiddler({\\n\\t\\ttitle: event.param,\\n\\t\\ttext: importReport.join(\\\"\\\\n\\\"),\\n\\t\\t\\\"status\\\": \\\"complete\\\"\\n\\t}));\\n\\t// Navigate to the $:/Import tiddler\\n\\tthis.addToHistory([event.param]);\\n\\t// Trigger an autosave\\n\\t$tw.rootWidget.dispatchEvent({type: \\\"tm-auto-save-wiki\\\"});\\n};\\n\\nNavigatorWidget.prototype.handleFoldTiddlerEvent = function(event) {\\n\\tvar paramObject = event.paramObject || {};\\n\\tif(paramObject.foldedState) {\\n\\t\\tvar foldedState = this.wiki.getTiddlerText(paramObject.foldedState,\\\"show\\\") === \\\"show\\\" ? \\\"hide\\\" : \\\"show\\\";\\n\\t\\tthis.wiki.setText(paramObject.foldedState,\\\"text\\\",null,foldedState);\\n\\t}\\n};\\n\\nNavigatorWidget.prototype.handleFoldOtherTiddlersEvent = function(event) {\\n\\tvar self = this,\\n\\t\\tparamObject = event.paramObject || {},\\n\\t\\tprefix = paramObject.foldedStatePrefix;\\n\\t$tw.utils.each(this.getStoryList(),function(title) {\\n\\t\\tself.wiki.setText(prefix + title,\\\"text\\\",null,event.param === title ? \\\"show\\\" : \\\"hide\\\");\\n\\t});\\n};\\n\\nNavigatorWidget.prototype.handleFoldAllTiddlersEvent = function(event) {\\n\\tvar self = this,\\n\\t\\tparamObject = event.paramObject || {},\\n\\t\\tprefix = paramObject.foldedStatePrefix || \\\"$:/state/folded/\\\";\\n\\t$tw.utils.each(this.getStoryList(),function(title) {\\n\\t\\tself.wiki.setText(prefix + title,\\\"text\\\",null,\\\"hide\\\");\\n\\t});\\n};\\n\\nNavigatorWidget.prototype.handleUnfoldAllTiddlersEvent = function(event) {\\n\\tvar self = this,\\n\\t\\tparamObject = event.paramObject || {},\\n\\t\\tprefix = paramObject.foldedStatePrefix;\\n\\t$tw.utils.each(this.getStoryList(),function(title) {\\n\\t\\tself.wiki.setText(prefix + title,\\\"text\\\",null,\\\"show\\\");\\n\\t});\\n};\\n\\nexports.navigator = NavigatorWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/parameters.js\":{\"title\":\"$:/core/modules/widgets/parameters.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/parameters.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nWidget for definition of transclusion parameters\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget,\\n\\tTranscludeWidget = require(\\\"$:/core/modules/widgets/transclude.js\\\").transclude;\\n\\nvar ParametersWidget = function(parseTreeNode,options) {\\n\\t// Initialise\\n\\tthis.initialise(parseTreeNode,options);\\n};
2731\\n\\n/*\\nInherit from the base widget class\\n*/\\nParametersWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nParametersWidget.prototype.render = function(parent,nextSibling) {\\n\\t// Call the constructor\\n\\tWidget.call(this);\\n\\tthis.parentDomNode = parent;\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n\\tthis.renderChildren(parent,nextSibling);\\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nParametersWidget.prototype.execute = function() {\\n\\tvar self = this;\\n\\tthis.parametersDepth = Math.max(parseInt(this.getAttribute(\\\"$depth\\\",\\\"1\\\"),10) || 1,1);\\n\\t// Find the parent transclusions\\n\\tvar pointer = this.parentWidget,\\n\\t\\tdepth = this.parametersDepth;\\n\\twhile(pointer) {\\n\\t\\tif(pointer instanceof TranscludeWidget) {\\n\\t\\t\\tdepth--;\\n\\t\\t\\tif(depth \u003C= 0) {\\n\\t\\t\\t\\tbreak;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tpointer = pointer.parentWidget;\\n\\t}\\n\\t// Process each parameter\\n\\tif(pointer instanceof TranscludeWidget) {\\n\\t\\t// Get the value for each defined parameter\\n\\t\\t$tw.utils.each($tw.utils.getOrderedAttributesFromParseTreeNode(self.parseTreeNode),function(attr,index) {\\n\\t\\t\\tvar name = attr.name;\\n\\t\\t\\t// If the attribute name starts with $$ then reduce to a single dollar\\n\\t\\t\\tif(name.substr(0,2) === \\\"$$\\\") {\\n\\t\\t\\t\\tname = name.substr(1);\\n\\t\\t\\t}\\n\\t\\t\\tvar value = pointer.getTransclusionParameter(name,index,self.getAttribute(attr.name,\\\"\\\"));\\n\\t\\t\\tself.setVariable(name,value);\\n\\t\\t});\\n\\t\\t// Assign any metaparameters\\n\\t\\t$tw.utils.each(pointer.getTransclusionMetaParameters(),function(getValue,name) {\\n\\t\\t\\tvar variableName = self.getAttribute(\\\"$\\\" + name);\\n\\t\\t\\tif(variableName) {\\n\\t\\t\\t\\tself.setVariable(variableName,getValue(name));\\n\\t\\t\\t}\\n\\t\\t});\\n\\t}\\n\\t// Construct the child widgets\\n\\tthis.makeChildWidgets();\\n};\\n\\n/*\\nRefresh the widget by ensuring our attributes are up to date\\n*/\\nParametersWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes();\\n\\tif(Object.keys(changedAttributes).length) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t}\\n\\treturn this.refreshChildren(changedTiddlers);\\n};\\n\\nexports.parameters = ParametersWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/password.js\":{\"title\":\"$:/core/modules/widgets/password.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/password.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nPassword widget\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar PasswordWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nPasswordWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nPasswordWidget.prototype.render = function(parent,nextSibling) {\\n\\t// Save the parent dom node\\n\\tthis.parentDomNode = parent;\\n\\t// Compute our attributes\\n\\tthis.computeAttributes();\\n\\t// Execute our logic\\n\\tthis.execute();\\n\\t// Get the current password\\n\\tvar password = $tw.browser ? $tw.utils.getPassword(this.passwordName) || \\\"\\\" : \\\"\\\";\\n\\t// Create our element\\n\\tvar domNode = this.document.createElement(\\\"input\\\");\\n\\tdomNode.setAttribute(\\\"type\\\",\\\"password\\\");\\n\\tdomNode.setAttribute(\\\"value\\\",password);\\n\\t// Add a click event handler\\n\\t$tw.utils.addEventListeners(domNode,[\\n\\t\\t{name: \\\"change\\\", handlerObject: this, handlerMethod: \\\"handleChangeEvent\\\"}\\n\\t]);\\n\\t// Insert the label into the DOM and render any children\\n\\tparent.insertBefore(domNode,nextSibling);\\n\\tthis.renderChildren(domNode,null);\\n\\tthis.domNodes.push(domNode);\\n};\\n\\nPasswordWidget.prototype.handleChangeEvent = function(event) {\\n\\tvar password = this.domNodes[0].value;\\n\\treturn $tw.utils.savePassword(this.passwordName,password);\\n};
2731\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nPasswordWidget.prototype.execute = function() {\\n\\t// Get the parameters from the attributes\\n\\tthis.passwordName = this.getAttribute(\\\"name\\\",\\\"\\\");\\n\\t// Make the child widgets\\n\\tthis.makeChildWidgets();\\n};\\n\\n/*\\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n*/\\nPasswordWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes();\\n\\tif(changedAttributes.name) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t} else {\\n\\t\\treturn this.refreshChildren(changedTiddlers);\\n\\t}\\n};\\n\\nexports.password = PasswordWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/qualify.js\":{\"title\":\"$:/core/modules/widgets/qualify.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/qualify.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nQualify text to a variable \\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar QualifyWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nQualifyWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nQualifyWidget.prototype.render = function(parent,nextSibling) {\\n\\tthis.parentDomNode = parent;\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n\\tthis.renderChildren(parent,nextSibling);\\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nQualifyWidget.prototype.execute = function() {\\n\\t// Get our parameters\\n\\tthis.qualifyName = this.getAttribute(\\\"name\\\");\\n\\tthis.qualifyTitle = this.getAttribute(\\\"title\\\");\\n\\t// Set context variable\\n\\tif(this.qualifyName) {\\n\\t\\tthis.setVariable(this.qual
2731ifyName,this.qualifyTitle + \\\"-\\\" + this.getStateQualifier());\\n\\t}\\n\\t// Construct the child widgets\\n\\tthis.makeChildWidgets();\\n};\\n\\n/*\\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n*/\\nQualifyWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes();\\n\\tif(changedAttributes.name || changedAttributes.title) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t} else {\\n\\t\\treturn this.refreshChildren(changedTiddlers);\\n\\t}\\n};\\n\\nexports.qualify = QualifyWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/radio.js\":{\"title\":\"$:/core/modules/widgets/radio.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/radio.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nSet a field or index at a given tiddler via radio buttons\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\nvar RadioWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nRadioWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nRadioWidget.prototype.render = function(parent,nextSibling) {\\n\\t// Save the parent dom node\\n\\tthis.parentDomNode = parent;\\n\\t// Compute our attributes\\n\\tthis.computeAttributes();\\n\\t// Execute our logic\\n\\tthis.execute();\\n\\tvar isChecked = this.getValue() === this.radioValue;\\n\\t// Create our elements\\n\\tthis.labelDomNode = this.document.createElement(\\\"label\\\");\\n\\tthis.labelDomNode.setAttribute(\\\"class\\\",\\n\\t\\t\\\"tc-radio \\\" + this.radioClass + (isChecked ? \\\" tc-radio-selected\\\" : \\\"\\\")\\n\\t);\\n\\tthis.inputDomNode = this.document.createElement(\\\"input\\\");\\n\\tthis.inputDomNode.setAttribute(\\\"type\\\",\\\"radio\\\");\\n\\tif(isChecked) {\\n\\t\\tthis.inputDomNode.checked = true;\\n\\t}\\n\\tif(this.isDisabled === \\\"yes\\\") {\\n\\t\\tthis.inputDomNode.setAttribute(\\\"disabled\\\",true);\\n\\t}\\n\\tthis.labelDomNode.appendChild(this.inputDomNode);\\n\\tthis.spanDomNode = this.document.createElement(\\\"span\\\");\\n\\tthis.labelDomNode.appendChild(this.spanDomNode);\\n\\t// Add a click event handler\\n\\t$tw.utils.addEventListeners(this.inputDomNode,[\\n\\t\\t{name: \\\"change\\\", handlerObject: this, handlerMethod: \\\"handleChangeEvent\\\"}\\n\\t]);\\n\\t// Insert the label into the DOM and render any children\\n\\tparent.insertBefore(this.labelDomNode,nextSibling);\\n\\tthis.renderChildren(this.spanDomNode,null);\\n\\tthis.domNodes.push(this.labelDomNode);\\n};\\n\\nRadioWidget.prototype.getValue = function() {\\n\\tvar value,\\n\\t\\ttiddler = this.wiki.getTiddler(this.radioTitle);\\n\\tif(tiddler) {\\n\\t\\tif(this.radioIndex) {\\n\\t\\t\\tvalue = this.wiki.extractTiddlerDataItem(this.radioTitle,this.radioIndex,this.radioDefault);\\n\\t\\t} else {\\n\\t\\t\\tvalue = tiddler.getFieldString(this.radioField,this.radioDefault);\\n\\t\\t}\\n\\t} else {\\n\\t\\tvalue = this.radioDefault;\\n\\t}\\n\\treturn value;\\n};\\n\\nRadioWidget.prototype.setValue = function() {\\n\\tif(this.radioIndex) {\\n\\t\\tthis.wiki.setText(this.radioTitle,\\\"\\\",this.radioIndex,this.radioValue);\\n\\t} else {\\n\\t\\tvar tiddler = this.wiki.getTiddler(this.radioTitle),\\n\\t\\t\\taddition = {};\\n\\t\\taddition[this.radioField] = this.radioValue;\\n\\t\\tthis.wiki.addTiddler(new $tw.Tiddler(this.wiki.getCreationFields(),{title: this.radioTitle},tiddler,addition,this.wiki.getModificationFields()));\\n\\t}\\n};\\n\\nRadioWidget.prototype.handleChangeEvent = function(event) {\\n\\tif(this.inputDomNode.checked) {\\n\\t\\tthis.setValue();\\n\\t}\\n\\t// Trigger actions\\n\\tif(this.radioActions) {\\n\\t\\tthis.invokeActionString(this.radioActions,this,event,{\\\"actionValue\\\": this.radioValue});\\n\\t}\\n};
2731\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nRadioWidget.prototype.execute = function() {\\n\\t// Get the parameters from the attributes\\n\\tthis.radioTitle = this.getAttribute(\\\"tiddler\\\",this.getVariable(\\\"currentTiddler\\\"));\\n\\tthis.radioField = this.getAttribute(\\\"field\\\",\\\"text\\\");\\n\\tthis.radioIndex = this.getAttribute(\\\"index\\\");\\n\\tthis.radioValue = this.getAttribute(\\\"value\\\");\\n\\tthis.radioClass = this.getAttribute(\\\"class\\\",\\\"\\\");\\n\\tthis.radioDefault = this.getAttribute(\\\"default\\\");\\n\\tthis.isDisabled = this.getAttribute(\\\"disabled\\\",\\\"no\\\");\\n\\tthis.radioActions = this.getAttribute(\\\"actions\\\",\\\"\\\");\\n\\t// Make the child widgets\\n\\tthis.makeChildWidgets();\\n};\\n\\n/*\\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n*/\\nRadioWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes();\\n\\tif(($tw.utils.count(changedAttributes) > 0)) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t} else if(changedTiddlers[this.radioTitle]) {\\n\\t\\tthis.inputDomNode.checked = this.getValue() === this.radioValue;\\n\\t\\t$tw.utils.toggleClass(this.labelDomNode,\\\"tc-radio-selected\\\",this.inputDomNode.checked);\\n\\t\\treturn this.refreshChildren(changedTiddlers);\\n\\t} else {\\n\\t\\treturn this.refreshChildren(changedTiddlers);\\n\\t}\\n};\\n\\nexports.radio = RadioWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/range.js\":{\"title\":\"$:/core/modules/widgets/range.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/range.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nRange widget\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar RangeWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nRangeWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nRangeWidget.prototype.render = function(parent,nextSibling) {\\n\\t// Save the parent dom node\\n\\tthis.parentDomNode = parent;\\n\\t// Compute our attributes\\n\\tthis.computeAttributes();\\n\\t// Execute our logic\\n\\tthis.execute();\\n\\t// Create our elements\\n\\tthis.inputDomNode = this.document.createElement(\\\"input\\\");\\n\\tthis.inputDomNode.setAttribute(\\\"type\\\",\\\"range\\\");\\n\\tthis.inputDomNode.setAttribute(\\\"class\\\",this.elementClass);\\n\\tif(this.minValue){\\n\\t\\tthis.inputDomNode.setAttribute(\\\"min\\\", this.minValue);\\n\\t}\\n\\tif(this.maxValue){\\n\\t\\tthis.inputDomNode.setAttribute(\\\"max\\\", this.maxValue);\\n\\t}\\n\\tif(this.increment){\\n\\t\\tthis.inputDomNode.setAttribute(\\\"step\\\", this.increment);\\n\\t}\\n\\tif(this.isDisabled === \\\"yes\\\") {\\n\\t\\tthis.inputDomNode.setAttribute(\\\"disabled\\\",true);\\n\\t}\\n\\tthis.inputDomNode.value = this.getValue();\\n\\t// Add a click event handler\\n\\t$tw.utils.addEventListeners(this.inputDomNode,[\\n\\t\\t{name:\\\"mousedown\\\", handlerObject:this, handlerMethod:\\\"handleMouseDownEvent\\\"},\\n\\t\\t{name:\\\"mouseup\\\",   handlerObject:this, handlerMethod:\\\"handleMouseUpEvent\\\"},\\n\\t\\t{name:\\\"change\\\",    handlerObject:this, handlerMethod:\\\"handleChangeEvent\\\"},\\n\\t\\t{name:\\\"input\\\",     handlerObject:this, handlerMethod:\\\"handleInputEvent\\\"},\\n\\t]);\\n\\t// Insert the label into the DOM and render any children\\n\\tparent.insertBefore(this.inputDomNode,nextSibling);\\n\\tthis.domNodes.push(this.inputDomNode);\\n};\\n\\nRangeWidget.prototype.getValue = function() {\\n\\tvar tiddler = this.wiki.getTiddler(this.tiddlerTitle),\\n\\t\\tfieldName = this.tiddlerField,\\n\\t\\tvalue = this.defaultValue;\\n\\tif(tiddler) {\\n\\t\\tif(this.tiddlerIndex) {\\n\\t\\t\\tvalue = this.wiki.extractTiddlerDataItem(tiddler,this.tiddlerIndex,this.defaultValue);\\n\\t\\t} else {\\n\\t\\t\\tif($tw.utils.hop(tiddler.fields,fieldName)) {\\n\\t\\t\\t\\tvalue = tiddler.fields[fieldName] || \\\"\\\";\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tvalue = this.defaultValue;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\treturn value;\\n};\\n\\nRangeWidget.prototype.getActionVariables = function(options) {\\n\\toptions = options || {};\\n\\tvar hasChanged = (this.startValue !== this.inputDomNode.value) ? \\\"yes\\\" : \\\"no\\\";\\n\\t// Trigger actions. Use variables = {key:value, key:value ...}\\n\\t// the \\\"value\\\" is needed.\\n\\treturn $tw.utils.extend({\\\"actionValue\\\": this.inputDomNode.value, \\\"actionValueHasChanged\\\": hasChanged}, options);\\n}\\n\\n// actionsStart\\nRangeWidget.prototype.handleMouseDownEvent = function(event) {\\n\\tthis.mouseDown = true; // TODO remove once IE is gone.\\n\\tthis.startValue = this.inputDomNode.value; // TODO remove this line once IE is gone!\\n\\tthis.handleEvent(event);\\n\\t// Trigger actions\\n\\tif(this.actionsMouseDown) {\\n\\t\\tvar variables = this.getActionVariables() // TODO this line will go into the function call below.\\n\\t\\tthis.invokeActionString(this.actionsMouseDown,this,event,variables);\\n\\t}\\n}\\n\\n// actionsStop\\nRangeWidget.prototype.handleMouseUpEvent = function(event) {\\n\\tthis.mouseDown = false; // TODO remove once IE is gone.\\n\\tthis.handleEvent(event);\\n\\t// Trigger actions\\n\\tif(this.actionsMouseUp) {\\n\\t\\tvar variables = this.getActionVariables()\\n\\t\\tthis.invokeActionString(this.actionsMouseUp,this,event,variables);\\n\\t}\\n\\t// TODO remove the following if() once IE is gone!\\n\\tif ($tw.browser.isIE) {\\n\\t\\tif (this.startValue !== this.inputDomNode.value) {\\n\\t\\t\\tthis.handleChangeEvent(event);\\n\\t\\t\\tthis.startValue = this.inputDomNode.value;\\n\\t\\t}\\n\\t}\\n}\\n\\nRangeWidget.prototype.handleChangeEvent = function(event) {\\n\\tif (this.mouseDown) {  // TODO refactor this function once IE is gone.\\n\\t\\tthis.handleInputEvent(event);\\n\\t}\\n};\\n\\nRangeWidget.prototype.handleInputEvent = function(event) {\\n\\tthis.handleEvent(event);\\n\\t// Trigger actions\\n\\tif(this.actionsInput) {\\n\\t\\t// \\\"tiddler\\\" parameter may be missing. See .execute() below\\n\\t\\tvar variables = this.getActionVariables({\\\"actionValueHasChanged\\\": \\\"yes\\\"}) // TODO this line will go into the function call below.\\n\\t\\tthis.invokeActionString(this.actionsInput,this,event,variables);\\n\\t}\\n};\\n\\nRangeWidget.prototype.handleEvent = function(event) {\\n\\tif(this.getValue() !== this.inputDomNode.value) {\\n\\t\\tif(this.tiddlerIndex) {\\n\\t\\t\\tthis.wiki.setText(this.tiddlerTitle,\\\"\\\",this.tiddlerIndex,this.inputDomNode.value);\\n\\t\\t} else {\\n\\t\\t\\tthis.wiki.setText(this.tiddlerTitle,this.tiddlerField,null,this.inputDomNode.value);\\n\\t\\t}\\n\\t}\\n};
2731\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nRangeWidget.prototype.execute = function() {\\n\\t// TODO remove the next 1 lines once IE is gone!\\n\\tthis.mouseUp = true; // Needed for IE10\\n\\t// Get the parameters from the attributes\\n\\tthis.tiddlerTitle = this.getAttribute(\\\"tiddler\\\",this.getVariable(\\\"currentTiddler\\\"));\\n\\tthis.tiddlerField = this.getAttribute(\\\"field\\\",\\\"text\\\");\\n\\tthis.tiddlerIndex = this.getAttribute(\\\"index\\\");\\n\\tthis.minValue = this.getAttribute(\\\"min\\\");\\n\\tthis.maxValue = this.getAttribute(\\\"max\\\");\\n\\tthis.increment = this.getAttribute(\\\"increment\\\");\\n\\tthis.defaultValue = this.getAttribute(\\\"default\\\",\\\"\\\");\\n\\tthis.elementClass = this.getAttribute(\\\"class\\\",\\\"\\\");\\n\\tthis.isDisabled = this.getAttribute(\\\"disabled\\\",\\\"no\\\");\\n\\t// Actions since 5.1.23\\n\\t// Next 2 only fire once!\\n\\tthis.actionsMouseDown = this.getAttribute(\\\"actionsStart\\\",\\\"\\\");\\n\\tthis.actionsMouseUp = this.getAttribute(\\\"actionsStop\\\",\\\"\\\");\\n\\t// Input fires very often!\\n\\tthis.actionsInput = this.getAttribute(\\\"actions\\\",\\\"\\\");\\n\\t// Make the child widgets\\n\\tthis.makeChildWidgets();\\n};\\n\\n/*\\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n*/\\nRangeWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes();\\n\\tif($tw.utils.count(changedAttributes) > 0) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t} else {\\n\\t\\tvar refreshed = false;\\n\\t\\tif(changedTiddlers[this.tiddlerTitle]) {\\n\\t\\t\\tvar value = this.getValue();\\n\\t\\t\\tif(this.inputDomNode.value !== value) {\\n\\t\\t\\t\\tthis.inputDomNode.value = value;\\n\\t\\t\\t}\\n\\t\\t\\trefreshed = true;\\n\\t\\t}\\n\\t\\treturn this.refreshChildren(changedTiddlers) || refreshed;\\n\\t}\\n};\\n\\nexports.range = RangeWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/raw.js\":{\"title\":\"$:/core/modules/widgets/raw.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/raw.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nRaw widget\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar RawWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nRawWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nRawWidget.prototype.render = function(parent,nextSibling) {\\n\\tthis.parentDomNode = parent;\\n\\tthis.execute();\\n\\tvar div = this.document.createElement(\\\"div\\\");\\n\\tdiv.innerHTML=this.parseTreeNode.html;\\n\\tparent.insertBefore(div,nextSibling);\\n\\tthis.domNodes.push(div);\\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nRawWidget.prototype.execute = function() {\\n};
2731\\n\\n/*\\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n*/\\nRawWidget.prototype.refresh = function(changedTiddlers) {\\n\\treturn false;\\n};\\n\\nexports.raw = RawWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/reveal.js\":{\"title\":\"$:/core/modules/widgets/reveal.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/reveal.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nReveal widget\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar Popup = require(\\\"$:/core/modules/utils/dom/popup.js\\\");\\n\\nvar RevealWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nRevealWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nRevealWidget.prototype.render = function(parent,nextSibling) {\\n\\tthis.parentDomNode = parent;\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n\\tvar tag = this.parseTreeNode.isBlock ? \\\"div\\\" : \\\"span\\\";\\n\\tif(this.revealTag && $tw.config.htmlUnsafeElements.indexOf(this.revealTag) === -1) {\\n\\t\\ttag = this.revealTag;\\n\\t}\\n\\tvar domNode = this.document.createElement(tag);\\n\\tthis.domNode = domNode;\\n\\tthis.assignDomNodeClasses();\\n\\tif(this.style) {\\n\\t\\tdomNode.setAttribute(\\\"style\\\",this.style);\\n\\t}\\n\\tparent.insertBefore(domNode,nextSibling);\\n\\tthis.renderChildren(domNode,null);\\n\\tif(!domNode.isTiddlyWikiFakeDom && this.type === \\\"popup\\\" && this.isOpen) {\\n\\t\\tthis.positionPopup(domNode);\\n\\t\\t$tw.utils.addClass(domNode,\\\"tc-popup\\\"); // Make sure that clicks don't dismiss popups within the revealed content\\n\\t}\\n\\tif(!this.isOpen) {\\n\\t\\tdomNode.setAttribute(\\\"hidden\\\",\\\"true\\\");\\n\\t}\\n\\tthis.domNodes.push(domNode);\\n};\\n\\nRevealWidget.prototype.positionPopup = function(domNode) {\\n\\tdomNode.style.position = \\\"absolute\\\";\\n\\tdomNode.style.zIndex = \\\"1000\\\";\\n\\tvar left,top;\\n\\tswitch(this.position) {\\n\\t\\tcase \\\"left\\\":\\n\\t\\t\\tleft = this.popup.left - domNode.offsetWidth;\\n\\t\\t\\ttop = this.popup.top;\\n\\t\\t\\tbreak;\\n\\t\\tcase \\\"above\\\":\\n\\t\\t\\tleft = this.popup.left;\\n\\t\\t\\ttop = this.popup.top - domNode.offsetHeight;\\n\\t\\t\\tbreak;\\n\\t\\tcase \\\"aboveright\\\":\\n\\t\\t\\tleft = this.popup.left + this.popup.width;\\n\\t\\t\\ttop = this.popup.top + this.popup.height - domNode.offsetHeight;\\n\\t\\t\\tbreak;\\n\\t\\tcase \\\"belowright\\\":\\n\\t\\t\\tleft = this.popup.left + this.popup.width;\\n\\t\\t\\ttop = this.popup.top + this.popup.height;\\n\\t\\t\\tbreak;\\n\\t\\tcase \\\"right\\\":\\n\\t\\t\\tleft = this.popup.left + this.popup.width;\\n\\t\\t\\ttop = this.popup.top;\\n\\t\\t\\tbreak;\\n\\t\\tcase \\\"belowleft\\\":\\n\\t\\t\\tleft = this.popup.left + this.popup.width - domNode.offsetWidth;\\n\\t\\t\\ttop = this.popup.top + this.popup.height;\\n\\t\\t\\tbreak;\\n\\t\\tcase \\\"aboveleft\\\":\\n\\t\\t\\tleft = this.popup.left - domNode.offsetWidth;\\n\\t\\t\\ttop = this.popup.top - domNode.offsetHeight;\\n\\t\\t\\tbreak;\\n\\t\\tdefault: // Below\\n\\t\\t\\tleft = this.popup.left;\\n\\t\\t\\ttop = this.popup.top + this.popup.height;\\n\\t\\t\\tbreak;\\n\\t}\\n\\tif(!this.positionAllowNegative) {\\n\\t\\tleft = Math.max(0,left);\\n\\t\\ttop = Math.max(0,top);\\n\\t}\\n\\tif (this.popup.absolute) {\\n\\t\\t// Traverse the offsetParent chain and correct the offset to make it relative to the parent node.\\n\\t\\tfor (var offsetParentDomNode = domNode.offsetParent; offsetParentDomNode; offsetParentDomNode = offsetParentDomNode.offsetParent) {\\n\\t\\t\\tleft -= offsetParentDomNode.offsetLeft;\\n\\t\\t\\ttop -= offsetParentDomNode.offsetTop;\\n\\t\\t}\\n\\t}\\n\\tdomNode.style.left = left + \\\"px\\\";\\n\\tdomNode.style.top = top + \\\"px\\\";\\n};
2731\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nRevealWidget.prototype.execute = function() {\\n\\t// Get our parameters\\n\\tthis.state = this.getAttribute(\\\"state\\\");\\n\\tthis.revealTag = this.getAttribute(\\\"tag\\\");\\n\\tthis.type = this.getAttribute(\\\"type\\\");\\n\\tthis.text = this.getAttribute(\\\"text\\\");\\n\\tthis.position = this.getAttribute(\\\"position\\\");\\n\\tthis.positionAllowNegative = this.getAttribute(\\\"positionAllowNegative\\\") === \\\"yes\\\";\\n\\t// class attribute handled in assignDomNodeClasses()\\n\\tthis.style = this.getAttribute(\\\"style\\\",\\\"\\\");\\n\\tthis[\\\"default\\\"] = this.getAttribute(\\\"default\\\",\\\"\\\");\\n\\tthis.animate = this.getAttribute(\\\"animate\\\",\\\"no\\\");\\n\\tthis.retain = this.getAttribute(\\\"retain\\\",\\\"no\\\");\\n\\tthis.openAnimation = this.animate === \\\"no\\\" ? undefined : \\\"open\\\";\\n\\tthis.closeAnimation = this.animate === \\\"no\\\" ? undefined : \\\"close\\\";\\n\\tthis.updatePopupPosition = this.getAttribute(\\\"updatePopupPosition\\\",\\\"no\\\") === \\\"yes\\\";\\n\\t// Compute the title of the state tiddler and read it\\n\\tthis.stateTiddlerTitle = this.state;\\n\\tthis.stateTitle = this.getAttribute(\\\"stateTitle\\\");\\n\\tthis.stateField = this.getAttribute(\\\"stateField\\\");\\n\\tthis.stateIndex = this.getAttribute(\\\"stateIndex\\\");\\n\\tthis.readState();\\n\\t// Construct the child widgets\\n\\tvar childNodes = this.isOpen ? this.parseTreeNode.children : [];\\n\\tthis.hasChildNodes = this.isOpen;\\n\\tthis.makeChildWidgets(childNodes);\\n};\\n\\n/*\\nRead the state tiddler\\n*/\\nRevealWidget.prototype.readState = function() {\\n\\t// Read the information from the state tiddler\\n\\tvar state,\\n\\t    defaultState = this[\\\"default\\\"];\\n\\tif(this.stateTitle) {\\n\\t\\tvar stateTitleTiddler = this.wiki.getTiddler(this.stateTitle);\\n\\t\\tif(this.stateField) {\\n\\t\\t\\tstate = stateTitleTiddler ? stateTitleTiddler.getFieldString(this.stateField) || defaultState : defaultState;\\n\\t\\t} else if(this.stateIndex) {\\n\\t\\t\\tstate = stateTitleTiddler ? this.wiki.extractTiddlerDataItem(this.stateTitle,this.stateIndex) || defaultState : defaultState;\\n\\t\\t} else if(stateTitleTiddler) {\\n\\t\\t\\tstate = this.wiki.getTiddlerText(this.stateTitle) || defaultState;\\n\\t\\t} else {\\n\\t\\t\\tstate = defaultState;\\n\\t\\t}\\n\\t} else {\\n\\t\\tstate = this.stateTiddlerTitle ? this.wiki.getTextReference(this.state,this[\\\"default\\\"],this.getVariable(\\\"currentTiddler\\\")) : this[\\\"default\\\"];\\n\\t}\\n\\tif(state === null) {\\n\\t\\tstate = this[\\\"default\\\"];\\n\\t}\\n\\tswitch(this.type) {\\n\\t\\tcase \\\"popup\\\":\\n\\t\\t\\tthis.readPopupState(state);\\n\\t\\t\\tbreak;\\n\\t\\tcase \\\"match\\\":\\n\\t\\t\\tthis.isOpen = this.text === state;\\n\\t\\t\\tbreak;\\n\\t\\tcase \\\"nomatch\\\":\\n\\t\\t\\tthis.isOpen = this.text !== state;\\n\\t\\t\\tbreak;\\n\\t\\tcase \\\"lt\\\":\\n\\t\\t\\tthis.isOpen = !!(this.compareStateText(state) \u003C 0);\\n\\t\\t\\tbreak;\\n\\t\\tcase \\\"gt\\\":\\n\\t\\t\\tthis.isOpen = !!(this.compareStateText(state) > 0);\\n\\t\\t\\tbreak;\\n\\t\\tcase \\\"lteq\\\":\\n\\t\\t\\tthis.isOpen = !(this.compareStateText(state) > 0);\\n\\t\\t\\tbreak;\\n\\t\\tcase \\\"gteq\\\":\\n\\t\\t\\tthis.isOpen = !(this.compareStateText(state) \u003C 0);\\n\\t\\t\\tbreak;\\n\\t}\\n};\\n\\nRevealWidget.prototype.compareStateText = function(state) {\\n\\treturn state.localeCompare(this.text,undefined,{numeric: true,sensitivity: \\\"case\\\"});\\n};\\n\\nRevealWidget.prototype.readPopupState = function(state) {\\n\\tthis.popup = Popup.parseCoordinates(state);\\n\\t// Check if the state matches the location regexp\\n\\tif(this.popup) {\\n\\t\\t// If so, we're open\\n\\t\\tthis.isOpen = true;\\n\\t} else {\\n\\t\\t// If not, we're closed\\n\\t\\tthis.isOpen = false;\\n\\t}\\n};\\n\\nRevealWidget.prototype.assignDomNodeClasses = function() {\\n\\tvar classes = this.getAttribute(\\\"class\\\",\\\"\\\").split(\\\" \\\");\\n\\tclasses.push(\\\"tc-reveal\\\");\\n\\tthis.domNode.className = classes.join(\\\" \\\");\\n};
2731\\n\\n/*\\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n*/\\nRevealWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes();\\n\\tif(changedAttributes.state || changedAttributes.type || changedAttributes.text || changedAttributes.position || changedAttributes.positionAllowNegative || changedAttributes[\\\"default\\\"] || changedAttributes.animate || changedAttributes.stateTitle || changedAttributes.stateField || changedAttributes.stateIndex) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t} else {\\n\\t\\tvar currentlyOpen = this.isOpen;\\n\\t\\tthis.readState();\\n\\t\\tif(this.isOpen !== currentlyOpen) {\\n\\t\\t\\tif(this.retain === \\\"yes\\\") {\\n\\t\\t\\t\\tthis.updateState();\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tthis.refreshSelf();\\n\\t\\t\\t\\treturn true;\\n\\t\\t\\t}\\n\\t\\t} else if(this.type === \\\"popup\\\" && this.isOpen && this.updatePopupPosition && (changedTiddlers[this.state] || changedTiddlers[this.stateTitle])) {\\n\\t\\t\\tthis.positionPopup(this.domNode);\\n\\t\\t}\\n\\t\\tif(changedAttributes.style) {\\n\\t\\t\\tthis.domNode.style = this.getAttribute(\\\"style\\\",\\\"\\\");\\n\\t\\t}\\n\\t\\tif(changedAttributes[\\\"class\\\"]) {\\n\\t\\t\\tthis.assignDomNodeClasses();\\n\\t\\t}\\n\\t\\treturn this.refreshChildren(changedTiddlers);\\n\\t}\\n};\\n\\n/*\\nCalled by refresh() to dynamically show or hide the content\\n*/\\nRevealWidget.prototype.updateState = function() {\\n\\tvar self = this;\\n\\t// Read the current state\\n\\tthis.readState();\\n\\t// Construct the child nodes if needed\\n\\tvar domNode = this.domNodes[0];\\n\\tif(this.isOpen && !this.hasChildNodes) {\\n\\t\\tthis.hasChildNodes = true;\\n\\t\\tthis.makeChildWidgets(this.parseTreeNode.children);\\n\\t\\tthis.renderChildren(domNode,null);\\n\\t}\\n\\t// Animate our DOM node\\n\\tif(!domNode.isTiddlyWikiFakeDom && this.type === \\\"popup\\\" && this.isOpen) {\\n\\t\\tthis.positionPopup(domNode);\\n\\t\\t$tw.utils.addClass(domNode,\\\"tc-popup\\\"); // Make sure that clicks don't dismiss popups within the revealed content\\n\\n\\t}\\n\\tif(this.isOpen) {\\n\\t\\tdomNode.removeAttribute(\\\"hidden\\\");\\n        $tw.anim.perform(this.openAnimation,domNode);\\n\\t} else {\\n\\t\\t$tw.anim.perform(this.closeAnimation,domNode,{callback: function() {\\n\\t\\t\\t//make sure that the state hasn't changed during the close animation\\n\\t\\t\\tself.readState()\\n\\t\\t\\tif(!self.isOpen) {\\n\\t\\t\\t\\tdomNode.setAttribute(\\\"hidden\\\",\\\"true\\\");\\n\\t\\t\\t}\\n\\t\\t}});\\n\\t}\\n};\\n\\nexports.reveal = RevealWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/scrollable.js\":{\"title\":\"$:/core/modules/widgets/scrollable.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/scrollable.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nScrollable widget\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar ScrollableWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nScrollableWidget.prototype = new Widget();\\n\\nScrollableWidget.prototype.cancelScroll = function() {\\n\\tif(this.idRequestFrame) {\\n\\t\\tthis.cancelAnimationFrame.call(window,this.idRequestFrame);\\n\\t\\tthis.idRequestFrame = null;\\n\\t}\\n};\\n\\n/*\\nHandle a scroll event\\n*/\\nScrollableWidget.prototype.handleScrollEvent = function(event) {\\n\\t// Pass the scroll event through if our offsetsize is larger than our scrollsize\\n\\tif(this.outerDomNode.scrollWidth \u003C= this.outerDomNode.offsetWidth && this.outerDomNode.scrollHeight \u003C= this.outerDomNode.offsetHeight && this.fallthrough === \\\"yes\\\") {\\n\\t\\treturn true;\\n\\t}\\n\\tvar options = {};\\n\\tif($tw.utils.hop(event.paramObject,\\\"animationDuration\\\")) {\\n\\t\\toptions.animationDuration = event.paramObject.animationDuration;\\n\\t}\\n\\tif(event.paramObject && event.paramObject.selector) {\\n\\t\\tthis.scrollSelectorIntoView(null,event.paramObject.selector,null,options);\\n\\t} else {\\n\\t\\tthis.scrollIntoView(event.target,null,options);\\n\\t}\\n\\treturn false; // Handled event\\n};
2731\\n\\n/*\\nScroll an element into view\\n*/\\nScrollableWidget.prototype.scrollIntoView = function(element,callback,options) {\\n\\tvar duration = $tw.utils.hop(options,\\\"animationDuration\\\") ? parseInt(options.animationDuration) : $tw.utils.getAnimationDuration(),\\n\\t\\tsrcWindow = element ? element.ownerDocument.defaultView : window;\\n\\tthis.cancelScroll();\\n\\tthis.startTime = Date.now();\\n\\tvar scrollPosition = {\\n\\t\\tx: this.outerDomNode.scrollLeft,\\n\\t\\ty: this.outerDomNode.scrollTop\\n\\t};\\n\\t// Get the client bounds of the element and adjust by the scroll position\\n\\tvar scrollableBounds = this.outerDomNode.getBoundingClientRect(),\\n\\t\\tclientTargetBounds = element.getBoundingClientRect(),\\n\\t\\tbounds = {\\n\\t\\t\\tleft: clientTargetBounds.left + scrollPosition.x - scrollableBounds.left,\\n\\t\\t\\ttop: clientTargetBounds.top + scrollPosition.y - scrollableBounds.top,\\n\\t\\t\\twidth: clientTargetBounds.width,\\n\\t\\t\\theight: clientTargetBounds.height\\n\\t\\t};\\n\\t// We'll consider the horizontal and vertical scroll directions separately via this function\\n\\tvar getEndPos = function(targetPos,targetSize,currentPos,currentSize) {\\n\\t\\t\\t// If the target is already visible then stay where we are\\n\\t\\t\\tif(targetPos >= currentPos && (targetPos + targetSize) \u003C= (currentPos + currentSize)) {\\n\\t\\t\\t\\treturn currentPos;\\n\\t\\t\\t// If the target is above/left of the current view, then scroll to its top/left\\n\\t\\t\\t} else if(targetPos \u003C= currentPos) {\\n\\t\\t\\t\\treturn targetPos;\\n\\t\\t\\t// If the target is smaller than the window and the scroll position is too far up, then scroll till the target is at the bottom of the window\\n\\t\\t\\t} else if(targetSize \u003C currentSize && currentPos \u003C (targetPos + targetSize - currentSize)) {\\n\\t\\t\\t\\treturn targetPos + targetSize - currentSize;\\n\\t\\t\\t// If the target is big, then just scroll to the top\\n\\t\\t\\t} else if(currentPos \u003C targetPos) {\\n\\t\\t\\t\\treturn targetPos;\\n\\t\\t\\t// Otherwise, stay where we are\\n\\t\\t\\t} else {\\n\\t\\t\\t\\treturn currentPos;\\n\\t\\t\\t}\\n\\t\\t},\\n\\t\\tendX = getEndPos(bounds.left,bounds.width,scrollPosition.x,this.outerDomNode.offsetWidth),\\n\\t\\tendY = getEndPos(bounds.top,bounds.height,scrollPosition.y,this.outerDomNode.offsetHeight);\\n\\t// Only scroll if necessary\\n\\tif(endX !== scrollPosition.x || endY !== scrollPosition.y) {\\n\\t\\tvar self = this,\\n\\t\\t\\tdrawFrame;\\n\\t\\tdrawFrame = function () {\\n\\t\\t\\tvar t;\\n\\t\\t\\tif(duration \u003C= 0) {\\n\\t\\t\\t\\tt = 1;\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tt = ((Date.now()) - self.startTime) / duration;\\n\\t\\t\\t}\\n\\t\\t\\tif(t >= 1) {\\n\\t\\t\\t\\tself.cancelScroll();\\n\\t\\t\\t\\tt = 1;\\n\\t\\t\\t}\\n\\t\\t\\tt = $tw.utils.slowInSlowOut(t);\\n\\t\\t\\tself.outerDomNode.scrollLeft = scrollPosition.x + (endX - scrollPosition.x) * t;\\n\\t\\t\\tself.outerDomNode.scrollTop = scrollPosition.y + (endY - scrollPosition.y) * t;\\n\\t\\t\\tif(t \u003C 1) {\\n\\t\\t\\t\\tself.idRequestFrame = self.requestAnimationFrame.call(srcWindow,drawFrame);\\n\\t\\t\\t}\\n\\t\\t};\\n\\t\\tdrawFrame();\\n\\t}\\n};\\n\\nScrollableWidget.prototype.scrollSelectorIntoView = function(baseElement,selector,callback,options) {\\n\\tbaseElement = baseElement || document;\\n\\tvar element = $tw.utils.querySelectorSafe(selector,baseElement);\\n\\tif(element) {\\n\\t\\tthis.scrollIntoView(element,callback,options);\\n\\t}\\n};\\n\\n/*\\nRender this widget into the DOM\\n*/\\nScrollableWidget.prototype.render = function(parent,nextSibling) {\\n\\tvar self = this;\\n\\tthis.scaleFactor = 1;\\n\\tthis.addEventListeners([\\n\\t\\t{type: \\\"tm-scroll\\\", handler: \\\"handleScrollEvent\\\"}\\n\\t]);\\n\\tif($tw.browser) {\\n\\t\\tthis.requestAnimationFrame = window.requestAnimationFrame ||\\n\\t\\t\\twindow.webkitRequestAnimationFrame ||\\n\\t\\t\\twindow.mozRequestAnimationFrame ||\\n\\t\\t\\tfunction(callback) {\\n\\t\\t\\t\\treturn window.setTimeout(callback, 1000/60);\\n\\t\\t\\t};\\n\\t\\tthis.cancelAnimationFrame = window.cancelAnimationFrame ||\\n\\t\\t\\twindow.webkitCancelAnimationFrame ||\\n\\t\\t\\twindow.webkitCancelRequestAnimationFrame ||\\n\\t\\t\\twindow.mozCancelAnimationFrame ||\\n\\t\\t\\twindow.mozCancelRequestAnimationFrame ||\\n\\t\\t\\tfunction(id) {\\n\\t\\t\\t\\twindow.clearTimeout(id);\\n\\t\\t\\t};\\n\\t}\\n\\t// Remember parent\\n\\tthis.parentDomNode = parent;\\n\\t// Compute attributes and execute state\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n\\t// Create elements\\n\\tthis.outerDomNode = this.document.createElement(\\\"div\\\");\\n\\t$tw.utils.setStyle(this.outerDomNode,[\\n\\t\\t{overflowY: \\\"auto\\\"},\\n\\t\\t{overflowX: \\\"auto\\\"},\\n\\t\\t{webkitOverflowScrolling: \\\"touch\\\"}\\n\\t]);\\n\\tthis.innerDomNode = this.document.createElement(\\\"div\\\");\\n\\tthis.outerDomNode.appendChild(this.innerDomNode);\\n\\t// Assign classes\\n\\tthis.outerDomNode.className = this[\\\"class\\\"] || \\\"\\\";\\n\\t// Insert element\\n\\tparent.insertBefore(this.outerDomNode,nextSibling);\\n\\tthis.renderChildren(this.innerDomNode,null);\\n\\tthis.domNodes.push(this.outerDomNode);\\n};
2731\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nScrollableWidget.prototype.execute = function() {\\n\\t// Get attributes\\n\\tthis.fallthrough = this.getAttribute(\\\"fallthrough\\\",\\\"yes\\\");\\n\\tthis[\\\"class\\\"] = this.getAttribute(\\\"class\\\");\\n\\t// Make child widgets\\n\\tthis.makeChildWidgets();\\n};\\n\\n/*\\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n*/\\nScrollableWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes();\\n\\tif(changedAttributes[\\\"class\\\"]) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t}\\n\\treturn this.refreshChildren(changedTiddlers);\\n};\\n\\nexports.scrollable = ScrollableWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/select.js\":{\"title\":\"$:/core/modules/widgets/select.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/select.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nSelect widget:\\n\\n```\\n\u003C$select tiddler=\\\"MyTiddler\\\" field=\\\"text\\\">\\n\u003C$list filter=\\\"[tag[chapter]]\\\">\\n\u003Coption value=\u003C\u003CcurrentTiddler>>>\\n\u003C$view field=\\\"description\\\"/>\\n\u003C/option>\\n\u003C/$list>\\n\u003C/$select>\\n```\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar SelectWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nSelectWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nSelectWidget.prototype.render = function(parent,nextSibling) {\\n\\tthis.parentDomNode = parent;\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n\\tthis.renderChildren(parent,nextSibling);\\n\\tthis.setSelectValue();\\n\\tif(this.selectFocus == \\\"yes\\\") {\\n\\t\\tthis.getSelectDomNode().focus();\\n\\t}\\n\\t$tw.utils.addEventListeners(this.getSelectDomNode(),[\\n\\t\\t{name: \\\"change\\\", handlerObject: this, handlerMethod: \\\"handleChangeEvent\\\"}\\n\\t]);\\n};\\n\\n/*\\nHandle a change event\\n*/\\nSelectWidget.prototype.handleChangeEvent = function(event) {\\n\\t// Get the new value and assign it to the tiddler\\n\\tif(this.selectMultiple == false) {\\n\\t\\tvar value = this.getSelectDomNode().value;\\n\\t} else {\\n\\t\\tvar value = this.getSelectValues()\\n\\t\\t\\t\\tvalue = $tw.utils.stringifyList(value);\\n\\t}\\n\\tthis.wiki.setText(this.selectTitle,this.selectField,this.selectIndex,value);\\n\\t// Trigger actions\\n\\tif(this.selectActions) {\\n\\t\\tthis.invokeActionString(this.selectActions,this,event);\\n\\t}\\n};\\n\\n/*\\nIf necessary, set the value of the select element to the current value\\n*/\\nSelectWidget.prototype.setSelectValue = function() {\\n\\tvar value = this.selectDefault;\\n\\t// Get the value\\n\\tif(this.selectIndex) {\\n\\t\\tvalue = this.wiki.extractTiddlerDataItem(this.selectTitle,this.selectIndex,value);\\n\\t} else {\\n\\t\\tvar tiddler = this.wiki.getTiddler(this.selectTitle);\\n\\t\\tif(tiddler) {\\n\\t\\t\\tif(this.selectField === \\\"text\\\") {\\n\\t\\t\\t\\t// Calling getTiddlerText() triggers lazy loading of skinny tiddlers\\n\\t\\t\\t\\tvalue = this.wiki.getTiddlerText(this.selectTitle);\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tif($tw.utils.hop(tiddler.fields,this.selectField)) {\\n\\t\\t\\t\\t\\tvalue = tiddler.getFieldString(this.selectField);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\t\\t\\tif(this.selectField === \\\"title\\\") {\\n\\t\\t\\t\\tvalue = this.selectTitle;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\t// Assign it to the select element if it's different than the current value\\n\\tif (this.selectMultiple) {\\n\\t\\tvalue = value === undefined ? \\\"\\\" : value;\\n\\t\\tvar select = this.getSelectDomNode();\\n\\t\\tvar values = Array.isArray(value) ? value : $tw.utils.parseStringArray(value);\\n\\t\\tfor(var i=0; i \u003C select.children.length; i++){\\n\\t\\t\\tselect.children[i].selected = values.indexOf(select.children[i].value) !== -1\\n\\t\\t}\\n\\t}
2731 else {\\n\\t\\tvar domNode = this.getSelectDomNode();\\n\\t\\tif(domNode.value !== value) {\\n\\t\\t\\tdomNode.value = value;\\n\\t\\t}\\n\\t}\\n};\\n\\n/*\\nGet the DOM node of the select element\\n*/\\nSelectWidget.prototype.getSelectDomNode = function() {\\n\\treturn this.children[0].domNodes[0];\\n};\\n\\n// Return an array of the selected opion values\\n// select is an HTML select element\\nSelectWidget.prototype.getSelectValues = function() {\\n\\tvar select, result, options, opt;\\n\\tselect = this.getSelectDomNode();\\n\\tresult = [];\\n\\toptions = select && select.options;\\n\\tfor (var i=0; i\u003Coptions.length; i++) {\\n\\t\\topt = options[i];\\n\\t\\tif (opt.selected) {\\n\\t\\t\\tresult.push(opt.value || opt.text);\\n\\t\\t}\\n\\t}\\n\\treturn result;\\n}\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nSelectWidget.prototype.execute = function() {\\n\\t// Get our parameters\\n\\tthis.selectActions = this.getAttribute(\\\"actions\\\");\\n\\tthis.selectTitle = this.getAttribute(\\\"tiddler\\\",this.getVariable(\\\"currentTiddler\\\"));\\n\\tthis.selectField = this.getAttribute(\\\"field\\\",\\\"text\\\");\\n\\tthis.selectIndex = this.getAttribute(\\\"index\\\");\\n\\tthis.selectClass = this.getAttribute(\\\"class\\\");\\n\\tthis.selectDefault = this.getAttribute(\\\"default\\\");\\n\\tthis.selectMultiple = this.getAttribute(\\\"multiple\\\", false);\\n\\tthis.selectSize = this.getAttribute(\\\"size\\\");\\n\\tthis.selectTabindex = this.getAttribute(\\\"tabindex\\\");\\n\\tthis.selectTooltip = this.getAttribute(\\\"tooltip\\\");\\n\\tthis.selectFocus = this.getAttribute(\\\"focus\\\");\\n\\t// Make the child widgets\\n\\tvar selectNode = {\\n\\t\\ttype: \\\"element\\\",\\n\\t\\ttag: \\\"select\\\",\\n\\t\\tchildren: this.parseTreeNode.children\\n\\t};\\n\\tif(this.selectClass) {\\n\\t\\t$tw.utils.addAttributeToParseTreeNode(selectNode,\\\"class\\\",this.selectClass);\\n\\t}\\n\\tif(this.selectMultiple) {\\n\\t\\t$tw.utils.addAttributeToParseTreeNode(selectNode,\\\"multiple\\\",\\\"multiple\\\");\\n\\t}\\n\\tif(this.selectSize) {\\n\\t\\t$tw.utils.addAttributeToParseTreeNode(selectNode,\\\"size\\\",this.selectSize);\\n\\t}\\n\\tif(this.selectTabindex) {\\n\\t\\t$tw.utils.addAttributeToParseTreeNode(selectNode,\\\"tabindex\\\",this.selectTabindex);\\n\\t}\\n\\tif(this.selectTooltip) {\\n\\t\\t$tw.utils.addAttributeToParseTreeNode(selectNode,\\\"title\\\",this.selectTooltip);\\n\\t}\\n\\tthis.makeChildWidgets([selectNode]);\\n};\\n\\n/*\\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n*/\\nSelectWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes();\\n\\t// If we're using a different tiddler/field/index then completely refresh ourselves\\n\\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.tooltip) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t// If the target tiddler value has changed, just update setting and refresh the children\\n\\t} else {\\n\\t\\tif(changedAttributes.class) {\\n\\t\\t\\tthis.selectClass = this.getAttribute(\\\"class\\\");\\n\\t\\t\\tthis.getSelectDomNode().setAttribute(\\\"class\\\",this.selectClass); \\n\\t\\t}\\n\\t\\t\\n\\t\\tvar childrenRefreshed = this.refreshChildren(changedTiddlers);\\n\\t\\tif(changedTiddlers[this.selectTitle] || childrenRefreshed) {\\n\\t\\t\\tthis.setSelectValue();\\n\\t\\t} \\n\\t\\treturn childrenRefreshed;\\n\\t}\\n};\\n\\nexports.select = SelectWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/setmultiplevariables.js\":{\"title\":\"$:/core/modules/widgets/setmultiplevariables.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/setmultiplevariables.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nWidget to set multiple variables at once from a list of names and a list of values\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar SetMultipleVariablesWidget = function(parseTreeNode,options) {\\n    this.initialise(parseTreeNode,options);\\n};
2731\\n\\n/*\\nInherit from the base widget class\\n*/\\nSetMultipleVariablesWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nSetMultipleVariablesWidget.prototype.render = function(parent,nextSibling) {\\n    this.parentDomNode = parent;\\n    this.computeAttributes();\\n    this.execute();\\n    this.renderChildren(parent,nextSibling);\\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nSetMultipleVariablesWidget.prototype.execute = function() {\\n    // Setup our variables\\n    this.setVariables();\\n    // Construct the child widgets\\n    this.makeChildWidgets();\\n};\\n\\n\\nSetMultipleVariablesWidget.prototype.setVariables = function() {\\n    // Set the variables\\n    var self = this,\\n        filterNames = this.getAttribute(\\\"$names\\\",\\\"\\\"),\\n        filterValues = this.getAttribute(\\\"$values\\\",\\\"\\\");\\n    this.variableNames = [];\\n    this.variableValues = [];\\n    if(filterNames && filterValues) {\\n        this.variableNames = this.wiki.filterTiddlers(filterNames,this);\\n        this.variableValues = this.wiki.filterTiddlers(filterValues,this);\\n        $tw.utils.each(this.variableNames,function(varname,index) {\\n            self.setVariable(varname,self.variableValues[index]);\\n        });\\n    }\\n};\\n\\n/*\\nRefresh the widget by ensuring our attributes are up to date\\n*/\\nSetMultipleVariablesWidget.prototype.refresh = function(changedTiddlers) {\\n    var filterNames = this.getAttribute(\\\"$names\\\",\\\"\\\"),\\n        filterValues = this.getAttribute(\\\"$values\\\",\\\"\\\"),\\n        variableNames = this.wiki.filterTiddlers(filterNames,this),\\n        variableValues = this.wiki.filterTiddlers(filterValues,this);\\n    if(!$tw.utils.isArrayEqual(this.variableNames,variableNames) || !$tw.utils.isArrayEqual(this.variableValues,variableValues)) {\\n        this.refreshSelf();\\n        return true;\\n    }\\n    return this.refreshChildren(changedTiddlers);\\n};\\n\\nexports[\\\"setmultiplevariables\\\"] = SetMultipleVariablesWidget;\\n\\n})();\\n        \",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/set.js\":{\"title\":\"$:/core/modules/widgets/set.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/set.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nSet variable widget\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar SetWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nSetWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nSetWidget.prototype.render = function(parent,nextSibling) {\\n\\tthis.parentDomNode = parent;\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n\\tthis.renderChildren(parent,nextSibling);\\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nSetWidget.prototype.execute = function() {\\n\\t// Get our parameters\\n\\tthis.setName = this.getAttribute(\\\"name\\\",\\\"currentTiddler\\\");\\n\\tthis.setFilter = this.getAttribute(\\\"filter\\\");\\n\\tthis.setSelect = this.getAttribute(\\\"select\\\");\\n\\tthis.setTiddler = this.getAttribute(\\\"tiddler\\\");\\n\\tthis.setSubTiddler = this.getAttribute(\\\"subtiddler\\\");\\n\\tthis.setField = this.getAttribute(\\\"field\\\");\\n\\tthis.setIndex = this.getAttribute(\\\"index\\\");\\n\\tthis.setValue = this.getAttribute(\\\"value\\\");\\n\\tthis.setEmptyValue = this.getAttribute(\\\"emptyValue\\\");\\n\\t// Set context variable\\n\\tif(this.parseTreeNode.isMacroDefinition) {\\n\\t\\tthis.setVariable(this.setName,this.getValue(),this.parseTreeNode.params,true);\\n\\t} else if(this.parseTreeNode.isFunctionDefinition) {\\n\\t\\tthis.setVariable(this.setName,this.getValue(),this.parseTreeNode.params,undefined,{isFunctionDefinition: true});\\n\\t} else if(this.parseTreeNode.isProcedureDefinition) {\\n\\t\\tthis.setVariable(this.setName,this.getValue(),this.parseTreeNode.params,undefined,{isProcedureDefinition: true, configTrimWhiteSpace: this.parseTreeNode.configTrimWhiteSpace});\\n\\t} else if(this.parseTreeNode.isWidgetDefinition) {\\n\\t\\tthis.setVariable(this.setName,this.getValue(),this.parseTreeNode.params,undefined,{isWidgetDefinition: true, configTrimWhiteSpace: this.parseTreeNode.configTrimWhiteSpace});\\n\\t} else {\\n\\t\\tthis.setVariable(this.setName,this.getValue());\\n\\t}\\n\\t// Construct the child widgets\\n\\tthis.makeChildWidgets();\\n};
2731\\n\\n/*\\nGet the value to be assigned\\n*/\\nSetWidget.prototype.getValue = function() {\\n\\tvar value = this.setValue;\\n\\tif(this.setTiddler) {\\n\\t\\tvar tiddler;\\n\\t\\tif(this.setSubTiddler) {\\n\\t\\t\\ttiddler = this.wiki.getSubTiddler(this.setTiddler,this.setSubTiddler);\\n\\t\\t} else {\\n\\t\\t\\ttiddler = this.wiki.getTiddler(this.setTiddler);\\n\\t\\t}\\n\\t\\tif(!tiddler) {\\n\\t\\t\\tvalue = this.setEmptyValue;\\n\\t\\t} else if(this.setField) {\\n\\t\\t\\tvalue = tiddler.getFieldString(this.setField) || this.setEmptyValue;\\n\\t\\t} else if(this.setIndex) {\\n\\t\\t\\tvalue = this.wiki.extractTiddlerDataItem(this.setTiddler,this.setIndex,this.setEmptyValue);\\n\\t\\t} else {\\n\\t\\t\\tvalue = tiddler.fields.text || this.setEmptyValue ;\\n\\t\\t}\\n\\t} else if(this.setFilter) {\\n\\t\\tvar results = this.wiki.filterTiddlers(this.setFilter,this);\\n\\t\\tif(this.setValue == null) {\\n\\t\\t\\tvar select;\\n\\t\\t\\tif(this.setSelect) {\\n\\t\\t\\t\\tselect = parseInt(this.setSelect,10);\\n\\t\\t\\t}\\n\\t\\t\\tif(select !== undefined) {\\n\\t\\t\\t\\tvalue = results[select] || \\\"\\\";\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tvalue = $tw.utils.stringifyList(results);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tif(results.length === 0 && this.setEmptyValue !== undefined) {\\n\\t\\t\\tvalue = this.setEmptyValue;\\n\\t\\t}\\n\\t} else if(!value && this.setEmptyValue) {\\n\\t\\tvalue = this.setEmptyValue;\\n\\t}\\n\\treturn value || \\\"\\\";\\n};
2731\\n\\n/*\\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n*/\\nSetWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes();\\n\\tif(changedAttributes.name || changedAttributes.filter || changedAttributes.select || changedAttributes.tiddler || (this.setTiddler && changedTiddlers[this.setTiddler]) || changedAttributes.field || changedAttributes.index || changedAttributes.value || changedAttributes.emptyValue ||\\n\\t   (this.setFilter && this.getValue() != this.variables[this.setName].value)) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t} else {\\n\\t\\treturn this.refreshChildren(changedTiddlers);\\n\\t}\\n};\\n\\nexports.setvariable = SetWidget;\\nexports.set = SetWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/slot.js\":{\"title\":\"$:/core/modules/widgets/slot.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/slot.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nWidget for definition of slots within transcluded content. The values provided by the translusion are passed to the slot.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget,\\n\\tTranscludeWidget = require(\\\"$:/core/modules/widgets/transclude.js\\\").transclude;\\n\\nvar SlotWidget = function(parseTreeNode,options) {\\n\\t// Initialise\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nSlotWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nSlotWidget.prototype.render = function(parent,nextSibling) {\\n\\t// Call the constructor\\n\\tWidget.call(this);\\n\\tthis.parentDomNode = parent;\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n\\tthis.renderChildren(parent,nextSibling);\\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nSlotWidget.prototype.execute = function() {\\n\\tvar self = this;\\n\\tthis.slotName = this.getAttribute(\\\"$name\\\");\\n\\tthis.slotDepth = parseInt(this.getAttribute(\\\"$depth\\\",\\\"1\\\"),10) || 1;\\n\\t// Find the parent transclusions\\n\\tvar pointer = this.parentWidget,\\n\\t\\tdepth = this.slotDepth;\\n\\twhile(pointer) {\\n\\t\\tif(pointer instanceof TranscludeWidget && pointer.hasVisibleSlots()) {\\n\\t\\t\\tdepth--;\\n\\t\\t\\tif(depth \u003C= 0) {\\n\\t\\t\\t\\tbreak;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tpointer = pointer.parentWidget;\\n\\t}\\n\\tvar parseTreeNodes = [{type: \\\"text\\\", attributes: {text: {type: \\\"string\\\", value: \\\"Missing slot reference!\\\"}}}];\\n\\tif(pointer instanceof TranscludeWidget) {\\n\\t\\t// Get the parse tree nodes comprising the slot contents\\n\\t\\tparseTreeNodes = pointer.getTransclusionSlotFill(this.slotName,this.parseTreeNode.children);\\n\\t}\\n\\t// Construct the child widgets\\n\\tthis.makeChildWidgets(parseTreeNodes);\\n};\\n\\n/*\\nRefresh the widget by ensuring our attributes are up to date\\n*/\\nSlotWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes();\\n\\tif(changedAttributes[\\\"$name\\\"] || changedAttributes[\\\"$depth\\\"]) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t}\\n\\treturn this.refreshChildren(changedTiddlers);\\n};\\n\\nexports.slot = SlotWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/text.js\":{\"title\":\"$:/core/modules/widgets/text.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/text.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nText node widget\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar TextNodeWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nTextNodeWidget.prototype = new Widget();
2731\\n\\n/*\\nRender this widget into the DOM\\n*/\\nTextNodeWidget.prototype.render = function(parent,nextSibling) {\\n\\tthis.parentDomNode = parent;\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n\\tvar text = this.getAttribute(\\\"text\\\",this.parseTreeNode.text || \\\"\\\");\\n\\ttext = text.replace(/\\\\r/mg,\\\"\\\");\\n\\tvar textNode = this.document.createTextNode(text);\\n\\tparent.insertBefore(textNode,nextSibling);\\n\\tthis.domNodes.push(textNode);\\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nTextNodeWidget.prototype.execute = function() {\\n\\t// Nothing to do for a text node\\n};\\n\\n/*\\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n*/\\nTextNodeWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes();\\n\\tif(changedAttributes.text) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t} else {\\n\\t\\treturn false;\\n\\t}\\n};\\n\\nexports.text = TextNodeWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/tiddler.js\":{\"title\":\"$:/core/modules/widgets/tiddler.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/tiddler.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nTiddler widget\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar TiddlerWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nTiddlerWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nTiddlerWidget.prototype.render = function(parent,nextSibling) {\\n\\tthis.parentDomNode = parent;\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n\\tthis.renderChildren(parent,nextSibling);\\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nTiddlerWidget.prototype.execute = function() {\\n\\tthis.tiddlerState = this.computeTiddlerState();\\n\\tthis.setVariable(\\\"currentTiddler\\\",this.tiddlerState.currentTiddler);\\n\\tthis.setVariable(\\\"missingTiddlerClass\\\",this.tiddlerState.missingTiddlerClass);\\n\\tthis.setVariable(\\\"shadowTiddlerClass\\\",this.tiddlerState.shadowTiddlerClass);\\n\\tthis.setVariable(\\\"systemTiddlerClass\\\",this.tiddlerState.systemTiddlerClass);\\n\\tthis.setVariable(\\\"tiddlerTagClasses\\\",this.tiddlerState.tiddlerTagClasses);\\n\\t// Construct the child widgets\\n\\tthis.makeChildWidgets();\\n};\\n\\n/*\\nCompute the tiddler state flags\\n*/\\nTiddlerWidget.prototype.computeTiddlerState = function() {\\n\\t// Get our parameters\\n\\tthis.tiddlerTitle = this.getAttribute(\\\"tiddler\\\",this.getVariable(\\\"currentTiddler\\\"));\\n\\t// Compute the state\\n\\tvar state = {\\n\\t\\tcurrentTiddler: this.tiddlerTitle || \\\"\\\",\\n\\t\\tmissingTiddlerClass: (this.wiki.tiddlerExists(this.tiddlerTitle) || this.wiki.isShadowTiddler(this.tiddlerTitle)) ? \\\"tc-tiddler-exists\\\" : \\\"tc-tiddler-missing\\\",\\n\\t\\tshadowTiddlerClass: this.wiki.isShadowTiddler(this.tiddlerTitle) ? \\\"tc-tiddler-shadow\\\" : \\\"\\\",\\n\\t\\tsystemTiddlerClass: this.wiki.isSystemTiddler(this.tiddlerTitle) ? \\\"tc-tiddler-system\\\" : \\\"\\\",\\n\\t\\ttiddlerTagClasses: this.getTagClasses()\\n\\t};\\n\\t// Compute a simple hash to make it easier to detect changes\\n\\tstate.hash = state.currentTiddler + state.missingTiddlerClass + state.shadowTiddlerClass + state.systemTiddlerClass + state.tiddlerTagClasses;\\n\\treturn state;\\n};
2731\\n\\n/*\\nCreate a string of CSS classes derived from the tags of the current tiddler\\n*/\\nTiddlerWidget.prototype.getTagClasses = function() {\\n\\tvar tiddler = this.wiki.getTiddler(this.tiddlerTitle);\\n\\tif(tiddler) {\\n\\t\\tvar tags = [];\\n\\t\\t$tw.utils.each(tiddler.fields.tags,function(tag) {\\n\\t\\t\\ttags.push(\\\"tc-tagged-\\\" + encodeURIComponent(tag));\\n\\t\\t});\\n\\t\\treturn tags.join(\\\" \\\");\\n\\t} else {\\n\\t\\treturn \\\"\\\";\\n\\t}\\n};\\n\\n/*\\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n*/\\nTiddlerWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes(),\\n\\t\\tnewTiddlerState = this.computeTiddlerState();\\n\\tif(changedAttributes.tiddler || newTiddlerState.hash !== this.tiddlerState.hash) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t} else {\\n\\t\\treturn this.refreshChildren(changedTiddlers);\\n\\t}\\n};\\n\\nexports.tiddler = TiddlerWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/transclude.js\":{\"title\":\"$:/core/modules/widgets/transclude.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/transclude.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nTransclude widget\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar TranscludeWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nTranscludeWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nTranscludeWidget.prototype.render = function(parent,nextSibling) {\\n\\tthis.parentDomNode = parent;\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n\\tthis.renderChildren(parent,nextSibling);\\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nTranscludeWidget.prototype.execute = function() {\\n\\t// Get our attributes, string parameters, and slot values into properties of the widget object\\n\\tthis.collectAttributes();\\n\\tthis.collectStringParameters();\\n\\tthis.collectSlotFillParameters();\\n\\t// Determine whether we're being used in inline or block mode\\n\\tvar parseAsInline = !this.parseTreeNode.isBlock;\\n\\tif(this.transcludeMode === \\\"inline\\\") {\\n\\t\\tparseAsInline = true;\\n\\t} else if(this.transcludeMode === \\\"block\\\") {\\n\\t\\tparseAsInline = false;\\n\\t}\\n\\t// Set 'thisTiddler'\\n\\tthis.setVariable(\\\"thisTiddler\\\",this.transcludeTitle);\\n\\tvar parseTreeNodes, target;\\n\\t// Process the transclusion according to the output type\\n\\tswitch(this.transcludeOutput || \\\"text/html\\\") {\\n\\t\\tcase \\\"text/html\\\":\\n\\t\\t\\t// Return the parse tree nodes of the target\\n\\t\\t\\ttarget = this.parseTransclusionTarget(parseAsInline);\\n\\t\\t\\tthis.parseAsInline = target.parseAsInline;\\n\\t\\t\\tparseTreeNodes = target.parseTreeNodes;\\n\\t\\t\\tbreak;\\n\\t\\tcase \\\"text/raw\\\":\\n\\t\\t\\t// Just return the raw text\\n\\t\\t\\ttarget = this.getTransclusionTarget();\\n\\t\\t\\tparseTreeNodes = [{type: \\\"text\\\", text: target.text}];\\n\\t\\t\\tbreak;\\n\\t\\tdefault:\\n\\t\\t\\t// \\\"text/plain\\\" is the plain text result of wikifying the text\\n\\t\\t\\ttarget = this.parseTransclusionTarget(parseAsInline);\\n\\t\\t\\tvar widgetNode = this.wiki.makeWidget(target.parser,{\\n\\t\\t\\t\\tparentWidget: this,\\n\\t\\t\\t\\tdocument: $tw.fakeDocument\\n\\t\\t\\t});\\n\\t\\t\\tvar container = $tw.fakeDocument.createElement(\\\"div\\\");\\n\\t\\t\\twidgetNode.render(container,null);\\n\\t\\t\\tparseTreeNodes = [{type: \\\"text\\\", text: container.textContent}];\\n\\t\\t\\tbreak;\\n\\t}\\n\\tthis.sourceText = target.text;\\n\\tthis.parserType = target.type;\\n\\t// Set the legacy transclusion context variables only if we're not transcluding a variable\\n\\tif(!this.transcludeVariable) {\\n\\t\\tvar recursionMarker = this.makeRecursionMarker();\\n\\t\\tthis.setVariable(\\\"transclusion\\\",recursionMarker);\\n\\t}\\n\\t// Construct the child widgets\\n\\tthis.makeChildWidgets(parseTreeNodes);\\n};
2731\\n\\n/*\\nCollect the attributes we need, in the process determining whether we're being used in legacy mode\\n*/\\nTranscludeWidget.prototype.collectAttributes = function() {\\n\\tvar self = this;\\n\\t// Detect legacy mode\\n\\tthis.legacyMode = true;\\n\\t$tw.utils.each(this.attributes,function(value,name) {\\n\\t\\tif(name.charAt(0) === \\\"$\\\") {\\n\\t\\t\\tself.legacyMode = false;\\n\\t\\t}\\n\\t});\\n\\t// Get the attributes for the appropriate mode\\n\\tif(this.legacyMode) {\\n\\t\\tthis.transcludeTitle = this.getAttribute(\\\"tiddler\\\",this.getVariable(\\\"currentTiddler\\\"));\\n\\t\\tthis.transcludeSubTiddler = this.getAttribute(\\\"subtiddler\\\");\\n\\t\\tthis.transcludeField = this.getAttribute(\\\"field\\\");\\n\\t\\tthis.transcludeIndex = this.getAttribute(\\\"index\\\");\\n\\t\\tthis.transcludeMode = this.getAttribute(\\\"mode\\\");\\n\\t\\tthis.recursionMarker = this.getAttribute(\\\"recursionMarker\\\",\\\"yes\\\");\\n\\t} else {\\n\\t\\tthis.transcludeVariable = this.getAttribute(\\\"$variable\\\");\\n\\t\\tthis.transcludeType = this.getAttribute(\\\"$type\\\");\\n\\t\\tthis.transcludeOutput = this.getAttribute(\\\"$output\\\",\\\"text/html\\\");\\n\\t\\tthis.transcludeTitle = this.getAttribute(\\\"$tiddler\\\",this.getVariable(\\\"currentTiddler\\\"));\\n\\t\\tthis.transcludeSubTiddler = this.getAttribute(\\\"$subtiddler\\\");\\n\\t\\tthis.transcludeField = this.getAttribute(\\\"$field\\\");\\n\\t\\tthis.transcludeIndex = this.getAttribute(\\\"$index\\\");\\n\\t\\tthis.transcludeMode = this.getAttribute(\\\"$mode\\\");\\n\\t\\tthis.recursionMarker = this.getAttribute(\\\"$recursionMarker\\\",\\\"yes\\\");\\n\\t}\\n};\\n\\n/*\\nCollect string parameters\\n*/\\nTranscludeWidget.prototype.collectStringParameters = function() {\\n\\tvar self = this;\\n\\tthis.stringParametersByName = Object.create(null);\\n\\tif(!this.legacyMode) {\\n\\t\\t$tw.utils.each(this.attributes,function(value,name) {\\n\\t\\t\\tif(name.charAt(0) === \\\"$\\\") {\\n\\t\\t\\t\\tif(name.charAt(1) === \\\"$\\\") {\\n\\t\\t\\t\\t\\t// Attributes starting $$ represent parameters starting with a single $\\n\\t\\t\\t\\t\\tname = name.slice(1);\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t// Attributes starting with a single $ are reserved for the widget\\n\\t\\t\\t\\t\\treturn;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\tself.stringParametersByName[name] = value;\\n\\t\\t});\\n\\t}\\n};\\n\\n/*\\nCollect slot value parameters\\n*/\\nTranscludeWidget.prototype.collectSlotFillParameters = function() {\\n\\tvar self = this;\\n\\tthis.slotFillParseTrees = Object.create(null);\\n\\tif(this.legacyMode) {\\n\\t\\tthis.slotFillParseTrees[\\\"ts-missing\\\"] = this.parseTreeNode.children;\\n\\t} else {\\n\\t\\tthis.slotFillParseTrees[\\\"ts-raw\\\"] = this.parseTreeNode.children;\\n\\t\\tvar noFillWidgetsFound = true,\\n\\t\\t\\tsearchParseTreeNodes = function(nodes) {\\n\\t\\t\\t\\t$tw.utils.each(nodes,function(node) {\\n\\t\\t\\t\\t\\tif(node.type === \\\"fill\\\") {\\n\\t\\t\\t\\t\\t\\tif(node.attributes[\\\"$name\\\"] && node.attributes[\\\"$name\\\"].type === \\\"string\\\") {\\n\\t\\t\\t\\t\\t\\t\\tvar slotValueName = node.attributes[\\\"$name\\\"].value;\\n\\t\\t\\t\\t\\t\\t\\tself.slotFillParseTrees[slotValueName] = node.children || [];\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\tnoFillWidgetsFound = false;\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\tsearchParseTreeNodes(node.children);\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t});\\n\\t\\t\\t};\\n\\t\\tsearchParseTreeNodes(this.parseTreeNode.children);\\n\\t\\tif(noFillWidgetsFound) {\\n\\t\\t\\tthis.slotFillParseTrees[\\\"ts-missing\\\"] = this.parseTreeNode.children;\\n\\t\\t}\\n\\t}\\n};\\n\\n/*\\nGet transcluded details as an object {text:,type:}\\n*/\\nTranscludeWidget.prototype.getTransclusionTarget = function() {\\n\\tvar self = this;\\n\\tvar text;\\n\\t// Return the text and type of the target\\n\\tif(this.hasAttribute(\\\"$variable\\\")) {\\n\\t\\tif(this.transcludeVariable) {\\n\\t\\t\\t// Transcluding a variable\\n\\t\\t\\tvar variableInfo = this.getVariableInfo(this.transcludeVariable,{params: this.getOrderedTransclusionParameters()});\\n\\t\\t\\ttext = variableInfo.text;\\n\\t\\t\\treturn {\\n\\t\\t\\t\\ttext: variableInfo.text,\\n\\t\\t\\t\\ttype: this.transcludeType\\n\\t\\t\\t};\\n\\t\\t}\\n\\t} else {\\n\\t\\t// Transcluding a text reference\\n\\t\\tvar parserInfo = this.wiki.getTextReferenceParserInfo(\\n\\t\\t\\t\\t\\t\\tthis.transcludeTitle,\\n\\t\\t\\t\\t\\t\\tthis.transcludeField,\\n\\t\\t\\t\\t\\t\\tthis.transcludeIndex,\\n\\t\\t\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\t\\t\\tsubTiddler: this.transcludeSubTiddler,\\n\\t\\t\\t\\t\\t\\t\\tdefaultType: this.transcludeType\\n\\t\\t\\t\\t\\t\\t});\\n\\t\\treturn {\\n\\t\\t\\ttext: parserInfo.text,\\n\\t\\t\\ttype: parserInfo.type\\n\\t\\t};\\n\\t}\\n};
2731\\n\\n/*\\nGet transcluded parse tree nodes as an object {text:,type:,parseTreeNodes:,parseAsInline:}\\n*/\\nTranscludeWidget.prototype.parseTransclusionTarget = function(parseAsInline) {\\n\\tvar self = this;\\n\\tvar parser;\\n\\t// Get the parse tree\\n\\tif(this.hasAttribute(\\\"$variable\\\")) {\\n\\t\\tif(this.transcludeVariable) {\\n\\t\\t\\t// Transcluding a variable\\n\\t\\t\\tvar variableInfo = this.getVariableInfo(this.transcludeVariable,{params: this.getOrderedTransclusionParameters()}),\\n\\t\\t\\t\\tsrcVariable = variableInfo && variableInfo.srcVariable;\\n\\t\\t\\tif(variableInfo.text) {\\n\\t\\t\\t\\tif(srcVariable && srcVariable.isFunctionDefinition) {\\n\\t\\t\\t\\t\\tvar result = (variableInfo.resultList ? variableInfo.resultList[0] : variableInfo.text) || \\\"\\\";\\n\\t\\t\\t\\t\\tparser = {\\n\\t\\t\\t\\t\\t\\ttree: [{\\n\\t\\t\\t\\t\\t\\t\\ttype: \\\"text\\\",\\n\\t\\t\\t\\t\\t\\t\\ttext: result\\n\\t\\t\\t\\t\\t\\t}],\\n\\t\\t\\t\\t\\t\\tsource: result,\\n\\t\\t\\t\\t\\t\\ttype: \\\"text/vnd.tiddlywiki\\\"\\n\\t\\t\\t\\t\\t};\\n\\t\\t\\t\\t\\tif(parseAsInline) {\\n\\t\\t\\t\\t\\t\\tparser.tree[0] = {\\n\\t\\t\\t\\t\\t\\t\\ttype: \\\"text\\\",\\n\\t\\t\\t\\t\\t\\t\\ttext: result\\n\\t\\t\\t\\t\\t\\t};\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\tparser.tree[0] = {\\n\\t\\t\\t\\t\\t\\t\\ttype: \\\"element\\\",\\n\\t\\t\\t\\t\\t\\t\\ttag: \\\"p\\\",\\n\\t\\t\\t\\t\\t\\t\\tchildren: [{\\n\\t\\t\\t\\t\\t\\t\\t\\ttype: \\\"text\\\",\\n\\t\\t\\t\\t\\t\\t\\t\\ttext: result\\n\\t\\t\\t\\t\\t\\t\\t}]\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tvar cacheKey = (parseAsInline ? \\\"inlineParser\\\" : \\\"blockParser\\\") + (this.transcludeType || \\\"\\\");\\n\\t\\t\\t\\t\\tif(variableInfo.isCacheable && srcVariable[cacheKey]) {\\n\\t\\t\\t\\t\\t\\tparser = srcVariable[cacheKey];\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\tparser = this.wiki.parseText(this.transcludeType,variableInfo.text || \\\"\\\",{parseAsInline: parseAsInline, configTrimWhiteSpace: srcVariable && srcVariable.configTrimWhiteSpace});\\n\\t\\t\\t\\t\\t\\tif(variableInfo.isCacheable) {\\n\\t\\t\\t\\t\\t\\t\\tsrcVariable[cacheKey] = parser;\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tif(parser) {\\n\\t\\t\\t\\t\\t// Add parameters widget for procedures and custom widgets\\n\\t\\t\\t\\t\\tif(srcVariable && (srcVariable.isProcedureDefinition || srcVariable.isWidgetDefinition)) {\\n\\t\\t\\t\\t\\t\\tparser = {\\n\\t\\t\\t\\t\\t\\t\\ttree: [\\n\\t\\t\\t\\t\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\t\\t\\t\\t\\ttype: \\\"parameters\\\",\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tchildren: parser.tree\\n\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t],\\n\\t\\t\\t\\t\\t\\t\\tsource: parser.source,\\n\\t\\t\\t\\t\\t\\t\\ttype: parser.type\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t$tw.utils.each(srcVariable.params,function(param) {\\n\\t\\t\\t\\t\\t\\t\\tvar name = param.name;\\n\\t\\t\\t\\t\\t\\t\\t// Parameter names starting with dollar must be escaped to double dollars\\n\\t\\t\\t\\t\\t\\t\\tif(name.charAt(0) === \\\"$\\\") {\\n\\t\\t\\t\\t\\t\\t\\t\\tname = \\\"$\\\" + name;\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t$tw.utils.addAttributeToParseTreeNode(parser.tree[0],name,param[\\\"default\\\"])\\n\\t\\t\\t\\t\\t\\t});\\n\\t\\t\\t\\t\\t} else if(srcVariable && !srcVariable.isFunctionDefinition) {\\n\\t\\t\\t\\t\\t\\t// For macros and ordinary variables, wrap the parse tree in a vars widget assigning the parameters to variables named \\\"__paramname__\\\"\\n\\t\\t\\t\\t\\t\\tparser = {\\n\\t\\t\\t\\t\\t\\t\\ttree: [\\n\\t\\t\\t\\t\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\t\\t\\t\\t\\ttype: \\\"vars\\\",\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tchildren: parser.tree\\n\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t],\\n\\t\\t\\t\\t\\t\\t\\tsource: parser.source,\\n\\t\\t\\t\\t\\t\\t\\ttype: parser.type\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t$tw.utils.each(variableInfo.params,function(param) {\\n\\t\\t\\t\\t\\t\\t\\t$tw.utils.addAttributeToParseTreeNode(parser.tree[0],\\\"__\\\" + param.name + \\\"__\\\",param.value)\\n\\t\\t\\t\\t\\t\\t});\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t} else {\\n\\t\\t// Transcluding a text reference\\n\\t\\tparser = this.wiki.parseTextReference(\\n\\t\\t\\t\\t\\t\\tthis.transcludeTitle,\\n\\t\\t\\t\\t\\t\\tthis.transcludeField,\\n\\t\\t\\t\\t\\t\\tthis.transcludeIndex,\\n\\t\\t\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\t\\t\\tparseAsInline: parseAsInline,\\n\\t\\t\\t\\t\\t\\t\\tsubTiddler: this.transcludeSubTiddler,\\n\\t\\t\\t\\t\\t\\t\\tdefaultType: this.transcludeType\\n\\t\\t\\t\\t\\t\\t});\\n\\t}\\n\\t// Return the parse tree\\n\\treturn {\\n\\t\\tparser: parser,\\n\\t\\tparseTreeNodes: parser ? parser.tree : (this.slotFillParseTrees[\\\"ts-missing\\\"] || []),\\n\\t\\tparseAsInline: parseAsInline,\\n\\t\\ttext: parser && parser.source,\\n\\t\\ttype: parser && parser.type\\n\\t};\\n};
2731\\n\\n/*\\nFetch all the string parameters as an ordered array of {name:, value:} where the name is optional\\n*/\\nTranscludeWidget.prototype.getOrderedTransclusionParameters = function() {\\n\\tvar result = [];\\n\\t// Collect the parameters\\n\\tfor(var name in this.stringParametersByName) {\\n\\t\\tvar value = this.stringParametersByName[name];\\n\\t\\tresult.push({name: name, value: value});\\n\\t}\\n\\t// Sort numerical parameter names first\\n\\tresult.sort(function(a,b) {\\n\\t\\tvar aIsNumeric = !isNaN(a.name),\\n\\t\\t\\tbIsNumeric = !isNaN(b.name);\\n\\t\\tif(aIsNumeric && bIsNumeric) {\\n\\t\\t\\treturn a.name - b.name;\\n\\t\\t} else if(aIsNumeric) {\\n\\t\\t\\treturn -1;\\n\\t\\t} else if(bIsNumeric) {\\n\\t\\t\\treturn 1;\\n\\t\\t} else {\\n\\t\\t\\treturn a.name === b.name ? 0 : (a.name \u003C b.name ? -1 : 1);\\n\\t\\t}\\n\\t});\\n\\t// Remove names from numerical parameters\\n\\t$tw.utils.each(result,function(param,index) {\\n\\t\\tif(!isNaN(param.name)) {\\n\\t\\t\\tdelete param.name;\\n\\t\\t}\\n\\t});\\n\\treturn result;\\n};
2731\\n\\n/*\\nFetch the value of a parameter\\n*/\\nTranscludeWidget.prototype.getTransclusionParameter = function(name,index,defaultValue) {\\n\\tif(name in this.stringParametersByName) {\\n\\t\\treturn this.stringParametersByName[name];\\n\\t} else {\\n\\t\\tvar name = \\\"\\\" + index;\\n\\t\\tif(name in this.stringParametersByName) {\\n\\t\\t\\treturn this.stringParametersByName[name];\\n\\t\\t}\\n\\t}\\n\\treturn defaultValue;\\n};\\n\\n/*\\nGet one of the special parameters to be provided by the parameters widget\\n*/\\nTranscludeWidget.prototype.getTransclusionMetaParameters = function() {\\n\\tvar self = this;\\n\\treturn {\\n\\t\\t\\\"parseMode\\\": function() {\\n\\t\\t\\treturn self.parseAsInline ? \\\"inline\\\" : \\\"block\\\";\\n\\t\\t},\\n\\t\\t\\\"parseTreeNodes\\\": function() {\\n\\t\\t\\treturn JSON.stringify(self.parseTreeNode.children || []);\\n\\t\\t},\\n\\t\\t\\\"slotFillParseTreeNodes\\\": function() {\\n\\t\\t\\treturn JSON.stringify(self.slotFillParseTrees);\\n\\t\\t},\\n\\t\\t\\\"params\\\": function() {\\n\\t\\t\\treturn JSON.stringify(self.stringParametersByName);\\n\\t\\t}\\n\\t};\\n};\\n\\n/*\\nFetch the value of a slot\\n*/\\nTranscludeWidget.prototype.getTransclusionSlotFill = function(name,defaultParseTreeNodes) {\\n\\tif(name && this.slotFillParseTrees[name] && this.slotFillParseTrees[name].length > 0) {\\n\\t\\treturn this.slotFillParseTrees[name];\\n\\t} else {\\n\\t\\treturn defaultParseTreeNodes || [];\\n\\t}\\n};\\n\\n/*\\nReturn whether this transclusion should be visible to the slot widget\\n*/\\nTranscludeWidget.prototype.hasVisibleSlots = function() {\\n\\treturn this.getAttribute(\\\"$fillignore\\\",\\\"no\\\") === \\\"no\\\";\\n}\\n\\n/*\\nCompose a string comprising the title, field and/or index to identify this transclusion for recursion detection\\n*/\\nTranscludeWidget.prototype.makeRecursionMarker = function() {\\n\\tvar output = [];\\n\\toutput.push(\\\"{\\\");\\n\\toutput.push(this.getVariable(\\\"currentTiddler\\\",{defaultValue: \\\"\\\"}));\\n\\toutput.push(\\\"|\\\");\\n\\toutput.push(this.transcludeTitle || \\\"\\\");\\n\\toutput.push(\\\"|\\\");\\n\\toutput.push(this.transcludeField || \\\"\\\");\\n\\toutput.push(\\\"|\\\");\\n\\toutput.push(this.transcludeIndex || \\\"\\\");\\n\\toutput.push(\\\"|\\\");\\n\\toutput.push(this.transcludeSubTiddler || \\\"\\\");\\n\\toutput.push(\\\"}\\\");\\n\\treturn output.join(\\\"\\\");\\n};\\n\\nTranscludeWidget.prototype.parserNeedsRefresh = function() {\\n\\t// Doesn't need to consider transcluded variables because a parent variable can't change once a widget has been created\\n\\tvar parserInfo = this.wiki.getTextReferenceParserInfo(this.transcludeTitle,this.transcludeField,this.transcludeIndex,{subTiddler:this.transcludeSubTiddler});\\n\\treturn (this.sourceText === undefined || parserInfo.sourceText !== this.sourceText || parserInfo.parserType !== this.parserType)\\n};\\n\\n/*\\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n*/\\nTranscludeWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes();\\n\\tif(($tw.utils.count(changedAttributes) > 0) || (!this.transcludeVariable && changedTiddlers[this.transcludeTitle] && this.parserNeedsRefresh())) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t} else {\\n\\t\\treturn this.refreshChildren(changedTiddlers);\\n\\t}\\n};\\n\\nexports.transclude = TranscludeWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/vars.js\":{\"title\":\"$:/core/modules/widgets/vars.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/vars.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nThis widget allows multiple variables to be set in one go:\\n\\n```\\n\\\\define helloworld() Hello world!\\n\u003C$vars greeting=\\\"Hi\\\" me={{!!title}} sentence=\u003C\u003Chelloworld>>>\\n  \u003C\u003Cgreeting>>! I am \u003C\u003Cme>> and I say: \u003C\u003Csentence>>\\n\u003C/$vars>\\n```\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar VarsWidget = function(parseTreeNode,options) {\\n\\t// Initialise\\n\\tthis.initialise(parseTreeNode,options);\\n};
2731\\n\\n/*\\nInherit from the base widget class\\n*/\\nVarsWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nVarsWidget.prototype.render = function(parent,nextSibling) {\\n\\tthis.parentDomNode = parent;\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n\\tthis.renderChildren(parent,nextSibling);\\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nVarsWidget.prototype.execute = function() {\\n\\t// Parse variables\\n\\tvar self = this;\\n\\t$tw.utils.each(this.attributes,function(val,key) {\\n\\t\\tif(key.charAt(0) !== \\\"$\\\") {\\n\\t\\t\\tself.setVariable(key,val);\\n\\t\\t}\\n\\t});\\n\\t// Construct the child widgets\\n\\tthis.makeChildWidgets();\\n};\\n\\n/*\\nRefresh the widget by ensuring our attributes are up to date\\n*/\\nVarsWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes();\\n\\tif($tw.utils.count(changedAttributes) > 0) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t}\\n\\treturn this.refreshChildren(changedTiddlers);\\n};\\n\\nexports[\\\"vars\\\"] = VarsWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/view.js\":{\"title\":\"$:/core/modules/widgets/view.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/view.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nView widget\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar ViewWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nViewWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nViewWidget.prototype.render = function(parent,nextSibling) {\\n\\tthis.parentDomNode = parent;\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n\\tif(this.text) {\\n\\t\\tvar textNode = this.document.createTextNode(this.text);\\n\\t\\tparent.insertBefore(textNode,nextSibling);\\n\\t\\tthis.domNodes.push(textNode);\\n\\t} else {\\n\\t\\tthis.makeChildWidgets();\\n\\t\\tthis.renderChildren(parent,nextSibling);\\n\\t}\\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nViewWidget.prototype.execute = function() {\\n\\t// Get parameters from our attributes\\n\\tthis.viewTitle = this.getAttribute(\\\"tiddler\\\",this.getVariable(\\\"currentTiddler\\\"));\\n\\tthis.viewSubtiddler = this.getAttribute(\\\"subtiddler\\\");\\n\\tthis.viewField = this.getAttribute(\\\"field\\\",\\\"text\\\");\\n\\tthis.viewIndex = this.getAttribute(\\\"index\\\");\\n\\tthis.viewFormat = this.getAttribute(\\\"format\\\",\\\"text\\\");\\n\\tthis.viewTemplate = this.getAttribute(\\\"template\\\",\\\"\\\");\\n\\tthis.viewMode = this.getAttribute(\\\"mode\\\",\\\"block\\\");\\n\\tswitch(this.viewFormat) {\\n\\t\\tcase \\\"htmlwikified\\\":\\n\\t\\t\\tthis.text = this.getValueAsHtmlWikified(this.viewMode);\\n\\t\\t\\tbreak;\\n\\t\\tcase \\\"plainwikified\\\":\\n\\t\\t\\tthis.text = this.getValueAsPlainWikified(this.viewMode);\\n\\t\\t\\tbreak;\\n\\t\\tcase \\\"htmlencodedplainwikified\\\":\\n\\t\\t\\tthis.text = this.getValueAsHtmlEncodedPlainWikified(this.viewMode);\\n\\t\\t\\tbreak;\\n\\t\\tcase \\\"htmlencoded\\\":\\n\\t\\t\\tthis.text = this.getValueAsHtmlEncoded();\\n\\t\\t\\tbreak;\\n\\t\\tcase \\\"htmltextencoded\\\":\\n\\t\\t\\tthis.text = this.getValueAsHtmlTextEncoded();\\n\\t\\t\\tbreak;\\n\\t\\tcase \\\"urlencoded\\\":\\n\\t\\t\\tthis.text = this.getValueAsUrlEncoded();\\n\\t\\t\\tbreak;\\n\\t\\tcase \\\"doubleurlencoded\\\":\\n\\t\\t\\tthis.text = this.getValueAsDoubleUrlEncoded();\\n\\t\\t\\tbreak;\\n\\t\\tcase \\\"date\\\":\\n\\t\\t\\tthis.text = this.getValueAsDate(this.viewTemplate);\\n\\t\\t\\tbreak;\\n\\t\\tcase \\\"relativedate\\\":\\n\\t\\t\\tthis.text = this.getValueAsRelativeDate();\\n\\t\\t\\tbreak;\\n\\t\\tcase \\\"stripcomments\\\":\\n\\t\\t\\tthis.text = this.getValueAsStrippedComments();\\n\\t\\t\\tbreak;\\n\\t\\tcase \\\"jsencoded\\\":\\n\\t\\t\\tthis.text = this.getValueAsJsEncoded();\\n\\t\\t\\tbreak;\\n\\t\\tdefault: // \\\"text\\\"\\n\\t\\t\\tthis.text = this.getValueAsText();\\n\\t\\t\\tbreak;\\n\\t}\\n};
2731\\n\\n/*\\nThe various formatter functions are baked into this widget for the moment. Eventually they will be replaced by macro functions\\n*/\\n\\n/*\\nRetrieve the value of the widget. Options are:\\nasString: Optionally return the value as a string\\n*/\\nViewWidget.prototype.getValue = function(options) {\\n\\toptions = options || {};\\n\\tvar value = options.asString ? \\\"\\\" : undefined;\\n\\tif(this.viewIndex) {\\n\\t\\tvalue = this.wiki.extractTiddlerDataItem(this.viewTitle,this.viewIndex);\\n\\t} else {\\n\\t\\tvar tiddler;\\n\\t\\tif(this.viewSubtiddler) {\\n\\t\\t\\ttiddler = this.wiki.getSubTiddler(this.viewTitle,this.viewSubtiddler);\\n\\t\\t} else {\\n\\t\\t\\ttiddler = this.wiki.getTiddler(this.viewTitle);\\n\\t\\t}\\n\\t\\tif(tiddler) {\\n\\t\\t\\tif(this.viewField === \\\"text\\\" && !this.viewSubtiddler) {\\n\\t\\t\\t\\t// Calling getTiddlerText() triggers lazy loading of skinny tiddlers\\n\\t\\t\\t\\tvalue = this.wiki.getTiddlerText(this.viewTitle);\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tif($tw.utils.hop(tiddler.fields,this.viewField)) {\\n\\t\\t\\t\\t\\tif(options.asString) {\\n\\t\\t\\t\\t\\t\\tvalue = tiddler.getFieldString(this.viewField);\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\tvalue = tiddler.fields[this.viewField];\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\t\\t\\tif(this.viewField === \\\"title\\\") {\\n\\t\\t\\t\\tvalue = this.viewTitle;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\treturn value;\\n};\\n\\nViewWidget.prototype.getValueAsText = function() {\\n\\treturn this.getValue({asString: true});\\n};\\n\\nViewWidget.prototype.getValueAsHtmlWikified = function(mode) {\\n\\treturn this.wiki.renderText(\\\"text/html\\\",\\\"text/vnd.tiddlywiki\\\",this.getValueAsText(),{\\n\\t\\tparseAsInline: mode !== \\\"block\\\",\\n\\t\\tparentWidget: this\\n\\t});\\n};\\n\\nViewWidget.prototype.getValueAsPlainWikified = function(mode) {\\n\\treturn this.wiki.renderText(\\\"text/plain\\\",\\\"text/vnd.tiddlywiki\\\",this.getValueAsText(),{\\n\\t\\tparseAsInline: mode !== \\\"block\\\",\\n\\t\\tparentWidget: this\\n\\t});\\n};\\n\\nViewWidget.prototype.getValueAsHtmlEncodedPlainWikified = function(mode) {\\n\\treturn $tw.utils.htmlEncode(this.wiki.renderText(\\\"text/plain\\\",\\\"text/vnd.tiddlywiki\\\",this.getValueAsText(),{\\n\\t\\tparseAsInline: mode !== \\\"block\\\",\\n\\t\\tparentWidget: this\\n\\t}));\\n};\\n\\nViewWidget.prototype.getValueAsHtmlEncoded = function() {\\n\\treturn $tw.utils.htmlEncode(this.getValueAsText());\\n};\\n\\nViewWidget.prototype.getValueAsHtmlTextEncoded = function() {\\n\\treturn $tw.utils.htmlTextEncode(this.getValueAsText());\\n};\\n\\nViewWidget.prototype.getValueAsUrlEncoded = function() {\\n\\treturn $tw.utils.encodeURIComponentExtended(this.getValueAsText());\\n};\\n\\nViewWidget.prototype.getValueAsDoubleUrlEncoded = function() {\\n\\treturn $tw.utils.encodeURIComponentExtended($tw.utils.encodeURIComponentExtended(this.getValueAsText()));\\n};\\n\\nViewWidget.prototype.getValueAsDate = function(format) {\\n\\tformat = format || \\\"YYYY MM DD 0hh:0mm\\\";\\n\\tvar value = $tw.utils.parseDate(this.getValue());\\n\\tif(value && $tw.utils.isDate(value) && value.toString() !== \\\"Invalid Date\\\") {\\n\\t\\treturn $tw.utils.formatDateString(value,format);\\n\\t} else {\\n\\t\\treturn \\\"\\\";\\n\\t}\\n};\\n\\nViewWidget.prototype.getValueAsRelativeDate = function(format) {\\n\\tvar value = $tw.utils.parseDate(this.getValue());\\n\\tif(value && $tw.utils.isDate(value) && value.toString() !== \\\"Invalid Date\\\") {\\n\\t\\treturn $tw.utils.getRelativeDate((new Date()) - (new Date(value))).description;\\n\\t} else {\\n\\t\\treturn \\\"\\\";\\n\\t}\\n};\\n\\nViewWidget.prototype.getValueAsStrippedComments = function() {\\n\\tvar lines = this.getValueAsText().split(\\\"\\\\n\\\"),\\n\\t\\tout = [];\\n\\tfor(var line=0; line\u003Clines.length; line++) {\\n\\t\\tvar text = lines[line];\\n\\t\\tif(!/^\\\\s*\\\\/\\\\/#/.test(text)) {\\n\\t\\t\\tout.push(text);\\n\\t\\t}\\n\\t}\\n\\treturn out.join(\\\"\\\\n\\\");\\n};\\n\\nViewWidget.prototype.getValueAsJsEncoded = function() {\\n\\treturn $tw.utils.stringify(this.getValueAsText());\\n};
2731\\n\\n/*\\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n*/\\nViewWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes();\\n\\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.template || changedAttributes.format || changedTiddlers[this.viewTitle]) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t} else {\\n\\t\\treturn false;\\n\\t}\\n};\\n\\nexports.view = ViewWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/widget.js\":{\"title\":\"$:/core/modules/widgets/widget.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/widget.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nWidget base class\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/* Maximum permitted depth of the widget tree for recursion detection */\\nvar MAX_WIDGET_TREE_DEPTH = 1000;\\n\\n/*\\nCreate a widget object for a parse tree node\\n\\tparseTreeNode: reference to the parse tree node to be rendered\\n\\toptions: see below\\nOptions include:\\n\\twiki: mandatory reference to wiki associated with this render tree\\n\\tparentWidget: optional reference to a parent renderer node for the context chain\\n\\tdocument: optional document object to use instead of global document\\n*/\\nvar Widget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInitialise widget properties. These steps are pulled out of the constructor so that we can reuse them in subclasses\\n*/\\nWidget.prototype.initialise = function(parseTreeNode,options) {\\n\\t// Bail if parseTreeNode is undefined, meaning  that the widget constructor was called without any arguments so that it can be subclassed\\n\\tif(parseTreeNode === undefined) {\\n\\t\\treturn;\\n\\t}\\n\\toptions = options || {};\\n\\t// Save widget info\\n\\tthis.parseTreeNode = parseTreeNode;\\n\\tthis.wiki = options.wiki;\\n\\tthis.parentWidget = options.parentWidget;\\n\\tthis.variables = Object.create(this.parentWidget ? this.parentWidget.variables : null);\\n\\tthis.document = options.document;\\n\\tthis.attributes = {};\\n\\tthis.children = [];\\n\\tthis.domNodes = [];\\n\\tthis.eventListeners = {};\\n\\t// Hashmap of the widget classes\\n\\tif(!this.widgetClasses) {\\n\\t\\t// Get widget classes\\n\\t\\tWidget.prototype.widgetClasses = $tw.modules.applyMethods(\\\"widget\\\");\\n\\t\\t// Process any subclasses\\n\\t\\t$tw.modules.forEachModuleOfType(\\\"widget-subclass\\\",function(title,module) {\\n\\t\\t\\tif(module.baseClass) {\\n\\t\\t\\t\\tvar baseClass = Widget.prototype.widgetClasses[module.baseClass];\\n\\t\\t\\t\\tif(!baseClass) {\\n\\t\\t\\t\\t\\tthrow \\\"Module '\\\" + title + \\\"' is attemping to extend a non-existent base class '\\\" + module.baseClass + \\\"'\\\";\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tvar subClass = module.constructor;\\n\\t\\t\\t\\tsubClass.prototype = new baseClass();\\n\\t\\t\\t\\t$tw.utils.extend(subClass.prototype,module.prototype);\\n\\t\\t\\t\\tWidget.prototype.widgetClasses[module.name || module.baseClass] = subClass;\\n\\t\\t\\t}\\n\\t\\t});\\n\\t}\\n};\\n\\n/*\\nRender this widget into the DOM\\n*/\\nWidget.prototype.render = function(parent,nextSibling) {\\n\\tthis.parentDomNode = parent;\\n\\tthis.execute();\\n\\tthis.renderChildren(parent,nextSibling);\\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nWidget.prototype.execute = function() {\\n\\tthis.makeChildWidgets();\\n};\\n\\n/*\\nSet the value of a context variable\\nname: name of the variable\\nvalue: value of the variable\\nparams: array of {name:, default:} for each parameter\\nisMacroDefinition: true if the variable is set via a \\\\define macro pragma (and hence should have variable substitution performed)\\noptions includes:\\n\\tisProcedureDefinition: true if the variable is set via a \\\\procedure pragma (and hence should not have variable substitution performed)\\n\\tisFunctionDefinition: true if the variable is set via a \\\\function pragma (and hence should not have variable substitution performed)\\n\\tisWidgetDefinition: true if the variable is set via a \\\\widget pragma (and hence should not have variable substitution performed)\\n*/\\nWidget.prototype.setVariable = function(name,value,params,isMacroDefinition,options) {\\n\\toptions = options || {};\\n\\tthis.variables[name] = {\\n\\t\\tvalue: value,\\n\\t\\tparams: params,\\n\\t\\tisMacroDefinition: !!isMacroDefinition,\\n\\t\\tisFunctionDefinition: !!options.isFunctionDefinition,\\n\\t\\tisProcedureDefinition: !!options.isProcedureDefinition,\\n\\t\\tisWidgetDefinition: !!options.isWidgetDefinition,\\n\\t\\tconfigTrimWhiteSpace: !!options.configTrimWhiteSpace\\n\\t};\\n};
2731\\n\\n/*\\nGet the prevailing value of a context variable\\nname: name of variable\\noptions: see below\\nOptions include\\n\\nparams: array of {name:, value:} for each parameter\\ndefaultValue: default value if the variable is not defined\\nsource: optional source iterator for evaluating function invocations\\nallowSelfAssigned: if true, includes the current widget in the context chain instead of just the parent\\n\\nReturns an object with the following fields:\\n\\nparams: array of {name:,value:} or {value:} of parameters to be applied\\ntext: text of variable, with parameters properly substituted\\nresultList: result of variable evaluation as an array\\nsrcVariable: reference to the object defining the variable\\n*/\\nWidget.prototype.getVariableInfo = function(name,options) {\\n\\toptions = options || {};\\n\\tvar self = this,\\n\\t\\tactualParams = options.params || [],\\n\\t\\tvariable;\\n\\tif(options.allowSelfAssigned) {\\n\\t\\tvariable = this.variables[name];\\n\\t} else {\\n\\t\\tvariable = this.parentWidget && this.parentWidget.variables[name];\\n\\t}\\n\\t// Check for the variable defined in the parent widget (or an ancestor in the prototype chain)\\n\\tif(variable) {\\n\\t\\tvar originalValue = variable.value,\\n\\t\\t\\tvalue = originalValue,\\n\\t\\t\\tparams = [],\\n\\t\\t\\tresultList = [value];\\n\\t\\t// Only substitute parameter and variable references if this variable was defined with the \\\\define pragma\\n\\t\\tif(variable.isMacroDefinition) {\\n\\t\\t\\tparams = self.resolveVariableParameters(variable.params,actualParams);\\n\\t\\t\\t// Substitute any parameters specified in the definition\\n\\t\\t\\t$tw.utils.each(params,function(param) {\\n\\t\\t\\t\\tvalue = $tw.utils.replaceString(value,new RegExp(\\\"\\\\\\\\$\\\" + $tw.utils.escapeRegExp(param.name) + \\\"\\\\\\\\$\\\",\\\"mg\\\"),param.value);\\n\\t\\t\\t});\\n\\t\\t\\tvalue = self.substituteVariableReferences(value,options);\\n\\t\\t\\tresultList = [value];\\n\\t\\t} else if(variable.isFunctionDefinition) {\\n\\t\\t\\t// Function evaluations\\n\\t\\t\\tparams = self.resolveVariableParameters(variable.params,actualParams);\\n\\t\\t\\tvar variables = Object.create(null);\\n\\t\\t\\t// Apply default parameter values\\n\\t\\t\\t$tw.utils.each(variable.params,function(param,index) {\\n\\t\\t\\t\\tif(param[\\\"default\\\"]) {\\n\\t\\t\\t\\t\\tvariables[param.name] = param[\\\"default\\\"];\\n\\t\\t\\t\\t}\\n\\t\\t\\t});\\n\\t\\t\\t// Parameters are an array of {value:} or {name:, value:} pairs\\n\\t\\t\\t$tw.utils.each(params,function(param) {\\n\\t\\t\\t\\tvariables[param.name] = param.value;\\n\\t\\t\\t});\\n\\t\\t\\tresultList = this.wiki.filterTiddlers(value,this.makeFakeWidgetWithVariables(variables),options.source);\\n\\t\\t\\tvalue = resultList[0] || \\\"\\\";\\n\\t\\t}\\n\\t\\treturn {\\n\\t\\t\\ttext: value,\\n\\t\\t\\tparams: params,\\n\\t\\t\\tresultList: resultList,\\n\\t\\t\\tsrcVariable: variable,\\n\\t\\t\\tisCacheable: originalValue === value\\n\\t\\t};\\n\\t}\\n\\t// If the variable doesn't exist in the parent widget then look for a macro module\\n\\tvar text = this.evaluateMacroModule(name,actualParams);\\n\\tif(text === undefined) {\\n\\t\\ttext = options.defaultValue;\\n\\t}\\n\\treturn {\\n\\t\\ttext: text,\\n\\t\\tresultList: [text]\\n\\t};\\n};\\n\\n/*\\nSimplified version of getVariableInfo() that just returns the text\\n*/\\nWidget.prototype.getVariable = function(name,options) {\\n\\treturn this.getVariableInfo(name,options).text;\\n};
2731\\n\\n/*\\nMaps actual parameters onto formal parameters, returning an array of {name:,value:} objects\\nformalParams - Array of {name:,default:} (default value is optional)\\nactualParams - Array of string values or {name:,value:} (name is optional)\\n*/\\nWidget.prototype.resolveVariableParameters = function(formalParams,actualParams) {\\n\\tformalParams = formalParams || [];\\n\\tactualParams = actualParams || [];\\n\\tvar nextAnonParameter = 0, // Next candidate anonymous parameter in macro call\\n\\t\\tparamInfo, paramValue,\\n\\t\\tresults = [];\\n\\t// Step through each of the parameters in the macro definition\\n\\tfor(var p=0; p\u003CformalParams.length; p++) {\\n\\t\\t// Check if we've got a macro call parameter with the same name\\n\\t\\tparamInfo = formalParams[p];\\n\\t\\tparamValue = undefined;\\n\\t\\tfor(var m=0; m\u003CactualParams.length; m++) {\\n\\t\\t\\tif(typeof actualParams[m] !== \\\"string\\\" && actualParams[m].name === paramInfo.name) {\\n\\t\\t\\t\\tparamValue = actualParams[m].value;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\t// If not, use the next available anonymous macro call parameter\\n\\t\\twhile(nextAnonParameter \u003C actualParams.length && actualParams[nextAnonParameter].name) {\\n\\t\\t\\tnextAnonParameter++;\\n\\t\\t}\\n\\t\\tif(paramValue === undefined && nextAnonParameter \u003C actualParams.length) {\\n\\t\\t\\tvar param = actualParams[nextAnonParameter++];\\n\\t\\t\\tparamValue = typeof param === \\\"string\\\" ? param : param.value;\\n\\t\\t}\\n\\t\\t// If we've still not got a value, use the default, if any\\n\\t\\tparamValue = paramValue || paramInfo[\\\"default\\\"] || \\\"\\\";\\n\\t\\t// Store the parameter name and value\\n\\t\\tresults.push({name: paramInfo.name, value: paramValue});\\n\\t}\\n\\treturn results;\\n};\\n\\nWidget.prototype.substituteVariableReferences = function(text,options) {\\n\\tvar self = this;\\n\\treturn (text || \\\"\\\").replace(/\\\\$\\\\(([^\\\\)\\\\$]+)\\\\)\\\\$/g,function(match,p1,offset,string) {\\n\\t\\treturn options.variables && options.variables[p1] || (self.getVariable(p1,{defaultValue: \\\"\\\"}));\\n\\t});\\n};\\n\\nWidget.prototype.evaluateMacroModule = function(name,actualParams,defaultValue) {\\n\\tif($tw.utils.hop($tw.macros,name)) {\\n\\t\\tvar macro = $tw.macros[name],\\n\\t\\t\\targs = [];\\n\\t\\tif(macro.params.length > 0) {\\n\\t\\t\\tvar nextAnonParameter = 0, // Next candidate anonymous parameter in macro call\\n\\t\\t\\t\\tparamInfo, paramValue;\\n\\t\\t\\t// Step through each of the parameters in the macro definition\\n\\t\\t\\tfor(var p=0; p\u003Cmacro.params.length; p++) {\\n\\t\\t\\t\\t// Check if we've got a macro call parameter with the same name\\n\\t\\t\\t\\tparamInfo = macro.params[p];\\n\\t\\t\\t\\tparamValue = undefined;\\n\\t\\t\\t\\tfor(var m=0; m\u003CactualParams.length; m++) {\\n\\t\\t\\t\\t\\tif(actualParams[m].name === paramInfo.name) {\\n\\t\\t\\t\\t\\t\\tparamValue = actualParams[m].value;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t// If not, use the next available anonymous macro call parameter\\n\\t\\t\\t\\twhile(nextAnonParameter \u003C actualParams.length && actualParams[nextAnonParameter].name) {\\n\\t\\t\\t\\t\\tnextAnonParameter++;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tif(paramValue === undefined && nextAnonParameter \u003C actualParams.length) {\\n\\t\\t\\t\\t\\tparamValue = actualParams[nextAnonParameter++].value;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t// If we've still not got a value, use the default, if any\\n\\t\\t\\t\\tparamValue = paramValue || paramInfo[\\\"default\\\"] || \\\"\\\";\\n\\t\\t\\t\\t// Save the parameter\\n\\t\\t\\t\\targs.push(paramValue);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\telse for(var i=0; i\u003CactualParams.length; ++i) {\\n\\t\\t\\targs.push(actualParams[i].value);\\n\\t\\t}\\n\\t\\treturn (macro.run.apply(this,args) || \\\"\\\").toString();\\n\\t} else {\\n\\t\\treturn defaultValue;\\n\\t}\\n};\\n\\n/*\\nCheck whether a given context variable value exists in the parent chain\\n*/\\nWidget.prototype.hasVariable = function(name,value) {\\n\\tvar node = this;\\n\\twhile(node) {\\n\\t\\tif($tw.utils.hop(node.variables,name) && node.variables[name].value === value) {\\n\\t\\t\\treturn true;\\n\\t\\t}\\n\\t\\tnode = node.parentWidget;\\n\\t}\\n\\treturn false;\\n};
2731\\n\\n/*\\nConstruct a qualifying string based on a hash of concatenating the values of a given variable in the parent chain\\n*/\\nWidget.prototype.getStateQualifier = function(name) {\\n\\tthis.qualifiers = this.qualifiers || Object.create(null);\\n\\tname = name || \\\"transclusion\\\";\\n\\tif(this.qualifiers[name]) {\\n\\t\\treturn this.qualifiers[name];\\n\\t} else {\\n\\t\\tvar output = [],\\n\\t\\t\\tnode = this;\\n\\t\\twhile(node && node.parentWidget) {\\n\\t\\t\\tif($tw.utils.hop(node.parentWidget.variables,name)) {\\n\\t\\t\\t\\toutput.push(node.getVariable(name));\\n\\t\\t\\t}\\n\\t\\t\\tnode = node.parentWidget;\\n\\t\\t}\\n\\t\\tvar value = $tw.utils.hashString(output.join(\\\"\\\"));\\n\\t\\tthis.qualifiers[name] = value;\\n\\t\\treturn value;\\n\\t}\\n};\\n\\n/*\\nMake a fake widget with specified variables, suitable for variable lookup in filters\\n*/\\nWidget.prototype.makeFakeWidgetWithVariables = function(variables) {\\n\\tvar self = this;\\n\\treturn {\\n\\t\\tgetVariable: function(name,opts) {\\n\\t\\t\\tif($tw.utils.hop(variables,name)) {\\n\\t\\t\\t\\treturn variables[name];\\n\\t\\t\\t} else {\\n\\t\\t\\t\\topts = opts || {};\\n\\t\\t\\t\\topts.variables = variables;\\n\\t\\t\\t\\treturn self.getVariable(name,opts);\\n\\t\\t\\t};\\n\\t\\t},\\n\\t\\tgetVariableInfo: function(name,opts) {\\n\\t\\t\\tif($tw.utils.hop(variables,name)) {\\n\\t\\t\\t\\treturn {\\n\\t\\t\\t\\t\\ttext: variables[name]\\n\\t\\t\\t\\t};\\n\\t\\t\\t} else {\\n\\t\\t\\t\\topts = opts || {};\\n\\t\\t\\t\\topts.variables = variables;\\n\\t\\t\\t\\treturn self.getVariableInfo(name,opts);\\n\\t\\t\\t};\\n\\t\\t},\\n\\t\\tmakeFakeWidgetWithVariables: self.makeFakeWidgetWithVariables,\\n\\t\\tresolveVariableParameters: self.resolveVariableParameters,\\n\\t\\twiki: self.wiki\\n\\t};\\n};\\n\\n/*\\nCompute the current values of the attributes of the widget. Returns a hashmap of the names of the attributes that have changed.\\nOptions include:\\nfilterFn: only include attributes where filterFn(name) returns true\\n*/\\nWidget.prototype.computeAttributes = function(options) {\\n\\toptions = options || {};\\n\\tvar changedAttributes = {},\\n\\t\\tself = this;\\n\\t$tw.utils.each(this.parseTreeNode.attributes,function(attribute,name) {\\n\\t\\tif(options.filterFn) {\\n\\t\\t\\tif(!options.filterFn(name)) {\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tvar value = self.computeAttribute(attribute);\\n\\t\\tif(self.attributes[name] !== value) {\\n\\t\\t\\tself.attributes[name] = value;\\n\\t\\t\\tchangedAttributes[name] = true;\\n\\t\\t}\\n\\t});\\n\\treturn changedAttributes;\\n};\\n\\nWidget.prototype.computeAttribute = function(attribute) {\\n\\tvar self = this,\\n\\t\\tvalue;\\n\\tif(attribute.type === \\\"filtered\\\") {\\n\\t\\tvalue = this.wiki.filterTiddlers(attribute.filter,this)[0] || \\\"\\\";\\n\\t} else if(attribute.type === \\\"indirect\\\") {\\n\\t\\tvalue = this.wiki.getTextReference(attribute.textReference,\\\"\\\",this.getVariable(\\\"currentTiddler\\\")) || \\\"\\\";\\n\\t} else if(attribute.type === \\\"macro\\\") {\\n\\t\\tvar variableInfo = this.getVariableInfo(attribute.value.name,{params: attribute.value.params});\\n\\t\\tvalue = variableInfo.text;\\n\\t} else if(attribute.type === \\\"substituted\\\") {\\n\\t\\tvalue = this.wiki.getSubstitutedText(attribute.rawValue,this) || \\\"\\\";\\n\\t} else { // String attribute\\n\\t\\tvalue = attribute.value;\\n\\t}\\n\\treturn value;\\n};
2731\\n\\n/*\\nCheck for the presence of an evaluated attribute on the widget. Note that attributes set to a missing variable (ie attr=\u003C\u003Cmissing>>) will be treated as missing\\n*/\\nWidget.prototype.hasAttribute = function(name) {\\n\\treturn $tw.utils.hop(this.attributes,name);\\n};\\n\\n/*\\nCheck for the presence of a raw attribute on the widget parse tree node. Note that attributes set to a missing variable (ie attr=\u003C\u003Cmissing>>) will NOT be treated as missing\\n*/\\nWidget.prototype.hasParseTreeNodeAttribute = function(name) {\\n\\treturn $tw.utils.hop(this.parseTreeNode.attributes,name);\\n};\\n\\n/*\\nGet the value of an attribute\\n*/\\nWidget.prototype.getAttribute = function(name,defaultText) {\\n\\tif($tw.utils.hop(this.attributes,name)) {\\n\\t\\treturn this.attributes[name];\\n\\t} else {\\n\\t\\treturn defaultText;\\n\\t}\\n};\\n\\n/*\\nAssign the computed attributes of the widget to a domNode\\noptions include:\\nexcludeEventAttributes: ignores attributes whose name begins with \\\"on\\\"\\n*/\\nWidget.prototype.assignAttributes = function(domNode,options) {\\n\\toptions = options || {};\\n\\tvar self = this;\\n\\tvar assignAttribute = function(name,value) {\\n\\t\\t// Check for excluded attribute names\\n\\t\\tif(options.excludeEventAttributes && name.substr(0,2) === \\\"on\\\") {\\n\\t\\t\\tvalue = undefined;\\n\\t\\t}\\n\\t\\tif(value !== undefined) {\\n\\t\\t\\t// Handle the xlink: namespace\\n\\t\\t\\tvar namespace = null;\\n\\t\\t\\tif(name.substr(0,6) === \\\"xlink:\\\" && name.length > 6) {\\n\\t\\t\\t\\tnamespace = \\\"http://www.w3.org/1999/xlink\\\";\\n\\t\\t\\t\\tname = name.substr(6);\\n\\t\\t\\t}\\n\\t\\t\\t// Handle styles\\n\\t\\t\\tif(name.substr(0,6) === \\\"style.\\\" && name.length >
2731 6) {\\n\\t\\t\\t\\tdomNode.style[$tw.utils.unHyphenateCss(name.substr(6))] = value;\\n\\t\\t\\t} else {\\n\\t\\t\\t\\t// Setting certain attributes can cause a DOM error (eg xmlns on the svg element)\\n\\t\\t\\t\\ttry {\\n\\t\\t\\t\\t\\tdomNode.setAttributeNS(namespace,name,value);\\n\\t\\t\\t\\t} catch(e) {\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\t// Not all parse tree nodes have the orderedAttributes property\\n\\tif(this.parseTreeNode.orderedAttributes) {\\n\\t\\t$tw.utils.each(this.parseTreeNode.orderedAttributes,function(attribute,index) {\\n\\t\\t\\tassignAttribute(attribute.name,self.attributes[attribute.name]);\\n\\t\\t});\\t\\n\\t} else {\\n\\t\\t$tw.utils.each(Object.keys(self.attributes).sort(),function(name) {\\n\\t\\t\\tassignAttribute(name,self.attributes[name]);\\n\\t\\t});\\t\\n\\t}\\n};\\n\\n/*\\nGet the number of ancestor widgets for this widget\\n*/\\nWidget.prototype.getAncestorCount = function() {\\n\\tif(this.ancestorCount === undefined) {\\n\\t\\tif(this.parentWidget) {\\n\\t\\t\\tthis.ancestorCount = this.parentWidget.getAncestorCount() + 1;\\n\\t\\t} else {\\n\\t\\t\\tthis.ancestorCount = 0;\\n\\t\\t}\\n\\t}\\n\\treturn this.ancestorCount;\\n};
2731\\n\\n/*\\nMake child widgets correspondng to specified parseTreeNodes\\n*/\\nWidget.prototype.makeChildWidgets = function(parseTreeNodes,options) {\\n\\toptions = options || {};\\n\\tthis.children = [];\\n\\tvar self = this;\\n\\t// Check for too much recursion\\n\\tif(this.getAncestorCount() > MAX_WIDGET_TREE_DEPTH) {\\n\\t\\tthis.children.push(this.makeChildWidget({type: \\\"error\\\", attributes: {\\n\\t\\t\\t\\\"$message\\\": {type: \\\"string\\\", value: $tw.language.getString(\\\"Error/RecursiveTransclusion\\\")}\\n\\t\\t}}));\\n\\t} else {\\n\\t\\t// Create set variable widgets for each variable\\n\\t\\t$tw.utils.each(options.variables,function(value,name) {\\n\\t\\t\\tvar setVariableWidget = {\\n\\t\\t\\t\\ttype: \\\"set\\\",\\n\\t\\t\\t\\tattributes: {\\n\\t\\t\\t\\t\\tname: {type: \\\"string\\\", value: name},\\n\\t\\t\\t\\t\\tvalue: {type: \\\"string\\\", value: value}\\n\\t\\t\\t\\t},\\n\\t\\t\\t\\tchildren: parseTreeNodes\\n\\t\\t\\t};\\n\\t\\t\\tparseTreeNodes = [setVariableWidget];\\n\\t\\t});\\n\\t\\t// Create the child widgets\\n\\t\\t$tw.utils.each(parseTreeNodes || (this.parseTreeNode && this.parseTreeNode.children),function(childNode) {\\n\\t\\t\\tself.children.push(self.makeChildWidget(childNode));\\n\\t\\t});\\n\\t}\\n};\\n\\n/*\\nConstruct the widget object for a parse tree node\\noptions include:\\n\\tvariables: optional hashmap of variables to wrap around the widget\\n*/\\nWidget.prototype.makeChildWidget = function(parseTreeNode,options) {\\n\\tvar self = this;\\n\\toptions = options || {};\\n\\t// Check whether this node type is defined by a custom widget definition\\n\\tvar variableDefinitionName = \\\"$\\\" + parseTreeNode.type;\\n\\tif(this.variables[variableDefinitionName]) {\\n\\t\\tvar isOverrideable = function() {\\n\\t\\t\\t\\t// Widget is overrideable if its name contains a period, or if it is an existing JS widget and we're not in safe mode\\n\\t\\t\\t\\treturn parseTreeNode.type.indexOf(\\\".\\\") !== -1 || (!!self.widgetClasses[parseTreeNode.type] && !$tw.safeMode);\\n\\t\\t\\t};\\n\\t\\tif(!parseTreeNode.isNotRemappable && isOverrideable()) { \\n\\t\\t\\tvar variableInfo = this.getVariableInfo(variableDefinitionName,{allowSelfAssigned: true});\\n\\t\\t\\tif(variableInfo && variableInfo.srcVariable && variableInfo.srcVariable.value && variableInfo.srcVariable.isWidgetDefinition) {\\n\\t\\t\\t\\tvar newParseTreeNode = {\\n\\t\\t\\t\\t\\ttype: \\\"transclude\\\",\\n\\t\\t\\t\\t\\tchildren: parseTreeNode.children,\\n\\t\\t\\t\\t\\tisBlock: parseTreeNode.isBlock\\n\\t\\t\\t\\t};\\n\\t\\t\\t\\t$tw.utils.addAttributeToParseTreeNode(newParseTreeNode,\\\"$variable\\\",variableDefinitionName);\\n\\t\\t\\t\\t$tw.utils.each(parseTreeNode.attributes,function(attr,name) {\\n\\t\\t\\t\\t\\t// If the attribute starts with a dollar then add an extra dollar so that it doesn't clash with the $xxx attributes of transclude\\n\\t\\t\\t\\t\\tname = name.charAt(0) === \\\"$\\\" ? \\\"$\\\" + name : name;\\n\\t\\t\\t\\t\\t$tw.utils.addAttributeToParseTreeNode(newParseTreeNode,$tw.utils.extend({},attr,{name: name}));\\n\\t\\t\\t\\t});\\n\\t\\t\\t\\tparseTreeNode = newParseTreeNode;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\t// Get the widget class for this node type\\n\\tvar WidgetClass = this.widgetClasses[parseTreeNode.type];\\n\\tif(!WidgetClass) {\\n\\t\\tWidgetClass = this.widgetClasses.text;\\n\\t\\tparseTreeNode = {type: \\\"text\\\", text: \\\"Undefined widget '\\\" + parseTreeNode.type + \\\"'\\\"};\\n\\t}\\n\\t// Create set variable widgets for each variable\\n\\t$tw.utils.each(options.variables,function(value,name) {\\n\\t\\tvar setVariableWidget = {\\n\\t\\t\\ttype: \\\"set\\\",\\n\\t\\t\\tattributes: {\\n\\t\\t\\t\\tname: {type: \\\"string\\\", value: name},\\n\\t\\t\\t\\tvalue: {type: \\\"string\\\", value: value}\\n\\t\\t\\t},\\n\\t\\t\\tchildren: [\\n\\t\\t\\t\\tparseTreeNode\\n\\t\\t\\t]\\n\\t\\t};\\n\\t\\tparseTreeNode = setVariableWidget;\\n\\t});\\n\\treturn new WidgetClass(parseTreeNode,{\\n\\t\\twiki: this.wiki,\\n\\t\\tparentWidget: this,\\n\\t\\tdocument: this.document\\n\\t});\\n};\\n\\n/*\\nGet the next sibling of this widget\\n*/\\nWidget.prototype.nextSibling = function() {\\n\\tif(this.parentWidget) {\\n\\t\\tvar index = this.parentWidget.children.indexOf(this);\\n\\t\\tif(index !== -1 && index \u003C this.parentWidget.children.length-1) {\\n\\t\\t\\treturn this.parentWidget.children[index+1];\\n\\t\\t}\\n\\t}\\n\\treturn null;\\n};
2731\\n\\n/*\\nGet the previous sibling of this widget\\n*/\\nWidget.prototype.previousSibling = function() {\\n\\tif(this.parentWidget) {\\n\\t\\tvar index = this.parentWidget.children.indexOf(this);\\n\\t\\tif(index !== -1 && index > 0) {\\n\\t\\t\\treturn this.parentWidget.children[index-1];\\n\\t\\t}\\n\\t}\\n\\treturn null;\\n};\\n\\n/*\\nRender the children of this widget into the DOM\\n*/\\nWidget.prototype.renderChildren = function(parent,nextSibling) {\\n\\tvar children = this.children;\\n\\tfor(var i = 0; i \u003C children.length; i++) {\\n\\t\\tchildren[i].render(parent,nextSibling);\\n\\t};\\n};\\n\\n/*\\nAdd a list of event listeners from an array [{type:,handler:},...]\\n*/\\nWidget.prototype.addEventListeners = function(listeners) {\\n\\tvar self = this;\\n\\t$tw.utils.each(listeners,function(listenerInfo) {\\n\\t\\tself.addEventListener(listenerInfo.type,listenerInfo.handler);\\n\\t});\\n};\\n\\n/*\\nAdd an event listener\\n*/\\nWidget.prototype.addEventListener = function(type,handler) {\\n\\tvar self = this;\\n\\tif(typeof handler === \\\"string\\\") { // The handler is a method name on this widget\\n\\t\\tthis.eventListeners[type] = function(event) {\\n\\t\\t\\treturn self[handler].call(self,event);\\n\\t\\t};\\n\\t} else { // The handler is a function\\n\\t\\tthis.eventListeners[type] = function(event) {\\n\\t\\t\\treturn handler.call(self,event);\\n\\t\\t};\\n\\t}\\n};\\n\\n/*\\nDispatch an event to a widget. If the widget doesn't handle the event then it is also dispatched to the parent widget\\n*/\\nWidget.prototype.dispatchEvent = function(event) {\\n\\tevent.widget = event.widget || this;\\n\\t// Dispatch the event if this widget handles it\\n\\tvar listener = this.eventListeners[event.type];\\n\\tif(listener) {\\n\\t\\t// Don't propagate the event if the listener returned false\\n\\t\\tif(!listener(event)) {\\n\\t\\t\\treturn false;\\n\\t\\t}\\n\\t}\\n\\t// Dispatch the event to the parent widget\\n\\tif(this.parentWidget) {\\n\\t\\treturn this.parentWidget.dispatchEvent(event);\\n\\t}\\n\\treturn true;\\n};
2731\\n\\n/*\\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n*/\\nWidget.prototype.refresh = function(changedTiddlers) {\\n\\treturn this.refreshChildren(changedTiddlers);\\n};\\n\\n/*\\nRebuild a previously rendered widget\\n*/\\nWidget.prototype.refreshSelf = function() {\\n\\tvar nextSibling = this.findNextSiblingDomNode();\\n\\tthis.removeChildDomNodes();\\n\\tthis.render(this.parentDomNode,nextSibling);\\n};\\n\\n/*\\nRefresh all the children of a widget\\n*/\\nWidget.prototype.refreshChildren = function(changedTiddlers) {\\n\\tvar children = this.children,\\n\\t\\trefreshed = false;\\n\\tfor (var i = 0; i \u003C children.length; i++) {\\n\\t\\trefreshed = children[i].refresh(changedTiddlers) || refreshed;\\n\\t}\\n\\treturn refreshed;\\n};\\n\\n/*\\nFind the next sibling in the DOM to this widget. This is done by scanning the widget tree through all next siblings and their descendents that share the same parent DOM node\\n*/\\nWidget.prototype.findNextSiblingDomNode = function(startIndex) {\\n\\t// Refer to this widget by its index within its parents children\\n\\tvar parent = this.parentWidget,\\n\\t\\tindex = startIndex !== undefined ? startIndex : parent.children.indexOf(this);\\nif(index === -1) {\\n\\tthrow \\\"node not found in parents children\\\";\\n}\\n\\t// Look for a DOM node in the later siblings\\n\\twhile(++index \u003C parent.children.length) {\\n\\t\\tvar domNode = parent.children[index].findFirstDomNode();\\n\\t\\tif(domNode) {\\n\\t\\t\\treturn domNode;\\n\\t\\t}\\n\\t}\\n\\t// Go back and look for later siblings of our parent if it has the same parent dom node\\n\\tvar grandParent = parent.parentWidget;\\n\\tif(grandParent && parent.parentDomNode === this.parentDomNode) {\\n\\t\\tindex = grandParent.children.indexOf(parent);\\n\\t\\tif(index !== -1) {\\n\\t\\t\\treturn parent.findNextSiblingDomNode(index);\\n\\t\\t}\\n\\t}\\n\\treturn null;\\n};
2731\\n\\n/*\\nFind the first DOM node generated by a widget or its children\\n*/\\nWidget.prototype.findFirstDomNode = function() {\\n\\t// Return the first dom node of this widget, if we've got one\\n\\tif(this.domNodes.length > 0) {\\n\\t\\treturn this.domNodes[0];\\n\\t}\\n\\t// Otherwise, recursively call our children\\n\\tfor(var t=0; t\u003Cthis.children.length; t++) {\\n\\t\\tvar domNode = this.children[t].findFirstDomNode();\\n\\t\\tif(domNode) {\\n\\t\\t\\treturn domNode;\\n\\t\\t}\\n\\t}\\n\\treturn null;\\n};\\n\\n/*\\nRemove any DOM nodes created by this widget or its children\\n*/\\nWidget.prototype.removeChildDomNodes = function() {\\n\\t// If this widget has directly created DOM nodes, delete them and exit. This assumes that any child widgets are contained within the created DOM nodes, which would normally be the case\\n\\tif(this.domNodes.length > 0) {\\n\\t\\t$tw.utils.each(this.domNodes,function(domNode) {\\n\\t\\t\\tdomNode.parentNode.removeChild(domNode);\\n\\t\\t});\\n\\t\\tthis.domNodes = [];\\n\\t} else {\\n\\t\\t// Otherwise, ask the child widgets to delete their DOM nodes\\n\\t\\t$tw.utils.each(this.children,function(childWidget) {\\n\\t\\t\\tchildWidget.removeChildDomNodes();\\n\\t\\t});\\n\\t}\\n};\\n\\n/*\\nInvoke the action widgets that are descendents of the current widget.\\n*/\\nWidget.prototype.invokeActions = function(triggeringWidget,event) {\\n\\tvar handled = false;\\n\\t// For each child widget\\n\\tfor(var t=0; t\u003Cthis.children.length; t++) {\\n\\t\\tvar child = this.children[t],\\n\\t\\t\\tchildIsActionWidget = !!child.invokeAction,\\n\\t\\t\\tactionRefreshPolicy = child.getVariable(\\\"tv-action-refresh-policy\\\"); // Default is \\\"once\\\"\\n\\t\\t// Refresh the child if required\\n\\t\\tif(childIsActionWidget || actionRefreshPolicy === \\\"always\\\") {\\n\\t\\t\\tchild.refreshSelf();\\n\\t\\t}\\n\\t\\t// Invoke the child if it is an action widget\\n\\t\\tif(childIsActionWidget) {\\n\\t\\t\\tif(child.invokeAction(triggeringWidget,event)) {\\n\\t\\t\\t\\thandled = true;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\t// Propagate through through the child if it permits it\\n\\t\\tif(child.allowActionPropagation() && child.invokeActions(triggeringWidget,event)) {\\n\\t\\t\\thandled = true;\\n\\t\\t}\\n\\t}\\n\\treturn handled;\\n};\\n\\n/*\\nInvoke the action widgets defined in a string\\n*/\\nWidget.prototype.invokeActionString = function(actions,triggeringWidget,event,variables) {\\n\\tactions = actions || \\\"\\\";\\n\\tvar parser = this.wiki.parseText(\\\"text/vnd.tiddlywiki\\\",actions,{\\n\\t\\t\\tparentWidget: this,\\n\\t\\t\\tdocument: this.document\\n\\t\\t}),\\n\\t\\twidgetNode = this.wiki.makeWidget(parser,{\\n\\t\\t\\tparentWidget: this,\\n\\t\\t\\tdocument: this.document,\\n\\t\\t\\tvariables: variables\\n\\t\\t});\\n\\tvar container = this.document.createElement(\\\"div\\\");\\n\\twidgetNode.render(container,null);\\n\\treturn widgetNode.invokeActions(this,event);\\n};\\n\\n/*\\nExecute action tiddlers by tag\\n*/\\nWidget.prototype.invokeActionsByTag = function(tag,event,variables) {\\n\\tvar self = this;\\n\\t$tw.utils.each(self.wiki.filterTiddlers(\\\"[all[shadows+tiddlers]tag[\\\" + tag + \\\"]!has[draft.of]]\\\"),function(title) {\\n\\t\\tself.invokeActionString(self.wiki.getTiddlerText(title),self,event,variables);\\n\\t});\\n};\\n\\nWidget.prototype.allowActionPropagation = function() {\\n\\treturn true;\\n};
2731\\n\\n/*\\nEvaluate a variable with parameters. This is a static convenience method that attempts to evaluate a variable as a function, returning an array of strings\\n*/\\nWidget.evaluateVariable  = function(widget,name,options) {\\n\\tvar result;\\n\\tif(widget.getVariableInfo) {\\n\\t\\tvar variableInfo = widget.getVariableInfo(name,options);\\n\\t\\tresult = variableInfo.resultList || [variableInfo.text];\\n\\t} else {\\n\\t\\tresult = [widget.getVariable(name)];\\n\\t}\\n\\treturn result;\\n};\\n\\nexports.widget = Widget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/widgets/wikify.js\":{\"title\":\"$:/core/modules/widgets/wikify.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/widgets/wikify.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nWidget to wikify text into a variable\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar WikifyWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nWikifyWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nWikifyWidget.prototype.render = function(parent,nextSibling) {\\n\\tthis.parentDomNode = parent;\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n\\tthis.renderChildren(parent,nextSibling);\\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nWikifyWidget.prototype.execute = function() {\\n\\t// Get our parameters\\n\\tthis.wikifyName = this.getAttribute(\\\"name\\\");\\n\\tthis.wikifyText = this.getAttribute(\\\"text\\\");\\n\\tthis.wikifyType = this.getAttribute(\\\"type\\\");\\n\\tthis.wikifyMode = this.getAttribute(\\\"mode\\\",\\\"block\\\");\\n\\tthis.wikifyOutput = this.getAttribute(\\\"output\\\",\\\"text\\\");\\n\\t// Create the parse tree\\n\\tthis.wikifyParser = this.wiki.parseText(this.wikifyType,this.wikifyText,{\\n\\t\\t\\tparseAsInline: this.wikifyMode === \\\"inline\\\"\\n\\t\\t});\\n\\t// Create the widget tree \\n\\tthis.wikifyWidgetNode = this.wiki.makeWidget(this.wikifyParser,{\\n\\t\\t\\tdocument: $tw.fakeDocument,\\n\\t\\t\\tparentWidget: this\\n\\t\\t});\\n\\t// Render the widget tree to the container\\n\\tthis.wikifyContainer = $tw.fakeDocument.createElement(\\\"div\\\");\\n\\tthis.wikifyWidgetNode.render(this.wikifyContainer,null);\\n\\tthis.wikifyResult = this.getResult();\\n\\t// Set context variable\\n\\tthis.setVariable(this.wikifyName,this.wikifyResult);\\n\\t// Construct the child widgets\\n\\tthis.makeChildWidgets();\\n};\\n\\n/*\\nReturn the result string\\n*/\\nWikifyWidget.prototype.getResult = function() {\\n\\tvar result;\\n\\tswitch(this.wikifyOutput) {\\n\\t\\tcase \\\"text\\\":\\n\\t\\t\\tresult = this.wikifyContainer.textContent;\\n\\t\\t\\tbreak;\\n\\t\\tcase \\\"formattedtext\\\":\\n\\t\\t\\tresult = this.wikifyContainer.formattedTextContent;\\n\\t\\t\\tbreak;\\n\\t\\tcase \\\"html\\\":\\n\\t\\t\\tresult = this.wikifyContainer.innerHTML;\\n\\t\\t\\tbreak;\\n\\t\\tcase \\\"parsetree\\\":\\n\\t\\t\\tresult = JSON.stringify(this.wikifyParser.tree,0,$tw.config.preferences.jsonSpaces);\\n\\t\\t\\tbreak;\\n\\t\\tcase \\\"widgettree\\\":\\n\\t\\t\\tresult = JSON.stringify(this.getWidgetTree(),0,$tw.config.preferences.jsonSpaces);\\n\\t\\t\\tbreak;\\n\\t}\\n\\treturn result;\\n};
2731\\n\\n/*\\nReturn a string of the widget tree\\n*/\\nWikifyWidget.prototype.getWidgetTree = function() {\\n\\tvar copyNode = function(widgetNode,resultNode) {\\n\\t\\t\\tvar type = widgetNode.parseTreeNode.type;\\n\\t\\t\\tresultNode.type = type;\\n\\t\\t\\tswitch(type) {\\n\\t\\t\\t\\tcase \\\"element\\\":\\n\\t\\t\\t\\t\\tresultNode.tag = widgetNode.parseTreeNode.tag;\\n\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\tcase \\\"text\\\":\\n\\t\\t\\t\\t\\tresultNode.text = widgetNode.parseTreeNode.text;\\n\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t}\\n\\t\\t\\tif(Object.keys(widgetNode.attributes || {}).length > 0) {\\n\\t\\t\\t\\tresultNode.attributes = {};\\n\\t\\t\\t\\t$tw.utils.each(widgetNode.attributes,function(attr,attrName) {\\n\\t\\t\\t\\t\\tresultNode.attributes[attrName] = widgetNode.getAttribute(attrName);\\n\\t\\t\\t\\t});\\n\\t\\t\\t}\\n\\t\\t\\tif(Object.keys(widgetNode.children || {}).length > 0) {\\n\\t\\t\\t\\tresultNode.children = [];\\n\\t\\t\\t\\t$tw.utils.each(widgetNode.children,function(widgetChildNode) {\\n\\t\\t\\t\\t\\tvar node = {};\\n\\t\\t\\t\\t\\tresultNode.children.push(node);\\n\\t\\t\\t\\t\\tcopyNode(widgetChildNode,node);\\n\\t\\t\\t\\t});\\n\\t\\t\\t}\\n\\t\\t},\\n\\t\\tresults = {};\\n\\tcopyNode(this.wikifyWidgetNode,results);\\n\\treturn results;\\n};\\n\\n/*\\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n*/\\nWikifyWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes();\\n\\t// Refresh ourselves entirely if any of our attributes have changed\\n\\tif(changedAttributes.name || changedAttributes.text || changedAttributes.type || changedAttributes.mode || changedAttributes.output) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t} else {\\n\\t\\t// Refresh the widget tree\\n\\t\\tif(this.wikifyWidgetNode.refresh(changedTiddlers)) {\\n\\t\\t\\t// Check if there was any change\\n\\t\\t\\tvar result = this.getResult();\\n\\t\\t\\tif(result !== this.wikifyResult) {\\n\\t\\t\\t\\t// If so, save the change\\n\\t\\t\\t\\tthis.wikifyResult = result;\\n\\t\\t\\t\\tthis.setVariable(this.wikifyName,this.wikifyResult);\\n\\t\\t\\t\\t// Refresh each of our child widgets\\n\\t\\t\\t\\t$tw.utils.each(this.children,function(childWidget) {\\n\\t\\t\\t\\t\\tchildWidget.refreshSelf();\\n\\t\\t\\t\\t});\\n\\t\\t\\t\\treturn true;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\t// Just refresh the children\\n\\t\\treturn this.refreshChildren(changedTiddlers);\\n\\t}\\n};\\n\\nexports.wikify = WikifyWidget;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/core/modules/wiki-bulkops.js\":{\"title\":\"$:/core/modules/wiki-bulkops.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/wiki-bulkops.js\\ntype: application/javascript\\nmodule-type: wikimethod\\n\\nBulk tiddler operations such as rename.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nRename a tiddler, and relink any tags or lists that reference it.\\n*/\\nfunction renameTiddler(fromTitle,toTitle,options) {\\n\\tfromTitle = (fromTitle || \\\"\\\").trim();\\n\\ttoTitle = (toTitle || \\\"\\\").trim();\\n\\toptions = options || {};\\n\\tif(fromTitle && toTitle && fromTitle !== toTitle) {\\n\\t\\t// Rename the tiddler itself\\n\\t\\tvar oldTiddler = this.getTiddler(fromTitle),\\n\\t\\t\\tnewTiddler = new $tw.Tiddler(oldTiddler,{title: toTitle},this.getModificationFields());\\n\\t\\tnewTiddler = $tw.hooks.invokeHook(\\\"th-renaming-tiddler\\\",newTiddler,oldTiddler);\\n\\t\\tthis.addTiddler(newTiddler);\\n\\t\\tthis.deleteTiddler(fromTitle);\\n\\t\\t// Rename any tags or lists that reference it\\n\\t\\tthis.relinkTiddler(fromTitle,toTitle,options)\\n\\t}\\n}\\n\\n/*\\nRelink any tags or lists that reference a given tiddler\\n*/\\nfunction relinkTiddler(fromTitle,toTitle,options) {\\n\\tvar self = this;\\n\\tfromTitle = (fromTitle || \\\"\\\").trim();\\n\\ttoTitle = (toTitle || \\\"\\\").trim();\\n\\toptions = options || {};\\n\\tif(fromTitle && toTitle && fromTitle !== toTitle) {\\n\\t\\tthis.each(function(tiddler,title) {\\n\\t\\t\\tvar type = ti
2731ddler.fields.type || \\\"\\\";\\n\\t\\t\\t// Don't touch plugins or JavaScript modules\\n\\t\\t\\tif(!tiddler.fields[\\\"plugin-type\\\"] && type !== \\\"application/javascript\\\") {\\n\\t\\t\\t\\tvar tags = tiddler.fields.tags ? tiddler.fields.tags.slice(0) : undefined,\\n\\t\\t\\t\\t\\tlist = tiddler.fields.list ? tiddler.fields.list.slice(0) : undefined,\\n\\t\\t\\t\\t\\tisModified = false,\\n\\t\\t\\t\\t\\tprocessList = function(listField) {\\n\\t\\t\\t\\t\\t\\tif(listField && listField.indexOf(fromTitle) !== -1) {\\n\\t\\t\\t\\t\\t\\t\\t// Remove any existing instances of the toTitle\\n\\t\\t\\t\\t\\t\\t\\tvar p = listField.indexOf(toTitle);\\n\\t\\t\\t\\t\\t\\t\\twhile(p !== -1) {\\n\\t\\t\\t\\t\\t\\t\\t\\tlistField.splice(p,1);\\n\\t\\t\\t\\t\\t\\t\\t\\tp = listField.indexOf(toTitle);\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t// Replace the fromTitle with toTitle\\n\\t\\t\\t\\t\\t\\t\\t$tw.utils.each(listField,function (title,index) {\\n\\t\\t\\t\\t\\t\\t\\t\\tif(title === fromTitle) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tlistField[index] = toTitle;\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tisModified = true;\\n\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t});\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t};\\n\\t\\t\\t\\tif(!options.dontRenameInTags) {\\n\\t\\t\\t\\t\\t// Rename tags\\n\\t\\t\\t\\t\\tprocessList(tags);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tif(!options.dontRenameInLists) {\\n\\t\\t\\t\\t\\t// Rename lists\\n\\t\\t\\t\\t\\tprocessList(list);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tif(isModified) {\\n\\t\\t\\t\\t\\tvar newTiddler = new $tw.Tiddler(tiddler,{tags: tags, list: list},self.getModificationFields())\\n\\t\\t\\t\\t\\tnewTiddler = $tw.hooks.invokeHook(\\\"th-relinking-tiddler\\\",newTiddler,tiddler);\\n\\t\\t\\t\\t\\tself.addTiddler(newTiddler);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t});\\n\\t}\\n};\\n\\nexports.renameTiddler = renameTiddler;\\nexports.relinkTiddler = relinkTiddler;\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"wikimethod\"},\"$:/core/modules/wiki.js\":{\"title\":\"$:/core/modules/wiki.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/wiki.js\\ntype: application/javascript\\nmodule-type: wikimethod\\n\\nExtension methods for the $tw.Wiki object\\n\\nAdds the following properties to the wiki object:\\n\\n* `eventListeners` is a hashmap by type of arrays of listener functions\\n* `changedTiddlers` is a hashmap describing changes to named tiddlers since wiki change events were last dispatched. Each entry is a hashmap containing two fields:\\n\\tmodified: true/false\\n\\tdeleted: true/false\\n* `changeCount` is a hashmap by tiddler title containing a numerical index that starts at zero and is incremented each time a tiddler is created changed or deleted\\n* `caches` is a hashmap by tiddler title containing a further hashmap of named cache objects. Caches are automatically cleared when a tiddler is modified or deleted\\n* `globalCache` is a hashmap by cache name of cache objects that are cleared whenever any tiddler change occurs\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar widget = require(\\\"$:/core/modules/widgets/widget.js\\\");\\n\\nvar USER_NAME_TITLE = \\\"$:/status/UserName\\\",\\n\\tTIMESTAMP_DISABLE_TITLE = \\\"$:/config/TimestampDisable\\\";\\n\\n/*\\nAdd available indexers to this wiki\\n*/\\nexports.addIndexersToWiki = function() {\\n\\tvar self = this;\\n\\t$tw.utils.each($tw.modules.applyMethods(\\\"indexer\\\"),function(Indexer,name) {\\n\\t\\tself.addIndexer(new Indexer(self),name);\\n\\t});\\n};\\n\\n/*\\nGet the value of a text reference. Text references can have any of these forms:\\n\\t\u003Ctiddlertitle>\\n\\t\u003Ctiddlertitle>!!\u003Cfieldname>\\n\\t!!\u003Cfieldname> - specifies a field of the current tiddlers\\n\\t\u003Ctiddlertitle>##\u003Cindex>\\n*/\\nexports.getTextReference = function(textRef,defaultText,currTiddlerTitle) {\\n\\tvar tr = $tw.utils.parseTextReference(textRef),\\n\\t\\ttitle = tr.title || currTiddlerTitle;\\n\\tif(tr.field) {\\n\\t\\tvar tiddler = this.getTiddler(title);\\n\\t\\tif(tr.field === \\\"title\\\") { // Special case so we can return the title of a non-existent tid
2731dler\\n\\t\\t\\treturn title || defaultText;\\n\\t\\t} else if(tiddler && $tw.utils.hop(tiddler.fields,tr.field)) {\\n\\t\\t\\treturn tiddler.getFieldString(tr.field);\\n\\t\\t} else {\\n\\t\\t\\treturn defaultText;\\n\\t\\t}\\n\\t} else if(tr.index) {\\n\\t\\treturn this.extractTiddlerDataItem(title,tr.index,defaultText);\\n\\t} else {\\n\\t\\treturn this.getTiddlerText(title,defaultText);\\n\\t}\\n};\\n\\nexports.setTextReference = function(textRef,value,currTiddlerTitle) {\\n\\tvar tr = $tw.utils.parseTextReference(textRef),\\n\\t\\ttitle = tr.title || currTiddlerTitle;\\n\\tthis.setText(title,tr.field,tr.index,value);\\n};\\n\\nexports.setText = function(title,field,index,value,options) {\\n\\toptions = options || {};\\n\\tvar creationFields = options.suppressTimestamp ? {} : this.getCreationFields(),\\n\\t\\tmodificationFields = options.suppressTimestamp ? {} : this.getModificationFields();\\n\\t// Check if it is a reference to a tiddler field\\n\\tif(index) {\\n\\t\\tvar data = this.getTiddlerData(title,Object.create(null));\\n\\t\\tif(value !== undefined) {\\n\\t\\t\\tdata[index] = value;\\n\\t\\t} else {\\n\\t\\t\\tdelete data[index];\\n\\t\\t}\\n\\t\\tthis.setTiddlerData(title,data,{},{suppressTimestamp: options.suppressTimestamp});\\n\\t} else {\\n\\t\\tvar tiddler = this.getTiddler(title),\\n\\t\\t\\tfields = {title: title};\\n\\t\\tfields[field || \\\"text\\\"] = value;\\n\\t\\tthis.addTiddler(new $tw.Tiddler(creationFields,tiddler,fields,modificationFields));\\n\\t}\\n};\\n\\nexports.deleteTextReference = function(textRef,currTiddlerTitle) {\\n\\tvar tr = $tw.utils.parseTextReference(textRef),\\n\\t\\ttitle,tiddler,fields;\\n\\t// Check if it is a reference to a tiddler\\n\\tif(tr.title && !tr.f
2731ield) {\\n\\t\\tthis.deleteTiddler(tr.title);\\n\\t// Else check for a field reference\\n\\t} else if(tr.field) {\\n\\t\\ttitle = tr.title || currTiddlerTitle;\\n\\t\\ttiddler = this.getTiddler(title);\\n\\t\\tif(tiddler && $tw.utils.hop(tiddler.fields,tr.field)) {\\n\\t\\t\\tfields = Object.create(null);\\n\\t\\t\\tfields[tr.field] = undefined;\\n\\t\\t\\tthis.addTiddler(new $tw.Tiddler(tiddler,fields,this.getModificationFields()));\\n\\t\\t}\\n\\t}\\n};\\n\\nexports.addEventListener = function(type,listener) {\\n\\tthis.eventListeners = this.eventListeners || {};\\n\\tthis.eventListeners[type] = this.eventListeners[type]  || [];\\n\\tthis.eventListeners[type].push(listener);\\n};\\n\\nexports.removeEventListener = function(type,listener) {\\n\\tvar listeners = this.eventListeners[type];\\n\\tif(listeners) {\\n\\t\\tvar p = listeners.indexOf(listener);\\n\\t\\tif(p !== -1) {\\n\\t\\t\\tlisteners.splice(p,1);\\n\\t\\t}\\n\\t}\\n};\\n\\nexports.dispatchEvent = function(type /*, args */) {\\n\\tvar args = Array.prototype.slice.call(arguments,1),\\n\\t\\tlisteners = this.eventListeners[type];\\n\\tif(listeners) {\\n\\t\\tfor(var p=0; p\u003Clisteners.length; p++) {\\n\\t\\t\\tvar listener = listeners[p];\\n\\t\\t\\tlistener.apply(listener,args);\\n\\t\\t}\\n\\t}\\n};\\n\\n/*\\nCauses a tiddler to be marked as changed, incrementing the change count, and triggers event handlers.\\nThis method should be called after the changes it describes have been made to the wiki.tiddlers[] array.\\n\\ttitle: Title of tiddler\\n\\tisDeleted: defaults to false (meaning the tiddler has been created or modified),\\n\\t\\ttrue if the tiddler has been deleted\\n*/\\nexports.enqueueTiddlerEvent = function(title,isDeleted) {\\n\\t// Record the touch in the list of changed tiddlers\\n\\tthis.changedTiddlers = this.changedTiddlers || Object.create(null);\\n\\tthis.changedTiddlers[title] = this.changedTiddlers[title] || Object.create(null);\\n\\tthis.changedTiddlers[title][isDeleted ? \\\"deleted\\\" : \\\"modified\\\"] = true;\\n\\t// Increment the change count\\n\\tthis.changeCount = this.changeCount || Object.create(null);\\n\\tif($tw.utils.hop(this.changeCount,title)) {\\n\\t\\tthis.changeCount[title]++;\\n\\t} else {\\n\\t\\tthis.changeCount[title] = 1;\\n\\t}\\n\\t// Trigger events\\n\\tthis.eventListeners = this.eventListeners || {};\\n\\tif(!this.eventsTriggered) {\\n\\t\\tvar self = this;\\n\\t\\t$tw.utils.nextTick(function() {\\n\\t\\t\\tvar changes = self.changedTiddlers;\\n\\t\\t\\tself.changedTiddlers = Object.create(null);\\n\\t\\t\\tself.eventsTriggered = false;\\n\\t\\t\\tif($tw.utils.count(changes) > 0) {\\n\\t\\t\\t\\tself.dispatchEvent(\\\"change\\\",changes);\\n\\t\\t\\t}\\n\\t\\t});\\n\\t\\tthis.eventsTriggered = true;\\n\\t}\\n};\\n\\nexports.getSizeOfTiddlerEventQueue = function() {\\n\\treturn $tw.utils.count(this.changedTiddlers);\\n};\\n\\nexports.clearTiddlerEventQueue = function() {\\n\\tthis.changedTiddlers = Object.create(null);\\n\\tthis.changeCount = Object.create(null);\\n};\\n\\nexports.getChangeCount = function(title) {\\n\\tthis.changeCount = this.changeCount || Object.create(null);\\n\\tif($tw.utils.hop(this.changeCount,title)) {\\n\\t\\treturn this.changeCount[title];\\n\\t} else {\\n\\t\\treturn 0;\\n\\t}\\n};\\n\\n/*\\nGenerate an unused title from the specified base\\noptions.prefix must be a string\\n*/\\nexports.generateNewTitle = function(baseTitle,options) {\\n\\toptions = options || {};\\n\\tvar c = 0,\\n\\t\\ttitle = baseTitle,\\n\\t\\ttemplate = options.template,\\n\\t\\tprefix = (typeof(options.prefix) === \\\"string\\\") ? options.prefix : \\\" \\\";\\n\\tif (template) {\\n\\t\\t// \\\"count\\\" is important to avoid an endless loop in while(...)!!\\n\\t\\ttemplate = (/\\\\$count:?(\\\\d+)?\\\\$/i.test(template)) ? template : template + \\\"$count$\\\";\\n\\t\\ttitle = $tw.utils.formatTitleString(template,{\\\"base\\\":baseTitle,\\\"separator\\\":prefix,\\\"counter\\\":c});\\n\\t\\twhile(this.tiddlerExists(title) || this.isShadowTiddler(title) || this.findDraft(title)) {\\n\\t\\t\\ttitle = $tw.utils.formatTitleString(template,{\\\"base\\\":baseTitle,\\\"separator\\\":prefix,\\\"counter\\\":(++c)});\\n\\t\\t}\\n\\t} else {\\n\\t\\twhile(this.tiddlerExists(title) || this.isShadowTiddler(title) || this.findDraft(title)) {\\n\\t\\t\\ttitle = baseTitle + prefix + (++c);\\n\\t\\t}\\n\\t}\\n\\treturn title;\\n};\\n\\nexports.isSystemTiddler = function(title) {\\n\\treturn title && title.indexOf(\\\"$:/\\\") === 0;\\n};\\n\\nexports.isTemporaryTiddler = function(title) {\\n\\treturn title && title.indexOf(\\\"$:/temp/\\\") === 0;\\n};\\n\\nexports.isVolatileTiddler = function(title) {\\n\\treturn title && title.indexOf(\\\"$:/temp/volatile/\\\") === 0;\\n};\\n\\nexports.isImageTiddler = function(title) {\\n\\tvar tiddler = this.getTiddler(title);\\n\\tif(tiddler) {\\n\\t\\tvar contentTypeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || \\\"text/vnd.tiddlywiki\\\"];\\n\\t\\treturn !!contentTypeInfo && contentTypeInfo.flags.indexOf(\\\"image\\\") !== -1;\\n\\t} else {\\n\\t\\treturn null;\\n\\t}\\n};\\n\\nexports.isBinaryTiddler = function(title) {\\n\\tvar tiddler = this.getTiddler(title);\\n\\tif(tiddler) {\\n\\t\\tvar contentTypeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || \\\"text/vnd.tiddlywiki\\\"];\\n\\t\\treturn !!contentTypeInfo && contentTypeInfo.encoding === \\\"base64\\\";\\n\\t} else {\\n\\t\\treturn null;\\n\\t}\\n};
2731\\n\\n/*\\nLike addTiddler() except it will silently reject any plugin tiddlers that are older than the currently loaded version. Returns true if the tiddler was imported\\n*/\\nexports.importTiddler = function(tiddler) {\\n\\tvar existingTiddler = this.getTiddler(tiddler.fields.title);\\n\\t// Check if we're dealing with a plugin\\n\\tif(tiddler && tiddler.hasField(\\\"plugin-type\\\") && tiddler.hasField(\\\"version\\\") && existingTiddler && existingTiddler.hasField(\\\"plugin-type\\\") && existingTiddler.hasField(\\\"version\\\")) {\\n\\t\\t// Reject the incoming plugin if it is older\\n\\t\\tif(!$tw.utils.checkVersions(tiddler.fields.version,existingTiddler.fields.version)) {\\n\\t\\t\\treturn false;\\n\\t\\t}\\n\\t}\\n\\t// Fall through to adding the tiddler\\n\\tthis.addTiddler(tiddler);\\n\\treturn true;\\n};\\n\\n/*\\nReturn a hashmap of the fields that should be set when a tiddler is created\\n*/\\nexports.getCreationFields = function() {\\n\\tif(this.getTiddlerText(TIMESTAMP_DISABLE_TITLE,\\\"\\\").toLowerCase() !== \\\"yes\\\") {\\n\\t\\tvar fields = {\\n\\t\\t\\t\\tcreated: new Date()\\n\\t\\t\\t},\\n\\t\\t\\tcreator = this.getTiddlerText(USER_NAME_TITLE);\\n\\t\\tif(creator) {\\n\\t\\t\\tfields.creator = creator;\\n\\t\\t}\\n\\t\\treturn fields;\\n\\t} else {\\n\\t\\treturn {};\\n\\t}\\n};\\n\\n/*\\nReturn a hashmap of the fields that should be set when a tiddler is modified\\n*/\\nexports.getModificationFields = function() {\\n\\tif(this.getTiddlerText(TIMESTAMP_DISABLE_TITLE,\\\"\\\").toLowerCase() !== \\\"yes\\\") {\\n\\t\\tvar fields = Object.create(null),\\n\\t\\t\\tmodifier = this.getTiddlerText(USER_NAME_TITLE);\\n\\t\\tfields.modified = new Date();\\n\\t\\tif(modifier) {\\n\\t\\t\\tfields.modifier = modifier;\\n\\t\\t}\\n\\t\\treturn fields;\\n\\t} else {\\n\\t\\treturn {};\\n\\t}\\n};\\n\\n/*\\nReturn a sorted array of tiddler titles.  Options include:\\nsortField: field to sort by\\nexcludeTag: tag to exclude\\nincludeSystem: whether to include system tiddlers (defaults to false)\\n*/\\nexports.getTiddlers = function(options) {\\n\\toptions = options || Object.create(null);\\n\\tvar self = this,\\n\\t\\tsortField = options.sortField || \\\"title\\\",\\n\\t\\ttiddlers = [], t, titles = [];\\n\\tthis.each(function(tiddler,title) {\\n\\t\\tif(options.includeSystem || !self.isSystemTiddler(title)) {\\n\\t\\t\\tif(!options.excludeTag || !tiddler.hasTag(options.excludeTag)) {\\n\\t\\t\\t\\ttiddlers.push(tiddler);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t});\\n\\ttiddlers.sort(function(a,b) {\\n\\t\\tvar aa = a.fields[sortField].toLowerCase() || \\\"\\\",\\n\\t\\t\\tbb = b.fields[sortField].toLowerCase() || \\\"\\\";\\n\\t\\tif(aa \u003C bb) {\\n\\t\\t\\treturn -1;\\n\\t\\t} else {\\n\\t\\t\\tif(aa > bb) {\\n\\t\\t\\t\\treturn 1;\\n\\t\\t\\t} else {\\n\\t\\t\\t\\treturn 0;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t});\\n\\tfor(t=0; t\u003Ctiddlers.length; t++) {\\n\\t\\ttitles.push(tiddlers[t].fields.title);\\n\\t}\\n\\treturn titles;\\n};\\n\\nexports.countTiddlers = function(excludeTag) {\\n\\tvar tiddlers = this.getTiddlers({excludeTag: excludeTag});\\n\\treturn $tw.utils.count(tiddlers);\\n};\\n\\n/*\\nReturns a function iterator(callback) that iterates through the specified titles, and invokes the callback with callback(tiddler,title)\\n*/\\nexports.makeTiddlerIterator = function(titles) {\\n\\tvar self = this;\\n\\tif(!$tw.utils.isArray(titles)) {\\n\\t\\ttitles = Object.keys(titles);\\n\\t} else {\\n\\t\\ttitles = titles.slice(0);\\n\\t}
2731\\n\\treturn function(callback) {\\n\\t\\ttitles.forEach(function(title) {\\n\\t\\t\\tcallback(self.getTiddler(title),title);\\n\\t\\t});\\n\\t};\\n};\\n\\n/*\\nSort an array of tiddler titles by a specified field\\n\\ttitles: array of titles (sorted in place)\\n\\tsortField: name of field to sort by\\n\\tisDescending: true if the sort should be descending\\n\\tisCaseSensitive: true if the sort should consider upper and lower case letters to be different\\n*/\\nexports.sortTiddlers = function(titles,sortField,isDescending,isCaseSensitive,isNumeric,isAlphaNumeric) {\\n\\tvar self = this;\\n\\tif(sortField === \\\"title\\\") {\\n\\t\\tif(!isNumeric && !isAlphaNumeric) {\\n\\t\\t\\tif(isCaseSensitive) {\\n\\t\\t\\t\\tif(isDescending) {\\n\\t\\t\\t\\t\\ttitles.sort(function(a,b) {\\n\\t\\t\\t\\t\\t\\treturn b.localeCompare(a);\\n\\t\\t\\t\\t\\t});\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\ttitles.sort(function(a,b) {\\n\\t\\t\\t\\t\\t\\treturn a.localeCompare(b);\\n\\t\\t\\t\\t\\t});\\n\\t\\t\\t\\t}\\t\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tif(isDescending) {\\n\\t\\t\\t\\t\\ttitles.sort(function(a,b) {\\n\\t\\t\\t\\t\\t\\treturn b.toLowerCase().localeCompare(a.toLowerCase());\\n\\t\\t\\t\\t\\t});\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\ttitles.sort(function(a,b) {\\n\\t\\t\\t\\t\\t\\treturn a.toLowerCase().localeCompare(b.toLowerCase());\\n\\t\\t\\t\\t\\t});\\n\\t\\t\\t\\t}\\t\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\t\\t\\ttitles.sort(function(a,b) {\\n\\t\\t\\t\\tvar x,y;\\n\\t\\t\\t\\tif(isNumeric) {\\n\\t\\t\\t\\t\\tx = Number(a);\\n\\t\\t\\t\\t\\ty = Number(b);\\n\\t\\t\\t\\t\\tif(isNaN(x)) {\\n\\t\\t\\t\\t\\t\\tif(isNaN(y)) {\\n\\t\\t\\t\\t\\t\\t\\t// If neither value is a number then fall through to a textual comparison\\n\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\treturn isDescending ? -1 : 1;\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\tif(isNaN(y)) {\\n\\t\\t\\t\\t\\t\\t\\treturn isDescending ? 1 : -1;\\n\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\treturn isDescending ? y - x :  x - y;\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tif(isAlphaNumeric) {\\n\\t\\t\\t\\t\\treturn isDescending ? b.localeCompare(a,undefined,{numeric: true,sensitivity: \\\"base\\\"}) : a.localeCompare(b,undefined,{numeric: true,sensitivity: \\\"base\\\"});\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tif(!isCaseSensitive) {\\n\\t\\t\\t\\t\\ta = a.toLowerCase();\\n\\t\\t\\t\\t\\tb = b.toLowerCase();\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn isDescending ? b.localeCompare(a) : a.localeCompare(b);\\n\\t\\t\\t});\\n\\t\\t}\\n\\t} else {\\n\\t\\ttitles.sort(function(a,b) {\\n\\t\\t\\tvar x,y;\\n\\t\\t\\tif(sortField !== \\\"title\\\") {\\n\\t\\t\\t\\tvar tiddlerA = self.getTiddler(a),\\n\\t\\t\\t\\t\\ttiddlerB = self.getTiddler(b);\\n\\t\\t\\t\\tif(tiddlerA) {\\n\\t\\t\\t\\t\\ta = tiddlerA.fields[sortField] || \\\"\\\";\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\ta = \\\"\\\";\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tif(tiddlerB) {\\n\\t\\t\\t\\t\\tb = tiddlerB.fields[sortField] || \\\"\\\";\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tb = \\\"\\\";\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\tif(isNumeric) {\\n\\t\\t\\t\\tx = Number(a);\\n\\t\\t\\t\\ty = Number(b);\\n\\t\\t\\t\\tif(isNaN(x)) {\\n\\t\\t\\t\\t\\tif(isNaN(y)) {\\n\\t\\t\\t\\t\\t\\t// If neither value is a number then fall through to a textual comparison\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\treturn isDescending ? -1 : 1;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tif(isNaN(y)) {\\n\\t\\t\\t\\t\\t\\treturn isDescending ? 1 : -1;\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\treturn isDescending ? y - x :  x - y;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\tif(Object.prototype.toString.call(a) === \\\"[object Date]\\\" && Object.prototype.toString.call(b) === \\\"[object Date]\\\") {\\n\\t\\t\\t\\treturn isDescending ? b - a : a - b;\\n\\t\\t\\t}\\n\\t\\t\\ta = String(a);\\n\\t\\t\\tb = String(b);\\n\\t\\t\\tif(isAlphaNumeric) {\\n\\t\\t\\t\\treturn isDescending ? b.localeCompare(a,undefined,{numeric: true,sensitivity: \\\"base\\\"}) : a.localeCompare(b,undefined,{numeric: true,sensitivity: \\\"base\\\"});\\n\\t\\t\\t}
2731\\n\\t\\t\\tif(!isCaseSensitive) {\\n\\t\\t\\t\\ta = a.toLowerCase();\\n\\t\\t\\t\\tb = b.toLowerCase();\\n\\t\\t\\t}\\n\\t\\t\\treturn isDescending ? b.localeCompare(a) : a.localeCompare(b);\\n\\t\\t});\\n\\t}\\n};\\n\\n/*\\nFor every tiddler invoke a callback(title,tiddler) with `this` set to the wiki object. Options include:\\nsortField: field to sort by\\nexcludeTag: tag to exclude\\nincludeSystem: whether to include system tiddlers (defaults to false)\\n*/\\nexports.forEachTiddler = function(/* [options,]callback */) {\\n\\tvar arg = 0,\\n\\t\\toptions = arguments.length >= 2 ? arguments[arg++] : {},\\n\\t\\tcallback = arguments[arg++],\\n\\t\\ttitles = this.getTiddlers(options),\\n\\t\\tt, tiddler;\\n\\tfor(t=0; t\u003Ctitles.length; t++) {\\n\\t\\ttiddler = this.getTiddler(titles[t]);\\n\\t\\tif(tiddler) {\\n\\t\\t\\tcallback.call(this,tiddler.fields.title,tiddler);\\n\\t\\t}\\n\\t}\\n};\\n\\n/*\\nReturn an array of tiddler titles that are directly linked within the given parse tree\\n */\\nexports.extractLinks = function(parseTreeRoot) {\\n\\t// Count up the links\\n\\tvar links = [],\\n\\t\\tcheckParseTree = function(parseTree) {\\n\\t\\t\\tfor(var t=0; t\u003CparseTree.length; t++) {\\n\\t\\t\\t\\tvar parseTreeNode = parseTree[t];\\n\\t\\t\\t\\tif(parseTreeNode.type === \\\"link\\\" && parseTreeNode.attributes.to && parseTreeNode.attributes.to.type === \\\"string\\\") {\\n\\t\\t\\t\\t\\tvar value = parseTreeNode.attributes.to.value;\\n\\t\\t\\t\\t\\tif(links.indexOf(value) === -1) {\\n\\t\\t\\t\\t\\t\\tlinks.push(value);\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tif(parseTreeNode.children) {\\n\\t\\t\\t\\t\\tcheckParseTree(parseTreeNode.children);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t};\\n\\tcheckParseTree(parseTreeRoot);\\n\\treturn links;\\n};\\n\\n/*\\nReturn an array of tiddler titles that are directly linked from the specified tiddler\\n*/\\nexports.getTiddlerLinks = function(title) {\\n\\tvar self = this;\\n\\t// We'll cache the links so they only get computed if the tiddler changes\\n\\treturn this.getCacheForTiddler(title,\\\"links\\\",function() {\\n\\t\\t// Parse the tiddler\\n\\t\\tvar parser = self.parseTiddler(title);\\n\\t\\tif(parser) {\\n\\t\\t\\treturn self.extractLinks(parser.tree);\\n\\t\\t}\\n\\t\\treturn [];\\n\\t});\\n};\\n\\n/*\\nReturn an array of tiddler titles that link to the specified tiddler\\n*/\\nexports.getTiddlerBacklinks = function(targetTitle) {\\n\\tvar self = this,\\n\\t\\tbacklinksIndexer = this.getIndexer(\\\"BacklinksIndexer\\\"),\\n\\t\\tbacklinks = backlinksIndexer && backlinksIndexer.lookup(targetTitle);\\n\\n\\tif(!backlinks) {\\n\\t\\tbacklinks = [];\\n\\t\\tthis.forEachTiddler(function(title,tiddler) {\\n\\t\\t\\tvar links = self.getTiddlerLinks(title);\\n\\t\\t\\tif(links.indexOf(targetTitle) !== -1) {\\n\\t\\t\\t\\tbacklinks.push(title);\\n\\t\\t\\t}\\n\\t\\t});\\n\\t}\\n\\treturn backlinks;\\n};\\n\\n/*\\nReturn a hashmap of tiddler titles that are referenced but not defined. Each value is the number of times the missing tiddler is referenced\\n*/\\nexports.getMissingTitles = function() {\\n\\tvar self = this,\\n\\t\\tmissing = [];\\n// We should cache the missing tiddler list, even if we recreate it every time any tiddler is modified\\n\\tthis.forEachTiddler(function(title,tiddler) {\\n\\t\\tvar links = self.getTiddlerLinks(title);\\n\\t\\t$tw.utils.each(links,function(link) {\\n\\t\\t\\tif((!self.tiddlerExists(link) && !self.isShadowTiddler(link)) && missing.indexOf(link) === -1) {\\n\\t\\t\\t\\tmissing.push(link);\\n\\t\\t\\t}\\n\\t\\t});\\n\\t});\\n\\treturn missing;\\n};\\n\\nexports.getOrphanTitles = function() {\\n\\tvar self = this,\\n\\t\\torphans = this.getTiddlers();\\n\\tthis.forEachTiddler(function(title,tiddler) {\\n\\t\\tvar links = self.getTiddlerLinks(title);\\n\\t\\t$tw.utils.each(links,function(link) {\\n\\t\\t\\tvar p = orphans.indexOf(link);\\n\\t\\t\\tif(p !== -1) {\\n\\t\\t\\t\\torphans.splice(p,1);\\n\\t\\t\\t}\\n\\t\\t});\\n\\t});\\n\\treturn orphans; // Todo\\n};\\n\\n/*\\nRetrieves a list of the tiddler titles that are tagged with a given tag\\n*/\\nexports.getTiddlersWithTag = function(tag) {\\n\\t// Try to use the indexer\\n\\tvar self = this,\\n\\t\\ttagIndexer = this.getIndexer(\\\"TagIndexer\\\"),\\n\\t\\tresults = tagIndexer && tagIndexer.subIndexers[3].lookup(tag);\\n\\tif(!results) {\\n\\t\\t// If not available, perform a manual scan\\n\\t\\tresults = this.getGlobalCache(\\\"taglist-\\\" + tag,function() {\\n\\t\\t\\tvar tagmap = self.getTagMap();\\n\\t\\t\\treturn self.sortByList(tagmap[tag],tag);\\n\\t\\t});\\n\\t}\\n\\treturn results;\\n};
2731\\n\\n/*\\nGet a hashmap by tag of arrays of tiddler titles\\n*/\\nexports.getTagMap = function() {\\n\\tvar self = this;\\n\\treturn this.getGlobalCache(\\\"tagmap\\\",function() {\\n\\t\\tvar tags = Object.create(null),\\n\\t\\t\\tstoreTags = function(tagArray,title) {\\n\\t\\t\\t\\tif(tagArray) {\\n\\t\\t\\t\\t\\tfor(var index=0; index\u003CtagArray.length; index++) {\\n\\t\\t\\t\\t\\t\\tvar tag = tagArray[index];\\n\\t\\t\\t\\t\\t\\tif($tw.utils.hop(tags,tag)) {\\n\\t\\t\\t\\t\\t\\t\\ttags[tag].push(title);\\n\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\ttags[tag] = [title];\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t},\\n\\t\\t\\ttitle, tiddler;\\n\\t\\t// Collect up all the tags\\n\\t\\tself.eachShadow(function(tiddler,title) {\\n\\t\\t\\tif(!self.tiddlerExists(title)) {\\n\\t\\t\\t\\ttiddler = self.getTiddler(title);\\n\\t\\t\\t\\tstoreTags(tiddler.fields.tags,title);\\n\\t\\t\\t}\\n\\t\\t});\\n\\t\\tself.each(function(tiddler,title) {\\n\\t\\t\\tstoreTags(tiddler.fields.tags,title);\\n\\t\\t});\\n\\t\\treturn tags;\\n\\t});\\n};\\n\\n/*\\nLookup a given tiddler and return a list of all the tiddlers that include it in the specified list field\\n*/\\nexports.findListingsOfTiddler = function(targetTitle,fieldName) {\\n\\tfieldName = fieldName || \\\"list\\\";\\n\\tvar wiki = this;\\n\\tvar listings = this.getGlobalCache(\\\"listings-\\\" + fieldName,function() {\\n\\t\\tvar listings = Object.create(null);\\n\\t\\twiki.each(function(tiddler,title) {\\n\\t\\t\\tvar list = $tw.utils.parseStringArray(tiddler.fields[fieldName]);\\n\\t\\t\\tif(list) {\\n\\t\\t\\t\\tfor(var i = 0; i \u003C list.length; i++) {\\n\\t\\t\\t\\t\\tvar listItem = list[i],\\n\\t\\t\\t\\t\\t\\tlisting = listings[listItem] || [];\\n\\t\\t\\t\\t\\tif (listing.indexOf(title) === -1) {\\n\\t\\t\\t\\t\\t\\tlisting.push(title);\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tlistings[listItem] = listing;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t});\\n\\t\\treturn listings;\\n\\t});\\n\\treturn listings[targetTitle] || [];\\n};\\n\\n/*\\nSorts an array of tiddler titles according to an ordered list\\n*/\\nexports.sortByList = function(array,listTitle) {\\n\\tvar self = this,\\n\\t\\treplacedTitles = Object.create(null);\\n\\t// Given a title, this function will place it in the correct location\\n\\t// within titles.\\n\\tfunction moveItemInList(title) {\\n\\t\\tif(!$tw.utils.hop(replacedTitles, title)) {\\n\\t\\t\\treplacedTitles[title] = true;\\n\\t\\t\\tvar newPos = -1,\\n\\t\\t\\t\\ttiddler = self.getTiddler(title);\\n\\t\\t\\tif(tiddler) {\\n\\t\\t\\t\\tvar beforeTitle = tiddler.fields[\\\"list-before\\\"],\\n\\t\\t\\t\\t\\tafterTitle = tiddler.fields[\\\"list-after\\\"];\\n\\t\\t\\t\\tif(beforeTitle === \\\"\\\") {\\n\\t\\t\\t\\t\\tnewPos = 0;\\n\\t\\t\\t\\t} else if(afterTitle === \\\"\\\") {\\n\\t\\t\\t\\t\\tnewPos = titles.length;\\n\\t\\t\\t\\t} else if(beforeTitle) {\\n\\t\\t\\t\\t\\t// if this title is placed relative\\n\\t\\t\\t\\t\\t// to another title, make sure that\\n\\t\\t\\t\\t\\t// title is placed before we place\\n\\t\\t\\t\\t\\t// this one.\\n\\t\\t\\t\\t\\tmoveItemInList(beforeTitle);\\n\\t\\t\\t\\t\\tnewPos = titles.indexOf(beforeTitle);\\n\\t\\t\\t\\t} else if(afterTitle) {\\n\\t\\t\\t\\t\\t// Same deal\\n\\t\\t\\t\\t\\tmoveItemInList(afterTitle);\\n\\t\\t\\t\\t\\tnewPos = titles.indexOf(afterTitle);\\n\\t\\t\\t\\t\\tif(newPos >= 0) {\\n\\t\\t\\t\\t\\t\\t++newPos;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t// If a new position is specified, let's move it\\n\\t\\t\\t\\tif (newPos !== -1) {\\n\\t\\t\\t\\t\\t// get its current Pos, and make sure\\n\\t\\t\\t\\t\\t// sure that it's _actually_ in the list\\n\\t\\t\\t\\t\\t// and that it would _actually_ move\\n\\t\\t\\t\\t\\t// (#4275) We don't bother calling\\n\\t\\t\\t\\t\\t//         indexOf unless we have a new\\n\\t\\t\\t\\t\\t//         position to work with\\n\\t\\t\\t\\t\\tvar currPos = titles.indexOf(title);\\n\\t\\t\\t\\t\\tif(currPos >= 0 && newPos !== currPos) {\\n\\t\\t\\t\\t\\t\\t// move it!\\n\\t\\t\\t\\t\\t\\ttitles.splice(currPos,1);\\n\\t\\t\\t\\t\\t\\tif(newPos >= currPos) {\\n\\t\\t\\t\\t\\t\\t\\tnewPos--;\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\ttitles.splice(newPos,0,title);\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\tvar list = this.getTiddlerList(listTitle);\\n\\tif(!array || array.length === 0) {\\n\\t\\treturn [];\\n\\t} else {\\n\\t\\tvar titles = [], t, title;\\n\\t\\t// First place any entries that are present in the list\\n\\t\\tfor(t=0; t\u003Clist.length; t++) {\\n\\t\\t\\ttitle = list[t];\\n\\t\\t\\tif(array.indexOf(title) !== -1) {\\n\\t\\t\\t\\ttitles.push(title);\\n\\t\\t\\t}\\n\\t\\t}
2731\\n\\t\\t// Then place any remaining entries\\n\\t\\tfor(t=0; t\u003Carray.length; t++) {\\n\\t\\t\\ttitle = array[t];\\n\\t\\t\\tif(list.indexOf(title) === -1) {\\n\\t\\t\\t\\ttitles.push(title);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\t// Finally obey the list-before and list-after fields of each tiddler in turn\\n\\t\\tvar sortedTitles = titles.slice(0);\\n\\t\\tfor(t=0; t\u003CsortedTitles.length; t++) {\\n\\t\\t\\ttitle = sortedTitles[t];\\n\\t\\t\\tmoveItemInList(title);\\n\\t\\t}\\n\\t\\treturn titles;\\n\\t}\\n};\\n\\nexports.getSubTiddler = function(title,subTiddlerTitle) {\\n\\tvar bundleInfo = this.getPluginInfo(title) || this.getTiddlerDataCached(title);\\n\\tif(bundleInfo && bundleInfo.tiddlers) {\\n\\t\\tvar subTiddler = bundleInfo.tiddlers[subTiddlerTitle];\\n\\t\\tif(subTiddler) {\\n\\t\\t\\treturn new $tw.Tiddler(subTiddler);\\n\\t\\t}\\n\\t}\\n\\treturn null;\\n};\\n\\n/*\\nRetrieve a tiddler as a JSON string of the fields\\n*/\\nexports.getTiddlerAsJson = function(title) {\\n\\tvar tiddler = this.getTiddler(title);\\n\\tif(tiddler) {\\n\\t\\tvar fields = Object.create(null);\\n\\t\\t$tw.utils.each(tiddler.fields,function(value,name) {\\n\\t\\t\\tfields[name] = tiddler.getFieldString(name);\\n\\t\\t});\\n\\t\\treturn JSON.stringify(fields);\\n\\t} else {\\n\\t\\treturn JSON.stringify({title: title});\\n\\t}\\n};\\n\\nexports.getTiddlersAsJson = function(filter,spaces) {\\n\\tvar tiddlers = this.filterTiddlers(filter),\\n\\t\\tspaces = (spaces === undefined) ? $tw.config.preferences.jsonSpaces : spaces,\\n\\t\\tdata = [];\\n\\tfor(var t=0;t\u003Ctiddlers.length; t++) {\\n\\t\\tvar tiddler = this.getTiddler(tiddlers[t]);\\n\\t\\tif(tiddler) {\\n\\t\\t\\tvar fields = new Object();\\n\\t\\t\\tfor(var field in tiddler.fields) {\\n\\t\\t\\t\\tfields[field] = tiddler.getFieldString(field);\\n\\t\\t\\t}\\n\\t\\t\\tdata.push(fields);\\n\\t\\t}\\n\\t}\\n\\treturn JSON.stringify(data,null,spaces);\\n};\\n\\n/*\\nGet the content of a tiddler as a JavaScript object. How this is done depends on the type of the tiddler:\\n\\napplication/json: the tiddler JSON is parsed into an object\\napplication/x-tiddler-dictionary: the tiddler is parsed as sequence of name:value pairs\\n\\nOther types currently just return null.\\n\\ntitleOrTiddler: string tiddler title or a t
2731iddler object\\ndefaultData: default data to be returned if the tiddler is missing or doesn't contain data\\n\\nNote that the same value is returned for repeated calls for the same tiddler data. The value is frozen to prevent modification; otherwise modifications would be visible to all callers\\n*/\\nexports.getTiddlerDataCached = function(titleOrTiddler,defaultData) {\\n\\tvar self = this,\\n\\t\\ttiddler = titleOrTiddler;\\n\\tif(!(tiddler instanceof $tw.Tiddler)) {\\n\\t\\ttiddler = this.getTiddler(tiddler);\\n\\t}\\n\\tif(tiddler) {\\n\\t\\treturn this.getCacheForTiddler(tiddler.fields.title,\\\"data\\\",function() {\\n\\t\\t\\t// Return the frozen value\\n\\t\\t\\tvar value = self.getTiddlerData(tiddler.fields.title,undefined);\\n\\t\\t\\t$tw.utils.deepFreeze(value);\\n\\t\\t\\treturn value;\\n\\t\\t}) || defaultData;\\n\\t} else {\\n\\t\\treturn defaultData;\\n\\t}\\n};\\n\\n/*\\nAlternative, uncached version of getTiddlerDataCached(). The return value can be mutated freely and reused\\n*/\\nexports.getTiddlerData = function(titleOrTiddler,defaultData) {\\n\\tvar tiddler = titleOrTiddler,\\n\\t\\tdata;\\n\\tif(!(tiddler instanceof $tw.Tiddler)) {\\n\\t\\ttiddler = this.getTiddler(tiddler);\\n\\t}\\n\\tif(tiddler && tiddler.fields.text) {\\n\\t\\tswitch(tiddler.fields.type) {\\n\\t\\t\\tcase \\\"application/json\\\":\\n\\t\\t\\t\\t// JSON tiddler\\n\\t\\t\\t\\treturn $tw.utils.parseJSONSafe(tiddler.fields.text,defaultData);\\n\\t\\t\\tcase \\\"application/x-tiddler-dictionary\\\":\\n\\t\\t\\t\\treturn $tw.utils.parseFields(tiddler.fields.text);\\n\\t\\t}\\n\\t}\\n\\treturn defaultData;\\n};\\n\\n/*\\nExtract an indexed field from within a data tiddler\\n*/\\nexports.extractTiddlerDataItem = function(titleOrTiddler,index,defaultText) {\\n\\tvar data = this.getTiddlerDataCached(titleOrTiddler,Object.create(null)),\\n\\t\\ttext;\\n\\tif(data && $tw.utils.hop(data,index)) {\\n\\t\\ttext = data[index];\\n\\t}\\n\\tif(typeof text === \\\"string\\\" || typeof text === \\\"number\\\") {\\n\\t\\treturn text.toString();\\n\\t} else {\\n\\t\\treturn defaultText;\\n\\t}\\n};\\n\\n/*\\nSet a tiddlers content to a JavaScript object. Currently this is done by setting the tiddler's type to \\\"application/json\\\" and setting the text to the JSON text of the data.\\ntitle: title of tiddler\\ndata: object that can be serialised to JSON\\nfields: optional hashmap of additional tiddler fields to be set\\noptions: optional hashmap of options including:\\n\\tsuppressTimestamp: if true, don't set the creation/modification timestamps\\n*/\\nexports.setTiddlerData = function(title,data,fields,options) {\\n\\toptions = options || {};\\n\\tvar existingTiddler = this.getTiddler(title),\\n\\t\\tcreationFields = options.suppressTimestamp ? {} : this.getCreationFields(),\\n\\t\\tmodificationFields = options.suppressTimestamp ? {} : this.getModificationFields(),\\n\\t\\tnewFields = {\\n\\t\\t\\ttitle: title\\n\\t\\t};\\n\\tif(existingTiddler && existingTiddler.fields.type === \\\"application/x-tiddler-dictionary\\\") {\\n\\t\\tnewFields.text = $tw.utils.makeTiddlerDictionary(data);\\n\\t} else {\\n\\t\\tnewFields.type = \\\"application/json\\\";\\n\\t\\tnewFields.text = JSON.stringify(data,null,$tw.config.preferences.jsonSpaces);\\n\\t}\\n\\tthis.addTiddler(new $tw.Tiddler(creationFields,existingTiddler,fields,newFields,modificationFields));\\n};\\n\\n/*\\nReturn the content of a tiddler as an array containing each line\\n*/\\nexports.getTiddlerList = function(title,field,index) {\\n\\tif(index) {\\n\\t\\treturn $tw.utils.parseStringArray(this.extractTiddlerDataItem(title,index,\\\"\\\"));\\n\\t}\\n\\tfield = field || \\\"list\\\";\\n\\tvar tiddler = this.getTiddler(title);\\n\\tif(tiddler) {\\n\\t\\treturn ($tw.utils.parseStringArray(tiddler.fields[field]) || []).slice(0);\\n\\t}\\n\\treturn [];\\n};\\n\\n// Return a named global cache object. Global cache objects are cleared whenever a tiddler change occurs\\nexports.getGlobalCache = function(cacheName,initializer) {\\n\\tthis.globalCache = this.globalCache || Object.create(null);\\n\\tif($tw.utils.hop(this.globalCache,cacheName)) {\\n\\t\\treturn this.globalCache[cacheName];\\n\\t} else {\\n\\t\\tthis.globalCache[cacheName] = initializer();\\n\\t\\treturn this.globalCache[cacheName];\\n\\t}\\n};\\n\\nexports.clearGlobalCache = function() {\\n\\tthis.globalCache = Object.create(null);\\n};
2731\\n\\n// Return the named cache object for a tiddler. If the cache doesn't exist then the initializer function is invoked to create it\\nexports.getCacheForTiddler = function(title,cacheName,initializer) {\\n\\tthis.caches = this.caches || Object.create(null);\\n\\tvar caches = this.caches[title];\\n\\tif(caches && caches[cacheName] !== undefined) {\\n\\t\\treturn caches[cacheName];\\n\\t} else {\\n\\t\\tif(!caches) {\\n\\t\\t\\tcaches = Object.create(null);\\n\\t\\t\\tthis.caches[title] = caches;\\n\\t\\t}\\n\\t\\tcaches[cacheName] = initializer();\\n\\t\\treturn caches[cacheName];\\n\\t}\\n};\\n\\n// Clear all caches associated with a particular tiddler, or, if the title is null, clear all the caches for all the tiddlers\\nexports.clearCache = function(title) {\\n\\tif(title) {\\n\\t\\tthis.caches = this.caches || Object.create(null);\\n\\t\\tif($tw.utils.hop(this.caches,title)) {\\n\\t\\t\\tdelete this.caches[title];\\n\\t\\t}\\n\\t} else {\\n\\t\\tthis.caches = Object.create(null);\\n\\t}\\n};\\n\\nexports.initParsers = function(moduleType) {\\n\\t// Install the parser modules\\n\\t$tw.Wiki.parsers = {};\\n\\tvar self = this;\\n\\t$tw.modules.forEachModuleOfType(\\\"parser\\\",function(title,module) {\\n\\t\\tfor(var f in module) {\\n\\t\\t\\tif($tw.utils.hop(module,f)) {\\n\\t\\t\\t\\t$tw.Wiki.parsers[f] = module[f]; // Store the parser class\\n\\t\\t\\t}\\n\\t\\t}\\n\\t});\\n\\t// Use the generic binary parser for any binary types not registered so far\\n\\tif($tw.Wiki.parsers[\\\"application/octet-stream\\\"]) {\\n\\t\\tObject.keys($tw.config.contentTypeInfo).forEach(function(type) {\\n\\t\\t\\tif(!$tw.utils.hop($tw.Wiki.parsers,type) && $tw.config.contentTypeInfo[type].encoding === \\\"base64\\\") {\\n\\t\\t\\t\\t$tw.Wiki.parsers[type] = $tw.Wiki.parsers[\\\"application/octet-stream\\\"];\\n\\t\\t\\t}\\n\\t\\t});\\n\\t}\\n};\\n\\n/*\\nParse a block of text of a specified MIME type\\n\\ttype: content type of text to be parsed\\n\\ttext: text\\n\\toptions: see below\\nOptions include:\\n\\tparseAsInline: if true, the text of the tiddler will be parsed as an inline run\\n\\t_canonical_uri: optional string of the canonical URI of this content\\n*/\\nexports.parseText = function(type,text,options) {\\n\\ttext = text || \\\"\\\";\\n\\toptions = options || {};\\n\\t// Select a parser\\n\\tvar Parser = $tw.Wiki.parsers[type];\\n\\tif(!Parser && $tw.utils.getFileExtensionInfo(type)) {\\n\\t\\tParser = $tw.Wiki.parsers[$tw.utils.getFileExtensionInfo(type).type];\\n\\t}\\n\\tif(!Parser) {\\n\\t\\tParser = $tw.Wiki.parsers[options.defaultType || \\\"text/vnd.tiddlywiki\\\"];\\n\\t}\\n\\tif(!Parser) {\\n\\t\\treturn null;\\n\\t}\\n\\t// Return the parser instance\\n\\treturn new Parser(type,text,{\\n\\t\\tparseAsInline: options.parseAsInline,\\n\\t\\twiki: this,\\n\\t\\t_canonical_uri: options._canonical_uri,\\n\\t\\tconfigTrimWhiteSpace: options.configTrimWhiteSpace\\n\\t});\\n};\\n\\n/*\\nParse a tiddler according to its MIME type\\n*/\\nexports.parseTiddler = function(title,options) {\\n\\toptions = $tw.utils.extend({},options);\\n\\tvar cacheType = options.parseAsInline ? \\\"inlineParseTree\\\" : \\\"blockParseTree\\\",\\n\\t\\ttiddler = this.getTiddler(title),\\n\\t\\tself = this;\\n\\treturn tiddler ? this.getCacheForTiddler(title,cacheType,function() {\\n\\t\\t\\tif(tiddler.hasField(\\\"_canonical_uri\\\")) {\\n\\t\\t\\t\\toptions._canonical_uri = tiddler.fields._canonical_uri;\\n\\t\\t\\t}\\n\\t\\t\\treturn self.parseText(tiddler.fields.type,tiddler.fields.text,options);\\n\\t\\t}) : null;\\n};\\n\\nexports.parseTextReference = function(title,field,index,options) {\\n\\tvar tiddler,\\n\\t\\ttext,\\n\\t\\tparserInfo;\\n\\tif(!options.subTiddler) {\\n\\t\\ttiddler = this.getTiddler(title);\\n\\t\\tif(field === \\\"text\\\" || (!field && !index)) {\\n\\t\\t\\tthis.getTiddlerText(title); // Force the tiddler to be lazily loaded\\n\\t\\t\\treturn this.parseTiddler(title,options);\\n\\t\\t}\\n\\t} \\n\\tparserInfo = this.getTextReferenceParserInfo(title,field,index,options);\\n\\tif(parserInfo.sourceText !== null) {\\n\\t\\treturn this.parseText(parserInfo.parserType,parserInfo.sourceText,options);\\n\\t} else {\\n\\t\\treturn null;\\n\\t}\\n};\\n\\nexports.getTextReferenceParserInfo = function(title,field,index,options) {\\n\\tvar defaultType = options.defaultType || \\\"text/vnd.tiddlywiki\\\",\\n\\t\\ttiddler,\\n\\t\\tparserInfo = {\\n\\t\\t\\tsourceText : null,\\n\\t\\t\\tparserType : defaultType\\n\\t\\t};
2731\\n\\tif(options.subTiddler) {\\n\\t\\ttiddler = this.getSubTiddler(title,options.subTiddler);\\n\\t} else {\\n\\t\\ttiddler = this.getTiddler(title);\\n\\t}\\n\\tif(field === \\\"text\\\" || (!field && !index)) {\\n\\t\\tif(tiddler && tiddler.fields) {\\n\\t\\t\\tparserInfo.sourceText = tiddler.fields.text || \\\"\\\";\\n\\t\\t\\tif(tiddler.fields.type) {\\n\\t\\t\\t\\tparserInfo.parserType = tiddler.fields.type;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t} else if(field) {\\n\\t\\tif(field === \\\"title\\\") {\\n\\t\\t\\tparserInfo.sourceText = title;\\n\\t\\t} else if(tiddler && tiddler.fields) {\\n\\t\\t\\tparserInfo.sourceText = tiddler.hasField(field) ? tiddler.fields[field].toString() : null;\\n\\t\\t}\\n\\t} else if(index) {\\n\\t\\tthis.getTiddlerText(title); // Force the tiddler to be lazily loaded\\n\\t\\tparserInfo.sourceText = this.extractTiddlerDataItem(tiddler,index,null);\\n\\t}\\n\\tif(parserInfo.sourceText === null) {\\n\\t\\tparserInfo.parserType = null;\\n\\t}\\n\\treturn parserInfo;\\n}\\n\\n/*\\nParse a block of text of a specified MIME type\\n\\ttext: text on which to perform substitutions\\n\\twidget\\n\\toptions: see below\\nOptions include:\\n\\tsubstitutions: an optional array of substitutions\\n*/\\nexports.getSubstitutedText = function(text,widget,options) {\\n\\toptions = options || {};\\n\\ttext = text || \\\"\\\";\\n\\tvar self = this,\\n\\t\\tsubstitutions = options.substitutions || [],\\n\\t\\toutput;\\n\\t// Evaluate embedded filters and substitute with first result\\n\\toutput = text.replace(/\\\\$\\\\{([\\\\S\\\\s]+?)\\\\}\\\\$/g, function(match,filter) {\\n\\t\\treturn self.filterTiddlers(filter,widget)[0] || \\\"\\\";\\n\\t});\\n\\t// Process any substitutions provided in options\\n\\t$tw.utils.each(substitutions,function(substitute) {\\n\\t\\toutput = $tw.utils.replaceString(output,new RegExp(\\\"\\\\\\\\$\\\" + $tw.utils.escapeRegExp(substitute.name) + \\\"\\\\\\\\$\\\",\\\"mg\\\"),substitute.value);\\n\\t});\\n\\t// Substitute any variable references with their values\\n\\treturn output.replace(/\\\\$\\\\(([^\\\\)\\\\$]+)\\\\)\\\\$/g, function(match,varname) {\\n\\t\\treturn widget.getVariable(varname,{defaultValue: \\\"\\\"})\\n\\t});\\n};\\n\\n/*\\nMake a widget tree for a parse tree\\nparser: parser object\\noptions: see below\\nOptions include:\\ndocument: optional document to use\\nvariables: hashmap of variables to set\\nparentWidget: optional parent widget for the root node\\n*/\\nexports.makeWidget = function(parser,options) {\\n\\toptions = options || {};\\n\\tvar widgetNode = {\\n\\t\\t\\ttype: \\\"widget\\\",\\n\\t\\t\\tchildren: []\\n\\t\\t},\\n\\t\\tcurrWidgetNode = widgetNode;\\n\\t// Create let variable widget for variables\\n\\tif($tw.utils.count(options.variables) > 0) {\\n\\t\\tvar letVariableWidget = {\\n\\t\\t\\ttype: \\\"let\\\",\\n\\t\\t\\tattributes: {\\n\\t\\t\\t},\\n\\t\\t\\tchildren: []\\n\\t\\t};\\n\\t\\t$tw.utils.each(options.variables,function(value,name) {\\n\\t\\t\\t$tw.utils.addAttributeToParseTreeNode(letVariableWidget,name,\\\"\\\" + value);\\n\\t\\t});\\n\\t\\tcurrWidgetNode.children = [letVariableWidget];\\n\\t\\tcurrWidgetNode = letVariableWidget;\\n\\t}\\n\\t// Add in the supplied parse tree nodes\\n\\tcurrWidgetNode.children = parser ? parser.tree : [];\\n\\t// Create the widget\\n\\treturn new widget.widget(widgetNode,{\\n\\t\\twiki: this,\\n\\t\\tdocument: options.document || $tw.fakeDocument,\\n\\t\\tparentWidget: options.parentWidget\\n\\t});\\n};\\n\\n/*\\nMake a widget tree for transclusion\\ntitle: target tiddler title\\noptions: as for wiki.makeWidget() plus:\\noptions.field: optional field to transclude (defaults to \\\"text\\\")\\noptions.mode: transclusion mode \\\"inline\\\" or \\\"block\\\"\\noptions.recursionMarker : optional flag to set a recursion marker, defaults to \\\"yes\\\"\\noptions.children: optional array of children for the transclude widget\\noptions.importVariables: optional importvariables filter string for macros to be included\\noptions.importPageMacros: optional boolean; if true, equivalent to passing \\\"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\\\" to options.importVariables\\n*/\\nexports.makeTranscludeWidget = function(title,options) {\\n\\toptions = options || {};\\n\\tvar parseTreeDiv = {tree: [{\\n\\t\\t\\ttype: \\\"element\\\",\\n\\t\\t\\ttag: \\\"div\\\",\\n\\t\\t\\tchildren: []}]},\\n\\t\\tparseTreeImportVariables = {\\n\\t\\t\\ttype: \\\"importvariables\\\",\\n\\t\\t\\tattributes: {\\n\\t\\t\\t\\tfilter: {\\n\\t\\t\\t\\t\\tname: \\\"filter\\\",\\n\\t\\t\\t\\t\\ttype: \\\"string\\\"\\n\\t\\t\\t\\t}\\n\\t\\t\\t},\\n\\t\\t\\tisBlock: false,\\n\\t\\t\\tchildren: []},\\n\\t\\tparseTreeTransclude = {\\n\\t\\t\\ttype: \\\"transclude\\\",\\n\\t\\t\\tattributes: {\\n\\t\\t\\t\\trecursionMarker: {\\n\\t\\t\\t\\t\\tname: \\\"recursionMarker\\\",\\n\\t\\t\\t\\t\\ttype: \\\"string\\\",\\n\\t\\t\\t\\t\\tvalue: options.recursionMarker || \\\"yes\\\"\\n\\t\\t\\t\\t\\t},\\n\\t\\t\\t\\ttiddler: {\\n\\t\\t\\t\\t\\tname: \\\"tiddler\\\",\\n\\t\\t\\t\\t\\ttype: \\\"string\\\",\\n\\t\\t\\t\\t\\tvalue: title\\n\\t\\t\\t\\t}\\n\\t\\t\\t},\\n\\t\\t\\tisBlock: !options.parseAsInline};\\n\\tif(options.importVariables || options.importPageMacros) {\\n\\t\\tif(options.importVariables) {\\n\\t\\t\\tparseTreeImportVariables.attributes.filter.value = options.importVariables;\\n\\t\\t} else if(options.importPageMacros) {\\n\\t\\t\\tparseTreeImportVariables.attributes.filter.value = this.getTiddlerText(\\\"$:/core/config/GlobalImportFilter\\\");\\n\\t\\t}\\n\\t\\tparseTreeDiv.tree[0].children.push(parseTreeImportVariables);\\n\\t\\tparseTreeImportVariables.children.push(parseTreeTransclude);\\n\\t} else {\\n\\t\\tparseTreeDiv.tree[0].children.push(parseTreeTransclude);\\n\\t}\\n\\tif(options.field) {\\n\\t\\tparseTreeTransclude.attributes.field = {type: \\\"string\\\", value: options.field};\\n\\t}\\n\\tif(options.mode) {\\n\\t\\tparseTreeTransclude.attributes.mode = {type: \\\"string\\\", value: options.mode};\\n\\t}\\n\\tif(options.children) {\\n\\t\\tparseTreeTransclude.children = options.children;\\n\\t}\\n\\treturn this.makeWidget(parseTreeDiv,options);\\n};
2731\\n\\n/*\\nParse text in a specified format and render it into another format\\n\\toutputType: content type for the output\\n\\ttextType: content type of the input text\\n\\ttext: input text\\n\\toptions: see below\\nOptions include:\\nvariables: hashmap of variables to set\\nparentWidget: optional parent widget for the root node\\n*/\\nexports.renderText = function(outputType,textType,text,options) {\\n\\toptions = options || {};\\n\\tvar parser = this.parseText(textType,text,options),\\n\\t\\twidgetNode = this.makeWidget(parser,options);\\n\\tvar container = $tw.fakeDocument.createElement(\\\"div\\\");\\n\\twidgetNode.render(container,null);\\n\\treturn outputType === \\\"text/html\\\" ? container.innerHTML : container.textContent;\\n};\\n\\n/*\\nParse text from a tiddler and render it into another format\\n\\toutputType: content type for the output\\n\\ttitle: title of the tiddler to be rendered\\n\\toptions: see below\\nOptions include:\\nvariables: hashmap of variables to set\\nparentWidget: optional parent widget for the root node\\n*/\\nexports.renderTiddler = function(outputType,title,options) {\\n\\toptions = options || {};\\n\\tvar parser = this.parseTiddler(title,options),\\n\\t\\twidgetNode = this.makeWidget(parser,options);\\n\\tvar container = $tw.fakeDocument.createElement(\\\"div\\\");\\n\\twidgetNode.render(container,null);\\n\\treturn outputType === \\\"text/html\\\" ? container.innerHTML : (outputType === \\\"text/plain-formatted\\\" ? container.formattedTextContent : container.textContent);\\n};\\n\\n/*\\nReturn an array of tiddler titles that match a search string\\n\\ttext: The text string to search for\\n\\toptions: see below\\nOptions available:\\n\\tsource: an iterator function for the source tiddlers, called source(iterator),\\n\\t\\twhere iterator is called as iterator(tiddler,title)\\n\\texclude: An array of tiddler titles to exclude from the search\\n\\tinvert: If true returns tiddlers that do not contain the specified string\\n\\tcaseSensitive: If true forces a case sensitive search\\n\\tfield: If specified, restricts the search to the specified field, or an array of field names\\n\\tanchored: If true, forces all but regexp searches to be anchored to the start of text\\n\\texcludeField: If true, the field options are inverted to specify the fields that are not to be searched\\n\\n\\tThe search mode is determined by the first of these boolean flags to be true\\n\\t\\tliteral: searches for literal string\\n\\t\\twhitespace: same as literal except runs of whitespace are treated as a single space\\n\\t\\tregexp: treats the search term as a regular expression\\n\\t\\twords: (default) treats search string as a list of tokens, and matches if all tokens are found, \\n\\t\\t\\tregardless of adjacency or ordering\\n\\t\\tsome: treats search string as a list of tokens, and matches if at least ONE token is found\\n*/\\nexports.search = function(text,options) {\\n\\toptions = options || {};\\n\\tvar self = this,\\n\\t\\tt,\\n\\t\\tregExpStr=\\\"\\\",\\n\\t\\tinvert = !!options.invert;\\n\\t// Convert the search string into a regexp for each term\\n\\tvar terms, searchTermsRegExps,\\n\\t\\tflags = options.caseSensitive ? \\\"\\\" : \\\"i\\\",\\n\\t\\tanchor = options.anchored ? \\\"^\\\" : \\\"\\\";\\n\\tif(options.literal) {\\n\\t\\tif(text.length === 0) {\\n\\t\\t\\tsearchTermsRegExps = null;\\n\\t\\t} else {\\n\\t\\t\\tsearchTermsRegExps = [new RegExp(\\\"(\\\" + anchor + $tw.utils.escapeRegExp(text) + \\\")\\\",flags)];\\n\\t\\t}\\n\\t} else if(options.whitespace) {\\n\\t\\tterms = [];\\n\\t\\t$tw.utils.each(text.split(/\\\\s+/g),function(term) {\\n\\t\\t\\tif(term) {\\n\\t\\t\\t\\tterms.push($tw.utils.escapeRegExp(term));\\n\\t\\t\\t}\\n\\t\\t});
2731\\n\\t\\tsearchTermsRegExps = [new RegExp(\\\"(\\\" + anchor + terms.join(\\\"\\\\\\\\s+\\\") + \\\")\\\",flags)];\\n\\t} else if(options.regexp) {\\n\\t\\ttry {\\n\\t\\t\\tsearchTermsRegExps = [new RegExp(\\\"(\\\" + text + \\\")\\\",flags)];\\n\\t\\t} catch(e) {\\n\\t\\t\\tsearchTermsRegExps = null;\\n\\t\\t\\tconsole.log(\\\"Regexp error parsing /(\\\" + text + \\\")/\\\" + flags + \\\": \\\",e);\\n\\t\\t}\\n\\t} else if(options.some) {\\n\\t\\tterms = text.trim().split(/ +/);\\n\\t\\tif(terms.length === 1 && terms[0] === \\\"\\\") {\\n\\t\\t\\tsearchTermsRegExps = null;\\n\\t\\t} else {\\n\\t\\t\\tsearchTermsRegExps = [];\\n\\t\\t\\tfor(t=0; t\u003Cterms.length; t++) {\\n\\t\\t\\t\\tregExpStr += (t===0) ? anchor + $tw.utils.escapeRegExp(terms[t]) : \\\"|\\\" + anchor + $tw.utils.escapeRegExp(terms[t]);\\n\\t\\t\\t}\\n\\t\\t\\tsearchTermsRegExps.push(new RegExp(\\\"(\\\" + regExpStr + \\\")\\\",flags));\\n\\t\\t}\\n\\t} else { // default: words\\n\\t\\tterms = text.split(/ +/);\\n\\t\\tif(terms.length === 1 && terms[0] === \\\"\\\") {\\n\\t\\t\\tsearchTermsRegExps = null;\\n\\t\\t} else {\\n\\t\\t\\tsearchTermsRegExps = [];\\n\\t\\t\\tfor(t=0; t\u003Cterms.length; t++) {\\n\\t\\t\\t\\tsearchTermsRegExps.push(new RegExp(\\\"(\\\" + anchor + $tw.utils.escapeRegExp(terms[t]) + \\\")\\\",flags));\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n// Accumulate the array of fields to be searched or excluded from the search\\n\\tvar fields = [];\\n\\tif(options.field) {\\n\\t\\tif($tw.utils.isArray(options.field)) {\\n\\t\\t\\t$tw.utils.each(options.field,function(fieldName) {\\n\\t\\t\\t\\tif(fieldName) {\\n\\t\\t\\t\\t\\tfields.push(fieldName);\\n\\t\\t\\t\\t}\\n\\t\\t\\t});\\n\\t\\t} else {\\n\\t\\t\\tfields.push(options.field);\\n\\t\\t}\\n\\t}\\n\\t// Use default fields if none specified and we're not excluding fields (excluding fields with an empty field array is the same as searching all fields)\\n\\tif(fields.length === 0 && !options.excludeField) {\\n\\t\\tfields.push(\\\"title\\\");\\n\\t\\tfields.push(\\\"tags\\\");\\n\\t\\tfields.push(\\\"text\\\");\\n\\t}\\n\\t// Function to check a given tiddler for the search term\\n\\tvar searchTiddler = function(title) {\\n\\t\\tif(!searchTermsRegExps) {\\n\\t\\t\\treturn true;\\n\\t\\t}\\n\\t\\tvar notYetFound = searchTermsRegExps.slice();\\n\\n\\t\\tvar tiddler = self.getTiddler(title);\\n\\t\\tif(!tiddler) {\\n\\t\\t\\ttiddler = new $tw.Tiddler({title: title, text: \\\"\\\", type: \\\"text/vnd.tiddlywiki\\\"});\\n\\t\\t}\\n\\t\\tvar contentTypeInfo = $tw.config.contentTypeInfo[tiddler.fields.type] || $tw.config.contentTypeInfo[\\\"text/vnd.tiddlywiki\\\"],\\n\\t\\t\\tsearchFields;\\n\\t\\t// Get the list of fields we're searching\\n\\t\\tif(options.excludeField) {\\n\\t\\t\\tsearchFields = Object.keys(tiddler.fields);\\n\\t\\t\\t$tw.utils.each(fields,function(fieldName) {\\n\\t\\t\\t\\tvar p = searchFields.indexOf(fieldName);\\n\\t\\t\\t\\tif(p !== -1) {\\n\\t\\t\\t\\t\\tsearchFields.splice(p,1);\\n\\t\\t\\t\\t}\\n\\t\\t\\t});\\n\\t\\t} else {\\n\\t\\t\\tsearchFields = fields;\\n\\t\\t}\\n\\t\\tfor(var fieldIndex=0; notYetFound.length>0 && fieldIndex\u003CsearchFields.length; fieldIndex++) {\\n\\t\\t\\t// Don't search the text field if the content type is binary\\n\\t\\t\\tvar fieldName = searchFields[fieldIndex];\\n\\t\\t\\tif(fieldName === \\\"text\\\" && contentTypeInfo.encoding !== \\\"utf8\\\") {\\n\\t\\t\\t\\tbreak;\\n\\t\\t\\t}\\n\\t\\t\\tvar str = tiddler.fields[fieldName],\\n\\t\\t\\t\\tt;\\n\\t\\t\\tif(str) {\\n\\t\\t\\t\\tif($tw.utils.isArray(str)) {\\n\\t\\t\\t\\t\\t// If the field value is an array, test each regexp against each field array entry and fail if each regexp doesn't match at least one field array entry\\n\\t\\t\\t\\t\\tfor(var s=0; s\u003Cstr.length; s++) {\\n\\t\\t\\t\\t\\t\\tfor(t=0; t\u003CnotYetFound.length;) {\\n\\t\\t\\t\\t\\t\\t\\tif(notYetFound[t].test(str[s])) {\\n\\t\\t\\t\\t\\t\\t\\t\\tnotYetFound.splice(t, 1);\\n\\t\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\t\\tt++;\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t// If the field isn't an array, force it to a string and test each regexp against it and fail if any do not match\\n\\t\\t\\t\\t\\tstr = tiddler.getFieldString(fieldName);\\n\\t\\t\\t\\t\\tfor(t=0; t\u003CnotYetFound.length;) {\\n\\t\\t\\t\\t\\t\\tif(notYetFound[t].test(str)) {\\n\\t\\t\\t\\t\\t\\t\\tnotYetFound.splice(t, 1);\\n\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\tt++;\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t};\\n\\t\\treturn notYetFound.length == 0;\\n\\t};\\n\\t// Loop through all the tiddlers doing the search\\n\\tvar results = [],\\n\\t\\t
2731source = options.source || this.each;\\n\\tsource(function(tiddler,title) {\\n\\t\\tif(searchTiddler(title) !== invert) {\\n\\t\\t\\tresults.push(title);\\n\\t\\t}\\n\\t});\\n\\t// Remove any of the results we have to exclude\\n\\tif(options.exclude) {\\n\\t\\tfor(t=0; t\u003Coptions.exclude.length; t++) {\\n\\t\\t\\tvar p = results.indexOf(options.exclude[t]);\\n\\t\\t\\tif(p !== -1) {\\n\\t\\t\\t\\tresults.splice(p,1);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\treturn results;\\n};\\n\\n/*\\nTrigger a load for a tiddler if it is skinny. Returns the text, or undefined if the tiddler is missing, null if the tiddler is being lazily loaded.\\n*/\\nexports.getTiddlerText = function(title,defaultText) {\\n\\tvar tiddler = this.getTiddler(title);\\n\\t// Return undefined if the tiddler isn't found\\n\\tif(!tiddler) {\\n\\t\\treturn defaultText;\\n\\t}\\n\\tif(!tiddler.hasField(\\\"_is_skinny\\\")) {\\n\\t\\t// Just return the text if we've got it\\n\\t\\treturn tiddler.fields.text || \\\"\\\";\\n\\t} else {\\n\\t\\t// Tell any listeners about the need to lazily load this tiddler\\n\\t\\tthis.dispatchEvent(\\\"lazyLoad\\\",title);\\n\\t\\t// Indicate that the text is being loaded\\n\\t\\treturn null;\\n\\t}\\n};\\n\\n/*\\nCheck whether the text of a tiddler matches a given value. By default, the comparison is case insensitive, and any spaces at either end of the tiddler text is trimmed\\n*/\\nexports.checkTiddlerText = function(title,targetText,options) {\\n\\toptions = options || {};\\n\\tvar text = this.getTiddlerText(title,\\\"\\\");\\n\\tif(!options.noTrim) {\\n\\t\\ttext = text.trim();\\n\\t}\\n\\tif(!options.caseSensitive) {\\n\\t\\ttext = text.toLowerCase();\\n\\t\\ttargetText = targetText.toLowerCase();\\n\\t}\\n\\treturn text === targetText;\\n}\\n\\n/*\\nExecute an action string without an associated context widget\\n*/\\nexports.invokeActionString = function(actions,event,variables,options) {\\n\\tvar widget = this.makeWidget(null,{parentWidget: options.parentWidget});\\n\\twidget.invokeActionString(actions,null,event,variables);\\n};\\n\\n/*\\nRead an array of browser File objects, invoking callback(tiddlerFieldsArray) once they're all read\\n*/\\nexports.readFiles = function(files,options) {\\n\\tvar callback;\\n\\tif(typeof options === \\\"function\\\") {\\n\\t\\tcallback = options;\\n\\t\\toptions = {};\\n\\t} else {\\n\\t\\tcallback = options.callback;\\n\\t}\\n\\tvar result = [],\\n\\t\\toutstanding = files.length,\\n\\t\\treadFileCallback = function(tiddlerFieldsArray) {\\n\\t\\t\\tresult.push.apply(result,tiddlerFieldsArray);\\n\\t\\t\\tif(--outstanding === 0) {\\n\\t\\t\\t\\tcallback(result);\\n\\t\\t\\t}\\n\\t\\t};\\n\\tfor(var f=0; f\u003Cfiles.length; f++) {\\n\\t\\tthis.readFile(files[f],$tw.utils.extend({},options,{callback: readFileCallback}));\\n\\t}\\n\\treturn files.length;\\n};\\n\\n/*\\nRead a browser File object, invoking callback(tiddlerFieldsArray) with an array of tiddler fields objects\\n*/\\nexports.readFile = function(file,options) {\\n\\tvar callback;\\n\\tif(typeof options === \\\"function\\\") {\\n\\t\\tcallback = options;\\n\\t\\toptions = {};\\n\\t} else {\\n\\t\\tcallback = options.callback;\\n\\t}\\n\\t// Get the type, falling back to the filename extension\\n\\tvar self = this,\\n\\t\\ttype = file.type;\\n\\tif(type === \\\"\\\" || !type) {\\n\\t\\tvar dotPos = file.name.lastIndexOf(\\\".\\\");\\n\\t\\tif(dotPos !== -1) {\\n\\t\\t\\tvar fileExtensionInfo = $tw.utils.getFileExtensionInfo(file.name.substr(dotPos));\\n\\t\\t\\tif(fileExtensionInfo) {\\n\\t\\t\\t\\ttype = fileExtensionInfo.type;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\t// Figure out if we're reading a binary file\\n\\tvar contentTypeInfo = $tw.config.contentTypeInfo[type],\\n\\t\\tisBinary = contentTypeInfo ? contentTypeInfo.encoding === \\\"base64\\\" : false;\\n\\t// Log some debugging information\\n\\tif($tw.log.IMPORT) {\\n\\t\\tconsole.log(\\\"Importing file '\\\" + file.name + \\\"', type: '\\\" + type + \\\"', isBinary: \\\" + isBinary);\\n\\t}\\n\\t// Give the hook a chance to process the drag\\n\\tif($tw.hooks.invokeHook(\\\"th-importing-file\\\",{\\n\\t\\tfile: file,\\n\\t\\ttype: type,\\n\\t\\tisBinary: isBinary,\\n\\t\\tcallback: callback\\n\\t}) !== true) {\\n\\t\\tthis.readFileContent(file,type,isBinary,options.deserializer,callback);\\n\\t}\\n};
2731\\n\\n/*\\nLower level utility to read the content of a browser File object, invoking callback(tiddlerFieldsArray) with an array of tiddler fields objects\\n*/\\nexports.readFileContent = function(file,type,isBinary,deserializer,callback) {\\n\\tvar self = this;\\n\\t// Create the FileReader\\n\\tvar reader = new FileReader();\\n\\t// Onload\\n\\treader.onload = function(event) {\\n\\t\\tvar text = event.target.result,\\n\\t\\t\\ttiddlerFields = {title: file.name || \\\"Untitled\\\"};\\n\\t\\tif(isBinary) {\\n\\t\\t\\tvar commaPos = text.indexOf(\\\",\\\");\\n\\t\\t\\tif(commaPos !== -1) {\\n\\t\\t\\t\\ttext = text.substr(commaPos + 1);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\t// Check whether this is an encrypted TiddlyWiki file\\n\\t\\tvar encryptedJson = $tw.utils.extractEncryptedStoreArea(text);\\n\\t\\tif(encryptedJson) {\\n\\t\\t\\t// If so, attempt to decrypt it with the current password\\n\\t\\t\\t$tw.utils.decryptStoreAreaInteractive(encryptedJson,function(tiddlers) {\\n\\t\\t\\t\\tcallback(tiddlers);\\n\\t\\t\\t});\\n\\t\\t} else {\\n\\t\\t\\t// Otherwise, just try to deserialise any tiddlers in the file\\n\\t\\t\\tcallback(self.deserializeTiddlers(type,text,tiddlerFields,{deserializer: deserializer}));\\n\\t\\t}\\n\\t};\\n\\t// Kick off the read\\n\\tif(isBinary) {\\n\\t\\treader.readAsDataURL(file);\\n\\t} else {\\n\\t\\treader.readAsText(file);\\n\\t}\\n};\\n\\n/*\\nFind any existing draft of a specified tiddler\\n*/\\nexports.findDraft = function(targetTitle) {\\n\\tvar draftTitle = undefined;\\n\\tthis.forEachTiddler({includeSystem: true},function(title,tiddler) {\\n\\t\\tif(tiddler.fields[\\\"draft.title\\\"] && tiddler.fields[\\\"draft.of\\\"] === targetTitle) {\\n\\t\\t\\tdraftTitle = title;\\n\\t\\t}\\n\\t});\\n\\treturn draftTitle;\\n}\\n\\n/*\\nCheck whether the specified draft tiddler has been modified.\\nIf the original tiddler doesn't exist, create  a vanilla tiddler variable,\\nto check if additional fields have been added.\\n*/\\nexports.isDraftModified = function(title) {\\n\\tvar tiddler = this.getTiddler(title);\\n\\tif(!tiddler.isDraft()) {\\n\\t\\treturn false;\\n\\t}\\n\\tvar ignoredFields = [\\\"created\\\", \\\"modified\\\", \\\"title\\\", \\\"draft.title\\\", \\\"draft.of\\\"],\\n\\t\\torigTiddler = this.getTiddler(tiddler.fields[\\\"draft.of\\\"]) || new $tw.Tiddler({text:\\\"\\\", tags:[]}),\\n\\t\\ttitleModified = tiddler.fields[\\\"draft.title\\\"] !== tiddler.fields[\\\"draft.of\\\"];\\n\\treturn titleModified || !tiddler.isEqual(origTiddler,ignoredFields);\\n};\\n\\n/*\\nAdd a new record to the top of the history stack\\ntitle: a title string or an array of title strings\\nfromPageRect: page coordinates of the origin of the navigation\\nhistoryTitle: title of history tiddler (defaults to $:/HistoryList)\\n*/\\nexports.addToHistory = function(title,fromPageRect,historyTitle) {\\n\\tvar story = new $tw.Story({wiki: this, historyTitle: historyTitle});\\n\\tstory.addToHistory(title,fromPageRect);\\n\\tconsole.log(\\\"$tw.wiki.addToHistory() is deprecated since V5.1.23! Use the this.story.addToHistory() from the story-object!\\\")\\n};\\n\\n/*\\nAdd a new tiddler to the story river\\ntitle: a title string or an array of title strings\\nfromTitle: the title of the tiddler from which the navigation originated\\nstoryTitle: title of story tiddler (defaults to $:/StoryList)\\noptions: see story.js\\n*/\\nexports.addToStory = function(title,fromTitle,storyTitle,options) {\\n\\tvar story = new $tw.Story({wiki: this, storyTitle: storyTitle});\\n\\tstory.addToStory(title,fromTitle,options);\\n\\tconsole.log(\\\"$tw.wiki.addToStory() is deprecated since V5.1.23! Use the this.story.addToStory() from the story-object!\\\")\\n};\\n\\n/*\\nGenerate a title for the draft of a given tiddler\\n*/\\nexports.generateDraftTitle = function(title) {\\n\\tvar c = 0,\\n\\t\\tdraftTitle,\\n\\t\\tusername = this.getTiddlerText(\\\"$:/status/UserName\\\"),\\n\\t\\tattribution = username ? \\\" by \\\" + username : \\\"\\\";\\n\\tdo {\\n\\t\\tdraftTitle = \\\"Draft \\\" + (c ? (c + 1) + \\\" \\\" : \\\"\\\") + \\\"of '\\\" + title + \\\"'\\\" + attribution;\\n\\t\\tc++;\\n\\t} while(this.tiddlerExists(draftTitle));\\n\\treturn draftTitle;\\n};
2731\\n\\n/*\\nInvoke the available upgrader modules\\ntitles: array of tiddler titles to be processed\\ntiddlers: hashmap by title of tiddler fields of pending import tiddlers. These can be modified by the upgraders. An entry with no fields indicates a tiddler that was pending import has been suppressed. When entries are added to the pending import the tiddlers hashmap may have entries that are not present in the titles array\\nReturns a hashmap of messages keyed by tiddler title.\\n*/\\nexports.invokeUpgraders = function(titles,tiddlers) {\\n\\t// Collect up the available upgrader modules\\n\\tvar self = this;\\n\\tif(!this.upgraderModules) {\\n\\t\\tthis.upgraderModules = [];\\n\\t\\t$tw.modules.forEachModuleOfType(\\\"upgrader\\\",function(title,module) {\\n\\t\\t\\tif(module.upgrade) {\\n\\t\\t\\t\\tself.upgraderModules.push(module);\\n\\t\\t\\t}\\n\\t\\t});\\n\\t}\\n\\t// Invoke each upgrader in turn\\n\\tvar messages = {};\\n\\tfor(var t=0; t\u003Cthis.upgraderModules.length; t++) {\\n\\t\\tvar upgrader = this.upgraderModules[t],\\n\\t\\t\\tupgraderMessages = upgrader.upgrade(this,titles,tiddlers);\\n\\t\\t$tw.utils.extend(messages,upgraderMessages);\\n\\t}\\n\\treturn messages;\\n};\\n\\n// Determine whether a plugin by title is dynamically loadable\\nexports.doesPluginRequireReload = function(title) {\\n\\tvar tiddler = this.getTiddler(title);\\n\\tif(tiddler && tiddler.fields.type === \\\"application/json\\\" && tiddler.fields[\\\"plugin-type\\\"]) {\\n\\t\\tif(tiddler.fields[\\\"plugin-type\\\"] === \\\"import\\\") {\\n\\t\\t\\t// The import plugin never requires reloading\\n\\t\\t\\treturn false;\\n\\t\\t}\\n\\t}\\n\\treturn this.doesPluginInfoRequireReload(this.getPluginInfo(title) || this.getTiddlerDataCached(title));\\n};\\n\\n// Determine whether a plugin info structure is dynamically loadable\\nexports.doesPluginInfoRequireReload = function(pluginInfo) {\\n\\tif(pluginInfo) {\\n\\t\\tvar foundModule = false;\\n\\t\\t$tw.utils.each(pluginInfo.tiddlers,function(tiddler) {\\n\\t\\t\\tif(tiddler.type === \\\"application/javascript\\\" && $tw.utils.hop(tiddler,\\\"module-type\\\")) {\\n\\t\\t\\t\\tfoundModule = true;\\n\\t\\t\\t}\\n\\t\\t});\\n\\t\\treturn foundModule;\\n\\t} else {\\n\\t\\treturn null;\\n\\t}\\n};\\n\\nexports.slugify = function(title,options) {\\n\\tvar tiddler = this.getTiddler(title),\\n\\t\\tslug;\\n\\tif(tiddler && tiddler.fields.slug) {\\n\\t\\tslug = tiddler.fields.slug;\\n\\t} else {\\n\\t\\tslug = $tw.utils.transliterate(title.toString().toLowerCase()) // Replace diacritics with basic lowercase ASCII\\n\\t\\t\\t.replace(/\\\\s+/g,\\\"-\\\")                                       // Replace spaces with -\\n\\t\\t\\t.replace(/[^\\\\w\\\\-\\\\.]+/g,\\\"\\\")                                 // Remove all non-word chars except dash and dot\\n\\t\\t\\t.replace(/\\\\-\\\\-+/g,\\\"-\\\")                                     // Replace multiple - with single -\\n\\t\\t\\t.replace(/^-+/,\\\"\\\")                                         // Trim - from start of text\\n\\t\\t\\t.replace(/-+$/,\\\"\\\");                                        // Trim - from end of text\\n\\t}\\n\\t// If the resulting slug is blank (eg because the title is just punctuation characters)\\n\\tif(!slug) {\\n\\t\\t// ...then just use the character codes of the title\\n\\t\\tvar result = [];\\n\\t\\t$tw.utils.each(title.split(\\\"\\\"),function(char) {\\n\\t\\t\\tresult.push(char.charCodeAt(0).toString());\\n\\t\\t});
2731\\n\\t\\tslug = result.join(\\\"-\\\");\\n\\t}\\n\\treturn slug;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"wikimethod\"},\"$:/palettes/Blanca\":{\"title\":\"$:/palettes/Blanca\",\"name\":\"Blanca\",\"color-scheme\":\"light\",\"description\":\"A clean white palette to let you focus\",\"tags\":\"$:/tags/Palette\",\"type\":\"application/x-tiddler-dictionary\",\"text\":\"alert-background: #ffe476\\nalert-border: #b99e2f\\nalert-highlight: #881122\\nalert-muted-foreground: #b99e2f\\nbackground: #ffffff\\nblockquote-bar: \u003C\u003Ccolour muted-foreground>>\\nbutton-background:\\nbutton-foreground:\\nbutton-border:\\ncode-background: #f7f7f9\\ncode-border: #e1e1e8\\ncode-foreground: #dd1144\\ndirty-indicator: #ff0000\\ndownload-background: #66cccc\\ndownload-foreground: \u003C\u003Ccolour background>>\\ndragger-background: \u003C\u003Ccolour foreground>>\\ndragger-foreground: \u003C\u003Ccolour background>>\\ndropdown-background: \u003C\u003Ccolour background>>\\ndropdown-border: \u003C\u003Ccolour muted-foreground>>\\ndropdown-tab-background-selected: #fff\\ndropdown-tab-background: #ececec\\ndropzone-background: rgba(0,200,0,0.7)\\nexternal-link-background-hover: inherit\\nexternal-link-background-visited: inherit\\nexternal-link-background: inherit\\nexternal-link-foreground-hover: inherit\\nexternal-link-foreground-visited: #0000aa\\nexternal-link-foreground: #0000ee\\nforeground: #333333\\nhighlight-background: #ffff00\\nhighlight-foreground: #000000\\nmessage-background: #ecf2ff\\nmessage-border: #cfd6e6\\nmessage-foreground: #547599\\nmodal-backdrop: \u003C\u003Ccolour foreground>>\\nmodal-background: \u003C\u003Ccolour background>>\\nmodal-border: #999999\\nmodal-footer-background: #f5f5f5\\nmodal-footer-border: #dddddd\\nmodal-header-border: #eeeeee\\nmuted-foreground: #999999\\nnotification-background: #ffffdd\\nnotification-border: #999999\\npage-background: #ffffff\\npre-background: #f5f5f5\\npre-border: #cccccc\\nprimary: #7897f3\\nselect-tag-background:\\nselect-tag-foreground:\\nsidebar-button-foreground: \u003C\u003Ccolour foreground>>\\nsidebar-controls-foreground-hover: #000000\\nsidebar-controls-foreground: #ccc\\nsidebar-foreground-shadow: rgba(255,255,255, 0.8)\\nsidebar-foreground: #acacac\\nsidebar-muted-foreground-hover: #444444\\nsidebar-muted-foreground: #c0c0c0\\nsidebar-tab-background-selected: #ffffff\\nsidebar-tab-background: \u003C\u003Ccolour tab-background>>\\nsidebar-tab-border-selected: \u003C\u003Ccolour tab-border-selected>>\\nsidebar-tab-border: \u003C\u003Ccolour tab-border>>\\nsidebar-tab-divider: \u003C\u003Ccolour tab-divider>>\\nsidebar-tab-foreground-selected: \\nsidebar-tab-foreground: \u003C\u003Ccolour tab-foreground>>\\nsidebar-tiddler-link-foreground-hover: #444444\\nsidebar-tiddler-link-foreground: #7897f3\\nsite-title-foreground: \u003C\u003Ccolour tiddler-title-foreground>>\\nstatic-alert-foreground: #aaaaaa\\ntab-background-selected: #ffffff\\ntab-background: #eeeeee\\ntab-border-selected: #cccccc\\ntab-border: #cccccc\\ntab-divider: #d8d8d8\\ntab-foreground-selected: \u003C\u003Ccolour tab-foreground>>\\ntab-foreground: #666666\\ntable-border: #dddddd\\ntable-footer-background: #a8a8a8\\ntable-header-background: #f0f0f0\\ntag-background: #ffeedd\\ntag-foreground: #000\\ntiddler-background: \u003C\u003Ccolour background>>\\ntiddler-border: #eee\\ntiddler-controls-foreground-hover: #888888\\ntiddler-controls-foreground-selected: #444444\\ntiddler-controls-foreground: #cccccc\\ntiddler-editor-background: #f8f8f8\\ntiddler-editor-border-image: #ffffff\\ntiddler-editor-border: #cccccc\\ntiddler-editor-fields-even: #e0e8e0\\ntiddler-editor-fields-odd: #f0f4f0\\ntiddler-info-background: #f8f8f8\\ntiddler-info-border: #dddddd\\ntiddler-info-tab-background: #f8f8f8\\ntiddler-link-background: \u003C\u003Ccolour background>>\\ntiddler-link-foreground: \u003C\u003Ccolour primary>>\\ntiddler-subtitle-foreground: #c0c0c0\\ntiddler-title-foreground: #ff9900\\ntoolbar-new-button:\\ntoolbar-options-button:\\ntoolbar-save-button:\\ntoolbar-info-button:\\ntoolbar-edit-button:\\ntoolbar-close-button:\\ntoolbar-delete-button:\\ntoolbar-cancel-button:\\ntoolbar-done-button:\\nuntagged-background: #999999\\nvery-muted-foreground: #888888\\n\"},\"$:/palettes/Blue\":{\"title\":\"$:/palettes/Blue\",\"name\":\"Blue\",\"color-scheme\":\"light\",\"description\":\"A blue theme\",\"tags\":\"$:/tags/Palette\",\"type\":\"application/x-tiddler-dictionary\",\"text\":\"alert-background: #ffe476\\nalert-border: #b99e2f\\nalert-highlight: #881122\\nalert-muted-foreground: #b99e2f\\nbackground: #fff\\nblockquote-bar: \u003C\u003Ccolour muted-foreground>>\\nbutton-background:\\nbutton-foreground:\\nbutton-border:\\ncode-background: #f7f7f9\\ncode-border: #e1e1e8\\ncode-foreground: #dd1144\\ndirty-indicator: #ff0000\\ndownload-background: #34c734\\ndownload-foreground: \u003C\u003Ccolour foreground>>\\ndragger-background: \u003C\u003Ccolour foreground>>\\ndragger-foreground: \u003C\u003Ccolour background>>\\ndropdown-background: \u003C\u003Ccolour background>>\\ndropdown-border: \u003C\u003Ccolour muted-foreground>>\\ndropdown-tab-background-selected: #fff\\ndropdown-tab-background: #ececec\\ndropzone-background: rgba(0,200,0,0.7)\\nexternal-link-background-hover: inherit\\nexternal-link-background-visited: inherit\\nexternal-link-background: inherit\\nexternal-link-foreground-hover: inherit\\nexternal-link-foreground-visited: #0000aa\\nexternal-link-foreground: #0000ee\\nforeground: #333353\\nhighlight-background: #ffff00\\nhighlight-foreground: #000000\\nmessage-background: #ecf2ff\\nmessage-border: #cfd6e6\\nmessage-foreground: #547599\\nmodal-backdrop: \u003C\u003Ccolour foreground>>\\nmodal-background: \u003C\u003Ccolour background>>\\nmodal-border: #999999\\nmodal-footer-background: #f5f5f5\\nmodal-footer-border: #dddddd\\nmodal-header-border: #eeeeee\\nmuted-foreground: #999999\\nnotification-background: #ffffdd\\nnotification-border: #999999\\npage-background: #ddddff\\npre-background: #f5f5f5\\npre-border: #cccccc\\nprimary: #5778d8\\nselect-tag-background:\\nselect-tag-foreground:\\nsidebar-button-foreground: \u003C\u003Ccolour foreground>>
2731\\nsidebar-controls-foreground-hover: #000000\\nsidebar-controls-foreground: #ffffff\\nsidebar-foreground-shadow: rgba(255,255,255, 0.8)\\nsidebar-foreground: #acacac\\nsidebar-muted-foreground-hover: #444444\\nsidebar-muted-foreground: #c0c0c0\\nsidebar-tab-background-selected: \u003C\u003Ccolour page-background>>\\nsidebar-tab-background: \u003C\u003Ccolour tab-background>>\\nsidebar-tab-border-selected: \u003C\u003Ccolour tab-border-selected>>\\nsidebar-tab-border: \u003C\u003Ccolour tab-border>>\\nsidebar-tab-divider: \u003C\u003Ccolour tab-divider>>\\nsidebar-tab-foreground-selected: \\nsidebar-tab-foreground: \u003C\u003Ccolour tab-foreground>>\\nsidebar-tiddler-link-foreground-hover: #444444\\nsidebar-tiddler-link-foreground: #5959c0\\nsite-title-foreground: \u003C\u003Ccolour tiddler-title-foreground>>\\nstatic-alert-foreground: #aaaaaa\\ntab-background-selected: \u003C\u003Ccolour background>>\\ntab-background: #ccccdd\\ntab-border-selected: #ccccdd\\ntab-border: #cccccc\\ntab-divider: #d8d8d8\\ntab-foreground-selected: \u003C\u003Ccolour tab-foreground>>\\ntab-foreground: #666666\\ntable-border: #dddddd\\ntable-footer-background: #a8a8a8\\ntable-header-background: #f0f0f0\\ntag-background: #eeeeff\\ntag-foreground: #000\\ntiddler-background: \u003C\u003Ccolour background>>\\ntiddler-border: \u003C\u003Ccolour background>>\\ntiddler-controls-foreground-hover: #666666\\ntiddler-controls-foreground-selected: #444444\\ntiddler-controls-foreground: #cccccc\\ntiddler-editor-background: #f8f8f8\\ntiddler-editor-border-image: #ffffff\\ntiddler-editor-border: #cccccc\\ntiddler-editor-fields-even: #e0e8e0\\ntiddler-editor-fields-odd: #f0f4f0\\ntiddler-info-background: #ffffff\\ntiddler-info-border: #dddddd\\ntiddler-info-tab-background: #ffffff\\ntiddler-link-background: \u003C\u003Ccolour background>>\\ntiddler-link-foreground: \u003C\u003Ccolour primary>>\\ntiddler-subtitle-foreground: #c0c0c0\\ntiddler-title-foreground: #5959c0\\ntoolbar-new-button: #5eb95e\\ntoolbar-options-button: rgb(128, 88, 165)\\ntoolbar-save-button: #0e90d2\\ntoolbar-info-button: #0e90d2\\ntoolbar-edit-button: rgb(243, 123, 29)\\ntoolbar-close-button: #dd514c\\ntoolbar-delete-button: #dd514c\\ntoolbar-cancel-button: rgb(243, 123, 29)\\ntoolbar-done-button: #5eb95e\\nuntagged-background: #999999\\nvery-muted-foreground: #888888\\n\"},\"$:/palettes/Muted\":{\"title\":\"$:/palettes/Muted\",\"name\":\"Muted\",\"color-scheme\":\"light\",\"description\":\"Bright tiddlers on a muted background\",\"tags\":\"$:/tags/Palette\",\"type\":\"application/x-tiddler-dictionary\",\"text\":\"alert-background: #ffe476\\nalert-border: #b99e2f\\nalert-highlight: #881122\\nalert-muted-foreground: #b99e2f\\nbackground: #ffffff\\nblockquote-bar: \u003C\u003Ccolour muted-foreground>>\\nbutton-background:\\nbutton-foreground:\\nbutton-border:\\ncode-background: #f7f7f9\\ncode-border: #e1e1e8\\ncode-foreground: #dd1144\\ndirty-indicator: #ff0000\\ndownload-background: #34c734\\ndownload-foreground: \u003C\u003Ccolour background>>\\ndragger-background: \u003C\u003Ccolour foreground>>\\ndragger-foreground: \u003C\u003Ccolour background>>\\ndropdown-background: \u003C\u003Ccolour background>>\\ndropdown-border: \u003C\u003Ccolour muted-foreground>>\\ndropdown-tab-background-selected: #fff\\ndropdown-tab-background: #ececec\\ndropzone-background: rgba(0,200,0,0.7)\\nexternal-link-background-hover: inherit\\nexternal-link-background-visited: inherit\\nexternal-link-background: inherit\\nexternal-link-foreground-hover: inherit\\nexternal-link-foreground-visited: #0000aa\\nexternal-link-foreground: #0000ee\\nforeground: #333333\\nhighlight-background: #ffff00\\nhighlight-foreground: #000000\\nmessage-background: #ecf2ff\\nmessage-border: #cfd6e6\\nmessage-foreground: #547599\\nmodal-backdrop: \u003C\u003Ccolour foreground>>\\nmodal-background: \u003C\u003Ccolour background>>\\nmodal-border: #999999\\nmodal-footer-background: #f5f5f5\\nmodal-footer-border: #dddddd\\nmodal-header-border: #eeeeee\\nmuted-foreground: #bbb\\nnotification-background: #ffffdd\\nnotification-border: #999999\\npage-background: #6f6f70\\npre-background: #f5f5f5\\npre-border: #cccccc\\nprimary: #29a6ee\\nselect-tag-background:\\nselect-tag-foreground:\\nsidebar-button-foreground: \u003C\u003Ccolour foreground>>
2731\\nsidebar-controls-foreground-hover: #000000\\nsidebar-controls-foreground: #c2c1c2\\nsidebar-foreground-shadow: rgba(255,255,255,0)\\nsidebar-foreground: #d3d2d4\\nsidebar-muted-foreground-hover: #444444\\nsidebar-muted-foreground: #c0c0c0\\nsidebar-tab-background-selected: #6f6f70\\nsidebar-tab-background: #666667\\nsidebar-tab-border-selected: #999\\nsidebar-tab-border: #515151\\nsidebar-tab-divider: #999\\nsidebar-tab-foreground-selected: \\nsidebar-tab-foreground: #999\\nsidebar-tiddler-link-foreground-hover: #444444\\nsidebar-tiddler-link-foreground: #d1d0d2\\nsite-title-foreground: \u003C\u003Ccolour tiddler-title-foreground>>\\nstatic-alert-foreground: #aaaaaa\\ntab-background-selected: #ffffff\\ntab-background: #d8d8d8\\ntab-border-selected: #d8d8d8\\ntab-border: #cccccc\\ntab-divider: #d8d8d8\\ntab-foreground-selected: \u003C\u003Ccolour tab-foreground>>\\ntab-foreground: #666666\\ntable-border: #dddddd\\ntable-footer-background: #a8a8a8\\ntable-header-background: #f0f0f0\\ntag-background: #d5ad34\\ntag-foreground: #ffffff\\ntiddler-background: \u003C\u003Ccolour background>>\\ntiddler-border: \u003C\u003Ccolour background>>\\ntiddler-controls-foreground-hover: #888888\\ntiddler-controls-foreground-selected: #444444\\ntiddler-controls-foreground: #cccccc\\ntiddler-editor-background: #f8f8f8\\ntiddler-editor-border-image: #ffffff\\ntiddler-editor-border: #cccccc\\ntiddler-editor-fields-even: #e0e8e0\\ntiddler-editor-fields-odd: #f0f4f0\\ntiddler-info-background: #f8f8f8\\ntiddler-info-border: #dddddd\\ntiddler-info-tab-background: #f8f8f8\\ntiddler-link-background: \u003C\u003Ccolour background>>\\ntiddler-link-foreground: \u003C\u003Ccolour primary>>\\ntiddler-subtitle-foreground: #c0c0c0\\ntiddler-title-foreground: #182955\\ntoolbar-new-button: \\ntoolbar-options-button: \\ntoolbar-save-button: \\ntoolbar-info-button: \\ntoolbar-edit-button: \\ntoolbar-close-button: \\ntoolbar-delete-button: \\ntoolbar-cancel-button: \\ntoolbar-done-button: \\nuntagged-background: #999999\\nvery-muted-foreground: #888888\\n\"},\"$:/palettes/ContrastLight\":{\"title\":\"$:/palettes/ContrastLight\",\"name\":\"Contrast (Light)\",\"color-scheme\":\"light\",\"description\":\"High contrast and unambiguous (light version)\",\"tags\":\"$:/tags/Palette\",\"type\":\"application/x-tiddler-dictionary\",\"text\":\"alert-background: #f00\\nalert-border: \u003C\u003Ccolour background>>\\nalert-highlight: \u003C\u003Ccolour foreground>>\\nalert-muted-foreground: #800\\nbackground: #fff\\nblockquote-bar: \u003C\u003Ccolour muted-foreground>>\\nbutton-background: \u003C\u003Ccolour background>>\\nbutton-foreground: \u003C\u003Ccolour foreground>>\\nbutton-border: \u003C\u003Ccolour foreground>>\\ncode-background: \u003C\u003Ccolour background>>\\ncode-border: \u003C\u003Ccolour foreground>>\\ncode-foreground: \u003C\u003Ccolour foreground>>\\ndirty-indicator: #f00\\ndownload-background: #080\\ndownload-foreground: \u003C\u003Ccolour background>>\\ndragger-background: \u003C\u003Ccolour foreground>>\\ndragger-foreground: \u003C\u003Ccolour background>>\\ndropdown-background: \u003C\u003Ccolour background>>\\ndropdown-border: \u003C\u003Ccolour muted-foreground>>\\ndropdown-tab-background-selected: \u003C\u003Ccolour foreground>>\\ndropdown-tab-background: \u003C\u003Ccolour foreground>>\\ndropzone-background: rgba(0,200,0,0.7)\\nexternal-link-background-hover: inherit\\nexternal-link-background-visited: inherit\\nexternal-link-background: inherit\\nexternal-link-foreground-hover: inherit\\nexternal-link-foreground-visited: #00a\\nexternal-link-foreground: #00e\\nforeground: #000\\nhighlight-background: #ffff00\\nhighlight-foreground: #000000\\nmessage-background: \u003C\u003Ccolour foreground>>\\nmessage-border: \u003C\u003Ccolour background>>\\nmessage-foreground: \u003C\u003Ccolour background>>\\nmodal-backdrop: \u003C\u003Ccolour foreground>>\\nmodal-background: \u003C\u003Ccolour background>>\\nmodal-border: \u003C\u003Ccolour foreground>>\\nmodal-footer-background: \u003C\u003Ccolour background>>\\nmodal-footer-border: \u003C\u003Ccolour foreground>>\\nmodal-header-border: \u003C\u003Ccolour foreground>>\\nmuted-foreground: \u003C\u003Ccolour foreground>>\\nnotification-background: \u003C\u003Ccolour background>>\\nnotification-border: \u003C\u003Ccolour foreground>>\\npage-background: \u003C\u003Ccolour background>>\\npre-background: \u003C\u003Ccolour background>>\\npre-border: \u003C\u003Ccolour foreground>>\\nprimary: #00f\\nselect-tag-background:\\nselect-tag-foreground:\\nsidebar-button-foreground: \u003C\u003Ccolour foreground>>
2731\\nsidebar-controls-foreground-hover: \u003C\u003Ccolour background>>\\nsidebar-controls-foreground: \u003C\u003Ccolour foreground>>\\nsidebar-foreground-shadow: rgba(0,0,0, 0)\\nsidebar-foreground: \u003C\u003Ccolour foreground>>\\nsidebar-muted-foreground-hover: #444444\\nsidebar-muted-foreground: \u003C\u003Ccolour foreground>>\\nsidebar-tab-background-selected: \u003C\u003Ccolour background>>\\nsidebar-tab-background: \u003C\u003Ccolour tab-background>>\\nsidebar-tab-border-selected: \u003C\u003Ccolour tab-border-selected>>\\nsidebar-tab-border: \u003C\u003Ccolour tab-border>>\\nsidebar-tab-divider: \u003C\u003Ccolour tab-divider>>\\nsidebar-tab-foreground-selected: \u003C\u003Ccolour foreground>>\\nsidebar-tab-foreground: \u003C\u003Ccolour tab-foreground>>\\nsidebar-tiddler-link-foreground-hover: \u003C\u003Ccolour foreground>>\\nsidebar-tiddler-link-foreground: \u003C\u003Ccolour primary>>\\nsite-title-foreground: \u003C\u003Ccolour tiddler-title-foreground>>\\nstatic-alert-foreground: #aaaaaa\\ntab-background-selected: \u003C\u003Ccolour background>>\\ntab-background: \u003C\u003Ccolour foreground>>\\ntab-border-selected: \u003C\u003Ccolour foreground>>\\ntab-border: \u003C\u003Ccolour foreground>>\\ntab-divider: \u003C\u003Ccolour foreground>>\\ntab-foreground-selected: \u003C\u003Ccolour foreground>>\\ntab-foreground: \u003C\u003Ccolour background>>\\ntable-border: #dddddd\\ntable-footer-background: #a8a8a8\\ntable-header-background: #f0f0f0\\ntag-background: #000\\ntag-foreground: #fff\\ntiddler-background: \u003C\u003Ccolour background>>\\ntiddler-border: \u003C\u003Ccolour foreground>>\\ntiddler-controls-foreground-hover: #ddd\\ntiddler-controls-foreground-selected: #fdd\\ntiddler-controls-foreground: \u003C\u003Ccolour foreground>>\\ntiddler-editor-background: \u003C\u003Ccolour background>>\\ntiddler-editor-border-image: \u003C\u003Ccolour foreground>>\\ntiddler-editor-border: #cccccc\\ntiddler-editor-fields-even: \u003C\u003Ccolour background>>\\ntiddler-editor-fields-odd: \u003C\u003Ccolour background>>\\ntiddler-info-background: \u003C\u003Ccolour background>>\\ntiddler-info-border: \u003C\u003Ccolour foreground>>\\ntiddler-info-tab-background: \u003C\u003Ccolour background>>\\ntiddler-link-background: \u003C\u003Ccolour background>>\\ntiddler-link-foreground: \u003C\u003Ccolour primary>>\\ntiddler-subtitle-foreground: \u003C\u003Ccolour foreground>>\\ntiddler-title-foreground: \u003C\u003Ccolour foreground>>\\ntoolbar-new-button: \\ntoolbar-options-button: \\ntoolbar-save-button: \\ntoolbar-info-button: \\ntoolbar-edit-button: \\ntoolbar-close-button: \\ntoolbar-delete-button: \\ntoolbar-cancel-button: \\ntoolbar-done-button: \\nuntagged-background: \u003C\u003Ccolour foreground>>\\nvery-muted-foreground: #888888\\n\"},\"$:/palettes/ContrastDark\":{\"title\":\"$:/palettes/ContrastDark\",\"name\":\"Contrast (Dark)\",\"color-scheme\":\"dark\",\"description\":\"High contrast and unambiguous (dark version)\",\"tags\":\"$:/tags/Palette\",\"type\":\"application/x-tiddler-dictionary\",\"text\":\"alert-background: #f00\\nalert-border: \u003C\u003Ccolour background>>\\nalert-highlight: \u003C\u003Ccolour foreground>>\\nalert-muted-foreground: #800\\nbackground: #000\\nblockquote-bar: \u003C\u003Ccolour muted-foreground>>\\nbutton-background: \u003C\u003Ccolour background>>\\nbutton-foreground: \u003C\u003Ccolour foreground>>\\nbutton-border: \u003C\u003Ccolour foreground>>\\ncode-background: \u003C\u003Ccolour background>>\\ncode-border: \u003C\u003Ccolour foreground>>\\ncode-foreground: \u003C\u003Ccolour foreground>>\\ndirty-indicator: #f00\\ndownload-background: #080\\ndownload-foreground: \u003C\u003Ccolour background>>\\ndragger-background: \u003C\u003Ccolour foreground>>\\ndragger-foreground: \u003C\u003Ccolour background>>\\ndropdown-background: \u003C\u003Ccolour background>>\\ndropdown-border: \u003C\u003Ccolour muted-foreground>>\\ndropdown-tab-background-selected: \u003C\u003Ccolour foreground>>\\ndropdown-tab-background: \u003C\u003Ccolour foreground>>\\ndropzone-background: rgba(0,200,0,0.7)\\nexternal-link-background-hover: inherit\\nexternal-link-background-visited: inherit\\nexternal-link-background: inherit\\nexternal-link-foreground-hover: inherit\\nexternal-link-foreground-visited: #00a\\nexternal-link-foreground: #00e\\nforeground: #fff\\nhighlight-background: #ffff00\\nhighlight-foreground: #000000\\nmessage-background: \u003C\u003Ccolour foreground>>\\nmessage-border: \u003C\u003Ccolour background>>\\nmessage-foreground: \u003C\u003Ccolour background>>\\nmodal-backdrop: \u003C\u003Ccolour foreground>>\\nmodal-background: \u003C\u003Ccolour background>>\\nmodal-border: \u003C\u003Ccolour foreground>>\\nmodal-footer-background: \u003C\u003Ccolour background>>\\nmodal-footer-border: \u003C\u003Ccolour foreground>>\\nmodal-header-border: \u003C\u003Ccolour foreground>>\\nmuted-foreground: \u003C\u003Ccolour foreground>>\\nnotification-background: \u003C\u003Ccolour background>>\\nnotification-border: \u003C\u003Ccolour foreground>>\\npage-background: \u003C\u003Ccolour background>>\\npre-background: \u003C\u003Ccolour background>>\\npre-border: \u003C\u003Ccolour foreground>>\\nprimary: #00f\\nselect-tag-background:\\nselect-tag-foreground:\\nsidebar-button-foreground: \u003C\u003Ccolour foreground>>
2731\\nsidebar-controls-foreground-hover: \u003C\u003Ccolour background>>\\nsidebar-controls-foreground: \u003C\u003Ccolour foreground>>\\nsidebar-foreground-shadow: rgba(0,0,0, 0)\\nsidebar-foreground: \u003C\u003Ccolour foreground>>\\nsidebar-muted-foreground-hover: #444444\\nsidebar-muted-foreground: \u003C\u003Ccolour foreground>>\\nsidebar-tab-background-selected: \u003C\u003Ccolour background>>\\nsidebar-tab-background: \u003C\u003Ccolour tab-background>>\\nsidebar-tab-border-selected: \u003C\u003Ccolour tab-border-selected>>\\nsidebar-tab-border: \u003C\u003Ccolour tab-border>>\\nsidebar-tab-divider: \u003C\u003Ccolour tab-divider>>\\nsidebar-tab-foreground-selected: \u003C\u003Ccolour foreground>>\\nsidebar-tab-foreground: \u003C\u003Ccolour tab-foreground>>\\nsidebar-tiddler-link-foreground-hover: \u003C\u003Ccolour foreground>>\\nsidebar-tiddler-link-foreground: \u003C\u003Ccolour primary>>\\nsite-title-foreground: \u003C\u003Ccolour tiddler-title-foreground>>\\nstatic-alert-foreground: #aaaaaa\\ntab-background-selected: \u003C\u003Ccolour background>>\\ntab-background: \u003C\u003Ccolour foreground>>\\ntab-border-selected: \u003C\u003Ccolour foreground>>\\ntab-border: \u003C\u003Ccolour foreground>>\\ntab-divider: \u003C\u003Ccolour foreground>>\\ntab-foreground-selected: \u003C\u003Ccolour foreground>>\\ntab-foreground: \u003C\u003Ccolour background>>\\ntable-border: #dddddd\\ntable-footer-background: #a8a8a8\\ntable-header-background: #f0f0f0\\ntag-background: #fff\\ntag-foreground: #000\\ntiddler-background: \u003C\u003Ccolour background>>\\ntiddler-border: \u003C\u003Ccolour foreground>>\\ntiddler-controls-foreground-hover: #ddd\\ntiddler-controls-foreground-selected: #fdd\\ntiddler-controls-foreground: \u003C\u003Ccolour foreground>>\\ntiddler-editor-background: \u003C\u003Ccolour background>>\\ntiddler-editor-border-image: \u003C\u003Ccolour foreground>>\\ntiddler-editor-border: #cccccc\\ntiddler-editor-fields-even: \u003C\u003Ccolour background>>\\ntiddler-editor-fields-odd: \u003C\u003Ccolour background>>\\ntiddler-info-background: \u003C\u003Ccolour background>>\\ntiddler-info-border: \u003C\u003Ccolour foreground>>\\ntiddler-info-tab-background: \u003C\u003Ccolour background>>\\ntiddler-link-background: \u003C\u003Ccolour background>>\\ntiddler-link-foreground: \u003C\u003Ccolour primary>>\\ntiddler-subtitle-foreground: \u003C\u003Ccolour foreground>>\\ntiddler-title-foreground: \u003C\u003Ccolour foreground>>\\ntoolbar-new-button: \\ntoolbar-options-button: \\ntoolbar-save-button: \\ntoolbar-info-button: \\ntoolbar-edit-button: \\ntoolbar-close-button: \\ntoolbar-delete-button: \\ntoolbar-cancel-button: \\ntoolbar-done-button: \\nuntagged-background: \u003C\u003Ccolour foreground>>\\nvery-muted-foreground: #888888\\n\"},\"$:/palettes/CupertinoDark\":{\"title\":\"$:/palettes/CupertinoDark\",\"tags\":\"$:/tags/Palette\",\"color-scheme\":\"dark\",\"name\":\"Cupertino Dark\",\"description\":\"A macOS inspired dark palette\",\"type\":\"application/x-tiddler-dictionary\",\"text\":\"alert-background: #FF453A\\nalert-border: #FF453A\\nalert-highlight: #FFD60A\\nalert-muted-foreground: \u003C\u003Ccolour muted-foreground>>\\nbackground: #282828\\nblockquote-bar: \u003C\u003Ccolour page-background>>\\nbutton-foreground: \u003C\u003Ccolour foreground>>\\ncode-background: \u003C\u003Ccolour pre-background>>\\ncode-border: \u003C\u003Ccolour pre-border>>\\ncode-foreground: rgba(255, 255, 255, 0.54)\\ndirty-indicator: #FF453A\\ndownload-background: \u003C\u003Ccolour primary>>\\ndownload-foreground: \u003C\u003Ccolour foreground>>\\ndragger-background: \u003C\u003Ccolour foreground>>\\ndragger-foreground: \u003C\u003Ccolour background>>\\ndropdown-background: \u003C\u003Ccolour tiddler-info-background>>\\ndropdown-border: \u003C\u003Ccolour dropdown-background>>\\ndropdown-tab-background-selected: #3F638B\\ndropdown-tab-background: #323232\\ndropzone-background: #30D158\\nexternal-link-background-hover: transparent\\nexternal-link-background-visited: transparent\\nexternal-link-background: transparent\\nexternal-link-foreground-hover: \\nexternal-link-foreground-visited: #BF5AF2\\nexternal-link-foreground: #32D74B\\nforeground: #FFFFFF\\nhighlight-background: #ffff78\\nhighlight-foreground: #000000\\nmenubar-background: #464646\\nmenubar-foreground: #ffffff\\nmessage-background: \u003C\u003Ccolour background>>\\nmessage-border: \u003C\u003Ccolour very-muted-foreground>>\\nmessage-foreground: rgba(255, 255, 255, 0.54)\\nmodal-backdrop: \u003C\u003Ccolour page-background>>\\nmodal-background: \u003C\u003Ccolour background>>\\nmodal-border: \u003C\u003Ccolour very-muted-foreground>>\\nmodal-footer-background: \u003C\u003Ccolour background>>\\nmodal-footer-border: \u003C\u003Ccolour background>>\\nmodal-header-border: \u003C\u003Ccolour very-muted-foreground>>\\nmuted-foreground: #98989D\\nnotification-background: \u003C\u003Ccolour dropdown-background>>\\nnotification-border: \u003C\u003Ccolour dropdown-background>>\\npage-background: #323232\\npre-background: #464646\\npre-border: transparent\\nprimary: #0A84FF\\nselect-tag-background: \u003C\u003Ccolour background>>\\nselect-tag-foreground: \u003C\u003Ccolour foreground>>\\nsidebar-button-foreground: \u003C\u003Ccolour foreground>>
2731\\nsidebar-controls-foreground-hover: #FF9F0A\\nsidebar-controls-foreground: #8E8E93\\nsidebar-foreground-shadow: transparent\\nsidebar-foreground: rgba(255, 255, 255, 0.54)\\nsidebar-muted-foreground-hover: rgba(255, 255, 255, 0.54)\\nsidebar-muted-foreground: rgba(255, 255, 255, 0.38)\\nsidebar-tab-background-selected: #3F638B\\nsidebar-tab-background: \u003C\u003Ccolour background>>\\nsidebar-tab-border-selected: \u003C\u003Ccolour background>>\\nsidebar-tab-border: \u003C\u003Ccolour background>>\\nsidebar-tab-divider: \u003C\u003Ccolour background>>\\nsidebar-tab-foreground-selected: rgba(255, 255, 255, 0.87)\\nsidebar-tab-foreground: rgba(255, 255, 255, 0.54)\\nsidebar-tiddler-link-foreground-hover: rgba(255, 255, 255, 0.7)\\nsidebar-tiddler-link-foreground: rgba(255, 255, 255, 0.54)\\nsite-title-foreground: #ffffff\\nstatic-alert-foreground: #B4B4B4\\ntab-background-selected: #3F638B\\ntab-background: \u003C\u003Ccolour page-background>>\\ntab-border-selected: \u003C\u003Ccolour page-background>>\\ntab-border: \u003C\u003Ccolour page-background>>\\ntab-divider: \u003C\u003Ccolour page-background>>\\ntab-foreground-selected: rgba(255, 255, 255, 0.87)\\ntab-foreground: rgba(255, 255, 255, 0.54)\\ntable-border: #464646\\ntable-footer-background: \u003C\u003Ccolour tiddler-editor-fields-odd>>\\ntable-header-background: \u003C\u003Ccolour tiddler-editor-fields-even>>\\ntag-background: #48484A\\ntag-foreground: #323232\\ntiddler-background: \u003C\u003Ccolour background>>\\ntiddler-border: transparent\\ntiddler-controls-foreground-hover: \u003C\u003Ccolour sidebar-controls-foreground-hover>>\\ntiddler-controls-foreground-selected: \u003C\u003Ccolour sidebar-controls-foreground-hover>>\\ntiddler-controls-foreground: #48484A\\ntiddler-editor-background: \u003C\u003Ccolour background>>\\ntiddler-editor-border-image: \\ntiddler-editor-border: rgba(255, 255, 255, 0.08)\\ntiddler-editor-fields-even: rgba(255, 255, 255, 0.1)\\ntiddler-editor-fields-odd: rgba(255, 255, 255, 0.04)\\ntiddler-info-background: #1E1E1E\\ntiddler-info-border: #1E1E1E\\ntiddler-info-tab-background: #3F638B\\ntiddler-link-background: \u003C\u003Ccolour background>>\\ntiddler-link-foreground: \u003C\u003Ccolour primary>>\\ntiddler-subtitle-foreground: \u003C\u003Ccolour muted-foreground>>\\ntiddler-title-foreground: #FFFFFF\\ntoolbar-new-button: \\ntoolbar-options-button: \\ntoolbar-save-button: \\ntoolbar-info-button: \\ntoolbar-edit-button: \\ntoolbar-close-button: \\ntoolbar-delete-button: \\ntoolbar-cancel-button: \\ntoolbar-done-button: \\nuntagged-background: \u003C\u003Ccolour very-muted-foreground>>\\nvery-muted-foreground: #464646\\nselection-background: #3F638B\\nselection-foreground: #ffffff\\nwikilist-background: \u003C\u003Ccolour page-background>>\\nwikilist-button-background: #3F638B\\nwikilist-button-foreground: \u003C\u003Ccolour foreground>>\\nwikilist-button-open: #32D74B\\nwikilist-button-open-hover: #32D74B\\nwikilist-button-reveal: #0A84FF\\nwikilist-button-reveal-hover: #0A84FF\\nwikilist-button-remove: #FF453A\\nwikilist-button-remove-hover: #FF453A\\nwikilist-droplink-dragover: #32D74B\\nwikilist-item: \u003C\u003Ccolour background>>\\nwikilist-toolbar-background: \u003C\u003Ccolour background>>\\nwikilist-title: \u003C\u003Ccolour foreground>>\\nwikilist-title-svg: \u003C\u003Ccolour foreground>>\\nwikilist-toolbar-foreground: \u003C\u003Ccolour foreground>>\\nwikilist-url: \u003C\u003Ccolour muted-foreground>>\\n\"},\"$:/palettes/DarkPhotos\":{\"title\":\"$:/palettes/DarkPhotos\",\"created\":\"20150402111612188\",\"description\":\"Good with dark photo backgrounds\",\"modified\":\"20150402112344080\",\"name\":\"DarkPhotos\",\"tags\":\"$:/tags/Palette\",\"type\":\"application/x-tiddler-dictionary\",\"color-scheme\":\"light\",\"text\":\"alert-background: #ffe476\\nalert-border: #b99e2f\\nalert-highlight: #881122\\nalert-muted-foreground: #b99e2f\\nbackground: #ffffff\\nblockquote-bar: \u003C\u003Ccolour muted-foreground>>\\nbutton-background: \\nbutton-foreground: \\nbutton-border: \\ncode-background: #f7f7f9\\ncode-border: #e1e1e8\\ncode-foreground: #dd1144\\ndirty-indicator: #ff0000\\ndownload-background: #34c734\\ndownload-foreground: \u003C\u003Ccolour background>>\\ndragger-background: \u003C\u003Ccolour foreground>>\\ndragger-foreground: \u003C\u003Ccolour background>>\\ndropdown-background: \u003C\u003Ccolour background>>\\ndropdown-border: \u003C\u003Ccolour muted-foreground>>\\ndropdown-tab-background-selected: #fff\\ndropdown-tab-background: #ececec\\ndropzone-background: rgba(0,200,0,0.7)\\nexternal-link-background-hover: inherit\\nexternal-link-background-visited: inherit\\nexternal-link-background: inherit\\nexternal-link-foreground-hover: inherit\\nexternal-link-foreground-visited: #0000aa\\nexternal-link-foreground: #0000ee\\nforeground: #333333\\nhighlight-background: #ffff00\\nhighlight-foreground: #000000\\nmessage-background: #ecf2ff\\nmessage-border: #cfd6e6\\nmessage-foreground: #547599\\nmodal-backdrop: \u003C\u003Ccolour foreground>>\\nmodal-background: \u003C\u003Ccolour background>>\\nmodal-border: #999999\\nmodal-footer-background: #f5f5f5\\nmodal-footer-border: #dddddd\\nmodal-header-border: #eeeeee\\nmuted-foreground: #ddd\\nnotification-background: #ffffdd\\nnotification-border: #999999\\npage-background: #336438\\npre-background: #f5f5f5\\npre-border: #cccccc\\nprimary: #5778d8\\nselect-tag-background:\\nselect-tag-foreground:\\nsidebar-button-foreground: \u003C\u003Ccolour foreground>>
2731\\nsidebar-controls-foreground-hover: #ccf\\nsidebar-controls-foreground: #fff\\nsidebar-foreground-shadow: rgba(0,0,0, 0.5)\\nsidebar-foreground: #fff\\nsidebar-muted-foreground-hover: #444444\\nsidebar-muted-foreground: #eee\\nsidebar-tab-background-selected: rgba(255,255,255, 0.8)\\nsidebar-tab-background: rgba(255,255,255, 0.4)\\nsidebar-tab-border-selected: \u003C\u003Ccolour tab-border-selected>>\\nsidebar-tab-border: \u003C\u003Ccolour tab-border>>\\nsidebar-tab-divider: rgba(255,255,255, 0.2)\\nsidebar-tab-foreground-selected: \\nsidebar-tab-foreground: \u003C\u003Ccolour tab-foreground>>\\nsidebar-tiddler-link-foreground-hover: #aaf\\nsidebar-tiddler-link-foreground: #ddf\\nsite-title-foreground: #fff\\nstatic-alert-foreground: #aaaaaa\\ntab-background-selected: #ffffff\\ntab-background: #d8d8d8\\ntab-border-selected: #d8d8d8\\ntab-border: #cccccc\\ntab-divider: #d8d8d8\\ntab-foreground-selected: \u003C\u003Ccolour tab-foreground>>\\ntab-foreground: #666666\\ntable-border: #dddddd\\ntable-footer-background: #a8a8a8\\ntable-header-background: #f0f0f0\\ntag-background: #ec6\\ntag-foreground: #ffffff\\ntiddler-background: \u003C\u003Ccolour background>>\\ntiddler-border: \u003C\u003Ccolour background>>\\ntiddler-controls-foreground-hover: #888888\\ntiddler-controls-foreground-selected: #444444\\ntiddler-controls-foreground: #cccccc\\ntiddler-editor-background: #f8f8f8\\ntiddler-editor-border-image: #ffffff\\ntiddler-editor-border: #cccccc\\ntiddler-editor-fields-even: #e0e8e0\\ntiddler-editor-fields-odd: #f0f4f0\\ntiddler-info-background: #f8f8f8\\ntiddler-info-border: #dddddd\\ntiddler-info-tab-background: #f8f8f8\\ntiddler-link-background: \u003C\u003Ccolour background>>\\ntiddler-link-foreground: \u003C\u003Ccolour primary>>\\ntiddler-subtitle-foreground: #c0c0c0\\ntiddler-title-foreground: #182955\\ntoolbar-new-button: \\ntoolbar-options-button: \\ntoolbar-save-button: \\ntoolbar-info-button: \\ntoolbar-edit-button: \\ntoolbar-close-button: \\ntoolbar-delete-button: \\ntoolbar-cancel-button: \\ntoolbar-done-button: \\nuntagged-background: #999999\\nvery-muted-foreground: #888888\\n\"},\"$:/palettes/DesertSand\":{\"title\":\"$:/palettes/DesertSand\",\"tags\":\"$:/tags/Palette\",\"color-scheme\":\"light\",\"name\":\"Desert Sand\",\"description\":\"A desert sand palette\",\"type\":\"application/x-tiddler-dictionary\",\"text\":\"alert-background: #ffe476\\nalert-border: #b99e2f\\nalert-highlight: #881122\\nalert-muted-foreground: #b99e2f\\nbackground: #E9E0C7\\nblockquote-bar: \u003C\u003Ccolour muted-foreground>>\\nbutton-foreground: \u003C\u003Ccolour foreground>>\\ncode-background: #F3EDDF\\ncode-border: #C3BAA1\\ncode-foreground: #ab3250\\ndiff-delete-background: #bd8b8b\\ndiff-delete-foreground: \u003C\u003Ccolour foreground>>\\ndiff-equal-background: \\ndiff-equal-foreground: \u003C\u003Ccolour foreground>>\\ndiff-insert-background: #91c093\\ndiff-insert-foreground: \u003C\u003Ccolour foreground>>\\ndiff-invisible-background: \\ndiff-invisible-foreground: \u003C\u003Ccolour muted-foreground>>\\ndirty-indicator: #ad3434\\ndownload-background: #6ca16c\\ndownload-foreground: \u003C\u003Ccolour background>>\\ndragger-background: \u003C\u003Ccolour foreground>>\\ndragger-foreground: \u003C\u003Ccolour background>>\\ndropdown-background: \u003C\u003Ccolour background>>\\ndropdown-border: \u003C\u003Ccolour muted-foreground>>\\ndropdown-tab-background-selected: #E9E0C7\\ndropdown-tab-background: #BAB29C\\ndropzone-background: rgba(0,200,0,0.7)\\nexternal-link-background-hover: inherit\\nexternal-link-background-visited: inherit\\nexternal-link-background: inherit\\nexternal-link-foreground-hover: inherit\\nexternal-link-foreground-visited: #313163\\nexternal-link-foreground: #555592\\nforeground: #2D2A23\\nhighlight-background: #ffff00\\nhighlight-foreground: #000000\\nmenubar-background: #CDC2A6\\nmenubar-foreground: #5A5446\\nmessage-background: #ECE5CF\\nmessage-border: #D6CBAA\\nmessage-foreground: #5f6e7d\\nmodal-backdrop: \u003C\u003Ccolour foreground>>\\nmodal-background: \u003C\u003Ccolour background>>\\nmodal-border: #8A8885\\nmodal-footer-background: #CDC2A6\\nmodal-footer-border: #9D998E\\nmodal-header-border: #9D998E\\nmuted-foreground: #9D998E\\nnotification-background: #F0E9D7\\nnotification-border: #939189\\npage-background: #e0d3af\\npre-background: #D6CBAA\\npre-border: #CDC2A6\\nprimary: #5B6F55\\nselection-background: #9D947B\\nselection-foreground: \u003C\u003Ccolour foreground>>\\nselect-tag-background: #F0E9D7\\nselect-tag-foreground: #2D2A23\\nsidebar-button-foreground: \u003C\u003Ccolour foreground>>
2731\\nsidebar-controls-foreground-hover: #2D2A23\\nsidebar-controls-foreground: #867F69\\nsidebar-foreground-shadow: transparent\\nsidebar-foreground: #867F69\\nsidebar-muted-foreground-hover: #706A58\\nsidebar-muted-foreground: #B3A98C\\nsidebar-tab-background-selected: #e0d3af\\nsidebar-tab-background: #A6A193\\nsidebar-tab-border-selected: #C3BAA1\\nsidebar-tab-border: #C3BAA1\\nsidebar-tab-divider: #CDC2A6\\nsidebar-tab-foreground-selected: \\nsidebar-tab-foreground: #2D2A23\\nsidebar-tiddler-link-foreground-hover: #433F35\\nsidebar-tiddler-link-foreground: #706A58\\nsite-title-foreground: \u003C\u003Ccolour tiddler-title-foreground>>\\nstatic-alert-foreground: #A6A193\\ntab-background-selected: #E9E0C7\\ntab-background: #A6A193\\ntab-border-selected: #C3BAA1\\ntab-border: #C3BAA1\\ntab-divider: #CDC2A6\\ntab-foreground-selected: \u003C\u003Ccolour tab-foreground>>\\ntab-foreground: #2D2A23\\ntable-border: #9D998E\\ntable-footer-background: #8A8885\\ntable-header-background: #B0AA98\\ntag-background: #706A58\\ntag-foreground: #E3D7B7\\ntiddler-background: \u003C\u003Ccolour background>>\\ntiddler-border: \u003C\u003Ccolour background>>\\ntiddler-controls-foreground-hover: #9D947B\\ntiddler-controls-foreground-selected: #706A58\\ntiddler-controls-foreground: #C3BAA1\\ntiddler-editor-background: #E9E0C7\\ntiddler-editor-border-image: #A6A193\\ntiddler-editor-border: #A6A193\\ntiddler-editor-fields-even: #D6CBAA\\ntiddler-editor-fields-odd: #C3BAA1\\ntiddler-info-background: #E3D7B7\\ntiddler-info-border: #BAB29C\\ntiddler-info-tab-background: #E9E0C7\\ntiddler-link-background: \u003C\u003Ccolour background>>\\ntiddler-link-foreground: \u003C\u003Ccolour primary>>\\ntiddler-subtitle-foreground: #867F69\\ntiddler-title-foreground: #374464\\ntoolbar-new-button: \\ntoolbar-options-button: \\ntoolbar-save-button: \\ntoolbar-info-button: \\ntoolbar-edit-button: \\ntoolbar-close-button: \\ntoolbar-delete-button: \\ntoolbar-cancel-button: \\ntoolbar-done-button: \\nuntagged-background: #8A8885\\nvery-muted-foreground: #CDC2A6\\nwikilist-background: \u003C\u003Ccolour page-background>>\\nwikilist-item: #CDC2A6\\nwikilist-info: #161512\\nwikilist-title: #433F35\\nwikilist-title-svg: \u003C\u003Ccolour wikilist-title>>\\nwikilist-url: #706A58\\nwikilist-button-open: #7db66a\\nwikilist-button-open-hover: #56a556\\nwikilist-button-reveal: #5a6c9e\\nwikilist-button-reveal-hover: #454591\\nwikilist-button-remove: #bc5972\\nwikilist-button-remove-hover: #814040\\nwikilist-toolbar-background: #CDC2A6\\nwikilist-toolbar-foreground: #2D2A23\\nwikilist-droplink-dragover: rgba(255,192,192,0.5)\\nwikilist-button-background: #A6A193\\nwikilist-button-foreground: #161512\\n\"},\"$:/palettes/GruvboxDark\":{\"title\":\"$:/palettes/GruvboxDark\",\"name\":\"Gruvbox Dark\",\"color-scheme\":\"dark\",\"description\":\"Retro groove color scheme\",\"tags\":\"$:/tags/Palette\",\"type\":\"application/x-tiddler-dictionary\",\"license\":\"https://github.com/morhetz/gruvbox\",\"text\":\"alert-background: #cc241d\\nalert-border: #cc241d\\nalert-highlight: #d79921\\nalert-muted-foreground: #504945\\nbackground: #3c3836\\nblockquote-bar: \u003C\u003Ccolour muted-foreground>>\\nbutton-foreground: \u003C\u003Ccolour foreground>>\\ncode-background: #504945\\ncode-border: #504945\\ncode-foreground: #fb4934\\ndiff-delete-background: #fb4934\\ndiff-delete-foreground: \u003C\u003Ccolour foreground>>\\ndiff-equal-background: \\ndiff-equal-foreground: \u003C\u003Ccolour foreground>>\\ndiff-insert-background: #b8bb26\\ndiff-insert-foreground: \u003C\u003Ccolour foreground>>\\ndiff-invisible-background: \\ndiff-invisible-foreground: \u003C\u003Ccolour muted-foreground>>\\ndirty-indicator: #fb4934\\ndownload-background: #b8bb26\\ndownload-foreground: \u003C\u003Ccolour background>>\\ndragger-background: \u003C\u003Ccolour foreground>>\\ndragger-foreground: \u003C\u003Ccolour background>>\\ndropdown-background: #665c54\\ndropdown-border: \u003C\u003Ccolour background>>\\ndropdown-tab-background-selected: #ebdbb2\\ndropdown-tab-background: #665c54\\ndropzone-background: #98971a\\nexternal-link-background-hover: inherit\\nexternal-link-background-visited: inherit\\nexternal-link-background: inherit\\nexternal-link-foreground-hover: inherit\\nexternal-link-foreground-visited: #d3869b\\nexternal-link-foreground: #8ec0
27317c\\nforeground: #fbf1c7\\nhighlight-background: #ffff79\\nhighlight-foreground: #000000\\nmenubar-background: #504945\\nmenubar-foreground: \u003C\u003Ccolour foreground>>\\nmessage-background: #83a598\\nmessage-border: #83a598\\nmessage-foreground: #3c3836\\nmodal-backdrop: \u003C\u003Ccolour foreground>>\\nmodal-background: \u003C\u003Ccolour background>>\\nmodal-border: #504945\\nmodal-footer-background: #3c3836\\nmodal-footer-border: #3c3836\\nmodal-header-border: #3c3836\\nmuted-foreground: #d5c4a1\\nnotification-background: \u003C\u003Ccolour primary>>\\nnotification-border: \u003C\u003Ccolour primary>>\\npage-background: #282828\\npre-background: #504945\\npre-border: #504945\\nprimary: #d79921\\nselect-tag-background: #665c54\\nselect-tag-foreground: \u003C\u003Ccolour foreground>>\\nselection-background: #458588\\nselection-foreground: \u003C\u003Ccolour foreground>>\\nsidebar-button-foreground: \u003C\u003Ccolour foreground>>\\nsidebar-controls-foreground-hover: #7c6f64\\nsidebar-controls-foreground: #504945\\nsidebar-foreground-shadow: transparent\\nsidebar-foreground: #fbf1c7\\nsidebar-muted-foreground-hover: #7c6f64\\nsidebar-muted-foreground: #504945\\nsidebar-tab-background-selected: #bdae93\\nsidebar-tab-background: #3c3836\\nsidebar-tab-border-selected: \u003C\u003Ccolour tab-border-selected>>\\nsidebar-tab-border: #bdae93\\nsidebar-tab-divider: \u003C\u003Ccolour page-background>>\\nsidebar-tab-foreground-selected: #282828\\nsidebar-tab-foreground: \u003C\u003Ccolour tab-foreground>>\\nsidebar-tiddler-link-foreground-hover: #458588\\nsidebar-tiddler-link-foreground: #98971a\\nsite-title-foreground: \u003C\u003Ccolour tiddler-title-foreground>>\\nstatic-alert-foreground: #B48EAD\\ntab-background-selected: #ebdbb2\\ntab-background: #665c54\\ntab-border-selected: #665c54\\ntab-border: #665c54\\ntab-divider: #bdae93\\ntab-foreground-selected: #282828\\ntab-foreground: #ebdbb2\\ntable-border: #7c6f64\\ntable-footer-background: #665c54\\ntable-header-background: #504945\\ntag-background: #d3869b\\ntag-foreground: #282828\\ntiddler-background: \u003C\u003Ccolour background>>\\ntiddler-border: \u003C\u003Ccolour background>>\\ntiddler-controls-foreground-hover: #7c6f64\\ntiddler-controls-foreground-selected: \u003C\u003Ccolour primary>>\\ntiddler-controls-foreground: #665c54\\ntiddler-editor-background: #32302f\\ntiddler-editor-border-image: #282828\\ntiddler-editor-border: #282828\\ntiddler-editor-fields-even: #504945\\ntiddler-editor-fields-odd: #7c6f64\\ntiddler-info-background: #32302f\\ntiddler-info-border: #ebdbb2\\ntiddler-info-tab-background: #ebdbb2\\ntiddler-link-background: \u003C\u003Ccolour background>>\\ntiddler-link-foreground: \u003C\u003Ccolour primary>>\\ntiddler-subtitle-foreground: #7c6f64\\ntiddler-title-foreground: #a89984\\ntoolbar-new-button: \\ntoolbar-options-button: \\ntoolbar-save-button: \\ntoolbar-info-button: \\ntoolbar-edit-button: \\ntoolbar-close-button: \\ntoolbar-delete-button: \\ntoolbar-cancel-button: \\ntoolbar-done-button: \\nuntagged-background: #504945\\nvery-muted-foreground: #bdae93\\nwikilist-background: \u003C\u003Ccolour page-background>>\\nwikilist-button-background: #acacac\\nwikilist-button-foreground: \u003C\u003Ccolour button-foreground>>\\nwikilist-item: \u003C\u003Ccolour background>>\\nwikilist-toolbar-background: \u003C\u003Ccolour background>>\\nwikilist-toolbar-foreground: \u003C\u003Ccolour foreground>>\\nwikilist-title: \u003C\u003Ccolour foreground>>\\nwikilist-title-svg: \u003C\u003Ccolour wikilist-title>>\\nwikilist-url: \u003C\u003Ccolour muted-foreground>>\\nwikilist-button-open-hover: \u003C\u003Ccolour primary>>\\nwikilist-button-open: \u003C\u003Ccolour dropzone-background>>\\nwikilist-button-remove: \u003C\u003Ccolour dirty-indicator>>\\nwikilist-button-remove-hover: \u003C\u003Ccolour alert-background>>\\nwikilist-droplink-dragover: \u003C\u003Ccolour dropzone-background>>\\nwikilist-button-reveal: \u003C\u003Ccolour sidebar-tiddler-link-foreground-hover>>\\nwikilist-button-reveal-hover: \u003C\u003Ccolour message-background>>\\n\"},\"$:/palettes/Nord\":{\"title\":\"$:/palettes/Nord\",\"name\":\"Nord\",\"color-scheme\":\"dark\",\"description\":\"An arctic, north-bluish color palette.\",\"tags\":\"$:/tags/Palette\",\"type\":\"application/x-tiddler-dictionary\",\"license\":\"MIT, arcticicestudio, https://github.com/arcticicestudio/nord/blob/develop/LICENSE.md\",\"text\":\"alert-background: #D08770\\nalert-border: #D08770\\nalert-highlight: #B48EAD\\nalert-muted-foreground: #4C566A\\nbackground: #3b4252\\nblockquote-bar: \u003C\u003Ccolour muted-foreground>>\\nbutton-foreground: \u003C\u003Ccolour foreground>>\\ncode-background: #2E3440\\ncode-border: #2E3440\\ncode-foreground: #BF616A\\ndiff-delete-background: #BF616A\\ndiff-delete-foreground: \u003C\u003Ccolour foreground>>\\ndiff-equal-background: \\ndiff-equal-foreground: \u003C\u003Ccolour foreground>>\\ndiff-insert-background: #A3BE8C\\ndiff-insert-foreground: \u003C\u003Ccolour foreground>>\\ndiff-invisible-background: \\ndiff-invisible-foreground: \u003C\u003Ccolour muted-foreground>>\\ndirty-indicator: #BF616A\\ndownload-background: #A3BE8C\\ndownload-foreground: \u003C\u003Ccolour background>>\\ndragger-background: \u003C\u003Ccolour foreground>>\\ndragger-foreground: \u003C\u003Ccolour background>>\\ndropdown-background: \u003C\u003Ccolour background>>\\ndropdown-border: \u003C\u003Ccolour background>>\\ndropdown-tab-background-selected: #ECEFF4\\ndropdown-tab-background: #4C566A\\ndropzone-background: #A3BE8C\\nexternal-link-background-hover: inherit\\nexternal-link-background-visited: inherit\\nexternal-link-background: inherit\\nexternal-link-foreground-hover: inherit\\nexternal-link-foreground-visited: #5E81AC\\nexternal-link-foreground: #8FBCBB\\nforeground: #d8dee9\\nhighlight-background: #ffff78\\nhighlight-foreground: #000000\\nmenubar-background: #2E3440\\nmenubar-foreground: #d8dee9\\nmessage-background: #2E3440\\nmessage-border: #2E3440\\nmessage-foreground: #547599\\nmodal-backdrop: \u003C\u003Ccolour foreground>>\\nmodal-background: \u003C\u003Ccolour background>>\\nmodal-border: #3b4252\\nmodal-footer-background: #3b4252\\nmodal-footer-border: #3b4252\\nmodal-header-border: #3b4252\\nmuted-foreground: #4C566A\\nnotification-background: \u003C\u003Ccolour primary>>\\nnotification-border: #EBCB8B\\npage-background: #2e3440\\npre-background: #2E3440\\npre-border: #2E3440\\nprimary: #5E81AC\\nselect-tag-background: #3b4252\\nselect-tag-foreground: \u003C\u003Ccolour foreground>>\\nselection-background: #5E81AC\\nselection-foreground: \u003C\u003Ccolour foreground>>\\nsidebar-button-foreground: \u003C\u003Ccolour foreground>>
2731\\nsidebar-controls-foreground-hover: #D8DEE9\\nsidebar-controls-foreground: #4C566A\\nsidebar-foreground-shadow: transparent\\nsidebar-foreground: #D8DEE9\\nsidebar-muted-foreground-hover: #4C566A\\nsidebar-muted-foreground: #4C566A\\nsidebar-tab-background-selected: #ECEFF4\\nsidebar-tab-background: #4C566A\\nsidebar-tab-border-selected: \u003C\u003Ccolour tab-border-selected>>\\nsidebar-tab-border: #4C566A\\nsidebar-tab-divider: \u003C\u003Ccolour page-background>>\\nsidebar-tab-foreground-selected: #4C566A\\nsidebar-tab-foreground: \u003C\u003Ccolour tab-foreground>>\\nsidebar-tiddler-link-foreground-hover: #A3BE8C\\nsidebar-tiddler-link-foreground: #81A1C1\\nsite-title-foreground: \u003C\u003Ccolour tiddler-title-foreground>>\\nstatic-alert-foreground: #B48EAD\\ntab-background-selected: #ECEFF4\\ntab-background: #4C566A\\ntab-border-selected: #4C566A\\ntab-border: #4C566A\\ntab-divider: #4C566A\\ntab-foreground-selected: #4C566A\\ntab-foreground: #D8DEE9\\ntable-border: #4C566A\\ntable-footer-background: #2e3440\\ntable-header-background: #2e3440\\ntag-background: #A3BE8C\\ntag-foreground: #4C566A\\ntiddler-background: \u003C\u003Ccolour background>>\\ntiddler-border: \u003C\u003Ccolour background>>\\ntiddler-controls-foreground-hover: \\ntiddler-controls-foreground-selected: #EBCB8B\\ntiddler-controls-foreground: #4C566A\\ntiddler-editor-background: #2e3440\\ntiddler-editor-border-image: #2e3440\\ntiddler-editor-border: #3b4252\\ntiddler-editor-fields-even: #2e3440\\ntiddler-editor-fields-odd: #2e3440\\ntiddler-info-background: #2e3440\\ntiddler-info-border: #2e3440\\ntiddler-info-tab-background: #2e3440\\ntiddler-link-background: \u003C\u003Ccolour background>>\\ntiddler-link-foreground: \u003C\u003Ccolour primary>>\\ntiddler-subtitle-foreground: #4C566A\\ntiddler-title-foreground: #81A1C1\\ntoolbar-new-button: \\ntoolbar-options-button: \\ntoolbar-save-button: \\ntoolbar-info-button: \\ntoolbar-edit-button: \\ntoolbar-close-button: \\ntoolbar-delete-button: \\ntoolbar-cancel-button: \\ntoolbar-done-button: \\nuntagged-background: #2d3038\\nvery-muted-foreground: #2d3038\\nwikilist-background: \u003C\u003Ccolour page-background>>\\nwikilist-toolbar-background: \u003C\u003Ccolour background>>\\nwikilist-item: \u003C\u003Ccolour background>>\\nwikilist-title: \u003C\u003Ccolour foreground>>\\nwikilist-info: \u003C\u003Ccolour muted-foreground>>\\nwikilist-button-open: #A3BE8C\\nwikilist-button-open-hover: #A3BE8C\\nwikilist-button-reveal: #81A1C1\\nwikilist-button-reveal-hover: #81A1C1\\nwikilist-button-remove: #B48EAD\\nwikilist-button-remove-hover: #B48EAD\\n\"},\"$:/palettes/Rocker\":{\"title\":\"$:/palettes/Rocker\",\"name\":\"Rocker\",\"color-scheme\":\"dark\",\"description\":\"A dark theme\",\"tags\":\"$:/tags/Palette\",\"type\":\"application/x-tiddler-dictionary\",\"text\":\"alert-background: #ffe476\\nalert-border: #b99e2f\\nalert-highlight: #881122\\nalert-muted-foreground: #b99e2f\\nbackground: #ffffff\\nblockquote-bar: \u003C\u003Ccolour muted-foreground>>\\nbutton-background:\\nbutton-foreground:\\nbutton-border:\\ncode-background: #f7f7f9\\ncode-border: #e1e1e8\\ncode-foreground: #dd1144\\ndirty-indicator: #ff0000\\ndownload-background: #34c734\\ndownload-foreground: \u003C\u003Ccolour background>>\\ndragger-background: \u003C\u003Ccolour foreground>>\\ndragger-foreground: \u003C\u003Ccolour background>>\\ndropdown-background: \u003C\u003Ccolour background>>\\ndropdown-border: \u003C\u003Ccolour muted-foreground>>\\ndropdown-tab-background-selected: #fff\\ndropdown-tab-background: #ececec\\ndropzone-background: rgba(0,200,0,0.7)\\nexternal-link-background-hover: inherit\\nexternal-link-background-visited: inherit\\nexternal-link-background: inherit\\nexternal-link-foreground-hover: inherit\\nexternal-link-foreground-visited: #0000aa\\nexternal-link-foreground: #0000ee\\nforeground: #333333\\nhighlight-background: #ffff00\\nhighlight-foreground: #000000\\nmessage-background: #ecf2ff\\nmessage-border: #cfd6e6\\nmessage-foreground: #547599\\nmodal-backdrop: \u003C\u003Ccolour foreground>>\\nmodal-background: \u003C\u003Ccolour background>>\\nmodal-border: #999999\\nmodal-footer-background: #f5f5f5\\nmodal-footer-border: #dddddd\\nmodal-header-border: #eeeeee\\nmuted-foreground: #999999\\nnotification-background: #ffffdd\\nnotification-border: #999999\\npage-background: #000\\npre-background: #f5f5f5\\npre-border: #cccccc\\nprimary: #cc0000\\nselect-tag-background:\\nselect-tag-foreground:\\nsidebar-button-foreground: \u003C\u003Ccolour foreground>>
2731\\nsidebar-controls-foreground-hover: #000000\\nsidebar-controls-foreground: #ffffff\\nsidebar-foreground-shadow: rgba(255,255,255, 0.0)\\nsidebar-foreground: #acacac\\nsidebar-muted-foreground-hover: #444444\\nsidebar-muted-foreground: #c0c0c0\\nsidebar-tab-background-selected: #000\\nsidebar-tab-background: \u003C\u003Ccolour tab-background>>\\nsidebar-tab-border-selected: \u003C\u003Ccolour tab-border-selected>>\\nsidebar-tab-border: \u003C\u003Ccolour tab-border>>\\nsidebar-tab-divider: \u003C\u003Ccolour tab-divider>>\\nsidebar-tab-foreground-selected: \\nsidebar-tab-foreground: \u003C\u003Ccolour tab-foreground>>\\nsidebar-tiddler-link-foreground-hover: #ffbb99\\nsidebar-tiddler-link-foreground: #cc0000\\nsite-title-foreground: \u003C\u003Ccolour tiddler-title-foreground>>\\nstatic-alert-foreground: #aaaaaa\\ntab-background-selected: #ffffff\\ntab-background: #d8d8d8\\ntab-border-selected: #d8d8d8\\ntab-border: #cccccc\\ntab-divider: #d8d8d8\\ntab-foreground-selected: \u003C\u003Ccolour tab-foreground>>\\ntab-foreground: #666666\\ntable-border: #dddddd\\ntable-footer-background: #a8a8a8\\ntable-header-background: #f0f0f0\\ntag-background: #ffbb99\\ntag-foreground: #000\\ntiddler-background: \u003C\u003Ccolour background>>\\ntiddler-border: \u003C\u003Ccolour background>>\\ntiddler-controls-foreground-hover: #888888\\ntiddler-controls-foreground-selected: #444444\\ntiddler-controls-foreground: #cccccc\\ntiddler-editor-background: #f8f8f8\\ntiddler-editor-border-image: #ffffff\\ntiddler-editor-border: #cccccc\\ntiddler-editor-fields-even: #e0e8e0\\ntiddler-editor-fields-odd: #f0f4f0\\ntiddler-info-background: #f8f8f8\\ntiddler-info-border: #dddddd\\ntiddler-info-tab-background: #f8f8f8\\ntiddler-link-background: \u003C\u003Ccolour background>>\\ntiddler-link-foreground: \u003C\u003Ccolour primary>>\\ntiddler-subtitle-foreground: #c0c0c0\\ntiddler-title-foreground: #cc0000\\ntoolbar-new-button:\\ntoolbar-options-button:\\ntoolbar-save-button:\\ntoolbar-info-button:\\ntoolbar-edit-button:\\ntoolbar-close-button:\\ntoolbar-delete-button:\\ntoolbar-cancel-button:\\ntoolbar-done-button:\\nuntagged-background: #999999\\nvery-muted-foreground: #888888\\n\"},\"$:/palettes/SolarFlare\":{\"title\":\"$:/palettes/SolarFlare\",\"name\":\"Solar Flare\",\"color-scheme\":\"light\",\"description\":\"Warm, relaxing earth colours\",\"tags\":\"$:/tags/Palette\",\"type\":\"application/x-tiddler-dictionary\",\"text\":\": Background Tones\\n\\nbase03: #002b36\\nbase02: #073642\\n\\n: Content Tones\\n\\nbase01: #586e75\\nbase00: #657b83\\nbase0: #839496\\nbase1: #93a1a1\\n\\n: Background Tones\\n\\nbase2: #eee8d5\\nbase3: #fdf6e3\\n\\n: Accent Colors\\n\\nyellow: #b58900\\norange: #cb4b16\\nred: #dc322f\\nmagenta: #d33682\\nviolet: #6c71c4\\nblue: #268bd2\\ncyan: #2aa198\\ngreen: #859900\\n\\n: Additional Tones (RA)\\n\\nbase10: #c0c4bb\\nviolet-muted: #7c81b0\\nblue-muted: #4e7baa\\n\\nyellow-hot: #ffcc44\\norange-hot: #eb6d20\\nred-hot: #ff2222\\nblue-hot: #2298ee\\ngreen-hot: #98ee22\\n\\n: Palette\\n\\n: Do not use colour macro for background and foreground\\nbackground: #fdf6e3\\n    download-foreground: \u003C\u003Ccolour background>>\\n    dragger-foreground: \u003C\u003Ccolour background>>\\n    dropdown-background: \u003C\u003Ccolour background>>\\n    modal-background: \u003C\u003Ccolour background>>\\n    sidebar-foreground-shadow: \u003C\u003Ccolour background>>\\n    tiddler-background: \u003C\u003Ccolour background>>\\n    tiddler-border: \u003C\u003Ccolour background>>\\n    tiddler-link-background: \u003C\u003Ccolour background>>\\n    tab-background-selected: \u003C\u003Ccolour background>>\\n        dropdown-tab-background-selected: \u003C\u003Ccolour tab-background-selected>>\\nforeground: #657b83\\n    dragger-background: \u003C\u003Ccolour foreground>>\\n    tab-foreground: \u003C\u003Ccolour foreground>>\\n        tab-foreground-selected: \u003C\u003Ccolour tab-foreground>>\\n            sidebar-tab-foreground-selected: \u003C\u003Ccolour tab-foreground-selected>>\\n        sidebar-tab-foreground: \u003C\u003Ccolour tab-foreground>>\\n    sidebar-button-foreground: \u003C\u003Ccolour foreground>>
2731\\n    sidebar-controls-foreground: \u003C\u003Ccolour foreground>>\\n    sidebar-foreground: \u003C\u003Ccolour foreground>>\\n: base03\\n: base02\\n: base01\\n    alert-muted-foreground: \u003C\u003Ccolour base01>>\\n: base00\\n    code-foreground: \u003C\u003Ccolour base00>>\\n    message-foreground: \u003C\u003Ccolour base00>>\\n    tag-foreground: \u003C\u003Ccolour base00>>\\n: base0\\n    sidebar-tiddler-link-foreground: \u003C\u003Ccolour base0>>\\n: base1\\n    muted-foreground: \u003C\u003Ccolour base1>>\\n        blockquote-bar: \u003C\u003Ccolour muted-foreground>>\\n        dropdown-border: \u003C\u003Ccolour muted-foreground>>\\n        sidebar-muted-foreground: \u003C\u003Ccolour muted-foreground>>\\n        tiddler-title-foreground: \u003C\u003Ccolour muted-foreground>>\\n            site-title-foreground: \u003C\u003Ccolour tiddler-title-foreground>>\\n: base2\\n    modal-footer-background: \u003C\u003Ccolour base2>>\\n    page-background: \u003C\u003Ccolour base2>>\\n        modal-backdrop: \u003C\u003Ccolour page-background>>\\n        notification-background: \u003C\u003Ccolour page-background>>\\n        code-background: \u003C\u003Ccolour page-background>>\\n            code-border: \u003C\u003Ccolour code-background>>\\n        pre-background: \u003C\u003Ccolour page-background>>\\n            pre-border: \u003C\u003Ccolour pre-background>>\\n        sidebar-tab-background-selected: \u003C\u003Ccolour page-background>>\\n    table-header-background: \u003C\u003Ccolour base2>>\\n    tag-background: \u003C\u003Ccolour base2>>\\n    tiddler-editor-background: \u003C\u003Ccolour base2>>\\n    tiddler-info-background: \u003C\u003Ccolour base2>>\\n    tiddler-info-tab-background: \u003C\u003Ccolour base2>>\\n    tab-background: \u003C\u003Ccolour base2>>\\n        dropdown-tab-background: \u003C\u003Ccolour tab-background>>\\n: base3\\n    alert-background: \u003C\u003Ccolour base3>>\\n    message-background: \u003C\u003Ccolour base3>>\\n: yellow\\n: orange\\n: red\\n: magenta\\n    alert-highlight: \u003C\u003Ccolour magenta>>\\n: violet\\n    external-link-foreground: \u003C\u003Ccolour violet>>\\n: blue\\n: cyan\\n: green\\n: base10\\n    tiddler-controls-foreground: \u003C\u003Ccolour base10>>\\n: violet-muted\\n    external-link-foreground-visited: \u003C\u003Ccolour violet-muted>>\\n: blue-muted\\n    primary: \u003C\u003Ccolour blue-muted>>\\n        download-background: \u003C\u003Ccolour primary>>\\n        tiddler-link-foreground: \u003C\u003Ccolour primary>>\\n\\nalert-border: #b99e2f\\ndirty-indicator: #ff0000\\ndropzone-background: rgba(0,200,0,0.7)\\nexternal-link-background-hover: inherit\\nexternal-link-background-visited: inherit\\nexternal-link-background: inherit\\nexternal-link-foreground-hover: inherit\\nhighlight-background: #ffff00\\nhighlight-foreground: #000000\\nmessage-border: #cfd6e6\\nmodal-border: #999999\\nselect-tag-background:\\nselect-tag-foreground:\\nsidebar-controls-foreground-hover:\\nsidebar-muted-foreground-hover:\\nsidebar-tab-background: #ded8c5\\nsidebar-tiddler-link-foreground-hover:\\nstatic-alert-foreground: #aaaaaa\\ntab-border: #cccccc\\n    modal-footer-border: \u003C\u003Ccolour tab-border>>\\n    modal-header-border: \u003C\u003Ccolour tab-border>>\\n    notification-border: \u003C\u003Ccolour tab-border>>\\n    sidebar-tab-border: \u003C\u003Ccolour tab-border>>\\n    tab-border-selected: \u003C\u003Ccolour tab-border>>\\n        sidebar-tab-border-selected: \u003C\u003Ccolour tab-border-selected>>\\ntab-divider: #d8d8d8\\n    sidebar-tab-divider: \u003C\u003Ccolour tab-divider>>\\ntable-border: #dddddd\\ntable-footer-background: #a8a8a8\\ntiddler-controls-foreground-hover: #888888\\ntiddler-controls-foreground-selected: #444444\\ntiddler-editor-border-image: #ffffff\\ntiddler-editor-border: #cccccc\\ntiddler-editor-fields-even: #e0e8e0\\ntiddler-editor-fields-odd: #f0f4f0\\ntiddler-info-border: #dddddd\\ntiddler-subtitle-foreground: #c0c0c0\\ntoolbar-new-button:\\ntoolbar-options-button:\\ntoolbar-save-button:\\ntoolbar-info-button:\\ntoolbar-edit-button:\\ntoolbar-close-button:\\ntoolbar-delete-button:\\ntoolbar-cancel-button:\\ntoolbar-done-button:\\nuntagged-background: #999999\\nvery-muted-foreground: #888888\\n\"},\"$:/palettes/SolarizedDark\":{\"title\":\"$:/palettes/SolarizedDark\",\"tags\":\"$:/tags/Palette\",\"type\":\"application/x-tiddler-dictionary\",\"description\":\"Precision dark colors for machines and people\",\"license\":\"MIT, Ethan Schoonover, https://github.com/altercation/solarized/blob/master/LICENSE\",\"name\":\"SolarizedDark\",\"color-scheme\":\"dark\",\"text\":\"alert-background: #073642\\nalert-border: #93a1a1\\nalert-highlight: #d33682\\nalert-muted-foreground: #d33682\\nbackground: #073642\\nblockquote-bar: #d33682\\nbutton-background: #073642\\nbutton-border: #586e7
27315\\nbutton-foreground: #93a1a1\\ncode-background: #073642\\ncode-border: #586e75\\ncode-foreground: #93a1a1\\ndirty-indicator: inherit\\ndownload-background: #859900\\ndownload-foreground: #073642\\ndragger-background: #073642\\ndragger-foreground: #839496\\ndropdown-background: #073642\\ndropdown-border: #93a1a1\\ndropdown-tab-background: #002b36\\ndropdown-tab-background-selected: #073642\\ndropzone-background: #859900\\nexternal-link-background: inherit\\nexternal-link-background-hover: inherit\\nexternal-link-background-visited: inherit\\nexternal-link-foreground: #268bd2\\nexternal-link-foreground-hover:\\nexternal-link-foreground-visited: #268bd2\\nforeground: #839496\\nhighlight-background: #ffff78\\nhighlight-foreground: #000000\\nmessage-background: #002b36\\nmessage-border: #586e75\\nmessage-foreground: #839496\\nmodal-backdrop: #657b83\\nmodal-background: #002b36\\nmodal-border: #586e75\\nmodal-footer-background: #073642\\nmodal-footer-border: #586e75\\nmodal-header-border: #586e75\\nmuted-foreground: #93a1a1\\nnotification-background: #002b36\\nnotification-border: #586e75\\npage-background: #073642\\npre-background: inherit\\npre-border: #657b83\\nprimary: #859900\\nselect-tag-background: #002b36\\nselect-tag-foreground: #839496\\nsidebar-button-foreground: #93a1a1\\nsidebar-controls-foreground: #93a1a1\\nsidebar-controls-foreground-hover: #eee8d5\\nsidebar-foreground: #93a1a1\\nsidebar-foreground-shadow: transparent\\nsidebar-muted-foreground: #839496\\nsidebar-muted-foreground-hover: #93a1a1\\nsidebar-tab-background: #002b36\\nsidebar-tab-background-selected: #073642\\nsidebar-tab-border: #073642\\nsidebar-tab-border-selected: #839496\\nsidebar-tab-divider: #002b36\\nsidebar-tab-foreground: #657b83\\nsidebar-tab-foreground-selected: #93a1a1\\nsidebar-tiddler-link-foreground: #2aa198\\nsidebar-tiddler-link-foreground-hover: #eee8d5\\nsite-title-foreground: #d33682\\nstatic-alert-foreground: #93a1a1\\ntab-background: #073642\\ntab-background-selected: #002b36\\ntab-border: #586e75\\ntab-border-selected: #93a1a1\\ntab-divider: #93a1a1\\ntab-foreground: #839496\\ntab-foreground-selected: #93a1a1\\ntable-border: #586e75\\ntable-footer-background: #073642\\ntable-header-background: #073642\\ntag-background: #b58900\\ntag-foreground: #002b36\\ntiddler-background: #002b36\\ntiddler-border: #586e75\\ntiddler-controls-foreground: inherit\\ntiddler-controls-foreground-hover: #d33682\\ntiddler-controls-foreground-selected: #2aa198\\ntiddler-editor-background: #002b36\\ntiddler-editor-border: #073642\\ntiddler-editor-border-image: #002b36\\ntiddler-editor-fields-even: #002b36\\ntiddler-editor-fields-odd: #073642\\ntiddler-info-background: #073642\\ntiddler-info-border: #657b83\\ntiddler-info-tab-background: #002b36\\ntiddler-link-background: #002b36\\ntiddler-link-foreground: #2aa198\\ntiddler-subtitle-foreground: #839496\\ntiddler-title-foreground: #d33682\\ntoolbar-cancel-button: #839496\\ntoolbar-close-button: #839496\\ntoolbar-delete-button: #dc322f\\ntoolbar-done-button: #839496\\ntoolbar-edit-button: #839496\\ntoolbar-info-button: #839496\\ntoolbar-new-button: #839496\\ntoolbar-options-button: #839496\\ntoolbar-save-button: inherit\\nuntagged-background: #586e75\\nvery-muted-foreground: #586e75\\n\"},\"$:/palettes/SolarizedLight\":{\"title\":\"$:/palettes/SolarizedLight\",\"tags\":\"$:/tags/Palette\",\"type\":\"application/x-tiddler-dictionary\",\"description\":\"Precision colors for machines and people\",\"license\":\"MIT, Ethan Schoonover, https://github.com/altercation/solarized/blob/master/LICENSE\",\"name\":\"SolarizedLight\",\"color-scheme\":\"light\",\"text\":\"alert-background: #eee8d5\\nalert-border: #586e75\\nalert-highlight: #d33682\\nalert-muted-foreground: #d33682\\nbackground: #eee8d5\\nblockquote-bar: #d33682\\nbutton-background: #eee8d5\\nbutton-border: #93a1a1\\nbutton-foreground: #586e75\\ncode-background: #eee8d5\\ncode-border: #93a1a1\\ncode-foreground: #586e75\\ndirty-indicator: inherit\\ndownload-background: #859900\\ndownload-foreground: #eee8d5\\ndragger-background: #eee8d5\\ndragger-foreground: #657b83\\ndropdown-background: #eee8d5\\ndropdown-border: #586e7
27315\\ndropdown-tab-background: #fdf6e3\\ndropdown-tab-background-selected: #eee8d5\\ndropzone-background: #859900\\nexternal-link-background: inherit\\nexternal-link-background-hover: inherit\\nexternal-link-background-visited: inherit\\nexternal-link-foreground: #268bd2\\nexternal-link-foreground-hover: inherit\\nexternal-link-foreground-visited: #268bd2\\nforeground: #657b83\\nhighlight-background: #ffff00\\nhighlight-foreground: #000000\\nmessage-background: #fdf6e3\\nmessage-border: #93a1a1\\nmessage-foreground: #657b83\\nmodal-backdrop: #839496\\nmodal-background: #fdf6e3\\nmodal-border: #93a1a1\\nmodal-footer-background: #eee8d5\\nmodal-footer-border: #93a1a1\\nmodal-header-border: #93a1a1\\nmuted-foreground: #586e75\\nnotification-background: #fdf6e3\\nnotification-border: #93a1a1\\npage-background: #eee8d5\\npre-background: #eee8d5\\npre-border: #839496\\nprimary: #859900\\nselect-tag-background: #fdf6e3\\nselect-tag-foreground: #657b83\\nsidebar-button-foreground: #586e75\\nsidebar-controls-foreground: #586e75\\nsidebar-controls-foreground-hover: #d33682\\nsidebar-foreground: #586e75\\nsidebar-foreground-shadow: transparent\\nsidebar-muted-foreground: #657b83\\nsidebar-muted-foreground-hover: #586e75\\nsidebar-tab-background: #fdf6e3\\nsidebar-tab-background-selected: #eee8d5\\nsidebar-tab-border: #eee8d5\\nsidebar-tab-border-selected: #657b83\\nsidebar-tab-divider: #fdf6e3\\nsidebar-tab-foreground: #839496\\nsidebar-tab-foreground-selected: #586e75\\nsidebar-tiddler-link-foreground: #2aa198\\nsidebar-tiddler-link-foreground-hover: #002b36\\nsite-title-foreground: #d33682\\nstatic-alert-foreground: #586e75\\ntab-background: #eee8d5\\ntab-background-selected: #fdf6e3\\ntab-border: #93a1a1\\ntab-border-selected: #586e75\\ntab-divider: #586e75\\ntab-foreground: #657b83\\ntab-foreground-selected: #586e75\\ntable-border: #93a1a1\\ntable-footer-background: #eee8d5\\ntable-header-background: #eee8d5\\ntag-background: #b58900\\ntag-foreground: #fdf6e3\\ntiddler-background: #fdf6e3\\ntiddler-border: #93a1a1\\ntiddler-controls-foreground: inherit\\ntiddler-controls-foreground-hover: #d33682\\ntiddler-controls-foreground-selected: #2aa198\\ntiddler-editor-background: #fdf6e3\\ntiddler-editor-border: #eee8d5\\ntiddler-editor-border-image: #fdf6e3\\ntiddler-editor-fields-even: #fdf6e3\\ntiddler-editor-fields-odd: #eee8d5\\ntiddler-info-background: #eee8d5\\ntiddler-info-border: #839496\\ntiddler-info-tab-background: #fdf6e3\\ntiddler-link-background: #fdf6e3\\ntiddler-link-foreground: #2aa198\\ntiddler-subtitle-foreground: #657b83\\ntiddler-title-foreground: #d33682\\ntoolbar-cancel-button: #657b83\\ntoolbar-close-button: #657b83\\ntoolbar-delete-button: #dc322f\\ntoolbar-done-button: #657b83\\ntoolbar-edit-button: #657b83\\ntoolbar-info-button: #657b83\\ntoolbar-new-button: #657b83\\ntoolbar-options-button: #657b83\\ntoolbar-save-button: inherit\\nuntagged-background: #586e75\\nvery-muted-foreground: #93a1a1\\n\"},\"$:/palettes/SpartanDay\":{\"title\":\"$:/palettes/SpartanDay\",\"tags\":\"$:/tags/Palette\",\"type\":\"application/x-tiddler-dictionary\",\"description\":\"Cold, spartan day colors\",\"name\":\"Spartan Day\",\"color-scheme\":\"light\",\"text\":\"alert-background: \u003C\u003Ccolour background>>\\nalert-border: \u003C\u003Ccolour very-muted-foreground>>\\nalert-highlight: \u003C\u003Ccolour very-muted-foreground>>\\nalert-muted-foreground: \u003C\u003Ccolour muted-foreground>>\\nbackground: #FAFAFA\\nblockquote-bar: \u003C\u003Ccolour page-background>>\\nbutton-background: transparent\\nbutton-foreground: inherit\\nbutton-border: \u003C\u003Ccolour tag-background>>\\ncode-background: #ececec\\ncode-border: #ececec\\ncode-foreground: \\ndirty-indicator: #c80000\\ndownload-background: \u003C\u003Ccolour primary>>\\ndownload-foreground: \u003C\u003Ccolour background>>\\ndragger-background: \u003C\u003Ccolour foreground>>\\ndragger-foreground: \u003C\u003Ccolour background>>\\ndropdown-background: #FFFFFF\\ndropdown-border: \u003C\u003Ccolour dropdown-background>>\\ndropdown-tab-background-selected: \u003C\u003Ccolour dropdown-background>>\\ndropdown-tab-background: #F5F5F5\\ndropzone-background: \u003C\u003Ccolour tag-background>>\\nexternal-link-background-hover: transparent\\nexternal-link-background-visited: transparent\\nexternal-link-background: transparent\\nexternal-link-foreground-hover: \\nexternal-link-foreground-visited: \\nexternal-link-foreground: \\nforeground: rgba(0, 0, 0, 0.87)\\nhighlight-background: #ffff00\\nhighlight-foreground: #000000\\nmessage-background: \u003C\u003Ccolour background>>\\nmessage-border: \u003C\u003Ccolour very-muted-foreground>>\\nmessage-foreground: rgba(0, 0, 0, 0.54)\\nmodal-backdrop: \u003C\u003Ccolour foreground>>\\nmodal-background: \u003C\u003Ccolour background>>\\nmodal-border: \u003C\u003Ccolour very-muted-foreground>>\\nmodal-footer-background: \u003C\u003Ccolour background>>\\nmodal-footer-border: \u003C\u003Ccolour very-muted-foreground>>\\nmodal-header-border: \u003C\u003Ccolour very-muted-foreground>>\\nmuted-foreground: rgba(0, 0, 0, 0.54)\\nnotification-background: \u003C\u003Ccolour dropdown-background>>\\nnotification-border: \u003C\u003Ccolour dropdown-background>>\\npage-background: #f4f4f4\\npre-background: #ececec\\npre-border: #ececec\\nprimary: #3949ab\\nselect-tag-background: \u003C\u003Ccolour background>>\\nselect-tag-foreground: \u003C\u003Ccolour foreground>>\\nsidebar-button-foreground: \u003C\u003Ccolour foreground>>
2731\\nsidebar-controls-foreground-hover: #aeaeae\\nsidebar-controls-foreground: #c6c6c6\\nsidebar-foreground-shadow: transparent\\nsidebar-foreground: rgba(0, 0, 0, 0.54)\\nsidebar-muted-foreground-hover: rgba(0, 0, 0, 0.54)\\nsidebar-muted-foreground: rgba(0, 0, 0, 0.38)\\nsidebar-tab-background-selected: \u003C\u003Ccolour page-background>>\\nsidebar-tab-background: transparent\\nsidebar-tab-border-selected: \u003C\u003Ccolour table-border>>\\nsidebar-tab-border: transparent\\nsidebar-tab-divider: \u003C\u003Ccolour table-border>>\\nsidebar-tab-foreground-selected: rgba(0, 0, 0, 0.87)\\nsidebar-tab-foreground: rgba(0, 0, 0, 0.54)\\nsidebar-tiddler-link-foreground-hover: rgba(0, 0, 0, 0.87)\\nsidebar-tiddler-link-foreground: rgba(0, 0, 0, 0.54)\\nsite-title-foreground: rgba(0, 0, 0, 0.87)\\nstatic-alert-foreground: #aaaaaa\\ntab-background-selected: \u003C\u003Ccolour background>>\\ntab-background: transparent\\ntab-border-selected: \u003C\u003Ccolour table-border>>\\ntab-border: transparent\\ntab-divider: \u003C\u003Ccolour table-border>>\\ntab-foreground-selected: rgba(0, 0, 0, 0.87)\\ntab-foreground: rgba(0, 0, 0, 0.54)\\ntable-border: #d8d8d8\\ntable-footer-background: \u003C\u003Ccolour tiddler-editor-fields-odd>>\\ntable-header-background: \u003C\u003Ccolour tiddler-editor-fields-even>>\\ntag-background: #ec6\\ntag-foreground: \u003C\u003Ccolour button-foreground>>\\ntiddler-background: \u003C\u003Ccolour background>>\\ntiddler-border: #f9f9f9\\ntiddler-controls-foreground-hover: \u003C\u003Ccolour sidebar-controls-foreground-hover>>\\ntiddler-controls-foreground-selected: \u003C\u003Ccolour sidebar-controls-foreground-hover>>\\ntiddler-controls-foreground: \u003C\u003Ccolour sidebar-controls-foreground>>\\ntiddler-editor-background: transparent\\ntiddler-editor-border-image: \\ntiddler-editor-border: #e8e7e7\\ntiddler-editor-fields-even: rgba(0, 0, 0, 0.1)\\ntiddler-editor-fields-odd: rgba(0, 0, 0, 0.04)\\ntiddler-info-background: #F5F5F5\\ntiddler-info-border: #F5F5F5\\ntiddler-info-tab-background: \u003C\u003Ccolour tiddler-editor-fields-odd>>\\ntiddler-link-background: \u003C\u003Ccolour background>>\\ntiddler-link-foreground: \u003C\u003Ccolour primary>>\\ntiddler-subtitle-foreground: \u003C\u003Ccolour muted-foreground>>\\ntiddler-title-foreground: #000000\\ntoolbar-new-button: \\ntoolbar-options-button: \\ntoolbar-save-button: \\ntoolbar-info-button: \\ntoolbar-edit-button: \\ntoolbar-close-button: \\ntoolbar-delete-button: \\ntoolbar-cancel-button: \\ntoolbar-done-button: \\nuntagged-background: \u003C\u003Ccolour very-muted-foreground>>\\nvery-muted-foreground: rgba(0, 0, 0, 0.12)\\n\"},\"$:/palettes/SpartanNight\":{\"title\":\"$:/palettes/SpartanNight\",\"tags\":\"$:/tags/Palette\",\"type\":\"application/x-tiddler-dictionary\",\"description\":\"Dark spartan colors\",\"name\":\"Spartan Night\",\"color-scheme\":\"dark\",\"text\":\"alert-background: \u003C\u003Ccolour background>>\\nalert-border: \u003C\u003Ccolour very-muted-foreground>>\\nalert-highlight: \u003C\u003Ccolour very-muted-foreground>>\\nalert-muted-foreground: \u003C\u003Ccolour muted-foreground>>\\nbackground: #303030\\nblockquote-bar: \u003C\u003Ccolour page-background>>\\nbutton-background: transparent\\nbutton-foreground: inherit\\nbutton-border: \u003C\u003Ccolour tag-background>>\\ncode-background: \u003C\u003Ccolour pre-background>>\\ncode-border: \u003C\u003Ccolour pre-border>>\\ncode-foreground: rgba(255, 255, 255, 0.54)\\ndirty-indicator: #c80000\\ndownload-background: \u003C\u003Ccolour primary>>\\ndownload-foreground: \u003C\u003Ccolour foreground>>\\ndragger-background: \u003C\u003Ccolour foreground>>\\ndragger-foreground: \u003C\u003Ccolour background>>\\ndropdown-background: #424242\\ndropdown-border: \u003C\u003Ccolour dropdown-background>>\\ndropdown-tab-background-selected: \u003C\u003Ccolour dropdown-background>>\\ndropdown-tab-background: #050505\\ndropzone-background: \u003C\u003Ccolour tag-background>>\\nexternal-link-background-hover: transparent\\nexternal-link-background-visited: transparent\\nexternal-link-background: transparent\\nexternal-link-foreground-hover: \\nexternal-link-foreground-visited: #7c318c\\nexternal-link-foreground: #9e3eb3\\nforeground: rgba(255, 255, 255, 0.7)\\nhighlight-background: #ffff78\\nhighlight-foreground: #000000\\nmessage-background: \u003C\u003Ccolour background>>\\nmessage-border: \u003C\u003Ccolour very-muted-foreground>>\\nmessage-foreground: rgba(255, 255, 255, 0.54)\\nmodal-backdrop: \u003C\u003Ccolour page-background>>\\nmodal-background: \u003C\u003Ccolour background>>\\nmodal-border: \u003C\u003Ccolour very-muted-foreground>>\\nmodal-footer-background: \u003C\u003Ccolour background>>\\nmodal-footer-border: \u003C\u003Ccolour background>>\\nmodal-header-border: \u003C\u003Ccolour very-muted-foreground>>\\nmuted-foreground: rgba(255, 255, 255, 0.54)\\nnotification-background: \u003C\u003Ccolour dropdown-background>>\\nnotification-border: \u003C\u003Ccolour dropdown-background>>\\npage-background: #212121\\npre-background: #2a2a2a\\npre-border: transparent\\nprimary: #5656f3\\nselect-tag-background: \u003C\u003Ccolour background>>\\nselect-tag-foreground: \u003C\u003Ccolour foreground>>\\nsidebar-button-foreground: \u003C\u003Ccolour foreground>>
2731\\nsidebar-controls-foreground-hover: #494949\\nsidebar-controls-foreground: #5d5d5d\\nsidebar-foreground-shadow: transparent\\nsidebar-foreground: rgba(255, 255, 255, 0.54)\\nsidebar-muted-foreground-hover: rgba(255, 255, 255, 0.54)\\nsidebar-muted-foreground: rgba(255, 255, 255, 0.38)\\nsidebar-tab-background-selected: \u003C\u003Ccolour page-background>>\\nsidebar-tab-background: transparent\\nsidebar-tab-border-selected: \u003C\u003Ccolour table-border>>\\nsidebar-tab-border: transparent\\nsidebar-tab-divider: \u003C\u003Ccolour table-border>>\\nsidebar-tab-foreground-selected: rgba(255, 255, 255, 0.87)\\nsidebar-tab-foreground: rgba(255, 255, 255, 0.54)\\nsidebar-tiddler-link-foreground-hover: rgba(255, 255, 255, 0.7)\\nsidebar-tiddler-link-foreground: rgba(255, 255, 255, 0.54)\\nsite-title-foreground: rgba(255, 255, 255, 0.7)\\nstatic-alert-foreground: #aaaaaa\\ntab-background-selected: \u003C\u003Ccolour background>>\\ntab-background: transparent\\ntab-border-selected: \u003C\u003Ccolour table-border>>\\ntab-border: transparent\\ntab-divider: \u003C\u003Ccolour table-border>>\\ntab-foreground-selected: rgba(255, 255, 255, 0.87)\\ntab-foreground: rgba(255, 255, 255, 0.54)\\ntable-border: #3a3a3a\\ntable-footer-background: \u003C\u003Ccolour tiddler-editor-fields-odd>>\\ntable-header-background: \u003C\u003Ccolour tiddler-editor-fields-even>>\\ntag-background: #ec6\\ntag-foreground: \u003C\u003Ccolour button-foreground>>\\ntiddler-background: \u003C\u003Ccolour background>>\\ntiddler-border: rgb(55,55,55)\\ntiddler-controls-foreground-hover: \u003C\u003Ccolour sidebar-controls-foreground-hover>>\\ntiddler-controls-foreground-selected: \u003C\u003Ccolour sidebar-controls-foreground-hover>>\\ntiddler-controls-foreground: \u003C\u003Ccolour sidebar-controls-foreground>>\\ntiddler-editor-background: transparent\\ntiddler-editor-border-image: \\ntiddler-editor-border: rgba(255, 255, 255, 0.08)\\ntiddler-editor-fields-even: rgba(255, 255, 255, 0.1)\\ntiddler-editor-fields-odd: rgba(255, 255, 255, 0.04)\\ntiddler-info-background: #454545\\ntiddler-info-border: #454545\\ntiddler-info-tab-background: \u003C\u003Ccolour tiddler-editor-fields-odd>>\\ntiddler-link-background: \u003C\u003Ccolour background>>\\ntiddler-link-foreground: \u003C\u003Ccolour primary>>\\ntiddler-subtitle-foreground: \u003C\u003Ccolour muted-foreground>>\\ntiddler-title-foreground: #FFFFFF\\ntoolbar-new-button: \\ntoolbar-options-button: \\ntoolbar-save-button: \\ntoolbar-info-button: \\ntoolbar-edit-button: \\ntoolbar-close-button: \\ntoolbar-delete-button: \\ntoolbar-cancel-button: \\ntoolbar-done-button: \\nuntagged-background: \u003C\u003Ccolour very-muted-foreground>>\\nvery-muted-foreground: rgba(255, 255, 255, 0.12)\\n\"},\"$:/palettes/Twilight\":{\"title\":\"$:/palettes/Twilight\",\"tags\":\"$:/tags/Palette\",\"author\":\"Thomas Elmiger\",\"type\":\"application/x-tiddler-dictionary\",\"name\":\"Twilight\",\"description\":\"Delightful, soft darkness.\",\"color-scheme\":\"dark\",\"text\":\"alert-background: rgb(255, 255, 102)\\nalert-border: rgb(232, 232, 125)\\nalert-highlight: rgb(255, 51, 51)\\nalert-muted-foreground: rgb(224, 82, 82)\\nbackground: rgb(38, 38, 38)\\nblockquote-bar: rgba(240, 196, 117, 0.7)\\nbutton-background: rgb(63, 63, 63)\\nbutton-border: rgb(127, 127, 127)\\nbutton-foreground: rgb(179, 179, 179)\\ncode-background: rgba(0,0,0,0.03)\\ncode-border: rgba(0,0,0,0.08)\\ncode-foreground: rgb(255, 94, 94)\\ndiff-delete-background: #ffc9c9\\ndiff-delete-foreground: \u003C\u003Ccolour foreground>>\\ndiff-equal-background: \\ndiff-equal-foreground: \u003C\u003Ccolour foreground>>\\ndiff-insert-background: #aaefad\\ndiff-insert-foreground: \u003C\u003Ccolour foreground>>\\ndiff-invisible-background: \\ndiff-invisible-foreground: \u003C\u003Ccolour muted-foreground>>\\ndirty-indicator: rgb(255, 94, 94)\\ndownload-background: #19a974\\ndownload-foreground: rgb(38, 38, 38)\\ndragger-background: rgb(179, 179, 179)\\ndragger-foreground: rgb(38, 38, 38)\\ndropdown-background: rgb(38, 38, 38)\\ndropdown-border: rgb(255, 255, 255)\\ndropdown-tab-background: rgba(0,0,0,.1)\\ndropdown-tab-background-selected: rgba(255,255,255,1)\\ndropzone-background: #9eebcf\\nexternal-link-background: inherit\\nexternal-link-background-hover: inherit\\nexternal-link-background-visited: inherit\\nexternal-link-foreground: rgb(179, 179, 255)\\nexternal-link-foreground-hover: inherit\\nexternal-link-foreground-visited: rgb(153, 153, 255)\\nforeground: rgb(179, 179, 179)\\nhighlight-background: #ffff78\\nhighlight-foreground: #000000\\nmessage-background: \u003C\u003Ccolour tag-foreground>>\\nmessage-border: #96ccff\\nmessage-foreground: \u003C\u003Ccolour tag-background>>\\nmodal-backdrop: rgb(179, 179, 179)\\nmodal-background: rgb(38, 38, 38)\\nmodal-border: rgba(0,0,0,.5)\\nmodal-footer-background: #f4f4f4\\nmodal-footer-border: rgba(0,0,0,.1)\\nmodal-header-border: rgba(0,0,0,.2)\\nmuted-foreground: rgb(255, 255, 255)\\nnotification-background: \u003C\u003Ccolour tag-foreground>>\\nnotification-border: \u003C\u003Ccolour tag-background>>\\npage-background: rgb(26, 26, 26)\\npre-background: rgb(25, 25, 25)\\npre-border: rgba(0,0,0,.2)\\nprimary: rgb(255, 201, 102)\\nselect-tag-background: \\nselect-tag-foreground: \\nsidebar-button-foreground: rgb(179, 179, 179)\\nsidebar-control
2731s-foreground: rgb(153, 153, 153)\\nsidebar-controls-foreground-hover: \u003C\u003Ccolour tiddler-controls-foreground-hover>>\\nsidebar-foreground: rgb(141, 141, 141)\\nsidebar-foreground-shadow: transparent\\nsidebar-muted-foreground: rgba(0, 0, 0, 0.5)\\nsidebar-muted-foreground-hover: rgb(141, 141, 141)\\nsidebar-tab-background: rgba(141, 141, 141, 0.2)\\nsidebar-tab-background-selected: rgb(26, 26, 26)\\nsidebar-tab-border: rgb(127, 127, 127)\\nsidebar-tab-border-selected: rgb(127, 127, 127)\\nsidebar-tab-divider: rgb(127, 127, 127)\\nsidebar-tab-foreground: rgb(179, 179, 179)\\nsidebar-tab-foreground-selected: rgb(179, 179, 179)\\nsidebar-tiddler-link-foreground: rgb(179, 179, 179)\\nsidebar-tiddler-link-foreground-hover: rgb(115, 115, 115)\\nsite-title-foreground: rgb(255, 201, 102)\\nstatic-alert-foreground: rgba(0,0,0,.3)\\ntab-background: rgba(0,0,0,0.125)\\ntab-background-selected: rgb(38, 38, 38)\\ntab-border: rgb(255, 201, 102)\\ntab-border-selected: rgb(255, 201, 102)\\ntab-divider: rgb(255, 201, 102)\\ntab-foreground: rgb(179, 179, 179)\\ntab-foreground-selected: rgb(179, 179, 179)\\ntable-border: rgba(255,255,255,.3)\\ntable-footer-background: rgba(0,0,0,.4)\\ntable-header-background: rgba(0,0,0,.1)\\ntag-background: rgb(255, 201, 102)\\ntag-foreground: rgb(25, 25, 25)\\ntiddler-background: rgb(38, 38, 38)\\ntiddler-border: rgba(240, 196, 117, 0.7)\\ntiddler-controls-foreground: rgb(128, 128, 128)\\ntiddler-controls-foreground-hover: rgba(255, 255, 255, 0.8)\\ntiddler-controls-foreground-selected: rgba(255, 255, 255, 0.9)\\ntiddler-editor-background: rgb(33, 33, 33)\\ntiddler-editor-border: rgb(63, 63, 63)\\ntiddler-editor-border-image: rgb(25, 25, 25)\\ntiddler-editor-fields-even: rgb(33, 33, 33)\\ntiddler-editor-fields-odd: rgb(28, 28, 28)\\ntiddler-info-background: rgb(43, 43, 43)\\ntiddler-info-border: rgb(25, 25, 25)\\ntiddler-info-tab-background: rgb(43, 43, 43)\\ntiddler-link-background: rgb(38, 38, 38)\\ntiddler-link-foreground: rgb(204, 204, 255)\\ntiddler-subtitle-foreground: rgb(255, 255, 255)\\ntiddler-title-foreground: rgb(255, 192, 76)\\ntoolbar-cancel-button: \\ntoolbar-close-button: \\ntoolbar-delete-button: \\ntoolbar-done-button: \\ntoolbar-edit-button: \\ntoolbar-info-button: \\ntoolbar-new-button: \\ntoolbar-options-button: \\ntoolbar-save-button: \\nuntagged-background: rgb(255, 255, 255)\\nvery-muted-foreground: rgba(240, 196, 117, 0.7)\\n\"},\"$:/palettes/Vanilla\":{\"title\":\"$:/palettes/Vanilla\",\"name\":\"Vanilla\",\"description\":\"Pale and unobtrusive\",\"tags\":\"$:/tags/Palette\",\"type\":\"application/x-tiddler-dictionary\",\"color-scheme\":\"light\",\"text\":\"alert-background: #ffe476\\nalert-border: #b99e2f\\nalert-highlight: #881122\\nalert-muted-foreground: #b99e2f\\nbackground: #ffffff\\nblockquote-bar: \u003C\u003Ccolour muted-foreground>>\\nbutton-background:\\nbutton-foreground:\\nbutton-border:\\ncode-background: #f7f7f9\\ncode-border: #e1e1e8\\ncode-foreground: #dd1144\\ndiff-delete-background: #ffc9c9\\ndiff-delete-foreground: \u003C\u003Ccolour foreground>>\\ndiff-equal-background: \\ndiff-equal-foreground: \u003C\u003Ccolour foreground>>\\ndiff-insert-background: #aaefad\\ndiff-insert-foreground: \u003C\u003Ccolour foreground>>\\ndiff-invisible-background: \\ndiff-invisible-foreground: \u003C\u003Ccolour muted-foreground>>\\ndirty-indicator: #ff0000\\ndownload-background: #34c734\\ndownload-foreground: \u003C\u003Ccolour background>>\\ndragger-background: \u003C\u003Ccolour foreground>>\\ndragger-foreground: \u003C\u003Ccolour background>>\\ndropdown-background: \u003C\u003Ccolour background>>\\ndropdown-border: \u003C\u003Ccolour muted-foreground>>\\ndropdown-tab-background-selected: #fff\\ndropdown-tab-background: #ececec\\ndropzone-background: rgba(0,200,0,0.7)\\nexternal-link-background-hover: inherit\\nexternal-link-background-visited: inherit\\nexternal-link-background: inherit\\nexternal-link-foreground-hover: inherit\\nexternal-link-foreground-visited: #0000aa\\nexternal-link-foreground: #0000ee\\nforeground: #333333\\nhighlight-background: #ffff00\\nhighlight-foreground: #000000\\nmessage-background: #ecf2ff\\nmessage-border: #cfd6e6\\nmessage-foreground: #547599\\nmodal-backdrop: \u003C\u003Ccolour foreground>>\\nmodal-background: \u003C\u003Ccolour background>>\\nmodal-border: #999999\\nmodal-footer-background: #f5f5f5\\nmodal-footer-border: #dddddd\\nmodal-header-border: #eeeeee\\nmuted-foreground: #bbb\\nnetwork-activity-foreground: #448844\\nnotification-background: #ffffdd\\nnotification-border: #999999\\npage-background: #f4f4f4\\npre-background: #f5f5f5\\npre-border: #cccccc\\nprimary: #5778d8\\nselection-background:\\nselection-foreground:\\nselect-tag-background:\\nselect-tag-foreground:\\nsidebar-button-foreground: \u003C\u003Ccolour foreground>>
2731\\nsidebar-controls-foreground-hover: #000000\\nsidebar-controls-foreground: #aaaaaa\\nsidebar-foreground-shadow: rgba(255,255,255, 0.8)\\nsidebar-foreground: #acacac\\nsidebar-muted-foreground-hover: #444444\\nsidebar-muted-foreground: #c0c0c0\\nsidebar-tab-background-selected: #f4f4f4\\nsidebar-tab-background: #e0e0e0\\nsidebar-tab-border-selected: \u003C\u003Ccolour tab-border-selected>>\\nsidebar-tab-border: \u003C\u003Ccolour tab-border>>\\nsidebar-tab-divider: #e4e4e4\\nsidebar-tab-foreground-selected:\\nsidebar-tab-foreground: \u003C\u003Ccolour tab-foreground>>\\nsidebar-tiddler-link-foreground-hover: #444444\\nsidebar-tiddler-link-foreground: #999999\\nsite-title-foreground: \u003C\u003Ccolour tiddler-title-foreground>>\\nstatic-alert-foreground: #aaaaaa\\ntab-background-selected: #ffffff\\ntab-background: #d8d8d8\\ntab-border-selected: #d8d8d8\\ntab-border: #cccccc\\ntab-divider: #d8d8d8\\ntab-foreground-selected: \u003C\u003Ccolour tab-foreground>>\\ntab-foreground: #666666\\ntable-border: #dddddd\\ntable-footer-background: #a8a8a8\\ntable-header-background: #f0f0f0\\ntag-background: #ec6\\ntag-foreground: #ffffff\\ntiddler-background: \u003C\u003Ccolour background>>\\ntiddler-border: \u003C\u003Ccolour background>>\\ntiddler-controls-foreground-hover: #888888\\ntiddler-controls-foreground-selected: #444444\\ntiddler-controls-foreground: #cccccc\\ntiddler-editor-background: #f8f8f8\\ntiddler-editor-border-image: #ffffff\\ntiddler-editor-border: #cccccc\\ntiddler-editor-fields-even: #e0e8e0\\ntiddler-editor-fields-odd: #f0f4f0\\ntiddler-info-background: #f8f8f8\\ntiddler-info-border: #dddddd\\ntiddler-info-tab-background: #f8f8f8\\ntiddler-link-background: \u003C\u003Ccolour background>>\\ntiddler-link-foreground: \u003C\u003Ccolour primary>>\\ntiddler-subtitle-foreground: #c0c0c0\\ntiddler-title-foreground: #182955\\ntoolbar-new-button:\\ntoolbar-options-button:\\ntoolbar-save-button:\\ntoolbar-info-button:\\ntoolbar-edit-button:\\ntoolbar-close-button:\\ntoolbar-delete-button:\\ntoolbar-cancel-button:\\ntoolbar-done-button:\\nuntagged-background: #999999\\nvery-muted-foreground: #888888\\nwikilist-background: #e5e5e5\\nwikilist-item: #fff\\nwikilist-info: #000\\nwikilist-title: #666\\nwikilist-title-svg: \u003C\u003Ccolour wikilist-title>>\\nwikilist-url: #aaa\\nwikilist-button-open: #4fb82b\\nwikilist-button-open-hover: green\\nwikilist-button-reveal: #5778d8\\nwikilist-button-reveal-hover: blue\\nwikilist-button-remove: #d85778\\nwikilist-button-remove-hover: red\\nwikilist-toolbar-background: #d3d3d3\\nwikilist-toolbar-foreground: #888\\nwikilist-droplink-dragover: rgba(255,192,192,0.5)\\nwikilist-button-background: #acacac\\nwikilist-button-foreground: #000\\n\"},\"$:/core/readme\":{\"title\":\"$:/core/readme\",\"text\":\"This plugin contains TiddlyWiki's core components, comprising:\\n\\n* JavaScript code modules\\n* Icons\\n* Templates needed to create TiddlyWiki's user interface\\n* British English (''en-GB'') translations of the localisable strings used by the core\\n\"},\"$:/library/sjcl.js/license\":{\"title\":\"$:/library/sjcl.js/license\",\"type\":\"text/plain\",\"text\":\"SJCL is open. You can use, modify and redistribute it under a BSD\\nlicense or under the GNU GPL, version 2.0.\\n\\n---------------------------------------------------------------------\\n\\nhttp://opensource.org/licenses/BSD-2-Clause\\n\\nCopyright (c) 2009-2015, Emily Stark, Mike Hamburg and Dan Boneh at\\nStanford University. All rights reserved.\\n\\nRedistribution and use in source and binary forms, with or without\\nmodification, are permitted provided that the following conditions are\\nmet:\\n\\n1. Redistributions of source code must retain the above copyright\\nnotice, this list of conditions and the following disclaimer.\\n\\n2. Redistributions in binary form must reproduce the above copyright\\nnotice, this list of conditions and the following disclaimer in the\\ndocumentation and/or other materials provided with the distribution.\\n\\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \\\"AS\\nIS\\\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED\\nTO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A\\nPARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\\nHOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (
2731INCLUDING, BUT NOT LIMITED\\nTO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\\nPROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\\nLIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\\nNEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\\n\\n---------------------------------------------------------------------\\n\\nhttp://opensource.org/licenses/GPL-2.0\\n\\nThe Stanford Javascript Crypto Library (hosted here on GitHub) is a\\nproject by the Stanford Computer Security Lab to build a secure,\\npowerful, fast, small, easy-to-use, cross-browser library for\\ncryptography in Javascript.\\n\\nCopyright (c) 2009-2015, Emily Stark, Mike Hamburg and Dan Boneh at\\nStanford University.\\n\\nThis program is free software; you can redistribute it and/or modify it\\nunder the terms of the GNU General Public License as published by the\\nFree Software Foundation; either version 2 of the License, or (at your\\noption) any later version.\\n\\nThis program is distributed in the hope that it will be useful, but\\nWITHOUT ANY WARRANTY; without even the implied warranty of\\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\\nPublic License for more details.\\n\\nYou should have received a copy of the GNU General Public License along\\nwith this program; if not, write to the Free Software Foundation, Inc.,\\n59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\"},\"$:/core/templates/MOTW.html\":{\"title\":\"$:/core/templates/MOTW.html\",\"text\":\"\\\\rules only filteredtranscludeinline transcludeinline entity\\n\u003C!-- The following comment is called a MOTW comment and is necessary for the TiddlyIE Internet Explorer extension -->\\n\u003C!-- saved from url=(0021)https://tiddlywiki.com -->&#13;&#10;\"},\"$:/core/templates/alltiddlers.template.html\":{\"title\":\"$:/core/templates/alltiddlers.template.html\",\"type\":\"text/vnd.tiddlywiki-html\",\"text\":\"\u003C!-- This template is provided for backwards compatibility with older versions of TiddlyWiki -->\\n\\n\u003C$set name=\\\"exportFilter\\\" value=\\\"[!is[system]sort[title]]\\\">\\n\\n{{$:/core/templates/exporters/StaticRiver}}\\n\\n\u003C/$set>\\n\"},\"$:/core/templates/canonical-uri-external-image\":{\"title\":\"$:/core/templates/canonical-uri-external-image\",\"text\":\"\u003C!--\\n\\nThis template is used to assign the ''_canonical_uri'' field to external images.\\n\\nChange the `./images/` part to a different base URI. The URI can be relative or absolute.\\n\\n-->\\n./images/\u003C$view field=\\\"title\\\" format=\\\"doubleurlencoded\\\"/>\"},\"$:/core/templates/canonical-uri-external-raw\":{\"title\":\"$:/core/templates/canonical-uri-external-raw\",\"text\":\"\u003C!--\\n\\nThis template is used to assign the ''_canonical_uri'' field to external raw files that are stored in the same directory\\n\\n-->\\n\u003C$view field=\\\"title\\\" format=\\\"doubleurlencoded\\\"/>\"},\"$:/core/templates/canonical-uri-external-text\":{\"title\":\"$:/core/templates/canonical-uri-external-text\",\"text\":\"\u003C!--\\n\\nThis template is used to assign the ''_canonical_uri'' field to external text files.\\n\\nChange the `./text/` part to a different base URI. The URI can be relative or absolute.\\n\\n-->\\n./text/\u003C$view field=\\\"title\\\" format=\\\"doubleurlencoded\\\"/>.tid\"},\"$:/core/templates/css-tiddler\":{\"title\":\"$:/core/templates/css-tiddler\",\"text\":\"\u003C!--\\n\\nThis template is used for saving CSS tiddlers as a 
2731style tag with data attributes representing the tiddler fields.\\n\\n-->`\u003Cstyle`\u003C$fields template=' data-tiddler-$name$=\\\"$encoded_value$\\\"'>\u003C/$fields>` type=\\\"text/css\\\">`\u003C$view field=\\\"text\\\" format=\\\"text\\\" />`\u003C/style>`\"},\"$:/core/templates/exporters/CsvFile\":{\"title\":\"$:/core/templates/exporters/CsvFile\",\"tags\":\"$:/tags/Exporter\",\"description\":\"{{$:/language/Exporters/CsvFile}}\",\"extension\":\".csv\",\"text\":\"\u003C$macrocall $name=\\\"csvtiddlers\\\" filter=\u003C\u003CexportFilter>> format=\\\"quoted-comma-sep\\\" $output=\\\"text/raw\\\"/>\\n\"},\"$:/core/templates/exporters/JsonFile\":{\"title\":\"$:/core/templates/exporters/JsonFile\",\"tags\":\"$:/tags/Exporter\",\"description\":\"{{$:/language/Exporters/JsonFile}}\",\"extension\":\".json\",\"text\":\"\u003C$macrocall $name=\\\"jsontiddlers\\\" filter=\u003C\u003CexportFilter>> $output=\\\"text/raw\\\"/>\\n\"},\"$:/core/templates/exporters/StaticRiver\":{\"title\":\"$:/core/templates/exporters/StaticRiver\",\"tags\":\"$:/tags/Exporter\",\"description\":\"{{$:/language/Exporters/StaticRiver}}\",\"extension\":\".html\",\"text\":\"\\\\define tv-config-static() yes\\n\\\\define tv-wikilink-template() #$uri_encoded$\\n\\\\define tv-config-toolbar-icons() no\\n\\\\define tv-config-toolbar-text() no\\n\\\\define tv-config-toolbar-class() tc-btn-invisible\\n\\\\rules only filteredtranscludeinline transcludeinline\\n\u003C!doctype html>\\n\u003Chtml>\\n\u003Chead>\\n\u003Cmeta http-equiv=\\\"Content-Type\\\" content=\\\"text/html;charset=utf-8\\\" />\\n\u003Cmeta name=\\\"generator\\\" content=\\\"TiddlyWiki\\\" />\\n\u003Cmeta name=\\\"tiddlywiki-version\\\" content=\\\"{{$:/core/templates/version}}\\\" />\\n\u003Cmeta name=\\\"viewport\\\" content=\\\"width=device-width, initial-scale=1.0\\\" />\\n\u003Cmeta name=\\\"format-detection\\\" content=\\\"telephone=no\\\">\\n\u003Clink id=\\\"faviconLink\\\" rel=\\\"shortcut icon\\\" href=\\\"favicon.ico\\\">\\n\u003Ctitle>{{$:/core/wiki/title}}\u003C/title>\\n\u003Cdiv id=\\\"styleArea\\\">\\n{{$:/boot/boot.css||$:/core/templates/css-tiddler}}\\n\u003C/div>\\n\u003Cstyle type=\\\"text/css\\\">\\n{{$:/core/ui/PageStylesheet||$:/core/templates/wikified-tiddler}}\\n\u003C/style>\\n\u003C/head>\\n\u003Cbody class=\\\"tc-body\\\">\\n{{$:/StaticBanner||$:/core/templates/html-tiddler}}\\n\u003Csection class=\\\"tc-story-river tc-static-story-river\\\">\\n{{$:/core/templates/exporters/StaticRiver/Content||$:/core/templates/html-tiddler}}\\n\u003C/section>\\n\u003C/body>\\n\u003C/html>\\n\"},\"$:/core/templates/exporters/StaticRiver/Content\":{\"title\":\"$:/core/templates/exporters/StaticRiver/Content\",\"text\":\"\\\\define renderContent()\\n{{{ $(exportFilter)$ ||$:/core/templates/static-tiddler}}}\\n\\\\end\\n\\\\import [subfilter{$:/core/config/GlobalImportFilter}]\\n\u003C\u003CrenderContent>>\\n\"},\"$:/core/templates/exporters/TidFile\":{\"title\":\"$:/core/templates/exporters/TidFile\",\"tags\":\"$:/tags/Exporter\",\"description\":\"{{$:/language/Exporters/TidFile}}\",\"extension\":\".tid\",\"condition\":\"[\u003Ccount>compare:lte[1]]\",\"text\":\"\\\\define renderContent()\\n{{{ $(exportFilter)$ +[limit[1]] ||$:/core/templates/tid-tiddler}}}\\n\\\\end\\n\\\\import [subfilter{$:/core/config/GlobalImportFilter}]\\n\u003C\u003CrenderContent>>\"},\"$:/core/save/all-external-js\":{\"title\":\"$:/core/save/all-external-js\",\"text\":\"\\\\whitespace trim\\n\\\\import [subfilter{$:/core/config/GlobalImportFilter}]\\n\\\\define saveTiddlerFilter()\\n[is[tiddler]] -[prefix[$:/state/popup/]] -[prefix[$:/temp/]] -[prefix[$:/HistoryList]] -[status[pending]plugin-type[import]] -[[$:/core]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]] $(publishFilter)$\\n\\\\end\\n\\n\u003C!-- Important: core library is provided by serving URI encoded $:/core/templates/tiddlywiki5.js -->\\n\\\\define defaultCoreURL() %24%3A%2Fcore%2Ftemplates%2Ftiddlywiki5.js\\n\\n\u003C$let coreURL={{{ [[coreURL]is[variable]then\u003CcoreURL>else\u003CdefaultCoreURL>] }}}>\\n\\t{{$:/core/templates/tiddlywiki5-external-js.html}}\\n\u003C/$let>\\n\"},\"$:/core/save/offline-external-js\":{\"title\":\"$:/core/save/offline-external-js\",\"text\":\"\\\\whitespace trim\\n\\\\import [subfilter{$:/core/config/GlobalImportFilter}]\\n\\\\define saveTiddlerFilter()\\n[is[tiddler]] -[prefix[$:/state/popup/]] -[prefix[$:/temp/]] -[prefix[$:/HistoryList]] -[status[pending]plugin-type[import]] -[[$:/core]] -[[$:/plugins/tiddlywiki/filesystem]] -[[$:/plugins/tiddlywiki/tiddlyweb]] -[[$:/boot/boot.css]] -[t
2731ype[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]] $(publishFilter)$\\n\\\\end\\n\\\\define defaultCoreURL() tiddlywikicore-$(version)$.js\\n\u003C$let coreURL={{{ [[coreURL]is[variable]then\u003CcoreURL>else\u003CdefaultCoreURL>] }}}>\\n\\t{{$:/core/templates/tiddlywiki5-external-js.html}}\\n\u003C/$let>\\n\"},\"$:/core/templates/tiddlywiki.js/load-tiddler\":{\"title\":\"$:/core/templates/tiddlywiki.js/load-tiddler\",\"text\":\"_load(window,\u003C$macrocall $name=\\\"jsontiddler\\\" $output=\\\"text/raw\\\"/>);\"},\"$:/core/templates/tiddlywiki5.js\":{\"title\":\"$:/core/templates/tiddlywiki5.js\",\"text\":\"\\\\rules only filteredtranscludeinline transcludeinline codeinline\\n\\n`/*\\n`{{ $:/core/copyright.txt ||$:/core/templates/plain-text-tiddler}}`\\n*/\\n\\n$tw = (typeof $tw === 'undefined') ? Object.create(null) : $tw;\\n\\n$tw.preloadTiddlers = $tw.preloadTiddlers || [];\\n\\n_load = function(window,tiddler) {\\n\\t\\\"use strict\\\";\\n\\tvar f;\\n\\t$tw.preloadTiddlers.push(tiddler);\\n\\tif(tiddler.library === \\\"yes\\\") {\\n\\t\\tvar module = { exports:{} };\\n\\t\\tvar moduleName = function moduleName(path) {\\n\\t\\t\\tvar word = path.split(\\\"/\\\").pop();\\n\\t\\t\\tword = word.substring(0,word.indexOf(\\\".\\\")) || word;\\n\\t\\t\\treturn word;\\n\\t\\t}\\n\\t\\tf = new Function(\\\"module\\\",tiddler.text);\\n\\t\\tf(module);\\n\\t\\twindow[moduleName(tiddler.title)] = module.exports;\\n\\t} else {\\n\\t\\tf = new Function(\\\"window\\\",tiddler.text);\\n\\t\\tf(window);\\n\\t}\\n}\\n\\n/* ~~ Library modules ~~ */\\n\\n`{{{ [is[system]type[application/javascript]library[yes]] ||$:/core/templates/tiddlywiki.js/load-tiddler}}}`\\n\\n/* ~~ Boot kernel prologue ~~ */\\n\\n`{{ $:/boot/bootprefix.js ||$:/core/templates/tiddlywiki.js/load-tiddler}}`\\n\\n/* ~~ Core tiddlers ~~ */\\n\\n`{{$:/core/templates/tiddlywiki5.js/tiddlers}}`\\n\\n/* ~~ Boot kernel ~~ */\\n\\n`{{ $:/boot/boot.js ||$:/core/templates/tiddlywiki.js/load-tiddler}}`\\n\"},\"$:/core/templates/tiddlywiki5.js/tiddlers\":{\"title\":\"$:/core/templates/tiddlywiki5.js/tiddlers\",\"text\":\"`\\n$tw.preloadTiddlerArray(`\u003C$text text=\u003C\u003Cjsontiddlers \\\"[[$:/core]]\\\">>/>`);\\n$tw.preloadTiddlerArray([{\\n\\ttitle: \\\"$:/config/SaveWikiButton/Template\\\",\\n\\ttext: \\\"$:/core/save/offline-external-js\\\"\\n}]);\\n`\\n\"},\"$:/core/templates/tiddlywiki5-external-js.html\":{\"title\":\"$:/core/templates/tiddlywiki5-external-js.html\",\"text\":\"\u003C$set name=\\\"saveTiddlerAndShadowsFilter\\\" filter=\\\"[subfilter\u003CsaveTiddlerFilter>] [subfilter\u003CsaveTiddlerFilter>plugintiddlers[]]\\\">\\n`\u003C!doctype html>\\n`{{$:/core/templates/MOTW.html}}`\u003Chtml lang=\\\"`\u003C$text text={{{ [{$:/language}get[name]] }}}/>`\\\">\\n\u003Chead>\\n\u003Cmeta http-equiv=\\\"Content-Type\\\" content=\\\"text/html;charset=utf-8\\\" />\\n\u003C!--~~ Raw markup for the top of the head section ~~-->\\n`{{{ [enlist\u003CsaveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified/TopHead]] ||$:/core/templates/raw-static-tiddler}}}`\\n\u003Cmeta http-equiv=\\\"X-UA-Compatible\\\" content=\\\"IE=Edge\\\"/>\\n\u003Cmeta name=\\\"application-name\\\" content=\\\"TiddlyWiki\\\" />\\n\u003Cmeta name=\\\"generator\\\" content=\\\"TiddlyWiki\\\" />\\n\u003Cmeta name=\\\"tiddlywiki-version\\\" content=\\\"`{{$:/core/templates/version}}`\\\" />\\n\u003Cmeta name=\\\"viewport\\\" content=\\\"width=device-width, initial-scale=1.0\\\" />\\n\u003Cmeta name=\\\"apple-mobile-web-app-capable\\\" content=\\\"yes\\\" />\\n\u003Cmeta name=\\\"apple-mobile-web-app-status-bar-style\\\" content=\\\"black-translucent\\\" />\\n\u003Cmeta name=\\\"mobile-web-app-capable\\\" content=\\\"yes\\\"/>\\n\u003Cmeta name=\\\"format-detection\\\" content=\\\"telephone=no\\\" />\\n\u003Cmeta name=\\\"copyright\\\" content=\\\"`{{$:/core/copyright.txt}}`\\\" />\\n\u003Clink id=\\\"faviconLink\\\" rel=\\\"shortcut icon\\\" href=\\\"favicon.ico\\\">\\n\u003Ctitle>`{{$:/core/wiki/title}}`\u003C/title>\\n\u003C!--~~ This is a Tiddlywiki file. The points of interest in the file are marked with this pattern ~~-->
2731\\n\\n\u003C!--~~ Raw markup ~~-->\\n`{{{ [enlist\u003CsaveTiddlerAndShadowsFilter>tag[$:/core/wiki/rawmarkup]] ||$:/core/templates/plain-text-tiddler}}}`\\n`{{{ [enlist\u003CsaveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkup]] ||$:/core/templates/plain-text-tiddler}}}`\\n`{{{ [enlist\u003CsaveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified]] ||$:/core/templates/raw-static-tiddler}}}`\\n\u003C/head>\\n\u003Cbody class=\\\"tc-body\\\">\\n\u003C!--~~ Raw markup for the top of the body section ~~-->\\n`{{{ [enlist\u003CsaveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified/TopBody]] ||$:/core/templates/raw-static-tiddler}}}`\\n\u003C!--~~ Static styles ~~-->\\n\u003Cdiv id=\\\"styleArea\\\">\\n`{{$:/boot/boot.css||$:/core/templates/css-tiddler}}`\\n\u003C/div>\\n\u003C!--~~ Static content for Google and browsers without JavaScript ~~-->\\n\u003Cnoscript>\\n\u003Cdiv id=\\\"splashArea\\\">\\n`{{$:/core/templates/static.area}}`\\n\u003C/div>\\n\u003C/noscript>\\n\u003C!--~~ Ordinary tiddlers ~~-->\\n`{{$:/core/templates/store.area.template.html}}`\\n\u003C!--~~ Raw markup for the bottom of the body section ~~-->\\n`{{{ [enlist\u003CsaveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified/BottomBody]] ||$:/core/templates/raw-static-tiddler}}}`\\n\u003C!--~~ Load external JavaScripts ~~-->\\n\u003Cscript src=\\\"`{{{ [\u003CcoreURL>] }}}`\\\" onerror=\\\"alert('Error: Cannot load `{{{ [\u003CcoreURL>] }}}`');\\\">\u003C/script>\\n\u003C/body>\\n\u003C/html>`\\n\u003C/$set>\"},\"$:/core/templates/html-div-skinny-tiddler\":{\"title\":\"$:/core/templates/html-div-skinny-tiddler\",\"text\":\"\u003C!--\\n\\nThis template is a variant of $:/core/templates/html-div-tiddler used for saving skinny tiddlers (with no text field)\\n\\n-->`\u003Cdiv`\u003C$fields template=' $name$=\\\"$encoded_value$\\\"'>\u003C/$fields>`>\\n\u003Cpre>\u003C/pre>\\n\u003C/div>`\\n\"},\"$:/core/templates/html-div-tiddler\":{\"title\":\"$:/core/templates/html-div-tiddler\",\"text\":\"\u003C!--\\n\\nThis template is used for saving tiddlers as an HTML DIV tag with attributes representing the tiddler fields.\\n\\n-->`\u003Cdiv`\u003C$fields template=' $name$=\\\"$encoded_value$\\\"'>\u003C/$fields>`>\\n\u003Cpre>`\u003C$view field=\\\"text\\\" format=\\\"htmltextencoded\\\" />`\u003C/pre>\\n\u003C/div>`\\n\"},\"$:/core/templates/html-json-skinny-tiddler\":{\"title\":\"$:/core/templates/html-json-skinny-tiddler\",\"text\":\"\u003C$list filter=\\\"[\u003CnumTiddlers>compare:number:gteq[1]] ~[\u003Ccounter>!match[1]]\\\">`,`\u003C$text text=\u003C\u003Cnewline>>/>\u003C/$list>\\n\u003C$jsontiddler tiddler=\u003C\u003CcurrentTiddler>> exclude=\\\"text\\\" escapeUnsafeScriptChars=\\\"yes\\\"/>\\n\"},\"$:/core/templates/html-json-tiddler\":{\"title\":\"$:/core/templates/html-json-tiddler\",\"text\":\"\u003C$list filter=\\\"[\u003Ccounter>!match[1]]\\\">`,`\u003C$text text=\u003C\u003Cnewline>>/>\u003C/$list>\u003C$jsontiddler tiddler=\u003C\u003CcurrentTiddler>> escapeUnsafeScriptChars=\\\"yes\\\"/>\"},\"$:/core/templates/html-tiddler\":{\"title\":\"$:/core/templates/html-tiddler\",\"text\":\"\u003C!--\\n\\nThis template is used for saving tiddlers as raw HTML\\n\\n-->\u003C$view field=\\\"text\\\" format=\\\"htmlwikified\\\" />\"},\"$:/core/templates/javascript-tiddler\":{\"title\":\"$:/core/templates/javascript-tiddler\",\"text\":\"\u003C!--\\n\\nThis template is used for saving JavaScript tiddlers as a 
2731script tag with data attributes representing the tiddler fields.\\n\\n-->`\u003Cscript`\u003C$fields template=' data-tiddler-$name$=\\\"$encoded_value$\\\"'>\u003C/$fields>` type=\\\"text/javascript\\\">`\u003C$view field=\\\"text\\\" format=\\\"text\\\" />`\u003C/script>`\"},\"$:/core/templates/json-tiddler\":{\"title\":\"$:/core/templates/json-tiddler\",\"text\":\"\u003C!--\\n\\nThis template is used for saving tiddlers as raw JSON\\n\\n-->\u003C$text text=\u003C\u003Cjsontiddler>>/>\"},\"$:/core/templates/module-tiddler\":{\"title\":\"$:/core/templates/module-tiddler\",\"text\":\"\u003C!--\\n\\nThis template is used for saving JavaScript tiddlers as a script tag with data attributes representing the tiddler fields. The body of the tiddler is wrapped in a call to the `$tw.modules.define` function in order to define the body of the tiddler as a module\\n\\n-->`\u003Cscript`\u003C$fields template=' data-tiddler-$name$=\\\"$encoded_value$\\\"'>\u003C/$fields>` type=\\\"text/javascript\\\" data-module=\\\"yes\\\">$tw.modules.define(\\\"`\u003C$view field=\\\"title\\\" format=\\\"jsencoded\\\" />`\\\",\\\"`\u003C$view field=\\\"module-type\\\" format=\\\"jsencoded\\\" />`\\\",function(module,exports,require) {`\u003C$view field=\\\"text\\\" format=\\\"text\\\" />`});\\n\u003C/script>`\"},\"$:/core/templates/plain-text-tiddler\":{\"title\":\"$:/core/templates/plain-text-tiddler\",\"text\":\"\u003C$view field=\\\"text\\\" format=\\\"text\\\" />\"},\"$:/core/templates/raw-static-tiddler\":{\"title\":\"$:/core/templates/raw-static-tiddler\",\"text\":\"\u003C!--\\n\\nThis template is used for saving tiddlers as static HTML\\n\\n-->\u003C$view field=\\\"text\\\" format=\\\"plainwikified\\\" />\"},\"$:/core/save/all\":{\"title\":\"$:/core/save/all\",\"text\":\"\\\\import [subfilter{$:/core/config/GlobalImportFilter}]\\n\\\\define saveTiddlerFilter()\\n[is[tiddler]] -[prefix[$:/state/popup/]] -[prefix[$:/temp/]] -[prefix[$:/HistoryList]] -[status[pending]plugin-type[import]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]] $(publishFilter)$\\n\\\\end\\n{{$:/core/templates/tiddlywiki5.html}}\\n\"},\"$:/core/save/empty\":{\"title\":\"$:/core/save/empty\",\"text\":\"\\\\define saveTiddlerFilter()\\n[is[system]] -[prefix[$:/state/popup/]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]]\\n\\\\end\\n{{$:/core/templates/tiddlywiki5.html}}\\n\"},\"$:/core/save/lazy-all\":{\"title\":\"$:/core/save/lazy-all\",\"text\":\"\\\\define saveTiddlerFilter()\\n[is[system]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] [is[tiddler]type[application/javascript]] +[sort[title]]\\n\\\\end\\n\\\\define skinnySaveTiddlerFilter()\\n[!is[system]] -[type[application/javascript]]\\n\\\\end\\n{{$:/core/templates/tiddlywiki5.html}}\\n\"},\"$:/core/save/lazy-images\":{\"title\":\"$:/core/save/lazy-images\",\"text\":\"\\\\define saveTiddlerFilter()\\n[is[tiddler]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] -[!is[system]is[image]] +[sort[title]] \\n\\\\end\\n\\\\define skinnySaveTiddlerFilter()\\n[!is[system]is[image]]\\n\\\\end\\n{{$:/core/templates/tiddlywiki5.html}}\\n\"},\"$:/core/templates/server/static.sidebar.wikitext\":{\"title\":\"$:/core/templates/server/static.sidebar.wikitext\",\"text\":\"\\\\whitespace trim\\n\u003Cdiv class=\\\"tc-sidebar-scrollable\\\" style=\\\"overflow: auto;\\\" role=\\\"region\\\" aria-label={{$:/language/SideBar/Caption}}>\\n\u003Cdiv class=\\\"tc-sidebar-header\\\">\\n\u003Ch1 class=\\\"tc-site-title\\\">\\n\u003C$transclude tiddler=\\\"$:/SiteTitle\\\"/>\\n\u003C/h1>\\n\u003Cdiv class=\\\"tc-site-subtitle\\\">\\n\u003C$transclude tiddler=\\\"$:/SiteSubtitle\\\"/>\\n\u003C/div>\\n\u003Ch2>\\n\u003C/h2>\\n\u003Cdiv class=\\\"tc-sidebar-lists\\\">\\n\u003C$list filter={{$:/DefaultTiddlers}}>\\n\u003Cdiv class=\\\"tc-menu-list-subitem\\\">\\n\u003C$link>\u003C$text text=\u003C\u003CcurrentTiddler>>/>\u003C/$link>\\n\u003C/div>\\n\u003C/$list>\\n\u003C/div>\\n\u003C!-- Currently disabled the recent list as it is unweildy when the responsive narrow view kicks in\\n\u003Ch2>\\n{{$:/language/SideBar/Recent/Caption}}\\n\u003C/h2>\\n\u003Cdiv class=\\\"tc-sidebar-lists\\\">\\n\u003C$macrocall $name=\\\"timeline\\\" format={{$:/language/RecentChanges/DateFormat}}/>\\n\u003C/div>\\n\u003C/div>\\n\u003C/div>\\n-->\\n\"},\"$:/core/templates/server/static.tiddler.html\":{\"title\":\"$:/core/templates/server/static.tiddler.html\",\"text\":\"\\\\whitespace trim\\n\\\\define tv-config-static() yes\\n\\\\define tv-wikilink-template() $uri_encoded$\\n\\\\import [subfilter{$:/core/config/GlobalImportFilter}]\\n\u003Chtml>\\n\u003Chead>\\n\u003Cmeta http-equiv=\\\"Content-Type\\\" content=\\\"text/html;charset=utf-8\\\" />\\n\u003Cmeta name=\\\"generator\\\" content=\\\"TiddlyWiki\\\" />\\n\u003Cmeta name=\\\"tiddlywiki-version\\\" content={{$:/core/templates/version}} />\\n\u003Cmeta name=\\\"viewport\\\" content=\\\"width=device-width, initial-scale=1.0\\\" />\\n\u003Cmeta name=\\\"apple-mobile-web-app-capable\\\" content=\\\"yes\\\" />\\n\u003Cmeta name=\\\"apple-mobile-web-app-status-bar-style\\\" content=\\\"black-translucent\\\" />\\n\u003Cmeta name=\\\"mobile-web-app-capable\\\" content=\\\"yes\\\"/>\\n\u003Cmeta name=\\\"format-detection\\\" content=\\\"telephone=no\\\">
2731\\n\u003Clink id=\\\"faviconLink\\\" rel=\\\"shortcut icon\\\" href=\\\"favicon.ico\\\">\\n\u003Clink rel=\\\"stylesheet\\\" href=\\\"%24%3A%2Fcore%2Ftemplates%2Fstatic.template.css\\\">\\n\u003Ctitle>\u003C$view field=\\\"caption\\\" format=\\\"plainwikified\\\">\u003C$view field=\\\"title\\\"/>\u003C/$view>: \u003C$view tiddler=\\\"$:/core/wiki/title\\\" format=\\\"plainwikified\\\"/>\u003C/title>\\n\u003C/head>\\n\u003Cbody class=\\\"tc-body\\\">\\n\u003C$transclude tiddler=\\\"$:/core/templates/server/static.sidebar.wikitext\\\" mode=\\\"inline\\\"/>\\n\u003Csection class=\\\"tc-story-river\\\" role=\\\"main\\\">\\n\u003Cdiv class=\\\"tc-tiddler-frame\\\" role=\\\"article\\\">\\n\u003C$transclude tiddler=\\\"$:/core/templates/server/static.tiddler.wikitext\\\" mode=\\\"inline\\\"/>\\n\u003C/div>\\n\u003C/section>\\n\u003C/body>\\n\u003C/html>\"},\"$:/core/templates/server/static.tiddler.wikitext\":{\"title\":\"$:/core/templates/server/static.tiddler.wikitext\",\"text\":\"\\\\whitespace trim\\n\u003Cdiv class=\\\"tc-tiddler-title\\\">\\n\u003Cdiv class=\\\"tc-titlebar\\\">\\n\u003Ch2>\u003C$text text=\u003C\u003CcurrentTiddler>>/>\u003C/h2>\\n\u003C/div>\\n\u003C/div>\\n\u003Cdiv class=\\\"tc-subtitle\\\">\\n\u003C$link to={{!!modifier}}>\\n\u003C$view field=\\\"modifier\\\"/>\\n\u003C/$link> \u003C$view field=\\\"modified\\\" format=\\\"date\\\" template={{$:/language/Tiddler/DateFormat}}/>\\n\u003C/div>\\n\u003Cdiv class=\\\"tc-tags-wrapper\\\">\\n\u003C$list filter=\\\"[all[current]tags[]sort[title]]\\\">\\n\u003Ca href={{{ [\u003CcurrentTiddler>encodeuricomponent[]] }}}>\\n\u003C$macrocall $name=\\\"tag-pill\\\" tag=\u003C\u003CcurrentTiddler>>/>\\n\u003C/a>\\n\u003C/$list>\\n\u003C/div>\\n\u003Cdiv class=\\\"tc-tiddler-body\\\">\\n\u003C$transclude mode=\\\"block\\\"/>\\n\u003C/div>\\n\"},\"$:/core/templates/single.tiddler.window\":{\"title\":\"$:/core/templates/single.tiddler.window\",\"text\":\"\\\\whitespace trim\\n\\\\define containerClasses()\\ntc-page-container tc-page-view-$(storyviewTitle)$ tc-language-$(languageTitle)$\\n\\\\end\\n\\\\import [subfilter{$:/core/config/GlobalImportFilter}]\\n\\n\u003C$vars\\n\\ttv-config-toolbar-icons={{$:/config/Toolbar/Icons}}\\n\\ttv-config-toolbar-text={{$:/config/Toolbar/Text}}\\n\\ttv-config-toolbar-class={{$:/config/Toolbar/ButtonClass}}\\n\\ttv-show-missing-links={{$:/config/MissingLinks}}\\n\\tstoryviewTitle={{$:/view}}\\n\\tlanguageTitle={{{ [{$:/language}get[name]] }}}>\\n\\n\u003Cdiv class=\u003C\u003CcontainerClasses>>>\\n\\n\u003C$navigator story=\\\"$:/StoryList\\\" history=\\\"$:/HistoryList\\\">\\n\\n\u003C$transclude tiddler=\\\"$:/core/ui/ViewTemplate/body\\\" mode=\\\"block\\\"/>\\n\\n\u003C/$navigator>\\n\\n\u003C/div>\\n\\n\u003C/$vars>\\n\"},\"$:/core/templates/split-recipe\":{\"title\":\"$:/core/templates/split-recipe\",\"text\":\"\u003C$list filter=\\\"[!is[system]]\\\">\\ntiddler: \u003C$view field=\\\"title\\\" format=\\\"urlencoded\\\"/>.tid\\n\u003C/$list>\\n\"},\"$:/core/templates/static-tiddler\":{\"title\":\"$:/core/templates/static-tiddler\",\"text\":\"\u003Ca name=\u003C\u003CcurrentTiddler>>>\\n\u003C$transclude tiddler=\\\"$:/core/ui/ViewTemplate\\\"/>\\n\u003C/a>\"},\"$:/core/templates/static.area\":{\"title\":\"$:/core/templates/static.area\",\"text\":\"\u003C$reveal type=\\\"nomatch\\\" state=\\\"$:/isEncrypted\\\" text=\\\"yes\\\">\\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawStaticContent]!has[draft.of]] ||$:/core/templates/raw-static-tiddler}}}\\n{{$:/core/templates/static.content||$:/core/templates/html-tiddler}}\\n\u003C/$reveal>\\n\u003C$reveal type=\\\"match\\\" state=\\\"$:/isEncrypted\\\" text=\\\"yes\\\">\\nThis file contains an encrypted ~TiddlyWiki. Enable ~JavaScript and enter the decryption password when prompted.\\n\u003C/$reveal>\\n\u003C!-- ensure splash screen isn't shown when JS is disabled -->\\n`\u003Cstyle>\\n.tc-remove-when-wiki-loaded {display: none;}\\n\u003C/style>`\\n\"},\"$:/core/templates/static.content\":{\"title\":\"$:/core/templates/static.content\",\"text\":\"\u003C!-- For Google, and people without JavaScript-->\\nThis [[TiddlyWiki|https://tiddlywiki.com]] contains the following tiddlers:\\n\\n\u003Cul>\\n\u003C$list filter=\u003C\u003CsaveTiddlerFilter>>>\\n\u003Cli>\u003C$view field=\\\"title\\\" format=\\\"text\\\">\u003C/$view>\u003C/li>\\n\u003C/$list>\\n\u003C/ul>\\n\"},\"$:/core/templates/static.template.css\":{\"title\":\"$:/core/templates/static.template.css\",\"text\":\"{{$:/boot/boot.css||$:/core/templates/plain-text-tiddler}}\\n\\n{{$:/core/ui/PageStylesheet||$:/core/templates/wikified-tiddler}}\\n\"},\"$:/core/templates/static.template.html\":{\"title\":\"$:/core/templates/static.template.html\",\"type\":\"text/vnd.tiddlywiki-html\",\"text\":\"\\\\define tv-config-static() yes\\n\\\\define tv-wikilink-template() static/$uri_doubleencoded$.html\\n\\\\define tv-config-toolbar-icons() no\\
2731n\\\\define tv-config-toolbar-text() no\\n\\\\define tv-config-toolbar-class() tc-btn-invisible\\n\\\\rules only filteredtranscludeinline transcludeinline\\n\u003C!doctype html>\\n\u003Chtml>\\n\u003Chead>\\n\u003Cmeta http-equiv=\\\"Content-Type\\\" content=\\\"text/html;charset=utf-8\\\" />\\n\u003Cmeta name=\\\"generator\\\" content=\\\"TiddlyWiki\\\" />\\n\u003Cmeta name=\\\"tiddlywiki-version\\\" content=\\\"{{$:/core/templates/version}}\\\" />\\n\u003Cmeta name=\\\"viewport\\\" content=\\\"width=device-width, initial-scale=1.0\\\" />\\n\u003Cmeta name=\\\"apple-mobile-web-app-capable\\\" content=\\\"yes\\\" />\\n\u003Cmeta name=\\\"apple-mobile-web-app-status-bar-style\\\" content=\\\"black-translucent\\\" />\\n\u003Cmeta name=\\\"mobile-web-app-capable\\\" content=\\\"yes\\\"/>\\n\u003Cmeta name=\\\"format-detection\\\" content=\\\"telephone=no\\\">\\n\u003Clink id=\\\"faviconLink\\\" rel=\\\"shortcut icon\\\" href=\\\"favicon.ico\\\">\\n\u003Ctitle>{{$:/core/wiki/title}}\u003C/title>\\n\u003Cdiv id=\\\"styleArea\\\">\\n{{$:/boot/boot.css||$:/core/templates/css-tiddler}}\\n\u003C/div>\\n\u003Cstyle type=\\\"text/css\\\">\\n{{$:/core/ui/PageStylesheet||$:/core/templates/wikified-tiddler}}\\n\u003C/style>\\n\u003C/head>\\n\u003Cbody class=\\\"tc-body\\\">\\n{{$:/StaticBanner||$:/core/templates/html-tiddler}}\\n{{$:/core/ui/PageTemplate||$:/core/templates/html-tiddler}}\\n\u003C/body>\\n\u003C/html>\\n\"},\"$:/core/templates/static.tiddler.html\":{\"title\":\"$:/core/templates/static.tiddler.html\",\"text\":\"\\\\define tv-wikilink-template() $uri_doubleencoded$.html\\n\\\\define tv-config-static() yes\\n\\\\define tv-config-toolbar-icons() no\\n\\\\define tv-config-toolbar-text() no\\n\\\\define tv-config-toolbar-class() tc-btn-invisible\\n\\\\import [subfilter{$:/core/config/GlobalImportFilter}]\\n`\u003C!doctype html>\\n\u003Chtml>\\n\u003Chead>\\n\u003Cmeta http-equiv=\\\"Content-Type\\\" content=\\\"text/html;charset=utf-8\\\" />\\n\u003Cmeta name=\\\"generator\\\" content=\\\"TiddlyWiki\\\" />\\n\u003Cmeta name=\\\"tiddlywiki-version\\\" content=\\\"`{{$:/core/templates/version}}`\\\" />\\n\u003Cmeta name=\\\"viewport\\\" content=\\\"width=device-width, initial-scale=1.0\\\" />\\n\u003Cmeta name=\\\"apple-mobile-web-app-capable\\\" content=\\\"yes\\\" />\\n\u003Cmeta name=\\\"apple-mobile-web-app-status-bar-style\\\" content=\\\"black-translucent\\\" />\\n\u003Cmeta name=\\\"mobile-web-app-capable\\\" content=\\\"yes\\\"/>\\n\u003Cmeta name=\\\"format-detection\\\" content=\\\"telephone=no\\\">\\n\u003Clink id=\\\"faviconLink\\\" rel=\\\"shortcut icon\\\" href=\\\"favicon.ico\\\">\\n\u003Clink rel=\\\"stylesheet\\\" href=\\\"static.css\\\">\\n\u003Ctitle>`\u003C$view field=\\\"caption\\\">\u003C$view field=\\\"title\\\"/>\u003C/$view>: {{$:/core/wiki/title}}`\u003C/title>\\n\u003C/head>\\n\u003Cbody class=\\\"tc-body\\\">\\n`{{$:/StaticBanner||$:/core/templates/html-tiddler}}`\\n\u003Csection class=\\\"tc-story-river tc-static-story-river\\\">\\n`\u003C$view tiddler=\\\"$:/core/ui/ViewTemplate\\\" format=\\\"htmlwikified\\\"/>`\\n\u003C/section>\\n\u003C/body>\\n\u003C/html>\\n`\\n\"},\"$:/core/templates/store.area.template.html\":{\"title\":\"$:/core/templates/store.area.template.html\",\"text\":\"\\\\whitespace trim\\n\u003C!-- Unencrypted -->\\n\u003C$list filter=\\\"[[$:/isEncrypted]get[text]else[no]match[no]]\\\">\\n    \u003C$list filter=\\\"[[storeAreaFormat]is[variable]getvariable[]else[json]match[json]]\\\">\\n        \u003C!-- New-style JSON store area, with an old-style store area for compatibility with v5.1.x tooling -->\\n        `\u003Cscript class=\\\"tiddlywiki-tiddler-store\\\" type=\\\"application/json\\\">[`\\n            \u003C$vars newline={{{ [charcode[10]] }}}>\\n                \u003C$text text=\u003C\u003Cnewline>>/>\\n                \u003C$list filter=\u003C\u003CsaveTiddlerFilter>> counter=\\\"counter\\\" template=\\\"$:/core/templates/html-json-tiddler\\\"/>\\n                \u003C$vars numTiddlers={{{ [subfilter\u003CsaveTiddlerFilter>count[]] }}}>\\n                    \u003C$list filter={{{ [\u003CskinnySaveTiddlerFilter>] }}} counter=\\\"counter\\\" template=\\\"$:/core/templates/html-json-skinny-tiddler\\\"/>\\n                \u003C/$vars>\\n                \u003C$text text=\u003C\u003Cnewline>>/>\\n            \u003C/$vars>\\n        `]\u003C/script>`\\n        `\u003Cdiv id=\\\"storeArea\\\" style=\\\"display:none;\\\">`\\n        `\u003C/div>`\\n    \u003C/$list>\\n    \u003C$list filter=\\\"[[storeAreaFormat]is[variable]getvariable[]else[json]match[div]]\\\">\\n        \u003C!-- Old-style DIV/PRE-based store area -->\\n        \u003C$reveal type=\\\"nomatch\\\" state=\\\"$:/isEncrypted\\\" text=\\\"yes\\\">\\n            `\u003Cdiv id=\\\"storeArea\\\" style=\\\"display:none;\\\">`\\n                \u003C$list filter=\u003C\u003CsaveTiddlerFilter>> template=\\\"$:/core/templates/html-div-tiddler\\\"/>\\n                \u003C$list filter={{{ [\u003CskinnySaveTiddlerFilter>] }}} template=\\\"$:/core/templates/html-div-skinny-tiddler\\\"/>\\n            `\u003C/div>`\\n        \u003C/$reveal>\\n    \u003C/$list>\\n\u003C/$list>\\n\u003C!-- Encrypted -->\\n\u003C$list filter=\\\"[[$:/isEncrypted]get[text]else[no]match[yes]]\\\">\\n    `\u003C!--~~ Encrypted tiddlers ~~-->`\\n    `\u003Cpre id=\\\"encryptedStoreArea\\\" type=\\\"text/plain\\\" style=\\\"display:none;\\\">`\\n        \u003C$encrypt filter=\u003C\u003CsaveTiddlerFilter>>/>\\n    `\u003C/pre>`\\n\u003C/$list>\"},\"$:/core/templates/tid-tiddler\":{\"title\":\"$:/core/templates/tid-tiddler\",\"text\":\"\u003C!--\\n\\nThis template is used for saving tiddlers in TiddlyWeb *.tid format\\n\\n-->\u003C$fields exclude='text bag' template='$name$: $value$\\n'>\u003C/$fields>`\\n`\u003C$view field=\\\"text\\\" format=\\\"text\\\" />\"},\"$:/core/templates/tiddler-metadata\":{\"title\":\"$:/core/templates/tiddler-metadata\",\"text\":\"\u003C!--\\n\\nThis template is used for saving tiddler metadata *.meta files\\n\\n-->\u003C$fields exclude='text bag' template='$name$: $value$\\n'>\u003C/$fields>\"},\"$:/core/templates/tiddlywiki5.html\":{\"title\":\"$:/core/templates/tiddlywiki5.html\",\"text\":\"\u003C$set name=\\\"saveTiddlerAndShadowsFilter\\\" filter=\\\"[subfilter\u003CsaveTiddlerFilter>] [subfilter\u003CsaveTiddlerFilter>plugintiddlers[]]\\\">\\n`\u003C!doctype html>\\n`{{$:/core/templates/MOTW.html}}`\u003Chtml lang=\\\"`\u003C$text text={{{ [{$:/language}get[name]] }}}/>`\\\">\\n\u003Chead>\\n\u003Cmeta http-equiv=\\\"Content-Type\\\" content=\\\"text/html;charset=utf-8\\\" />\\n\u003C!--~~ Raw markup for the top of the head section ~~-->\\n`{{{ [enlist\u003CsaveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified/TopHead]] ||$:/core/templates/raw-static-tiddler}}}`\\n\u003Cmeta http-equiv=\\\"X-UA-Compatible\\\" content=\\\"IE=Edge\\\"/>\\n\u003Cmeta name=\\\"application-name\\\" content=\\\"TiddlyWiki\\\" />\\n\u003Cmeta name=\\\"generator\\\" content=\\\"TiddlyWiki\\\" />\\n\u003Cmeta name=\\\"tiddlywiki-version\\\" content=\\\"`{{$:/core/templates/version}}`\\\" />\\n\u003Cmeta name=\\\"viewport\\\" content=\\\"width=device-width, initial-scale=1.0\\\" />\\n\u003Cmeta name=\\\"apple-mobile-web-app-capable\\\" content=\\\"yes\\\" />\\n\u003Cmeta name=\\\"apple-mobile-web-app-status-bar-style\\\" content=\\\"black-translucent\\\" />\\n\u003Cmeta name=\\\"mobile-web-app-capable\\\" content=\\\"yes\\\"/>\\n\u003Cmeta name=\\\"format-detection\\\" content=\\\"telephone=no\\\" />\\n\u003Cmeta name=\\\"copyright\\\" content=\\\"`{{$:/core/copyright.txt}}`\\\" />
2731\\n\u003Clink id=\\\"faviconLink\\\" rel=\\\"shortcut icon\\\" href=\\\"favicon.ico\\\">\\n\u003Ctitle>`{{$:/core/wiki/title}}`\u003C/title>\\n\u003C!--~~ This is a Tiddlywiki file. The points of interest in the file are marked with this pattern ~~-->\\n\\n\u003C!--~~ Raw markup ~~-->\\n`{{{ [enlist\u003CsaveTiddlerAndShadowsFilter>tag[$:/core/wiki/rawmarkup]] ||$:/core/templates/plain-text-tiddler}}}\\n{{{ [enlist\u003CsaveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkup]] ||$:/core/templates/plain-text-tiddler}}}\\n{{{ [enlist\u003CsaveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified]] ||$:/core/templates/raw-static-tiddler}}}`\\n\u003C/head>\\n\u003Cbody class=\\\"tc-body\\\">\\n\u003C!--~~ Raw markup for the top of the body section ~~-->\\n`{{{ [enlist\u003CsaveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified/TopBody]] ||$:/core/templates/raw-static-tiddler}}}`\\n\u003C!--~~ Static styles ~~-->\\n\u003Cdiv id=\\\"styleArea\\\">\\n`{{$:/boot/boot.css||$:/core/templates/css-tiddler}}`\\n\u003C/div>\\n\u003C!--~~ Static content for Google and browsers without JavaScript ~~-->\\n\u003Cnoscript>\\n\u003Cdiv id=\\\"splashArea\\\">\\n`{{$:/core/templates/static.area}}`\\n\u003C/div>\\n\u003C/noscript>\\n\u003C!--~~ Ordinary tiddlers ~~-->\\n`{{$:/core/templates/store.area.template.html}}`\\n\u003C!--~~ Library modules ~~-->\\n\u003Cdiv id=\\\"libraryModules\\\" style=\\\"display:none;\\\">\\n`{{{ [is[system]type[application/javascript]library[yes]] ||$:/core/templates/javascript-tiddler}}}`\\n\u003C/div>\\n\u003C!--~~ Boot kernel prologue ~~-->\\n\u003Cdiv id=\\\"bootKernelPrefix\\\" style=\\\"display:none;\\\">\\n`{{ $:/boot/bootprefix.js ||$:/core/templates/javascript-tiddler}}`\\n\u003C/div>\\n\u003C!--~~ Boot kernel ~~-->\\n\u003Cdiv id=\\\"bootKernel\\\" style=\\\"display:none;\\\">\\n`{{ $:/boot/boot.js ||$:/core/templates/javascript-tiddler}}`\\n\u003C/div>\\n\u003C!--~~ Raw markup for the bottom of the body section ~~-->\\n`{{{ [enlist\u003CsaveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified/BottomBody]] ||$:/core/templates/raw-static-tiddler}}}`\\n\u003C/body>\\n\u003C/html>`\\n\"},\"$:/core/templates/version\":{\"title\":\"$:/core/templates/version\",\"text\":\"\u003C\u003Cversion>>\"},\"$:/core/templates/wikified-tiddler\":{\"title\":\"$:/core/templates/wikified-tiddler\",\"text\":\"\u003C$transclude />\"},\"$:/core/ui/AboveStory/tw2-plugin-check\":{\"title\":\"$:/core/ui/AboveStory/tw2-plugin-check\",\"tags\":\"$:/tags/AboveStory\",\"text\":\"\\\\define lingo-base() $:/language/AboveStory/ClassicPlugin/\\n\u003C$list filter=\\\"[all[system+tiddlers]tag[systemConfig]limit[1]]\\\">\\n\\n\u003Cdiv class=\\\"tc-message-box\\\">\\n\\n\u003C\u003Clingo Warning>>\\n\\n\u003Cul>\\n\\n\u003C$list filter=\\\"[all[system+tiddlers]tag[systemConfig]]\\\">\\n\\n\u003Cli>\\n\\n\u003C$link>\u003C$view field=\\\"title\\\"/>\u003C/$link>\\n\\n\u003C/li>\\n\\n\u003C/$list>\\n\\n\u003C/ul>\\n\\n\u003C/div>\\n\\n\u003C/$list>\\n\"},\"$:/core/ui/Actions/new-image\":{\"title\":\"$:/core/ui/Actions/new-image\",\"tags\":\"$:/tags/Actions\",\"description\":\"create a new image tiddler\",\"text\":\"\\\\whitespace trim\\n\u003C$action-sendmessage $message=\\\"tm-new-tiddler\\\" type={{{ [{$:/config/NewImageType}addprefix[image/]] }}}/>\\n\"},\"$:/core/ui/Actions/new-journal\":{\"title\":\"$:/core/ui/Actions/new-journal\",\"tags\":\"$:/tags/Actions\",\"description\":\"create a new journal tiddler\",\"text\":\"\\\\define get-tags() $(textFieldTags)$ $(tagsFieldTags)$\\n\\\\whitespace trim\\n\u003C$vars journalTitleTemplate={{$:/config/NewJournal/Title}} textFieldTags={{$:/config/NewJournal/Tags}} tagsFieldTags={{$:/config/NewJournal/Tags!!tags}} journalText={{$:/config/NewJournal/Text}}>\\n\u003C$wikify name=\\\"journalTitle\\\" text=\\\"\u003C$macrocall $name='now' format=\u003C\u003CjournalTitleTemplate>>/>\\\">\\n\u003C$reveal type=\\\"nomatch\\\" state=\u003C\u003CjournalTitle>> text=\\\"\\\">\\n\u003C$action-sendmessage $message=\\\"tm-new-tiddler\\\" title=\u003C\u003CjournalTitle>> tags=\u003C\u003Cget-tags>> text={{{ [\u003CjournalTitle>get[]] }}}/>\\n\u003C/$reveal>\\n\u003C$reveal type=\\\"match\\\" state=\u003C\u003CjournalTitle>> text=\\\"\\\">\\n\u003C$action-sendmessage $message=\\\"tm-new-tiddler\\\" title=\u003C\u003CjournalTitle>> tags=\u003C\u003Cget-tags>> text=\u003C\u003CjournalText>>
2731/>\\n\u003C/$reveal>\\n\u003C/$wikify>\\n\u003C/$vars>\\n\"},\"$:/core/ui/Actions/new-tiddler\":{\"title\":\"$:/core/ui/Actions/new-tiddler\",\"tags\":\"$:/tags/Actions\",\"description\":\"create a new empty tiddler\",\"text\":\"\\\\define get-tags() $(textFieldTags)$ $(tagsFieldTags)$\\n\\\\whitespace trim\\n\u003C$vars textFieldTags={{$:/config/NewTiddler/Tags}} tagsFieldTags={{$:/config/NewTiddler/Tags!!tags}}>\\n\u003C$action-sendmessage $message=\\\"tm-new-tiddler\\\" tags=\u003C\u003Cget-tags>>/>\\n\u003C/$vars>\\n\"},\"$:/core/ui/AdvancedSearch/Filter\":{\"title\":\"$:/core/ui/AdvancedSearch/Filter\",\"tags\":\"$:/tags/AdvancedSearch\",\"caption\":\"{{$:/language/Search/Filter/Caption}}\",\"text\":\"\\\\define lingo-base() $:/language/Search/\\n\\\\define set-next-input-tab(beforeafter:\\\"after\\\")\\n\u003C$macrocall $name=\\\"change-input-tab\\\"\\n\\tstateTitle=\\\"$:/state/tab--1498284803\\\"\\n\\ttag=\\\"$:/tags/AdvancedSearch\\\"\\n\\tbeforeafter=\\\"$beforeafter$\\\"\\n\\tdefaultState=\\\"$:/core/ui/AdvancedSearch/System\\\"\\n\\tactions=\\\"\u003C$action-setfield $tiddler='$:/state/advancedsearch/currentTab' text=\u003C\u003CnextTab>>/>\\\"/>\\n\\\\end\\n\\n\\\\define cancel-search-actions()\\n\\\\whitespace trim\\n\u003C$list\\n\\tfilter=\\\"[{$:/temp/advancedsearch/input}!match{$:/temp/advancedsearch}]\\\"\\n\\temptyMessage=\\\"\u003C$action-deletetiddler $filter='[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]' />\\\">\\n\\t\u003C$action-setfield $tiddler=\\\"$:/temp/advancedsearch/input\\\" text={{$:/temp/advancedsearch}}/>\\n\\t\u003C$action-setfield $tiddler=\\\"$:/temp/advancedsearch/refresh\\\" text=\\\"yes\\\"/>\\n\u003C/$list>\\n\\\\end\\n\\n\\\\define input-accept-actions()\\n\\\\whitespace trim\\n\u003C$list\\n\\tfilter=\\\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\\\"\\n\\temptyMessage=\\\"\u003C$list filter='[\u003C__tiddler__>get[text]!is[missing]] ~[\u003C__tiddler__>get[text]is[shadow]]'>\u003C$action-navigate $to={{{ [\u003C__tiddler__>get[text]] }}}/>\u003C/$list>\\\">\\n\\t\u003C$action-navigate $to={{{ [\u003C__tiddler__>get[text]] }}}/>\\n\u003C/$list>\\n\\\\end\\n\\n\\\\define input-accept-variant-actions()\\n\\\\whitespace trim\\n\u003C$list\\n\\tfilter=\\\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\\\"\\n\\temptyMessage=\\\"\u003C$list filter='[\u003C__tiddler__>get[text]!is[missing]] ~[\u003C__tiddler__>get[text]is[shadow]]'>\u003C$list filter='[\u003C__tiddler__>get[text]minlength[1]]'>\u003C$action-sendmessage $message='tm-edit-tiddler' $param={{{  [\u003C__tiddler__>get[text]] }}}/>\u003C/$list>\u003C/$list>\\\">\\n\\t\u003C$list filter=\\\"[\u003C__tiddler__>get[text]minlength[1]]\\\">\\n\\t\\t\u003C$action-sendmessage $message=\\\"tm-edit-tiddler\\\" $param={{{  [\u003C__tiddler__>get[text]] }}}/>\\n\u003C/$list>\u003C/$list>\\n\\\\end\\n\\n\\\\whitespace trim\\n\u003C\u003Clingo Filter/Hint>>\\n\\n\u003Cdiv class=\\\"tc-search tc-advanced-search\\\">\\n\u003C$keyboard key=\\\"((input-tab-right))\\\" actions=\u003C\u003Cset-next-input-tab>>>\\n\u003C$keyboard key=\\\"((input-tab-left))\\\" actions=\u003C\u003Cset-next-input-tab \\\"before\\\">>>\\n\u003C$macrocall $name=\\\"keyboard-driven-input\\\"\\n\\ttiddler=\\\"$:/temp/advancedsearch/input\\\"\\n\\tstoreTitle=\\\"$:/temp/advancedsearch\\\"\\n\\trefreshTitle=\\\"$:/temp/advancedsearch/refresh\\\"\\n\\tselectionStateTitle=\\\"$:/temp/advancedsearch/selected-item\\\"\\n\\ttype=\\\"search\\\"\\n\\ttag=\\\"input\\\"\\n\\tfocus={{$:/config/Search/AutoFocus}}\\n\\tconfigTiddlerFilter=\\\"[[$:/temp/advancedsearch]]\\\"\\n\\tfirstSearchFilterField=\\\"text\\\"\\n\\tinputAcceptActions=\u003C\u003Cinput-accept-actions>>\\n\\tinputAcceptVariantActions=\u003C\u003Cinput-accept-variant-actions>>\\n\\tinputCancelActions=\u003C\u003Ccancel-search-actions>>/>\\n\u003C/$keyboard>\\n\u003C/$keyboard>\\n&#32;\\n\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/AdvancedSearch/FilterButton]!has[draft.of]]\\\">\u003C$transclude/>\u003C/$list>\\n\u003C/div>\\n\\n\u003C$reveal state=\\\"$:/temp/advancedsearch\\\" type=\\\"nomatch\\\" text=\\\"\\\">\\n\u003C$set name=\\\"resultCount\\\" value=\\\"\u003C$count filter={{$:/temp/advancedsearch}}/>\\\">\\n\u003Cdiv class=\\\"tc-search-results\\\">\\n\u003C\u003Clingo Filter/Matches>>\\n\u003C$list filter={{$:/temp/advancedsearch}}>\\n\u003Cspan class={{{[\u003CcurrentTiddler>addsuffix[-primaryList]] -[[$:/temp/advancedsearch/selected-item]get[text]] +[then[]else[tc-list-item-selected]] }}}>\\n\u003C$transclude tiddler=\\\"$:/core/ui/ListItemTemplate\\\"/>\\n\u003C/span>\\n\u003C/$list>\\n\u003C/div>\\n\u003C/$set>\\n\u003C/$reveal>\\n\"},\"$:/core/ui/AdvancedSearch/Filter/FilterButtons/clear\":{\"title\":\"$:/core/ui/AdvancedSearch/Filter/FilterButtons/clear\",\"tags\":\"$:/tags/AdvancedSearch/FilterButton\",\"text\":\"\\\\whitespace trim\\n\u003C$reveal state=\\\"$:/temp/advancedsearch\\\" type=\\\"nomatch\\\" text=\\\"\\\">\\n\u003C$button class=\\\"tc-btn-invisible\\\">\\n\u003C\u003Ccancel-search-actions>>\\n\u003C$action-sendmessage $message=\\\"tm-focus-selector\\\" $param=\\\"\\\"\\\".tc-advanced-search input\\\"\\\"\\\" />\\n{{$:/core/images/close-button}}\\n\u003C/$button>\\n\u003C/$reveal>\\n\"},\"$:/core/ui/AdvancedSearch/Filter/FilterButtons/delete\":{\"title\":\"$:/core/ui/AdvancedSearch/Filter/FilterButtons/delete\",\"tags\":\"$:/tags/AdvancedSearch/FilterButton\",\"text\":\"\\\\whitespace trim\\n\u003C$reveal state=\\\"$:/temp/advancedsearch\\\" type=\\\"nomatch\\\" text=\\\"\\\">\\n\u003C$button tooltip={{$:/language/Buttons/DeleteTiddlers/Hint}} popup=\u003C\u003Cqualify \\\"$:/state/filterDeleteDropdown\\\">> class=\\\"tc-btn-invisible\\\">\\n{{$:/core/images/delete-button}}\\n\u003C/$button>\\n\u003C/$reveal>\\n\\n\u003C$reveal state=\u003C\u003Cqualify \\\"$:/state/filterDeleteDropdown\\\">> type=\\\"popup\\\" position=\\\"belowleft\\\" animate=\\\"yes\\\">\\n\u003Cdiv class=\\\"tc-block-dropdown-wrapper\\\">\\n\u003Cdiv class=\\\"tc-block-dropdown tc-edit-type-dropdown\\\">\\n\u003Cdiv class=\\\"tc-dropdown-item-plain\\\">\\n\u003C$set name=\\\"resultCount\\\" value=\\\"\\\"\\\"\u003C$count filter={{$:/temp/advancedsearch}}/>\\\"\\\"\\\">\\n{{$:/language/ConfirmDeleteTiddlers}}\\n\u003C/$set>\\n\u003C/div>\\n\u003Cdiv class=\\\"tc-dropdown-item-plain\\\">\\n\u003C$button class=\\\"tc-btn\\\">
2731\\n\u003C$action-deletetiddler $filter={{$:/temp/advancedsearch}}/>\\n{{$:/language/Buttons/DeleteTiddlers/Hint}}\\n\u003C/$button>\\n\u003C/div>\\n\u003C/div>\\n\u003C/div>\\n\u003C/$reveal>\\n\"},\"$:/core/ui/AdvancedSearch/Filter/FilterButtons/dropdown\":{\"title\":\"$:/core/ui/AdvancedSearch/Filter/FilterButtons/dropdown\",\"tags\":\"$:/tags/AdvancedSearch/FilterButton\",\"text\":\"\\\\whitespace trim\\n\\n\u003Cspan class=\\\"tc-popup-keep\\\">\\n\u003C$button popup=\u003C\u003Cqualify \\\"$:/state/filterDropdown\\\">> class=\\\"tc-btn-invisible\\\">\\n{{$:/core/images/down-arrow}}\\n\u003C/$button>\\n\u003C/span>\\n\\n\u003C$reveal state=\u003C\u003Cqualify \\\"$:/state/filterDropdown\\\">> type=\\\"popup\\\" position=\\\"belowleft\\\" animate=\\\"yes\\\">\\n\u003C$set name=\\\"tv-show-missing-links\\\" value=\\\"yes\\\">\\n\u003C$linkcatcher actions=\\\"\u003C$action-setfield $tiddler='$:/temp/advancedsearch' text=\u003C\u003CnavigateTo>>/>\u003C$action-setfield $tiddler='$:/temp/advancedsearch/input' text=\u003C\u003CnavigateTo>>/>\u003C$action-setfield $tiddler='$:/temp/advancedsearch/refresh' text='yes'/>\u003C$action-sendmessage $message='tm-focus-selector' $param='.tc-advanced-search input' />\\\">\\n\u003Cdiv class=\\\"tc-block-dropdown-wrapper\\\">\\n\u003Cdiv class=\\\"tc-block-dropdown tc-edit-type-dropdown\\\">\\n\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/Filter]!is[draft]]\\\">\\n\u003C$link to={{!!filter}}>\u003C$let tv-wikilinks=\\\"no\\\">\u003C$transclude field=\\\"description\\\"/>\u003C/$let>\u003C/$link>\\n\u003C/$list>\\n\u003C/div>\\n\u003C/div>\\n\u003C/$linkcatcher>\\n\u003C/$set>\\n\u003C/$reveal>\\n\"},\"$:/core/ui/AdvancedSearch/Filter/FilterButtons/export\":{\"title\":\"$:/core/ui/AdvancedSearch/Filter/FilterButtons/export\",\"tags\":\"$:/tags/AdvancedSearch/FilterButton\",\"text\":\"\\\\whitespace trim\\n\u003C$reveal state=\\\"$:/temp/advancedsearch\\\" type=\\\"nomatch\\\" text=\\\"\\\">\\n\u003C$macrocall $name=\\\"exportButton\\\" exportFilter={{$:/temp/advancedsearch}} lingoBase=\\\"$:/language/Buttons/ExportTiddlers/\\\"/>\\n\u003C/$reveal>\\n\"},\"$:/core/ui/AdvancedSearch/Shadows\":{\"title\":\"$:/core/ui/AdvancedSearch/Shadows\",\"tags\":\"$:/tags/AdvancedSearch\",\"caption\":\"{{$:/language/Search/Shadows/Caption}}\",\"first-search-filter\":\"[all[shadows]search\u003CuserInput>sort[title]limit[250]] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]]\",\"text\":\"\\\\define lingo-base() $:/language/Search/\\n\\n\\\\define set-next-input-tab(beforeafter:\\\"after\\\")\\n\u003C$macrocall $name=\\\"change-input-tab\\\"\\n\\tstateTitle=\\\"$:/state/tab--1498284803\\\"\\n\\ttag=\\\"$:/tags/AdvancedSearch\\\"\\n\\tbeforeafter=\\\"$beforeafter$\\\"\\n\\tdefaultState=\\\"$:/core/ui/AdvancedSearch/System\\\"\\n\\tactions=\\\"\u003C$action-setfield $tiddler='$:/state/advancedsearch/currentTab' text=\u003C\u003CnextTab>>/>\\\"/>\\n\\\\end\\n\\n\\\\define cancel-search-actions()\\n\\\\whitespace trim\\n\u003C$list\\n\\tfilter=\\\"[{$:/temp/advancedsearch}!match{$:/temp/advancedsearch/input}]\\\"\\n\\temptyMessage=\\\"\u003C$action-deletetiddler $filter='[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]' />\\\">\\n\\t\u003C$action-setfield $tiddler=\\\"$:/temp/advancedsearch/input\\\" text={{$:/temp/advancedsearch}}/>\\n\\t\u003C$action-setfield $tiddler=\\\"$:/temp/advancedsearch/refresh\\\" text=\\\"yes\\\"/>\\n\u003C/$list>\\n\u003C$action-sendmessage $message=\\\"tm-focus-selector\\\" $param=\\\".tc-advanced-search input\\\"/>\\n\\\\end\\n\\n\\\\define input-accept-actions()\\n\\\\whitespace trim\\n\u003C$list\\n\\tfilter=\\\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\\\"\\n\\temptyMessage=\\\"\u003C$list filter='[\u003C__tiddler__>get[text]!is[missing]] ~[\u003C__tiddler__>get[text]is[shadow]]'>\u003C$action-navigate $to={{{ [\u003C__tiddler__>get[text]] }}}/>\u003C/$list>\\\">\\n\\t\u003C$action-navigate $to={{{ [\u003C__tiddler__>get[text]] }}}/>\\n\u003C/$list>\\n\\\\end\\n\\n\\\\define input-accept-variant-actions()\\n\\\\whitespace trim\\n\u003C$list\\n\\tfilter=\\\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\\\"\\n\\temptyMessage=\\\"\u003C$list filter='[\u003C__tiddler__>get[text]!is[missing]] ~[\u003C__tiddler__>get[text]is[shadow]]'>\u003C$list filter='[\u003C__tiddler__>get[text]minlength[1]]'>\u003C$action-sendmessage $message='tm-edit-tiddler' $param={{{  [\u003C__tiddler__>get[text]] }}}/>\u003C/$list>\u003C/$list>\\\">\\n\\t\u003C$list filter=\\\"[\u003C__tiddler__>get[text]minlength[1]]\\\">\\n\\t\\t\u003C$action-sendmessage $message=\\\"tm-edit-tiddler\\\" $param={{{  [\u003C__tiddler__>get[text]] }}}/>\\n\u003C/$list>\u003C/$list>
2731\\n\\\\end\\n\\n\\\\whitespace trim\\n\\n\u003C\u003Clingo Shadows/Hint>>\\n\\n\u003Cdiv class=\\\"tc-search\\\">\\n\u003C$keyboard key=\\\"((input-tab-right))\\\" actions=\u003C\u003Cset-next-input-tab>>>\\n\u003C$keyboard key=\\\"((input-tab-left))\\\" actions=\u003C\u003Cset-next-input-tab \\\"before\\\">>>\\n\u003C$macrocall $name=\\\"keyboard-driven-input\\\"\\n\\ttiddler=\\\"$:/temp/advancedsearch/input\\\"\\n\\tstoreTitle=\\\"$:/temp/advancedsearch\\\"\\n\\trefreshTitle=\\\"$:/temp/advancedsearch/refresh\\\"\\n\\tselectionStateTitle=\\\"$:/temp/advancedsearch/selected-item\\\"\\n\\ttype=\\\"search\\\"\\n\\ttag=\\\"input\\\"\\n\\tfocus={{$:/config/Search/AutoFocus}}\\n\\tconfigTiddlerFilter=\\\"[[$:/core/ui/AdvancedSearch/Shadows]]\\\"\\n\\tinputCancelActions=\u003C\u003Ccancel-search-actions>>\\n\\tinputAcceptActions=\u003C\u003Cinput-accept-actions>>\\n\\tinputAcceptVariantActions=\u003C\u003Cinput-accept-variant-actions>>\\n\\tfilterMinLength={{$:/config/Search/MinLength}}/>\\n\u003C/$keyboard>\\n\u003C/$keyboard>\\n&#32;\\n\u003C$reveal state=\\\"$:/temp/advancedsearch\\\" type=\\\"nomatch\\\" text=\\\"\\\">\\n\u003C$button class=\\\"tc-btn-invisible\\\">\\n\u003C\u003Ccancel-search-actions>>\\n{{$:/core/images/close-button}}\\n\u003C/$button>\\n\u003C/$reveal>\\n\u003C/div>\\n\\n\u003C$reveal state=\\\"$:/temp/advancedsearch\\\" type=\\\"nomatch\\\" text=\\\"\\\">\\n\\n\u003C$list filter=\\\"[{$:/temp/advancedsearch}minlength{$:/config/Search/MinLength}limit[1]]\\\" emptyMessage=\\\"\u003Cdiv class='tc-search-results'>{{$:/language/Search/Search/TooShort}}\u003C/div>\\\" variable=\\\"listItem\\\">\\n\\n\u003C$set name=\\\"resultCount\\\" value=\\\"\u003C$count filter='[all[shadows]search{$:/temp/advancedsearch}] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]]'/>\\\">\\n\\n\u003Cdiv class=\\\"tc-search-results\\\">\\n\\n\u003C\u003Clingo Shadows/Matches>>\\n\\n\u003C$list filter=\\\"[all[shadows]search{$:/temp/advancedsearch}sort[title]limit[250]] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]]\\\">\\n\u003Cspan class={{{[\u003CcurrentTiddler>addsuffix[-primaryList]] -[[$:/temp/advancedsearch/selected-item]get[text]] +[then[]else[tc-list-item-selected]] }}}>\\n\u003C$transclude tiddler=\\\"$:/core/ui/ListItemTemplate\\\"/>\\n\u003C/span>\\n\u003C/$list>\\n\\n\u003C/div>\\n\\n\u003C/$set>\\n\\n\u003C/$list>\\n\\n\u003C/$reveal>\\n\\n\u003C$reveal state=\\\"$:/temp/advancedsearch\\\" type=\\\"match\\\" text=\\\"\\\">\\n\\n\u003C/$reveal>\\n\"},\"$:/core/ui/AdvancedSearch/Standard\":{\"title\":\"$:/core/ui/AdvancedSearch/Standard\",\"tags\":\"$:/tags/AdvancedSearch\",\"caption\":\"{{$:/language/Search/Standard/Caption}}\",\"text\":\"\\\\define lingo-base() $:/language/Search/\\n\\\\define set-next-input-tab(beforeafter:\\\"after\\\") \u003C$macrocall $name=\\\"change-input-tab\\\" stateTitle=\\\"$:/state/tab--1498284803\\\" tag=\\\"$:/tags/AdvancedSearch\\\" beforeafter=\\\"$beforeafter$\\\" defaultState=\\\"$:/core/ui/AdvancedSearch/System\\\" actions=\\\"\u003C$action-setfield $tiddler='$:/state/advancedsearch/currentTab' text=\u003C\u003CnextTab>>/>\\\"/>\\n\\n\\\\define next-search-tab(beforeafter:\\\"after\\\") \u003C$macrocall $name=\\\"change-input-tab\\\" stateTitle=\\\"$:/state/tab/search-results/advancedsearch\\\" tag=\\\"$:/tags/SearchResults\\\" beforeafter=\\\"$beforeafter$\\\" defaultState={{$:/config/SearchResults/Default}} actions=\\\"\u003C$action-setfield $tiddler='$:/state/advancedsearch/standard/currentTab' text=\u003C\u003CnextTab>>/>\\\"/>\\n\\n\\\\define cancel-search-actions() \u003C$list filter=\\\"[{$:/temp/advancedsearch}!match{$:/temp/advancedsearch/input}]\\\" emptyMessage=\\\"\u003C$action-deletetiddler $filter='[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]' />\\\">\u003C$action-setfield $tiddler=\\\"$:/temp/advancedsearch/input\\\" text={{$:/temp/advancedsearch}}/>\u003C$action-setfield $tiddler=\\\"$:/temp/advancedsearch/refresh\\\" text=\\\"yes\\\"/>\u003C/$list>\u003C$action-sendmessage $message=\\\"tm-focus-selector\\\" $param=\\\".tc-advanced-search input\\\"/>\\n\\n\\\\define input-accept-actions() \u003C$list filter=\\\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\\\" emptyMessage=\\\"\u003C$list filter='[\u003C__tiddler__>get[text]!is[missing]] ~[\u003C__tiddler__>get[text]is[shadow]]'>\u003C$action-navigate $to={{{ [\u003C__tiddler__>get[text]] }}}/>\u003C/$list>\\\">\u003C$action-navigate $to={{{ [\u003C__tiddler__>get[text]] }}}/>\u003C/$list>\\n\\n\\\\define input-accept-variant-actions() \u003C$list filter=\\\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\\\" emptyMessage=\\\"\u003C$list filter='[\u003C__tiddler__>get[text]!is[missing]] ~[\u003C__tiddler__>get[text]is[shadow]]'>\u003C$list filter='[\u003C__tiddler__>get[text]minlength[1]]'>\u003C$action-sendmessage $message='tm-edit-tiddler' $param={{{  [\u003C__tiddler__>get[text]] }}}/>\u003C/$list>\u003C/$list>\\\">\u003C$list filter=\\\"[\u003C__tiddler__>get[text]minlength[1]]\\\">\u003C$action-sendmessage $message=\\\"tm-edit-tiddler\\\" $param={{{  [\u003C__tiddler__>get[text]] }}}/>\u003C/$list>\u003C/$list>\\n\\n\\\\whitespace trim\\n\\n\u003C\u003Clingo Standard/Hint>>\\n\\n\u003Cdiv class=\\\"tc-search\\\">\\n\u003C$keyboard key=\\\"((input-tab-right))\\\" actions=\u003C\u003Cset-next-input-tab>>>\\n\u003C$keyboard key=\\\"((input-tab-left))\\\" actions=\u003C\u003Cset-next-input-tab \\\"before\\\">>>\\n\u003C$keyboard key=\\\"shift-alt-Right\\\" actions=\u003C\u003Cnext-search-tab>>>\\n\u003C$keyboard key=\\\"shift-alt-Left\\\" actions=\u003C\u003Cnext-search-tab \\\"before\\\">>>\\n\u003C$macrocall $name=\\\"keyboard-driven-input\\\"\\n\\ttiddler=\\\"$:/temp/advancedsearch/input\\\"\\n\\tstoreTitle=\\\"$:/temp/advancedsearch\\\"\\n\\trefreshTitle=\\\"$:/temp/advancedsearch/refresh\\\"\\n\\tselectionStateTitle=\\\"$:/temp/advancedsearch/selected-item\\\"\\n\\ttype=\\\"search\\\"\\n\\ttag=\\\"input\\\"\\n\\tfocus={{$:/config/Search/AutoFocus}}\\n\\tinputCancelActions=\u003C\u003Ccancel-search-actions>>\\n\\tinputAcceptActions=\u003C\u003Cinput-accept-actions>>\\n\\tinputAcceptVariantActions=\u003C\u003Cinput-accept-variant-actions>>\\n\\tconfigTiddlerFilter=\\\"[[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}]\\\"\\n\\tfilterMinLength={{$:/config/Search/MinLength}}/>\\n\u003C/$keyboard>\\n\u003C/$keyboard>\\n\u003C/$keyboard>\\n\u003C/$keyboard>\\n\u003C$reveal state=\\\"$:/temp/advancedsearch\\\" type=\\\"nomatch\\\" text=\\\"\\\">\\n\u003C$button class=\\\"tc-btn-invisible\\\">\\n\u003C\u003Ccancel-search-actions>>\\n{{$:/core/images/close-button}}\\n\u003C/$button>\\n\u003C/$reveal>\\n\u003C/div>\\n\\n\u003C$reveal state=\\\"$:/temp/advancedsearch\\\" type=\\\"nomatch\\\" text=\\\"\\\">\\n\u003C$list\\n\\tfilter=\\\"[{$:/temp/advancedsearch}minlength{$:/config/Search/MinLength}limit[1]]\\\"\\n\\temptyMessage=\\\"\u003Cdiv class='tc-search-results'>{{$:/language/Search/Search/TooShort}}
2731\u003C/div>\\\"\\n\\tvariable=\\\"listItem\\\">\\n\u003C$vars\\n\\tuserInput={{{ [[$:/temp/advancedsearch]get[text]] }}}\\n\\tconfigTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}] }}}\\n\\tsearchListState=\\\"$:/temp/advancedsearch/selected-item\\\">\\n\u003C$list\\n\\tfilter=\\\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]butfirst[]limit[1]]\\\"\\n\\temptyMessage=\\\"\u003C$list filter='[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]'>\u003C$transclude/>\u003C/$list>\\\">\\n\u003C$macrocall $name=\\\"tabs\\\"\\n\\ttabsList=\\\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\\\"\\n\\tdefault={{$:/config/SearchResults/Default}}\\n\\tactions=\\\"\u003C$action-setfield $tiddler='$:/state/advancedsearch/standard/currentTab' text=\u003C\u003CcurrentTab>>/>\\\"\\n\\texplicitState=\\\"$:/state/tab/search-results/advancedsearch\\\" />\\n\u003C/$list>\\n\u003C/$vars>\\n\u003C/$list>\\n\u003C/$reveal>\\n\"},\"$:/core/ui/AdvancedSearch/System\":{\"title\":\"$:/core/ui/AdvancedSearch/System\",\"tags\":\"$:/tags/AdvancedSearch\",\"caption\":\"{{$:/language/Search/System/Caption}}\",\"first-search-filter\":\"[is[system]search\u003CuserInput>sort[title]limit[250]] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]] -[[$:/temp/advancedsearch/selected-item]]\",\"text\":\"\\\\define lingo-base() $:/language/Search/\\n\\\\define set-next-input-tab(beforeafter:\\\"after\\\",stateTitle,tag,defaultState,currentTabTiddler)\\n\u003C$macrocall $name=\\\"change-input-tab\\\"\\n\\tstateTitle=\\\"$:/state/tab--1498284803\\\"\\n\\ttag=\\\"$:/tags/AdvancedSearch\\\"\\n\\tbeforeafter=\\\"$beforeafter$\\\"\\n\\tdefaultState=\\\"$:/core/ui/AdvancedSearch/System\\\"\\n\\tactions=\\\"\u003C$action-setfield $tiddler='$:/state/advancedsearch/currentTab' text=\u003C\u003CnextTab>>/>\\\"/>\\n\\\\end\\n\\n\\\\define cancel-search-actions()\\n\\\\whitespace trim\\n\u003C$list\\n\\tfilter=\\\"[{$:/temp/advancedsearch}!match{$:/temp/advancedsearch/input}]\\\"\\n\\temptyMessage=\\\"\u003C$action-deletetiddler $filter='[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]' />\\\">\\n\\t\u003C$action-setfield $tiddler=\\\"$:/temp/advancedsearch/input\\\" text={{$:/temp/advancedsearch}}/>\\n\\t\u003C$action-setfield $tiddler=\\\"$:/temp/advancedsearch/refresh\\\" text=\\\"yes\\\"/>\\n\u003C/$list>\\n\u003C$action-sendmessage $message=\\\"tm-focus-selector\\\" $param=\\\".tc-advanced-search input\\\"/>\\n\\\\end\\n\\n\\\\define input-accept-actions()\\n\\\\whitespace trim\\n\u003C$list\\n\\tfilter=\\\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\\\"\\n\\temptyMessage=\\\"\u003C$list filter='[\u003C__tiddler__>get[text]!is[missing]] ~[\u003C__tiddler__>get[text]is[shadow]]'>\u003C$action-navigate $to={{{ [\u003C__tiddler__>get[text]] }}}/>\u003C/$list>\\\">\\n\\t\u003C$action-navigate $to={{{ [\u003C__tiddler__>get[text]] }}}/>\\n\u003C/$list>\\n\\\\end\\n\\n\\\\define input-accept-variant-actions()\\n\\\\whitespace trim\\n\u003C$list\\n\\tfilter=\\\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\\\"\\n\\temptyMessage=\\\"\u003C$list filter='[\u003C__tiddler__>get[text]!is[missing]] ~[\u003C__tiddler__>get[text]is[shadow]]'>\u003C$list filter='[\u003C__tiddler__>get[text]minlength[1]]'>\u003C$action-sendmessage $message='tm-edit-tiddler' $param={{{  [\u003C__tiddler__>get[text]] }}}/>\u003C/$list>\u003C/$list>\\\">\\n\\t\u003C$list filter=\\\"[\u003C__tiddler__>get[text]minlength[1]]\\\">\\n\\t\\t\u003C$action-sendmessage $message=\\\"tm-edit-tiddler\\\" $param={{{  [\u003C__tiddler__>get[text]] }}}/>\\n\u003C/$list>\u003C/$list>\\n\\\\end\\n\\n\\\\whitespace trim\\n\\n\u003C\u003Clingo System/Hint>>\\n\\n\u003Cdiv class=\\\"tc-search\\\">\\n\u003C$keyboard key=\\\"((input-tab-right))\\\" actions=\u003C\u003Cset-next-input-tab>>>\\n\u003C$keyboard key=\\\"((input-tab-left))\\\" actions=\u003C\u003Cset-next-input-tab \\\"before\\\">>>\\n\u003C$macrocall $name=\\\"keyboard-driven-input\\\"\\n\\ttiddler=\\\"$:/temp/advancedsearch/input\\\"\\n\\tstoreTitle=\\\"$:/temp/advancedsearch\\\"\\n\\trefreshTitle=\\\"$:/temp/advancedsearch/refresh\\\"\\n\\tselectionStateTitle=\\\"$:/temp/advancedsearch/selected-item\\\"\\n\\ttype=\\\"search\\\"\\n\\ttag=\\\"input\\\"\\n\\tfocus={{$:/config/Search/AutoFocus}}\\n\\tconfigTiddlerFilter=\\\"[[$:/core/ui/AdvancedSearch/System]]\\\"\\n\\tinputCancelActions=\u003C\u003Ccancel-search-actions>>\\n\\tinputAcceptActions=\u003C\u003Cinput-accept-actions>>\\n\\tinputAcceptVariantActions=\u003C\u003Cinput-accept-variant-actions>>\\n\\tfilterMinLength={{$:/config/Search/MinLength}}/>\\n\u003C/$keyboard>\\n\u003C/$keyboard>\\n&#32;\\n\u003C$reveal state=\\\"$:/temp/advancedsearch\\\" type=\\\"nomatch\\\" text=\\\"\\\">\\n\u003C$button class=\\\"tc-btn-invisible\\\">\\n\u003C\u003Ccancel-search-actions>>\\n{{$:/core/images/close-button}}\\n\u003C/$button>\\n\u003C/$reveal>\\n\u003C/div>\\n\\n\u003C$reveal state=\\\"$:/temp/advancedsearch\\\" type=\\\"nomatch\\\" text=\\\"\\\">\\n\\n\u003C$list filter=\\\"[{$:/temp/advancedsearch}minlength{$:/config/Search/MinLength}limit[1]]\\\" emptyMessage=\\\"\u003Cdiv class='tc-search-results'>{{$:/language/Search/Search/TooShort}}
2731\u003C/div>\\\" variable=\\\"listItem\\\">\\n\\n\u003C$set name=\\\"resultCount\\\" value=\\\"\u003C$count filter='[is[system]search{$:/temp/advancedsearch}] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]] -[[$:/temp/advancedsearch/selected-item]]'/>\\\">\\n\\n\u003Cdiv class=\\\"tc-search-results\\\">\\n\\n\u003C\u003Clingo System/Matches>>\\n\\n\u003C$list filter=\\\"[is[system]search{$:/temp/advancedsearch}sort[title]limit[250]] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]] -[[$:/temp/advancedsearch/selected-item]]\\\">\\n\u003Cspan class={{{[\u003CcurrentTiddler>addsuffix[-primaryList]] -[[$:/temp/advancedsearch/selected-item]get[text]] +[then[]else[tc-list-item-selected]] }}}>\\n\u003C$transclude tiddler=\\\"$:/core/ui/ListItemTemplate\\\"/>\\n\u003C/span>\\n\u003C/$list>\\n\\n\u003C/div>\\n\\n\u003C/$set>\\n\\n\u003C/$list>\\n\\n\u003C/$reveal>\\n\\n\u003C$reveal state=\\\"$:/temp/advancedsearch\\\" type=\\\"match\\\" text=\\\"\\\">\\n\\n\u003C/$reveal>\\n\"},\"$:/AdvancedSearch\":{\"title\":\"$:/AdvancedSearch\",\"icon\":\"$:/core/images/advanced-search-button\",\"color\":\"#bbb\",\"text\":\"\\\\whitespace trim\\n\u003Cdiv class=\\\"tc-advanced-search\\\">\\n\u003C$macrocall $name=\\\"tabs\\\" tabsList=\\\"[all[shadows+tiddlers]tag[$:/tags/AdvancedSearch]!has[draft.of]]\\\" default=\\\"$:/core/ui/AdvancedSearch/System\\\" actions=\\\"\\\"\\\"\u003C$action-setfield $tiddler=\\\"$:/state/advancedsearch/currentTab\\\" text=\u003C\u003CcurrentTab>>/>\\\"\\\"\\\" explicitState=\\\"$:/state/tab--1498284803\\\"/>\\n\u003C/div>\\n\"},\"$:/core/ui/AlertTemplate\":{\"title\":\"$:/core/ui/AlertTemplate\",\"code-body\":\"yes\",\"text\":\"\\\\whitespace trim\\n\u003Cdiv class=\\\"tc-alert\\\">\\n\u003Cdiv class=\\\"tc-alert-toolbar\\\">\\n\u003C$button class=\\\"tc-btn-invisible\\\">\u003C$action-deletetiddler $tiddler=\u003C\u003CcurrentTiddler>>/>{{$:/core/images/cancel-button}}\u003C/$button>\\n\u003C/div>\\n\u003Cdiv class=\\\"tc-alert-subtitle\\\">\\n\u003C$wikify name=\\\"format\\\" text=\u003C\u003Clingo Tiddler/DateFormat>>>\\n\u003C$view field=\\\"component\\\"/>\\n&#32;-&#32;\\n\u003C$view field=\\\"modified\\\" format=\\\"date\\\" template=\u003C\u003Cformat>>/>\\n&#32;\\n\u003C$reveal type=\\\"nomatch\\\" state=\\\"!!count\\\" text=\\\"\\\">\\n\u003Cspan class=\\\"tc-alert-highlight\\\">\\n({{$:/language/Count}}:&#32;\u003C$view field=\\\"count\\\"/>)\\n\u003C/span>\\n\u003C/$reveal>\\n\u003C/$wikify>\\n\u003C/div>\\n\u003Cdiv class=\\\"tc-alert-body\\\">\\n\\n\u003C$transclude/>\\n\\n\u003C/div>\\n\u003C/div>\\n\"},\"$:/core/ui/BinaryWarning\":{\"title\":\"$:/core/ui/BinaryWarning\",\"text\":\"\\\\define lingo-base() $:/language/BinaryWarning/\\n\u003C\u003Clingo Prompt>>\\n\"},\"$:/core/ui/VisibleTransclude\":{\"title\":\"$:/core/ui/VisibleTransclude\",\"text\":\"\u003C!--\\nImport this component to make all the child transclusions visible.\\n\\nBlock transclusions are shown in red, and inline transclusions are shown in green.\\n-->\\n\\\\widget $transclude()\\n\u003C!-- Use a parameters widget so that we can access the `$params` data -->\\n\u003C$parameters tiddler=\\\"\\\" $$tiddler=\\\"\\\" mode=\\\"\\\" $$mode=\\\"\\\" $parseMode=\\\"@parseMode\\\" $params=\\\"@params\\\">\\n\\t\u003C!-- Replicate the logic of the transclude widget to determine the output mode, and hence the tag and colour to use for output -->\\n\\t\u003C$let\\n\\t\\tmode={{{ [[$mode]is[variable]then\u003C$mode>!is[blank]] :else[[mode]is[variable]then\u003Cmode>!is[blank]] :else[\u003C@parseMode>] }}}\\n\\t\\toutputTag={{{ [\u003Cmode>match[inline]then[span]else[div]] }}}\\n\\t\\toutputColour={{{ [\u003Cmode>match[inline]then[green]else[red]] }}}\\n\\t>\\n\\t\\t\u003C!-- Use divs or spans according to the mode -->\\n\\t\\t\u003C$genesis $type=\u003C\u003CoutputTag>> style=\\\"color:white;padding:4px;\\\" style.background=\u003C\u003CoutputColour>>>\\n\\t\\t\\t\u003C$genesis $type=\u003C\u003CoutputTag>> style=\\\"display: inline-block;\\\">\\n\\t\\t\\t\\t\u003Cdiv style=\\\"background:white;color:black;font-size: 12px;line-height:1.2;text-align:left;font-weight:normal;padding:4px;margin:4px;\\\">\\n\\t\\t\\t\\t\\t\u003C!-- Render the parameters to the transclusion -->\\n\\t\\t\\t\\t\\t\u003C$list filter=\\\"[\u003C@params>
2731jsonindexes[]]\\\" emptyMessage=\\\"(none)\\\">\\n\\t\\t\\t\\t\\t\\t\u003Cdiv>\\n\\t\\t\\t\\t\\t\\t\\t\u003C$text text=\u003C\u003CcurrentTiddler>>/>\u003C$text text=\\\": \\\"/>\u003C$text text={{{ [\u003C@params>jsonget\u003CcurrentTiddler>] }}}/>\\n\\t\\t\\t\\t\\t\\t\u003C/div>\\n\\t\\t\\t\\t\\t\u003C/$list>\\n\\t\\t\\t\\t\u003C/div>\\n\\t\\t\\t\u003C/$genesis>\\n\\t\\t\\t\u003C$genesis $type=\u003C\u003CoutputTag>> style=\\\"background:white;color:black;padding:4px;\\\">\\n\\t\\t\\t\\t\u003C!-- Look for a parameter starting with $ to determine if we are in legacy mode -->\\n\\t\\t\\t\\t\u003C$list filter=\\\"[\u003C@params>jsonindexes[]] :filter[\u003CcurrentTiddler>prefix[$]] +[limit[1]]\\\" variable=\\\"ignore\\\" emptyMessage=\\\"\\\"\\\"\\n\\t\\t\\t\\t\\t\u003C!-- Legacy mode: we render the transclusion without a dollar sign for recursionMarker and mode -->\\n\\t\\t\\t\\t\\t\u003C$genesis $type=\\\"$transclude\\\" $remappable=\\\"no\\\" $names=\\\"[\u003C@params>jsonindexes[]]\\\" $values=\\\"[\u003C@params>jsonindexes[]] :map[\u003C@params>jsonget\u003CcurrentTiddler>]\\\" recursionMarker=\\\"no\\\" mode=\u003C\u003Cmode>> $$fillignore=\\\"yes\\\">\\n\\t\\t\\t\\t\\t\\t\u003C!-- Reach back up to the grandparent transclusion to get the correct slot value -->\\n\\t\\t\\t\\t\\t\\t\u003C$slot $name=\\\"ts-raw\\\"/>\\n\\t\\t\\t\\t\\t\u003C/$genesis>\\n\\t\\t\\t\\t\\\"\\\"\\\">\\n\\t\\t\\t\\t\\t\u003C!-- Non-legacy mode: we use dollar signs for the recursionMarker and mode -->\\n\\t\\t\\t\\t\\t\u003C$genesis $type=\\\"$transclude\\\" $remappable=\\\"no\\\" $names=\\\"[\u003C@params>jsonindexes[]]\\\" $values=\\\"[\u003C@params>jsonindexes[]] :map[\u003C@params>jsonget\u003CcurrentTiddler>]\\\" $$recursionMarker=\\\"no\\\" $$mode=\u003C\u003Cmode>> $$fillignore=\\\"yes\\\">\\n\\t\\t\\t\\t\\t\\t\u003C!-- Reach back up to the grandparent transclusion to get the correct slot fill value -->\\n\\t\\t\\t\\t\\t\\t\u003C$slot $name=\\\"ts-raw\\\"/>\\n\\t\\t\\t\\t\\t\u003C/$genesis>\\n\\t\\t\\t\\t\u003C/$list>\\n\\t\\t\\t\u003C/$genesis>\\n\\t\\t\u003C/$genesis>\\n\\t\u003C/$let>\\n\u003C/$parameters>\\n\\\\end\\n\"},\"$:/core/ui/Components/plugin-info\":{\"title\":\"$:/core/ui/Components/plugin-info\",\"text\":\"\\\\define lingo-base() $:/language/ControlPanel/Plugins/\\n\\n\\\\define popup-state-macro()\\n$(qualified-state)$-$(currentTiddler)$\\n\\\\end\\n\\n\\\\define tabs-state-macro()\\n$(popup-state)$-$(pluginInfoType)$\\n\\\\end\\n\\n\\\\define plugin-icon-title()\\n$(currentTiddler)$/icon\\n\\\\end\\n\\n\\\\define plugin-disable-title()\\n$:/config/Plugins/Disabled/$(currentTiddler)$\\n\\\\end\\n\\n\\\\define plugin-table-body(type,disabledMessage,default-popup-state)\\n\\\\whitespace trim\\n\u003Cdiv class=\\\"tc-plugin-info-chunk tc-plugin-info-toggle\\\">\\n\\t\u003C$reveal type=\\\"nomatch\\\" state=\u003C\u003Cpopup-state>> text=\\\"yes\\\" default=\\\"\\\"\\\"$default-popup-state$\\\"\\\"\\\">\\n\\t\\t\u003C$button class=\\\"tc-btn-invisible tc-btn-dropdown\\\" set=\u003C\u003Cpopup-state>> setTo=\\\"yes\\\">\\n\\t\\t\\t{{$:/core/images/chevron-right}}\\n\\t\\t\u003C/$button>\\n\\t\u003C/$reveal>\\n\\t\u003C$reveal type=\\\"match\\\" state=\u003C\u003Cpopup-state>> text=\\\"yes\\\" default=\\\"\\\"\\\"$default-popup-state$\\\"\\\"\\\">\\n\\t\\t\u003C$button class=\\\"tc-btn-invisible tc-btn-dropdown\\\" set=\u003C\u003Cpopup-state>> setTo=\\\"no\\\">\\n\\t\\t\\t{{$:/core/images/chevron-down}}\\n\\t\\t\u003C/$button>\\n\\t\u003C/$reveal>\\n\u003C/div>\\n\u003Cdiv class=\\\"tc-plugin-info-chunk tc-plugin-info-icon\\\">\\n\\t\u003C$transclude tiddler=\u003C\u003CcurrentTiddler>> subtiddler=\u003C\u003Cplugin-icon-title>>>\\n\\t\\t\u003C$transclude tiddler=\\\"$:/core/images/plugin-generic-$type$\\\"/>\\n\\t\u003C/$transclude>\\n\u003C/div>\\n\u003Cdiv class=\\\"tc-plugin-info-chunk tc-plugin-info-description\\\">\\n\\t\u003Ch1>\\n\\t\\t''\u003C$text text={{{ [\u003CcurrentTiddler>get[name]] ~[\u003CcurrentTiddler>split[/]last[1]] }}}/>'':&nbsp;\u003C$view field=\\\"description\\\">\u003C$view field=\\\"title\\\"/>\u003C/$view>&nbsp;$disabledMessage$\\n\\t\u003C/h1>\\n\\t\u003Ch2>\\n\\t\\t\u003C$view field=\\\"title\\\"/>\\n\\t\u003C/h2>\\n\\t\u003Ch2>\\n\\t\\t\u003Cdiv>\u003Cem>\u003C$view field=\\\"version\\\"/>\u003C/em>\u003C/div>\\n\\t\u003C/h2>\\n\u003C/div>
2731\\n\\\\end\\n\\n\\\\define plugin-info(type,default-popup-state)\\n\\\\whitespace trim\\n\u003C$set name=\\\"popup-state\\\" value=\u003C\u003Cpopup-state-macro>>>\\n\\t\u003C$reveal type=\\\"nomatch\\\" state=\u003C\u003Cplugin-disable-title>> text=\\\"yes\\\">\\n\\t\\t\u003C$link to={{!!title}} class=\\\"tc-plugin-info\\\">\\n\\t\\t\\t\u003C\u003Cplugin-table-body type:\\\"$type$\\\" default-popup-state:\\\"\\\"\\\"$default-popup-state$\\\"\\\"\\\">>\\n\\t\\t\u003C/$link>\\n\\t\u003C/$reveal>\\n\\t\u003C$reveal type=\\\"match\\\" state=\u003C\u003Cplugin-disable-title>> text=\\\"yes\\\">\\n\\t\\t\u003C$link to={{!!title}} class=\\\"tc-plugin-info tc-plugin-info-disabled\\\">\\n\\t\\t\\t\u003C\u003Cplugin-table-body type:\\\"$type$\\\" default-popup-state:\\\"\\\"\\\"$default-popup-state$\\\"\\\"\\\" disabledMessage:\\\"\u003C$macrocall $name='lingo' title='Disabled/Status'/>\\\">>\\n\\t\\t\u003C/$link>\\n\\t\u003C/$reveal>\\n\\t\u003C$reveal type=\\\"match\\\" text=\\\"yes\\\" state=\u003C\u003Cpopup-state>> default=\\\"\\\"\\\"$default-popup-state$\\\"\\\"\\\">\\n\\t\\t\u003Cdiv class=\\\"tc-plugin-info-dropdown\\\">\\n\\t\\t\\t\u003Cdiv class=\\\"tc-plugin-info-dropdown-body\\\">\\n\\t\\t\\t\\t\u003C$list filter=\\\"[all[current]] -[[$:/core]]\\\">\\n\\t\\t\\t\\t\\t\u003Cdiv style=\\\"float:right;\\\">\\n\\t\\t\\t\\t\\t\\t\u003C$reveal type=\\\"nomatch\\\" state=\u003C\u003Cplugin-disable-title>> text=\\\"yes\\\">\\n\\t\\t\\t\\t\\t\\t\\t\u003C$button set=\u003C\u003Cplugin-disable-title>> setTo=\\\"yes\\\" tooltip={{$:/language/ControlPanel/Plugins/Disable/Hint}} aria-label={{$:/language/ControlPanel/Plugins/Disable/Caption}}>\\n\\t\\t\\t\\t\\t\\t\\t\\t\u003C\u003Clingo Disable/Caption>>\\n\\t\\t\\t\\t\\t\\t\\t\u003C/$button>\\n\\t\\t\\t\\t\\t\\t\u003C/$reveal>\\n\\t\\t\\t\\t\\t\\t\u003C$reveal type=\\\"match\\\" state=\u003C\u003Cplugin-disable-title>> text=\\\"yes\\\">\\n\\t\\t\\t\\t\\t\\t\\t\u003C$button set=\u003C\u003Cplugin-disable-title>> setTo=\\\"no\\\" tooltip={{$:/language/ControlPanel/Plugins/Enable Hint}} aria-label={{$:/language/ControlPanel/Plugins/Enable/Caption}}>\\n\\t\\t\\t\\t\\t\\t\\t\\t\u003C\u003Clingo Enable/Caption>>\\n\\t\\t\\t\\t\\t\\t\\t\u003C/$button>\\n\\t\\t\\t\\t\\t\\t\u003C/$reveal>\\n\\t\\t\\t\\t\\t\u003C/div>\\n\\t\\t\\t\\t\u003C/$list>\\n\\t\\t\\t\\t\u003C$set name=\\\"tabsList\\\" filter=\\\"[\u003CcurrentTiddler>list[]] contents\\\">\\n\\t\\t\\t\\t\\t\u003C$macrocall $name=\\\"tabs\\\" state=\u003C\u003Ctabs-state-macro>> tabsList=\u003C\u003CtabsList>> default={{{ [enlist\u003CtabsList>] }}} template=\\\"$:/core/ui/PluginInfo\\\"/>\\n\\t\\t\\t\\t\u003C/$set>\\n\\t\\t\\t\u003C/div>\\n\\t\\t\u003C/div>\\n\\t\u003C/$reveal>\\n\u003C/$set>\\n\\\\end\\n\\n\u003C$macrocall $name=\\\"plugin-info\\\" type=\u003C\u003Cplugin-type>> default-popup-state=\u003C\u003Cdefault-popup-state>>/>\\n\"},\"$:/core/ui/Components/tag-link\":{\"title\":\"$:/core/ui/Components/tag-link\",\"text\":\"\\\\whitespace trim\\n\u003C$link>\\n\u003C$set name=\\\"backgroundColor\\\" value={{{ [\u003CcurrentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerColourFilter]!is[draft]get[text]] }}}>\\n\u003Cspan style=\u003C\u003Ctag-styles>> class=\\\"tc-tag-label\\\">\\n\u003C$view field=\\\"title\\\" format=\\\"text\\\"/>\\n\u003C/span>\\n\u003C/$set>\\n\u003C/$link>\"},\"$:/core/ui/ControlPanel/Advanced\":{\"title\":\"$:/core/ui/ControlPanel/Advanced\",\"tags\":\"$:/tags/ControlPanel/Info\",\"caption\":\"{{$:/language/ControlPanel/Advanced/Caption}}\",\"text\":\"\\\\whitespace trim\\n{{$:/language/ControlPanel/Advanced/Hint}}\\n\\n\u003Cdiv class=\\\"tc-control-panel\\\">\\n\u003C$macrocall $name=\\\"tabs\\\" tabsList=\\\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Advanced]!has[draft.of]]\\\" default=\\\"$:/core/ui/ControlPanel/TiddlerFields\\\" explicitState=\\\"$:/state/tab--959111941\\\"/>\\n\u003C/div>\\n\"},\"$:/core/ui/ControlPanel/Appearance\":{\"title\":\"$:/core/ui/ControlPanel/Appearance\",\"tags\":\"$:/tags/ControlPanel\",\"caption\":\"{{$:/language/ControlPanel/Appearance/Caption}}\",\"text\":\"\\\\whitespace trim\\n{{$:/language/ControlPanel/Appearance/Hint}}
2731\\n\\n\u003Cdiv class=\\\"tc-control-panel\\\">\\n\u003C$macrocall $name=\\\"tabs\\\" tabsList=\\\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Appearance]!has[draft.of]]\\\" default=\\\"$:/core/ui/ControlPanel/Theme\\\" explicitState=\\\"$:/state/tab--1963855381\\\"/>\\n\u003C/div>\\n\"},\"$:/snippets/retain-story-ordering-button\":{\"title\":\"$:/snippets/retain-story-ordering-button\",\"text\":\"\u003C$button set=\\\"$:/DefaultTiddlers\\\" setTo={{$:/config/ControlPanel/Basics/DefaultTiddlers/RetainStory}} >\u003C\u003CcurrentTiddler>>\u003C/$button>\"},\"$:/core/ui/ControlPanel/Basics\":{\"title\":\"$:/core/ui/ControlPanel/Basics\",\"tags\":\"$:/tags/ControlPanel/Info\",\"caption\":\"{{$:/language/ControlPanel/Basics/Caption}}\",\"text\":\"\\\\define lingo-base() $:/language/ControlPanel/Basics/\\n\\n\\\\define show-filter-count(filter)\\n\\\\whitespace trim\\n\u003C$button class=\\\"tc-btn-invisible\\\">\\n\u003C$action-setfield $tiddler=\\\"$:/temp/advancedsearch\\\" $value=\\\"\\\"\\\"$filter$\\\"\\\"\\\"/>\\n\u003C$action-setfield $tiddler=\\\"$:/temp/advancedsearch/input\\\" $value=\\\"\\\"\\\"$filter$\\\"\\\"\\\"/>\\n\u003C$action-setfield $tiddler=\\\"$:/temp/advancedsearch/refresh\\\" text=\\\"yes\\\"/>\\n\u003C$action-setfield $tiddler=\\\"$:/state/tab--1498284803\\\" $value=\\\"$:/core/ui/AdvancedSearch/Filter\\\"/>\\n\u003C$action-navigate $to=\\\"$:/AdvancedSearch\\\"/>\\n\u003C$action-sendmessage $message=\\\"tm-focus-selector\\\" $param=\\\".tc-advanced-search input\\\"/>\\n''\u003C$count filter=\\\"\\\"\\\"$filter$\\\"\\\"\\\"/>''\\n&#32;\\n{{$:/core/images/advanced-search-button}}\\n\u003C/$button>\\n\\\\end\\n\\\\whitespace trim\\n\\n|tc-max-width tc-edit-max-width|k\\n|\u003C\u003Clingo Version/Prompt>> |''\u003C\u003Cversion>>'' |\\n|\u003C$link to=\\\"$:/SiteTitle\\\">\u003C\u003Clingo Title/Prompt>>\u003C/$link> |\u003C$edit-text tiddler=\\\"$:/SiteTitle\\\" default=\\\"\\\" tag=\\\"input\\\"/> |\\n|\u003C$link to=\\\"$:/SiteSubtitle\\\">\u003C\u003Clingo Subtitle/Prompt>>\u003C/$link> |\u003C$edit-text tiddler=\\\"$:/SiteSubtitle\\\" default=\\\"\\\" tag=\\\"input\\\"/> |\\n|\u003C$link to=\\\"$:/status/UserName\\\">\u003C\u003Clingo Username/Prompt>>\u003C/$link> |\u003C$edit-text tiddler=\\\"$:/status/UserName\\\" default=\\\"\\\" tag=\\\"input\\\"/> |\\n|\u003C$link to=\\\"$:/config/AnimationDuration\\\">\u003C\u003Clingo AnimDuration/Prompt>>\u003C/$link> |\u003C$edit-text tiddler=\\\"$:/config/AnimationDuration\\\" default=\\\"\\\" tag=\\\"input\\\"/> |\\n|\u003C$link to=\\\"$:/DefaultTiddlers\\\">\u003C\u003Clingo DefaultTiddlers/Prompt>>\u003C/$link> |\u003C\u003Clingo DefaultTiddlers/TopHint>>\u003Cbr> \u003C$edit class=\\\"tc-edit-texteditor\\\" tiddler=\\\"$:/DefaultTiddlers\\\"/>\u003Cbr>//\u003C\u003Clingo DefaultTiddlers/BottomHint>>// |\\n|\u003C$link to=\\\"$:/language/DefaultNewTiddlerTitle\\\">\u003C\u003Clingo NewTiddler/Title/Prompt>>\u003C/$link> |\u003C$edit-text tiddler=\\\"$:/language/DefaultNewTiddlerTitle\\\" default=\\\"\\\" tag=\\\"input\\\"/> |\\n|\u003C$link to=\\\"$:/config/NewJournal/Title\\\">\u003C\u003Clingo NewJournal/Title/Prompt>>\u003C/$link> |\u003C$edit-text tiddler=\\\"$:/config/NewJournal/Title\\\" default=\\\"\\\" tag=\\\"input\\\"/> |\\n|\u003C$link to=\\\"$:/config/NewJournal/Text\\\">\u003C\u003Clingo NewJournal/Text/Prompt>>\u003C/$link> |\u003C$edit tiddler=\\\"$:/config/NewJournal/Text\\\" class=\\\"tc-edit-texteditor\\\" default=\\\"\\\"/> |\\n|\u003C$link to=\\\"$:/config/NewTiddler/Tags\\\">\u003C\u003Clingo NewTiddler/Tags/Prompt>>\u003C/$link> |\u003C$vars currentTiddler=\\\"$:/config/NewTiddler/Tags\\\" tagField=\\\"text\\\">{{||$:/core/ui/EditTemplate/tags}}\u003C$list filter=\\\"[\u003CcurrentTiddler>tags[]] +[limit[1]]\\\" variable=\\\"ignore\\\">\u003C$button tooltip={{$:/language/ControlPanel/Basics/RemoveTags/Hint}}>\u003C\u003Clingo RemoveTags>>\u003C$action-listops $tiddler=\u003C\u003CcurrentTiddler>> $field=\\\"text\\\" $subfilter={{{ [\u003CcurrentTiddler>get[tags]] }}}/>\u003C$action-setfield $tiddler=\u003C\u003CcurrentTiddler>> tags=\\\"\\\"/>\u003C/$button>\u003C/$list>\u003C/$vars> |\\n|\u003C$link to=\\\"$:/config/NewJournal/Tags\\\">\u003C\u003Clingo NewJournal/Tags/Prompt>>\u003C/$link> |\u003C$vars currentTiddler=\\\"$:/config/NewJournal/Tags\\\" tagField=\\\"text\\\">{{||$:/core/ui/EditTemplate/tags}}\u003C$list filter=\\\"[\u003CcurrentTiddler>tags[]] +[limit[1]]\\\" variable=\\\"ignore\\\">\u003C$button tooltip={{$:/language/ControlPanel/Basics/RemoveTags/Hint}}>\u003C\u003Clingo RemoveTags>>\u003C$action-listops $tiddler=\u003C\u003CcurrentTiddler>> $field=\\\"text\\\" $subfilter={{{ [\u003CcurrentTiddler>get[tags]] }}}/>\u003C$action-setfield $tiddler=\u003C\u003CcurrentTiddler>> tags=\\\"\\\"/>\u003C/$button>\u003C/$list>\u003C/$vars> |\\n|\u003C$link to=\\\"$:/config/AutoFocus\\\">\u003C\u003Clingo AutoFocus/Prompt>>\u003C/$link> |{{$:/snippets/minifocusswitcher}} |\\n|\u003C\u003Clingo Language/Prompt>> |{{$:/snippets/minilanguageswitcher}} |\\n|\u003C\u003Clingo Tiddlers/Prompt>> |\u003C\u003Cshow-filter-count \\\"[!is[system]sort[title]]\\\">> |\\n|\u003C\u003Clingo Tags/Prompt>> |\u003C\u003Cshow-filter-count \\\"[tags[]sort[title]]\\\">> |\\n|\u003C\u003Clingo SystemTiddlers/Prompt>> |\u003C\u003Cshow-filter-count \\\"[is[system]sort[title]]\\\">> |\\n|\u003C\u003Clingo ShadowTiddlers/Prompt>> |\u003C\u003Cshow-filter-count \\\"[all[shadows]sort[title]]\\\">> |\\n|\u003C\u003Clingo OverriddenShadowTiddlers/Prompt>> |\u003C\u003Cshow-filter-count \\\"[is[tiddler]is[shadow]sort[title]]\\\">> |\\n\"},\"$:/core/ui/ControlPanel/EditTemplateBody\":{\"title\":\"$:/core/ui/ControlPanel/EditTemplateBody\",\"tags\":\"$:/tags/ControlPanel/Cascades\",\"caption\":\"{{$:/language/ControlPanel/EditTemplateBody/Caption}}\",\"text\":\"\\\\define lingo-base() $:/language/ControlPanel/EditTemplateBody/\\n\\n\u003C\u003Clingo Hint>>\\n\\n{{$:/tags/EditTemplateBodyFilter||$:/snippets/ListTaggedCascade}}\\n\"},\"$:/core/ui/ControlPanel/FieldEditor\":{\"title\":\"$:/core/ui/ControlPanel/FieldEditor\",\"tags\":\"$:/tags/ControlPanel/Cascades\",\"caption\":\"{{$:/language/ControlPanel/FieldEditor/Caption}}\",\"text\":\"\\\\define lingo-base() $:/language/ControlPanel/FieldEditor/\\n\\n\u003C\u003Clingo Hint>>\\n\\n{{$:/tags/FieldEditorFilter||$:/snippets/ListTaggedCascade}}\\n\"},\"$:/core/ui/ControlPanel/StoryTiddler\":{\"title\":\"$:/core/ui/ControlPanel/StoryTiddler\",\"tags\":\"$:/tags/ControlPanel/Cascades\",\"caption\":\"{{$:/language/ControlPanel/StoryTiddler/Caption}}\",\"text\":\"\\\\define lingo-base() $:/language/ControlPanel/StoryTiddler/\\n\\n\u003C\u003Clingo Hint>>\\n\\n{{$:/tags/StoryTiddlerTemplateFilter||$:/snippets/ListTaggedCascade}}\\n\"},\"$:/core/ui/ControlPanel/TiddlerColour\":{\"title\":\"$:/core/ui/ControlPanel/TiddlerColour\",\"tags\":\"$:/tags/ControlPanel/Cascades\",\"caption\":\"{{$:/language/ControlPanel/TiddlerColour/Caption}}\",\"text\":\"\\\\define lingo-base() $:/language/ControlPanel/TiddlerColour/\\n\\n\u003C\u003Clingo Hint>>\\n\\n{{$:/tags/TiddlerColourFilter||$:/snippets/ListTaggedCascade}}\\n\"},\"$:/core/ui/ControlPanel/TiddlerIcon\":{\"title\":\"$:/core/ui/ControlPanel/TiddlerIcon\",\"tags\":\"$:/tags/ControlPanel/Cascades\",\"caption\":\"{{$:/language/ControlPanel/TiddlerIcon/Caption}}\",\"text\":\"\\\\define lingo-base() $:/language/ControlPanel/TiddlerIcon/\\n\\n\u003C\u003Clingo Hint>>\\n\\n{{$:/tags/TiddlerIconFilter||$:/snippets/ListTaggedCascade}}\\n\"},\"$:/core/ui/ControlPanel/ViewTemplateBody\":{\"title\":\"$:/core/ui/ControlPanel/ViewTemplateBody\",\"tags\":\"$:/tags/ControlPanel/Cascades\",\"caption\":\"{{$:/language/ControlPanel/ViewTemplateBody/Caption}}\",\"text\":\"\\\\define lingo-base() $:/language/ControlPanel/ViewTemplateBody/\\n\\n\u003C\u003Clingo Hint>>\\n\\n{{$:/tags/ViewTemplateBodyFilter||$:/snippets/ListTaggedCascade}}\\n\"},\"$:/core/ui/ControlPanel/ViewTemplateTitle\":{\"title\":\"$:/core/ui/ControlPanel/ViewTemplateTitle\",\"tags\":\"$:/tags/ControlPanel/Cascades\",\"caption\":\"{{$:/language/ControlPanel/ViewTemplateTitle/Caption}}\",\"text\":\"\\\\define lingo-base() $:/language/ControlPanel/ViewTemplateTitle/\\n\\n\u003C\u003Clingo Hint>>\\n\\n{{$:/tags/ViewTemplateTitleFilter||$:/snippets/ListTaggedCascade}}\\n\"},\"$:/core/ui/ControlPanel/Cascades\":{\"title\":\"$:/core/ui/ControlPanel/Cascades\",\"tags\":\"$:/tags/ControlPanel/Advanced\",\"caption\":\"{{$:/language/ControlPanel/Cascades/Caption}}\",\"text\":\"\\\\whitespace trim\\n{{$:/language/ControlPanel/Cascades/Hint}}
2731\\n\\n\u003Cdiv class=\\\"tc-control-panel\\\">\\n\u003C$macrocall $name=\\\"tabs\\\" tabsList=\\\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Cascades]!has[draft.of]]\\\" default=\\\"$:/core/ui/ControlPanel/StoryTiddler\\\"/>\\n\u003C/div>\\n\"},\"$:/core/ui/ControlPanel/EditorTypes\":{\"title\":\"$:/core/ui/ControlPanel/EditorTypes\",\"tags\":\"$:/tags/ControlPanel/Advanced\",\"caption\":\"{{$:/language/ControlPanel/EditorTypes/Caption}}\",\"text\":\"\\\\define lingo-base() $:/language/ControlPanel/EditorTypes/\\n\\\\whitespace trim\\n\\n\u003C\u003Clingo Hint>>\\n\\n\u003Ctable>\\n\u003Ctbody>\\n\u003Ctr>\\n\u003Cth>\u003C\u003Clingo Type/Caption>>\u003C/th>\\n\u003Cth>\u003C\u003Clingo Editor/Caption>>\u003C/th>\\n\u003C/tr>\\n\u003C$list filter=\\\"[all[shadows+tiddlers]prefix[$:/config/EditorTypeMappings/]sort[title]]\\\">\\n\u003Ctr>\\n\u003Ctd>\\n\u003C$link>\\n\u003C$list filter=\\\"[all[current]removeprefix[$:/config/EditorTypeMappings/]]\\\">\\n\u003C$text text={{!!title}}/>\\n\u003C/$list>\\n\u003C/$link>\\n\u003C/td>\\n\u003Ctd>\\n\u003C$view field=\\\"text\\\"/>\\n\u003C/td>\\n\u003C/tr>\\n\u003C/$list>\\n\u003C/tbody>\\n\u003C/table>\\n\"},\"$:/core/ui/ControlPanel/Info\":{\"title\":\"$:/core/ui/ControlPanel/Info\",\"tags\":\"$:/tags/ControlPanel\",\"caption\":\"{{$:/language/ControlPanel/Info/Caption}}\",\"text\":\"\\\\whitespace trim\\n{{$:/language/ControlPanel/Info/Hint}}\\n\\n\u003Cdiv class=\\\"tc-control-panel\\\">\\n\u003C$macrocall $name=\\\"tabs\\\" tabsList=\\\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Info]!has[draft.of]]\\\" default=\\\"$:/core/ui/ControlPanel/Basics\\\" explicitState=\\\"$:/state/tab--2112689675\\\"/>\\n\u003C/div>\\n\"},\"$:/core/ui/ControlPanel/KeyboardShortcuts\":{\"title\":\"$:/core/ui/ControlPanel/KeyboardShortcuts\",\"tags\":\"$:/tags/ControlPanel\",\"caption\":\"{{$:/language/ControlPanel/KeyboardShortcuts/Caption}}\",\"text\":\"\\\\define lingo-base() $:/language/ControlPanel/KeyboardShortcuts/\\n\\n\\\\define new-shortcut(title)\\n\\\\whitespace trim\\n\u003Cdiv class=\\\"tc-dropdown-item-plain\\\">\\n\u003C$edit-shortcut tiddler=\\\"$title$\\\" placeholder={{$:/language/ControlPanel/KeyboardShortcuts/Add/Prompt}} focus=\\\"true\\\" style=\\\"width:auto;\\\"/>\\n&#32;\\n\u003C$button>\\n\u003C\u003Clingo Add/Caption>>\\n\u003C$action-listops\\n\\t$tiddler=\\\"$(shortcutTitle)$\\\"\\n\\t$field=\\\"text\\\"\\n\\t$subfilter=\\\"[{$title$}]\\\"\\n/>\\n\u003C$action-deletetiddler\\n\\t$tiddler=\\\"$title$\\\"\\n/>\\n\u003C/$button>\\n\u003C/div>\\n\\\\end\\n\\n\\\\define shortcut-list-item(caption)\\n\\\\whitespace trim\\n\u003Ctd>\\n\u003C/td>\\n\u003Ctd style=\\\"text-align:right;font-size:0.7em;\\\">\\n\u003C\u003Clingo Platform/$caption$>>\\n\u003C/td>\\n\u003Ctd>\\n\u003Cdiv style=\\\"position:relative;\\\">\\n\u003C$button popup=\u003C\u003Cqualify \\\"$:/state/dropdown/$(shortcutTitle)$\\\">> class=\\\"tc-btn-invisible\\\">\\n{{$:/core/images/edit-button}}\\n\u003C/$button>\\n&#32;\\n\u003C$macrocall $name=\\\"displayshortcuts\\\" $output=\\\"text/html\\\" shortcuts={{$(shortcutTitle)$}} prefix=\\\"\u003Ckbd>\\\" separator=\\\"\u003C/kbd> \u003Ckbd>\\\" suffix=\\\"\u003C/kbd>\\\"/>\\n\\n\u003C$reveal state=\u003C\u003Cqualify \\\"$:/state/dropdown/$(shortcutTitle)$\\\">> type=\\\"popup\\\" position=\\\"below\\\" animate=\\\"yes\\\">\\n\u003Cdiv class=\\\"tc-block-dropdown-wrapper\\\">\\n\u003Cdiv class=\\\"tc-block-dropdown tc-edit-type-dropdown tc-popup-keep\\\">\\n\u003C$list\\n\\tfilter=\\\"[list[$(shortcutTitle)$!!text]sort[title]]\\\"\\n\\tvariable=\\\"shortcut\\\"\\n\\temptyMessage=\\\"\u003Cdiv class='tc-dropdown-item-plain'>//\u003C\u003Clingo NoShortcuts/Caption>>//\u003C/div>\\\">\\n\u003Cdiv class=\\\"tc-dropdown-item-plain\\\">\\n\u003C$button class=\\\"tc-btn-invisible\\\" tooltip={{$:/language/ControlPanel/KeyboardShortcuts/Remove/Hint}}>\\n\u003C$action-listops\\n\\t$tiddler=\\\"$(shortcutTitle)$\\\"\\n\\t$field=\\\"text\\\"\\n\\t$subfilter=\\\"+[remove\u003Cshortcut>]\\\"\\n/>\\n\u003Csmall>{{$:/core/images/close-button}}\u003C/small>\\n\u003C/$button>\\n&#32;\\n\u003Ckbd>\\n\u003C$macrocall $name=\\\"displayshortcuts\\\" $output=\\\"text/html\\\" shortcuts=\u003C\u003Cshortcut>>/>\\n\u003C/kbd>\\n\u003C/div>\\n\u003C/$list>\\n\u003Chr/>\\n\u003C$macrocall $name=\\\"new-shortcut\\\" title=\u003C\u003Cqualify \\\"$:/state/new-shortcut/$(shortcutTitle)$\\\">>/>\\n\u003C/div>\\n\u003C/div>\\n\u003C/$reveal>\\n\u003C/div>\\n\u003C/td>
2731\\n\\\\end\\n\\n\\\\define shortcut-list(caption,prefix)\\n\\\\whitespace trim\\n\u003Ctr>\\n\u003C$list filter=\\\"[[$prefix$$(shortcutName)$]]\\\" variable=\\\"shortcutTitle\\\">\\n\u003C\u003Cshortcut-list-item \\\"$caption$\\\">>\\n\u003C/$list>\\n\u003C/tr>\\n\\\\end\\n\\n\\\\define shortcut-editor()\\n\\\\whitespace trim\\n\u003C\u003Cshortcut-list \\\"All\\\" \\\"$:/config/shortcuts/\\\">> \\n\u003C\u003Cshortcut-list \\\"Mac\\\" \\\"$:/config/shortcuts-mac/\\\">>\\n\u003C\u003Cshortcut-list \\\"NonMac\\\" \\\"$:/config/shortcuts-not-mac/\\\">>\\n\u003C\u003Cshortcut-list \\\"Linux\\\" \\\"$:/config/shortcuts-linux/\\\">>\\n\u003C\u003Cshortcut-list \\\"NonLinux\\\" \\\"$:/config/shortcuts-not-linux/\\\">>\\n\u003C\u003Cshortcut-list \\\"Windows\\\" \\\"$:/config/shortcuts-windows/\\\">>\\n\u003C\u003Cshortcut-list \\\"NonWindows\\\" \\\"$:/config/shortcuts-not-windows/\\\">>\\n\\\\end\\n\\n\\\\define shortcut-preview()\\n\u003C$macrocall $name=\\\"displayshortcuts\\\" $output=\\\"text/html\\\" shortcuts={{$(shortcutPrefix)$$(shortcutName)$}} prefix=\\\"\u003Ckbd>\\\" separator=\\\"\u003C/kbd> \u003Ckbd>\\\" suffix=\\\"\u003C/kbd>\\\"/>\\n\\\\end\\n\\n\\\\define shortcut-item-inner()\\n\\\\whitespace trim\\n\u003Ctr>\\n\u003Ctd>\\n\u003C$reveal type=\\\"nomatch\\\" state=\u003C\u003CdropdownStateTitle>> text=\\\"open\\\">\\n\u003C$button class=\\\"tc-btn-invisible\\\">\\n\u003C$action-setfield\\n\\t$tiddler=\u003C\u003CdropdownStateTitle>>\\n\\t$value=\\\"open\\\"\\n/>\\n{{$:/core/images/right-arrow}}\\n\u003C/$button>\\n\u003C/$reveal>\\n\u003C$reveal type=\\\"match\\\" state=\u003C\u003CdropdownStateTitle>> text=\\\"open\\\">\\n\u003C$button class=\\\"tc-btn-invisible\\\">\\n\u003C$action-setfield\\n\\t$tiddler=\u003C\u003CdropdownStateTitle>>\\n\\t$value=\\\"close\\\"\\n/>\\n{{$:/core/images/down-arrow}}\\n\u003C/$button>\\n\u003C/$reveal>\\n&#32;\\n''\u003C$text text=\u003C\u003CshortcutName>>/>''\\n\u003C/td>\\n\u003Ctd>\\n\u003C$transclude tiddler=\\\"$:/config/ShortcutInfo/$(shortcutName)$\\\"/>\\n\u003C/td>\\n\u003Ctd>\\n\u003C$list filter=\\\"$:/config/shortcuts/ $:/config/shortcuts-mac/ $:/config/shortcuts-not-mac/ $:/config/shortcuts-linux/ $:/config/shortcuts-not-linux/ $:/config/shortcuts-windows/ $:/config/shortcuts-not-windows/\\\" variable=\\\"shortcutPrefix\\\">\\n\u003C\u003Cshortcut-preview>>\\n\u003C/$list>\\n\u003C/td>\\n\u003C/tr>\\n\u003C$set name=\\\"dropdownState\\\" value={{$(dropdownStateTitle)$}}>\\n\u003C$list filter=\\\"[\u003CdropdownState>match[open]]\\\" variable=\\\"listItem\\\">\\n\u003C\u003Cshortcut-editor>>\\n\u003C/$list>\\n\u003C/$set>\\n\\\\end\\n\\n\\\\define shortcut-item()\\n\\\\whitespace trim\\n\u003C$set name=\\\"dropdownStateTitle\\\" value=\u003C\u003Cqualify \\\"$:/state/dropdown/keyboardshortcut/$(shortcutName)$\\\">>>\\n\u003C\u003Cshortcut-item-inner>>\\n\u003C/$set>\\n\\\\end\\n\\\\whitespace trim\\n\\n\u003Ctable>\\n\u003Ctbody>\\n\u003C$list filter=\\\"[all[shadows+tiddlers]removeprefix[$:/config/ShortcutInfo/]]\\\" variable=\\\"shortcutName\\\">\\n\u003C\u003Cshortcut-item>>\\n\u003C/$list>\\n\u003C/tbody>\\n\u003C/table>\\n\"},\"$:/core/ui/ControlPanel/LoadedModules\":{\"title\":\"$:/core/ui/ControlPanel/LoadedModules\",\"tags\":\"$:/tags/ControlPanel/Advanced\",\"caption\":\"{{$:/language/ControlPanel/LoadedModules/Caption}}\",\"text\":\"\\\\define lingo-base() $:/language/ControlPanel/\\n\u003C\u003Clingo LoadedModules/Hint>>\\n\\n{{$:/snippets/modules}}\\n\"},\"$:/core/ui/ControlPanel/Modals/AddPlugins\":{\"title\":\"$:/core/ui/ControlPanel/Modals/AddPlugins\",\"subtitle\":\"{{$:/core/images/download-button}} {{$:/language/ControlPanel/Plugins/Add/Caption}}\",\"text\":\"\\\\define install-plugin-actions()\\n\\\\whitespace trim\\n\u003C$action-sendmessage $message=\\\"tm-load-plugin-from-library\\\" url={{!!url}} title={{$(assetInfo)$!!original-title}}/>\\n\u003C$set name=\\\"url\\\" value={{!!url}}>\\n\u003C$set name=\\\"currentTiddler\\\" value=\u003C\u003CassetInfo>>>\\n\u003C$list filter=\\\"[enlist{!!dependents}] [{!!parent-plugin}] +[sort[name]]\\\" variable=\\\"dependency\\\">\\n\u003C$action-sendmessage $message=\\\"tm-load-plugin-from-library\\\" url=\u003C\u003Curl>> title=\u003C\u003Cdependency>>/>\\n\u003C/$list>\\n\u003C/$set>\\n\u003C/$set>
2731\\n\\\\end\\n\\n\\\\define install-plugin-button()\\n\\\\whitespace trim\\n\u003Cdiv>\\n\u003C$set name=\\\"libraryVersion\\\" value={{{ [\u003CassetInfo>get[version]] }}}>\\n\u003C$set name=\\\"installedVersion\\\" value={{{ [\u003CassetInfo>get[original-title]get[version]] }}}>\\n\u003C$set name=\\\"reinstall-type\\\" value={{{ [\u003ClibraryVersion>compare:version:eq\u003CinstalledVersion>then[tc-reinstall]] [\u003ClibraryVersion>compare:version:gt\u003CinstalledVersion>then[tc-reinstall-upgrade]] [\u003ClibraryVersion>compare:version:lt\u003CinstalledVersion>then[tc-reinstall-downgrade]] }}}>\\n\u003C$button actions=\u003C\u003Cinstall-plugin-actions>> class={{{ [\u003CassetInfo>get[original-title]has[version]then\u003Creinstall-type>] tc-btn-invisible tc-install-plugin +[join[ ]] }}}>\\n{{$:/core/images/download-button}}\\n&#32;\\n\u003C$list filter=\\\"[\u003CassetInfo>get[original-title]get[version]]\\\" variable=\\\"ignore\\\" emptyMessage=\\\"{{$:/language/ControlPanel/Plugins/Install/Caption}}\\\">\\n\u003C$list filter=\\\"[\u003ClibraryVersion>compare:version:gt\u003CinstalledVersion>]\\\" variable=\\\"ignore\\\" emptyMessage=\\\"\\n\\\\whitespace trim\\n\u003C$list filter='[\u003ClibraryVersion>compare:version:lt\u003CinstalledVersion>]' variable='ignore' emptyMessage='{{$:/language/ControlPanel/Plugins/Reinstall/Caption}}'>\\n{{$:/language/ControlPanel/Plugins/Downgrade/Caption}}\\n\u003C/$list>\\n\\\">\\n{{$:/language/ControlPanel/Plugins/Update/Caption}}\\n\u003C/$list>\\n\u003C/$list>\\n\u003C/$button>\\n\u003Cdiv>\\n\u003C/div>\\n\u003C$reveal stateTitle=\u003C\u003CassetInfo>> stateField=\\\"requires-reload\\\" type=\\\"match\\\" text=\\\"yes\\\">{{$:/language/ControlPanel/Plugins/PluginWillRequireReload}}\u003C/$reveal>\\n\u003C/$set>\\n\u003C/$set>\\n\u003C/$set>\\n\u003C/div>\\n\\\\end\\n\\n\\\\define popup-state-macro()\\n$:/state/add-plugin-info/$(connectionTiddler)$/$(assetInfo)$\\n\\\\end\\n\\n\\\\define display-plugin-info(type)\\n\\\\whitespace trim\\n\u003C$set name=\\\"popup-state\\\" value=\u003C\u003Cpopup-state-macro>>>\\n\u003Cdiv class=\\\"tc-plugin-info\\\">\\n\u003Cdiv class=\\\"tc-plugin-info-chunk tc-plugin-info-toggle\\\">\\n\u003C$reveal type=\\\"nomatch\\\" state=\u003C\u003Cpopup-state>> text=\\\"yes\\\">\\n\u003C$button class=\\\"tc-btn-invisible tc-btn-dropdown\\\" set=\u003C\u003Cpopup-state>> setTo=\\\"yes\\\">\\n{{$:/core/images/chevron-right}}\\n\u003C/$button>\\n\u003C/$reveal>\\n\u003C$reveal type=\\\"match\\\" state=\u003C\u003Cpopup-state>> text=\\\"yes\\\">\\n\u003C$button class=\\\"tc-btn-invisible tc-btn-dropdown\\\" set=\u003C\u003Cpopup-state>> setTo=\\\"no\\\">\\n{{$:/core/images/chevron-down}}\\n\u003C/$button>\\n\u003C/$reveal>\\n\u003C/div>\\n\u003Cdiv class=\\\"tc-plugin-info-chunk tc-plugin-info-icon\\\">\\n\u003C$list filter=\\\"[\u003CassetInfo>has[icon]]\\\" emptyMessage=\\\"\\\"\\\"\u003C$transclude tiddler=\\\"$:/core/images/plugin-generic-$type$\\\"/>\\\"\\\"\\\">\\n\u003Cimg src={{$(assetInfo)$!!icon}}/>\\n\u003C/$list>\\n\u003C/div>\\n\u003Cdiv class=\\\"tc-plugin-info-chunk tc-plugin-info-description\\\">\\n\u003Ch1>\u003Cstrong>\u003C$text text={{{ [\u003CassetInfo>get[name]] ~[\u003CassetInfo>get[original-title]split[/]last[1]] }}}/>\u003C/strong>:\\n&#32;\\n\u003C$view tiddler=\u003C\u003CassetInfo>> field=\\\"description\\\"/>\u003C/h1>\\n\u003Ch2>\u003C$view tiddler=\u003C\u003CassetInfo>> field=\\\"original-title\\\"/>\u003C/h2>\\n\u003Cdiv>\u003Cem>\u003C$view tiddler=\u003C\u003CassetInfo>> field=\\\"version\\\"/>\u003C/em>\u003C/div>\\n\u003C$list filter=\\\"[\u003CassetInfo>get[original-title]get[version]]\\\" variable=\\\"installedVersion\\\">\u003Cdiv>\u003Cem>{{$:/language/ControlPanel/Plugins/AlreadyInstalled/Hint}}\u003C/em>\u003C/div>\u003C/$list>\\n\u003C/div>\\n\u003Cdiv class=\\\"tc-plugin-info-chunk tc-plugin-info-buttons\\\">\\n\u003C\u003Cinstall-plugin-button>>\\n\u003C/div>\\n\u003C/div>\\n\u003C$set name=\\\"original-title\\\" value={{{ [\u003CassetInfo>get[original-title]] }}}>\\n\u003C$reveal type=\\\"match\\\" text=\\\"yes\\\" state=\u003C\u003Cpopup-state>>>\\n\u003Cdiv class=\\\"tc-plugin-info-dropdown\\\">\\n\u003C$list filter=\\\"[enlist{!!dependents}] [\u003CcurrentTiddler>get[parent-plugin]] +[limit[1]] ~[\u003CassetInfo>get[original-title]!is[tiddler]]\\\" variable=\\\"ignore\\\">\\n\u003Cdiv class=\\\"tc-plugin-info-dropdown-message\\\">\\n\u003C$list filter=\\\"[\u003CassetInfo>get[original-title]!is[tiddler]]\\\">\\n{{$:/language/ControlPanel/Plugins/NotInstalled/Hint}}\\n\u003C/$list>\\n\u003C$set name=\\\"currentTiddler\\\" value=\u003C\u003CassetInfo>>>\\n\u003C$list filter=\\\"[enlist{!!dependents}] [\u003CcurrentTiddler>get[parent-plugin]] +[limit[1]]\\\" variable=\\\"ignore\\\">\\n\u003Cdiv>\\n{{$:/language/ControlPanel/Plugins/AlsoRequires}}&#32;\\n\u003C$list filter=\\\"[enlist{!!dependents}] [{!!parent-plugin}] +[sort[name]]\\\" variable=\\\"dependency\\\">\\n\u003C$text text=\u003C\u003Cdependency>>/>&#32;\\n\u003C/$list>\\n\u003C/div>\\n\u003C/$list>\\n\u003C/$set>\\n\u003C/div>\\n\u003C/$list>\\n\u003Cdiv class=\\\"tc-plugin-info-dropdown-body\\\">\\n\u003C$transclude tiddler=\u003C\u003CassetInfo>> field=\\\"readme\\\" mode=\\\"block\\\"/>\\n\u003C/div>\\n\u003C$list filter=\\\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin\u003Coriginal-title>limit[1]]\\\" variable=\\\"ignore\\\">\\n\u003Cdiv class=\\\"tc-plugin-info-sub-plugins\\\">\\n\u003C$list filter=\\\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin\u003Coriginal-title>sort[name]]\\\" variable=\\\"assetInfo\\\">\\n\u003C\u003Cdisplay-plugin-info \\\"$type$\\\">>\\n\u003C/$list>\\n\u003C/div>\\n\u003C/$list>\\n\u003C/div>\\n\u003C/$reveal>\\n\u003C$list filter=\\\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin\u003Coriginal-title>limit[1]]\\\" variable=\\\"ignore\\\">\\n\u003C$reveal type=\\\"nomatch\\\" text=\\\"yes\\\" state=\u003C\u003Cpopup-state>> tag=\\\"div\\\" class=\\\"tc-plugin-info-sub-plugin-indicator\\\">\\n\u003C$wikify name=\\\"count\\\" text=\\\"\\\"\\\"\u003C$count filter=\\\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin\u003Coriginal-title>]\\\"/>\\\"\\\"\\\">\\n\u003C$button class=\\\"tc-btn-invisible\\\" set=\u003C\u003Cpopup-state>> setTo=\\\"yes\\\">\\n{{$:/language/ControlPanel/Plugins/SubPluginPrompt}}\\n\u003C/$button>\\n\u003C/$wikify>\\n\u003C/$reveal>\\n\u003C/$list>\\n\u003C/$set>\\n\u003C/$set>
2731\\n\\\\end\\n\\n\\\\define load-plugin-library-button()\\n\\\\whitespace trim\\n\u003C$list filter=\\\"[\u003CcurrentTiddler>get[enabled]else[yes]match[yes]]\\\" variable=\\\"ignore\\\">\\n\u003C$button class=\\\"tc-btn-big-green\\\">\\n\u003C$action-sendmessage $message=\\\"tm-load-plugin-library\\\" url={{!!url}} infoTitlePrefix=\\\"$:/temp/RemoteAssetInfo/\\\"/>\\n{{$:/core/images/chevron-right}}&#32;{{$:/language/ControlPanel/Plugins/OpenPluginLibrary}}\\n\u003C/$button>\\n\u003C/$list>\\n\\\\end\\n\\n\\\\define display-server-assets(type)\\n\\\\whitespace trim\\n{{$:/language/Search/Search}}:\\n&#32;\\n\u003C$edit-text tiddler=\\\"\\\"\\\"$:/temp/RemoteAssetSearch/$(currentTiddler)$\\\"\\\"\\\" default=\\\"\\\" type=\\\"search\\\" tag=\\\"input\\\"/>\\n&#32;\\n\u003C$reveal state=\\\"\\\"\\\"$:/temp/RemoteAssetSearch/$(currentTiddler)$\\\"\\\"\\\" type=\\\"nomatch\\\" text=\\\"\\\">\\n\u003C$button class=\\\"tc-btn-invisible\\\">\\n\u003C$action-setfield $tiddler=\\\"\\\"\\\"$:/temp/RemoteAssetSearch/$(currentTiddler)$\\\"\\\"\\\" $field=\\\"text\\\" $value=\\\"\\\"/>\\n{{$:/core/images/close-button}}\\n\u003C/$button>\\n\u003C/$reveal>\\n\u003Cdiv class=\\\"tc-plugin-library-listing\\\">\\n\u003C$list filter=\\\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]search:author,description,original-title,readme,title{$:/temp/RemoteAssetSearch/$(currentTiddler)$}sort[name]]\\\" variable=\\\"assetInfo\\\">\\n\u003C$list filter=\\\"[[$:/temp/RemoteAssetSearch/$(currentTiddler)$]has[text]] ~[\u003CassetInfo>!has[parent-plugin]]\\\" variable=\\\"ignore\\\">\u003C!-- Hide sub-plugins if we're not searching -->\\n\u003C\u003Cdisplay-plugin-info \\\"$type$\\\">>\\n\u003C/$list>\\n\u003C/$list>\\n\u003C/div>\\n\\\\end\\n\\n\\\\define display-server-connection()\\n\\\\whitespace trim\\n\u003C$list filter=\\\"[all[tiddlers+shadows]tag[$:/tags/ServerConnection]suffix{!!url}]\\\" variable=\\\"connectionTiddler\\\" emptyMessage=\u003C\u003Cload-plugin-library-button>>>\\n\\n\u003C$set name=\\\"transclusion\\\" value=\u003C\u003CconnectionTiddler>>>\\n\\n\u003C\u003Ctabs \\\"[[$:/core/ui/ControlPanel/Plugins/Add/Updates]] [[$:/core/ui/ControlPanel/Plugins/Add/Plugins]] [[$:/core/ui/ControlPanel/Plugins/Add/Themes]] [[$:/core/ui/ControlPanel/Plugins/Add/Languages]]\\\" \\\"$:/core/ui/ControlPanel/Plugins/Add/Plugins\\\">>\\n\\n\u003C/$set>\\n\\n\u003C/$list>\\n\\\\end\\n\\n\\\\define close-library-button()\\n\\\\whitespace trim\\n\u003C$reveal type='nomatch' state='$:/temp/ServerConnection/$(PluginLibraryURL)$' text=''>\\n\u003C$button class='tc-btn-big-green'>\\n\u003C$action-sendmessage $message=\\\"tm-unload-plugin-library\\\" url={{!!url}}/>\\n{{$:/core/images/chevron-left}}&#32;{{$:/language/ControlPanel/Plugins/ClosePluginLibrary}}\\n\u003C$action-deletetiddler $filter=\\\"[prefix[$:/temp/ServerConnection/$(PluginLibraryURL)$]][prefix[$:/temp/RemoteAssetInfo/$(PluginLibraryURL)$]]\\\"/>\\n\u003C/$button>\\n\u003C/$reveal>\\n\\\\end\\n\\n\\\\define plugin-library-listing()\\n\\\\whitespace trim\\n\u003Cdiv class=\\\"tc-tab-set\\\">\\n\u003C$set name=\\\"defaultTab\\\" value={{{ [all[tiddlers+shadows]tag[$:/tags/PluginLibrary]] }}}>\\n\u003Cdiv class=\\\"tc-tab-buttons\\\">\\n\u003C$list filter=\\\"[all[tiddlers+shadows]tag[$:/tags/PluginLibrary]]\\\">\\n\u003C$button set=\u003C\u003Cqualify \\\"$:/state/addplugins/tab\\\">> setTo=\u003C\u003CcurrentTiddler>> default=\u003C\u003CdefaultTab>> selectedClass=\\\"tc-tab-selected\\\">\\n\u003C$set name=\\\"tv-wikilinks\\\" value=\\\"no\\\">\\n\u003C$transclude field=\\\"caption\\\"/>\\n\u003C/$set>\\n\u003C/$button>\\n\u003C/$list>\\n\u003C/div>\\n\u003Cdiv class=\\\"tc-tab-divider\\\"/>\\n\u003Cdiv class=\\\"tc-tab-content\\\">\\n\u003C$list filter=\\\"[all[tiddlers+shadows]tag[$:/tags/PluginLibrary]]\\\">\\n\u003C$reveal type=\\\"match\\\" state=\u003C\u003Cqualify \\\"$:/state/addplugins/tab\\\">> text=\u003C\u003CcurrentTiddler>> default=\u003C\u003CdefaultTab>>>\\n\u003Ch2>\u003C$link>\u003C$transclude field=\\\"caption\\\">\u003C$view field=\\\"title\\\"/>\u003C/$transclude>\u003C/$link>\u003C/h2>\\n//\u003C$view field=\\\"url\\\"/>//\\n\u003C$transclude mode=\\\"block\\\"/>\\n\u003C$set name=PluginLibraryURL value={{!!url}}>\\n\u003C\u003Cclose-library-button>
2731>\\n\u003C/$set>\\n&#32;\\n\u003C\u003Cdisplay-server-connection>>\\n\u003C/$reveal>\\n\u003C/$list>\\n\u003C/div>\\n\u003C/$set>\\n\u003C/div>\\n\\\\end\\n\\n\\\\import [subfilter{$:/core/config/GlobalImportFilter}]\\n\\\\whitespace trim\\n\\n\u003Cdiv>\\n\u003C\u003Cplugin-library-listing>>\\n\u003C/div>\\n\"},\"$:/core/ui/ControlPanel/Palette\":{\"title\":\"$:/core/ui/ControlPanel/Palette\",\"tags\":\"$:/tags/ControlPanel/Appearance\",\"caption\":\"{{$:/language/ControlPanel/Palette/Caption}}\",\"text\":\"\\\\define lingo-base() $:/language/ControlPanel/Palette/\\n\\n{{$:/snippets/paletteswitcher}}\\n\\n\u003C$reveal type=\\\"nomatch\\\" state=\\\"$:/state/ShowPaletteEditor\\\" text=\\\"yes\\\">\\n\\n\u003C$button set=\\\"$:/state/ShowPaletteEditor\\\" setTo=\\\"yes\\\">\u003C\u003Clingo ShowEditor/Caption>>\u003C/$button>\\n\\n\u003C/$reveal>\\n\\n\u003C$reveal type=\\\"match\\\" state=\\\"$:/state/ShowPaletteEditor\\\" text=\\\"yes\\\">\\n\\n\u003C$button set=\\\"$:/state/ShowPaletteEditor\\\" setTo=\\\"no\\\">\u003C\u003Clingo HideEditor/Caption>>\u003C/$button>\\n{{$:/PaletteManager}}\\n\\n\u003C/$reveal>\\n\\n\"},\"$:/core/ui/ControlPanel/Parsing\":{\"title\":\"$:/core/ui/ControlPanel/Parsing\",\"tags\":\"$:/tags/ControlPanel/Advanced\",\"caption\":\"{{$:/language/ControlPanel/Parsing/Caption}}\",\"text\":\"\\\\define lingo-base() $:/language/ControlPanel/Parsing/\\n\\n\\\\define toggle(Type)\\n\\\\whitespace trim\\n\u003C$checkbox\\ntiddler=\\\"\\\"\\\"$:/config/WikiParserRules/$Type$/$(rule)$\\\"\\\"\\\"\\nfield=\\\"text\\\"\\nchecked=\\\"enable\\\"\\nunchecked=\\\"disable\\\"\\ndefault=\\\"enable\\\">\\n\u003Cspan class=\\\"tc-small-gap-left\\\">\u003C\u003Crule>>\u003C/span>\\n\u003C/$checkbox>\\n\\\\end\\n\\n\\\\define rules(type,Type)\\n\\\\whitespace trim\\n\u003C$list filter=\\\"[wikiparserrules[$type$]]\\\" variable=\\\"rule\\\">\\n\u003Cdd>\u003C\u003Ctoggle $Type$>>\u003C/dd>\\n\u003C/$list>\\n\\\\end\\n\\\\whitespace trim\\n\\n\u003C\u003Clingo Hint>>\\n\\n\u003Cdl>\\n\u003Cdt>\u003C\u003Clingo Pragma/Caption>>\u003C/dt>\\n\u003C\u003Crules pragma Pragma>>\\n\u003Cdt>\u003C\u003Clingo Inline/Caption>>\u003C/dt>\\n\u003C\u003Crules inline Inline>>\\n\u003Cdt>\u003C\u003Clingo Block/Caption>>\u003C/dt>\\n\u003C\u003Crules block Block>>\\n\u003C/dl>\"},\"$:/core/ui/ControlPanel/Plugins/Add/Languages\":{\"title\":\"$:/core/ui/ControlPanel/Plugins/Add/Languages\",\"caption\":\"{{$:/language/ControlPanel/Plugins/Languages/Caption}} (\u003C$count filter=\\\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[language]]\\\"/>)\",\"text\":\"\u003C\u003Cdisplay-server-assets language>>\\n\"},\"$:/core/ui/ControlPanel/Plugins/Add/Plugins\":{\"title\":\"$:/core/ui/ControlPanel/Plugins/Add/Plugins\",\"caption\":\"{{$:/language/ControlPanel/Plugins/Plugins/Caption}}  (\u003C$count filter=\\\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[plugin]]\\\"/>)\",\"text\":\"\u003C\u003Cdisplay-server-assets plugin>>\\n\"},\"$:/core/ui/ControlPanel/Plugins/Add/Themes\":{\"title\":\"$:/core/ui/ControlPanel/Plugins/Add/Themes\",\"caption\":\"{{$:/language/ControlPanel/Plugins/Themes/Caption}}  (\u003C$count filter=\\\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[theme]]\\\"/>)\",\"text\":\"\u003C\u003Cdisplay-server-assets theme>>\\n\"},\"$:/core/ui/ControlPanel/Plugins/Add/Updates\":{\"title\":\"$:/core/ui/ControlPanel/Plugins/Add/Updates\",\"caption\":\"\u003C$importvariables filter=\\\"$:/core/ui/ControlPanel/Plugins/Add/Updates\\\">{{$:/language/ControlPanel/Plugins/Updates/Caption}} (\u003C\u003Cupdate-count>>)\u003C/$importvariables>\",\"text\":\"\\\\define each-updateable-plugin(body)\\n\\\\whitespace trim\\n\u003C$list filter=\\\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}sort[title]]\\\" variable=\\\"assetInfo\\\">\\n\u003C$set name=\\\"libraryVersion\\\" value={{{ [\u003CassetInfo>get[version]] }}}>\\n\u003C$list filter=\\\"[\u003CassetInfo>get[original-title]has[version]!version\u003ClibraryVersion>]\\\" variable=\\\"ignore\\\">\\n\u003C$set name=\\\"installedVersion\\\" value={{{ [\u003CassetInfo>get[original-title]get[version]] }}}>\\n\u003C$list filter=\\\"[\u003Cinstalledversion>!match\u003ClibraryVersion>]\\\" variable=\\\"ignore\\\">\\n$body$\\n\u003C/$list>\\n\u003C/$set>\\n\u003C/$list>\\n\u003C/$set>\\n\u003C/$list>
2731\\n\\\\end\\n\\n\\\\define update-all-actions()\\n\u003C$macrocall $name=\\\"each-updateable-plugin\\\" body=\\\"\\\"\\\"\\n\u003C\u003Cinstall-plugin-actions>>\\n\\\"\\\"\\\"/>\\n\\\\end\\n\\n\\\\define update-count()\\n\u003C$wikify name=\\\"count-filter\\\" text=\u003C\u003Ceach-updateable-plugin \\\"&#91;&#91;\u003C$text text=\u003C\u003CassetInfo>>/>]]\\\">>>\u003C$count filter=\u003C\u003Ccount-filter>>/>\u003C/$wikify>\\n\\\\end\\n\\n\\\\whitespace trim\\n\u003C$button actions=\u003C\u003Cupdate-all-actions>> class=\\\"tc-btn-invisible tc-install-plugin tc-reinstall-upgrade\\\">\\n{{$:/core/images/download-button}}\\n&#32;\\n{{||$:/language/ControlPanel/Plugins/Updates/UpdateAll/Caption}}\\n\u003C/$button>\\n\\n\u003Cdiv class=\\\"tc-plugin-library-listing\\\">\\n\u003C$macrocall $name=\\\"each-updateable-plugin\\\" body=\\\"\\\"\\\"\\n\u003C$macrocall $name=\\\"display-plugin-info\\\" type={{{ [\u003CassetInfo>get[original-plugin-type]] }}}/>\\n\\\"\\\"\\\"/>\\n\u003C/div>\\n\"},\"$:/core/ui/ControlPanel/Plugins/AddPlugins\":{\"title\":\"$:/core/ui/ControlPanel/Plugins/AddPlugins\",\"text\":\"\\\\define lingo-base() $:/language/ControlPanel/Plugins/\\n\\\\whitespace trim\\n\\n\u003C$button message=\\\"tm-modal\\\" param=\\\"$:/core/ui/ControlPanel/Modals/AddPlugins\\\" tooltip={{$:/language/ControlPanel/Plugins/Add/Hint}} class=\\\"tc-btn-big-green tc-primary-btn\\\">\\n{{$:/core/images/download-button}}\\n&#32;\\n\u003C\u003Clingo Add/Caption>>\\n\u003C/$button>\\n\"},\"$:/core/ui/ControlPanel/Plugins/Installed/Languages\":{\"title\":\"$:/core/ui/ControlPanel/Plugins/Installed/Languages\",\"tags\":\"$:/tags/ControlPanel/Plugins\",\"caption\":\"{{$:/language/ControlPanel/Plugins/Languages/Caption}} (\u003C$count filter=\\\"[!has[draft.of]plugin-type[language]]\\\"/>)\",\"text\":\"\u003C\u003Cplugin-table language>>\\n\"},\"$:/core/ui/ControlPanel/Plugins/Installed/Plugins\":{\"title\":\"$:/core/ui/ControlPanel/Plugins/Installed/Plugins\",\"tags\":\"$:/tags/ControlPanel/Plugins\",\"caption\":\"{{$:/language/ControlPanel/Plugins/Plugins/Caption}} (\u003C$count filter=\\\"[!has[draft.of]plugin-type[plugin]]\\\"/>)\",\"text\":\"\u003C\u003Cplugin-table plugin>>\\n\"},\"$:/core/ui/ControlPanel/Plugins/Installed/Themes\":{\"title\":\"$:/core/ui/ControlPanel/Plugins/Installed/Themes\",\"tags\":\"$:/tags/ControlPanel/Plugins\",\"caption\":\"{{$:/language/ControlPanel/Plugins/Themes/Caption}} (\u003C$count filter=\\\"[!has[draft.of]plugin-type[theme]]\\\"/>)\",\"text\":\"\u003C\u003Cplugin-table theme>>\\n\"},\"$:/core/ui/ControlPanel/Plugins\":{\"title\":\"$:/core/ui/ControlPanel/Plugins\",\"tags\":\"$:/tags/ControlPanel\",\"caption\":\"{{$:/language/ControlPanel/Plugins/Caption}}\",\"text\":\"\\\\define lingo-base() $:/language/ControlPanel/Plugins/\\n\\n\\\\define plugin-table(type)\\n\\\\whitespace trim\\n\u003C$set name=\\\"plugin-type\\\" value=\\\"\\\"\\\"$type$\\\"\\\"\\\">\\n\u003C$set name=\\\"qualified-state\\\" value=\u003C\u003Cqualify \\\"$:/state/plugin-info\\\">>>\\n\u003C$list filter=\\\"[!has[draft.of]plugin-type[$type$]sort[name]]\\\" emptyMessage=\u003C\u003Clingo \\\"Empty/Hint\\\">> template=\\\"$:/core/ui/Components/plugin-info\\\"/>\\n\u003C/$set>\\n\u003C/$set>\\n\\\\end\\n\\n{{$:/core/ui/ControlPanel/Plugins/AddPlugins}}\\n\\n\u003C\u003Clingo Installed/Hint>>\\n\\n\u003C$macrocall $name=\\\"tabs\\\" tabsList=\\\"[all[tiddlers+shadows]tag[$:/tags/ControlPanel/Plugins]!has[draft.of]]\\\" default=\\\"$:/core/ui/ControlPanel/Plugins/Installed/Plugins\\\" explicitState=\\\"$:/state/tab--86143343\\\"/>\\n\"},\"$:/core/ui/ControlPanel/Saving/DownloadSaver\":{\"title\":\"$:/core/ui/ControlPanel/Saving/DownloadSaver\",\"tags\":\"$:/tags/ControlPanel/Saving\",\"caption\":\"{{$:/language/ControlPanel/Saving/DownloadSaver/Caption}}\",\"text\":\"\\\\define lingo-base() $:/language/ControlPanel/Saving/DownloadSaver/\\n\\n\u003C\u003Clingo Hint>>\\n\\n!! \u003C$link to=\\\"$:/config/DownloadSaver/AutoSave\\\">\u003C\u003Clingo AutoSave/Hint>>\u003C/$link>\\n\\n\u003C$checkbox tiddler=\\\"$:/config/DownloadSaver/AutoSave\\\" field=\\\"text\\\" checked=\\\"yes\\\" unchecked=\\\"no\\\" default=\\\"no\\\"> \u003C\u003Clingo AutoSave/Description>> \u003C/$checkbox>\\n\"},\"$:/core/ui/ControlPanel/Saving/General\":{\"title\":\"$:/core/ui/ControlPanel/Saving/General\",\"tags\":\"$:/tags/ControlPanel/Saving\",\"caption\":\"{{$:/language/ControlPanel/Saving/General/Caption}}\",\"list-before\":\"\",\"text\":\"\\\\define lingo-base() $:/language/ControlPanel/Settings/\\n\\
2731n{{$:/language/ControlPanel/Saving/General/Hint}}\\n\\n!! \u003C$link to=\\\"$:/config/AutoSave\\\">\u003C\u003Clingo AutoSave/Caption>>\u003C/$link>\\n\\n\u003C\u003Clingo AutoSave/Hint>>\\n\\n\u003C$radio tiddler=\\\"$:/config/AutoSave\\\" value=\\\"yes\\\"> \u003C\u003Clingo AutoSave/Enabled/Description>> \u003C/$radio>\\n\\n\u003C$radio tiddler=\\\"$:/config/AutoSave\\\" value=\\\"no\\\"> \u003C\u003Clingo AutoSave/Disabled/Description>> \u003C/$radio>\\n\"},\"$:/core/ui/ControlPanel/Saving/GitHub\":{\"title\":\"$:/core/ui/ControlPanel/Saving/GitHub\",\"tags\":\"$:/tags/ControlPanel/Saving\",\"caption\":\"{{$:/language/ControlPanel/Saving/GitService/GitHub/Caption}}\",\"text\":\"\\\\define lingo-base() $:/language/ControlPanel/Saving/GitService/\\n\\\\define service-name() ~GitHub\\n\\n\u003C\u003Clingo Description>>\\n\\n|\u003C\u003Clingo UserName>> |\u003C$edit-text tiddler=\\\"$:/GitHub/Username\\\" default=\\\"\\\" tag=\\\"input\\\"/> |\\n|\u003C\u003Clingo GitHub/Password>> |\u003C$password name=\\\"github\\\"/> |\\n|\u003C\u003Clingo Repo>> |\u003C$edit-text tiddler=\\\"$:/GitHub/Repo\\\" default=\\\"\\\" tag=\\\"input\\\"/> |\\n|\u003C\u003Clingo Branch>> |\u003C$edit-text tiddler=\\\"$:/GitHub/Branch\\\" default=\\\"main\\\" tag=\\\"input\\\"/> |\\n|\u003C\u003Clingo Path>> |\u003C$edit-text tiddler=\\\"$:/GitHub/Path\\\" default=\\\"\\\" tag=\\\"input\\\"/> |\\n|\u003C\u003Clingo Filename>> |\u003C$edit-text tiddler=\\\"$:/GitHub/Filename\\\" default=\\\"\\\" tag=\\\"input\\\"/> |\\n|\u003C\u003Clingo ServerURL>> |\u003C$edit-text tiddler=\\\"$:/GitHub/ServerURL\\\" default=\\\"https://api.github.com\\\" tag=\\\"input\\\"/> |\"},\"$:/core/ui/ControlPanel/Saving/GitLab\":{\"title\":\"$:/core/ui/ControlPanel/Saving/GitLab\",\"tags\":\"$:/tags/ControlPanel/Saving\",\"caption\":\"{{$:/language/ControlPanel/Saving/GitService/GitLab/Caption}}\",\"text\":\"\\\\define lingo-base() $:/language/ControlPanel/Saving/GitService/\\n\\\\define service-name() ~GitLab\\n\\n\u003C\u003Clingo Description>>\\n\\n|\u003C\u003Clingo UserName>> |\u003C$edit-text tiddler=\\\"$:/GitLab/Username\\\" default=\\\"\\\" tag=\\\"input\\\"/> |\\n|\u003C\u003Clingo GitLab/Password>> |\u003C$password name=\\\"gitlab\\\"/> |\\n|\u003C\u003Clingo Repo>> |\u003C$edit-text tiddler=\\\"$:/GitLab/Repo\\\" default=\\\"\\\" tag=\\\"input\\\"/> |\\n|\u003C\u003Clingo Branch>> |\u003C$edit-text tiddler=\\\"$:/GitLab/Branch\\\" default=\\\"master\\\" tag=\\\"input\\\"/> |\\n|\u003C\u003Clingo Path>> |\u003C$edit-text tiddler=\\\"$:/GitLab/Path\\\" default=\\\"\\\" tag=\\\"input\\\"/> |\\n|\u003C\u003Clingo Filename>> |\u003C$edit-text tiddler=\\\"$:/GitLab/Filename\\\" default=\\\"\\\" tag=\\\"input\\\"/> |\\n|\u003C\u003Clingo ServerURL>> |\u003C$edit-text tiddler=\\\"$:/GitLab/ServerURL\\\" default=\\\"https://gitlab.com/api/v4\\\" tag=\\\"input\\\"/> |\"},\"$:/core/ui/ControlPanel/Saving/TiddlySpot\":{\"title\":\"$:/core/ui/ControlPanel/Saving/TiddlySpot\",\"tags\":\"$:/tags/ControlPanel/Saving\",\"caption\":\"{{$:/language/ControlPanel/Saving/TiddlySpot/Caption}}\",\"text\":\"\\\\define lingo-base() $:/language/ControlPanel/Saving/TiddlySpot/\\n\\n\\\\define siteURL(path)\\nhttp://$(userName)$.tiddlyspot.com/$path$/\\n\\\\end\\n\\\\define siteLink(path)\\n\\\\whitespace trim\\n\u003C$reveal type=\\\"nomatch\\\" state=\\\"$:/UploadName\\\" text=\\\"\\\">\\n\u003C$set name=\\\"userName\\\" value={{$:/UploadName}}>\\n\u003C$reveal type=\\\"match\\\" state=\\\"$:/UploadURL\\\" text=\\\"\\\">\\n\u003C\u003CsiteURL $path$>>\\n\u003C/$reveal>\\n\u003C$reveal type=\\\"nomatch\\\" state=\\\"$:/UploadURL\\\" text=\\\"\\\">\\n\u003C$macrocall $name=resolvePath source={{$:/UploadBackupDir}} root={{$:/UploadURL}}/>\\n\u003C/$reveal>\\n\u003C/$set>\\n\u003C/$reveal>\\n\\\\end\\n\\n\u003Cdiv class=\\\"tc-message-box\\\">\\n\\n\u003C\u003Clingo ReadOnly>>\\n\\n\u003C/div>\\n\\n\u003C\u003Clingo Description>>\\n\\n|\u003C\u003Clingo UserName>> |\u003C$edit-text tiddler=\\\"$:/UploadName\\\" default=\\\"\\\" tag=\\\"input\\\"/> |\\n|\u003C\u003Clingo Password>> |\u003C$password name=\\\"upload\\\"/> |\\n\\n''\u003C\u003Clingo Advanced/Heading>>''\\n\\n|\u003C\u003Clingo ServerURL>>  |\u003C$edit-text tiddler=\\\"$:/UploadURL\\\" default=\\\"\\\" tag=\\\"input\\\"/> |\\n|\u003C\u003Clingo Filename>> |\u003C$edit-text tiddler=\\\"$:/UploadFilename\\\" default=\\\"index.html\\\" tag=\\\"input\\\"/> |\\n|\u003C\u003Clingo UploadDir>> |\u003C$edit-text tiddler=\\\"$:/UploadDir\\\" default=\\\".\\\" tag=\\\"input\\\"/> |\\n|\u003C\u003Clingo BackupDir>> |\u003C$edit-text tiddler=\\\"$:/UploadBackupDir\\\" default=\\\".\\\" tag=\\\"input\\\"/> |\\n\\n\u003C\u003Clingo TiddlySpot/Hint>>\\n\"},\"$:/core/ui/ControlPanel/Saving/Gitea\":{\"title\":\"$:/core/ui/ControlPanel/Saving/Gitea\",\"tags\":\"$:/tags/ControlPanel/Saving\",\"caption\":\"{{$:/language/ControlPanel/Saving/GitService/Gitea/Caption}}\",\"text\":\"\\\\define lingo-base() $:/language/ControlPanel/Saving/GitService/\\n\\\\define service-name() ~Gitea\\n\\n\u003C\u003Clingo Description>>\\n\\n|\u003C\u003Clingo UserName>> |\u003C$edit-text tiddler=\\\"$:/Gitea/Username\\\" default=\\\"\\\" tag=\\\"input\\\"/> |\\n|\u003C\u003Clingo Gitea/Password>> |\u003C$password name=\\\"Gitea\\\"/> |\\n|\u003C\u003Clingo Repo>> |\u003C$edit-text tiddler=\\\"$:/Gitea/Repo\\\" default=\\\"\\\" tag=\\\"input\\\"/> |\\n|\u003C\u003Clingo Branch>> |\u003C$edit-text tiddler=\\\"$:/Gitea/Branch\\\" default=\\\"master\\\" tag=\\\"input\\\"/> |\\n|\u003C\u003Clingo Path>> |\u003C$edit-text tiddler=\\\"$:/Gitea/Path\\\" default=\\\"\\\" tag=\\\"input\\\"/> |\\n|\u003C\u003Clingo Filename>> |\u003C$edit-text tiddler=\\\"$:/Gitea/Filename\\\" default=\\\"\\\" tag=\\\"input\\\"/> |\\n|\u003C\u003Clingo ServerURL>> |\u003C$edit-text tiddler=\\\"$:/Gitea/ServerURL\\\" default=\\\"https://gitea/api/v1\\\" tag=\\\"input\\\"/> |\\n\"},\"$:/core/ui/ControlPanel/Saving\":{\"title\":\"$:/core/ui/ControlPanel/Saving\",\"tags\":\"$:/tags/ControlPanel\",\"caption\":\"{{$:/language/ControlPanel/Saving/Caption}}\",\"text\":\"\\\\whitespace trim\\n{{$:/language/ControlPanel/Saving/Hint}}
2731\\n\\n\u003Cdiv class=\\\"tc-control-panel\\\">\\n\u003C$macrocall $name=\\\"tabs\\\" tabsList=\\\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Saving]!has[draft.of]]\\\" default=\\\"$:/core/ui/ControlPanel/Saving/General\\\" explicitState=\\\"$:/state/tab-2065006209\\\"/>\\n\u003C/div>\\n\"},\"$:/core/buttonstyles/Borderless\":{\"title\":\"$:/core/buttonstyles/Borderless\",\"tags\":\"$:/tags/ToolbarButtonStyle\",\"caption\":\"{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Borderless}}\",\"text\":\"tc-btn-invisible\"},\"$:/core/buttonstyles/Boxed\":{\"title\":\"$:/core/buttonstyles/Boxed\",\"tags\":\"$:/tags/ToolbarButtonStyle\",\"caption\":\"{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Boxed}}\",\"text\":\"tc-btn-boxed\"},\"$:/core/buttonstyles/Rounded\":{\"title\":\"$:/core/buttonstyles/Rounded\",\"tags\":\"$:/tags/ToolbarButtonStyle\",\"caption\":\"{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Rounded}}\",\"text\":\"tc-btn-rounded\"},\"$:/core/ui/ControlPanel/Settings/CamelCase\":{\"title\":\"$:/core/ui/ControlPanel/Settings/CamelCase\",\"tags\":\"$:/tags/ControlPanel/Settings\",\"caption\":\"{{$:/language/ControlPanel/Settings/CamelCase/Caption}}\",\"text\":\"\\\\define lingo-base() $:/language/ControlPanel/Settings/CamelCase/\\n\u003C\u003Clingo Hint>>\\n\\n\u003C$checkbox tiddler=\\\"$:/config/WikiParserRules/Inline/wikilink\\\" field=\\\"text\\\" checked=\\\"enable\\\" unchecked=\\\"disable\\\" default=\\\"enable\\\"> \u003C$link to=\\\"$:/config/WikiParserRules/Inline/wikilink\\\">\u003C\u003Clingo Description>>\u003C/$link> \u003C/$checkbox>\\n\"},\"$:/core/ui/ControlPanel/Settings/DefaultMoreSidebarTab\":{\"title\":\"$:/core/ui/ControlPanel/Settings/DefaultMoreSidebarTab\",\"caption\":\"{{$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Caption}}\",\"tags\":\"$:/tags/ControlPanel/Settings\",\"text\":\"\\\\define lingo-base() $:/language/ControlPanel/Settings/DefaultMoreSidebarTab/\\n\\\\whitespace trim\\n\\n\u003C$link to=\\\"$:/config/DefaultMoreSidebarTab\\\">\u003C\u003Clingo Hint>>\u003C/$link>\\n\\n\u003C$select tiddler=\\\"$:/config/DefaultMoreSidebarTab\\\">\\n\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/MoreSideBar]!has[draft.of]]\\\">\\n\u003Coption value=\u003C\u003CcurrentTiddler>>>\u003C$transclude field=\\\"caption\\\">\u003C$text text=\u003C\u003CcurrentTiddler>>/>\u003C/$transclude>\u003C/option>\\n\u003C/$list>\\n\u003C/$select>\\n\"},\"$:/core/ui/ControlPanel/Settings/DefaultSidebarTab\":{\"title\":\"$:/core/ui/ControlPanel/Settings/DefaultSidebarTab\",\"caption\":\"{{$:/language/ControlPanel/Settings/DefaultSidebarTab/Caption}}\",\"tags\":\"$:/tags/ControlPanel/Settings\",\"text\":\"\\\\define lingo-base() $:/language/ControlPanel/Settings/DefaultSidebarTab/\\n\\\\whitespace trim\\n\\n\u003C$link to=\\\"$:/config/DefaultSidebarTab\\\">\u003C\u003Clingo Hint>>\u003C/$link>\\n\\n\u003C$select tiddler=\\\"$:/config/DefaultSidebarTab\\\">\\n\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/SideBar]!has[draft.of]]\\\">\\n\u003Coption value=\u003C\u003CcurrentTiddler>>>\u003C$transclude field=\\\"caption\\\">\u003C$text text=\u003C\u003CcurrentTiddler>>/>\u003C/$transclude>\u003C/option>\\n\u003C/$list>\\n\u003C/$select>\\n\"},\"$:/core/ui/ControlPanel/Settings/EditorToolbar\":{\"title\":\"$:/core/ui/ControlPanel/Settings/EditorToolbar\",\"tags\":\"$:/tags/ControlPanel/Settings\",\"caption\":\"{{$:/language/ControlPanel/Settings/EditorToolbar/Caption}}\",\"text\":\"\\\\define lingo-base() $:/language/ControlPanel/Settings/EditorToolbar/\\n\u003C\u003Clingo Hint>>\\n\\n\u003C$checkbox tiddler=\\\"$:/config/TextEditor/EnableToolbar\\\" field=\\\"text\\\" checked=\\\"yes\\\" unchecked=\\\"no\\\" default=\\\"yes\\\"> \u003C$link to=\\\"$:/config/TextEditor/EnableToolbar\\\">\u003C\u003Clingo Description>>\u003C/$link> \u003C/$checkbox>\\n\\n\"},\"$:/core/ui/ControlPanel/Settings/InfoPanelMode\":{\"title\":\"$:/core/ui/ControlPanel/Settings/InfoPanelMode\",\"tags\":\"$:/tags/ControlPanel/Settings\",\"caption\":\"{{$:/language/ControlPanel/Settings/InfoPanelMode/Caption}}\",\"text\":\"\\\\define lingo-base() $:/language/ControlPanel/Settings/InfoPanelMode/\\n\u003C$link to=\\\"$:/config/TiddlerInfo/Mode\\\">\u003C\u003Clingo Hint>>\u003C/$link>
2731\\n\\n\u003C$radio tiddler=\\\"$:/config/TiddlerInfo/Mode\\\" value=\\\"popup\\\"> \u003C\u003Clingo Popup/Description>> \u003C/$radio>\\n\\n\u003C$radio tiddler=\\\"$:/config/TiddlerInfo/Mode\\\" value=\\\"sticky\\\"> \u003C\u003Clingo Sticky/Description>> \u003C/$radio>\\n\"},\"$:/core/ui/ControlPanel/Settings/LinkToBehaviour\":{\"title\":\"$:/core/ui/ControlPanel/Settings/LinkToBehaviour\",\"tags\":\"$:/tags/ControlPanel/Settings\",\"caption\":\"{{$:/language/ControlPanel/Settings/LinkToBehaviour/Caption}}\",\"text\":\"\\\\define lingo-base() $:/language/ControlPanel/Settings/LinkToBehaviour/\\n\\\\whitespace trim\\n\\n\u003C$link to=\\\"$:/config/Navigation/openLinkFromInsideRiver\\\">\u003C\u003Clingo \\\"InsideRiver/Hint\\\">>\u003C/$link>\\n\\n\u003C$select tiddler=\\\"$:/config/Navigation/openLinkFromInsideRiver\\\">\\n  \u003Coption value=\\\"above\\\">\u003C\u003Clingo \\\"OpenAbove\\\">>\u003C/option>\\n  \u003Coption value=\\\"below\\\">\u003C\u003Clingo \\\"OpenBelow\\\">>\u003C/option>\\n  \u003Coption value=\\\"top\\\">\u003C\u003Clingo \\\"OpenAtTop\\\">>\u003C/option>\\n  \u003Coption value=\\\"bottom\\\">\u003C\u003Clingo \\\"OpenAtBottom\\\">>\u003C/option>\\n\u003C/$select>\\n\\n\u003C$link to=\\\"$:/config/Navigation/openLinkFromOutsideRiver\\\">\u003C\u003Clingo \\\"OutsideRiver/Hint\\\">>\u003C/$link>\\n\\n\u003C$select tiddler=\\\"$:/config/Navigation/openLinkFromOutsideRiver\\\">\\n  \u003Coption value=\\\"top\\\">\u003C\u003Clingo \\\"OpenAtTop\\\">>\u003C/option>\\n  \u003Coption value=\\\"bottom\\\">\u003C\u003Clingo \\\"OpenAtBottom\\\">>\u003C/option>\\n\u003C/$select>\\n\"},\"$:/core/ui/ControlPanel/Settings/MissingLinks\":{\"title\":\"$:/core/ui/ControlPanel/Settings/MissingLinks\",\"tags\":\"$:/tags/ControlPanel/Settings\",\"caption\":\"{{$:/language/ControlPanel/Settings/MissingLinks/Caption}}\",\"text\":\"\\\\define lingo-base() $:/language/ControlPanel/Settings/MissingLinks/\\n\u003C\u003Clingo Hint>>\\n\\n\u003C$checkbox tiddler=\\\"$:/config/MissingLinks\\\" field=\\\"text\\\" checked=\\\"yes\\\" unchecked=\\\"no\\\" default=\\\"yes\\\"> \u003C$link to=\\\"$:/config/MissingLinks\\\">\u003C\u003Clingo Description>>\u003C/$link> \u003C/$checkbox>\\n\\n\"},\"$:/core/ui/ControlPanel/Settings/NavigationAddressBar\":{\"title\":\"$:/core/ui/ControlPanel/Settings/NavigationAddressBar\",\"tags\":\"$:/tags/ControlPanel/Settings\",\"caption\":\"{{$:/language/ControlPanel/Settings/NavigationAddressBar/Caption}}\",\"text\":\"\\\\define lingo-base() $:/language/ControlPanel/Settings/NavigationAddressBar/\\n\\n\u003C$link to=\\\"$:/config/Navigation/UpdateAddressBar\\\">\u003C\u003Clingo Hint>>\u003C/$link>\\n\\n\u003C$radio tiddler=\\\"$:/config/Navigation/UpdateAddressBar\\\" value=\\\"permaview\\\"> \u003C\u003Clingo Permaview/Description>> \u003C/$radio>\\n\\n\u003C$radio tiddler=\\\"$:/config/Navigation/UpdateAddressBar\\\" value=\\\"permalink\\\"> \u003C\u003Clingo Permalink/Description>> \u003C/$radio>\\n\\n\u003C$radio tiddler=\\\"$:/config/Navigation/UpdateAddressBar\\\" value=\\\"no\\\"> \u003C\u003Clingo No/Description>> \u003C/$radio>\\n\"},\"$:/core/ui/ControlPanel/Settings/NavigationHistory\":{\"title\":\"$:/core/ui/ControlPanel/Settings/NavigationHistory\",\"tags\":\"$:/tags/ControlPanel/Settings\",\"caption\":\"{{$:/language/ControlPanel/Settings/NavigationHistory/Caption}}\",\"text\":\"\\\\define lingo-base() $:/language/ControlPanel/Settings/NavigationHistory/\\n\u003C$link to=\\\"$:/config/Navigation/UpdateHistory\\\">\u003C\u003Clingo Hint>>\u003C/$link>\\n\\n\u003C$radio tiddler=\\\"$:/config/Navigation/UpdateHistory\\\" value=\\\"yes\\\"> \u003C\u003Clingo Yes/Description>> \u003C/$radio>\\n\\n\u003C$radio tiddler=\\\"$:/config/Navigation/UpdateHistory\\\" value=\\\"no\\\"> \u003C\u003Clingo No/Description>> \u003C/$radio>\\n\"},\"$:/core/ui/ControlPanel/Settings/NavigationPermalinkviewMode\":{\"title\":\"$:/core/ui/ControlPanel/Settings/NavigationPermalinkviewMode\",\"tags\":\"$:/tags/ControlPanel/Settings\",\"caption\":\"{{$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Caption}}\",\"text\":\"\\\\define lingo-base() $:/language/ControlPanel/Settings/NavigationPermalinkviewMode/\\n\u003C\u003Clingo Hint>>\\n\\n\u003C$checkbox tiddler=\\\"$:/config/Navigation/Permalinkview/CopyToClipboard\\\" field=\\\"text\\\" checked=\\\"yes\\\" unchecked=\\\"no\\\" default=\\\"yes\\\"> \u003C$link to=\\\"$:/config/Navigation/Permalinkview/CopyToClipboard\\\">\u003C\u003Clingo CopyToClipboard/Description>>\u003C/$link> \u003C/$checkbox>\\n\\n\u003C$checkbox tiddler=\\\"$:/config/Navigation/Permalinkview/UpdateAddressBar\\\" field=\\\"text\\\" checked=\\\"yes\\\" unchecked=\\\"no\\\" default=\\\"yes\\\"> \u003C$link to=\\\"$:/config/Navigation/Permalinkview/UpdateAddressBar\\\">\u003C\u003Clingo UpdateAddressBar/Description>>\u003C/$link> \u003C/$checkbox>\\n\"},\"$:/core/ui/ControlPanel/Settings/PerformanceInstrumentation\":{\"title\":\"$:/core/ui/ControlPanel/Settings/PerformanceInstrumentation\",\"tags\":\"$:/tags/ControlPanel/Settings\",\"caption\":\"{{$:/language/ControlPanel/Settings/PerformanceInstrumentation/Caption}}\",\"text\":\"\\\\define lingo-base() $:/language/ControlPanel/Settings/PerformanceInstrumentation/\\n\u003C\u003Clingo Hint>>\\n\\n\u003C$checkbox tiddler=\\\"$:/config/Performance/Instrumentation\\\" field=\\\"text\\\" checked=\\\"yes\\\" unchecked=\\\"no\\\" default=\\\"no\\\"> \u003C$link to=\\\"$:/config/Performance/Instrumentation\\\">\u003C\u003Clingo Description>>\u003C/$link> \u003C/$checkbox>\\n\"},\"$:/core/ui/ControlPanel/Settings/TitleLinks\":{\"title\":\"$:/core/ui/ControlPanel/Settings/TitleLinks\",\"tags\":\"$:/tags/ControlPanel/Settings\",\"caption\":\"{{$:/language/ControlPanel/Settings/TitleLinks/Caption}}\",\"text\":\"\\\\define lingo-base() $:/language/ControlPanel/Settings/TitleLinks/\\n\u003C$link to=\\\"$:/config/Tiddlers/TitleLinks\\\">\u003C\u003Clingo Hint>>\u003C/$link>
2731\\n\\n\u003C$radio tiddler=\\\"$:/config/Tiddlers/TitleLinks\\\" value=\\\"yes\\\"> \u003C\u003Clingo Yes/Description>> \u003C/$radio>\\n\\n\u003C$radio tiddler=\\\"$:/config/Tiddlers/TitleLinks\\\" value=\\\"no\\\"> \u003C\u003Clingo No/Description>> \u003C/$radio>\\n\"},\"$:/core/ui/ControlPanel/Settings/ToolbarButtonStyle\":{\"title\":\"$:/core/ui/ControlPanel/Settings/ToolbarButtonStyle\",\"tags\":\"$:/tags/ControlPanel/Settings\",\"caption\":\"{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Caption}}\",\"text\":\"\\\\define lingo-base() $:/language/ControlPanel/Settings/ToolbarButtonStyle/\\n\\\\whitespace trim\\n\u003C$link to=\\\"$:/config/Toolbar/ButtonClass\\\">\u003C\u003Clingo \\\"Hint\\\">>\u003C/$link>\\n\\n\u003C$select tiddler=\\\"$:/config/Toolbar/ButtonClass\\\">\\n\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/ToolbarButtonStyle]]\\\">\\n\u003Coption value={{!!text}}>{{!!caption}}\u003C/option>\\n\u003C/$list>\\n\u003C/$select>\\n\"},\"$:/core/ui/ControlPanel/Settings/ToolbarButtons\":{\"title\":\"$:/core/ui/ControlPanel/Settings/ToolbarButtons\",\"tags\":\"$:/tags/ControlPanel/Settings\",\"caption\":\"{{$:/language/ControlPanel/Settings/ToolbarButtons/Caption}}\",\"text\":\"\\\\define lingo-base() $:/language/ControlPanel/Settings/ToolbarButtons/\\n\u003C\u003Clingo Hint>>\\n\\n\u003C$checkbox tiddler=\\\"$:/config/Toolbar/Icons\\\" field=\\\"text\\\" checked=\\\"yes\\\" unchecked=\\\"no\\\" default=\\\"yes\\\"> \u003C$link to=\\\"$:/config/Toolbar/Icons\\\">\u003C\u003Clingo Icons/Description>>\u003C/$link> \u003C/$checkbox>\\n\\n\u003C$checkbox tiddler=\\\"$:/config/Toolbar/Text\\\" field=\\\"text\\\" checked=\\\"yes\\\" unchecked=\\\"no\\\" default=\\\"no\\\"> \u003C$link to=\\\"$:/config/Toolbar/Text\\\">\u003C\u003Clingo Text/Description>>\u003C/$link> \u003C/$checkbox>\\n\"},\"$:/core/ui/ControlPanel/Settings\":{\"title\":\"$:/core/ui/ControlPanel/Settings\",\"tags\":\"$:/tags/ControlPanel\",\"caption\":\"{{$:/language/ControlPanel/Settings/Caption}}\",\"text\":\"\u003Cdiv class=\\\"tc-control-panel\\\">\\n\u003C$macrocall $name=\\\"tabs\\\" tabsList=\\\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/SettingsTab]!has[draft.of]]\\\" default=\\\"$:/core/ui/ControlPanel/Settings/TiddlyWiki\\\" explicitState=\\\"$:/state/tab--697582678\\\"/>\\n\u003C/div>\"},\"$:/core/ui/ControlPanel/StoryView\":{\"title\":\"$:/core/ui/ControlPanel/StoryView\",\"tags\":\"$:/tags/ControlPanel/Appearance\",\"caption\":\"{{$:/language/ControlPanel/StoryView/Caption}}\",\"text\":\"{{$:/snippets/viewswitcher}}\\n\"},\"$:/core/ui/ControlPanel/Stylesheets\":{\"title\":\"$:/core/ui/ControlPanel/Stylesheets\",\"tags\":\"$:/tags/ControlPanel/Advanced\",\"caption\":\"{{$:/language/ControlPanel/Stylesheets/Caption}}\",\"text\":\"\\\\define lingo-base() $:/language/ControlPanel/\\n\\n\u003C\u003Clingo Stylesheets/Hint>>\\n\\n{{$:/snippets/peek-stylesheets}}\\n\"},\"$:/core/ui/ControlPanel/Theme\":{\"title\":\"$:/core/ui/ControlPanel/Theme\",\"tags\":\"$:/tags/ControlPanel/Appearance\",\"caption\":\"{{$:/language/ControlPanel/Theme/Caption}}\",\"text\":\"{{$:/snippets/themeswitcher}}\\n\"},\"$:/core/ui/ControlPanel/TiddlerFields\":{\"title\":\"$:/core/ui/ControlPanel/TiddlerFields\",\"tags\":\"$:/tags/ControlPanel/Advanced\",\"caption\":\"{{$:/language/ControlPanel/TiddlerFields/Caption}}\",\"text\":\"\\\\define lingo-base() $:/language/ControlPanel/\\n\\n\u003C\u003Clingo TiddlerFields/Hint>>\\n\\n{{$:/snippets/allfields}}\"},\"$:/core/ui/ControlPanel/Settings/TiddlyWiki\":{\"title\":\"$:/core/ui/ControlPanel/Settings/TiddlyWiki\",\"tags\":\"$:/tags/ControlPanel/SettingsTab\",\"caption\":\"TiddlyWiki\",\"list-before\":\"\",\"text\":\"\\\\define lingo-base() $:/language/ControlPanel/Settings/\\n\\
2731n\u003C\u003Clingo Hint>>\\n\\n\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Settings]]\\\">\\n\\n\u003Cdiv style=\\\"border-top:1px solid #eee;\\\">\\n\\n!! \u003C$link>\u003C$transclude field=\\\"caption\\\"/>\u003C/$link>\\n\\n\u003C$transclude/>\\n\\n\u003C/div>\\n\\n\u003C/$list>\\n\"},\"$:/core/ui/ControlPanel/Toolbars/EditToolbar\":{\"title\":\"$:/core/ui/ControlPanel/Toolbars/EditToolbar\",\"tags\":\"$:/tags/ControlPanel/Toolbars\",\"caption\":\"{{$:/language/ControlPanel/Toolbars/EditToolbar/Caption}}\",\"text\":\"\\\\define lingo-base() $:/language/TiddlerInfo/\\n\\n\\\\define config-base() $:/config/EditToolbarButtons/Visibility/\\n\\n{{$:/language/ControlPanel/Toolbars/EditToolbar/Hint}}\\n\\n\u003C$set name=\\\"tv-config-toolbar-icons\\\" value=\\\"yes\\\">\\n\\n\u003C$set name=\\\"tv-config-toolbar-text\\\" value=\\\"yes\\\">\\n\\n\u003C$macrocall $name=\\\"list-tagged-draggable\\\" tag=\\\"$:/tags/EditToolbar\\\" itemTemplate=\\\"$:/core/ui/ControlPanel/Toolbars/ItemTemplate\\\"/>\\n\\n\u003C/$set>\\n\\n\u003C/$set>\"},\"$:/core/ui/ControlPanel/Toolbars/EditorItemTemplate\":{\"title\":\"$:/core/ui/ControlPanel/Toolbars/EditorItemTemplate\",\"text\":\"\\\\define config-title()\\n$(config-base)$$(currentTiddler)$\\n\\\\end\\n\\\\whitespace trim\\n\\n\u003C$draggable tiddler=\u003C\u003CcurrentTiddler>>>\\n\u003C$checkbox tiddler=\u003C\u003Cconfig-title>> field=\\\"text\\\" checked=\\\"show\\\" unchecked=\\\"hide\\\" default=\\\"show\\\"/>\\n&#32;\\n\u003Cspan class=\\\"tc-icon-wrapper\\\">\u003C$transclude tiddler={{!!icon}}/>\u003C/span>\\n&#32;\\n\u003C$transclude field=\\\"caption\\\"/>\\n&#32;--&#32;\\n\u003Ci class=\\\"tc-muted\\\">\u003C$transclude field=\\\"description\\\"/>\u003C/i>\\n\u003C/$draggable>\\n\"},\"$:/core/ui/ControlPanel/Toolbars/EditorToolbar\":{\"title\":\"$:/core/ui/ControlPanel/Toolbars/EditorToolbar\",\"tags\":\"$:/tags/ControlPanel/Toolbars\",\"caption\":\"{{$:/language/ControlPanel/Toolbars/EditorToolbar/Caption}}\",\"text\":\"\\\\define lingo-base() $:/language/TiddlerInfo/\\n\\n\\\\define config-base() $:/config/EditorToolbarButtons/Visibility/\\n\\n{{$:/language/ControlPanel/Toolbars/EditorToolbar/Hint}}\\n\\n\u003C$macrocall $name=\\\"list-tagged-draggable\\\" tag=\\\"$:/tags/EditorToolbar\\\" itemTemplate=\\\"$:/core/ui/ControlPanel/Toolbars/EditorItemTemplate\\\"/>\\n\"},\"$:/core/ui/ControlPanel/Toolbars/ItemTemplate\":{\"title\":\"$:/core/ui/ControlPanel/Toolbars/ItemTemplate\",\"text\":\"\\\\define config-title()\\n$(config-base)$$(currentTiddler)$\\n\\\\end\\n\\\\whitespace trim\\n\\n\u003C$draggable tiddler=\u003C\u003CcurrentTiddler>>>\\n\u003C$checkbox tiddler=\u003C\u003Cconfig-title>> field=\\\"text\\\" checked=\\\"show\\\" unchecked=\\\"hide\\\" default=\\\"show\\\"/>\\n&#32;\\n\u003Cspan class=\\\"tc-icon-wrapper\\\">\\n&#32;\\n\u003C$transclude field=\\\"caption\\\"/>\\n&#32;\\n\u003Ci class=\\\"tc-muted\\\">\\n--&#32;\\n\u003C$transclude field=\\\"description\\\"/>\\n\u003C/i>\u003C/span>\\n\u003C/$draggable>\\n\"},\"$:/core/ui/ControlPanel/Toolbars/PageControls\":{\"title\":\"$:/core/ui/ControlPanel/Toolbars/PageControls\",\"tags\":\"$:/tags/ControlPanel/Toolbars\",\"caption\":\"{{$:/language/ControlPanel/Toolbars/PageControls/Caption}}\",\"text\":\"\\\\define lingo-base() $:/language/TiddlerInfo/\\n\\n\\\\define config-base() $:/config/PageControlButtons/Visibility/\\n\\n{{$:/language/ControlPanel/Toolbars/PageControls/Hint}}\\n\\n\u003C$set name=\\\"tv-config-toolbar-icons\\\" value=\\\"yes\\\">\\n\\n\u003C$set name=\\\"tv-config-toolbar-text\\\" value=\\\"yes\\\">\\n\\n\u003C$macrocall $name=\\\"list-tagged-draggable\\\" tag=\\\"$:/tags/PageControls\\\" itemTemplate=\\\"$:/core/ui/ControlPanel/Toolbars/ItemTemplate\\\"/>\\n\\n\u003C/$set>\\n\\n\u003C/$set>\\n\"},\"$:/core/ui/ControlPanel/Toolbars/ViewToolbar\":{\"title\":\"$:/core/ui/ControlPanel/Toolbars/ViewToolbar\",\"tags\":\"$:/tags/ControlPanel/Toolbars\",\"caption\":\"{{$:/language/ControlPanel/Toolbars/ViewToolbar/Caption}}\",\"text\":\"\\\\define lingo-base() $:/language/TiddlerInfo/\\n\\n\\\\define config-base() $:/config/ViewToolbarButtons/Visibility/\\n\\
2731n{{$:/language/ControlPanel/Toolbars/ViewToolbar/Hint}}\\n\\n\u003C$set name=\\\"tv-config-toolbar-icons\\\" value=\\\"yes\\\">\\n\\n\u003C$set name=\\\"tv-config-toolbar-text\\\" value=\\\"yes\\\">\\n\\n\u003C$macrocall $name=\\\"list-tagged-draggable\\\" tag=\\\"$:/tags/ViewToolbar\\\" itemTemplate=\\\"$:/core/ui/ControlPanel/Toolbars/ItemTemplate\\\"/>\\n\\n\u003C/$set>\\n\\n\u003C/$set>\\n\"},\"$:/core/ui/ControlPanel/Toolbars\":{\"title\":\"$:/core/ui/ControlPanel/Toolbars\",\"tags\":\"$:/tags/ControlPanel/Appearance\",\"caption\":\"{{$:/language/ControlPanel/Toolbars/Caption}}\",\"text\":\"\\\\whitespace trim\\n{{$:/language/ControlPanel/Toolbars/Hint}}\\n\\n\u003Cdiv class=\\\"tc-control-panel\\\">\\n\u003C$macrocall $name=\\\"tabs\\\" tabsList=\\\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Toolbars]!has[draft.of]]\\\" default=\\\"$:/core/ui/ControlPanel/Toolbars/ViewToolbar\\\" class=\\\"tc-vertical\\\" explicitState=\\\"$:/state/tabs/controlpanel/toolbars-1345989671\\\"/>\\n\u003C/div>\\n\"},\"$:/ControlPanel\":{\"title\":\"$:/ControlPanel\",\"icon\":\"$:/core/images/options-button\",\"color\":\"#bbb\",\"text\":\"\\\\whitespace trim\\n\u003Cdiv class=\\\"tc-control-panel\\\">\\n\u003C$macrocall $name=\\\"tabs\\\" tabsList=\\\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel]!has[draft.of]]\\\" default=\\\"$:/core/ui/ControlPanel/Info\\\" explicitState=\\\"$:/state/tab-1749438307\\\"/>\\n\u003C/div>\\n\"},\"$:/core/ui/DefaultSearchResultList\":{\"title\":\"$:/core/ui/DefaultSearchResultList\",\"tags\":\"$:/tags/SearchResults\",\"caption\":\"{{$:/language/Search/DefaultResults/Caption}}\",\"first-search-filter\":\"[!is[system]search:title\u003CuserInput>sort[title]limit[250]]\",\"second-search-filter\":\"[!is[system]search\u003CuserInput>sort[title]limit[250]]\",\"text\":\"\\\\define searchResultList()\\n\\\\whitespace trim\\n//\u003Csmall>{{$:/language/Search/Matches/Title}}\u003C/small>
2731//\\n\\n\u003C$list filter=\\\"[\u003CuserInput>minlength[1]]\\\" variable=\\\"ignore\\\">\\n\u003C$list filter={{{ [\u003CconfigTiddler>get[first-search-filter]] }}}>\\n\u003Cspan class={{{[\u003CcurrentTiddler>addsuffix[-primaryList]] -[\u003CsearchListState>get[text]] +[then[]else[tc-list-item-selected]] }}}>\\n\u003C$transclude tiddler=\\\"$:/core/ui/ListItemTemplate\\\"/>\\n\u003C/span>\\n\u003C/$list>\\n\u003C/$list>\\n\\n//\u003Csmall>{{$:/language/Search/Matches/All}}\u003C/small>//\\n\\n\u003C$list filter=\\\"[\u003CuserInput>minlength[1]]\\\" variable=\\\"ignore\\\">\\n\u003C$list filter={{{ [\u003CconfigTiddler>get[second-search-filter]] }}}>\\n\u003Cspan class={{{[\u003CcurrentTiddler>addsuffix[-secondaryList]] -[\u003CsearchListState>get[text]] +[then[]else[tc-list-item-selected]] }}}>\\n\u003C$transclude tiddler=\\\"$:/core/ui/ListItemTemplate\\\"/>\\n\u003C/span>\\n\u003C/$list>\\n\u003C/$list>\\n\\n\\\\end\\n\u003C\u003CsearchResultList>>\\n\"},\"$:/core/ui/DownloadFullWiki\":{\"title\":\"$:/core/ui/DownloadFullWiki\",\"text\":\"\\\\whitespace trim\\n\\\\rules except wikilink\\n\\nTo download the standard single-file version of your wiki:\\n\\n\u003C$wikify name=\\\"site-title\\\" text={{$:/config/SaveWikiButton/Filename}}>\\n\u003C$let publishFilter=\\\"\\\"\\\"-[[$:/config/SaveWikiButton/Template]] -[[$:/plugins/tiddlywiki/filesystem]] -[[$:/plugins/tiddlywiki/tiddlyweb]]\\\"\\\"\\\">\\n\u003C$button tooltip=\\\"Download fully standalone wiki\\\" aria-label=\\\"download full wiki\\\" class=\\\"tc-btn-big-green\\\">\\n\u003C$action-sendmessage $message=\\\"tm-download-file\\\" $param=\\\"$:/core/save/all\\\" publishFilter=\u003C\u003CpublishFilter>> filename=\u003C\u003Csite-title>>/>\\n{{$:/core/images/download-button}}\\n\u003Cspan class=\\\"tc-tiny-gap-left\\\">\\nDownload full wiki\\n\u003C/span>\\n\u003C/$button>\\n\u003C/$let>\\n\u003C/$wikify>\"},\"$:/core/ui/EditTemplate/body/preview/diffs-current\":{\"title\":\"$:/core/ui/EditTemplate/body/preview/diffs-current\",\"tags\":\"$:/tags/EditPreview\",\"caption\":\"{{$:/language/EditTemplate/Body/Preview/Type/DiffCurrent}}\",\"list-after\":\"$:/core/ui/EditTemplate/body/preview/output\",\"text\":\"\u003C$list filter=\\\"[\u003CcurrentTiddler>!is[image]]\\\" emptyMessage={{$:/core/ui/EditTemplate/body/preview/output}}>\\n\\n\u003C$macrocall $name=\\\"compareTiddlerText\\\" sourceTiddlerTitle={{!!draft.of}} destTiddlerTitle=\u003C\u003CcurrentTiddler>>/>\\n\\n\u003C/$list>\\n\\n\"},\"$:/core/ui/EditTemplate/body/preview/diffs-shadow\":{\"title\":\"$:/core/ui/EditTemplate/body/preview/diffs-shadow\",\"tags\":\"$:/tags/EditPreview\",\"caption\":\"{{$:/language/EditTemplate/Body/Preview/Type/DiffShadow}}\",\"list-after\":\"$:/core/ui/EditTemplate/body/preview/output\",\"text\":\"\u003C$list filter=\\\"[\u003CcurrentTiddler>!is[image]]\\\" emptyMessage={{$:/core/ui/EditTemplate/body/preview/output}}>\\n\\n\u003C$macrocall $name=\\\"compareTiddlerText\\\" sourceTiddlerTitle={{{ [{!!draft.of}shadowsource[]] }}} sourceSubTiddlerTitle={{!!draft.of}} destTiddlerTitle=\u003C\u003CcurrentTiddler>>/>\\n\\n\u003C/$list>\\n\\n\"},\"$:/core/ui/EditTemplate/body/preview/output\":{\"title\":\"$:/core/ui/EditTemplate/body/preview/output\",\"tags\":\"$:/tags/EditPreview\",\"caption\":\"{{$:/language/EditTemplate/Body/Preview/Type/Output}}\",\"text\":\"\\\\import [all[shadows+tiddlers]tag[$:/tags/Macro/View]!is[draft]] [all[shadows+tiddlers]tag[$:/tags/Macro/View/Body]!is[draft]] [all[shadows+tiddlers]tag[$:/tags/Global/View]!is[draft]] [all[shadows+tiddlers]tag[$:/tags/Global/View/Body]!is[draft]]\\n\u003C$set name=\\\"tv-tiddler-preview\\\" value=\\\"yes\\\">\\n\\n\u003C$transclude tiddler={{{ [\u003CcurrentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/ViewTemplateBodyFilter]!is[draft]get[text]] :and[!is[blank]else[$:/core/ui/ViewTemplate/body/default]] }}} />\\n\\n\u003C/$set>\\n\"},\"$:/state/showeditpreview\":{\"title\":\"$:/state/showeditpreview\",\"text\":\"no\"},\"$:/core/ui/EditTemplate/body/canonical-uri\":{\"title\":\"$:/core/ui/EditTemplate/body/canonical-uri\",\"text\":\"\\\\define lingo-base() $:/language/EditTemplate/Body/\\n\\n\u003Cdiv class=\\\"tc-message-box\\\">\\n\\n\u003C\u003Clingo External/Hint>>\\n\\n\u003Ca href={{!!_canonical_uri}}>\u003C$text text={{!!_canonical_uri}}/>
2731\u003C/a>\\n\\n\u003C$edit-text field=\\\"_canonical_uri\\\" class=\\\"tc-edit-fields\\\" tabindex={{$:/config/EditTabIndex}} cancelPopups=\\\"yes\\\">\u003C/$edit-text>\\n\\n\u003C/div>\\n\"},\"$:/core/ui/EditTemplate/body/default\":{\"title\":\"$:/core/ui/EditTemplate/body/default\",\"text\":\"\\\\define config-visibility-title()\\n$:/config/EditorToolbarButtons/Visibility/$(currentTiddler)$\\n\\\\end\\n\\n\\\\define importFileActions()\\n\u003C$action-popup $state=\u003C\u003CimportState>> $coords=\\\"(0,0,0,0)\\\" $floating=\\\"yes\\\"/>\\n\\\\end\\n\\n\\\\whitespace trim\\n\u003C$let\\n\\tedit-preview-state={{{ [{$:/config/ShowEditPreview/PerTiddler}!match[yes]then[$:/state/showeditpreview]] :else[\u003Cqualify \\\"$:/state/showeditpreview\\\">] }}}\\n\\timportTitle=\u003C\u003Cqualify $:/ImportImage>>\\n\\timportState=\u003C\u003Cqualify $:/state/ImportImage>> >\\n\u003C$dropzone importTitle=\u003C\u003CimportTitle>> autoOpenOnImport=\\\"no\\\" contentTypesFilter={{$:/config/Editor/ImportContentTypesFilter}} class=\\\"tc-dropzone-editor\\\" enable={{{ [{$:/config/DragAndDrop/Enable}match[no]] :else[subfilter{$:/config/Editor/EnableImportFilter}then[yes]else[no]] }}} filesOnly=\\\"yes\\\" actions=\u003C\u003CimportFileActions>> >\\n\u003C$reveal stateTitle=\u003C\u003Cedit-preview-state>> type=\\\"match\\\" text=\\\"yes\\\" tag=\\\"div\\\">\\n\u003Cdiv class=\\\"tc-tiddler-preview\\\">\\n\\n\u003C$transclude tiddler=\\\"$:/core/ui/EditTemplate/body/editor\\\" mode=\\\"inline\\\"/>\\n\\n\u003Cdiv class=\\\"tc-tiddler-preview-preview\\\" data-tiddler-title={{!!draft.title}} data-tags={{!!tags}}>\\n\\n\u003C$transclude tiddler={{$:/state/editpreviewtype}} mode=\\\"inline\\\">\\n\\n\u003C$transclude tiddler=\\\"$:/core/ui/EditTemplate/body/preview/output\\\" mode=\\\"inline\\\"/>\\n\\n\u003C/$transclude>\\n\\n\u003C/div>\\n\\n\u003C/div>\\n\u003C/$reveal>\\n\\n\u003C$reveal stateTitle=\u003C\u003Cedit-preview-state>> type=\\\"nomatch\\\" text=\\\"yes\\\" tag=\\\"div\\\">\\n\\n\u003C$transclude tiddler=\\\"$:/core/ui/EditTemplate/body/editor\\\" mode=\\\"inline\\\"/>\\n\\n\u003C/$reveal>\\n\u003C/$dropzone>\\n\u003C/$let>\\n\"},\"$:/core/ui/EditTemplate/body/editor\":{\"title\":\"$:/core/ui/EditTemplate/body/editor\",\"text\":\"\\\\whitespace trim\\n\\n\u003C$edit\\n\\n  field=\\\"text\\\"\\n  class=\\\"tc-edit-texteditor tc-edit-texteditor-body\\\"\\n  placeholder={{$:/language/EditTemplate/Body/Placeholder}}\\n  tabindex={{$:/config/EditTabIndex}}\\n  focus={{{ [{$:/config/AutoFocus}match[text]then[true]] ~[[false]] }}}\\n  cancelPopups=\\\"yes\\\"\\n  fileDrop={{{ [{$:/config/DragAndDrop/Enable}match[no]] :else[subfilter{$:/config/Editor/EnableImportFilter}then[yes]else[no]] }}}\\n\\n>\u003C$set\\n\\n  name=\\\"targetTiddler\\\"\\n  value=\u003C\u003CcurrentTiddler>>\\n\\n>\u003C$list\\n\\n  filter=\\\"[all[shadows+tiddlers]tag[$:/tags/EditorToolbar]!has[draft.of]]\\\"\\n\\n>\u003C$reveal\\n\\n  type=\\\"nomatch\\\"\\n  state=\u003C\u003Cconfig-visibility-title>>\\n  text=\\\"hide\\\"\\n  class=\\\"tc-text-editor-toolbar-item-wrapper\\\"\\n\\n>\u003C$transclude\\n\\n  tiddler=\\\"$:/core/ui/EditTemplate/body/toolbar/button\\\"\\n  mode=\\\"inline\\\"\\n\\n/>\u003C/$reveal>\u003C/$list>\u003C$list\\n\\n  filter=\\\"[all[shadows+tiddlers]tag[$:/tags/EditorTools]!has[draft.of]]\\\"\\n\\n>\u003C$list\\n\\tfilter={{!!condition}}\\n\\tvariable=\\\"list-condition\\\"\\n>\u003C$transclude/>\\n\u003C/$list>\u003C/$list>\u003C/$set>\u003C/$edit>\\n\"},\"$:/core/ui/EditTemplate/body/toolbar/button\":{\"title\":\"$:/core/ui/EditTemplate/body/toolbar/button\",\"text\":\"\\\\define toolbar-button-icon()\\n\u003C$list\\n\\n  filter=\\\"[all[current]!has[custom-icon]]\\\"\\n  variable=\\\"no-custom-icon\\\"\\n\\n>\u003C$transclude\\n\\n  tiddler={{!!icon}}\\n\\n/>\u003C/$list>\\n\\\\end\\n\\n\\\\define toolbar-button-tooltip()\\n{{!!description}}\u003C$macrocall $name=\\\"displayshortcuts\\\" $output=\\\"text/plain\\\" shortcuts={{!!shortcuts}} prefix=\\\"` - [\\\" separator=\\\"] [\\\" suffix=\\\"]`\\\"/>\\n\\\\end\\n\\n\\\\define toolbar-button()\\n\u003C$list\\n\\n  filter={{!!condition}}\\n  variable=\\\"list-condition\\\"\\n\\n>\u003C$wikify\\n\\n  name=\\\"tooltip-text\\\"\\n  text=\u003C\u003Ctoolbar-button-tooltip>>\\n  mode=\\\"inline\\\"\\n  output=\\\"text\\\"\\n\\n>\u003C$list\\n\\n  filter=\\\"[all[current]!has[dropdown]]\\\"\\n  variable=\\\"no-dropdown\\\"\\n\\n>\u003C$set name=disabled filter={{!!condition-disabled}}>
2731\u003C$button\\n\\n  class=\\\"tc-btn-invisible $(buttonClasses)$\\\"\\n  tooltip=\u003C\u003Ctooltip-text>>\\n  actions={{!!actions}}\\n  disabled=\u003C\u003Cdisabled>>\\n\\n>\u003Cspan\\n\\n  data-tw-keyboard-shortcut={{{ [\u003Cdisabled>match[yes]then[]else{!!shortcuts}] }}}\\n\\n/>\u003C\u003Ctoolbar-button-icon>>\u003C$transclude\\n\\n  tiddler=\u003C\u003CcurrentTiddler>>\\n  field=\\\"text\\\"\\n\\n/>\u003C/$button>\u003C/$set>\u003C/$list>\u003C$list\\n\\n  filter=\\\"[all[current]has[dropdown]]\\\"\\n  variable=\\\"dropdown\\\"\\n\\n>\u003C$set\\n\\n  name=\\\"dropdown-state\\\"\\n  value=\u003C\u003Cqualify \\\"$:/state/EditorToolbarDropdown\\\">>\\n\\n>\u003C$set name=disabled filter={{!!condition-disabled}}>\u003C$button\\n\\n  popup=\u003C\u003Cdropdown-state>>\\n  class=\\\"tc-popup-keep tc-btn-invisible $(buttonClasses)$\\\"\\n  selectedClass=\\\"tc-selected\\\"\\n  tooltip=\u003C\u003Ctooltip-text>>\\n  actions={{!!actions}}\\n  disabled=\u003C\u003Cdisabled>>\\n\\n>\u003Cspan\\n\\n  data-tw-keyboard-shortcut={{{ [\u003Cdisabled>match[yes]then[]else{!!shortcuts}] }}}\\n\\n/>\u003C\u003Ctoolbar-button-icon>>\u003C$transclude\\n\\n  tiddler=\u003C\u003CcurrentTiddler>>\\n  field=\\\"text\\\"\\n\\n/>\u003C/$button>\u003C/$set>\u003C$reveal\\n\\n  state=\u003C\u003Cdropdown-state>>\\n  type=\\\"popup\\\"\\n  position=\\\"below\\\"\\n  animate=\\\"yes\\\"\\n  tag=\\\"span\\\"\\n\\n>\u003Cdiv\\n\\n  class=\\\"tc-drop-down tc-popup-keep\\\"\\n\\n>\u003C$transclude\\n\\n  tiddler={{!!dropdown}}\\n  mode=\\\"block\\\"\\n\\n/>\u003C/div>\u003C/$reveal>\u003C/$set>\u003C/$list>\u003C/$wikify>\u003C/$list>\\n\\\\end\\n\\n\\\\define toolbar-button-outer()\\n\u003C$set\\n\\n  name=\\\"buttonClasses\\\"\\n  value={{!!button-classes}}\\n\\n>\u003C\u003Ctoolbar-button>>\u003C/$set>\\n\\\\end\\n\\n\u003C\u003Ctoolbar-button-outer>>\"},\"$:/core/ui/EditTemplate/body\":{\"title\":\"$:/core/ui/EditTemplate/body\",\"tags\":\"$:/tags/EditTemplate\",\"text\":\"\u003C$transclude tiddler={{{ [\u003CcurrentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/EditTemplateBodyFilter]!is[draft]get[text]] :and[!is[blank]else[$:/core/ui/EditTemplate/body/default]] }}} />\\n\"},\"$:/core/ui/EditTemplate/controls\":{\"title\":\"$:/core/ui/EditTemplate/controls\",\"tags\":\"$:/tags/EditTemplate\",\"text\":\"\\\\define config-title()\\n$:/config/EditToolbarButtons/Visibility/$(listItem)$\\n\\\\end\\n\\\\whitespace trim\\n\u003Cdiv class=\\\"tc-tiddler-title tc-tiddler-edit-title\\\">\\n\u003C$view field=\\\"title\\\"/>\\n\u003Cspan class=\\\"tc-tiddler-controls tc-titlebar\\\">\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/EditToolbar]!has[draft.of]]\\\" variable=\\\"listItem\\\">\u003C$let tv-config-toolbar-class={{{ [enlist\u003Ctv-config-toolbar-class>] [\u003ClistItem>encodeuricomponent[]addprefix[tc-btn-]] +[join[ ]]}}}>\u003C$reveal type=\\\"nomatch\\\" state=\u003C\u003Cconfig-title>> text=\\\"hide\\\">\u003C$transclude tiddler=\u003C\u003ClistItem>>/>\u003C/$reveal>\u003C/$let>\u003C/$list>\u003C/span>\\n\u003Cdiv style=\\\"clear: both;\\\">\u003C/div>\\n\u003C/div>\\n\"},\"$:/core/ui/EditTemplate/fieldEditor/default\":{\"title\":\"$:/core/ui/EditTemplate/fieldEditor/default\",\"text\":\"\u003C$edit-text tiddler=\u003C\u003CcurrentTiddler>> field=\u003C\u003CcurrentField>> tag=\\\"input\\\" default=\\\"\\\" class=\\\"tc-edit-texteditor tc-edit-fieldeditor\\\" placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}} tabindex={{$:/config/EditTabIndex}} cancelPopups=\\\"yes\\\"/>\"},\"$:/core/ui/EditTemplate/fields\":{\"title\":\"$:/core/ui/EditTemplate/fields\",\"tags\":\"$:/tags/EditTemplate\",\"text\":\"\\\\define lingo-base() $:/language/EditTemplate/\\n\\\\define config-title()\\n$:/config/EditTemplateFields/Visibility/$(currentField)$\\n\\\\end\\n\\n\\\\define config-filter()\\n[[hide]] -[title{$(config-title)$}]\\n\\\\end\\n\\n\u003C!-- Beware this is duplicated from EditTemplate.tid. For details see bug #7054 -->\\n\\\\define get-field-value-tiddler-filter() [subfilter\u003Cget-field-editor-filter>sha256[16]addprefix[/]addprefix\u003CnewFieldValueTiddlerPrefix>]\\n\\\\define get-field-editor-filter() [\u003CnewFieldNameTiddler>get[text]else[]] :cascade[all[shadows+tiddlers]tag[$:/tags/FieldEditorFilter]!is[draft]get[text]] :and[!is[blank]else{$:/core/ui/EditTemplate/fieldEditor/default}
2731]\\n\\n\\\\define current-tiddler-new-field-selector()\\n[data-tiddler-title=\\\"$(currentTiddlerCSSescaped)$\\\"] .tc-edit-field-add-name-wrapper input\\n\\\\end\\n\\n\\\\define new-field-actions()\\n\\\\whitespace trim\\n\u003C$action-sendmessage $message=\\\"tm-add-field\\\" $name={{{ [\u003CnewFieldNameTiddler>get[text]] }}} $value={{{ [\u003CnewFieldNameTiddler>get[text]] :map[subfilter\u003Cget-field-value-tiddler-filter>get[text]] }}}/>\\n\u003C$set name=\\\"safeNewFieldValueTiddlerPrefix\\\" value=\u003C\u003CnewFieldValueTiddlerPrefix>> emptyValue=\u003C\u003Cqualify \\\"$:/temp/NewFieldValue\\\">> >\\n\\t\u003C$action-deletetiddler $filter=\\\"[\u003CnewFieldNameTiddler>] [prefix[$:/temp/NewFieldValue]prefix\u003CsafeNewFieldValueTiddlerPrefix>] [\u003CstoreTitle>] [\u003CsearchListState>]\\\"/>\\n\u003C/$set>\\n\u003C$action-sendmessage $message=\\\"tm-focus-selector\\\" $param=\u003C\u003Ccurrent-tiddler-new-field-selector>>/>\\n\\\\end\\n\\n\\\\define delete-state-tiddlers() \u003C$action-deletetiddler $filter=\\\"[\u003CnewFieldNameTiddler>] [\u003CstoreTitle>] [\u003CsearchListState>]\\\"/>\\n\\n\\\\define cancel-search-actions-inner()\\n\\\\whitespace trim\\n\u003C$list\\n\\tfilter=\\\"[\u003CstoreTitle>has[text]] [\u003CnewFieldNameTiddler>has[text]]\\\"\\n\\tvariable=\\\"ignore\\\"\\n\\temptyMessage=\\\"\u003C\u003Ccancel-delete-tiddler-actions 'cancel'>>\\\">\\n\u003C\u003Cdelete-state-tiddlers>>\\n\u003C/$list>\\n\\\\end\\n\\n\\\\define cancel-search-actions()\\n\\\\whitespace trim\\n\u003C$set name=\\\"userInput\\\" value={{{ [\u003CstoreTitle>get[text]] }}}>\\n\u003C$list\\n\\tfilter=\\\"[\u003CnewFieldNameTiddler>get[text]!match\u003CuserInput>]\\\"\\n\\temptyMessage=\\\"\u003C\u003Ccancel-search-actions-inner>>\\\">\\n\u003C$action-setfield $tiddler=\u003C\u003CnewFieldNameTiddler>> text=\u003C\u003CuserInput>>/>\u003C$action-setfield $tiddler=\u003C\u003CrefreshTitle>> text=\\\"yes\\\"/>\\n\u003C/$list>\\n\u003C/$set>\\n\\\\end\\n\\n\\\\define new-field()\\n\\\\whitespace trim\\n\u003C$vars name={{{ [\u003CnewFieldNameTiddler>get[text]] }}}>\\n\u003C$reveal type=\\\"nomatch\\\" text=\\\"\\\" default=\u003C\u003Cname>>>\\n\u003C$button tooltip=\u003C\u003Clingo Fields/Add/Button/Hint>>>\\n\u003C$action-sendmessage $message=\\\"tm-add-field\\\"\\n$name=\u003C\u003Cname>>\\n$value={{{ [subfilter\u003Cget-field-value-tiddler-filter>get[text]] }}}/>\\n\u003C$set name=\\\"safeNewFieldValueTiddlerPrefix\\\" value=\u003C\u003CnewFieldValueTiddlerPrefix>> emptyValue=\u003C\u003Cqualify \\\"$:/temp/NewFieldValue\\\">> >\\n\\t\u003C$action-deletetiddler $filter=\\\"[\u003CnewFieldNameTiddler>] [prefix[$:/temp/NewFieldValue]prefix\u003CsafeNewFieldValueTiddlerPrefix>] [\u003CstoreTitle>] [\u003CsearchListState>]\\\"/>\\n\u003C/$set>\\n\u003C\u003Clingo Fields/Add/Button>>\\n\u003C/$button>\\n\u003C/$reveal>\\n\u003C$reveal type=\\\"match\\\" text=\\\"\\\" default=\u003C\u003Cname>>>\\n\u003C$button>\\n\u003C\u003Clingo Fields/Add/Button>>\\n\u003C/$button>\\n\u003C/$reveal>\\n\u003C/$vars>\\n\\\\end\\n\\\\whitespace trim\\n\\n\u003C$set name=\\\"newFieldValueTiddlerPrefix\\\" value=\u003C\u003CnewFieldValueTiddlerPrefix>> emptyValue=\u003C\u003Cqualify \\\"$:/temp/NewFieldValue\\\">> >\\n\u003Cdiv class=\\\"tc-edit-fields\\\">\\n\u003Ctable class={{{ [all[current]fields[]] :filter[lookup[$:/config/EditTemplateFields/Visibility/]!match[hide]] +[count[]!match[0]] +[then[tc-edit-fields]] ~[[tc-edit-fields tc-edit-fields-small]] }}}>\\n\u003Ctbody>\\n\u003C$list filter=\\\"[all[current]fields[]] +[sort[title]]\\\" variable=\\\"currentField\\\" storyview=\\\"pop\\\">\\n\u003C$list filter=\u003C\u003Cconfig-filter>> variable=\\\"temp\\\">\\n\u003Ctr class=\\\"tc-edit-field\\\">\\n\u003Ctd class=\\\"tc-edit-field-name\\\">\\n\u003C$text text=\u003C\u003CcurrentField>>/>:\u003C/td>\\n\u003Ctd class=\\\"tc-edit-field-value\\\">\\n\u003C$keyboard key=\\\"((delete-field))\\\" actions=\\\"\\\"\\\"\u003C$action-deletefield $field=\u003C\u003CcurrentField>>/>\u003C$set name=\\\"currentTiddlerCSSescaped\\\" value={{{ [\u003CcurrentTiddler>escapecss[]] }}}>\u003C$action-sendmessage $message=\\\"tm-focus-selector\\\" $param=\u003C\u003Ccurrent-tiddler-new-field-selector>>/>\u003C/$set>\\\"\\\"\\\">\\n\u003C$transclude tiddler={{{ [\u003CcurrentField>] :cascade[all[shadows+tiddlers]tag[$:/tags/FieldEditorFilter]!is[draft]get[text]] :and[!is[blank]else{$:/core/ui/EditTemplate/fieldEditor/default}] }}} />\\n\u003C/$keyboard>\\n\u003C/td>\\n\u003Ctd class=\\\"tc-edit-field-remove\\\">\\n\u003C$button class=\\\"tc-btn-invisible\\\" tooltip={{$:/language/EditTemplate/Field/Remove/Hint}} aria-label={{$:/language/EditTemplate/Field/Remove/Caption}}>\\n\u003C$action-deletefield $field=\u003C\u003CcurrentField>>/>\u003C$set name=\\\"currentTiddlerCSSescaped\\\" value={{{ [\u003CcurrentTiddler>escapecss[]] }}}>\u003C$action-sendmessage $message=\\\"tm-focus-selector\\\" $param=\u003C\u003Ccurrent-tiddler-new-field-selector>>/>\u003C/$set>\\n{{$:/core/images/delete-button}}\\n\u003C/$button>\\n\u003C/td>\\n\u003C/tr>\\n\u003C/$list>\\n\u003C/$list>\\n\u003C/tbody>\\n\u003C/table>\\n\u003C/div>\\n\\n\u003C$fieldmangler>\\n\u003Cdiv class=\\\"tc-edit-field-add\\\">\\n\u003Cem class=\\\"tc-edit tc-small-gap-right\\\">\\n\u003C\u003Clingo Fields/Add/Prompt>>\\n\u003C/em>\\n\u003C$vars refreshTitle=\u003C\u003Cqualify \\\"$:/temp/fieldname/refresh\\\">> storeTitle=\u003C\u003CnewFieldNameInputTiddler>> searchListState=\u003C\u003CnewFieldNameSelectionTiddler>>>\\n\u003Cdiv class=\\\"tc-edit-field-add-name-wrapper\\\">\\n\u003C$macrocall $name=\\\"keyboard-driven-input\\\" tiddler=\u003C\u003CnewFieldNameTiddler>> storeTitle=\u003C\u003CstoreTitle>> refreshTitle=\u003C\u003CrefreshTitle>>
2731\\n\\t\\tselectionStateTitle=\u003C\u003CsearchListState>> tag=\\\"input\\\" default=\\\"\\\" placeholder={{$:/language/EditTemplate/Fields/Add/Name/Placeholder}}\\n\\t\\tfocusPopup=\u003C\u003Cqualify \\\"$:/state/popup/field-dropdown\\\">> class=\\\"tc-edit-texteditor tc-popup-handle\\\" tabindex={{$:/config/EditTabIndex}}\\n\\t\\tfocus={{{ [{$:/config/AutoFocus}match[fields]then[true]] ~[[false]] }}} cancelPopups=\\\"yes\\\"\\n\\t\\tconfigTiddlerFilter=\\\"[[$:/config/EditMode/fieldname-filter]]\\\" inputCancelActions=\u003C\u003Ccancel-search-actions>> />\\n\u003C$button popup=\u003C\u003Cqualify \\\"$:/state/popup/field-dropdown\\\">> class=\\\"tc-btn-invisible tc-btn-dropdown tc-small-gap\\\" tooltip={{$:/language/EditTemplate/Field/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Field/Dropdown/Caption}}>{{$:/core/images/down-arrow}}\u003C/$button>\\n\u003C$reveal state=\u003C\u003Cqualify \\\"$:/state/popup/field-dropdown\\\">> type=\\\"nomatch\\\" text=\\\"\\\" default=\\\"\\\">\\n\u003Cdiv class=\\\"tc-block-dropdown tc-edit-type-dropdown\\\">\\n\u003C$set name=\\\"tv-show-missing-links\\\" value=\\\"yes\\\">\\n\u003C$linkcatcher to=\u003C\u003CnewFieldNameTiddler>>>\\n\u003Cdiv class=\\\"tc-dropdown-item\\\">\\n\u003C\u003Clingo Fields/Add/Dropdown/User>>\\n\u003C/div>\\n\u003C$set name=\\\"newFieldName\\\" value={{{ [\u003CstoreTitle>get[text]] }}}>\\n\u003C$list filter=\\\"[!is[shadow]!is[system]fields[]search:title\u003CnewFieldName>sort[]] -created -creator -draft.of -draft.title -modified -modifier -tags -text -title -type\\\"  variable=\\\"currentField\\\">\\n\u003C$list filter=\\\"[\u003CcurrentField>addsuffix[-primaryList]] -[\u003CsearchListState>get[text]]\\\" emptyMessage=\\\"\\\"\\\"\u003C$link to=\u003C\u003CcurrentField>> class=\\\"tc-list-item-selected\\\">\u003C$text text=\u003C\u003CcurrentField>>/>\u003C/$link>\\\"\\\"\\\">\\n\u003C$link to=\u003C\u003CcurrentField>>>\\n\u003C$text text=\u003C\u003CcurrentField>>/>\\n\u003C/$link>\\n\u003C/$list>\\n\u003C/$list>\\n\u003Cdiv class=\\\"tc-dropdown-item\\\">\\n\u003C\u003Clingo Fields/Add/Dropdown/System>>\\n\u003C/div>\\n\u003C$list filter=\\\"[fields[]search:title\u003CnewFieldName>sort[]] -[!is[shadow]!is[system]fields[]]\\\" variable=\\\"currentField\\\">\\n\u003C$list filter=\\\"[\u003CcurrentField>addsuffix[-secondaryList]] -[\u003CsearchListState>get[text]]\\\" emptyMessage=\\\"\\\"\\\"\u003C$link to=\u003C\u003CcurrentField>> class=\\\"tc-list-item-selected\\\">\u003C$text text=\u003C\u003CcurrentField>>/>\u003C/$link>\\\"\\\"\\\">\\n\u003C$link to=\u003C\u003CcurrentField>>>\\n\u003C$text text=\u003C\u003CcurrentField>>/>\\n\u003C/$link>\\n\u003C/$list>\\n\u003C/$list>\\n\u003C/$set>\\n\u003C/$linkcatcher>\\n\u003C/$set>\\n\u003C/div>\\n\u003C/$reveal>\\n\u003C/div>\\n\u003C$let currentTiddlerCSSescaped={{{ [\u003CcurrentTiddler>escapecss[]] }}} currentTiddler={{{ [subfilter\u003Cget-field-value-tiddler-filter>] }}} currentField=\\\"text\\\" currentFieldName={{{ [\u003CnewFieldNameTiddler>get[text]] }}}>\\n\u003Cspan class=\\\"tc-edit-field-add-value tc-small-gap-right\\\">\\n\u003C$keyboard key=\\\"((add-field))\\\" actions=\u003C\u003Cnew-field-actions>>>\\n\u003C$transclude tiddler={{{ [subfilter\u003Cget-field-editor-filter>] }}} />\\n\u003C/$keyboard>\\n\u003C/span>\\n\u003Cspan class=\\\"tc-edit-field-add-button\\\">\\n\u003C$macrocall $name=\\\"new-field\\\"/>\\n\u003C/span>\\n\u003C/$let>\\n\u003C/$vars>\\n\u003C/div>\\n\u003C/$fieldmangler>\\n\u003C/$set>\"},\"$:/core/ui/EditTemplate/shadow\":{\"title\":\"$:/core/ui/EditTemplate/shadow\",\"tags\":\"$:/tags/EditTemplate\",\"text\":\"\\\\define lingo-base() $:/language/EditTemplate/Shadow/\\n\\\\define pluginLinkBody()\\n\\\\whitespace trim\\n\u003C$link to=\\\"\\\"\\\"$(pluginTitle)$\\\"\\\"\\\">\\n\u003C$text text=\\\"\\\"\\\"$(pluginTitle)$\\\"\\\"\\\"/>\\n\u003C/$link>\\n\\\\end\\n\\\\whitespace trim\\n\u003C$list filter=\\\"[all[current]get[draft.of]is[shadow]!is[tiddler]]\\\">\\n\\n\u003C$list filter=\\\"[all[current]shadowsource[]]\\\" variable=\\\"pluginTitle\\\">\\n\\n\u003C$set name=\\\"pluginLink\\\" value=\u003C\u003CpluginLinkBody>>>\\n\u003Cdiv class=\\\"tc-message-box\\\">\\n\\n\u003C\u003Clingo Warning>>
2731\\n\\n\u003C/div>\\n\u003C/$set>\\n\u003C/$list>\\n\\n\u003C/$list>\\n\\n\u003C$list filter=\\\"[all[current]get[draft.of]is[shadow]is[tiddler]]\\\">\\n\\n\u003C$list filter=\\\"[all[current]shadowsource[]]\\\" variable=\\\"pluginTitle\\\">\\n\\n\u003C$set name=\\\"pluginLink\\\" value=\u003C\u003CpluginLinkBody>>>\\n\u003Cdiv class=\\\"tc-message-box\\\">\\n\\n\u003C\u003Clingo OverriddenWarning>>\\n\\n\u003C/div>\\n\u003C/$set>\\n\u003C/$list>\\n\\n\u003C/$list>\"},\"$:/core/ui/EditTemplate/tags\":{\"title\":\"$:/core/ui/EditTemplate/tags\",\"tags\":\"$:/tags/EditTemplate\",\"text\":\"\\\\whitespace trim\\n\\n\\\\define lingo-base() $:/language/EditTemplate/\\n\\n\\\\define tag-styles()\\nbackground-color:$(backgroundColor)$;\\nfill:$(foregroundColor)$;\\ncolor:$(foregroundColor)$;\\n\\\\end\\n\\n\\\\define tag-body-inner(colour,fallbackTarget,colourA,colourB,icon,tagField:\\\"tags\\\")\\n\\\\whitespace trim\\n\u003C$vars foregroundColor=\u003C\u003Ccontrastcolour target:\\\"\\\"\\\"$colour$\\\"\\\"\\\" fallbackTarget:\\\"\\\"\\\"$fallbackTarget$\\\"\\\"\\\" colourA:\\\"\\\"\\\"$colourA$\\\"\\\"\\\" colourB:\\\"\\\"\\\"$colourB$\\\"\\\"\\\">> backgroundColor=\\\"\\\"\\\"$colour$\\\"\\\"\\\">\\n\u003Cspan style=\u003C\u003Ctag-styles>> class=\\\"tc-tag-label tc-tag-list-item tc-small-gap-right\\\" data-tag-title=\u003C\u003CcurrentTiddler>>>\\n\u003C$transclude tiddler=\\\"\\\"\\\"$icon$\\\"\\\"\\\"/>\u003C$view field=\\\"title\\\" format=\\\"text\\\"/>\\n\u003C$button class=\\\"tc-btn-invisible tc-remove-tag-button\\\" style=\u003C\u003Ctag-styles>>>\u003C$action-listops $tiddler=\u003C\u003CsaveTiddler>> $field=\u003C\u003C__tagField__>> $subfilter=\\\"-[{!!title}]\\\"/>{{$:/core/images/close-button}}\u003C/$button>\\n\u003C/span>\\n\u003C/$vars>\\n\\\\end\\n\\n\\\\define tag-body(colour,palette,icon,tagField:\\\"tags\\\")\\n\u003C$macrocall $name=\\\"tag-body-inner\\\" colour=\\\"\\\"\\\"$colour$\\\"\\\"\\\" fallbackTarget={{$palette$##tag-background}} colourA={{$palette$##foreground}} colourB={{$palette$##background}} icon=\\\"\\\"\\\"$icon$\\\"\\\"\\\" tagField=\u003C\u003C__tagField__>>/>\\n\\\\end\\n\\n\\\\define edit-tags-template(tagField:\\\"tags\\\")\\n\\\\whitespace trim\\n\u003Cdiv class=\\\"tc-edit-tags\\\">\\n\u003C$list filter=\\\"[list[!!$tagField$]sort[title]]\\\" storyview=\\\"pop\\\">\\n\u003C$macrocall $name=\\\"tag-body\\\" colour={{{ [\u003CcurrentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerColourFilter]!is[draft]get[text]] }}} palette={{$:/palette}} icon={{{ [\u003CcurrentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerIconFilter]!is[draft]get[text]] }}} tagField=\u003C\u003C__tagField__>>/>\\n\u003C/$list>\\n\u003C$vars tabIndex={{$:/config/EditTabIndex}} cancelPopups=\\\"yes\\\">\\n\u003C$macrocall $name=\\\"tag-picker\\\" tagField=\u003C\u003C__tagField__>>/>\\n\u003C/$vars>\\n\u003C/div>\\n\\\\end\\n\u003C$set name=\\\"saveTiddler\\\" value=\u003C\u003CcurrentTiddler>>>\\n\u003C$macrocall $name=\\\"edit-tags-template\\\" tagField=\u003C\u003CtagField>>/>\\n\u003C/$set>\\n\"},\"$:/core/ui/EditTemplate/title\":{\"title\":\"$:/core/ui/EditTemplate/title\",\"tags\":\"$:/tags/EditTemplate\",\"text\":\"\\\\whitespace trim\\n\u003C$edit-text field=\\\"draft.title\\\" class=\\\"tc-titlebar tc-edit-texteditor\\\" focus={{{ [{$:/config/AutoFocus}match[title]then[true]] ~[[false]] }}} tabindex={{$:/config/EditTabIndex}} cancelPopups=\\\"yes\\\"/>\\n\\n\u003C$vars pattern=\\\"\\\"\\\"[\\\\|\\\\[\\\\]{}]\\\"\\\"\\\" bad-chars=\\\"\\\"\\\"`| [ ] { }`\\\"\\\"\\\">\\n\\n\u003C$list filter=\\\"[all[current]regexp:draft.title\u003Cpattern>]\\\" variable=\\\"listItem\\\">\\n\\n\u003Cdiv class=\\\"tc-message-box\\\">\\n\\n{{$:/core/images/warning}}&#32;{{$:/language/EditTemplate/Title/BadCharacterWarning}}\\n\\n\u003C/div>\\n\\n\u003C/$list>\\n\\n\u003C/$vars>\\n\\n\u003C$reveal state=\\\"!!draft.title\\\" type=\\\"nomatch\\\" text={{!!draft.of}} tag=\\\"div\\\">\\n\\n\u003C$list filter=\\\"[{!!draft.title}!is[missing]]\\\" variable=\\\"listItem\\\">\\n\\n\u003Cdiv class=\\\"tc-message-box\\\">\\n\\n{{$:/core/images/warning}}&#32;{{$:/language/EditTemplate/Title/Exists/Prompt}}:&#32;\u003C$link to={{!!draft.title}} />\\n\\n\u003C/div>\\n\\n\u003C/$list>\\n\\n\u003C$list filter=\\\"[{!!draft.of}!is[missing]]\\\" variable=\\\"listItem\\\">\\n\\n\u003C$vars fromTitle={{!!draft.of}} toTitle={{!!draft.title}}>\\n\\n\u003C$checkbox tiddler=\\\"$:/config/RelinkOnRename\\\" field=\\\"text\\\" checked=\\\"yes\\\" unchecked=\\\"no\\\" default=\\\"no\\\">&#32;{{$:/language/EditTemplate/Title/Relink/Prompt}}\u003C/$checkbox>\\n\\n\u003C$list filter=\\\"[title\u003CfromTitle>backlinks[]limit[1]]\\\" variable=\\\"listItem\\\">\\n\\n\u003C$vars stateTiddler=\u003C\u003Cqualify \\\"$:/state/edit/references\\\">> >\\n\\n\u003C$reveal type=\\\"nomatch\\\" state=\u003C\u003CstateTiddler>> text=\\\"show\\\">\\n\u003C$button set=\u003C\u003CstateTiddler>> setTo=\\\"show\\\" class=\\\"tc-btn-invisible\\\">\\n{{$:/core/images/right-arrow}}\\n&#32;\\n\u003C\u003Clingo EditTemplate/Title/References/Prompt>>\u003C/$button>\\n\u003C/$reveal>\\n\u003C$reveal type=\\\"match\\\" state=\u003C\u003CstateTiddler>> text=\\\"show\\\">\\n\u003C$button set=\u003C\u003CstateTiddler>> setTo=\\\"hide\\\" class=\\\"tc-btn-invisible\\\">\\n{{$:/core/images/down-arrow}}\\n&#32;\\n\u003C\u003Clingo EditTemplate/Title/References/Prompt>>\u003C/$button>\\n\u003C/$reveal>\\n\\n\u003C$reveal type=\\\"match\\\" state=\u003C\u003CstateTiddler>> text=\\\"show\\\">\\n\u003C$tiddler tiddler=\u003C\u003CfromTitle>> >\\n\u003C$transclude tiddler=\\\"$:/core/ui/TiddlerInfo/References\\\"/>\\n\u003C/$tiddler>\\n\u003C/$reveal>\\n\\n\u003C/$vars>\\n\\n\u003C/$list>\\n\\n\u003C/$vars>\\n\\n\u003C/$list>\\n\\n\u003C/$reveal>\\n\"},\"$:/core/ui/EditTemplate/type\":{\"title\":\"$:/core/ui/EditTemplate/type\",\"tags\":\"$:/tags/EditTemplate\",\"first-search-filter\":\"[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]sort[description]sort[group-sort]removeprefix[$:/language/Docs/Types/]search\u003CuserInput>]\",\"text\":\"\\\\define lingo-base() $:/language/EditTemplate/\\n\\\\define input-cancel-actions() \u003C$list filter=\\\"[\u003CstoreTitle>get[text]] [\u003CcurrentTiddler>get[type]] +[limit[1]]\\\" emptyMessage=\\\"\\\"\\\"\u003C\u003Ccancel-delete-tiddler-actions \\\"cancel\\\">>\\\"\\\"\\\">\u003C$action-sendmessage $message=\\\"tm-remove-field\\\" $param=\\\"type\\\"/>
2731\u003C$action-deletetiddler $filter=\\\"[\u003CtypeInputTiddler>] [\u003CrefreshTitle>] [\u003CtypeSelectionTiddler>]\\\"/>\u003C/$list>\\n\\\\whitespace trim\\n\u003C$set name=\\\"refreshTitle\\\" value=\u003C\u003Cqualify \\\"$:/temp/type-search/refresh\\\">>>\\n\u003Cdiv class=\\\"tc-edit-type-selector-wrapper\\\">\\n\u003Cem class=\\\"tc-edit tc-small-gap-right\\\">\u003C\u003Clingo Type/Prompt>>\u003C/em>\\n\u003Cdiv class=\\\"tc-type-selector-dropdown-wrapper\\\">\\n\u003Cdiv class=\\\"tc-type-selector\\\">\u003C$fieldmangler>\\n\u003C$macrocall $name=\\\"keyboard-driven-input\\\" tiddler=\u003C\u003CcurrentTiddler>> storeTitle=\u003C\u003CtypeInputTiddler>> refreshTitle=\u003C\u003CrefreshTitle>> selectionStateTitle=\u003C\u003CtypeSelectionTiddler>> field=\\\"type\\\" tag=\\\"input\\\" default=\\\"\\\" placeholder={{$:/language/EditTemplate/Type/Placeholder}} focusPopup=\u003C\u003Cqualify \\\"$:/state/popup/type-dropdown\\\">> class=\\\"tc-edit-typeeditor tc-edit-texteditor tc-popup-handle\\\" tabindex={{$:/config/EditTabIndex}} focus={{{ [{$:/config/AutoFocus}match[type]then[true]] ~[[false]] }}} cancelPopups=\\\"yes\\\" configTiddlerFilter=\\\"[[$:/core/ui/EditTemplate/type]]\\\" inputCancelActions=\u003C\u003Cinput-cancel-actions>>/>\u003C$button popup=\u003C\u003Cqualify \\\"$:/state/popup/type-dropdown\\\">> class=\\\"tc-btn-invisible tc-btn-dropdown tc-small-gap\\\" tooltip={{$:/language/EditTemplate/Type/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Type/Dropdown/Caption}}>{{$:/core/images/down-arrow}}\u003C/$button>\u003C$button message=\\\"tm-remove-field\\\" param=\\\"type\\\" class=\\\"tc-btn-invisible tc-btn-icon\\\" tooltip={{$:/language/EditTemplate/Type/Delete/Hint}} aria-label={{$:/language/EditTemplate/Type/Delete/Caption}}>{{$:/core/images/delete-button}}\u003C$action-deletetiddler $filter=\\\"[\u003CstoreTitle>] [\u003CrefreshTitle>] [\u003CselectionStateTitle>]\\\"/>\u003C/$button>\\n\u003C/$fieldmangler>\u003C/div>\\n\\n\u003Cdiv class=\\\"tc-block-dropdown-wrapper\\\">\\n\u003C$set name=\\\"tv-show-missing-links\\\" value=\\\"yes\\\">\\n\u003C$reveal state=\u003C\u003Cqualify \\\"$:/state/popup/type-dropdown\\\">> type=\\\"nomatch\\\" text=\\\"\\\" default=\\\"\\\">\\n\u003Cdiv class=\\\"tc-block-dropdown tc-edit-type-dropdown\\\">\\n\u003C$linkcatcher to=\\\"!!type\\\">\\n\u003C$list filter='[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]each[group]sort[group-sort]]'>\\n\u003Cdiv class=\\\"tc-dropdown-item\\\">\\n\u003C$text text={{!!group}}/>\\n\u003C/div>\\n\u003C$set name=\\\"userInput\\\" value={{{ [\u003CtypeInputTiddler>get[text]] }}}>\\n\u003C$list filter=\\\"[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]group{!!group}] +[sort[description]] +[removeprefix[$:/language/Docs/Types/]] +[search\u003CuserInput>]\\\">\u003Cspan class={{{ [\u003CcurrentTiddler>addsuffix[-primaryList]] -[\u003CtypeSelectionTiddler>get[text]] +[then[]else[tc-list-item-selected]] }}}>\u003C$link to={{{ [\u003CcurrentTiddler>addprefix[$:/language/Docs/Types/]get[name]] }}}>\u003C$view tiddler={{{ [\u003CcurrentTiddler>addprefix[$:/language/Docs/Types/]] }}} field=\\\"description\\\"/>\u003C$text text=\\\" \\\"/>(\u003C$view tiddler={{{ [\u003CcurrentTiddler>addprefix[$:/language/Docs/Types/]] }}} field=\\\"name\\\"/>)\u003C/$link>\u003C/span>\\n\u003C/$list>\\n\u003C/$set>\\n\u003C/$list>\\n\u003C/$linkcatcher>\\n\u003C/div>\\n\u003C/$reveal>\\n\u003C/$set>\\n\u003C/div>\\n\u003C/div>\\n\u003C/div>\\n\u003C/$set>\\n\"},\"$:/core/ui/EditTemplate\":{\"title\":\"$:/core/ui/EditTemplate\",\"code-body\":\"yes\",\"text\":\"\\\\define delete-edittemplate-state-tiddlers()\\n\u003C$set name=\\\"safeNewFieldValueTiddlerPrefix\\\" value=\u003C\u003CnewFieldValueTiddlerPrefix>> emptyValue=\u003C\u003Cqualify \\\"$:/temp/NewFieldValue\\\">> >\\n\\t\u003C$action-deletetiddler $filter=\\\"[\u003CnewFieldNameTiddler>] [prefix[$:/temp/NewFieldValue]prefix\u003CsafeNewFieldValueTiddlerPrefix>] [\u003CnewFieldNameInputTiddler>] [\u003CnewFieldNameSelectionTiddler>] [\u003CnewTagNameTiddler>] [\u003CnewTagNameInputTiddler>] [\u003CnewTagNameSelectionTiddler>] [\u003CtypeInputTiddler>] [\u003CtypeSelectionTiddler>]\\\"/>\\n\u003C/$set>
2731\\n\\\\end\\n\\n\u003C!-- Beware this is duplicated from fields.tid. For details see bug #7054 -->\\n\\\\define get-field-value-tiddler-filter() [subfilter\u003Cget-field-editor-filter>sha256[16]addprefix[/]addprefix\u003CnewFieldValueTiddlerPrefix>]\\n\\\\define get-field-editor-filter() [\u003CnewFieldNameTiddler>get[text]else[]] :cascade[all[shadows+tiddlers]tag[$:/tags/FieldEditorFilter]!is[draft]get[text]] :and[!is[blank]else{$:/core/ui/EditTemplate/fieldEditor/default}]\\n\\n\\\\define save-tiddler-actions()\\n\\\\whitespace trim\\n\u003C$action-sendmessage $message=\\\"tm-add-tag\\\" $param={{{ [\u003CnewTagNameTiddler>get[text]] }}}/>\\n\u003C$action-sendmessage $message=\\\"tm-add-field\\\" $name={{{ [\u003CnewFieldNameTiddler>get[text]] }}} $value={{{ [\u003CnewFieldNameTiddler>get[text]] :map[subfilter\u003Cget-field-value-tiddler-filter>get[text]] }}}/>\\n\u003C\u003Cdelete-edittemplate-state-tiddlers>>\\n\u003C$action-sendmessage $message=\\\"tm-save-tiddler\\\"/>\\n\\\\end\\n\\n\\\\define cancel-delete-tiddler-actions(message)\\n\\\\whitespace trim\\n\u003C\u003Cdelete-edittemplate-state-tiddlers>>\\n\u003C$action-sendmessage $message=\\\"tm-$message$-tiddler\\\"/>\\n\\\\end\\n\\n\\\\whitespace trim\\n\u003Cdiv\\n\\tdata-tiddler-title=\u003C\u003CcurrentTiddler>>\\n\\tdata-tags={{!!tags}}\\n\\tclass={{{ [all[shadows+tiddlers]tag[$:/tags/ClassFilters/TiddlerTemplate]!is[draft]] :map:flat[subfilter{!!text}] tc-tiddler-frame tc-tiddler-edit-frame [\u003CcurrentTiddler>is[tiddler]then[tc-tiddler-exists]] [\u003CcurrentTiddler>is[missing]!is[shadow]then[tc-tiddler-missing]] [\u003CcurrentTiddler>is[shadow]then[tc-tiddler-exists tc-tiddler-shadow]] [\u003CcurrentTiddler>is[system]then[tc-tiddler-system]] [{!!class}] [\u003CcurrentTiddler>tags[]encodeuricomponent[]addprefix[tc-tagged-]] +[join[ ]] }}}\\n\\trole=\\\"region\\\"\\n\\taria-label={{$:/language/EditTemplate/Caption}}>\\n\u003C$fieldmangler>\\n\u003C$vars\\n\\tstoryTiddler=\u003C\u003CcurrentTiddler>>\\n\\tnewTagNameTiddler=\u003C\u003Cqualify \\\"$:/temp/NewTagName\\\">>\\n\\tnewFieldNameTiddler=\u003C\u003Cqualify \\\"$:/temp/NewFieldName\\\">>\\n\\tnewFieldValueTiddlerPrefix=\u003C\u003Cqualify \\\"$:/temp/NewFieldValue\\\">>\\n\\tnewFieldNameInputTiddler=\u003C\u003Cqualify \\\"$:/temp/NewFieldName/input\\\">>\\n\\tnewFieldNameSelectionTiddler=\u003C\u003Cqualify \\\"$:/temp/NewFieldName/selected-item\\\">>\\n\\tnewTagNameInputTiddler=\u003C\u003Cqualify \\\"$:/temp/NewTagName/input\\\">>\\n\\tnewTagNameSelectionTiddler=\u003C\u003Cqualify \\\"$:/temp/NewTagName/selected-item\\\">>\\n\\ttypeInputTiddler=\u003C\u003Cqualify \\\"$:/temp/Type/input\\\">>\\n\\ttypeSelectionTiddler=\u003C\u003Cqualify \\\"$:/temp/Type/selected-item\\\">>>\\n\u003C$keyboard key=\\\"((cancel-edit-tiddler))\\\" actions=\u003C\u003Ccancel-delete-tiddler-actions \\\"cancel\\\">> tag=\\\"div\\\">\\n\u003C$keyboard key=\\\"((save-tiddler))\\\" actions=\u003C\u003Csave-tiddler-actions>> tag=\\\"div\\\">\\n\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/EditTemplate]!has[draft.of]]\\\" variable=\\\"listItem\\\">\\n\u003C$transclude tiddler=\u003C\u003ClistItem>>/>\\n\u003C/$list>\\n\u003C/$keyboard>\\n\u003C/$keyboard>\\n\u003C/$vars>\\n\u003C/$fieldmangler>\\n\u003C/div>\\n\"},\"$:/core/ui/Buttons/cancel\":{\"title\":\"$:/core/ui/Buttons/cancel\",\"tags\":\"$:/tags/EditToolbar\",\"caption\":\"{{$:/core/images/cancel-button}} {{$:/language/Buttons/Cancel/Caption}}\",\"description\":\"{{$:/language/Buttons/Cancel/Hint}}\",\"text\":\"\\\\whitespace trim\\n\u003C$button actions=\u003C\u003Ccancel-delete-tiddler-actions \\\"cancel\\\">> tooltip={{$:/language/Buttons/Cancel/Hint}} aria-label={{$:/language/Buttons/Cancel/Caption}} class=\u003C\u003Ctv-config-toolbar-class>>>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/cancel-button}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\u003C$text text={{$:/language/Buttons/Cancel/Caption}}/>\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\\n\"},\"$:/core/ui/Buttons/delete\":{\"title\":\"$:/core/ui/Buttons/delete\",\"tags\":\"$:/tags/EditToolbar $:/tags/ViewToolbar\",\"caption\":\"{{$:/core/images/delete-button}} {{$:/language/Buttons/Delete/Caption}}\",\"description\":\"{{$:/language/Buttons/Delete/Hint}}\",\"text\":\"\\\\whitespace trim\\n\u003C$button actions=\u003C\u003Ccancel-delete-tiddler-actions \\\"delete\\\">> tooltip={{$:/language/Buttons/Delete/Hint}} aria-label={{$:/language/Buttons/Delete/Caption}} class=\u003C\u003Ctv-config-toolbar-class>>>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/delete-button}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\u003C$text text={{$:/language/Buttons/Delete/Caption}}/>\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\\n\"},\"$:/core/ui/Buttons/save\":{\"title\":\"$:/core/ui/Buttons/save\",\"tags\":\"$:/tags/EditToolbar\",\"caption\":\"{{$:/core/images/done-button}} {{$:/language/Buttons/Save/Caption}}\",\"description\":\"{{$:/language/Buttons/Save/Hint}}\",\"text\":\"\\\\whitespace trim\\n\\\\define save-tiddler-button()\\n\\\\whitespace trim\\n\u003C$fieldmangler>\\n\\t\u003C$button\\n\\t\\ttooltip={{$:/language/Buttons/Save/Hint}}\\n\\t\\taria-label={{$:/language/Buttons/Save/Caption}}\\n\\t\\tclass=\u003C\u003Ctv-config-toolbar-class>>\\n\\t>\\n\\t\\t\u003C\u003Csave-tiddler-actions>>\\n\\t\\t\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n\\t\\t\\t{{$:/core/images/done-button}}\\n\\t\\t\u003C/$list>\\n\\t\\t\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\\t\\t\\t\u003Cspan class=\\\"tc-btn-text\\\">\u003C$text text={{$:/language/Buttons/Save/Caption}}/>\u003C/span>\\n\\t\\t\u003C/$list>\\n\\t\u003C/$button>\\n\u003C/$fieldmangler>\\n\\\\end\\n\u003C\u003Csave-tiddler-button>>\\n\"},\"$:/core/ui/EditorToolbar/bold\":{\"title\":\"$:/core/ui/EditorToolbar/bold\",\"tags\":\"$:/tags/EditorToolbar\",\"icon\":\"$:
2731/core/images/bold\",\"caption\":\"{{$:/language/Buttons/Bold/Caption}}\",\"description\":\"{{$:/language/Buttons/Bold/Hint}}\",\"condition\":\"[\u003CtargetTiddler>!has[type]] [\u003CtargetTiddler>type[text/vnd.tiddlywiki]]\",\"shortcuts\":\"((bold))\",\"text\":\"\u003C$action-sendmessage\\n\\t$message=\\\"tm-edit-text-operation\\\"\\n\\t$param=\\\"wrap-selection\\\"\\n\\tprefix=\\\"''\\\"\\n\\tsuffix=\\\"''\\\"\\n/>\\n\"},\"$:/core/ui/EditorToolbar/clear-dropdown\":{\"title\":\"$:/core/ui/EditorToolbar/clear-dropdown\",\"text\":\"''{{$:/language/Buttons/Clear/Hint}}''\\n\\n\u003Cdiv class=\\\"tc-colour-chooser\\\">\\n\\n\u003C$macrocall $name=\\\"colour-picker\\\" actions=\\\"\\\"\\\"\\n\\n\u003C$action-sendmessage\\n\\t$message=\\\"tm-edit-bitmap-operation\\\"\\n\\t$param=\\\"clear\\\"\\n\\tcolour=\u003C\u003Ccolour-picker-value>>\\n/>\\n\\n\u003C$action-deletetiddler\\n\\t$tiddler=\u003C\u003Cdropdown-state>>\\n/>\\n\\n\\\"\\\"\\\"/>\\n\\n\u003C/div>\\n\"},\"$:/core/ui/EditorToolbar/clear\":{\"title\":\"$:/core/ui/EditorToolbar/clear\",\"tags\":\"$:/tags/EditorToolbar\",\"icon\":\"$:/core/images/erase\",\"caption\":\"{{$:/language/Buttons/Clear/Caption}}\",\"description\":\"{{$:/language/Buttons/Clear/Hint}}\",\"condition\":\"[\u003CtargetTiddler>is[image]] -[\u003CtargetTiddler>type[image/svg+xml]]\",\"dropdown\":\"$:/core/ui/EditorToolbar/clear-dropdown\",\"text\":\"\"},\"$:/core/ui/EditorToolbar/editor-height-dropdown\":{\"title\":\"$:/core/ui/EditorToolbar/editor-height-dropdown\",\"text\":\"\\\\define lingo-base() $:/language/Buttons/EditorHeight/\\n''\u003C\u003Clingo Hint>>''\\n\\n\u003C$radio tiddler=\\\"$:/config/TextEditor/EditorHeight/Mode\\\" value=\\\"auto\\\"> {{$:/core/images/auto-height}} \u003C\u003Clingo Caption/Auto>>\u003C/$radio>\\n\\n\u003C$radio tiddler=\\\"$:/config/TextEditor/EditorHeight/Mode\\\" value=\\\"fixed\\\"> {{$:/core/images/fixed-height}} \u003C\u003Clingo Caption/Fixed>> \u003C$edit-text tag=\\\"input\\\" tiddler=\\\"$:/config/TextEditor/EditorHeight/Height\\\" default=\\\"100px\\\"/>\u003C/$radio>\\n\"},\"$:/core/ui/EditorToolbar/editor-height\":{\"title\":\"$:/core/ui/EditorToolbar/editor-height\",\"tags\":\"$:/tags/EditorToolbar\",\"icon\":\"$:/core/images/fixed-height\",\"custom-icon\":\"yes\",\"caption\":\"{{$:/language/Buttons/EditorHeight/Caption}}\",\"description\":\"{{$:/language/Buttons/EditorHeight/Hint}}\",\"condition\":\"[\u003CtargetTiddler>type[]] [\u003CtargetTiddler>get[type]prefix[text/]] [\u003CtargetTiddler>get[type]match[application/javascript]] [\u003CtargetTiddler>get[type]match[application/json]] [\u003CtargetTiddler>get[type]match[application/x-tiddler-dictionary]] [\u003CtargetTiddler>get[type]match[image/svg+xml]] +[first[]]\",\"dropdown\":\"$:/core/ui/EditorToolbar/editor-height-dropdown\",\"text\":\"\\\\whitespace trim\\n\u003C$reveal tag=\\\"span\\\" state=\\\"$:/config/TextEditor/EditorHeight/Mode\\\" type=\\\"match\\\" text=\\\"fixed\\\">\\n{{$:/core/images/fixed-height}}\\n\u003C/$reveal>\\n\u003C$reveal tag=\\\"span\\\" state=\\\"$:/config/TextEditor/EditorHeight/Mode\\\" type=\\\"match\\\" text=\\\"auto\\\">\\n{{$:/core/images/auto-height}}\\n\u003C/$reveal>\\n\"},\"$:/core/ui/EditorToolbar/excise-dropdown\":{\"title\":\"$:/core/ui/EditorToolbar/excise-dropdown\",\"text\":\"\\\\define lingo-base() $:/language/Buttons/Excise/\\n\\n\\\\define body(config-title)\\n\\\\whitespace trim\\n''\u003C\u003Clingo Hint>>''\\n\\n\u003C\u003Clingo Caption/NewTitle>>&#32;\u003C$edit-text tag=\\\"input\\\" tiddler=\\\"$config-title$/new-title\\\" default=\\\"\\\" focus=\\\"true\\\"/>\\n\\n\u003C$set name=\\\"new-title\\\" value={{$config-title$/new-title}}>\\n\u003C$list filter=\\\"\\\"\\\"[\u003Cnew-title>is[tiddler]]\\\"\\\"\\\">\\n\u003Cdiv class=\\\"tc-error\\\">\\n\u003C\u003Clingo Caption/TiddlerExists>>\\n\u003C/div>\\n\u003C/$list>\\n\u003C/$set>\\n\\n\u003C$checkbox tiddler=\\\"\\\"\\\"$config-title$/tagnew\\\"\\\"\\\" field=\\\"text\\\" checked=\\\"yes\\\" unchecked=\\\"no\\\" default=\\\"false\\\">&#32;\u003C\u003Clingo Caption/Tag>>\u003C/$checkbox>\\n\\n\u003C\u003Clingo Caption/Replace>>&#32;\u003C$select tiddler=\\\"\\\"\\\"$config-title$/type\\\"\\\"\\\" default=\\\"transclude\\\">\\n\u003Coption value=\\\"link\\\">\u003C\u003Clingo Caption/Replace/Link>>\u003C/option>\\n\u003Coption value=\\\"transclude\\\">\u003C\u003Clingo Caption/Replace/Transclusion>>\u003C/option>\\n\u003Coption value=\\\"macro\\\">\u003C\u003Clingo Caption/Replace/Macro>>\u003C/option>\\n\u003C/$select>\\n\\n\u003C$reveal state=\\\"\\\"\\\"$config-title$/type\\\"\\\"\\\" type=\\\"match\\\" text=\\\"macro\\\">\\n\u003C\u003Clingo Caption/MacroName>>&#32;\u003C$edit-text tag=\\\"input\\\" tiddler=\\\"\\\"\\\"$config-title$/macro-title\\\"\\\"\\\" default=\\\"translink\\\"/>\\n\u003C/$reveal>\\n\\n\u003C$button>\\n\u003C$action-sendmessage\\n\\t$message=\\\"tm-edit-text-operation\\\"\\n\\t$param=\\\"excise\\\"\\n\\ttitle={{$config-title$/new-title}}\\n\\ttype={{$config-title$/type}}\\n\\tmacro={{$config-title$/macro-title}}\\n\\ttagnew={{$config-title$/tagnew}}\\n/>\\n\u003C$action-deletetiddler\\n\\t$tiddler=\\\"$config-title$/new-title\\\"\\n/>\\n\u003C$action-deletetiddler\\n\\t$tiddler=\u003C\u003Cdropdown-state>>
2731\\n/>\\n\u003C\u003Clingo Caption/Excise>>\\n\u003C/$button>\\n\\\\end\\n\\n\u003C$macrocall $name=\\\"body\\\" config-title=\u003C\u003Cqualify \\\"$:/state/Excise/\\\">>/>\\n\"},\"$:/core/ui/EditorToolbar/excise\":{\"title\":\"$:/core/ui/EditorToolbar/excise\",\"tags\":\"$:/tags/EditorToolbar\",\"icon\":\"$:/core/images/excise\",\"caption\":\"{{$:/language/Buttons/Excise/Caption}}\",\"description\":\"{{$:/language/Buttons/Excise/Hint}}\",\"condition\":\"[\u003CtargetTiddler>type[]] [\u003CtargetTiddler>type[text/vnd.tiddlywiki]] +[first[]]\",\"shortcuts\":\"((excise))\",\"dropdown\":\"$:/core/ui/EditorToolbar/excise-dropdown\",\"text\":\"\"},\"$:/core/ui/EditorToolbar/file-import\":{\"title\":\"$:/core/ui/EditorToolbar/file-import\",\"tags\":\"$:/tags/EditorTools\",\"condition\":\"[\u003CtargetTiddler>!has[type]] [\u003CtargetTiddler>type[text/vnd.tiddlywiki]]\",\"text\":\"\\\\define lingo-base() $:/language/Import/\\n\\n\\\\define closePopupActions()\\n\u003C$action-deletetiddler $filter=\\\"[title\u003CimportState>] [title\u003CimportTitle>]\\\"/>\\n\\\\end\\n\\n\\\\define replacement-text-image() [img[$title$]]\\n\\n\\\\define replacement-text-file() [[$title$]]\\n\\n\\\\define postImportActions()\\n\\\\whitespace trim\\n\u003C$list filter=\\\"[\u003CimportTitle>links[]] :reduce[get[type]prefix[image]then\u003Creplacement-text-image>else\u003Creplacement-text-file>search-replace[$title$],\u003CcurrentTiddler>addprefix\u003Caccumulator>]\\\" variable=\\\"imageTitle\\\">\\n\u003C$action-sendmessage\\n\\t$message=\\\"tm-edit-text-operation\\\"\\n\\t$param=\\\"insert-text\\\"\\n\\ttext=\u003C\u003CimageTitle>>\\n/>\\n\u003C/$list>\\n\u003C\u003CclosePopupActions>>\\n\\\\end\\n\\n\\\\define buttons()\\n\\\\whitespace trim\\n\u003C$button class=\\\"tc-btn-invisible\\\" actions=\u003C\u003CclosePopupActions>> >\u003C\u003Clingo Listing/Cancel/Caption>>\u003C/$button>\\n&#32;\\n\u003C$button class=\\\"tc-btn-invisible\\\" message=\\\"tm-perform-import\\\" param=\u003C\u003CimportTitle>> actions=\u003C\u003CpostImportActions>> >\u003C\u003Clingo Listing/Import/Caption>>\u003C/$button>\\n\\\\end\\n\\n\\\\whitespace trim\\n\u003C$reveal type=\\\"popup\\\" state=\u003C\u003CimportState>> tag=\\\"div\\\" class=\\\"tc-editor-importpopup\\\">\\n\u003Cdiv class=\\\"tc-editor-import\\\">\\n\u003C$list filter=\\\"[\u003CimportTitle>field:plugin-type[import]]\\\">\\n\u003Ch2>\u003C\u003Clingo Editor/Import/Heading>>\u003C/h2>\\n\u003C$tiddler tiddler=\u003C\u003CimportTitle>>>\\n{{||$:/core/ui/ImportListing}}\\n\u003C\u003Cbuttons>>\\n\u003C/$tiddler>\\n\u003C/$list>\\n\u003C/div>\\n\u003C/$reveal>\\n\"},\"$:/core/ui/EditorToolbar/heading-1\":{\"title\":\"$:/core/ui/EditorToolbar/heading-1\",\"tags\":\"$:/tags/EditorToolbar\",\"icon\":\"$:/core/images/heading-1\",\"caption\":\"{{$:/language/Buttons/Heading1/Caption}}\",\"description\":\"{{$:/language/Buttons/Heading1/Hint}}\",\"condition\":\"[\u003CtargetTiddler>!has[type]] [\u003CtargetTiddler>type[text/vnd.tiddlywiki]]\",\"button-classes\":\"tc-text-editor-toolbar-item-start-group\",\"shortcuts\":\"((heading-1))\",\"text\":\"\u003C$action-sendmessage\\n\\t$message=\\\"tm-edit-text-operation\\\"\\n\\t$param=\\\"prefix-lines\\\"\\n\\tcharacter=\\\"!\\\"\\n\\tcount=\\\"1\\\"\\n/>\\n\"},\"$:/core/ui/EditorToolbar/heading-2\":{\"title\":\"$:/core/ui/EditorToolbar/heading-2\",\"tags\":\"$:/tags/EditorToolbar\",\"icon\":\"$:/core/images/heading-2\",\"caption\":\"{{$:/language/Buttons/Heading2/Caption}}\",\"description\":\"{{$:/language/Buttons/Heading2/Hint}}\",\"condition\":\"[\u003CtargetTiddler>!has[type]] [\u003CtargetTiddler>type[text/vnd.tiddlywiki]]\",\"shortcuts\":\"((heading-2))\",\"text\":\"\u003C$action-sendmessage\\n\\t$message=\\\"tm-edit-text-operation\\\"\\n\\t$param=\\\"prefix-lines\\\"\\n\\tcharacter=\\\"!\\\"\\n\\tcount=\\\"2\\\"\\n/>\\n\"},\"$:/core/ui/EditorToolbar/heading-3\":{\"title\":\"$:/core/ui/EditorToolbar/heading-3\",\"tags\":\"$:/tags/EditorToolbar\",\"icon\":\"$:/core/images/heading-3\",\"caption\":\"{{$:/language/Buttons/Heading3/Caption}}\",\"description\":\"{{$:/language/Buttons/Heading3/Hint}}\",\"condition\":\"[\u003CtargetTiddler>!has[type]] [\u003CtargetTiddler>type[text/vnd.tiddlywiki]]\",\"shortcuts\":\"((heading-3))\",\"text\":\"\u003C$action-sendmessage\\n\\t$message=\\\"tm-edit-text-operation\\\"\\n\\t$param=\\\"prefix-lines\\\"\\n\\tcharacter=\\\"!\\\"\\n\\tcount=\\\"3\\\"\\n/>\\n\"}
2731,\"$:/core/ui/EditorToolbar/heading-4\":{\"title\":\"$:/core/ui/EditorToolbar/heading-4\",\"tags\":\"$:/tags/EditorToolbar\",\"icon\":\"$:/core/images/heading-4\",\"caption\":\"{{$:/language/Buttons/Heading4/Caption}}\",\"description\":\"{{$:/language/Buttons/Heading4/Hint}}\",\"condition\":\"[\u003CtargetTiddler>!has[type]] [\u003CtargetTiddler>type[text/vnd.tiddlywiki]]\",\"shortcuts\":\"((heading-4))\",\"text\":\"\u003C$action-sendmessage\\n\\t$message=\\\"tm-edit-text-operation\\\"\\n\\t$param=\\\"prefix-lines\\\"\\n\\tcharacter=\\\"!\\\"\\n\\tcount=\\\"4\\\"\\n/>\\n\"},\"$:/core/ui/EditorToolbar/heading-5\":{\"title\":\"$:/core/ui/EditorToolbar/heading-5\",\"tags\":\"$:/tags/EditorToolbar\",\"icon\":\"$:/core/images/heading-5\",\"caption\":\"{{$:/language/Buttons/Heading5/Caption}}\",\"description\":\"{{$:/language/Buttons/Heading5/Hint}}\",\"condition\":\"[\u003CtargetTiddler>!has[type]] [\u003CtargetTiddler>type[text/vnd.tiddlywiki]]\",\"shortcuts\":\"((heading-5))\",\"text\":\"\u003C$action-sendmessage\\n\\t$message=\\\"tm-edit-text-operation\\\"\\n\\t$param=\\\"prefix-lines\\\"\\n\\tcharacter=\\\"!\\\"\\n\\tcount=\\\"5\\\"\\n/>\\n\"},\"$:/core/ui/EditorToolbar/heading-6\":{\"title\":\"$:/core/ui/EditorToolbar/heading-6\",\"tags\":\"$:/tags/EditorToolbar\",\"icon\":\"$:/core/images/heading-6\",\"caption\":\"{{$:/language/Buttons/Heading6/Caption}}\",\"description\":\"{{$:/language/Buttons/Heading6/Hint}}\",\"condition\":\"[\u003CtargetTiddler>!has[type]] [\u003CtargetTiddler>type[text/vnd.tiddlywiki]]\",\"shortcuts\":\"((heading-6))\",\"text\":\"\u003C$action-sendmessage\\n\\t$message=\\\"tm-edit-text-operation\\\"\\n\\t$param=\\\"prefix-lines\\\"\\n\\tcharacter=\\\"!\\\"\\n\\tcount=\\\"6\\\"\\n/>\\n\"},\"$:/core/ui/EditorToolbar/italic\":{\"title\":\"$:/core/ui/EditorToolbar/italic\",\"tags\":\"$:/tags/EditorToolbar\",\"icon\":\"$:/core/images/italic\",\"caption\":\"{{$:/language/Buttons/Italic/Caption}}\",\"description\":\"{{$:/language/Buttons/Italic/Hint}}\",\"condition\":\"[\u003CtargetTiddler>!has[type]] [\u003CtargetTiddler>type[text/vnd.tiddlywiki]]\",\"shortcuts\":\"((italic))\",\"text\":\"\u003C$action-sendmessage\\n\\t$message=\\\"tm-edit-text-operation\\\"\\n\\t$param=\\\"wrap-selection\\\"\\n\\tprefix=\\\"//\\\"\\n\\tsuffix=\\\"//\\\"\\n/>\\n\"},\"$:/core/ui/EditorToolbar/line-width-dropdown\":{\"title\":\"$:/core/ui/EditorToolbar/line-width-dropdown\",\"text\":\"\\\\define lingo-base() $:/language/Buttons/LineWidth/\\n\\n\\\\define toolbar-line-width-inner()\\n\u003C$button tag=\\\"a\\\" tooltip=\\\"\\\"\\\"$(line-width)$\\\"\\\"\\\">\\n\\n\u003C$action-setfield\\n\\t$tiddler=\\\"$:/config/BitmapEditor/LineWidth\\\"\\n\\t$value=\\\"$(line-width)$\\\"\\n/>\\n\\n\u003C$action-deletetiddler\\n\\t$tiddler=\u003C\u003Cdropdown-state>>\\n/>\\n\\n\u003Cdiv style=\\\"display: inline-block; margin: 4px calc(80px - $(line-width)$); background-color: #000; width: calc(100px + $(line-width)$ * 2); height: $(line-width)$; border-radius: 120px; vertical-align: middle;\\\"/>\\n\\n\u003Cspan style=\\\"margin-left: 8px;\\\">\\n\\n\u003C$text text=\\\"\\\"\\\"$(line-width)$\\\"\\\"\\\"/>\\n\\n\u003C$reveal state=\\\"$:/config/BitmapEditor/LineWidth\\\" type=\\\"match\\\" text=\\\"\\\"\\\"$(line-width)$\\\"\\\"\\\" tag=\\\"span\\\">\\n\\n\u003C$entity entity=\\\"&nbsp;\\\"/>\\n\\n\u003C$entity entity=\\\"&#x2713;\\\"/>\\n\\n\u003C/$reveal>\\n\\n\u003C/span>\\n\\n\u003C/$button>\\n\\\\end\\n\\n''\u003C\u003Clingo Hint>>''\\n\\n\u003C$list filter={{$:/config/BitmapEditor/LineWidths}} variable=\\\"line-width\\\">\\n\\n\u003C\u003Ctoolbar-line-width-inner>>\\n\\n\u003C/$list>\\n\"},\"$:/core/ui/EditorToolbar/line-width\":{\"title\":\"$:/core/ui/EditorToolbar/line-width\",\"tags\":\"$:/tags/EditorToolbar\",\"icon\":\"$:/core/images/line-width\",\"caption\":\"{{$:/language/Buttons/LineWidth/Caption}}\",\"description\":\"{{$:/language/Buttons/LineWidth/Hint}}\",\"condition\":\"[\u003CtargetTiddler>is[image]] -[\u003CtargetTiddler>type[image/svg+xml]]\",\"dropdown\":\"$:/core/ui/EditorToolbar/line-width-dropdown\",\"text\":\"\u003C$text text={{$:/config/BitmapEditor/LineWidth}}/>\\n\"},\"$:/core/ui/EditorToolbar/link-dropdown\":{\"title\":\"$:/core/ui/EditorToolbar/link-dropdown\",\"text\":\"\\\\define lingo-base() $:/language/Buttons/Link/\\n\\n\\\\define add-link-actions()\\n\\\\whitespace trim\\n\u003C$action-sendmessage $message=\\\"tm-edit-text-operation\\\" $param=\\\"make-link\\\" text={{$(linkTiddler)$}} />
2731\\n\u003C$action-deletetiddler $filter=\\\"[\u003Cdropdown-state>] [\u003CsearchTiddler>] [\u003ClinkTiddler>] [\u003CstoreTitle>] [\u003CsearchListState>]\\\"/>\\n\\\\end\\n\\n\\\\define get-focus-selector() [data-tiddler-title=\\\"$(cssEscapedTitle)$\\\"] .tc-create-wikitext-link input\\n\\n\\\\define cancel-search-actions-inner()\\n\u003C$set name=\\\"userInput\\\" value={{{ [\u003CstoreTitle>get[text]] }}}>\u003C$list filter=\\\"[\u003CsearchTiddler>get[text]!match\u003CuserInput>]\\\" emptyMessage=\\\"\u003C$action-deletetiddler $filter='[\u003CsearchTiddler>] [\u003ClinkTiddler>] [\u003CstoreTitle>] [\u003CsearchListState>]'/>\\\">\u003C$action-setfield $tiddler=\u003C\u003CsearchTiddler>> text=\u003C\u003CuserInput>>/>\u003C$action-setfield $tiddler=\u003C\u003CrefreshTitle>> text=\\\"yes\\\"/>\u003C/$list>\u003C/$set>\\n\\\\end\\n\\n\\\\define cancel-search-actions() \u003C$list filter=\\\"[\u003CstoreTitle>!has[text]] +[\u003CsearchTiddler>!has[text]]\\\" emptyMessage=\\\"\u003C\u003Ccancel-search-actions-inner>>\\\">\u003C$action-sendmessage $message=\\\"tm-edit-text-operation\\\" $param=\\\"focus-editor\\\"/>\u003C/$list>\\n\\n\\\\define external-link()\\n\\\\whitespace trim\\n\u003C$button class=\\\"tc-btn-invisible tc-btn-mini\\\" style=\\\"width: auto; display: inline-block; background-colour: inherit;\\\" actions=\u003C\u003Cadd-link-actions>>>\\n{{$:/core/images/chevron-right}}\\n\u003C/$button>\\n\\\\end\\n\\n\\\\define set-next-input-tab(beforeafter:\\\"after\\\") \u003C$macrocall $name=\\\"change-input-tab\\\" stateTitle=\\\"$:/state/tab/search-results/sidebar\\\" tag=\\\"$:/tags/SearchResults\\\" beforeafter=\\\"$beforeafter$\\\" defaultState={{$:/config/SearchResults/Default}} actions=\\\"\u003C$action-setfield $tiddler='$:/state/search/currentTab' text=\u003C\u003CnextTab>>/>\\\"/>\\n\\n\\\\define body(config-title)\\n\\\\whitespace trim\\n''\u003C\u003Clingo Hint>>''\\n\\n\u003C$vars searchTiddler=\\\"\\\"\\\"$config-title$/search\\\"\\\"\\\" linkTiddler=\\\"\\\"\\\"$config-title$/link\\\"\\\"\\\" linktext=\\\"\\\" searchListState=\u003C\u003Cqualify \\\"$:/temp/link-search/selected-item\\\">> refreshTitle=\u003C\u003Cqualify \\\"$:/temp/link-search/refresh\\\">> storeTitle=\u003C\u003Cqualify \\\"$:/temp/link-search/input\\\">>>\\n\\n\u003C$vars linkTiddler=\u003C\u003CsearchTiddler>>>\\n\u003C$keyboard key=\\\"((input-tab-right))\\\" actions=\u003C\u003Cset-next-input-tab>>>\\n\u003C$keyboard key=\\\"((input-tab-left))\\\" actions=\u003C\u003Cset-next-input-tab \\\"before\\\">> class=\\\"tc-create-wikitext-link\\\">\\n\u003C$macrocall $name=\\\"keyboard-driven-input\\\" tiddler=\u003C\u003CsearchTiddler>> storeTitle=\u003C\u003CstoreTitle>>\\n\\t\\tselectionStateTitle=\u003C\u003CsearchListState>> refreshTitle=\u003C\u003CrefreshTitle>> type=\\\"search\\\" filterMinLength=\\\"1\\\"\\n\\t\\ttag=\\\"input\\\" focus=\\\"true\\\" class=\\\"tc-popup-handle\\\" inputCancelActions=\u003C\u003Ccancel-search-actions>>\\n\\t\\tinputAcceptActions=\u003C\u003Cadd-link-actions>> placeholder={{$:/language/Search/Search}} default=\\\"\\\"\\n\\t\\tconfigTiddlerFilter=\\\"[[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}]\\\" />\\n\u003C/$keyboard>\\n\u003C/$keyboard>\\n&#32;\\n\u003C$reveal tag=\\\"span\\\" state=\u003C\u003CstoreTitle>> type=\\\"nomatch\\\" text=\\\"\\\">\\n\u003C\u003Cexternal-link>>\\n&#32;\\n\u003C$button class=\\\"tc-btn-invisible tc-btn-mini\\\" style=\\\"width: auto; display: inline-block; background-colour: inherit;\\\">\\n\u003C\u003Ccancel-search-actions>>\u003C$set name=\\\"cssEscapedTitle\\\" value={{{ [\u003CstoryTiddler>escapecss[]] }}}>\u003C$action-sendmessage $message=\\\"tm-focus-selector\\\" $param=\u003C\u003Cget-focus-selector>>/>\u003C/$set>\\n{{$:/core/images/close-button}}\\n\u003C/$button>\\n\u003C/$reveal>\\n\u003C/$vars>\\n\\n\u003C$reveal tag=\\\"div\\\" state=\u003C\u003CstoreTitle>> type=\\\"nomatch\\\" text=\\\"\\\">\\n\\n\u003C$linkcatcher actions=\u003C\u003Cadd-link-actions>> to=\u003C\u003ClinkTiddler>>>\\n\\n\u003C$vars userInput={{{ [\u003CstoreTitle>get[text]] }}} configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}] }}}>\\n\\n{{$:/core/ui/SearchResults}}\\n\\n\u003C/$vars>\\n\\n\u003C/$linkcatcher>\\n\\n\u003C/$reveal>\\n\\n\u003C/$vars>
2731\\n\\n\\\\end\\n\\n\u003C$macrocall $name=\\\"body\\\" config-title=\u003C\u003Cqualify \\\"$:/state/Link/\\\">>/>\\n\"},\"$:/core/ui/EditorToolbar/link\":{\"title\":\"$:/core/ui/EditorToolbar/link\",\"tags\":\"$:/tags/EditorToolbar\",\"icon\":\"$:/core/images/link\",\"caption\":\"{{$:/language/Buttons/Link/Caption}}\",\"description\":\"{{$:/language/Buttons/Link/Hint}}\",\"condition\":\"[\u003CtargetTiddler>!has[type]] [\u003CtargetTiddler>type[text/vnd.tiddlywiki]]\",\"button-classes\":\"tc-text-editor-toolbar-item-start-group\",\"shortcuts\":\"((link))\",\"dropdown\":\"$:/core/ui/EditorToolbar/link-dropdown\",\"text\":\"\"},\"$:/core/ui/EditorToolbar/linkify\":{\"title\":\"$:/core/ui/EditorToolbar/linkify\",\"caption\":\"{{$:/language/Buttons/Linkify/Caption}}\",\"condition\":\"[\u003CtargetTiddler>!has[type]] [\u003CtargetTiddler>type[text/vnd.tiddlywiki]]\",\"description\":\"{{$:/language/Buttons/Linkify/Hint}}\",\"icon\":\"$:/core/images/linkify\",\"list-before\":\"$:/core/ui/EditorToolbar/mono-block\",\"shortcuts\":\"((linkify))\",\"tags\":\"$:/tags/EditorToolbar\",\"text\":\"\u003C$action-sendmessage\\n\\t$message=\\\"tm-edit-text-operation\\\"\\n\\t$param=\\\"wrap-selection\\\"\\n\\tprefix=\\\"[[\\\"\\n\\tsuffix=\\\"]]\\\"\\n/>\\n\"},\"$:/core/ui/EditorToolbar/list-bullet\":{\"title\":\"$:/core/ui/EditorToolbar/list-bullet\",\"tags\":\"$:/tags/EditorToolbar\",\"icon\":\"$:/core/images/list-bullet\",\"caption\":\"{{$:/language/Buttons/ListBullet/Caption}}\",\"description\":\"{{$:/language/Buttons/ListBullet/Hint}}\",\"condition\":\"[\u003CtargetTiddler>!has[type]] [\u003CtargetTiddler>type[text/vnd.tiddlywiki]]\",\"shortcuts\":\"((list-bullet))\",\"text\":\"\u003C$action-sendmessage\\n\\t$message=\\\"tm-edit-text-operation\\\"\\n\\t$param=\\\"prefix-lines\\\"\\n\\tcharacter=\\\"*\\\"\\n\\tcount=\\\"1\\\"\\n/>\\n\"},\"$:/core/ui/EditorToolbar/list-number\":{\"title\":\"$:/core/ui/EditorToolbar/list-number\",\"tags\":\"$:/tags/EditorToolbar\",\"icon\":\"$:/core/images/list-number\",\"caption\":\"{{$:/language/Buttons/ListNumber/Caption}}\",\"description\":\"{{$:/language/Buttons/ListNumber/Hint}}\",\"condition\":\"[\u003CtargetTiddler>!has[type]] [\u003CtargetTiddler>type[text/vnd.tiddlywiki]]\",\"shortcuts\":\"((list-number))\",\"text\":\"\u003C$action-sendmessage\\n\\t$message=\\\"tm-edit-text-operation\\\"\\n\\t$param=\\\"prefix-lines\\\"\\n\\tcharacter=\\\"#\\\"\\n\\tcount=\\\"1\\\"\\n/>\\n\"},\"$:/core/ui/EditorToolbar/mono-block\":{\"title\":\"$:/core/ui/EditorToolbar/mono-block\",\"tags\":\"$:/tags/EditorToolbar\",\"icon\":\"$:/core/images/mono-block\",\"caption\":\"{{$:/language/Buttons/MonoBlock/Caption}}\",\"description\":\"{{$:/language/Buttons/MonoBlock/Hint}}\",\"condition\":\"[\u003CtargetTiddler>!has[type]] [\u003CtargetTiddler>type[text/vnd.tiddlywiki]]\",\"button-classes\":\"tc-text-editor-toolbar-item-start-group\",\"shortcuts\":\"((mono-block))\",\"text\":\"\u003C$action-sendmessage\\n\\t$message=\\\"tm-edit-text-operation\\\"\\n\\t$param=\\\"wrap-lines\\\"\\n\\tprefix=\\\"\\n```\\\"\\n\\tsuffix=\\\"```\\\"\\n/>\\n\"},\"$:/core/ui/EditorToolbar/mono-line\":{\"title\":\"$:/core/ui/EditorToolbar/mono-line\",\"tags\":\"$:/tags/EditorToolbar\",\"icon\":\"$:/core/images/mono-line\",\"caption\":\"{{$:/language/Buttons/MonoLine/Caption}}\",\"description\":\"{{$:/language/Buttons/MonoLine/Hint}}\",\"condition\":\"[\u003CtargetTiddler>!has[type]] [\u003CtargetTiddler>type[text/vnd.tiddlywiki]]\",\"shortcuts\":\"((mono-line))\",\"text\":\"\u003C$action-sendmessage\\n\\t$message=\\\"tm-edit-text-operation\\\"\\n\\t$param=\\\"wrap-selection\\\"\\n\\tprefix=\\\"`\\\"\\n\\tsuffix=\\\"`\\\"\\n/>\\n\"},\"$:/core/ui/EditorToolbar/more-dropdown\":{\"title\":\"$:/core/ui/EditorToolbar/more-dropdown\",\"text\":\"\\\\define config-title()\\n$:/config/EditorToolbarButtons/Visibility/$(toolbarItem)$\\n\\\\end\\n\\n\\\\define conditional-button()\\n\\\\whitespace trim\\n\u003C$list filter={{$(toolbarItem)$!!condition}} variable=\\\"condition\\\">\\n\u003C$transclude tiddler=\\\"$:/core/ui/EditTemplate/body/toolbar/button\\\" mode=\\\"inline\\\"/>\\n&#32;\\n\u003C$transclude tiddler=\u003C\u003CtoolbarItem>> field=\\\"description\\\"/>\\n\u003C/$list>\\n\\\\end\\n\\\\whitespace trim\\n\\n\u003Cdiv class=\\\"tc-text-editor-toolbar-more\\\">\\n\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/EditorToolbar]!has[draft.of]] -[[$:/core/ui/EditorToolbar/more]]\\\">\\n\u003C$reveal type=\\\"match\\\" state=\u003C\u003Cconfig-visibility-title>> text=\\\"hide\\\" tag=\\\"div\\\">\\n\u003C\u003Cconditional-button>>\\n\u003C/$reveal>\\n\u003C/$list>\\n\u003C/div>\\n\"},\"$:/core/ui/EditorToolbar/more\":{\"title\":\"$:/core/ui/EditorToolbar/more\",\"tags\":\"$:/tags/EditorToolbar\",\"icon\":\"$:
2731/core/images/down-arrow\",\"caption\":\"{{$:/language/Buttons/More/Caption}}\",\"description\":\"{{$:/language/Buttons/More/Hint}}\",\"condition\":\"[\u003CtargetTiddler>]\",\"dropdown\":\"$:/core/ui/EditorToolbar/more-dropdown\",\"text\":\"\"},\"$:/core/ui/EditorToolbar/opacity-dropdown\":{\"title\":\"$:/core/ui/EditorToolbar/opacity-dropdown\",\"text\":\"\\\\define lingo-base() $:/language/Buttons/Opacity/\\n\\n\\\\define toolbar-opacity-inner()\\n\u003C$button tag=\\\"a\\\" tooltip=\\\"\\\"\\\"$(opacity)$\\\"\\\"\\\">\\n\\n\u003C$action-setfield\\n\\t$tiddler=\\\"$:/config/BitmapEditor/Opacity\\\"\\n\\t$value=\\\"$(opacity)$\\\"\\n/>\\n\\n\u003C$action-deletetiddler\\n\\t$tiddler=\u003C\u003Cdropdown-state>>\\n/>\\n\\n\u003Cdiv style=\\\"display: inline-block; vertical-align: middle; background-color: $(current-paint-colour)$; opacity: $(opacity)$; width: 1em; height: 1em; border-radius: 50%;\\\"/>\\n\\n\u003Cspan style=\\\"margin-left: 8px;\\\">\\n\\n\u003C$text text=\\\"\\\"\\\"$(opacity)$\\\"\\\"\\\"/>\\n\\n\u003C$reveal state=\\\"$:/config/BitmapEditor/Opacity\\\" type=\\\"match\\\" text=\\\"\\\"\\\"$(opacity)$\\\"\\\"\\\" tag=\\\"span\\\">\\n\\n\u003C$entity entity=\\\"&nbsp;\\\"/>\\n\\n\u003C$entity entity=\\\"&#x2713;\\\"/>\\n\\n\u003C/$reveal>\\n\\n\u003C/span>\\n\\n\u003C/$button>\\n\\\\end\\n\\n\\\\define toolbar-opacity()\\n''\u003C\u003Clingo Hint>>''\\n\\n\u003C$list filter={{$:/config/BitmapEditor/Opacities}} variable=\\\"opacity\\\">\\n\\n\u003C\u003Ctoolbar-opacity-inner>>\\n\\n\u003C/$list>\\n\\\\end\\n\\n\u003C$set name=\\\"current-paint-colour\\\" value={{$:/config/BitmapEditor/Colour}}>\\n\\n\u003C$set name=\\\"current-opacity\\\" value={{$:/config/BitmapEditor/Opacity}}>\\n\\n\u003C\u003Ctoolbar-opacity>>\\n\\n\u003C/$set>\\n\\n\u003C/$set>\\n\"},\"$:/core/ui/EditorToolbar/opacity\":{\"title\":\"$:/core/ui/EditorToolbar/opacity\",\"tags\":\"$:/tags/EditorToolbar\",\"icon\":\"$:/core/images/opacity\",\"caption\":\"{{$:/language/Buttons/Opacity/Caption}}\",\"description\":\"{{$:/language/Buttons/Opacity/Hint}}\",\"condition\":\"[\u003CtargetTiddler>is[image]] -[\u003CtargetTiddler>type[image/svg+xml]]\",\"dropdown\":\"$:/core/ui/EditorToolbar/opacity-dropdown\",\"text\":\"\u003C$text text={{$:/config/BitmapEditor/Opacity}}/>\\n\"},\"$:/core/ui/EditorToolbar/paint-dropdown\":{\"title\":\"$:/core/ui/EditorToolbar/paint-dropdown\",\"text\":\"''{{$:/language/Buttons/Paint/Hint}}''\\n\\n\u003C$macrocall $name=\\\"colour-picker\\\" actions=\\\"\\\"\\\"\\n\\n\u003C$action-setfield\\n\\t$tiddler=\\\"$:/config/BitmapEditor/Colour\\\"\\n\\t$value=\u003C\u003Ccolour-picker-value>>\\n/>\\n\\n\u003C$action-deletetiddler\\n\\t$tiddler=\u003C\u003Cdropdown-state>>\\n/>\\n\\n\\\"\\\"\\\"/>\\n\"},\"$:/core/ui/EditorToolbar/paint\":{\"title\":\"$:/core/ui/EditorToolbar/paint\",\"tags\":\"$:/tags/EditorToolbar\",\"icon\":\"$:/core/images/paint\",\"caption\":\"{{$:/language/Buttons/Paint/Caption}}\",\"description\":\"{{$:/language/Buttons/Paint/Hint}}\",\"condition\":\"[\u003CtargetTiddler>is[image]] -[\u003CtargetTiddler>type[image/svg+xml]]\",\"dropdown\":\"$:/core/ui/EditorToolbar/paint-dropdown\",\"text\":\"\\\\define toolbar-paint()\\n\u003Cdiv style=\\\"display: inline-block; vertical-align: middle; background-color: $(colour-picker-value)$; width: 1em; height: 1em; border-radius: 50%;\\\"/>\\n\\\\end\\n\\\\whitespace trim\\n\u003C$set name=\\\"colour-picker-value\\\" value={{$:/config/BitmapEditor/Colour}}>\\n\u003C\u003Ctoolbar-paint>>\\n\u003C/$set>\\n\"},\"$:/core/ui/EditorToolbar/picture-dropdown\":{\"title\":\"$:/core/ui/EditorToolbar/picture-dropdown\",\"text\":\"\\\\define replacement-text()\\n[img[$(imageTitle)$]]\\n\\\\end\\n\\n''{{$:/language/Buttons/Picture/Hint}}''\\n\\n\u003C$macrocall $name=\\\"image-picker\\\" actions=\\\"\\\"\\\"\\n\\n\u003C$action-sendmessage\\n\\t$message=\\\"tm-edit-text-operation\\\"\\n\\t$param=\\\"replace-selection\\\"\\n\\ttext=\u003C\u003Creplacement-text>>\\n/>\\n\\n\u003C$action-deletetiddler\\n\\t$tiddler=\u003C\u003Cdropdown-state>>\\n/>\\n\\n\\\"\\\"\\\"/>\\n\"},\"$:/core/ui/EditorToolbar/picture\":{\"title\":\"$:/core/ui/EditorToolbar/picture\",\"tags\":\"$:/tags/EditorToolbar\",\"icon\":\"$:
2731/core/images/picture\",\"caption\":\"{{$:/language/Buttons/Picture/Caption}}\",\"description\":\"{{$:/language/Buttons/Picture/Hint}}\",\"condition\":\"[\u003CtargetTiddler>!has[type]] [\u003CtargetTiddler>type[text/vnd.tiddlywiki]]\",\"shortcuts\":\"((picture))\",\"dropdown\":\"$:/core/ui/EditorToolbar/picture-dropdown\",\"text\":\"\"},\"$:/core/ui/EditorToolbar/preview-type-dropdown\":{\"title\":\"$:/core/ui/EditorToolbar/preview-type-dropdown\",\"text\":\"\\\\define preview-type-button()\\n\u003C$button tag=\\\"a\\\">\\n\\n\u003C$action-setfield $tiddler=\\\"$:/state/editpreviewtype\\\" $value=\\\"$(previewType)$\\\"/>\\n\\n\u003C$action-deletetiddler\\n\\t$tiddler=\u003C\u003Cdropdown-state>>\\n/>\\n\\n\u003C$transclude tiddler=\u003C\u003CpreviewType>> field=\\\"caption\\\" mode=\\\"inline\\\">\\n\\n\u003C$view tiddler=\u003C\u003CpreviewType>> field=\\\"title\\\" mode=\\\"inline\\\"/>\\n\\n\u003C/$transclude> \\n\\n\u003C$reveal tag=\\\"span\\\" state=\\\"$:/state/editpreviewtype\\\" type=\\\"match\\\" text=\u003C\u003CpreviewType>> default=\\\"$:/core/ui/EditTemplate/body/preview/output\\\">\\n\\n\u003C$entity entity=\\\"&nbsp;\\\"/>\\n\\n\u003C$entity entity=\\\"&#x2713;\\\"/>\\n\\n\u003C/$reveal>\\n\\n\u003C/$button>\\n\\\\end\\n\\n\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/EditPreview]!has[draft.of]]\\\" variable=\\\"previewType\\\">\\n\\n\u003C\u003Cpreview-type-button>>\\n\\n\u003C/$list>\\n\"},\"$:/core/ui/EditorToolbar/preview-type\":{\"title\":\"$:/core/ui/EditorToolbar/preview-type\",\"tags\":\"$:/tags/EditorToolbar\",\"icon\":\"$:/core/images/chevron-down\",\"caption\":\"{{$:/language/Buttons/PreviewType/Caption}}\",\"description\":\"{{$:/language/Buttons/PreviewType/Hint}}\",\"condition\":\"[all[shadows+tiddlers]tag[$:/tags/EditPreview]!has[draft.of]butfirst[]limit[1]]\",\"button-classes\":\"tc-text-editor-toolbar-item-adjunct\",\"dropdown\":\"$:/core/ui/EditorToolbar/preview-type-dropdown\"},\"$:/core/ui/EditorToolbar/preview\":{\"title\":\"$:/core/ui/EditorToolbar/preview\",\"tags\":\"$:/tags/EditorToolbar\",\"icon\":\"$:/core/images/preview-open\",\"custom-icon\":\"yes\",\"caption\":\"{{$:/language/Buttons/Preview/Caption}}\",\"description\":\"{{$:/language/Buttons/Preview/Hint}}\",\"condition\":\"[\u003CtargetTiddler>]\",\"button-classes\":\"tc-text-editor-toolbar-item-start-group\",\"shortcuts\":\"((preview))\",\"text\":\"\\\\whitespace trim\\n\u003C$reveal state=\u003C\u003Cedit-preview-state>> type=\\\"match\\\" text=\\\"yes\\\" tag=\\\"span\\\">\\n{{$:/core/images/preview-open}}\\n\u003C$action-setfield $tiddler=\u003C\u003Cedit-preview-state>> $value=\\\"no\\\"/>\\n\u003C/$reveal>\\n\u003C$reveal state=\u003C\u003Cedit-preview-state>> type=\\\"nomatch\\\" text=\\\"yes\\\" tag=\\\"span\\\">\\n{{$:/core/images/preview-closed}}\\n\u003C$action-setfield $tiddler=\u003C\u003Cedit-preview-state>> $value=\\\"yes\\\"/>\\n\u003C/$reveal>\\n\"},\"$:/core/ui/EditorToolbar/quote\":{\"title\":\"$:/core/ui/EditorToolbar/quote\",\"tags\":\"$:/tags/EditorToolbar\",\"icon\":\"$:/core/images/quote\",\"caption\":\"{{$:/language/Buttons/Quote/Caption}}\",\"description\":\"{{$:/language/Buttons/Quote/Hint}}\",\"condition\":\"[\u003CtargetTiddler>!has[type]] [\u003CtargetTiddler>type[text/vnd.tiddlywiki]]\",\"shortcuts\":\"((quote))\",\"text\":\"\u003C$action-sendmessage\\n\\t$message=\\\"tm-edit-text-operation\\\"\\n\\t$param=\\\"wrap-lines\\\"\\n\\tprefix=\\\"\\n\u003C\u003C\u003C\\\"\\n\\tsuffix=\\\"\u003C\u003C\u003C\\\"\\n/>\\n\"},\"$:/core/ui/EditorToolbar/rotate-left\":{\"title\":\"$:/core/ui/EditorToolbar/rotate-left\",\"tags\":\"$:/tags/EditorToolbar\",\"icon\":\"$:/core/images/rotate-left\",\"caption\":\"{{$:/language/Buttons/RotateLeft/Caption}}\",\"description\":\"{{$:/language/Buttons/RotateLeft/Hint}}\",\"condition\":\"[\u003CtargetTiddler>is[image]] -[\u003CtargetTiddler>type[image/svg+xml]]\",\"text\":\"\u003C$action-sendmessage\\n\\t$message=\\\"tm-edit-bitmap-operation\\\"\\n\\t$param=\\\"rotate-left\\\"\\n/>\\n\"},\"$:/core/ui/EditorToolbar/size-dropdown\":{\"title\":\"$:/core/ui/EditorToolbar/size-dropdown\",\"text\":\"\\\\define lingo-base() $:/language/Buttons/Size/\\n\\n\\\\define toolbar-button-size-preset(config-title)\\n\u003C$set name=\\\"width\\\" filter=\\\"$(sizePair)$ +[first[]]\\\">\\n\\n\u003C$set name=\\\"height\\\" filter=\\\"$(sizePair)$ +[last[]]\\\">\\n\\n\u003C$button tag=\\\"a\\\">\\n\\n\u003C$action-setfield\\n\\t$tiddler=\\\"\\\"\\\"$config-title$/new-width\\\"\\\"\\\"\\n\\t$value=\u003C\u003Cwidth>>\\n/>\\n\\n\u003C$action-setfield\\n\\t$tiddler=\\\"\\\"\\\"$config-title$/new-height\\\"\\\"\\\"\\n\\t$value=\u003C\u003Cheight>>\\n/>\\n\\n\u003C$action-deletetiddler\\n\\t$tiddler=\\\"\\\"\\\"$config-title$/presets-popup\\\"\\\"\\\"\\n/>\\n\\n\u003C$text text=\u003C\u003Cwidth>>/> &times; \u003C$text text=\u003C\u003Cheight>>/>\\n\\n\u003C/$button>\\n\\n\u003C/$set>\\n\\n\u003C/$set>
2731\\n\\\\end\\n\\n\\\\define toolbar-button-size(config-title)\\n\\\\whitespace trim\\n''{{$:/language/Buttons/Size/Hint}}''\\n\\n\u003C\u003Clingo Caption/Width>>&#32;\u003C$edit-text tag=\\\"input\\\" tiddler=\\\"\\\"\\\"$config-title$/new-width\\\"\\\"\\\" default=\u003C\u003Ctv-bitmap-editor-width>> focus=\\\"true\\\" size=\\\"8\\\"/>\\n&#32;\\n\u003C\u003Clingo Caption/Height>>&#32;\u003C$edit-text tag=\\\"input\\\" tiddler=\\\"\\\"\\\"$config-title$/new-height\\\"\\\"\\\" default=\u003C\u003Ctv-bitmap-editor-height>> size=\\\"8\\\"/>\\n&#32;\\n\u003C$button popup=\\\"\\\"\\\"$config-title$/presets-popup\\\"\\\"\\\" class=\\\"tc-btn-invisible tc-popup-keep\\\" style=\\\"width: auto; display: inline-block; background-colour: inherit;\\\" selectedClass=\\\"tc-selected\\\">\\n{{$:/core/images/down-arrow}}\\n\u003C/$button>\\n\\n\u003C$reveal tag=\\\"span\\\" state=\\\"\\\"\\\"$config-title$/presets-popup\\\"\\\"\\\" type=\\\"popup\\\" position=\\\"belowleft\\\" animate=\\\"yes\\\">\\n\\n\u003Cdiv class=\\\"tc-drop-down tc-popup-keep\\\">\\n\\n\u003C$list filter={{$:/config/BitmapEditor/ImageSizes}} variable=\\\"sizePair\\\">\\n\\n\u003C$macrocall $name=\\\"toolbar-button-size-preset\\\" config-title=\\\"$config-title$\\\"/>\\n\\n\u003C/$list>\\n\\n\u003C/div>\\n\\n\u003C/$reveal>\\n\\n\u003C$button>\\n\u003C$action-sendmessage\\n\\t$message=\\\"tm-edit-bitmap-operation\\\"\\n\\t$param=\\\"resize\\\"\\n\\twidth={{$config-title$/new-width}}\\n\\theight={{$config-title$/new-height}}\\n/>\\n\u003C$action-deletetiddler\\n\\t$tiddler=\\\"\\\"\\\"$config-title$/new-width\\\"\\\"\\\"\\n/>\\n\u003C$action-deletetiddler\\n\\t$tiddler=\\\"\\\"\\\"$config-title$/new-height\\\"\\\"\\\"\\n/>\\n\u003C$action-deletetiddler\\n\\t$tiddler=\u003C\u003Cdropdown-state>>\\n/>\\n\u003C\u003Clingo Caption/Resize>>\\n\u003C/$button>\\n\\\\end\\n\\n\u003C$macrocall $name=\\\"toolbar-button-size\\\" config-title=\u003C\u003Cqualify \\\"$:/state/Size/\\\">>/>\\n\"},\"$:/core/ui/EditorToolbar/size\":{\"title\":\"$:/core/ui/EditorToolbar/size\",\"tags\":\"$:/tags/EditorToolbar\",\"icon\":\"$:/core/images/size\",\"caption\":\"{{$:/language/Buttons/Size/Caption}}\",\"description\":\"{{$:/language/Buttons/Size/Hint}}\",\"condition\":\"[\u003CtargetTiddler>is[image]] -[\u003CtargetTiddler>type[image/svg+xml]]\",\"dropdown\":\"$:/core/ui/EditorToolbar/size-dropdown\",\"text\":\"\"},\"$:/core/ui/EditorToolbar/StampDropdown/ItemTemplate\":{\"title\":\"$:/core/ui/EditorToolbar/StampDropdown/ItemTemplate\",\"text\":\"\u003C$linkcatcher actions=\\\"\\\"\\\"\\n\\n\u003C$list filter=\\\"[\u003Cmodifier>!match[ctrl]]\\\" variable=\\\"ignore\\\">\\n\\n\u003C$list filter=\\\"[\u003CcurrentTiddler>addsuffix[/prefix]!is[tiddler]!is[shadow]removesuffix[/prefix]addsuffix[/suffix]!is[tiddler]!is[shadow]]\\\" variable=\\\"ignore\\\">\\n\\n\u003C$action-sendmessage\\n\\t$message=\\\"tm-edit-text-operation\\\"\\n\\t$param=\\\"replace-selection\\\"\\n\\ttext={{{ [\u003CcurrentTiddler>get[text]] }}}\\n/>\\n\\n\u003C/$list>\\n\\n\\n\u003C$list filter=\\\"[\u003CcurrentTiddler>addsuffix[/prefix]] [\u003CcurrentTiddler>addsuffix[/suffix]] +[is[shadow]] :else[is[tiddler]] +[limit[1]]\\\" variable=\\\"ignore\\\">\\n\\n\u003C$action-sendmessage\\n\\t$message=\\\"tm-edit-text-operation\\\"\\n\\t$param=\\\"wrap-selection\\\"\\n\\tprefix={{{ [\u003CcurrentTiddler>addsuffix[/prefix]get[text]] }}}\\n  suffix={{{ [\u003CcurrentTiddler>addsuffix[/suffix]get[text]] }}}\\n/>\\n\\n\u003C/$list>\\n\\n\u003C/$list>\\n\\n\u003C$list filter=\\\"[\u003Cmodifier>match[ctrl]]\\\" variable=\\\"ignore\\\">\\n\\n\u003C$action-sendmessage $message=\\\"tm-edit-tiddler\\\"/>\\n\\n\u003C/$list>\\n\\n\u003C$action-deletetiddler\\n\\t$tiddler=\u003C\u003Cdropdown-state>>\\n/>\\n\\n\\\"\\\"\\\">\\n\\n\u003C$link tooltip={{{ [\u003CcurrentTiddler>get[description]] }}}>\\n\\n\u003C$transclude tiddler=\u003C\u003CcurrentTiddler>> field=\\\"caption\\\" mode=\\\"inline\\\">\\n\\n\u003C$view tiddler=\u003C\u003CcurrentTiddler>> field=\\\"title\\\" />\\n\\n\u003C/$transclude>\\n\\n\u003C/$link>\\n\\n\u003C/$linkcatcher>\\n\"},\"$:/core/ui/EditorToolbar/stamp-dropdown\":{\"title\":\"$:/core/ui/EditorToolbar/stamp-dropdown\",\"text\":\"\u003C$macrocall $name=\\\"list-tagged-draggable\\\" tag=\\\"$:/tags/TextEditor/Snippet\\\" subFilter=\\\"!is[draft]\\\" itemTemplate=\\\"$:/core/ui/EditorToolbar/StampDropdown/ItemTemplate\\\"/>\\n\\n----\\n\\n\u003C$button tag=\\\"a\\\">\\n\\n\u003C$action-sendmessage\\n\\t$message=\\\"tm-new-tiddler\\\"\\n\\ttags=\\\"$:/tags/TextEditor/Snippet\\\"\\n\\tcaption={{$:/language/Buttons/Stamp/New/Title}}\\n\\ttext={{$:/language/Buttons/Stamp/New/Text}}\\n/>\\n\\n\u003C$action-deletetiddler\\n\\t$tiddler=\u003C\u003Cdropdown-state>>
2731\\n/>\\n\\n\u003Cem>\\n\\n\u003C$text text={{$:/language/Buttons/Stamp/Caption/New}}/>\\n\\n\u003C/em>\\n\\n\u003C/$button>\\n\"},\"$:/core/ui/EditorToolbar/stamp\":{\"title\":\"$:/core/ui/EditorToolbar/stamp\",\"tags\":\"$:/tags/EditorToolbar\",\"icon\":\"$:/core/images/stamp\",\"caption\":\"{{$:/language/Buttons/Stamp/Caption}}\",\"description\":\"{{$:/language/Buttons/Stamp/Hint}}\",\"condition\":\"[\u003CtargetTiddler>type[]] [\u003CtargetTiddler>get[type]prefix[text/]] [\u003CtargetTiddler>get[type]match[application/javascript]] [\u003CtargetTiddler>get[type]match[application/json]] [\u003CtargetTiddler>get[type]match[application/x-tiddler-dictionary]] [\u003CtargetTiddler>get[type]match[image/svg+xml]] +[first[]]\",\"shortcuts\":\"((stamp))\",\"dropdown\":\"$:/core/ui/EditorToolbar/stamp-dropdown\",\"button-classes\":\"tc-editortoolbar-stamp-button\",\"text\":\"\"},\"$:/core/ui/EditorToolbar/strikethrough\":{\"title\":\"$:/core/ui/EditorToolbar/strikethrough\",\"tags\":\"$:/tags/EditorToolbar\",\"icon\":\"$:/core/images/strikethrough\",\"caption\":\"{{$:/language/Buttons/Strikethrough/Caption}}\",\"description\":\"{{$:/language/Buttons/Strikethrough/Hint}}\",\"condition\":\"[\u003CtargetTiddler>!has[type]] [\u003CtargetTiddler>type[text/vnd.tiddlywiki]]\",\"shortcuts\":\"((strikethrough))\",\"text\":\"\u003C$action-sendmessage\\n\\t$message=\\\"tm-edit-text-operation\\\"\\n\\t$param=\\\"wrap-selection\\\"\\n\\tprefix=\\\"~~\\\"\\n\\tsuffix=\\\"~~\\\"\\n/>\\n\"},\"$:/core/ui/EditorToolbar/subscript\":{\"title\":\"$:/core/ui/EditorToolbar/subscript\",\"tags\":\"$:/tags/EditorToolbar\",\"icon\":\"$:/core/images/subscript\",\"caption\":\"{{$:/language/Buttons/Subscript/Caption}}\",\"description\":\"{{$:/language/Buttons/Subscript/Hint}}\",\"condition\":\"[\u003CtargetTiddler>!has[type]] [\u003CtargetTiddler>type[text/vnd.tiddlywiki]]\",\"shortcuts\":\"((subscript))\",\"text\":\"\u003C$action-sendmessage\\n\\t$message=\\\"tm-edit-text-operation\\\"\\n\\t$param=\\\"wrap-selection\\\"\\n\\tprefix=\\\",,\\\"\\n\\tsuffix=\\\",,\\\"\\n/>\\n\"},\"$:/core/ui/EditorToolbar/superscript\":{\"title\":\"$:/core/ui/EditorToolbar/superscript\",\"tags\":\"$:/tags/EditorToolbar\",\"icon\":\"$:/core/images/superscript\",\"caption\":\"{{$:/language/Buttons/Superscript/Caption}}\",\"description\":\"{{$:/language/Buttons/Superscript/Hint}}\",\"condition\":\"[\u003CtargetTiddler>!has[type]] [\u003CtargetTiddler>type[text/vnd.tiddlywiki]]\",\"shortcuts\":\"((superscript))\",\"text\":\"\u003C$action-sendmessage\\n\\t$message=\\\"tm-edit-text-operation\\\"\\n\\t$param=\\\"wrap-selection\\\"\\n\\tprefix=\\\"^^\\\"\\n\\tsuffix=\\\"^^\\\"\\n/>\\n\"},\"$:/core/ui/EditorToolbar/transcludify\":{\"title\":\"$:/core/ui/EditorToolbar/transcludify\",\"caption\":\"{{$:/language/Buttons/Transcludify/Caption}}\",\"condition\":\"[\u003CtargetTiddler>!has[type]] [\u003CtargetTiddler>type[text/vnd.tiddlywiki]]\",\"description\":\"{{$:/language/Buttons/Transcludify/Hint}}\",\"icon\":\"$:/core/images/transcludify\",\"list-before\":\"$:/core/ui/EditorToolbar/mono-block\",\"shortcuts\":\"((transcludify))\",\"tags\":\"$:/tags/EditorToolbar\",\"text\":\"\u003C$action-sendmessage\\n\\t$message=\\\"tm-edit-text-operation\\\"\\n\\t$param=\\\"wrap-selection\\\"\\n\\tprefix=\\\"{{\\\"\\n\\tsuffix=\\\"}}\\\"\\n/>\\n\"},\"$:/core/ui/EditorToolbar/underline\":{\"title\":\"$:/core/ui/EditorToolbar/underline\",\"tags\":\"$:/tags/EditorToolbar\",\"icon\":\"$:/core/images/underline\",\"caption\":\"{{$:/language/Buttons/Underline/Caption}}\",\"description\":\"{{$:/language/Buttons/Underline/Hint}}\",\"condition\":\"[\u003CtargetTiddler>!has[type]] [\u003CtargetTiddler>type[text/vnd.tiddlywiki]]\",\"shortcuts\":\"((underline))\",\"text\":\"\u003C$action-sendmessage\\n\\t$message=\\\"tm-edit-text-operation\\\"\\n\\t$param=\\\"wrap-selection\\\"\\n\\tprefix=\\\"__\\\"\\n\\tsuffix=\\\"__\\\"\\n/>\\n\"},\"$:/core/ui/ExportTiddlyWikiCore\":{\"title\":\"$:/core/ui/ExportTiddlyWikiCore\",\"text\":\"\\\\define jsFileName() tiddlywikicore-$(version)$.js\\n\\\\define noExportMsg()\\nIt appears that you have a wiki with an external ~TiddlyWiki core. The export action cannot be performed.\\n\u003Cp>You will need to view the page source in your browser. Then go to the very bottom the the source, find the last `\u003Cscript>` \\nelement, and right-click its `src` URI. Save the link as ''$(jsFileName)$''\u003C/p>
2731\\n\\\\end\\n\\n''For advanced users''\\n\\nExport the ~TiddlyWiki core ~JavaScript code for running with external ~JavaScript:\\n\\n\u003C$button tooltip=\\\"Export the ~TiddlyWiki core code for running with external ~JavaScript\\\" aria-label=\\\"export TiddlyWiki core\\\" class=\\\"tc-btn-big-green\\\">\\n\u003C$list filter=\\\"[[$:/boot/boot.js]is[missing]]\\\" variable=\\\"ignore\\\" emptyMessage=\\\"\\\"\\\"\u003C$action-sendmessage $message=\\\"tm-download-file\\\" $param=\\\"$:/core/templates/tiddlywiki5.js\\\" filename=\u003C\u003CjsFileName>>/>\\\"\\\"\\\" >\\n\u003C$action-setfield $tiddler=\u003C\u003Cqualify \\\"$:/temp/alert\\\">> text=\u003C\u003CnoExportMsg>> subtitle=\\\"Export ~TiddllyWiki Core\\\"/>\\n\u003C$action-sendmessage $message=\\\"tm-modal\\\" $param=\u003C\u003Cqualify \\\"$:/temp/alert\\\">>/>\\n\u003C/$list>\\n{{$:/core/images/download-button}} Download ~TiddlyWiki core\\n\u003C/$button>\\n\\n[[Further information|https://tiddlywiki.com/#Using%20the%20external%20JavaScript%20template]]\\n\"},\"$:/core/Filters/AllTags\":{\"title\":\"$:/core/Filters/AllTags\",\"tags\":\"$:/tags/Filter\",\"filter\":\"[tags[]!is[system]sort[title]]\",\"description\":\"{{$:/language/Filters/AllTags}}\",\"text\":\"\"},\"$:/core/Filters/AllTiddlers\":{\"title\":\"$:/core/Filters/AllTiddlers\",\"tags\":\"$:/tags/Filter\",\"filter\":\"[!is[system]sort[title]]\",\"description\":\"{{$:/language/Filters/AllTiddlers}}\",\"text\":\"\"},\"$:/core/Filters/Drafts\":{\"title\":\"$:/core/Filters/Drafts\",\"tags\":\"$:/tags/Filter\",\"filter\":\"[has[draft.of]sort[title]]\",\"description\":\"{{$:/language/Filters/Drafts}}\",\"text\":\"\"},\"$:/core/Filters/Missing\":{\"title\":\"$:/core/Filters/Missing\",\"tags\":\"$:/tags/Filter\",\"filter\":\"[all[missing]sort[title]]\",\"description\":\"{{$:/language/Filters/Missing}}\",\"text\":\"\"},\"$:/core/Filters/Orphans\":{\"title\":\"$:/core/Filters/Orphans\",\"tags\":\"$:/tags/Filter\",\"filter\":\"[all[orphans]sort[title]]\",\"description\":\"{{$:/language/Filters/Orphans}}\",\"text\":\"\"},\"$:/core/Filters/OverriddenShadowTiddlers\":{\"title\":\"$:/core/Filters/OverriddenShadowTiddlers\",\"tags\":\"$:/tags/Filter\",\"filter\":\"[is[shadow]]\",\"description\":\"{{$:/language/Filters/OverriddenShadowTiddlers}}\",\"text\":\"\"},\"$:/core/Filters/RecentSystemTiddlers\":{\"title\":\"$:/core/Filters/RecentSystemTiddlers\",\"tags\":\"$:/tags/Filter\",\"filter\":\"[has[modified]!sort[modified]limit[50]]\",\"description\":\"{{$:/language/Filters/RecentSystemTiddlers}}\",\"text\":\"\"},\"$:/core/Filters/RecentTiddlers\":{\"title\":\"$:/core/Filters/RecentTiddlers\",\"tags\":\"$:/tags/Filter\",\"filter\":\"[!is[system]has[modified]!sort[modified]limit[50]]\",\"description\":\"{{$:/language/Filters/RecentTiddlers}}\",\"text\":\"\"},\"$:/core/Filters/SessionTiddlers\":{\"title\":\"$:/core/Filters/SessionTiddlers\",\"tags\":\"$:/tags/Filter\",\"filter\":\"[haschanged[]]\",\"description\":\"{{$:/language/Filters/SessionTiddlers}}\",\"text\":\"\"},\"$:/core/Filters/ShadowTiddlers\":{\"title\":\"$:/core/Filters/ShadowTiddlers\",\"tags\":\"$:/tags/Filter\",\"filter\":\"[all[shadows]sort[title]]\",\"description\":\"{{$:/language/Filters/ShadowTiddlers}}\",\"text\":\"\"},\"$:/core/Filters/StoryList\":{\"title\":\"$:/core/Filters/StoryList\",\"tags\":\"$:/tags/Filter\",\"filter\":\"[list[$:/StoryList]] -$:/AdvancedSearch\",\"description\":\"{{$:/language/Filters/StoryList}}\",\"text\":\"\"},\"$:/core/Filters/SystemTags\":{\"title\":\"$:/core/Filters/SystemTags\",\"tags\":\"$:/tags/Filter\",\"filter\":\"[all[shadows+tiddlers]tags[]is[system]sort[title]]\",\"description\":\"{{$:/language/Filters/SystemTags}}\",\"text\":\"\"},\"$:/core/Filters/SystemTiddlers\":{\"title\":\"$:/core/Filters/SystemTiddlers\",\"tags\":\"$:/tags/Filter\",\"filter\":\"[is[system]sort[title]]\",\"description\":\"{{$:/language/Filters/SystemTiddlers}}\",\"text\":\"\"},\"$:/core/Filters/TypedTiddlers\":{\"title\":\"$:/core/Filters/TypedTiddlers\",\"tags\":\"$:/tags/Filter\",\"filter\":\"[!is[system]has[type]each[type]sort[type]] -[type[text/vnd.tiddlywiki]]\",\"description\":\"{{$:/language/Filters/TypedTiddlers}}\",\"text\":\"\"},\"$:/core/ui/ImportListing\":{\"title\":\"$:/core/ui/ImportListing\",\"text\":\"\\\\define lingo-base() $:/language/Import/\\n\\n\\\\define messageField() message-$(payloadTiddler)$\\n\\n\\\\define payloadTitleFilter() [\u003CcurrentTiddler>get\u003CrenameField>minlength[1]else\u003CpayloadTiddler>
2731]\\n\\n\\\\define overWriteWarning()\\n\\\\whitespace trim\\n\u003C$list filter=\\\"[\u003CcurrentTiddler>!has\u003CsuppressedField>]\\\">\\n\u003C$text text={{{[subfilter\u003CpayloadTitleFilter>!is[tiddler]then[]] ~[\u003Clingo-base>addsuffix[Listing/Rename/OverwriteWarning]get[text]]}}}/>\\n\u003C/$list>\\n\\\\end\\n\\n\\\\define selectionInfo()\\n\\\\whitespace trim\\n\u003C$set name=\\\"escUnselected\\\" value={{{[{$:/language/Import/Upgrader/Tiddler/Unselected}escaperegexp[]addprefix[(?g)]]}}}>\\n\\t\u003C$list filter=\\\"[all[current]get\u003CmessageField>regexp\u003CescUnselected>]\\\" variable=\\\"ignore\\\">\\n\\t\\t\u003C$text text={{{[all[current]get\u003CselectionField>match[checked]then{$:/language/Import/Upgrader/Tiddler/Selected}else[]]}}}/>\\n\\t\u003C/$list>\\n\u003C/$set>\\n\\\\end\\n\\n\\\\define libraryInfo()\\n\\\\whitespace trim\\n\u003C$set name=\\\"escUnselected\\\" value={{{[{$:/language/Import/Upgrader/Tiddler/Unselected}escaperegexp[]addprefix[(?g)]]}}}>\\n\\t\u003C$list filter=\\\"[all[current]get\u003CmessageField>!regexp\u003CescUnselected>]\\\" variable=\\\"ignore\\\">\\n\\t\\t\u003C$text text={{{[all[current]get\u003CmessageField>]}}}/>\\n\\t\u003C/$list>\\n\u003C/$set>\\n\\\\end\\n\\n\\\\define selectionField() selection-$(payloadTiddler)$\\n\\n\\\\define renameField() rename-$(payloadTiddler)$\\n\\n\\\\define suppressedField() suppressed-$(payloadTiddler)$\\n\\n\\\\define newImportTitleTiddler() $:/temp/NewImportTitle-$(payloadTiddler)$\\n\\n\\\\define previewPopupState() $(currentTiddler)$!!popup-$(payloadTiddler)$\\n\\n\\\\define renameFieldState() $(currentTiddler)$!!state-rename-$(payloadTiddler)$\\n\\n\\\\define select-all-actions()\\n\\\\whitespace trim\\n\u003C$list filter=\\\"[all[current]plugintiddlers[]sort[title]]\\\" variable=\\\"payloadTiddler\\\">\\n\u003C$action-setfield $field={{{ [\u003CpayloadTiddler>addprefix[selection-]] }}} $value={{$:/state/import/select-all}}/>\\n\u003C/$list>\\n\\\\end\\n\\n\\\\whitespace trim\\n\u003Ctable class=\\\"tc-import-table\\\">\\n\u003Ctbody>\\n\u003Ctr>\\n\u003Cth align=\\\"left\\\">\\n\u003C$checkbox tiddler=\\\"$:/state/import/select-all\\\" field=\\\"text\\\" checked=\\\"checked\\\" unchecked=\\\"unchecked\\\" default=\\\"checked\\\" actions=\u003C\u003Cselect-all-actions>>>\\n&#32;\\n\u003C\u003Clingo Listing/Select/Caption>>\\n\u003C/$checkbox>\\n\u003C/th>\\n\u003Cth>\\n\u003C\u003Clingo Listing/Title/Caption>>\\n\u003C/th>\\n\u003Cth>\\n\u003C\u003Clingo Listing/Status/Caption>>\\n\u003C/th>\\n\u003C/tr>\\n\u003C$list filter=\\\"[all[current]plugintiddlers[]sort[title]]\\\" variable=\\\"payloadTiddler\\\">\\n\u003Ctr class={{{[\u003CcurrentTiddler>has\u003CsuppressedField>then[tc-row-disabled]] ~[subfilter\u003CpayloadTitleFilter>is[tiddler]then[tc-row-warning]] }}}>\\n\u003Ctd>\\n\u003C$checkbox field=\u003C\u003CselectionField>> checked=\\\"checked\\\" unchecked=\\\"unchecked\\\" default=\\\"checked\\\" disabled={{{[\u003CcurrentTiddler>has\u003CsuppressedField>then[yes]else[no]]}}}/>\\n\u003C/td>\\n\u003Ctd>\\n\u003C$reveal type=\\\"nomatch\\\" state=\u003C\u003CrenameFieldState>> text=\\\"yes\\\" tag=\\\"div\\\">\\n\u003C$reveal type=\\\"nomatch\\\" state=\u003C\u003CpreviewPopupState>> text=\\\"yes\\\" tag=\\\"div\\\" class=\\\"tc-flex\\\">\\n\u003C$button class=\\\"tc-btn-invisible tc-btn-dropdown tc-flex-grow-1 tc-word-break\\\" set=\u003C\u003CpreviewPopupState>> setTo=\\\"yes\\\" disabled={{{[\u003CcurrentTiddler>has\u003CsuppressedField>then[yes]else[no]]}}}>\\n\u003Cspan class=\\\"tc-small-gap-right\\\">{{$:/core/images/right-arrow}}\u003C/span>\u003C$text text={{{[subfilter\u003CpayloadTitleFilter>]}}}/>\\n\u003C/$button>\\n\u003C$list filter=\\\"[\u003CcurrentTiddler>!has\u003CsuppressedField>]\\\">\u003C$button class=\\\"tc-btn-invisible\\\" set=\u003C\u003CrenameFieldState>> setTo=\\\"yes\\\" tooltip={{{[\u003Clingo-base>addsuffix[Listing/Rename/Tooltip]get[text]]}}}>{{$:/core/images/edit-button}}\u003C/$button>\u003C/$list>\\n\u003C/$reveal>\\n\u003C$reveal type=\\\"match\\\" state=\u003C\u003CpreviewPopupState>> text=\\\"yes\\\" tag=\\\"div\\\">\\n\u003C$button class=\\\"tc-btn-invisible tc-btn-dropdown\\\" set=\u003C\u003CpreviewPopupState>> setTo=\\\"no\\\">\\n\u003Cspan class=\\\"tc-small-gap-right\\\">{{$:/core/images/down-arrow}}\u003C/span>\u003C$text text={{{[subfilter\u003CpayloadTitleFilter>]}}}/>\\n\u003C/$button>\\n\u003C/$reveal>\\n\u003C/$reveal>\\n\u003C$reveal type=\\\"match\\\" state=\u003C\u003CrenameFieldState>> text=\\\"yes\\\" tag=\\\"div\\\">\\n\u003C$text text={{{[\u003Clingo-base>addsuffix[Listing/Rename/Prompt]get[text]]}}}/>\\n\u003C/$reveal>\\n\u003C/td>\\n\u003Ctd>\\n\u003C\u003CselectionInfo>>\\n&#32;\\n\u003C\u003ClibraryInfo>>\\n&#32;\\n\u003C\u003CoverWriteWarning>>
2731\\n\u003C/td>\\n\u003C/tr>\\n\u003C$reveal type=\\\"match\\\" state=\u003C\u003CrenameFieldState>> text=\\\"yes\\\" tag=\\\"tr\\\">\\n\\t\u003Ctd colspan=\\\"3\\\">\\n\\t\\t\u003Cdiv class=\\\"tc-flex\\\">\\n\\t\\t\\t\u003C$edit-text tiddler=\u003C\u003CnewImportTitleTiddler>>  default={{{[subfilter\u003CpayloadTitleFilter>]}}} tag=\\\"input\\\" class=\\\"tc-import-rename tc-flex-grow-1\\\"/>\\n\\t\\t\\t\u003Cspan class=\\\"tc-small-gap-left\\\">\\n\\t\\t\\t\\t\u003C$button  class=\\\"tc-btn-invisible\\\" set=\u003C\u003CrenameFieldState>> setTo=\\\"no\\\" tooltip={{{[\u003Clingo-base>addsuffix[Listing/Rename/CancelRename]get[text]]}}}>\\n\\t\\t\\t\\t\\t{{$:/core/images/close-button}}\\n\\t\\t\\t\\t\\t\u003C$action-deletetiddler $tiddler=\u003C\u003CnewImportTitleTiddler>>/>\\n\\t\\t\\t\\t\u003C/$button>\\n\\t\\t\\t\\t\u003Cspan class=\\\"tc-small-gap-right\\\"/>\\n\\t\\t\\t\u003C/span>\\n\\t\\t\\t\u003C$button  class=\\\"tc-btn-invisible\\\" set=\u003C\u003CrenameFieldState>> setTo=\\\"no\\\" tooltip={{{[\u003Clingo-base>addsuffix[Listing/Rename/ConfirmRename]get[text]]}}}>\\n\\t\\t\\t\\t{{$:/core/images/done-button}}\\n\\t\\t\\t\\t\u003C$action-setfield $field=\u003C\u003CrenameField>> $value={{{[\u003CnewImportTitleTiddler>get[text]minlength[1]else\u003CpayloadTiddler>]}}} />\\n\\t\\t\\t\\t\u003C$action-deletetiddler $tiddler=\u003C\u003CnewImportTitleTiddler>>/>\\n\\t\\t\\t\u003C/$button>\\n\\t\\t\u003C/div>\\n\\t\u003C/td>\\n\u003C/$reveal>\\n\u003C$reveal type=\\\"match\\\" text=\\\"yes\\\" state=\u003C\u003CpreviewPopupState>> tag=\\\"tr\\\">\\n\u003Ctd colspan=\\\"3\\\">\\n\u003C$list filter=\\\"[{$:/state/importpreviewtype}has[text]]\\\" variable=\\\"listItem\\\" emptyMessage={{$:/core/ui/ImportPreviews/Text}}>\\n\\t\u003Cdiv>\\n\\t\\t\u003C$transclude tiddler={{$:/state/importpreviewtype}}/>\\n\\t\u003C/div>\\n\u003C/$list>\\n\u003C/td>\\n\u003C/$reveal>\\n\u003C/$list>\\n\u003C/tbody>\\n\u003C/table>\\n\"},\"$:/core/ui/ImportPreviews/Diff\":{\"title\":\"$:/core/ui/ImportPreviews/Diff\",\"tags\":\"$:/tags/ImportPreview\",\"caption\":\"{{$:/language/Import/Listing/Preview/Diff}}\",\"text\":\"\u003C$macrocall $name=\\\"compareTiddlerText\\\" sourceTiddlerTitle=\u003C\u003CpayloadTiddler>> destTiddlerTitle=\u003C\u003CcurrentTiddler>> destSubTiddlerTitle=\u003C\u003CpayloadTiddler>>/>\\n\"},\"$:/core/ui/ImportPreviews/DiffFields\":{\"title\":\"$:/core/ui/ImportPreviews/DiffFields\",\"tags\":\"$:/tags/ImportPreview\",\"caption\":\"{{$:/language/Import/Listing/Preview/DiffFields}}\",\"text\":\"\u003C$macrocall $name=\\\"compareTiddlers\\\" sourceTiddlerTitle=\u003C\u003CpayloadTiddler>> destTiddlerTitle=\u003C\u003CcurrentTiddler>> destSubTiddlerTitle=\u003C\u003CpayloadTiddler>> exclude=\\\"text\\\"/>\\n\"},\"$:/core/ui/ImportPreviews/Fields\":{\"title\":\"$:/core/ui/ImportPreviews/Fields\",\"tags\":\"$:/tags/ImportPreview\",\"caption\":\"{{$:/language/Import/Listing/Preview/Fields}}\",\"text\":\"\\\\whitespace trim\\n\u003Ctable class=\\\"tc-view-field-table\\\">\\n\u003Ctbody>\\n\u003C$list filter=\\\"[\u003CpayloadTiddler>subtiddlerfields\u003CcurrentTiddler>sort[]] -text\\\" variable=\\\"fieldName\\\">\\n\u003Ctr class=\\\"tc-view-field\\\">\\n\u003Ctd class=\\\"tc-view-field-name\\\">\\n\u003C$text text=\u003C\u003CfieldName>>/>\\n\u003C/td>\\n\u003Ctd class=\\\"tc-view-field-value\\\">\\n\u003C$view field=\u003C\u003CfieldName>> tiddler=\u003C\u003CcurrentTiddler>> subtiddler=\u003C\u003CpayloadTiddler>>/>\\n\u003C/td>\\n\u003C/tr>\\n\u003C/$list>\\n\u003C/tbody>\\n\u003C/table>\\n\"},\"$:/core/ui/ImportPreviews/Text\":{\"title\":\"$:/core/ui/ImportPreviews/Text\",\"tags\":\"$:/tags/ImportPreview\",\"caption\":\"{{$:/language/Import/Listing/Preview/Text}}\",\"code-body\":\"yes\",\"text\":\"\u003C$transclude tiddler=\u003C\u003CcurrentTiddler>> subtiddler=\u003C\u003CpayloadTiddler>> mode=\\\"block\\\"/>\\n\"},\"$:/core/ui/ImportPreviews/TextRaw\":{\"title\":\"$:/core/ui/ImportPreviews/TextRaw\",\"tags\":\"$:/tags/ImportPreview\",\"caption\":\"{{$:/language/Import/Listing/Preview/TextRaw}}\",\"text\":\"\u003Cpre>\u003Ccode>\u003C$view tiddler=\u003C\u003CcurrentTiddler>> subtiddler=\u003C\u003CpayloadTiddler>> />\u003C/code>\u003C/pre>\"},\"$:/core/ui/KeyboardShortcuts/advanced-search\":{\"title\":\"$:/core/ui/KeyboardShortcuts/advanced-search\",\"tags\":\"$:/tags/KeyboardShortcut\",\"key\":\"((advanced-search))\",\"text\":\"\\\\whitespace trim\\n\u003C$navigator story=\\\"$:/StoryList\\\" history=\\\"$:/HistoryList\\\">\\n\u003C$action-navigate $to=\\\"$:/AdvancedSearch\\\" $scroll=\\\"yes\\\"/>\\n\u003C$action-sendmessage $message=\\\"tm-focus-selector\\\" $param=\\\"\\\"\\\"[data-tiddler-title=\\\"$:/AdvancedSearch\\\"] .tc-search input\\\"\\\"\\\" preventScroll=\\\"true\\\"/>\\n\u003C/$navigator>\\n\"},\"$:/core/ui/KeyboardShortcuts/change-sidebar-layout\":{\"title\":\"$:/core/ui/KeyboardShortcuts/change-sidebar-layout\",\"tags\":\"$:/tags/KeyboardShortcut\",\"key\":\"((change-sidebar-layout))\",\"text\":\"\\\\whitespace trim\\n\u003C$list\\n\\tfilter=\\\"[{$:/themes/tiddlywiki/vanilla/options/sidebarlayout}match[fixed-fluid]]\\\"\\n\\temptyMessage=\\\"\u003C$action-setfield $tiddler='$:/themes/tiddlywiki/vanilla/options/sidebarlayout' text='fixed-fluid'/>\\\">\\n\u003C$action-setfield $tiddler=\\\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\\\" text=\\\"fluid-fixed\\\"/>\\n\u003C/$list>\\n\"},\"$:/core/ui/KeyboardShortcuts/new-image\":{\"title\":\"$:/core/ui/KeyboardShortcuts/new-image\",\"tags\":\"$:/tags/KeyboardShortcut\",\"key\":\"((new-image))\",\"text\":\"\\\\whitespace trim\\n\u003C$navigator story=\\\"$:/StoryList\\\" history=\\\"$:/HistoryList\\\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\\n{{$:/core/ui/Actions/new-image}}\\n\u003C/$navigator>\\n\"},\"$:/core/ui/KeyboardShortcuts/new-journal\":{\"title\":\"$:/core/ui/KeyboardShortcuts/new-journal\",\"tags\":\"$:/tags/KeyboardShortcut\",\"key\":\"((new-journal))\",\"text\":\"\\\\whitespace trim\\n\u003C$navigator story=\\\"$:/StoryList\\\" history=\\\"$:/HistoryList\\\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\\n{{$:/core/ui/Actions/new-journal}}
2731\\n\u003C/$navigator>\\n\"},\"$:/core/ui/KeyboardShortcuts/new-tiddler\":{\"title\":\"$:/core/ui/KeyboardShortcuts/new-tiddler\",\"tags\":\"$:/tags/KeyboardShortcut\",\"key\":\"((new-tiddler))\",\"text\":\"\\\\whitespace trim\\n\u003C$navigator story=\\\"$:/StoryList\\\" history=\\\"$:/HistoryList\\\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\\n{{$:/core/ui/Actions/new-tiddler}}\\n\u003C/$navigator>\\n\"},\"$:/core/ui/KeyboardShortcuts/save-wiki\":{\"title\":\"$:/core/ui/KeyboardShortcuts/save-wiki\",\"tags\":\"$:/tags/KeyboardShortcut\",\"key\":\"((save-wiki))\",\"text\":\"\\\\whitespace trim\\n\u003C$wikify name=\\\"site-title\\\" text={{$:/config/SaveWikiButton/Filename}}>\\n\u003C$action-sendmessage $message=\\\"tm-save-wiki\\\" $param={{$:/config/SaveWikiButton/Template}} filename=\u003C\u003Csite-title>>/>\\n\u003C/$wikify>\\n\"},\"$:/core/ui/KeyboardShortcuts/sidebar-search\":{\"title\":\"$:/core/ui/KeyboardShortcuts/sidebar-search\",\"tags\":\"$:/tags/KeyboardShortcut\",\"key\":\"((sidebar-search))\",\"text\":\"\u003C$action-sendmessage $message=\\\"tm-focus-selector\\\" $param=\\\".tc-search input\\\"/>\\n\"},\"$:/core/ui/KeyboardShortcuts/switcher\":{\"title\":\"$:/core/ui/KeyboardShortcuts/switcher\",\"tags\":\"$:/tags/KeyboardShortcut\",\"key\":\"((layout-switcher))\",\"text\":\"\u003C$action-sendmessage $message=\\\"tm-show-switcher\\\" switch=\\\"layout\\\"/>\"},\"$:/core/ui/KeyboardShortcuts/toggle-sidebar\":{\"title\":\"$:/core/ui/KeyboardShortcuts/toggle-sidebar\",\"tags\":\"$:/tags/KeyboardShortcut\",\"key\":\"((toggle-sidebar))\",\"text\":\"\\\\whitespace trim\\n\u003C$list\\n\\tfilter=\\\"[[$:/state/sidebar]is[missing]] [{$:/state/sidebar}removeprefix[yes]]\\\"\\n\\temptyMessage=\\\"\u003C$action-setfield $tiddler='$:/state/sidebar' text='yes'/>\\\">\\n\u003C$action-setfield $tiddler=\\\"$:/state/sidebar\\\" text=\\\"no\\\"/>\\n\u003C/$list>\\n\"},\"$:/snippets/LayoutSwitcher\":{\"title\":\"$:/snippets/LayoutSwitcher\",\"tags\":\"$:/tags/ControlPanel/Appearance\",\"caption\":\"{{$:/language/ControlPanel/LayoutSwitcher/Caption}}\",\"text\":\"\\\\whitespace trim\\n\u003C$linkcatcher to=\\\"$:/layout\\\">\\n\u003Cdiv class=\\\"tc-chooser\\\">\\n\u003C$list filter=\\\"[all[tiddlers+shadows]tag[$:/tags/Layout]] [[$:/core/ui/PageTemplate]] +[!is[draft]sort[name]]\\\">\\n\u003C$list\\n\\tfilter=\\\"[{$:/layout}!has[text]]\\\"\\n\\tvariable=\\\"ignore\\\"\\n\\temptyMessage=\\\"\\\"\\\"\\\\whitespace trim\\n\\t\\t\u003C$set name=\\\"cls\\\" filter=\\\"[all[current]field:title{$:/layout}]\\\" value=\\\"tc-chooser-item tc-chosen\\\" emptyValue=\\\"tc-chooser-item\\\">\\n\\t\\t\u003Cdiv class=\u003C\u003Ccls>>>\\n\\t\\t\u003C$link to={{!!title}}>\\n\\t\\t''\u003C$transclude tiddler={{{ [\u003CcurrentTiddler>get[icon]] }}}/>\u003C$transclude field=\\\"name\\\"/>''&#32;-&#32;\u003C$transclude field=\\\"description\\\"/>\\n\\t\\t\u003C/$link>\u003C/div>\u003C/$set>\\n\\\"\\\"\\\">\\n\u003C$set name=\\\"cls\\\" filter=\\\"[all[current]field:title[$:/core/ui/PageTemplate]]\\\" value=\\\"tc-chooser-item tc-chosen\\\" emptyValue=\\\"tc-chooser-item\\\">\\n\u003Cdiv class=\u003C\u003Ccls>>>\\n\u003C$link to={{!!title}}>\\n''\u003C$transclude tiddler={{{ [\u003CcurrentTiddler>get[icon]] }}}/>\u003C$transclude field=\\\"name\\\"/>''&#32;-&#32;\u003C$transclude field=\\\"description\\\"/>\\n\u003C/$link>\\n\u003C/div>\\n\u003C/$set>\\n\u003C/$list>\\n\u003C/$list>\\n\u003C/div>\\n\u003C/$linkcatcher>\\n\"},\"$:/core/ui/ListItemTemplate\":{\"title\":\"$:/core/ui/ListItemTemplate\",\"text\":\"\u003Cdiv class=\\\"tc-menu-list-item\\\">\u003C$link />\u003C/div>\"},\"$:/snippets/ListTaggedCascade\":{\"title\":\"$:/snippets/ListTaggedCascade\",\"text\":\"\\\\whitespace trim\\n{{||$:/language/ControlPanel/Cascades/TagPrompt}}\\n\\n\u003Col>\\n\u003C$list filter=\\\"[all[shadows+tiddlers]tag\u003CcurrentTiddler>]\\\">\\n\u003Cli>\\n\u003Cdiv>\\n\u003C$link>\u003C$text text=\u003C\u003CcurrentTiddler>>/>\u003C/$link>\\n\u003C/div>\\n\u003C$codeblock code={{!!text}}/>\\n\u003C/li>\\n\u003C/$list>\\n\u003C/ol>\\n\"},\"$:/Manager/ItemMain/Fields\":{\"title\":\"$:/Manager/ItemMain/Fields\",\"tags\":\"$:/tags/Manager/ItemMain\",\"caption\":\"{{$:/language/Manager/Item/Fields}}\",\"text\":\"\\\\whitespace trim\\n\u003Ctable>\\n\u003Ctbody>\\n\u003C$list filter=\\\"[all[current]fields[]sort[title]] -text\\\" template=\\\"$:/core/ui/TiddlerFieldTemplate\\\" variable=\\\"listItem\\\"/>\\n\u003C/tbody>\\n\u003C/table>\\n\"},\"$:/Manager/ItemMain/RawText\":{\"title\":\"$:/Manager/ItemMain/RawText\",\"tags\":\"$:/tags/Manager/ItemMain\",\"caption\":\"{{$:/language/Manager/Item/RawText}}\",\"text\":\"\u003Cpre>\u003Ccode>\u003C$view/>\u003C/code>\u003C/pre>\\n\"},\"$:/Manager/ItemMain/WikifiedText\":{\"title\":\"$:/Manager/ItemMain/WikifiedText\",\"tags\":\"$:/tags/Manager/ItemMain\",\"caption\":\"{{$:/language/Manager/Item/WikifiedText}}\",\"text\":\"\u003C$transclude mode=\\\"block\\\"/>\\n\"},\"$:/Manager/ItemSidebar/Colour\":{\"title\":\"$:/Manager/ItemSidebar/Colour\",\"tags\":\"$:/tags/Manager/ItemSidebar\",\"caption\":\"{{$:/language/Manager/Item/Colour}}\",\"text\":\"\\\\define swatch-styles()\\nheight: 1em;
2731\\nbackground-color: $(colour)$\\n\\\\end\\n\\n\\\\whitespace trim\\n\u003C$vars colour={{!!color}}>\\n\u003Cp style=\u003C\u003Cswatch-styles>>/>\\n\u003C/$vars>\\n\u003Cp>\\n\u003C$edit-text field=\\\"color\\\" tag=\\\"input\\\" type=\\\"color\\\"/>\\n&#32;/&#32;\\n\u003C$edit-text field=\\\"color\\\" tag=\\\"input\\\" type=\\\"text\\\" size=\\\"9\\\"/>\\n\u003C/p>\\n\"},\"$:/Manager/ItemSidebar/Icon\":{\"title\":\"$:/Manager/ItemSidebar/Icon\",\"tags\":\"$:/tags/Manager/ItemSidebar\",\"caption\":\"{{$:/language/Manager/Item/Icon}}\",\"text\":\"\\\\whitespace trim\\n\u003Cp>\\n\u003Cdiv class=\\\"tc-manager-icon-editor\\\">\\n\u003C$button popup=\u003C\u003Cqualify \\\"$:/state/popup/image-picker\\\">> class=\\\"tc-btn-invisible\\\">\\n\u003C$transclude tiddler={{!!icon}}>\\n{{$:/language/Manager/Item/Icon/None}}\\n\u003C/$transclude>\\n\u003C/$button>\\n\u003Cdiv class=\\\"tc-block-dropdown-wrapper\\\" style=\\\"position: static;\\\">\\n\u003C$reveal state=\u003C\u003Cqualify \\\"$:/state/popup/image-picker\\\">> type=\\\"nomatch\\\" text=\\\"\\\" default=\\\"\\\" tag=\\\"div\\\" class=\\\"tc-popup\\\">\\n\u003Cdiv class=\\\"tc-block-dropdown tc-popup-keep\\\" style=\\\"width: 80%; left: 10%; right: 10%; padding: 0.5em;\\\">\\n\u003C$macrocall\\n\\t$name=\\\"image-picker-include-tagged-images\\\"\\n\\tactions=\\\"\u003C$action-setfield $field='icon' $value=\u003C\u003CimageTitle>>/>\u003C$action-deletetiddler $tiddler=\u003C\u003Cqualify '$:/state/popup/image-picker'>>/>\\\"/>\\n\u003C/div>\\n\u003C/$reveal>\\n\u003C/div>\\n\u003C/div>\\n\u003C/p>\\n\"},\"$:/Manager/ItemSidebar/Tags\":{\"title\":\"$:/Manager/ItemSidebar/Tags\",\"tags\":\"$:/tags/Manager/ItemSidebar\",\"caption\":\"{{$:/language/Manager/Item/Tags}}\",\"text\":\"\\\\whitespace trim\\n\\\\define tag-checkbox-actions()\\n\u003C$action-listops\\n\\t$tiddler=\\\"$:/config/Manager/RecentTags\\\"\\n\\t$subfilter=\\\"[\u003Ctag>] [list[$:/config/Manager/RecentTags]] +[limit[12]]\\\"\\n/>\\n\\\\end\\n\\n\\\\define tag-picker-actions()\\n\u003C\u003Ctag-checkbox-actions>>\\n\\\\end\\n\\n\u003Cp>\\n\u003C$list filter=\\\"[all[current]tags[]] [list[$:/config/Manager/RecentTags]] +[sort[title]] \\\" variable=\\\"tag\\\" storyview=\\\"pop\\\">\\n\u003Cdiv>\\n\u003C$checkbox tiddler=\u003C\u003CcurrentTiddler>> tag=\u003C\u003Ctag>> actions=\u003C\u003Ctag-checkbox-actions>>>\\n\u003C$macrocall $name=\\\"tag-pill\\\" tag=\u003C\u003Ctag>>/>\\n\u003C/$checkbox>\\n\u003C/div>\\n\u003C/$list>\\n\u003C/p>\\n\u003Cp>\\n\u003C$fieldmangler>\\n\u003C$macrocall $name=\\\"tag-picker\\\" actions=\u003C\u003Ctag-picker-actions>>/>\\n\u003C/$fieldmangler>\\n\u003C/p>\\n\"},\"$:/Manager/ItemSidebar/Tools\":{\"title\":\"$:/Manager/ItemSidebar/Tools\",\"tags\":\"$:/tags/Manager/ItemSidebar\",\"caption\":\"{{$:/language/Manager/Item/Tools}}\",\"text\":\"\\\\whitespace trim\\n\u003Cp>\\n\u003C$button to=\u003C\u003CcurrentTiddler>>>\\n{{$:/core/images/link}}&#32;open\\n\u003C/$button>\\n\u003C/p>\\n\u003Cp>\\n\u003C$button message=\\\"tm-edit-tiddler\\\" param=\u003C\u003CcurrentTiddler>>>\\n{{$:/core/images/edit-button}}&#32;edit\\n\u003C/$button>\\n\u003C/p>\\n\"},\"$:/Manager\":{\"title\":\"$:/Manager\",\"icon\":\"$:/core/images/list\",\"color\":\"#bbb\",\"text\":\"\\\\define lingo-base() $:/language/Manager/\\n\\n\\\\define list-item-content-item()\\n\\\\whitespace trim\\n\u003Cdiv class=\\\"tc-manager-list-item-content-item\\\">\\n\\t\u003C$vars state-title=\\\"\\\"\\\"$:/state/popup/manager/item/$(listItem)$\\\"\\\"\\\">\\n\\t\\t\u003C$reveal state=\u003C\u003Cstate-title>> type=\\\"match\\\" text=\\\"show\\\" default=\\\"show\\\" tag=\\\"div\\\">\\n\\t\\t\\t\u003C$button set=\u003C\u003Cstate-title>> setTo=\\\"hide\\\" class=\\\"tc-btn-invisible tc-manager-list-item-content-item-heading\\\">\\n\\t\\t\\t\\t{{$:/core/images/down-arrow}}&#32;\u003C$transclude tiddler=\u003C\u003ClistItem>> field=\\\"caption\\\"/>\\n\\t\\t\\t\u003C/$button>\\n\\t\\t\u003C/$reveal>\\n\\t\\t\u003C$reveal state=\u003C\u003Cstate-title>> type=\\\"nomatch\\\" text=\\\"show\\\" default=\\\"show\\\" tag=\\\"div\\\">\\n\\t\\t\\t\u003C$button set=\u003C\u003Cstate-title>> setTo=\\\"show\\\" class=\\\"tc-btn-invisible tc-manager-list-item-content-item-heading\\\">\\n\\t\\t\\t\\t{{$:/core/images/right-arrow}}&#32;\u003C$transclude tiddler=\u003C\u003ClistItem>> field=\\\"caption\\\"/>\\n\\t\\t\\t\u003C/$button>\\n\\t\\t\u003C/$reveal>\\n\\t\\t\u003C$reveal state=\u003C\u003Cstate-title>> type=\\\"match\\\" text=\\\"show\\\" default=\\\"show\\\" tag=\\\"div\\\" class=\\\"tc-manager-list-item-content-item-body\\\">\\n\\t\\t\\t\u003C$transclude tiddler=\u003C\u003ClistItem>>/>\\n\\t\\t\u003C/$reveal>\\n\\t\u003C/$vars>\\n\u003C/div>
2731\\n\\\\end\\n\\n\\\\whitespace trim\\n\u003Cdiv class=\\\"tc-manager-wrapper\\\">\\n\\t\u003Cdiv class=\\\"tc-manager-controls\\\">\\n\\t\\t\u003Cdiv class=\\\"tc-manager-control\\\">\\n\\t\\t\\t\u003C\u003Clingo Controls/Show/Prompt>>&#32;\u003C$select tiddler=\\\"$:/config/Manager/Show\\\" default=\\\"tiddlers\\\">\\n\\t\\t\\t\\t\u003Coption value=\\\"tiddlers\\\">\u003C\u003Clingo Controls/Show/Option/Tiddlers>>\u003C/option>\\n\\t\\t\\t\\t\u003Coption value=\\\"tags\\\">\u003C\u003Clingo Controls/Show/Option/Tags>>\u003C/option>\\n\\t\\t\\t\u003C/$select>\\n\\t\\t\u003C/div>\\n\\t\\t\u003Cdiv class=\\\"tc-manager-control\\\">\\n\\t\\t\\t\u003C\u003Clingo Controls/Search/Prompt>>&#32;\u003C$edit-text tiddler=\\\"$:/config/Manager/Filter\\\" tag=\\\"input\\\" default=\\\"\\\" placeholder={{$:/language/Manager/Controls/Search/Placeholder}}/>\\n\\t\\t\u003C/div>\\n\\t\\t\u003Cdiv class=\\\"tc-manager-control\\\">\\n\\t\\t\\t\u003C\u003Clingo Controls/FilterByTag/Prompt>>&#32;\u003C$select tiddler=\\\"$:/config/Manager/Tag\\\" default=\\\"\\\">\\n\\t\\t\\t\\t\u003Coption value=\\\"\\\">\u003C\u003Clingo Controls/FilterByTag/None>>\u003C/option>\\n\\t\\t\\t\\t\u003C$list filter=\\\"[!is{$:/config/Manager/System}tags[]!is[system]sort[title]]\\\" variable=\\\"tag\\\">\\n\\t\\t\\t\\t\\t\u003Coption value=\u003C\u003Ctag>>>\u003C$text text=\u003C\u003Ctag>>/>\u003C/option>\\n\\t\\t\\t\\t\u003C/$list>\\n\\t\\t\\t\u003C/$select>\\n\\t\\t\u003C/div>\\n\\t\\t\u003Cdiv class=\\\"tc-manager-control\\\">\\n\\t\\t\\t\u003C\u003Clingo Controls/Sort/Prompt>>&#32;\u003C$select tiddler=\\\"$:/config/Manager/Sort\\\" default=\\\"title\\\">\\n\\t\\t\\t\\t\u003Coptgroup label=\\\"Common\\\">\\n\\t\\t\\t\\t\\t\u003C$list filter=\\\"title modified modifier created creator created\\\" variable=\\\"field\\\">\\n\\t\\t\\t\\t\\t\\t\u003Coption value=\u003C\u003Cfield>>>\u003C$text text=\u003C\u003Cfield>>/>\u003C/option>\\n\\t\\t\\t\\t\\t\u003C/$list>\\n\\t\\t\\t\\t\u003C/optgroup>\\n\\t\\t\\t\\t\u003Coptgroup label=\\\"All\\\">\\n\\t\\t\\t\\t\\t\u003C$list filter=\\\"[all{$:/config/Manager/Show}!is{$:/config/Manager/System}fields[]sort[title]] -title -modified -modifier -created -creator -created\\\" variable=\\\"field\\\">\\n\\t\\t\\t\\t\\t\\t\u003Coption value=\u003C\u003Cfield>>>\u003C$text text=\u003C\u003Cfield>>/>\u003C/option>\\n\\t\\t\\t\\t\\t\u003C/$list>\\n\\t\\t\\t\\t\u003C/optgroup>\\n\\t\\t\\t\u003C/$select>\\n\\t\\t\\t&#32;\\n\\t\\t\\t\u003C$checkbox tiddler=\\\"$:/config/Manager/Order\\\" field=\\\"text\\\" checked=\\\"reverse\\\" unchecked=\\\"forward\\\" default=\\\"forward\\\">\\n\\t\\t\\t\\t&#32;\\n\\t\\t\\t\\t\u003C\u003Clingo Controls/Order/Prompt>>\\n\\t\\t\\t\u003C/$checkbox>\\n\\t\\t\u003C/div>\\n\\t\\t\u003Cdiv class=\\\"tc-manager-control\\\">\\n\\t\\t\\t\u003C$checkbox tiddler=\\\"$:/config/Manager/System\\\" field=\\\"text\\\" checked=\\\"\\\" unchecked=\\\"system\\\" default=\\\"system\\\">\\n\\t\\t\\t\\t&#32;\\n\\t\\t\\t\\t{{$:/language/SystemTiddlers/Include/Prompt}}\\n\\t\\t\\t\u003C/$checkbox>\\n\\t\\t\u003C/div>\\n\\t\u003C/div>\\n\\t\u003Cdiv class=\\\"tc-manager-list\\\">\\n\\t\\t\u003C$list filter=\\\"[all{$:/config/Manager/Show}!is{$:/config/Manager/System}search{$:/config/Manager/Filter}tag:strict{$:/config/Manager/Tag}sort{$:/config/Manager/Sort}order{$:/config/Manager/Order}]\\\">\\n\\t\\t\\t\u003C$vars transclusion=\u003C\u003CcurrentTiddler>>>\\n\\t\\t\\t\\t\u003Cdiv style=\\\"tc-manager-list-item\\\">\\n\\t\\t\\t\\t\\t\u003C$button popup=\u003C\u003Cqualify \\\"$:/state/manager/popup\\\">> class=\\\"tc-btn-invisible tc-manager-list-item-heading\\\" selectedClass=\\\"tc-manager-list-item-heading-selected\\\">\\n\\t\\t\\t\\t\\t\\t\u003C$text text=\u003C\u003CcurrentTiddler>>/>\\n\\t\\t\\t\\t\\t\u003C/$button>\\n\\t\\t\\t\\t\\t\u003C$reveal state=\u003C\u003Cqualify \\\"$:/state/manager/popup\\\">> type=\\\"nomatch\\\" text=\\\"\\\" default=\\\"\\\" tag=\\\"div\\\" class=\\\"tc-manager-list-item-content tc-popup-handle\\\">\\n\\t\\t\\t\\t\\t\\t\u003Cdiv class=\\\"tc-manager-list-item-content-tiddler\\\">\\n\\t\\t\\t\\t\\t\\t\\t\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/Manager/ItemMain
2731]!has[draft.of]]\\\" variable=\\\"listItem\\\">\\n\\t\\t\\t\\t\\t\\t\\t\\t\u003C\u003Clist-item-content-item>>\\n\\t\\t\\t\\t\\t\\t\\t\u003C/$list>\\n\\t\\t\\t\\t\\t\\t\u003C/div>\\n\\t\\t\\t\\t\\t\\t\u003Cdiv class=\\\"tc-manager-list-item-content-sidebar\\\">\\n\\t\\t\\t\\t\\t\\t\\t\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/Manager/ItemSidebar]!has[draft.of]]\\\" variable=\\\"listItem\\\">\\n\\t\\t\\t\\t\\t\\t\\t\\t\u003C\u003Clist-item-content-item>>\\n\\t\\t\\t\\t\\t\\t\\t\u003C/$list>\\n\\t\\t\\t\\t\\t\\t\u003C/div>\\n\\t\\t\\t\\t\\t\u003C/$reveal>\\n\\t\\t\\t\\t\u003C/div>\\n\\t\\t\\t\u003C/$vars>\\n\\t\\t\u003C/$list>\\n\\t\u003C/div>\\n\u003C/div>\\n\"},\"$:/core/ui/MissingTemplate\":{\"title\":\"$:/core/ui/MissingTemplate\",\"text\":\"\\\\whitespace trim\\n\u003Cdiv class=\\\"tc-tiddler-missing\\\">\\n\u003C$button popup=\u003C\u003Cqualify \\\"$:/state/popup/missing\\\">> class=\\\"tc-btn-invisible tc-missing-tiddler-label\\\">\\n\u003C$view field=\\\"title\\\" format=\\\"text\\\" />\\n\u003C/$button>\\n\u003C$reveal state=\u003C\u003Cqualify \\\"$:/state/popup/missing\\\">> type=\\\"popup\\\" position=\\\"below\\\" animate=\\\"yes\\\">\\n\u003Cdiv class=\\\"tc-drop-down\\\">\\n\u003C$transclude tiddler=\\\"$:/core/ui/ListItemTemplate\\\"/>\\n\u003Chr>\\n\u003C$list filter=\\\"[all[current]backlinks[]sort[title]]\\\" template=\\\"$:/core/ui/ListItemTemplate\\\"/>\\n\u003C/div>\\n\u003C/$reveal>\\n\u003C/div>\\n\"},\"$:/core/ui/MoreSideBar/All\":{\"title\":\"$:/core/ui/MoreSideBar/All\",\"tags\":\"$:/tags/MoreSideBar\",\"caption\":\"{{$:/language/SideBar/All/Caption}}\",\"text\":\"\u003C$list filter={{$:/core/Filters/AllTiddlers!!filter}} template=\\\"$:/core/ui/ListItemTemplate\\\"/>\\n\"},\"$:/core/ui/MoreSideBar/Drafts\":{\"title\":\"$:/core/ui/MoreSideBar/Drafts\",\"tags\":\"$:/tags/MoreSideBar\",\"caption\":\"{{$:/language/SideBar/Drafts/Caption}}\",\"text\":\"\u003C$list filter={{$:/core/Filters/Drafts!!filter}} template=\\\"$:/core/ui/ListItemTemplate\\\"/>\\n\"},\"$:/core/ui/MoreSideBar/Explorer\":{\"title\":\"$:/core/ui/MoreSideBar/Explorer\",\"tags\":\"$:/tags/MoreSideBar\",\"caption\":\"{{$:/language/SideBar/Explorer/Caption}}\",\"text\":\"\u003C\u003Ctree \\\"$:/\\\">>\\n\"},\"$:/core/ui/MoreSideBar/Missing\":{\"title\":\"$:/core/ui/MoreSideBar/Missing\",\"tags\":\"$:/tags/MoreSideBar\",\"caption\":\"{{$:/language/SideBar/Missing/Caption}}\",\"text\":\"\u003C$list filter={{$:/core/Filters/Missing!!filter}} template=\\\"$:/core/ui/MissingTemplate\\\"/>\\n\"},\"$:/core/ui/MoreSideBar/Orphans\":{\"title\":\"$:/core/ui/MoreSideBar/Orphans\",\"tags\":\"$:/tags/MoreSideBar\",\"caption\":\"{{$:/language/SideBar/Orphans/Caption}}\",\"text\":\"\u003C$list filter={{$:/core/Filters/Orphans!!filter}} template=\\\"$:/core/ui/ListItemTemplate\\\"/>\\n\"},\"$:/core/ui/MoreSideBar/Plugins\":{\"title\":\"$:/core/ui/MoreSideBar/Plugins\",\"tags\":\"$:/tags/MoreSideBar\",\"caption\":\"{{$:/language/ControlPanel/Plugins/Caption}}\",\"text\":\"\\n{{$:/language/ControlPanel/Plugins/Installed/Hint}}\\n\\n\u003C$macrocall $name=\\\"tabs\\\" tabsList=\\\"[all[shadows+tiddlers]tag[$:/tags/MoreSideBar/Plugins]!has[draft.of]]\\\" default=\\\"$:/core/ui/MoreSideBar/Plugins/Plugins\\\" explicitState=\\\"$:/state/tab-1163638994\\\"/>\\n\"},\"$:/core/ui/MoreSideBar/Recent\":{\"title\":\"$:/core/ui/MoreSideBar/Recent\",\"tags\":\"$:/tags/MoreSideBar\",\"caption\":\"{{$:/language/SideBar/Recent/Caption}}\",\"text\":\"\u003C$macrocall $name=\\\"timeline\\\" format={{$:/language/RecentChanges/DateFormat}}/>\\n\"},\"$:/core/ui/MoreSideBar/Shadows\":{\"title\":\"$:/core/ui/MoreSideBar/Shadows\",\"tags\":\"$:/tags/MoreSideBar\",\"caption\":\"{{$:/language/SideBar/Shadows/Caption}}\",\"text\":\"\u003C$list filter={{$:/core/Filters/ShadowTiddlers!!filter}} template=\\\"$:/core/ui/ListItemTemplate\\\"/>\\n\"},\"$:/core/ui/MoreSideBar/System\":{\"title\":\"$:/core/ui/MoreSideBar/System\",\"tags\":\"$:/tags/MoreSideBar\",\"caption\":\"{{$:/language/SideBar/System/Caption}}\",\"text\":\"\u003C$list filter={{$:/core/Filters/SystemTiddlers!!filter}} template=\\\"$:/core/ui/ListItemTemplate\\\"/>\\n\"},\"$:/core/ui/MoreSideBar/Tags\":{\"title\":\"$:/core/ui/MoreSideBar/Tags\",\"tags\":\"$:/tags/MoreSideBar\",\"caption\":\"{{$:/language/SideBar/Tags/Caption}}\",\"text\":\"\\\\whitespace trim\\n\u003C$let tv-config-toolbar-icons=\\\"yes\\\" tv-config-toolbar-text=\\\"yes\\\" tv-config-toolbar-class=\\\"\\\">\\n\\t\u003Cdiv class=\\\"tc-tiny-v-gap-bottom\\\">\\n\\t\\t{{$:/core/ui/Buttons/tag-manager}}\\n\\t\u003C/div>\\n\u003C/$let>\\n\u003C$list filter={{$:/core/Filters/AllTags!!filter}}>\\n\\t\u003Cdiv class=\\\"tc-tiny-v-gap-bottom\\\">\\n\\t\\t\u003C$transclude tiddler=\\\"$:/core/ui/TagTemplate\\\"/>\\n\\t\u003C/div>\\n\u003C/$list>\\n\u003Chr class=\\\"tc-untagged-separator\\\">\\n{{$:/core/ui/UntaggedTemplate}}\\n\"},\"$:/core/ui/MoreSideBar/Types\":{\"title\":\"$:/core/ui/MoreSideBar/Types\",\"tags\":\"$:/tags/MoreSideBar\",\"caption\":\"{{$:/language/SideBar/Types/Caption}}\",\"text\":\"\\\\whitespace trim\\n\u003C$list filter={{$:/core/Filters/TypedTiddlers!!filter}}>\\n\u003Cdiv class=\\\"tc-menu-list-item\\\">\\n\u003C$view field=\\\"type\\\"/>\\n\u003C$list filter=\\\"[type{!!type}!is[system]sort[title]]\\\">\\n\u003Cdiv class=\\\"tc-menu-list-subitem\\\">\\n\u003C$link to={{!!title}}>\u003C$view field=\\\"title\\\"/>\u003C/$link>\\n\u003C/div>\\n\u003C/$list>\\n\u003C/div>\\n\u003C/$list>\\n\"},\"$:/core/ui/MoreSideBar/Plugins/Languages\":{\"title\":\"$:/core/ui/MoreSideBar/Plugins/Languages\",\"tags\":\"$:/tags/MoreSideBar/Plugins\",\"caption\":\"{{$:/language/ControlPanel/Plugins/Languages/Caption}}\",\"text\":\"\u003C$list filter=\\\"[!has[draft.of]plugin-type[language]sort[name]]\\\" template=\\\"$:/core/ui/PluginListItemTemplate\\\" emptyMessage={{$:/language/ControlPanel/Plugins/Empty/Hint}}/>\\n\"},\"$:/core/ui/MoreSideBar/Plugins/Plugins\":{\"title\":\"$:/core/ui/MoreSideBar/Plugins/Plugins\",\"tags\":\"$:/tags/MoreSideBar/Plugins\",\"caption\":\"{{$:/language/ControlPanel/Plugins/Plugins/Caption}}\",\"text\":\"\u003C$list filter=\\\"[!has[draft.of]plugin-type[plugin]sort[name]]\\\" template=\\\"$:/core/ui/PluginListItemTemplate\\\" emptyMessage={{$:/language/ControlPanel/Plugins/Empty/Hint}}>>/>\\n\"}
2731,\"$:/core/ui/MoreSideBar/Plugins/Theme\":{\"title\":\"$:/core/ui/MoreSideBar/Plugins/Theme\",\"tags\":\"$:/tags/MoreSideBar/Plugins\",\"caption\":\"{{$:/language/ControlPanel/Plugins/Themes/Caption}}\",\"text\":\"\u003C$list filter=\\\"[!has[draft.of]plugin-type[theme]sort[name]]\\\" template=\\\"$:/core/ui/PluginListItemTemplate\\\" emptyMessage={{$:/language/ControlPanel/Plugins/Empty/Hint}}/>\\n\"},\"$:/core/ui/Buttons/advanced-search\":{\"title\":\"$:/core/ui/Buttons/advanced-search\",\"tags\":\"$:/tags/PageControls\",\"caption\":\"{{$:/core/images/advanced-search-button}} {{$:/language/Buttons/AdvancedSearch/Caption}}\",\"description\":\"{{$:/language/Buttons/AdvancedSearch/Hint}}\",\"text\":\"\\\\whitespace trim\\n\\\\define advanced-search-button(class)\\n\\\\whitespace trim\\n\u003C$button to=\\\"$:/AdvancedSearch\\\" tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\\\"\\\"\\\"$(tv-config-toolbar-class)$ $class$\\\"\\\"\\\">\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/advanced-search-button}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\u003C$text text={{$:/language/Buttons/AdvancedSearch/Caption}}/>\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\\n\\\\end\\n\\n\u003C$list filter=\\\"[list[$:/StoryList]] +[field:title[$:/AdvancedSearch]]\\\" emptyMessage=\u003C\u003Cadvanced-search-button>>>\\n\u003C\u003Cadvanced-search-button \\\"tc-selected\\\">>\\n\u003C/$list>\\n\"},\"$:/core/ui/Buttons/close-all\":{\"title\":\"$:/core/ui/Buttons/close-all\",\"tags\":\"$:/tags/PageControls\",\"caption\":\"{{$:/core/images/close-all-button}} {{$:/language/Buttons/CloseAll/Caption}}\",\"description\":\"{{$:/language/Buttons/CloseAll/Hint}}\",\"text\":\"\\\\whitespace trim\\n\u003C$button message=\\\"tm-close-all-tiddlers\\\" tooltip={{$:/language/Buttons/CloseAll/Hint}} aria-label={{$:/language/Buttons/CloseAll/Caption}} class=\u003C\u003Ctv-config-toolbar-class>>>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/close-all-button}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\\n\u003C$text text={{$:/language/Buttons/CloseAll/Caption}}/>\\n\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\"},\"$:/core/ui/Buttons/control-panel\":{\"title\":\"$:/core/ui/Buttons/control-panel\",\"tags\":\"$:/tags/PageControls\",\"caption\":\"{{$:/core/images/options-button}} {{$:/language/Buttons/ControlPanel/Caption}}\",\"description\":\"{{$:/language/Buttons/ControlPanel/Hint}}\",\"text\":\"\\\\whitespace trim\\n\\\\define control-panel-button(class)\\n\\\\whitespace trim\\n\u003C$button to=\\\"$:/ControlPanel\\\" tooltip={{$:/language/Buttons/ControlPanel/Hint}} aria-label={{$:/language/Buttons/ControlPanel/Caption}} class=\\\"\\\"\\\"$(tv-config-toolbar-class)$ $class$\\\"\\\"\\\">\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/options-button}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\u003C$text text={{$:/language/Buttons/ControlPanel/Caption}}/>\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\\n\\\\end\\n\\n\u003C$list filter=\\\"[list\u003Ctv-story-list>] +[field:title[$:/ControlPanel]]\\\" emptyMessage=\u003C\u003Ccontrol-panel-button>>>\\n\u003C\u003Ccontrol-panel-button \\\"tc-selected\\\">>\\n\u003C/$list>\\n\"},\"$:/core/ui/Buttons/encryption\":{\"title\":\"$:/core/ui/Buttons/encryption\",\"tags\":\"$:/tags/PageControls\",\"caption\":\"{{$:/core/images/locked-padlock}} {{$:/language/Buttons/Encryption/Caption}}\",\"description\":\"{{$:/language/Buttons/Encryption/Hint}}\",\"text\":\"\\\\whitespace trim\\n\u003C$reveal type=\\\"match\\\" state=\\\"$:/isEncrypted\\\" text=\\\"yes\\\">\\n\u003C$button message=\\\"tm-clear-password\\\" tooltip={{$:/language/Buttons/Encryption/ClearPassword/Hint}} aria-label={{$:/language/Buttons/Encryption/ClearPassword/Caption}} class=\u003C\u003Ctv-config-toolbar-class>>>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/locked-padlock}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\\n\u003C$text text={{$:/language/Buttons/Encryption/ClearPassword/Caption}}/>\\n\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\\n\u003C/$reveal>\\n\u003C$reveal type=\\\"nomatch\\\" state=\\\"$:/isEncrypted\\\" text=\\\"yes\\\">\\n\u003C$button message=\\\"tm-set-password\\\" tooltip={{$:/language/Buttons/Encryption/SetPassword/Hint}} aria-label={{$:/language/Buttons/Encryption/SetPassword/Caption}} class=\u003C\u003Ctv-config-toolbar-class>>>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/unlocked-padlock}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\\n\u003C$text text={{$:/language/Buttons/Encryption/SetPassword/Caption}}/>\\n\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\\n\u003C/$reveal>\\n\"},\"$:/core/ui/Buttons/export-page\":{\"title\":\"$:/core/ui/Buttons/export-page\",\"tags\":\"$:/tags/PageControls\",\"caption\":\"{{$:/core/images/export-button}} {{$:/language/Buttons/ExportPage/Caption}}\",\"description\":\"{{$:/language/Buttons/ExportPage/Hint}}\",\"text\":\"\u003C$macrocall $name=\\\"exportButton\\\" exportFilter=\\\"[!is[system]sort[title]]\\\" lingoBase=\\\"$:/language/Buttons/ExportPage/\\\"/>\"},\"$:/core/ui/Buttons/fold-all\":{\"title\":\"$:/core/ui/Buttons/fold-all\",\"tags\":\"$:/tags/PageControls\",\"caption\":\"{{$:/core/images/fold-all-button}} {{$:/language/Buttons/FoldAll/Caption}}\",\"description\":\"{{$:/language/Buttons/FoldAll/Hint}}\",\"text\":\"\\\\whitespace trim\\n\u003C$button tooltip={{$:/language/Buttons/FoldAll/Hint}} aria-label={{$:/language/Buttons/FoldAll/Caption}} class=\u003C\u003Ctv-config-toolbar-class>>>\\n\u003C$action-sendmessage $message=\\\"tm-fold-all-tiddlers\\\" $param=\u003C\u003CcurrentTiddler>> foldedStatePrefix=\\\"$:/state/folded/\\\"/>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\" variable=\\\"listItem\\\">\\n{{$:/core/images/fold-all-button}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\\n\u003C$text text={{$:/language/Buttons/FoldAll/Caption}}/>\\n\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\"},\"$:/core/ui/Buttons/full-screen\":{\"title\":\"$:/core/ui/Buttons/full-screen\",\"tags\":\"$:/tags/PageControls\",\"caption\":\"{{$:/core/images/full-screen-button}} {{$:/language/Buttons/FullScreen/Caption}}\",\"description\":\"{{$:/language/Buttons/FullScreen/Hint}}\",\"text\":\"\\\\whitespace trim\\n\u003C$button message=\\\"tm-full-screen\\\" tooltip={{$:/language/Buttons/FullScreen/Hint}} aria-label={{$:/language/Buttons/FullScreen/Caption}} class=\u003C\u003Ctv-config-toolbar-class>>>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/full-screen-button}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\\n\u003C$text text={{$:/language/Buttons/FullScreen/Caption}}/>\\n\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\"},\"$:/core/ui/Buttons/home\":{\"title\":\"$:/core/ui/Buttons/home\",\"tags\":\"$:/tags/PageControls\",\"caption\":\"{{$:/core/images/home-button}} {{$:/language/Buttons/Home/Caption}}\",\"description\":\"{{$:/language/Buttons/Home/Hint}}\",\"text\":\"\\\\whitespace trim\\n\u003C$button message=\\\"tm-home\\\" tooltip={{$:/language/Buttons/Home/Hint}} aria-label={{$:/language/Buttons/Home/Caption}} class=\u003C\u003Ctv-config-toolbar-class>>>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/home-button}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\\n\u003C$text text={{$:/language/Buttons/Home/Caption}}/>\\n\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\"},\"$:/core/ui/Buttons/import\":{\"title\":\"$:/core/ui/Buttons/import\",\"tags\":\"$:/tags/PageControls\",\"caption\":\"{{$:/core/images/import-button}} {{$:/language/Buttons/Import/Caption}}\",\"description\":\"{{$:/language/Buttons/Import/Hint}}\",\"text\":\"\\\\whitespace trim\\n\u003Cdiv class=\\\"tc-file-input-wrapper\\\">\\n\u003C$button tooltip={{$:/language/Buttons/Import/Hint}} aria-label={{$:/language/Buttons/Import/Caption}} class=\u003C\u003Ctv-config-toolbar-class>>>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/import-button}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\\n\u003C$text text={{$:/language/Buttons/Import/Caption}}/>\\n\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\\n\u003C$browse tooltip={{$:/language/Buttons/Import/Hint}}/>\\n\u003C/div>\"},\"$:/core/ui/Buttons/language\":{\"title\":\"$:/core/ui/Buttons/language\",\"tags\":\"$:/tags/PageControls\",\"caption\":\"{{$:/core/images/globe}} {{$:/language/Buttons/Language/Caption}}\",\"description\":\"{{$:/language/Buttons/Language/Hint}}\",\"text\":\"\\\\whitespace trim\\n\\\\define flag-title()\\n$(languagePluginTitle)$/icon\\n\\\\end\\n\u003Cspan class=\\\"tc-popup-keep\\\">\\n\u003C$button popup=\u003C\u003Cqualify \\\"$:/state/popup/language\\\">> tooltip={{$:/language/Buttons/Language/Hint}} aria-label={{$:/language/Buttons/Language/Caption}} class=\u003C\u003Ctv-config-toolbar-class>> selectedClass=\\\"tc-selected\\\">\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-image-button\\\">\\n\u003C$set name=\\\"languagePluginTitle\\\" value={{$:/language}}>\\n\u003C$image source=\u003C\u003Cflag-title>>/>\\n\u003C/$set>\\n\u003C/span>\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\u003C$text text={{$:/language/Buttons/Language/Caption}}/>\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\\n\u003C/span>\\n\u003C$reveal state=\u003C\u003Cqualify \\\"$:/state/popup/language\\\">> type=\\\"popup\\\" position=\\\"below\\\" animate=\\\"yes\\\">\\n\u003Cdiv class=\\\"tc-drop-down\\\">\\n{{$:/snippets/languageswitcher}}\\n\u003C/div>\\n\u003C/$reveal>\\n\"},\"$:/core/ui/Buttons/layout\":{\"title\":\"$:/core/ui/Buttons/layout\",\"tags\":\"$:/tags/PageControls\",\"caption\":\"{{$:/core/images/layout-button}} {{$:/language/Buttons/LayoutSwitcher/Caption}}\",\"description\":\"{{$:/language/LayoutSwitcher/Description}}\",\"text\":\"\\\\whitespace trim\\n\u003C$button tooltip={{$:/language/Buttons/LayoutSwitcher/Hint}} aria-label={{$:/language/Buttons/LayoutSwitcher/Caption}} class=\u003C\u003Ctv-config-toolbar-class>>>\\n\u003C$action-sendmessage $message=\\\"tm-show-switcher\\\" switch=\\\"layout\\\"/>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/layout-button}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\u003C$text text={{$:/language/Buttons/LayoutSwitcher/Caption}}/>\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\\n\"},\"$:/core/ui/Buttons/manager\":{\"title\":\"$:/core/ui/Buttons/manager\",\"tags\":\"$:/tags/PageControls\",\"caption\":\"{{$:/core/images/list}} {{$:/language/Buttons/Manager/Caption}}\",\"description\":\"{{$:/language/Buttons/Manager/Hint}}\",\"text\":\"\\\\whitespace trim\\n\\\\define manager-button(class)\\n\\\\whitespace trim\\n\u003C$button to=\\\"$:/Manager\\\" tooltip={{$:/language/Buttons/Manager/Hint}} aria-label={{$:/language/Buttons/Manager/Caption}} class=\\\"\\\"\\\"$(tv-config-toolbar-class)$ $class$\\\"\\\"\\\">\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/list}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\\n\u003C$text text={{$:/language/Buttons/Manager/Caption}}/>\\n\u003C/span>\\n\u003C/$list>\\n\u003C/$button>
2731\\n\\\\end\\n\\n\u003C$list filter=\\\"[list[$:/StoryList]] +[field:title[$:/Manager]]\\\" emptyMessage=\u003C\u003Cmanager-button>>>\\n\u003C\u003Cmanager-button \\\"tc-selected\\\">>\\n\u003C/$list>\\n\"},\"$:/core/ui/Buttons/more-page-actions\":{\"title\":\"$:/core/ui/Buttons/more-page-actions\",\"tags\":\"$:/tags/PageControls\",\"caption\":\"{{$:/core/images/down-arrow}} {{$:/language/Buttons/More/Caption}}\",\"description\":\"{{$:/language/Buttons/More/Hint}}\",\"text\":\"\\\\whitespace trim\\n\\\\define config-title()\\n$:/config/PageControlButtons/Visibility/$(listItem)$\\n\\\\end\\n\u003C$button popup=\u003C\u003Cqualify \\\"$:/state/popup/more\\\">> tooltip={{$:/language/Buttons/More/Hint}} aria-label={{$:/language/Buttons/More/Caption}} class=\u003C\u003Ctv-config-toolbar-class>> selectedClass=\\\"tc-selected\\\">\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/down-arrow}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\\n\u003C$text text={{$:/language/Buttons/More/Caption}}/>\\n\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\u003C$reveal state=\u003C\u003Cqualify \\\"$:/state/popup/more\\\">> type=\\\"popup\\\" position=\\\"below\\\" animate=\\\"yes\\\">\\n\\n\u003Cdiv class=\\\"tc-drop-down\\\">\\n\\n\u003C$set name=\\\"tv-config-toolbar-icons\\\" value=\\\"yes\\\">\\n\\n\u003C$set name=\\\"tv-config-toolbar-text\\\" value=\\\"yes\\\">\\n\\n\u003C$set name=\\\"tv-config-toolbar-class\\\" value=\\\"tc-btn-invisible\\\">\\n\\n\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]] -[[$:/core/ui/Buttons/more-page-actions]]\\\" variable=\\\"listItem\\\">\\n\\n\u003C$reveal type=\\\"match\\\" state=\u003C\u003Cconfig-title>> text=\\\"hide\\\">\\n\\n\u003C$set name=\\\"tv-config-toolbar-class\\\" filter=\\\"[\u003Ctv-config-toolbar-class>] [\u003ClistItem>encodeuricomponent[]addprefix[tc-btn-]]\\\">\\n\\n\u003C$transclude tiddler=\u003C\u003ClistItem>> mode=\\\"inline\\\"/>\\n\\n\u003C/$set>\\n\\n\u003C/$reveal>\\n\\n\u003C/$list>\\n\\n\u003C/$set>\\n\\n\u003C/$set>\\n\\n\u003C/$set>\\n\\n\u003C/div>\\n\\n\u003C/$reveal>\"},\"$:/core/ui/Buttons/network-activity\":{\"title\":\"$:/core/ui/Buttons/network-activity\",\"tags\":\"$:/tags/PageControls\",\"caption\":\"{{$:/core/images/network-activity}} {{$:/language/Buttons/NetworkActivity/Caption}}\",\"description\":\"{{$:/language/Buttons/NetworkActivity/Hint}}\",\"text\":\"\\\\whitespace trim\\n\u003C$button message=\\\"tm-http-cancel-all-requests\\\" tooltip={{$:/language/Buttons/NetworkActivity/Hint}} aria-label={{$:/language/Buttons/NetworkActivity/Caption}} class=\u003C\u003Ctv-config-toolbar-class>>>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/network-activity}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\\n\u003C$text text={{$:/language/Buttons/NetworkActivity/Caption}}/>\\n\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\"},\"$:/core/ui/Buttons/new-image\":{\"title\":\"$:/core/ui/Buttons/new-image\",\"tags\":\"$:/tags/PageControls\",\"caption\":\"{{$:/core/images/new-image-button}} {{$:/language/Buttons/NewImage/Caption}}\",\"description\":\"{{$:/language/Buttons/NewImage/Hint}}\",\"text\":\"\\\\whitespace trim\\n\u003C$button tooltip={{$:/language/Buttons/NewImage/Hint}} aria-label={{$:/language/Buttons/NewImage/Caption}} class=\u003C\u003Ctv-config-toolbar-class>> actions={{$:/core/ui/Actions/new-image}}>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/new-image-button}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\\n\u003C$text text={{$:/language/Buttons/NewImage/Caption}}/>\\n\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\\n\"},\"$:/core/ui/Buttons/new-journal\":{\"title\":\"$:/core/ui/Buttons/new-journal\",\"tags\":\"$:/tags/PageControls\",\"caption\":\"{{$:/core/images/new-journal-button}} {{$:/language/Buttons/NewJournal/Caption}}\",\"description\":\"{{$:/language/Buttons/NewJournal/Hint}}\",\"text\":\"\\\\whitespace trim\\n\\\\define journalButton()\\n\\\\whitespace trim\\n\u003C$button tooltip={{$:/language/Buttons/NewJournal/Hint}} aria-label={{$:/language/Buttons/NewJournal/Caption}} class=\u003C\u003Ctv-config-toolbar-class>> actions={{$:/core/ui/Actions/new-journal}}>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/new-journal-button}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\\n\u003C$text text={{$:/language/Buttons/NewJournal/Caption}}/>\\n\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\\n\\\\end\\n\u003C\u003CjournalButton>>\\n\"},\"$:/core/ui/Buttons/new-tiddler\":{\"title\":\"$:/core/ui/Buttons/new-tiddler\",\"tags\":\"$:/tags/PageControls\",\"caption\":\"{{$:/core/images/new-button}} {{$:/language/Buttons/NewTiddler/Caption}}\",\"description\":\"{{$:/language/Buttons/NewTiddler/Hint}}\",\"text\":\"\\\\whitespace trim\\n\u003C$button actions={{$:/core/ui/Actions/new-tiddler}} tooltip={{$:/language/Buttons/NewTiddler/Hint}} aria-label={{$:/language/Buttons/NewTiddler/Caption}} class=\u003C\u003Ctv-config-toolbar-class>>>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/new-button}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\\n\u003C$text text={{$:/language/Buttons/NewTiddler/Caption}}/>\\n\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\\n\"},\"$:/core/ui/Buttons/palette\":{\"title\":\"$:/core/ui/Buttons/palette\",\"tags\":\"$:/tags/PageControls\",\"caption\":\"{{$:/core/images/palette}} {{$:/language/Buttons/Palette/Caption}}\",\"description\":\"{{$:/language/Buttons/Palette/Hint}}\",\"text\":\"\\\\whitespace trim\\n\u003Cspan class=\\\"tc-popup-keep\\\">\\n\u003C$button popup=\u003C\u003Cqualify \\\"$:/state/popup/palette\\\">> tooltip={{$:/language/Buttons/Palette/Hint}} aria-label={{$:/language/Buttons/Palette/Caption}} class=\u003C\u003Ctv-config-toolbar-class>> selectedClass=\\\"tc-selected\\\">\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/palette}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\u003C$text text={{$:/language/Buttons/Palette/Caption}}/>\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\\n\u003C/span>\\n\u003C$reveal state=\u003C\u003Cqualify \\\"$:/state/popup/palette\\\">> type=\\\"popup\\\" position=\\\"below\\\" animate=\\\"yes\\\">\\n\u003Cdiv class=\\\"tc-drop-down\\\" style=\\\"font-size:0.7em;\\\">\\n{{$:/snippets/paletteswitcher}}\\n\u003C/div>\\n\u003C/$reveal>\\n\"},\"$:/core/ui/Buttons/print\":{\"title\":\"$:/core/ui/Buttons/print\",\"tags\":\"$:/tags/PageControls\",\"caption\":\"{{$:/core/images/print-button}} {{$:/language/Buttons/Print/Caption}}\",\"description\":\"{{$:/language/Buttons/Print/Hint}}\",\"text\":\"\\\\whitespace trim\\n\u003C$button message=\\\"tm-print\\\" tooltip={{$:/language/Buttons/Print/Hint}} aria-label={{$:/language/Buttons/Print/Caption}} class=\u003C\u003Ctv-config-toolbar-class>>>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/print-button}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\\n\u003C$text text={{$:/language/Buttons/Print/Caption}}/>\\n\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\"},\"$:/core/ui/Buttons/refresh\":{\"title\":\"$:/core/ui/Buttons/refresh\",\"tags\":\"$:/tags/PageControls\",\"caption\":\"{{$:/core/images/refresh-button}} {{$:/language/Buttons/Refresh/Caption}}\",\"description\":\"{{$:/language/Buttons/Refresh/Hint}}\",\"text\":\"\\\\whitespace trim\\n\u003C$button message=\\\"tm-browser-refresh\\\" tooltip={{$:/language/Buttons/Refresh/Hint}} aria-label={{$:/language/Buttons/Refresh/Caption}} class=\u003C\u003Ctv-config-toolbar-class>>>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/refresh-button}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\\n\u003C$text text={{$:/language/Buttons/Refresh/Caption}}/>\\n\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\"},\"$:/core/ui/Buttons/save-wiki\":{\"title\":\"$:/core/ui/Buttons/save-wiki\",\"tags\":\"$:/tags/PageControls\",\"caption\":\"{{$:/core/images/save-button-dynamic}} {{$:/language/Buttons/SaveWiki/Caption}}\",\"description\":\"{{$:/language/Buttons/SaveWiki/Hint}}\",\"text\":\"\\\\whitespace trim\\n\u003C$button tooltip={{$:/language/Buttons/SaveWiki/Hint}} aria-label={{$:/language/Buttons/SaveWiki/Caption}} class=\u003C\u003Ctv-config-toolbar-class>>>\\n\u003C$wikify name=\\\"site-title\\\" text={{$:/config/SaveWikiButton/Filename}}>\\n\u003C$action-sendmessage $message=\\\"tm-save-wiki\\\" $param={{$:/config/SaveWikiButton/Template}} filename=\u003C\u003Csite-title>>/>\\n\u003C/$wikify>\\n\u003Cspan class=\\\"tc-dirty-indicator\\\">\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/save-button-dynamic}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\\n\u003C$text text={{$:/language/Buttons/SaveWiki/Caption}}/>\\n\u003C/span>\\n\u003C/$list>\\n\u003C/span>\\n\u003C/$button>\"},\"$:/core/ui/Buttons/storyview\":{\"title\":\"$:/core/ui/Buttons/storyview\",\"tags\":\"$:/tags/PageControls\",\"caption\":\"{{$:/core/images/storyview-classic}} {{$:/language/Buttons/StoryView/Caption}}\",\"description\":\"{{$:/language/Buttons/StoryView/Hint}}\",\"text\":\"\\\\whitespace trim\\n\\\\define icon()\\n$:/core/images/storyview-$(storyview)$\\n\\\\end\\n\u003Cspan class=\\\"tc-popup-keep\\\">\\n\u003C$button popup=\u003C\u003Cqualify \\\"$:/state/popup/storyview\\\">> tooltip={{$:/language/Buttons/StoryView/Hint}} aria-label={{$:/language/Buttons/StoryView/Caption}} class=\u003C\u003Ctv-config-toolbar-class>> selectedClass=\\\"tc-selected\\\">\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n\u003C$set name=\\\"storyview\\\" value={{$:/view}}>\\n\u003C$transclude tiddler=\u003C\u003Cicon>>/>\\n\u003C/$set>\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\u003C$text text={{$:/language/Buttons/StoryView/Caption}}/>\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\\n\u003C/span>\\n\u003C$reveal state=\u003C\u003Cqualify \\\"$:/state/popup/storyview\\\">> type=\\\"popup\\\" position=\\\"below\\\" animate=\\\"yes\\\">\\n\u003Cdiv class=\\\"tc-drop-down\\\">\\n{{$:/snippets/viewswitcher}}\\n\u003C/div>\\n\u003C/$reveal>\\n\"},\"$:/core/ui/Buttons/tag-manager\":{\"title\":\"$:/core/ui/Buttons/tag-manager\",\"tags\":\"$:/tags/PageControls\",\"caption\":\"{{$:/core/images/tag-button}} {{$:/language/Buttons/TagManager/Caption}}\",\"description\":\"{{$:/language/Buttons/TagManager/Hint}}\",\"text\":\"\\\\whitespace trim\\n\\\\define control-panel-button(class)\\n\\\\whitespace trim\\n\u003C$button to=\\\"$:/TagManager\\\" tooltip={{$:/language/Buttons/TagManager/Hint}} aria-label={{$:/language/Buttons/TagManager/Caption}} class=\\\"\\\"\\\"$(tv-config-toolbar-class)$ $class$\\\"\\\"\\\">\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/tag-button}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\\n\u003C$text text={{$:/language/Buttons/TagManager/Caption}}/>\\n\u003C/span>\\n\u003C/$list>\\n\u003C/$button>
2731\\n\\\\end\\n\\n\u003C$list filter=\\\"[list[$:/StoryList]] +[field:title[$:/TagManager]]\\\" emptyMessage=\u003C\u003Ccontrol-panel-button>>>\\n\u003C\u003Ccontrol-panel-button \\\"tc-selected\\\">>\\n\u003C/$list>\\n\"},\"$:/core/ui/Buttons/theme\":{\"title\":\"$:/core/ui/Buttons/theme\",\"tags\":\"$:/tags/PageControls\",\"caption\":\"{{$:/core/images/theme-button}} {{$:/language/Buttons/Theme/Caption}}\",\"description\":\"{{$:/language/Buttons/Theme/Hint}}\",\"text\":\"\\\\whitespace trim\\n\u003Cspan class=\\\"tc-popup-keep\\\">\\n\u003C$button popup=\u003C\u003Cqualify \\\"$:/state/popup/theme\\\">> tooltip={{$:/language/Buttons/Theme/Hint}} aria-label={{$:/language/Buttons/Theme/Caption}} class=\u003C\u003Ctv-config-toolbar-class>> selectedClass=\\\"tc-selected\\\">\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/theme-button}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\u003C$text text={{$:/language/Buttons/Theme/Caption}}/>\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\\n\u003C/span>\\n\u003C$reveal state=\u003C\u003Cqualify \\\"$:/state/popup/theme\\\">> type=\\\"popup\\\" position=\\\"below\\\" animate=\\\"yes\\\">\\n\u003Cdiv class=\\\"tc-drop-down\\\">\\n\u003C$linkcatcher to=\\\"$:/theme\\\">\\n{{$:/snippets/themeswitcher}}\\n\u003C/$linkcatcher>\\n\u003C/div>\\n\u003C/$reveal>\\n\"},\"$:/core/ui/Buttons/timestamp\":{\"title\":\"$:/core/ui/Buttons/timestamp\",\"tags\":\"$:/tags/PageControls\",\"caption\":\"{{$:/core/images/timestamp-on}} {{$:/language/Buttons/Timestamp/Caption}}\",\"description\":\"{{$:/language/Buttons/Timestamp/Hint}}\",\"text\":\"\\\\whitespace trim\\n\u003C$reveal type=\\\"nomatch\\\" state=\\\"$:/config/TimestampDisable\\\" text=\\\"yes\\\">\\n\u003C$button tooltip={{$:/language/Buttons/Timestamp/On/Hint}} aria-label={{$:/language/Buttons/Timestamp/On/Caption}} class=\u003C\u003Ctv-config-toolbar-class>>>\\n\u003C$action-setfield $tiddler=\\\"$:/config/TimestampDisable\\\" $value=\\\"yes\\\"/>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/timestamp-on}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\\n\u003C$text text={{$:/language/Buttons/Timestamp/On/Caption}}/>\\n\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\\n\u003C/$reveal>\\n\u003C$reveal type=\\\"match\\\" state=\\\"$:/config/TimestampDisable\\\" text=\\\"yes\\\">\\n\u003C$button tooltip={{$:/language/Buttons/Timestamp/Off/Hint}} aria-label={{$:/language/Buttons/Timestamp/Off/Caption}} class=\u003C\u003Ctv-config-toolbar-class>>>\\n\u003C$action-setfield $tiddler=\\\"$:/config/TimestampDisable\\\" $value=\\\"no\\\"/>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/timestamp-off}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\\n\u003C$text text={{$:/language/Buttons/Timestamp/Off/Caption}}/>\\n\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\\n\u003C/$reveal>\\n\"},\"$:/core/ui/Buttons/unfold-all\":{\"title\":\"$:/core/ui/Buttons/unfold-all\",\"tags\":\"$:/tags/PageControls\",\"caption\":\"{{$:/core/images/unfold-all-button}} {{$:/language/Buttons/UnfoldAll/Caption}}\",\"description\":\"{{$:/language/Buttons/UnfoldAll/Hint}}\",\"text\":\"\\\\whitespace trim\\n\u003C$button tooltip={{$:/language/Buttons/UnfoldAll/Hint}} aria-label={{$:/language/Buttons/UnfoldAll/Caption}} class=\u003C\u003Ctv-config-toolbar-class>>>\\n\u003C$action-sendmessage $message=\\\"tm-unfold-all-tiddlers\\\" $param=\u003C\u003CcurrentTiddler>> foldedStatePrefix=\\\"$:/state/folded/\\\"/>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\" variable=\\\"listItem\\\">\\n{{$:/core/images/unfold-all-button}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\\n\u003C$text text={{$:/language/Buttons/UnfoldAll/Caption}}/>\\n\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\"},\"$:/core/ui/PageTemplate/pagecontrols\":{\"title\":\"$:/core/ui/PageTemplate/pagecontrols\",\"text\":\"\\\\whitespace trim\\n\\\\define config-title()\\n$:/config/PageControlButtons/Visibility/$(listItem)$\\n\\\\end\\n\u003Cdiv class=\\\"tc-page-control
2731s\\\">\\n\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]\\\" variable=\\\"listItem\\\">\\n\u003C$set name=\\\"hidden\\\" value=\u003C\u003Cconfig-title>>>\\n\u003C$list filter=\\\"[\u003Chidden>!text[hide]]\\\" storyview=\\\"pop\\\" variable=\\\"ignore\\\">\\n\u003C$set name=\\\"tv-config-toolbar-class\\\" filter=\\\"[\u003Ctv-config-toolbar-class>] [\u003ClistItem>encodeuricomponent[]addprefix[tc-btn-]]\\\">\\n\u003C$transclude tiddler=\u003C\u003ClistItem>> mode=\\\"inline\\\"/>\\n\u003C/$set>\\n\u003C/$list>\\n\u003C/$set>\\n\u003C/$list>\\n\u003C/div>\\n\"},\"$:/core/ui/PageStylesheet\":{\"title\":\"$:/core/ui/PageStylesheet\",\"code-body\":\"yes\",\"text\":\"\\\\import [subfilter{$:/core/config/GlobalImportFilter}]\\n\\\\whitespace trim\\n\\n\u003C$set name=\\\"currentTiddler\\\" value={{$:/language}}>\\n\\n\u003C$set name=\\\"languageTitle\\\" value={{!!name}}>\\n\\n\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/Stylesheet]!has[draft.of]]\\\">\\n\u003C$transclude mode=\\\"block\\\"/>\\n\u003C/$list>\\n\\n\u003C/$set>\\n\\n\u003C/$set>\\n\"},\"$:/core/ui/PageTemplate/alerts\":{\"title\":\"$:/core/ui/PageTemplate/alerts\",\"tags\":\"$:/tags/PageTemplate\",\"text\":\"\u003Cdiv class=\\\"tc-alerts\\\">\\n\\n\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/Alert]!has[draft.of]]\\\" template=\\\"$:/core/ui/AlertTemplate\\\" storyview=\\\"pop\\\"/>\\n\\n\u003C/div>\\n\"},\"$:/core/ui/PageTemplate/drafts\":{\"title\":\"$:/core/ui/PageTemplate/drafts\",\"tags\":\"$:/tags/PageTemplate\",\"text\":\"\\\\whitespace trim\\n\u003C$reveal state=\\\"$:/status/IsReadOnly\\\" type=\\\"nomatch\\\" text=\\\"yes\\\" tag=\\\"div\\\" class=\\\"tc-drafts-list\\\">\\n\u003C$list filter=\\\"[has[draft.of]!sort[modified]] -[list[$:/StoryList]]\\\">\\n\u003C$link>\\n{{$:/core/images/edit-button}} \u003C$text text=\u003C\u003CcurrentTiddler>>/>\\n\u003C/$link>\\n\u003C/$list>\\n\u003C/$reveal>\\n\"},\"$:/core/ui/PageTemplate/pluginreloadwarning\":{\"title\":\"$:/core/ui/PageTemplate/pluginreloadwarning\",\"tags\":\"$:/tags/PageTemplate\",\"text\":\"\\\\define lingo-base() $:/language/\\n\\n\u003C$list filter=\\\"[{$:/status/RequireReloadDueToPluginChange}match[yes]]\\\">\\n\\n\u003C$reveal type=\\\"nomatch\\\" state=\\\"$:/temp/HidePluginWarning\\\" text=\\\"yes\\\">\\n\\n\u003Cdiv class=\\\"tc-plugin-reload-warning\\\">\\n\\n\u003C$set name=\\\"tv-config-toolbar-class\\\" value=\\\"\\\">\\n\\n\u003C\u003Clingo PluginReloadWarning>> \u003C$button set=\\\"$:/temp/HidePluginWarning\\\" setTo=\\\"yes\\\" class=\\\"tc-btn-invisible\\\">{{$:/core/images/close-button}}\u003C/$button>\\n\\n\u003C/$set>\\n\\n\u003C/div>\\n\\n\u003C/$reveal>\\n\\n\u003C/$list>\\n\"},\"$:/core/ui/PageTemplate/sidebar\":{\"title\":\"$:/core/ui/PageTemplate/sidebar\",\"tags\":\"$:/tags/PageTemplate\",\"text\":\"\\\\whitespace trim\\n\\\\define config-title()\\n$:/config/SideBarSegments/Visibility/$(listItem)$\\n\\\\end\\n\\n\u003C$scrollable fallthrough=\\\"no\\\" class=\\\"tc-sidebar-scrollable\\\">\\n\\n\u003Cdiv class=\\\"tc-sidebar-header\\\">\\n\\n\u003C$reveal state=\\\"$:/state/sidebar\\\" type=\\\"match\\\" text=\\\"yes\\\" default=\\\"yes\\\" retain=\\\"yes\\\" animate=\\\"yes\\\">\\n\\n\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/SideBarSegment]!has[draft.of]]\\\" variable=\\\"listItem\\\">\\n\\n\u003C$reveal type=\\\"nomatch\\\" state=\u003C\u003Cconfig-title>> text=\\\"hide\\\"  tag=\\\"div\\\">\\n\\n\u003C$transclude tiddler=\u003C\u003ClistItem>> mode=\\\"block\\\"/>\\n\\n\u003C/$reveal>\\n\\n\u003C/$list>\\n\\n\u003C/$reveal>\\n\\n\u003C/div>\\n\\n\u003C/$scrollable>\\n\"},\"$:/core/ui/PageTemplate/story\":{\"title\":\"$:/core/ui/PageTemplate/story\",\"tags\":\"$:/tags/PageTemplate\",\"text\":\"\\\\whitespace trim\\n\u003Csection class=\\\"tc-story-river\\\" role=\\\"main\\\">\\n\\n\u003Csection class=\\\"story-backdrop\\\">\\n\\n\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/AboveStory]!has[draft.of]]\\\">\\n\\n\u003C$transclude/>\\n\\n\u003C/$list>\\n\\n\u003C/section>\\n\\n\u003C$list filter=\\\"[list[$:/StoryList]]\\\" history=\\\"$:/HistoryList\\\" template=\\\"$:/core/ui/StoryTiddlerTemplate\\\" storyview={{$:/view}} emptyMessage={{$:/config/EmptyStoryMessage}}/>\\n\\n\u003Csection class=\\\"story-frontdrop\\\">\\n\\n\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/BelowStory]!has[draft.of]]\\\">\\n\\n\u003C$transclude/>\\n\\n\u003C/$list>\\n\\n\u003C/section>
2731\\n\\n\u003C/section>\\n\"},\"$:/core/ui/PageTemplate/topleftbar\":{\"title\":\"$:/core/ui/PageTemplate/topleftbar\",\"tags\":\"$:/tags/PageTemplate\",\"text\":\"\u003Cspan class=\\\"tc-topbar tc-topbar-left\\\">\\n\\n\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/TopLeftBar]!has[draft.of]]\\\" variable=\\\"listItem\\\" storyview=\\\"pop\\\">\\n\\n\u003C$transclude tiddler=\u003C\u003ClistItem>> mode=\\\"inline\\\"/>\\n\\n\u003C/$list>\\n\\n\u003C/span>\\n\"},\"$:/core/ui/PageTemplate/toprightbar\":{\"title\":\"$:/core/ui/PageTemplate/toprightbar\",\"tags\":\"$:/tags/PageTemplate\",\"text\":\"\u003Cspan class=\\\"tc-topbar tc-topbar-right\\\">\\n\\n\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/TopRightBar]!has[draft.of]]\\\" variable=\\\"listItem\\\" storyview=\\\"pop\\\">\\n\\n\u003C$transclude tiddler=\u003C\u003ClistItem>> mode=\\\"inline\\\"/>\\n\\n\u003C/$list>\\n\\n\u003C/span>\\n\"},\"$:/core/ui/PageTemplate\":{\"title\":\"$:/core/ui/PageTemplate\",\"name\":\"{{$:/language/PageTemplate/Name}}\",\"description\":\"{{$:/language/PageTemplate/Description}}\",\"icon\":\"$:/core/images/layout-button\",\"code-body\":\"yes\",\"text\":\"\\\\whitespace trim\\n\\\\import [subfilter{$:/core/config/GlobalImportFilter}]\\n\\n\u003C$vars\\n\\ttv-config-toolbar-icons={{$:/config/Toolbar/Icons}}\\n\\ttv-config-toolbar-text={{$:/config/Toolbar/Text}}\\n\\ttv-config-toolbar-class={{$:/config/Toolbar/ButtonClass}}\\n\\ttv-enable-drag-and-drop={{$:/config/DragAndDrop/Enable}}\\n\\ttv-show-missing-links={{$:/config/MissingLinks}}\\n\\tstoryviewTitle={{$:/view}}\\n\\tlanguageTitle={{{ [{$:/language}get[name]] }}}>\\n\\n\u003Cdiv class={{{ [all[shadows+tiddlers]tag[$:/tags/ClassFilters/PageTemplate]!is[draft]] :map:flat[subfilter{!!text}] tc-page-container [[tc-page-view-]addsuffix\u003CstoryviewTitle>] [[tc-language-]addsuffix\u003ClanguageTitle>] :and[unique[]join[ ]] }}} >\\n\\n\u003C$navigator story=\\\"$:/StoryList\\\" history=\\\"$:/HistoryList\\\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\\n\\n\u003C$dropzone enable=\u003C\u003Ctv-enable-drag-and-drop>>>\\n\\n\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/PageTemplate]!has[draft.of]]\\\" variable=\\\"listItem\\\">\\n\\n\u003C$transclude tiddler=\u003C\u003ClistItem>>/>\\n\\n\u003C/$list>\\n\\n\u003C/$dropzone>\\n\\n\u003C/$navigator>\\n\\n\u003C/div>\\n\\n\u003C/$vars>\\n\"},\"$:/PaletteManager\":{\"title\":\"$:/PaletteManager\",\"text\":\"\\\\define lingo-base() $:/language/ControlPanel/Palette/Editor/\\n\\\\define describePaletteColour(colour)\\n\u003C$transclude tiddler=\\\"$:/language/Docs/PaletteColours/$colour$\\\">\u003C$text text=\\\"$colour$\\\"/>\u003C/$transclude>\\n\\\\end\\n\\\\define edit-colour-placeholder()\\n edit $(colourName)$\\n\\\\end\\n\\\\define colour-tooltip(showhide) $showhide$ editor for $(newColourName)$ \\n\\n\\\\define resolve-colour(macrocall)\\n\\\\import $:/core/macros/utils\\n\\\\whitespace trim\\n\u003C$wikify name=\\\"name\\\" text=\\\"\\\"\\\"$macrocall$\\\"\\\"\\\">\\n\u003C\u003Cname>>\\n\u003C/$wikify>\\n\\\\end\\n\\n\\\\define delete-colour-index-actions() \u003C$action-setfield $index=\u003C\u003CcolourName>>/>\\n\\\\define palette-manager-colour-row-segment()\\n\\\\whitespace trim\\n\u003C$edit-text index=\u003C\u003CcolourName>> tag=\\\"input\\\" placeholder=\u003C\u003Cedit-colour-placeholder>> default=\\\"\\\"/>\\n\u003Cbr>\\n\u003C$edit-text index=\u003C\u003CcolourName>> type=\\\"color\\\" tag=\\\"input\\\" class=\\\"tc-palette-manager-colour-input\\\"/>\\n\u003C$list filter=\\\"[\u003CcurrentTiddler>getindex\u003CcolourName>removeprefix[\u003C\u003C]removesuffix[>>]] [\u003CcurrentTiddler>getindex\u003CcolourName>removeprefix[\u003C$]removesuffix[/>]]\\\" variable=\\\"ignore\\\">\\n\u003C$set name=\\\"state\\\" value={{{ [[$:/state/palettemanager/]addsuffix\u003CcurrentTiddler>addsuffix[/]addsuffix\u003CcolourName>] }}}>\\n\u003C$wikify name=\\\"newColourName\\\" text=\\\"\\\"\\\"\u003C$macrocall $name=\\\"resolve-colour\\\" macrocall={{{ [\u003CcurrentTiddler>getindex\u003CcolourName>
2731] }}}/>\\\"\\\"\\\">\\n\u003C$reveal state=\u003C\u003Cstate>> type=\\\"nomatch\\\" text=\\\"show\\\">\\n\u003C$button tooltip=\u003C\u003Ccolour-tooltip show>> aria-label=\u003C\u003Ccolour-tooltip show>> class=\\\"tc-btn-invisible\\\" set=\u003C\u003Cstate>> setTo=\\\"show\\\">{{$:/core/images/down-arrow}}\u003C$text text=\u003C\u003CnewColourName>> class=\\\"tc-small-gap-left\\\"/>\u003C/$button>\u003Cbr>\\n\u003C/$reveal>\\n\u003C$reveal state=\u003C\u003Cstate>> type=\\\"match\\\" text=\\\"show\\\">\\n\u003C$button tooltip=\u003C\u003Ccolour-tooltip hide>> aria-label=\u003C\u003Ccolour-tooltip show>> class=\\\"tc-btn-invisible\\\" actions=\\\"\\\"\\\"\u003C$action-deletetiddler $tiddler=\u003C\u003Cstate>>/>\\\"\\\"\\\">{{$:/core/images/up-arrow}}\u003C$text text=\u003C\u003CnewColourName>> class=\\\"tc-small-gap-left\\\"/>\u003C/$button>\u003Cbr>\\n\u003C/$reveal>\\n\u003C$reveal state=\u003C\u003Cstate>> type=\\\"match\\\" text=\\\"show\\\">\\n\u003C$set name=\\\"colourName\\\" value=\u003C\u003CnewColourName>>>\\n\u003Cbr>\\n\u003C\u003Cpalette-manager-colour-row-segment>>\\n\u003Cbr>\u003Cbr>\\n\u003C/$set>\\n\u003C/$reveal>\\n\u003C/$wikify>\\n\u003C/$set>\\n\u003C/$list>\\n\\\\end\\n\\n\\\\define palette-manager-colour-row()\\n\\\\whitespace trim\\n\u003Ctr>\\n\u003Ctd>\\n\u003Cspan style=\\\"float:right;\\\">\\n\u003C$button tooltip={{$:/language/ControlPanel/Palette/Editor/Delete/Hint}} aria-label={{$:/language/ControlPanel/Palette/Editor/Delete/Hint}} class=\\\"tc-btn-invisible\\\" actions=\u003C\u003Cdelete-colour-index-actions>>>\\n{{$:/core/images/delete-button}}\u003C/$button>\\n\u003C/span>\\n''\u003C$macrocall $name=\\\"describePaletteColour\\\" colour=\u003C\u003CcolourName>>/>''\u003Cbr/>\\n\u003C$macrocall $name=\\\"colourName\\\" $output=\\\"text/plain\\\"/>\\n\u003C/td>\\n\u003Ctd>\\n\u003C\u003Cpalette-manager-colour-row-segment>>\\n\u003C/td>\\n\u003C/tr>\\n\\\\end\\n\\n\\\\define palette-manager-table()\\n\\\\whitespace trim\\n\u003Ctable>\\n\u003Ctbody>\\n\u003C$set name=\\\"colorList\\\" filter=\\\"[{$:/state/palettemanager/showexternal}match[yes]]\\\"\\n   value=\\\"[all[shadows+tiddlers]tag[$:/tags/Palette]indexes[]]\\\" emptyValue=\\\"[\u003CcurrentTiddler>
2731indexes[]]\\\">\\n\u003C$list filter=\u003C\u003CcolorList>> variable=\\\"colourName\\\"> \u003C\u003Cpalette-manager-colour-row>> \u003C/$list>\\n\u003C/$set>\\n\u003C/tbody>\\n\u003C/table>\\n\\\\end\\n\\\\whitespace trim\\n\u003C$set name=\\\"currentTiddler\\\" value={{$:/palette}}>\\n\\n\u003C\u003Clingo Prompt>>&#32;\u003C$link to={{$:/palette}}>\u003C$macrocall $name=\\\"currentTiddler\\\" $output=\\\"text/plain\\\"/>\u003C/$link>\\n\\n\u003C$list filter=\\\"[all[current]is[shadow]is[tiddler]]\\\" variable=\\\"listItem\\\">\\n\u003C\u003Clingo Prompt/Modified>>\\n&#32;\\n\u003C$button message=\\\"tm-delete-tiddler\\\" param={{$:/palette}}>\u003C\u003Clingo Reset/Caption>>\u003C/$button>\\n\u003C/$list>\\n\\n\u003C$list filter=\\\"[all[current]is[shadow]!is[tiddler]]\\\" variable=\\\"listItem\\\">\\n\u003C\u003Clingo Clone/Prompt>>\\n\u003C/$list>\\n\\n\u003C$button message=\\\"tm-new-tiddler\\\" param={{$:/palette}}>\u003C\u003Clingo Clone/Caption>>\u003C/$button>\\n\\n\u003C$checkbox tiddler=\\\"$:/state/palettemanager/showexternal\\\" field=\\\"text\\\" checked=\\\"yes\\\" unchecked=\\\"no\\\">\u003Cspan class=\\\"tc-small-gap-left\\\">\u003C\u003Clingo Names/External/Show>>\u003C/span>\u003C/$checkbox>\\n\\n\u003C\u003Cpalette-manager-table>>\\n\"},\"$:/core/ui/PluginInfo\":{\"title\":\"$:/core/ui/PluginInfo\",\"text\":\"\\\\define localised-info-tiddler-title()\\n$(currentTiddler)$/$(languageTitle)$/$(currentTab)$\\n\\\\end\\n\\\\define info-tiddler-title()\\n$(currentTiddler)$/$(currentTab)$\\n\\\\end\\n\\\\define default-tiddler-title()\\n$:/core/ui/PluginInfo/Default/$(currentTab)$\\n\\\\end\\n\\\\whitespace trim\\n\u003C$transclude tiddler=\u003C\u003Clocalised-info-tiddler-title>> mode=\\\"block\\\">\\n\u003C$transclude tiddler=\u003C\u003CcurrentTiddler>> subtiddler=\u003C\u003Clocalised-info-tiddler-title>> mode=\\\"block\\\">\\n\u003C$transclude tiddler=\u003C\u003CcurrentTiddler>> subtiddler=\u003C\u003Cinfo-tiddler-title>> mode=\\\"block\\\">\\n\u003C$transclude tiddler=\u003C\u003Cdefault-tiddler-title>> mode=\\\"block\\\">\\n{{$:/language/ControlPanel/Plugin/NoInfoFound/Hint}}\\n\u003C/$transclude>\\n\u003C/$transclude>\\n\u003C/$transclude>\\n\u003C/$transclude>\\n\"},\"$:/core/ui/PluginInfo/Default/contents\":{\"title\":\"$:/core/ui/PluginInfo/Default/contents\",\"text\":\"\\\\define lingo-base() $:/language/TiddlerInfo/Advanced/PluginInfo/\\n\\\\whitespace trim\\n\u003C\u003Clingo Hint>>\\n\u003Cul>\\n\u003C$list filter=\\\"[all[current]plugintiddlers[]sort[title]]\\\" emptyMessage=\u003C\u003Clingo Empty/Hint>>>\\n\u003Cli>\\n\u003C$link />\\n\u003C/li>\\n\u003C/$list>\\n\u003C/ul>\\n\"},\"$:/core/ui/PluginListItemTemplate\":{\"title\":\"$:/core/ui/PluginListItemTemplate\",\"text\":\"\\\\whitespace trim\\n\u003C$link to={{!!title}} class=\\\"tc-plugin-info\\\">\\n\\t\u003Cdiv class=\\\"tc-plugin-info-chunk tc-plugin-info-icon\\\">\\n\\t\\t\u003C$transclude tiddler=\u003C\u003CcurrentTiddler>> subtiddler={{{ [\u003CcurrentTiddler>addsuffix[/icon]] }}}>\\n\\t\\t\\t\u003C$transclude tiddler={{{ [\u003CcurrentTiddler>get[plugin-type]addprefix[$:/core/images/plugin-generic-]] }}}/>\\n\\t\\t\u003C/$transclude>\\n\\t\u003C/div>\\n\\t\u003Cdiv class=\\\"tc-plugin-info-chunk tc-plugin-info-description\\\">\\n\\t\\t\u003Ch1>\\n\\t\\t\\t''\u003C$text text={{{ [\u003CcurrentTiddler>get[name]] ~[\u003CcurrentTiddler>split[/]last[1]] }}}/>'':&nbsp;\u003C$view field=\\\"description\\\">\u003C$view field=\\\"title\\\"/>\u003C/$view>\\n\\t\\t\u003C/h1>\\n\\t\u003C/div>\\n\u003C/$link>\\n\"},\"$:/core/ui/RootTemplate\":{\"title\":\"$:/core/ui/RootTemplate\",\"code-body\":\"yes\",\"text\":\"\u003C$transclude tiddler={{{ [{$:/layout}has[text]] ~[[$:/core/ui/PageTemplate]] }}} mode=\\\"inline\\\"/>\\n\\n\"},\"$:/core/ui/SearchResults\":{\"title\":\"$:/core/ui/SearchResults\",\"text\":\"\u003Cdiv class=\\\"tc-search-results\\\">\\n\\n\u003C$list\\n\\tfilter=\\\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]butfirst[]limit[1]]\\\"\\n\\temptyMessage=\\\"\u003C$list filter='[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]'>\u003C$transclude mode='block'/>\u003C/$list>\\\">\\n\\n\u003C$macrocall $name=\\\"tabs\\\"\\n\\ttabsList=\\\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\\\"\\n\\tdefault={{$:/config/SearchResults/Default}}\\n\\tactions=\\\"\u003C$action-setfield $tiddler='$:/state/search/currentTab' text=\u003C\u003CcurrentTab>>/>\\\"\\n\\texplicitState=\\\"$:/state/tab/search-results/sidebar\\\"/>\\n\\n\u003C/$list>\\n\\n\u003C/div>\\n\"},\"$:/core/ui/SideBar/More\":{\"title\":\"$:/core/ui/SideBar/More\",\"tags\":\"$:/tags/SideBar\",\"caption\":\"{{$:/language/SideBar/More/Caption}}\",\"text\":\"\\\\whitespace trim\\n\u003Cdiv class={{{ [{$:/config/ui/SideBar/More/horizontal}match[yes]then[tc-sidebar-tabs]else[tc-more-sidebar]] }}}>\\n\u003C$macrocall $name=\\\"tabs\\\" tabsList=\\\"[all[shadows+tiddlers]tag[$:/tags/MoreSideBar]!has[draft.of]]\\\" default={{$:/config/DefaultMoreSidebarTab}} state=\\\"$:/state/tab/moresidebar\\\" class={{{ [{$:/config/ui/SideBar/More/horizontal}
2731match[yes]then[tc-sidebar-tabs-more]else[tc-vertical tc-sidebar-tabs-more]] }}} explicitState=\\\"$:/state/tab/moresidebar-1850697562\\\"/>\\n\u003C/div>\\n\"},\"$:/core/ui/SideBar/Open\":{\"title\":\"$:/core/ui/SideBar/Open\",\"tags\":\"$:/tags/SideBar\",\"caption\":\"{{$:/language/SideBar/Open/Caption}}\",\"text\":\"\\\\whitespace trim\\n\\\\define lingo-base() $:/language/CloseAll/\\n\\n\\\\define drop-actions()\\n\u003C$action-listops $tiddler=\u003C\u003Ctv-story-list>> $subfilter=\\\"+[insertbefore\u003CactionTiddler>,\u003CcurrentTiddler>]\\\"/>\\n\\\\end\\n\\n\\\\define placeholder()\\n\u003Cdiv class=\\\"tc-droppable-placeholder\\\"/>\\n\\\\end\\n\\n\\\\define droppable-item(button)\\n\\\\whitespace trim\\n\u003C$droppable actions=\u003C\u003Cdrop-actions>> enable=\u003C\u003Ctv-allow-drag-and-drop>> tag=\\\"div\\\">\\n\u003C\u003Cplaceholder>>\\n\u003Cdiv>\\n$button$\\n\u003C/div>\\n\u003C/$droppable>\\n\\\\end\\n\\n\u003Cdiv class=\\\"tc-sidebar-tab-open\\\">\\n\u003C$list filter=\\\"[list\u003Ctv-story-list>]\\\" history=\u003C\u003Ctv-history-list>> storyview=\\\"pop\\\">\\n\u003Cdiv class=\\\"tc-sidebar-tab-open-item\\\">\\n\u003C$macrocall $name=\\\"droppable-item\\\" button=\\\"\u003C$button message='tm-close-tiddler' tooltip={{$:/language/Buttons/Close/Hint}} aria-label={{$:/language/Buttons/Close/Caption}} class='tc-btn-invisible tc-btn-mini tc-small-gap-right'>{{$:/core/images/close-button}}\u003C/$button>\u003C$link/>\\\"/>\\n\u003C/div>\\n\u003C/$list>\\n\u003C$tiddler tiddler=\\\"\\\">\\n\u003Cdiv>\\n\u003C$macrocall $name=\\\"droppable-item\\\" button=\\\"\u003C$button message='tm-close-all-tiddlers' class='tc-btn-invisible tc-btn-mini'>\u003C\u003Clingo Button>>\u003C/$button>\\\"/>\\n\u003C/div>\\n\u003C/$tiddler>\\n\u003C/div>\\n\"},\"$:/core/ui/SideBar/Recent\":{\"title\":\"$:/core/ui/SideBar/Recent\",\"tags\":\"$:/tags/SideBar\",\"caption\":\"{{$:/language/SideBar/Recent/Caption}}\",\"text\":\"\u003C$macrocall $name=\\\"timeline\\\" format={{$:/language/RecentChanges/DateFormat}}/>\\n\"},\"$:/core/ui/SideBar/Tools\":{\"title\":\"$:/core/ui/SideBar/Tools\",\"tags\":\"$:/tags/SideBar\",\"caption\":\"{{$:/language/SideBar/Tools/Caption}}\",\"text\":\"\\\\define lingo-base() $:/language/ControlPanel/\\n\\\\define config-title()\\n$:/config/PageControlButtons/Visibility/$(listItem)$\\n\\\\end\\n\\n\u003C\u003Clingo Basics/Version/Prompt>> \u003C\u003Cversion>>\\n\\n\u003C$set name=\\\"tv-config-toolbar-icons\\\" value=\\\"yes\\\">\\n\\n\u003C$set name=\\\"tv-config-toolbar-text\\\" value=\\\"yes\\\">\\n\\n\u003C$set name=\\\"tv-config-toolbar-class\\\" value=\\\"\\\">\\n\\n\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]\\\" variable=\\\"listItem\\\">\\n\\n\u003Cdiv style=\\\"position:relative;\\\" class={{{ [\u003ClistItem>encodeuricomponent[]addprefix[tc-btn-]] }}}>\\n\\n\u003C$checkbox tiddler=\u003C\u003Cconfig-title>> field=\\\"text\\\" checked=\\\"show\\\" unchecked=\\\"hide\\\" default=\\\"show\\\"/> \u003C$transclude tiddler=\u003C\u003ClistItem>>/> \u003Ci class=\\\"tc-muted\\\">\u003C$transclude tiddler=\u003C\u003ClistItem>> field=\\\"description\\\"/>\u003C/i>\\n\\n\u003C/div>\\n\\n\u003C/$list>\\n\\n\u003C/$set>\\n\\n\u003C/$set>\\n\\n\u003C/$set>\\n\"},\"$:/core/ui/SideBarLists\":{\"title\":\"$:/core/ui/SideBarLists\",\"text\":\"\u003C$transclude tiddler=\\\"$:/core/ui/SideBarSegments/search\\\"/>\\n\\n\u003C$transclude tiddler=\\\"$:/core/ui/SideBarSegments/tabs\\\"/>\\n\\n\"},\"$:/core/ui/SideBarSegments/page-controls\":{\"title\":\"$:/core/ui/SideBarSegments/page-controls\",\"tags\":\"$:/tags/SideBarSegment\",\"text\":\"{{||$:/core/ui/PageTemplate/pagecontrols}}\\n\"},\"$:/core/ui/SideBarSegments/search\":{\"title\":\"$:/core/ui/SideBarSegments/search\",\"tags\":\"$:/tags/SideBarSegment\",\"text\":\"\\\\whitespace trim\\n\\n\\\\define count-popup-button()\\n\\\\whitespace trim\\n\u003C$button popup=\u003C\u003Cqualify \\\"$:/state/popup/search-dropdown\\\">> class=\\\"tc-btn-invisible\\\">\\n{{$:/core/images/down-arrow}}\\n\u003C$list filter=\\\"[{$(searchTiddler)$}minlength{$:/config/Search/MinLength}limit[1]]\\\" variable=\\\"listItem\\\">\\n\u003C$vars userInput={{{ [\u003CsearchTiddler>get[text]] }}} configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}] }}} replaceRegexp=\\\"limit\\\\[\\\\d+\\\\]\\\">\\n\u003C$vars primaryListFilter={{{ [\u003CconfigTiddler>get[first-search-filter]search-replace:g:regexp\u003CreplaceRegexp>,[]] }}} secondaryListFilter={{{ [\u003CconfigTiddler>get[second-search-filter]search-replace:g:regexp\u003CreplaceRegexp>,[]] }}}>\\n\u003C$set name=\\\"resultCount\\\" value=\\\"\\\"\\\"\u003C$count filter=\\\"[subfilter\u003CprimaryListFilter>] [subfilter\u003CsecondaryListFilter>]\\\"/>\\\"\\\"\\\">\\n{{$:/language/Search/Matches}}\\n\u003C/$set>\\n\u003C/$vars>\\n\u003C/$vars>\\n\u003C/$list>\\n\u003C/$button>
2731\\n\\\\end\\n\\n\\\\define search-results-list()\\n\\\\whitespace trim\\n\u003C$vars userInput={{$(searchTiddler)$}} configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}] }}}>\\n\u003C$list filter=\\\"[\u003CuserInput>minlength{$:/config/Search/MinLength}limit[1]]\\\" emptyMessage=\\\"\\\"\\\"\u003Cdiv class=\\\"tc-search-results\\\">{{$:/language/Search/Search/TooShort}}\u003C/div>\\\"\\\"\\\" variable=\\\"listItem\\\">\\n\\n\u003C$tiddler tiddler=\u003C\u003CconfigTiddler>>>\\n\\n{{$:/core/ui/SearchResults}}\\n\\n\u003C/$tiddler>\\n\\n\u003C/$list>\\n\u003C/$vars>\\n\\\\end\\n\\n\\\\define cancel-search-actions() \u003C$list filter=\\\"[\u003CsearchTiddler>get[text]!match{$:/temp/search}]\\\" emptyMessage=\\\"\\\"\\\"\u003C$action-deletetiddler $filter=\\\"[[$:/temp/search]] [\u003CsearchTiddler>] [\u003CsearchListState>]\\\"/>\\\"\\\"\\\">\u003C$action-setfield $tiddler=\\\"$:/temp/search\\\" text={{{ [\u003CsearchTiddler>get[text]] }}}/>\u003C$action-setfield $tiddler=\\\"$:/temp/search/refresh\\\" text=\\\"yes\\\"/>\u003C/$list>\\n\\n\\\\define input-accept-actions() \u003C$list filter=\\\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\\\" emptyMessage=\\\"\\\"\\\"\u003C$list filter=\\\"[\u003C__tiddler__>get[text]!is[missing]] ~[\u003C__tiddler__>get[text]is[shadow]]\\\">\u003C$action-navigate $to={{{ [\u003C__tiddler__>get[text]] }}}/>\u003C/$list>\\\"\\\"\\\">\u003C$action-navigate $to={{{ [\u003C__tiddler__>get[text]] }}}/>\u003C/$list>\\n\\n\\\\define input-accept-variant-actions() \u003C$list filter=\\\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\\\" emptyMessage=\\\"\\\"\\\"\u003C$list filter=\\\"[\u003C__tiddler__>get[text]!is[missing]] ~[\u003C__tiddler__>get[text]is[shadow]]\\\">\u003C$list filter=\\\"[\u003C__tiddler__>get[text]minlength[1]]\\\">\u003C$action-sendmessage $message=\\\"tm-edit-tiddler\\\" $param={{{  [\u003C__tiddler__>get[text]] }}}/>\u003C/$list>\u003C/$list>\\\"\\\"\\\">\u003C$list filter=\\\"[\u003C__tiddler__>get[text]minlength[1]]\\\">\u003C$action-sendmessage $message=\\\"tm-edit-tiddler\\\" $param={{{  [\u003C__tiddler__>get[text]] }}}/>\u003C/$list>\u003C/$list>\\n\\n\\\\define set-next-input-tab(beforeafter:\\\"after\\\") \u003C$macrocall $name=\\\"change-input-tab\\\" stateTitle=\\\"$:/state/tab/search-results/sidebar\\\" tag=\\\"$:/tags/SearchResults\\\" beforeafter=\\\"$beforeafter$\\\" defaultState={{$:/config/SearchResults/Default}} actions=\\\"\\\"\\\"\u003C$action-setfield $tiddler=\\\"$:/state/search/currentTab\\\" text=\u003C\u003CnextTab>>/>\\\"\\\"\\\"/>\\n\\n\\\\define advanced-search-actions() \u003C$action-setfield $tiddler=\\\"$:/temp/advancedsearch\\\" text={{$:/temp/search/input}}/>\u003C$action-setfield $tiddler=\\\"$:/temp/advancedsearch/input\\\" text={{$:/temp/search/input}}/>\u003C\u003Cdelete-state-tiddlers>>\u003C$action-navigate $to=\\\"$:/AdvancedSearch\\\"/>\u003C$action-setfield $tiddler=\\\"$:/temp/advancedsearch/refresh\\\" text=\\\"yes\\\"/>\u003C$action-sendmessage $message=\\\"tm-focus-selector\\\" $param=\\\"\\\"\\\"[data-tiddler-title=\\\"$:/AdvancedSearch\\\"] .tc-search input\\\"\\\"\\\" preventScroll=\\\"true\\\"/>\u003C$action-deletetiddler $filter=\\\"$:/temp/search $:/temp/search/input $:/temp/search/refresh [\u003CsearchListState>]\\\"/>\\n\\n\u003Cdiv class=\\\"tc-sidebar-lists tc-sidebar-search\\\">\\n\\n\u003C$vars editTiddler=\\\"$:/temp/search\\\" searchTiddler=\\\"$:/temp/search/input\\\" searchListState=\u003C\u003Cqualify \\\"$:/state/search-list/selected-item\\\">>>\\n\u003Cdiv class=\\\"tc-search\\\">\\n\u003C$keyboard key=\\\"((input-tab-right))\\\" actions=\u003C\u003Cset-next-input-tab>>>\\n\u003C$keyboard key=\\\"((input-tab-left))\\\" actions=\u003C\u003Cset-next-input-tab \\\"before\\\">>>\\n\u003C$keyboard key=\\\"((advanced-search-sidebar))\\\" actions=\u003C\u003Cadvanced-search-actions>>>\\n\u003Cform class=\\\"tc-form-inline\\\">\\n\u003C$macrocall $name=\\\"keyboard-driven-input\\\" tiddler=\u003C\u003CeditTiddler>> storeTitle=\u003C\u003CsearchTiddler>>
2731 \\n\\t\\tselectionStateTitle=\u003C\u003CsearchListState>> refreshTitle=\\\"$:/temp/search/refresh\\\" type=\\\"search\\\" \\n\\t\\ttag=\\\"input\\\" focus={{$:/config/Search/AutoFocus}} focusPopup=\u003C\u003Cqualify \\\"$:/state/popup/search-dropdown\\\">> \\n\\t\\tclass=\\\"tc-popup-handle\\\" filterMinLength={{$:/config/Search/MinLength}} inputCancelActions=\u003C\u003Ccancel-search-actions>> \\n\\t\\tinputAcceptActions=\u003C\u003Cinput-accept-actions>> inputAcceptVariantActions=\u003C\u003Cinput-accept-variant-actions>> cancelPopups=\\\"yes\\\" \\n\\t\\tconfigTiddlerFilter=\\\"[[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}]\\\"/>\\n\u003C/form>\\n\u003C/$keyboard>\\n\u003C/$keyboard>\\n\u003C/$keyboard>\\n\u003C$reveal state=\u003C\u003CsearchTiddler>> type=\\\"nomatch\\\" text=\\\"\\\">\\n\u003C$button tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\\\"tc-btn-invisible\\\">\\n\u003C\u003Cadvanced-search-actions>>\\n{{$:/core/images/advanced-search-button}}\\n\u003C/$button>\\n\u003C$button class=\\\"tc-btn-invisible\\\">\\n\u003C\u003Ccancel-search-actions>>\u003C$action-sendmessage $message=\\\"tm-focus-selector\\\" $param=\\\".tc-search input\\\"/>\\n{{$:/core/images/close-button}}\\n\u003C/$button>\\n\u003C\u003Ccount-popup-button>>\\n\u003C/$reveal>\\n\u003C$reveal state=\u003C\u003CsearchTiddler>> type=\\\"match\\\" text=\\\"\\\">\\n\u003C$button to=\\\"$:/AdvancedSearch\\\" tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\\\"tc-btn-invisible\\\">\\n{{$:/core/images/advanced-search-button}}\\n\u003C/$button>\\n\u003C/$reveal>\\n\u003C/div>\\n\\n\u003C$reveal tag=\\\"div\\\" class=\\\"tc-block-dropdown-wrapper\\\" state=\u003C\u003CsearchTiddler>> type=\\\"nomatch\\\" text=\\\"\\\">\\n\\n\u003C$reveal tag=\\\"div\\\" class=\\\"tc-block-dropdown tc-search-drop-down tc-popup-handle\\\" state=\u003C\u003Cqualify \\\"$:/state/popup/search-dropdown\\\">> type=\\\"nomatch\\\" text=\\\"\\\" default=\\\"\\\">\\n\\n\u003C\u003Csearch-results-list>>\\n\\n\u003C/$reveal>\\n\\n\u003C/$reveal>\\n\\n\u003C/$vars>\\n\\n\u003C/div>\\n\"},\"$:/core/ui/SideBarSegments/site-subtitle\":{\"title\":\"$:/core/ui/SideBarSegments/site-subtitle\",\"tags\":\"$:/tags/SideBarSegment\",\"text\":\"\u003Cdiv class=\\\"tc-site-subtitle\\\">\\n\\n\u003C$transclude tiddler=\\\"$:/SiteSubtitle\\\" mode=\\\"inline\\\"/>\\n\\n\u003C/div>\\n\"},\"$:/core/ui/SideBarSegments/site-title\":{\"title\":\"$:/core/ui/SideBarSegments/site-title\",\"tags\":\"$:/tags/SideBarSegment\",\"text\":\"\u003Ch1 class=\\\"tc-site-title\\\">\\n\\n\u003C$transclude tiddler=\\\"$:/SiteTitle\\\" mode=\\\"inline\\\"/>\\n\\n\u003C/h1>\\n\"},\"$:/core/ui/SideBarSegments/tabs\":{\"title\":\"$:/core/ui/SideBarSegments/tabs\",\"tags\":\"$:/tags/SideBarSegment\",\"text\":\"\u003Cdiv class=\\\"tc-sidebar-lists tc-sidebar-tabs\\\" role=\\\"region\\\" aria-label={{$:/language/SideBar/Caption}}>\\n\\n\u003C$macrocall $name=\\\"tabs\\\" tabsList=\\\"[all[shadows+tiddlers]tag[$:/tags/SideBar]!has[draft.of]]\\\" default={{$:/config/DefaultSidebarTab}} state=\\\"$:/state/tab/sidebar\\\" class=\\\"tc-sidebar-tabs-main\\\" explicitState=\\\"$:/state/tab/sidebar--595412856\\\"/>\\n\\n\u003C/div>\\n\"},\"$:/core/ui/StoryTiddlerTemplate\":{\"title\":\"$:/core/ui/StoryTiddlerTemplate\",\"code-body\":\"yes\",\"text\":\"\u003C$transclude tiddler={{{ [\u003CcurrentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/StoryTiddlerTemplateFilter]!is[draft]get[text]] :and[has[title]else[$:/core/ui/ViewTemplate]] }}} />\\n\"},\"$:/core/ui/SwitcherModal\":{\"title\":\"$:/core/ui/SwitcherModal\",\"subtitle\":\"\u003C$text text={{{[\u003Cswitch>lookup[$:/language/Switcher/Subtitle/]]}}}/>\",\"class\":\"tc-modal-centered\",\"mask-closable\":\"yes\",\"text\":\"\u003C$tiddler tiddler={{{[\u003Cswitch>lookup[$:/config/SwitcherTargets/]]}}}>\\n\\n\\n\u003C$transclude/>\\n\\n\\n\u003C/$tiddler>\"}
2731,\"$:/TagManager\":{\"title\":\"$:/TagManager\",\"icon\":\"$:/core/images/tag-button\",\"color\":\"#bbb\",\"text\":\"\\\\define lingo-base() $:/language/TagManager/\\n\\n\\\\define iconEditorTab(type)\\n\\\\whitespace trim\\n\u003C$link to=\\\"\\\">\u003C\u003Clingo Icons/None>>\u003C/$link>\\n\u003C$list filter=\\\"[all[shadows+tiddlers]is[image]] [all[shadows+tiddlers]tag[$:/tags/Image]] -[type[application/pdf]] +[sort[title]] +[$type$is[system]]\\\">\\n\\t\u003C$link to={{!!title}}>\\n\\t\\t\u003C$transclude/> \u003C$view field=\\\"title\\\"/>\\n\\t\u003C/$link>\\n\u003C/$list>\\n\\\\end\\n\\n\\\\define iconEditor(title)\\n\\\\whitespace trim\\n\u003Cdiv class=\\\"tc-drop-down-wrapper\\\">\\n\\t\u003C$button popupTitle={{{ [[$:/state/popup/icon/]addsuffix\u003C__title__>] }}} class=\\\"tc-btn-invisible tc-btn-dropdown\\\">\\n\\t\\t{{$:/core/images/down-arrow}}\\n\\t\u003C/$button>\\n\\t\u003C$reveal stateTitle={{{ [[$:/state/popup/icon/]addsuffix\u003C__title__>] }}} type=\\\"popup\\\" position=\\\"belowleft\\\" text=\\\"\\\" default=\\\"\\\">\\n\\t\\t\u003Cdiv class=\\\"tc-drop-down\\\">\\n\\t\\t\\t\u003C$linkcatcher actions=\\\"\\\"\\\"\u003C$action-setfield $tiddler=\u003C\u003C__title__>> icon=\u003C\u003CnavigateTo>>/>\\\"\\\"\\\">\\n\\t\\t\\t\\t\u003C\u003CiconEditorTab type:\\\"!\\\">>\\n\\t\\t\\t\\t\u003Chr/>\\n\\t\\t\\t\\t\u003C\u003CiconEditorTab type:\\\"\\\">>\\n\\t\\t\\t\u003C/$linkcatcher>\\n\\t\\t\u003C/div>\\n\\t\u003C/$reveal>\\n\u003C/div>\\n\\\\end\\n\\n\\\\define toggleButton(state)\\n\\\\whitespace trim\\n\u003C$reveal stateTitle=\u003C\u003C__state__>> type=\\\"match\\\" text=\\\"closed\\\" default=\\\"closed\\\">\\n\\t\u003C$button setTitle=\u003C\u003C__state__>> setTo=\\\"open\\\" class=\\\"tc-btn-invisible tc-btn-dropdown\\\" selectedClass=\\\"tc-selected\\\">\\n\\t\\t{{$:/core/images/info-button}}\\n\\t\u003C/$button>\\n\u003C/$reveal>\\n\u003C$reveal stateTitle=\u003C\u003C__state__>> type=\\\"match\\\" text=\\\"open\\\" default=\\\"closed\\\">\\n\\t\u003C$button setTitle=\u003C\u003C__state__>> setTo=\\\"closed\\\" class=\\\"tc-btn-invisible tc-btn-dropdown\\\" selectedClass=\\\"tc-selected\\\">\\n\\t\\t{{$:/core/images/info-button}}\\n\\t\u003C/$button>\\n\u003C/$reveal>\\n\\\\end\\n\\n\\\\whitespace trim\\n\u003Ctable class=\\\"tc-tag-manager-table\\\">\\n\u003Ctbody>\\n\\t\u003Ctr>\\n\\t\\t\u003Cth>\u003C\u003Clingo Colour/Heading>>\u003C/th>\\n\\t\\t\u003Cth class=\\\"tc-tag-manager-tag\\\">\u003C\u003Clingo Tag/Heading>>\u003C/th>\\n\\t\\t\u003Cth>\u003C\u003Clingo Count/Heading>>\u003C/th>\\n\\t\\t\u003Cth>\u003C\u003Clingo Icon/Heading>>\u003C/th>\\n\\t\\t\u003Cth>\u003C\u003Clingo Info/Heading>>\u003C/th>\\n\\t\u003C/tr>\\n\\t\u003C$list filter=\\\"[tags[]!is[system]sort[title]]\\\">\\n\\t\\t\u003Ctr>\\n\\t\\t\\t\u003Ctd>\u003C$edit-text field=\\\"color\\\" tag=\\\"input\\\" type=\\\"color\\\"/>\u003C/td>\\n\\t\\t\\t\u003Ctd>{{||$:/core/ui/TagTemplate}}\u003C/td>\\n\\t\\t\\t\u003Ctd>\u003C$count filter=\\\"[all[current]tagging[]]\\\"/>\u003C/td>\\n\\t\\t\\t\u003Ctd>\\n\\t\\t\\t\\t\u003C$macrocall $name=\\\"iconEditor\\\" title={{!!title}}/>\\n\\t\\t\\t\u003C/td>\\n\\t\\t\\t\u003Ctd>\\n\\t\\t\\t\\t\u003C$macrocall $name=\\\"toggleButton\\\" state={{{ [[$:/state/tag-manager/]addsuffix\u003CcurrentTiddler>] }}} />\\n\\t\\t\\t\u003C/td>\\n\\t\\t\u003C/tr>\\n\\t\\t\u003Ctr>\\n\\t\\t\\t\u003Ctd>\u003C/td>\\n\\t\\t\\t\u003Ctd colspan=\\\"4\\\">\\n\\t\\t\\t\\t\u003C$reveal stateTitle={{{ [[$:/state/tag-manager/]addsuffix\u003CcurrentTiddler>] }}} type=\\\"match\\\" text=\\\"open\\\" default=\\\"\\\">\\n\\t\\t\\t\\t\\t\u003Ctable>\\n\\t\\t\\t\\t\\t\\t\u003Ctbody>\\n\\t\\t\\t\\t\\t\\t\\t\u003Ctr>\\n\\t\\t\\t\\t\\t\\t\\t\\t\u003Ctd>\u003C\u003Clingo Colour/Heading>>\u003C/td>\\n\\t\\t\\t\\t\\t\\t\\t\\t\u003Ctd>\u003C$edit-text field=\\\"color\\\" tag=\\\"input\\\" type=\\\"text\\\" size=\\\"9\\\"/>\u003C/td>\\n\\t\\t\\t\\t\\t\\t\\t\u003C/tr>\\n\\t\\t\\t\\t\\t\\t\\t\u003Ctr>\\n\\t\\t\\t\\t\\t\\t\\t\\t\u003Ctd>\u003C\u003Clingo Icon/Heading>>\u003C/td>\\n\\t\\t\\t\\t\\t\\t\\t\\t\u003Ctd>\u003C$edit-text field=\\\"icon\\\" tag=\\\"input\\\" size=\\\"45\\\"/>\u003C/td>\\n\\t\\t\\t\\t\\t\\t\\t\u003C/tr>\\n\\t\\t\\t\\t\\t\\t\u003C/tbody>\\n\\t\\t\\t\\t\\t\u003C/table>\\n\\t\\t\\t\\t\u003C/$reveal>\\n\\t\\t\\t\u003C/td>\\n\\t\\t\u003C/tr>\\n\\t\u003C/$list>\\n\\t\u003Ctr>\\n\\t\\t\u003Ctd>\u003C/td>\\n\\t\\t\u003Ctd style=\\\"position:relative;\\\">\\n\\t\\t\\t{{$:/core/ui/UntaggedTemplate}}\\n\\t\\t\u003C/td>\\n\\t\\t\u003Ctd>\\n\\t\\t\\t\u003Csmall class=\\\"tc-menu-list-count\\\">\u003C$count filter=\\\"[untagged[]!is[system]] -[tags[]]\\\"/>\u003C/small>\\n\\t\\t\u003C/td>\\n\\t\\t\u003Ctd>\u003C/td>\\n\\t\\t\u003Ctd>\u003C/td>\\n\\t\u003C/tr>\\n\u003C/tbody>\\n\u003C/table>\\n\"},\"$:/core/ui/TagPickerTagTemplate\":{\"title\":\"$:/core/ui/TagPickerTagTemplate\",\"text\":\"\\\\whitespace trim\\n\u003C$button class=\u003C\u003Cbutton-classes>> tag=\\\"a\\\" tooltip={{$:/language/EditTemplate/Tags/Add/Button/Hint}}>\\n\\t\u003C$list filter=\\\"[\u003CsaveTiddler>minlength[1]]\\\">\\n\\t\\t\u003C$action-listops $tiddler=\u003C\u003CsaveTiddler>> $field=\u003C\u003CtagField>> $subfilter=\\\"[\u003Ctag>]\\\"/>\\n\\t\u003C/$list>\\n\\t\u003C$set name=\\\"currentTiddlerCSSEscaped\\\" value={{{ [\u003CsaveTiddler>escapecss[]] }}}>\\n\\t\\t\u003C$action-sendmessage $message=\\\"tm-focus-selector\\\" $param=\u003C\u003Cget-tagpicker-focus-selector>> preventScroll=\\\"true\\\"/>\\n\\t\u003C/$set>\\n\\t\u003C\u003Cdelete-tag-state-tiddlers>>\\n\\t\u003C$list filter=\\\"[\u003CrefreshTitle>minlength[1]]\\\">\\n\\t\\t\u003C$action-setfield $tiddler=\u003C\u003CrefreshTitle>> text=\\\"yes\\\"/>\\n\\t\u003C/$list>\\n\\t\u003C\u003Cactions>>\\n\\t\u003C$set name=\\\"backgroundColor\\\"\\n\\t\\tvalue={{{ [\u003CcurrentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerColourFilter]!is[draft]get[text]] }}}\\n\\t>\\n\\t\\t\u003C$wikify name=\\\"foregroundColor\\\"\\n\\t\\t\\ttext=\\\"\\\"\\\"\u003C$macrocall $name=\\\"contrastc
2731olour\\\" target=\u003C\u003CbackgroundColor>> fallbackTarget=\u003C\u003CfallbackTarget>> colourA=\u003C\u003CcolourA>> colourB=\u003C\u003CcolourB>>/>\\\"\\\"\\\"\\n\\t\\t>\\n\\t\\t\\t\u003Cspan class=\\\"tc-tag-label tc-btn-invisible\\\"\\n\\t\\t\\t\\tstyle=\u003C\u003Ctag-pill-styles>>\\n\\t\\t\\t\\tdata-tag-title=\u003C\u003CcurrentTiddler>>\\n\\t\\t\\t>\\n\\t\\t\\t\\t{{||$:/core/ui/TiddlerIcon}}\u003C$view field=\\\"title\\\" format=\\\"text\\\"/>\\n\\t\\t\\t\u003C/span>\\n\\t\\t\u003C/$wikify>\\n\\t\u003C/$set>\\n\u003C/$button>\\n\"},\"$:/core/ui/TagTemplate\":{\"title\":\"$:/core/ui/TagTemplate\",\"text\":\"\\\\whitespace trim\\n\u003Cspan class=\\\"tc-tag-list-item\\\" data-tag-title=\u003C\u003CcurrentTiddler>>>\\n\u003C$set name=\\\"transclusion\\\" value=\u003C\u003CcurrentTiddler>>>\\n\\t\u003C$macrocall $name=\\\"tag-pill-body\\\"\\n\\t\\ttag=\u003C\u003CcurrentTiddler>>\\n\\t\\ticon={{{ [\u003CcurrentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerIconFilter]!is[draft]get[text]] }}}\\n\\t\\tcolour={{{ [\u003CcurrentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerColourFilter]!is[draft]get[text]] }}}\\n\\t\\tpalette={{$:/palette}}\\n\\t\\telement-tag=\\\"$button\\\"\\n\\t\\telement-attributes=\\\"\\\"\\\"popup=\u003C\u003Cqualify \\\"$:/state/popup/tag\\\">> dragFilter=\\\"[all[current]tagging[]]\\\" tag='span'\\\"\\\"\\\"\\n\\t/>\\n\\t\u003C$reveal state=\u003C\u003Cqualify \\\"$:/state/popup/tag\\\">> type=\\\"popup\\\" position=\\\"below\\\" animate=\\\"yes\\\" class=\\\"tc-drop-down\\\">\\n\\t\\t\u003C$set name=\\\"tv-show-missing-links\\\" value=\\\"yes\\\">\\n\\t\\t\\t\u003C$transclude tiddler=\\\"$:/core/ui/ListItemTemplate\\\"/>\\n\\t\\t\u003C/$set>\\n\\t\\t\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/TagDropdown]!has[draft.of]]\\\" variable=\\\"listItem\\\"> \\n\\t\\t\\t\u003C$transclude tiddler=\u003C\u003ClistItem>>/> \\n\\t\\t\u003C/$list>\\n\\t\\t\u003Chr>\\n\\t\\t\u003C$macrocall $name=\\\"list-tagged-draggable\\\" tag=\u003C\u003CcurrentTiddler>>/>\\n\\t\u003C/$reveal>\\n\u003C/$set>\\n\u003C/span>\\n\"},\"$:/core/ui/TiddlerFieldTemplate\":{\"title\":\"$:/core/ui/TiddlerFieldTemplate\",\"text\":\"\\\\whitespace trim\\n\u003Ctr class=\\\"tc-view-field\\\">\\n\u003Ctd class=\\\"tc-view-field-name\\\">\\n\u003C$text text=\u003C\u003ClistItem>>/>\\n\u003C/td>\\n\u003Ctd class=\\\"tc-view-field-value\\\">\\n\u003C$view field=\u003C\u003ClistItem>>/>\\n\u003C/td>\\n\u003C/tr>\"},\"$:/core/ui/TiddlerFields\":{\"title\":\"$:/core/ui/TiddlerFields\",\"text\":\"\\\\whitespace trim\\n\u003Ctable class=\\\"tc-view-field-table\\\">\\n\u003Ctbody>\\n\u003C$list filter=\\\"[all[current]fields[]sort[title]] -text\\\" template=\\\"$:/core/ui/TiddlerFieldTemplate\\\" variable=\\\"listItem\\\"/>\\n\u003C/tbody>\\n\u003C/table>\\n\"},\"$:/core/ui/TiddlerIcon\":{\"title\":\"$:/core/ui/TiddlerIcon\",\"text\":\"\\\\whitespace trim\\n\u003C$let tiddlerIcon={{{ [\u003CcurrentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerIconFilter]!is[draft]get[text]] }}}>\\n\u003C$list filter=\\\"[\u003CtiddlerIcon>!is[blank]]\\\" variable=\\\"ignore\\\">\\n\u003C$transclude tiddler=\u003C\u003CtiddlerIcon>>/>\\n\u003C/$list>\\n\u003C/$let>\\n\"},\"$:/core/ui/TiddlerInfo/Advanced/PluginInfo\":{\"title\":\"$:/core/ui/TiddlerInfo/Advanced/PluginInfo\",\"tags\":\"$:/tags/TiddlerInfo/Advanced\",\"text\":\"\\\\define lingo-base() $:/language/TiddlerInfo/Advanced/PluginInfo/\\n\\\\whitespace trim\\n\u003C$list filter=\\\"[all[current]has[plugin-type]]\\\">\\n\\n! \u003C\u003Clingo Heading>>\\n\\n\u003C\u003Clingo Hint>>\\n\u003Cul>\\n\u003C$list filter=\\\"[all[current]plugintiddlers[]sort[title]]\\\" emptyMessage=\u003C\u003Clingo Empty/Hint>>>\\n\u003Cli>\\n\u003C$link to={{!!title}}>\\n\u003C$view field=\\\"title\\\"/>\\n\u003C/$link>\\n\u003C/li>\\n\u003C/$list>\\n\u003C/ul>\\n\\n\u003C/$list>\\n\"},\"$:/core/ui/TiddlerInfo/Advanced/ShadowInfo\":{\"title\":\"$:/core/ui/TiddlerInfo/Advanced/ShadowInfo\",\"tags\":\"$:/tags/TiddlerInfo/Advanced\",\"text\":\"\\\\define lingo-base() $:/language/TiddlerInfo/Advanced/ShadowInfo/\\n\u003C$set name=\\\"infoTiddler\\\" value=\u003C\u003CcurrentTiddler>>>\\n\\n''\u003C\u003Clingo Heading>>''\\n\\n\u003C$list filter=\\\"[all[current]!is[shadow]]\\\">\\n\\n\u003C\u003Clingo NotShadow/Hint>>\\n\\n\u003C/$list>\\n\\n\u003C$list filter=\\\"[all[current]is[shadow]]\\\">\\n\\n\u003C\u003Clingo Shadow/Hint>>\\n\\n\u003C$list filter=\\\"[all[current]shadowsource[]]\\\">\\n\\n\u003C$set name=\\\"pluginTiddler\\\" value=\u003C\u003CcurrentTiddler>>>\\n\\n\u003C\u003Clingo Shadow/Source>>\\n\u003C/$set>\\n\\n\u003C/$list>\\n\\n\u003C$list filter=\\\"[all[current]is[shadow]is[tiddler]]\\\">\\n\\n\u003C\u003Clingo OverriddenShadow/Hint>>\\n\\n\u003C/$list>\\n\\n\\n\u003C/$list>\\n\u003C/$set>\\n\"},\"$:/core/ui/TiddlerInfo/Advanced\":{\"title\":\"$:/core/ui/TiddlerInfo/Advanced\",\"tags\":\"$:/tags/TiddlerInfo\",\"caption\":\"{{$:/language/TiddlerInfo/Advanced/Caption}}\",\"text\":\"\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/TiddlerInfo/Advanced]!has[draft.of]]\\\" variable=\\\"listItem\\\">\\n\\n\u003C$transclude tiddler=\u003C\u003ClistItem>> mode=\\\"block\\\"/>\\n\\n\u003C/$list>\\n\"},\"$:/core/ui/TiddlerInfo/Fields\":{\"title\":\"$:/core/ui/TiddlerInfo/Fields\",\"tags\":\"$:/tags/TiddlerInfo\",\"caption\":\"{{$:/language/TiddlerInfo/Fields/Caption}}\",\"text\":\"\u003C$transclude tiddler=\\\"$:/core/ui/TiddlerFields\\\"/>\\n\"},\"$:/core/ui/TiddlerInfo/List\":{\"title\":\"$:/core/ui/TiddlerInfo/List\",\"tags\":\"$:/tags/TiddlerInfo\",\"caption\":\"{{$:/language/TiddlerInfo/List/Caption}}\",\"text\":\"\\\\define lingo-base() $:/language/TiddlerInfo/\\n\u003C$list filter=\\\"[list{!!title}]\\\" emptyMessage=\u003C\u003Clingo List/Empty>> template=\\\"$:/core/ui/ListItemTemplate\\\"/>\\n\"},\"$:/core/ui/TiddlerInfo/Listed\":{\"title\":\"$:/core/ui/TiddlerInfo/Listed\",\"tags\":\"$:/tags/TiddlerInfo\",\"caption\":\"{{$:/language/TiddlerInfo/Listed/Caption}}\",\"text\":\"\\\\define lingo-base() $:/language/TiddlerInfo/\\n\u003C$list filter=\\\"[all[current]listed[]!is[system]]\\\" emptyMessage=\u003C\u003Clingo Listed/Empty>> template=\\\"$:/core/ui/ListItemTemplate\\\"/>\\n\"},\"$:/core/ui/TiddlerInfo/References\":{\"title\":\"$:/core/ui/TiddlerInfo/References\",\"tags\":\"$:/tags/TiddlerInfo\",\"caption\":\"{{$:/language/TiddlerInfo/References/Caption}}\",\"text\":\"\\\\define lingo-base() $:/language/TiddlerInfo/\\n\u003C$list filter=\\\"[all[current]backlinks[]sort[title]]\\\" emptyMessage=\u003C\u003Clingo References/Empty>> template=\\\"$:/core/ui/ListItemTemplate\\\">\\n\u003C/$list>\"},\"$:/core/ui/TiddlerInfo/Tagging\":{\"title\":\"$:/core/ui/TiddlerInfo/Tagging\",\"tags\":\"$:/tags/TiddlerInfo\",\"caption\":\"{{$:/language/TiddlerInfo/Tagging/Caption}}\",\"text\":\"\\\\define lingo-base() $:/language/TiddlerInfo/\\n\u003C$list filter=\\\"[all[current]tagging[]]\\\" emptyMessage=\u003C\u003Clingo Tagging/Empty>> template=\\\"$:/core/ui/ListItemTemplate\\\"/>\\n\"},\"$:/core/ui/TiddlerInfo/Tools\":{\"title\":\"$:/core/ui/TiddlerInfo/Tools\",\"tags\":\"$:/tags/TiddlerInfo\",\"caption\":\"{{$:/language/TiddlerInfo/Tools/Caption}}\",\"text\":\"\\\\define lingo-base() $:/language/TiddlerInfo/\\n\\\\define config-title()\\n$:/config/ViewToolbarButtons/Visibility/$(listItem)$\\n\\\\end\\n\u003C$set name=\\\"tv-config-toolbar-icons\\\" value=\\\"yes\\\">\\n\\n\u003C$set name=\\\"tv-config-toolbar-text\\\" value=\\\"yes\\\">\\n\\n\u003C$set name=\\\"tv-config-toolbar-class\\\" value=\\\"\\\">\\n\\n\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]]\\\" variable=\\\"listItem\\\">\\n\\n\u003C$checkbox tiddler=\u003C\u003Cconfig-title>> field=\\\"text\\\" checked=\\\"show\\\" unchecked=\\\"hide\\\" default=\\\"show\\\"/> \u003C$transclude tiddler=\u003C\u003ClistItem>>/> \u003Ci class=\\\"tc-muted\\\">\u003C$transclude tiddler=\u003C\u003ClistItem>> field=\\\"description\\\"/>\u003C/i>
2731\\n\\n\u003C/$list>\\n\\n\u003C/$set>\\n\\n\u003C/$set>\\n\\n\u003C/$set>\\n\"},\"$:/core/ui/TiddlerInfo\":{\"title\":\"$:/core/ui/TiddlerInfo\",\"text\":\"\\\\whitespace trim\\n\u003Cdiv style=\\\"position:relative;\\\">\\n\u003Cdiv class=\\\"tc-tiddler-controls\\\" style=\\\"position:absolute;right:0;\\\">\\n\u003C$reveal state=\\\"$:/config/TiddlerInfo/Mode\\\" type=\\\"match\\\" text=\\\"sticky\\\">\\n\u003C$button set=\u003C\u003CtiddlerInfoState>> setTo=\\\"\\\" tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=\\\"tc-btn-invisible\\\">\\n{{$:/core/images/close-button}}\\n\u003C/$button>\\n\u003C/$reveal>\\n\u003C/div>\\n\u003C/div>\\n\\n\u003C$macrocall $name=\\\"tabs\\\" tabsList=\\\"[all[shadows+tiddlers]tag[$:/tags/TiddlerInfo]!has[draft.of]]\\\" default={{$:/config/TiddlerInfo/Default}}/>\\n\"},\"$:/core/ui/TopBar/menu\":{\"title\":\"$:/core/ui/TopBar/menu\",\"tags\":\"$:/tags/TopRightBar\",\"text\":\"\\\\whitespace trim\\n\u003C$list filter=\\\"[[$:/state/sidebar]get[text]] +[else[yes]!match[no]]\\\" variable=\\\"ignore\\\">\\n\u003C$button set=\\\"$:/state/sidebar\\\" setTo=\\\"no\\\" tooltip={{$:/language/Buttons/HideSideBar/Hint}} aria-label={{$:/language/Buttons/HideSideBar/Caption}} class=\\\"tc-btn-invisible tc-hide-sidebar-btn\\\">{{$:/core/images/chevron-right}}\u003C/$button>\\n\u003C/$list>\\n\u003C$list filter=\\\"[[$:/state/sidebar]get[text]] +[else[yes]match[no]]\\\" variable=\\\"ignore\\\">\\n\u003C$button set=\\\"$:/state/sidebar\\\" setTo=\\\"yes\\\" tooltip={{$:/language/Buttons/ShowSideBar/Hint}} aria-label={{$:/language/Buttons/ShowSideBar/Caption}} class=\\\"tc-btn-invisible tc-show-sidebar-btn\\\">{{$:/core/images/chevron-left}}\u003C/$button>\\n\u003C/$list>\\n\"},\"$:/core/ui/UntaggedTemplate\":{\"title\":\"$:/core/ui/UntaggedTemplate\",\"text\":\"\\\\define lingo-base() $:/language/SideBar/\\n\\\\whitespace trim\\n\u003C$button popup=\u003C\u003Cqualify \\\"$:/state/popup/tag\\\">> class=\\\"tc-btn-invisible tc-untagged-label tc-tag-label\\\">\\n\\t\u003C\u003Clingo Tags/Untagged/Caption>>\\n\u003C/$button>\\n\u003C$reveal class=\\\"tc-drop-down\\\" tag=\\\"div\\\" state=\u003C\u003Cqualify \\\"$:/state/popup/tag\\\">> type=\\\"popup\\\" position=\\\"below\\\">\\n\\t\u003C$list filter=\\\"[untagged[]!is[system]] -[tags[]] +[sort[title]]\\\" template=\\\"$:/core/ui/ListItemTemplate\\\"/>\\n\u003C/$reveal>\\n\"},\"$:/core/ui/ViewTemplate/body/blank\":{\"title\":\"$:/core/ui/ViewTemplate/body/blank\",\"text\":\"\u003C!-- Intentionally blank -->\\n\"},\"$:/core/ui/ViewTemplate/body/code\":{\"title\":\"$:/core/ui/ViewTemplate/body/code\",\"text\":\"\u003C$codeblock code={{{ [\u003CcurrentTiddler>get[text]] }}} language={{{ [\u003CcurrentTiddler>get[type]else[text/vnd.tiddlywiki]] }}}/>\\n\"},\"$:/core/ui/ViewTemplate/body/default\":{\"title\":\"$:/core/ui/ViewTemplate/body/default\",\"code-body\":\"yes\",\"text\":\"\u003C$transclude>\\n\\n\u003C$transclude tiddler=\\\"$:/language/MissingTiddler/Hint\\\"/>\\n\\n\u003C/$transclude>\\n\"},\"$:/core/ui/ViewTemplate/body/import\":{\"title\":\"$:/core/ui/ViewTemplate/body/import\",\"text\":\"\\\\define lingo-base() $:/language/Import/\\n\\n\\\\define confirmCancel()\\n\\\\whitespace trim\\n\u003C$action-confirm $message={{$:/language/Import/Listing/Cancel/Warning}} >\\n\u003C$action-deletetiddler $tiddler=\u003C\u003CcurrentTiddler>>/>\\n\u003C$action-sendmessage $message=\\\"tm-close-tiddler\\\" title=\u003C\u003CcurrentTiddler>>/>\\n\u003C/$action-confirm>\\n\\\\end\\n\\n\\\\define buttons()\\n\\\\whitespace trim\\n\u003C$button actions=\u003C\u003CconfirmCancel>> >\u003C\u003Clingo Listing/Cancel/Caption>>\u003C/$button>\\n&#32;\\n\u003C$button message=\\\"tm-perform-import\\\" param=\u003C\u003CcurrentTiddler>>>\u003C\u003Clingo Listing/Import/Caption>>\u003C/$button>\\n&#32;\\n\u003C\u003Clingo Listing/Preview>>&#32;\u003C$select tiddler=\\\"$:/state/importpreviewtype\\\" default=\\\"$:/core/ui/ImportPreviews/Text\\\">\\n\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/ImportPreview]!has[draft.of]]\\\">\\n\u003Coption value=\u003C\u003CcurrentTiddler>>>{{!!caption}}\u003C/option>\\n\u003C/$list>\\n\u003C/$select>\\n\\\\end\\n\\\\whitespace trim\\n\\n\u003C$list filter=\\\"[all[current]field:plugin-type[import]]\\\">\\n\\n\u003Cdiv class=\\\"tc-import\\\">\\n\\n\u003C\u003Clingo Listing/Hint>>\\n\\n\u003C\u003Cbuttons>>\\n\\n{{||$:/core/ui/ImportListing}}
2731\\n\\n\u003C\u003Cbuttons>>\\n\\n\u003C/div>\\n\\n\u003C/$list>\\n\"},\"$:/core/ui/ViewTemplate/body/plugin\":{\"title\":\"$:/core/ui/ViewTemplate/body/plugin\",\"text\":\"\\\\whitespace trim\\n\u003Cdiv class=\\\"tc-tiddler-plugin-info\\\">\\n\u003C$let plugin-type={{!!plugin-type}}\\n\\tdefault-popup-state=\\\"yes\\\"\\n\\tqualified-state=\u003C\u003Cqualify \\\"$:/state/plugin-info\\\">>\\n>\\n{{||$:/core/ui/Components/plugin-info}}\\n\u003C/$let>\\n\u003C/div>\"},\"$:/core/ui/ViewTemplate/body/rendered-plain-text\":{\"title\":\"$:/core/ui/ViewTemplate/body/rendered-plain-text\",\"code-body\":\"yes\",\"text\":\"\\\\whitespace trim\\n\u003C$wikify name=\\\"text\\\" text={{!!text}} type={{!!type}}>\\n\u003C$codeblock code=\u003C\u003Ctext>> language=\\\"css\\\"/>\\n\u003C/$wikify>\\n\"},\"$:/core/ui/ViewTemplate/body\":{\"title\":\"$:/core/ui/ViewTemplate/body\",\"tags\":\"$:/tags/ViewTemplate\",\"text\":\"\\\\import [all[shadows+tiddlers]tag[$:/tags/Macro/View/Body]!is[draft]] [all[shadows+tiddlers]tag[$:/tags/Global/View/Body]!is[draft]]\\n\\n\u003C$reveal tag=\\\"div\\\" class=\\\"tc-tiddler-body\\\" type=\\\"nomatch\\\" stateTitle=\u003C\u003Cfolded-state>> text=\\\"hide\\\" retain=\\\"yes\\\" animate=\\\"yes\\\">\\n\\n\u003C$transclude tiddler={{{ [\u003CcurrentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/ViewTemplateBodyFilter]!is[draft]get[text]] :and[!is[blank]else[$:/core/ui/ViewTemplate/body/default]] }}} />\\n\\n\u003C/$reveal>\\n\"},\"$:/core/ui/ViewTemplate/classic\":{\"title\":\"$:/core/ui/ViewTemplate/classic\",\"tags\":\"$:/tags/ViewTemplate $:/tags/EditTemplate\",\"text\":\"\\\\define lingo-base() $:/language/ClassicWarning/\\n\\\\whitespace trim\\n\u003C$list filter=\\\"[all[current]type[text/x-tiddlywiki]]\\\">\\n\u003Cdiv class=\\\"tc-message-box\\\">\\n\\n\u003C\u003Clingo Hint>>\\n\\n\u003C$button set=\\\"!!type\\\" setTo=\\\"text/vnd.tiddlywiki\\\">\u003C\u003Clingo Upgrade/Caption>>\u003C/$button>\\n\\n\u003C/div>\\n\u003C/$list>\\n\"},\"$:/core/ui/ViewTemplate/subtitle/modified\":{\"title\":\"$:/core/ui/ViewTemplate/subtitle/modified\",\"tags\":\"$:/tags/ViewTemplate/Subtitle\",\"text\":\"\u003C$view field=\\\"modified\\\" format=\\\"date\\\" template={{$:/language/Tiddler/DateFormat}}/>\"},\"$:/core/ui/ViewTemplate/subtitle/modifier\":{\"title\":\"$:/core/ui/ViewTemplate/subtitle/modifier\",\"tags\":\"$:/tags/ViewTemplate/Subtitle\",\"text\":\"\u003C$link to={{!!modifier}}/>\"},\"$:/core/ui/ViewTemplate/subtitle\":{\"title\":\"$:/core/ui/ViewTemplate/subtitle\",\"tags\":\"$:/tags/ViewTemplate\",\"text\":\"\\\\whitespace trim\\n\u003C$reveal type=\\\"nomatch\\\" stateTitle=\u003C\u003Cfolded-state>> text=\\\"hide\\\" tag=\\\"div\\\" retain=\\\"yes\\\" animate=\\\"yes\\\">\\n\u003Cdiv class=\\\"tc-subtitle\\\">\\n\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/ViewTemplate/Subtitle]!has[draft.of]]\\\" variable=\\\"subtitleTiddler\\\" counter=\\\"indexSubtitleTiddler\\\">\\n\u003C$list filter=\\\"[\u003CindexSubtitleTiddler-first>match[no]]\\\" variable=\\\"ignore\\\">\\n&nbsp;\\n\u003C/$list>\\n\u003C$transclude tiddler=\u003C\u003CsubtitleTiddler>> mode=\\\"inline\\\"/>\\n\u003C/$list>\\n\u003C/div>\\n\u003C/$reveal>\\n\"},\"$:/core/ui/ViewTemplate/tags\":{\"title\":\"$:/core/ui/ViewTemplate/tags\",\"tags\":\"$:/tags/ViewTemplate\",\"text\":\"\\\\whitespace trim\\n\u003C$reveal type=\\\"nomatch\\\" stateTitle=\u003C\u003Cfolded-state>> text=\\\"hide\\\" tag=\\\"div\\\" retain=\\\"yes\\\" animate=\\\"yes\\\">\\n\u003Cdiv class=\\\"tc-tags-wrapper\\\">\u003C$list filter=\\\"[all[current]tags[]sort[title]]\\\" template=\\\"$:/core/ui/TagTemplate\\\" storyview=\\\"pop\\\"/>\u003C/div>\\n\u003C/$reveal>\\n\"},\"$:/core/ui/ViewTemplate/title/default\":{\"title\":\"$:/core/ui/ViewTemplate/title/default\",\"text\":\"\\\\whitespace trim\\n\u003Ch2 class=\\\"tc-title\\\">\\n\u003C$view field=\\\"title\\\"/>\\n\u003C/h2>\\n\"},\"$:/core/ui/ViewTemplate/title/system\":{\"title\":\"$:/core/ui/ViewTemplate/title/system\",\"text\":\"\\\\whitespace trim\\n\u003Ch2 class=\\\"tc-title\\\" title={{$:/language/SystemTiddler/Tooltip}}>\\n\u003Cspan class=\\\"tc-system-title-prefix\\\">$:/\u003C/span>\u003C$text text={{{ [\u003CcurrentTiddler>removeprefix[$:/]] }}}/>\\n\u003C/h2>\"},\"$:/core/ui/ViewTemplate/title\":{\"title\":\"$:/core/ui/ViewTemplate/title\",\"tags\":\"$:/tags/ViewTemplate\",\"text\":\"\\\\whitespace trim\\n\\\\define title-styles()\\nfill:$(foregroundColor)$;\\n\\\\end\\n\u003Cdiv class=\\\"tc-tiddler-title\\\">\\n\u003Cdiv class=\\\"tc-titlebar\\\">
2731\\n\u003Cspan class=\\\"tc-tiddler-controls\\\">\\n\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]] :filter[lookup[$:/config/ViewToolbarButtons/Visibility/]!match[hide]]\\\" storyview=\\\"pop\\\" variable=\\\"listItem\\\">\u003C$set name=\\\"tv-config-toolbar-class\\\" filter=\\\"[\u003Ctv-config-toolbar-class>] [\u003ClistItem>encodeuricomponent[]addprefix[tc-btn-]]\\\">\u003C$transclude tiddler=\u003C\u003ClistItem>>/>\u003C/$set>\u003C/$list>\\n\u003C/span>\\n\u003C$set name=\\\"tv-wikilinks\\\" value={{$:/config/Tiddlers/TitleLinks}}>\\n\u003C$link>\\n\u003C$list filter=\\\"[\u003CcurrentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerIconFilter]!is[draft]get[text]] +[!is[blank]]\\\" variable=\\\"ignore\\\">\\n\u003C$let foregroundColor={{{ [\u003CcurrentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerColourFilter]!is[draft]get[text]] }}}>\\n\u003Cspan class=\\\"tc-tiddler-title-icon\\\" style=\u003C\u003Ctitle-styles>>>\\n{{||$:/core/ui/TiddlerIcon}}\\n\u003C/span>\\n\u003C/$let>\\n\u003C/$list>\\n\u003C$transclude tiddler={{{ [\u003CcurrentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/ViewTemplateTitleFilter]!is[draft]get[text]] :and[!is[blank]else[$:/core/ui/ViewTemplate/title/default]] }}} />\\n\u003C/$link>\\n\u003C/$set>\\n\u003C/div>\\n\\n\u003C$reveal type=\\\"nomatch\\\" text=\\\"\\\" default=\\\"\\\" state=\u003C\u003CtiddlerInfoState>> class=\\\"tc-tiddler-info tc-popup-handle\\\" animate=\\\"yes\\\" retain=\\\"yes\\\">\\n\\n\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/TiddlerInfoSegment]!has[draft.of]] [[$:/core/ui/TiddlerInfo]]\\\" variable=\\\"listItem\\\">\u003C$transclude tiddler=\u003C\u003ClistItem>> mode=\\\"block\\\"/>\u003C/$list>\\n\\n\u003C/$reveal>\\n\u003C/div>\\n\"},\"$:/core/ui/ViewTemplate/unfold\":{\"title\":\"$:/core/ui/ViewTemplate/unfold\",\"tags\":\"$:/tags/ViewTemplate\",\"text\":\"\\\\whitespace trim\\n\u003Cdiv class=\\\"tc-reveal\\\">\\n\u003C$list filter=\\\"[{$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-bar}match[show]]\\\" variable=\\\"ignore\\\">\\n\u003C$reveal tag=\\\"div\\\" type=\\\"nomatch\\\" stateTitle=\u003C\u003Cfolded-state>> text=\\\"hide\\\" default=\\\"show\\\" retain=\\\"yes\\\" animate=\\\"yes\\\">\\n\u003C$button tooltip={{$:/language/Buttons/Fold/Hint}} aria-label={{$:/language/Buttons/Fold/Caption}} class=\\\"tc-fold-banner\\\">\\n\u003C$action-sendmessage $message=\\\"tm-fold-tiddler\\\" $param=\u003C\u003CcurrentTiddler>> foldedState=\u003C\u003Cfolded-state>>/>\\n{{$:/core/images/chevron-up}}\\n\u003C/$button>\\n\u003C/$reveal>\\n\u003C/$list>\\n\u003C$list filter=\\\"[{$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-bar}match[show]] :else[\u003Cfolded-state>get[text]match[hide]]\\\" variable=\\\"ignore\\\">\\n\u003C$reveal tag=\\\"div\\\" type=\\\"nomatch\\\" stateTitle=\u003C\u003Cfolded-state>> text=\\\"show\\\" default=\\\"show\\\" retain=\\\"yes\\\" animate=\\\"yes\\\">\\n\u003C$button tooltip={{$:/language/Buttons/Unfold/Hint}} aria-label={{$:/language/Buttons/Unfold/Caption}} class=\\\"tc-unfold-banner\\\">\\n\u003C$action-sendmessage $message=\\\"tm-fold-tiddler\\\" $param=\u003C\u003CcurrentTiddler>> foldedState=\u003C\u003Cfolded-state>>/>\\n{{$:/core/images/chevron-down}}\\n\u003C/$button>\\n\u003C/$reveal>\\n\u003C/$list>\\n\u003C/div>\"},\"$:/core/ui/ViewTemplate\":{\"title\":\"$:/core/ui/ViewTemplate\",\"code-body\":\"yes\",\"text\":\"\\\\whitespace trim\\n\\\\define folded-state()\\n$:/state/folded/$(currentTiddler)$\\n\\\\end\\n\\\\define cancel-delete-tiddler-actions(message) \u003C$action-sendmessage $message=\\\"tm-$message$-tiddler\\\"/>\\n\\\\import [all[shadows+tiddlers]tag[$:/tags/Macro/View]!is[draft]] [all[shadows+tiddlers]tag[$:/tags/Global/View]!is[draft]]\\n\u003C$vars storyTiddler=\u003C\u003CcurrentTiddler>> tiddlerInfoState=\u003C\u003Cqualify \\\"$:/state/popup/tiddler-info\\\">>>\\n\u003Cdiv data-tiddler-title=\u003C\u003CcurrentTiddler>> data-tags={{!!tags}} class={{{ [all[shadows+tiddlers]tag[$:/tags/ClassFilters/TiddlerTemplate]!is[draft]] :map:flat[subfilter{!!text}] tc-tiddler-frame tc-tiddler-view-frame [\u003CcurrentTiddler>is[tiddler]then[tc-tiddler-exists]] [\u003CcurrentTiddler>is[missing]!is[shadow]then[tc-tiddler-missing]] [\u003CcurrentTiddler>is[shadow]then[tc-tiddler-exists tc-tiddler-shadow]] [\u003CcurrentTiddler>is[shadow]is[tiddler]then[tc-tiddler-overridden-shadow]] [\u003CcurrentTiddler>is[system]then[tc-tiddler-system]] [{!!class}] [\u003CcurrentTiddler>tags[]encodeuricomponent[]addprefix[tc-tagged-]] +[join[ ]] }}} role=\\\"article\\\">\\n\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/ViewTemplate]!is[draft]]\\\" variable=\\\"listItem\\\">\\n\u003C$transclude tiddler=\u003C\u003ClistItem>>/>\\n\u003C/$list>\\n\u003C/div>\\n\u003C/$vars>\\n\"},\"$:/core/ui/Buttons/clone\":{\"title\":\"$:/core/ui/Buttons/clone\",\"tags\":\"$:/tags/ViewToolbar\",\"caption\":\"{{$:/core/images/clone-button}} {{$:/language/Buttons/Clone/Caption}}\",\"description\":\"{{$:/language/Buttons/Clone/Hint}}\",\"text\":\"\\\\whitespace trim\\n\u003C$button message=\\\"tm-new-tiddler\\\" param=\u003C\u003CcurrentTiddler>> tooltip={{$:/language/Buttons/Clone/Hint}} aria-label={{$:/language/Buttons/Clone/Caption}} class=\u003C\u003Ctv-config-toolbar-class>>>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/clone-button}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\\n\u003C$text text={{$:/language/Buttons/Clone/Caption}}/>\\n\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\"},\"$:/core/ui/Buttons/close-others\":{\"title\":\"$:/core/ui/Buttons/close-others\",\"tags\":\"$:/tags/ViewToolbar\",\"caption\":\"{{$:/core/images/close-others-button}} {{$:/language/Buttons/CloseOthers/Caption}}\",\"description\":\"{{$:/language/Buttons/CloseOthers/Hint}}\",\"text\":\"\\\\whitespace trim\\n\u003C$button message=\\\"tm-close-other
2731-tiddlers\\\" param=\u003C\u003CcurrentTiddler>> tooltip={{$:/language/Buttons/CloseOthers/Hint}} aria-label={{$:/language/Buttons/CloseOthers/Caption}} class=\u003C\u003Ctv-config-toolbar-class>>>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/close-others-button}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\\n\u003C$text text={{$:/language/Buttons/CloseOthers/Caption}}/>\\n\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\"},\"$:/core/ui/Buttons/close\":{\"title\":\"$:/core/ui/Buttons/close\",\"tags\":\"$:/tags/ViewToolbar\",\"caption\":\"{{$:/core/images/close-button}} {{$:/language/Buttons/Close/Caption}}\",\"description\":\"{{$:/language/Buttons/Close/Hint}}\",\"text\":\"\\\\whitespace trim\\n\u003C$button message=\\\"tm-close-tiddler\\\" tooltip={{$:/language/Buttons/Close/Hint}} aria-label={{$:/language/Buttons/Close/Caption}} class=\u003C\u003Ctv-config-toolbar-class>>>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/close-button}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\\n\u003C$text text={{$:/language/Buttons/Close/Caption}}/>\\n\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\"},\"$:/core/ui/Buttons/edit\":{\"title\":\"$:/core/ui/Buttons/edit\",\"tags\":\"$:/tags/ViewToolbar\",\"caption\":\"{{$:/core/images/edit-button}} {{$:/language/Buttons/Edit/Caption}}\",\"description\":\"{{$:/language/Buttons/Edit/Hint}}\",\"text\":\"\\\\whitespace trim\\n\u003C$button message=\\\"tm-edit-tiddler\\\" tooltip={{$:/language/Buttons/Edit/Hint}} aria-label={{$:/language/Buttons/Edit/Caption}} class=\u003C\u003Ctv-config-toolbar-class>>>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/edit-button}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\\n\u003C$text text={{$:/language/Buttons/Edit/Caption}}/>\\n\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\"},\"$:/core/ui/Buttons/export-tiddler\":{\"title\":\"$:/core/ui/Buttons/export-tiddler\",\"tags\":\"$:/tags/ViewToolbar\",\"caption\":\"{{$:/core/images/export-button}} {{$:/language/Buttons/ExportTiddler/Caption}}\",\"description\":\"{{$:/language/Buttons/ExportTiddler/Hint}}\",\"text\":\"\\\\define makeExportFilter()\\n[[$(currentTiddler)$]]\\n\\\\end\\n\u003C$macrocall $name=\\\"exportButton\\\" exportFilter=\u003C\u003CmakeExportFilter>> lingoBase=\\\"$:/language/Buttons/ExportTiddler/\\\" baseFilename=\u003C\u003CcurrentTiddler>>/>\"},\"$:/core/ui/Buttons/fold-bar\":{\"title\":\"$:/core/ui/Buttons/fold-bar\",\"tags\":\"$:/tags/ViewToolbar\",\"caption\":\"{{$:/core/images/chevron-up}} {{$:/language/Buttons/Fold/FoldBar/Caption}}\",\"description\":\"{{$:/language/Buttons/Fold/FoldBar/Hint}}\",\"text\":\"\u003C!-- This dummy toolbar button is here to allow visibility of the fold-bar to be controlled as if it were a toolbar button -->\"},\"$:/core/ui/Buttons/fold-others\":{\"title\":\"$:/core/ui/Buttons/fold-others\",\"tags\":\"$:/tags/ViewToolbar\",\"caption\":\"{{$:/core/images/fold-others-button}} {{$:/language/Buttons/FoldOthers/Caption}}\",\"description\":\"{{$:/language/Buttons/FoldOthers/Hint}}\",\"text\":\"\\\\whitespace trim\\n\u003C$button tooltip={{$:/language/Buttons/FoldOthers/Hint}} aria-label={{$:/language/Buttons/FoldOthers/Caption}} class=\u003C\u003Ctv-config-toolbar-class>>>\\n\u003C$action-sendmessage $message=\\\"tm-fold-other-tiddlers\\\" $param=\u003C\u003CcurrentTiddler>> foldedStatePrefix=\\\"$:/state/folded/\\\"/>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\" variable=\\\"listItem\\\">\\n{{$:/core/images/fold-others-button}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\\n\u003C$text text={{$:/language/Buttons/FoldOthers/Caption}}/>\\n\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\"},\"$:/core/ui/Buttons/fold\":{\"title\":\"$:/core/ui/Buttons/fold\",\"tags\":\"$:/tags/ViewToolbar\",\"caption\":\"{{$:/core/images/fold-button}} {{$:/language/Buttons/Fold/Caption}}\",\"description\":\"{{$:/language/Buttons/Fold/Hint}}\",\"text\":\"\\\\whitespace trim\\n\u003C$reveal type=\\\"nomatch\\\" stateTitle=\u003C\u003Cfolded-state>> text=\\\"hide\\\" default=\\\"show\\\">\\n\u003C$button tooltip={{$:/language/Buttons/Fold/Hint}} aria-label={{$:/language/Buttons/Fold/Caption}} class=\u003C\u003Ctv-config-toolbar-class>>>\\n\u003C$action-sendmessage $message=\\\"tm-fold-tiddler\\\" $param=\u003C\u003CcurrentTiddler>> foldedState=\u003C\u003Cfolded-state>>/>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\" variable=\\\"listItem\\\">\\n{{$:/core/images/fold-button}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\\n\u003C$text text={{$:/language/Buttons/Fold/Caption}}/>\\n\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\\n\u003C/$reveal>\\n\u003C$reveal type=\\\"match\\\" stateTitle=\u003C\u003Cfolded-state>> text=\\\"hide\\\" default=\\\"show\\\">\\n\u003C$button tooltip={{$:/language/Buttons/Unfold/Hint}} aria-label={{$:/language/Buttons/Unfold/Caption}} class=\u003C\u003Ctv-config-toolbar-class>>>\\n\u003C$action-sendmessage $message=\\\"tm-fold-tiddler\\\" $param=\u003C\u003CcurrentTiddler>> foldedState=\u003C\u003Cfolded-state>>/>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\" variable=\\\"listItem\\\">\\n{{$:/core/images/unfold-button}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\\n\u003C$text text={{$:/language/Buttons/Unfold/Caption}}/>\\n\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\\n\u003C/$reveal>\\n\"},\"$:/core/ui/Buttons/info\":{\"title\":\"$:/core/ui/Buttons/info\",\"tags\":\"$:/tags/ViewToolbar\",\"caption\":\"{{$:/core/images/info-button}} {{$:/language/Buttons/Info/Caption}}\",\"description\":\"{{$:/language/Buttons/Info/Hint}}\",\"text\":\"\\\\whitespace trim\\n\\\\define button-content()\\n\\\\whitespace trim\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/info-button}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\\n\u003C$text text={{$:/language/Buttons/Info/Caption}}/>\\n\u003C/span>\\n\u003C/$list>\\n\\\\end\\n\u003C$reveal state=\\\"$:/config/TiddlerInfo/Mode\\\" type=\\\"match\\\" text=\\\"popup\\\">\\n\u003C$button popup=\u003C\u003CtiddlerInfoState>> tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=\u003C\u003Ctv-config-toolbar-class>> selectedClass=\\\"tc-selected\\\">\\n\u003C$macrocall $name=\\\"button-content\\\" mode=\\\"inline\\\"/>\\n\u003C/$button>\\n\u003C/$reveal>\\n\u003C$reveal state=\\\"$:/config/TiddlerInfo/Mode\\\" type=\\\"match\\\" text=\\\"sticky\\\">\\n\u003C$reveal state=\u003C\u003CtiddlerInfoState>> type=\\\"match\\\" text=\\\"\\\" default=\\\"\\\">\\n\u003C$button set=\u003C\u003CtiddlerInfoState>> setTo=\\\"yes\\\" tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=\u003C\u003Ctv-config-toolbar-class>> selectedClass=\\\"tc-selected\\\">\\n\u003C$macrocall $name=\\\"button-content\\\" mode=\\\"inline\\\"/>\\n\u003C/$button>\\n\u003C/$reveal>\\n\u003C$reveal state=\u003C\u003CtiddlerInfoState>> type=\\\"nomatch\\\" text=\\\"\\\" default=\\\"\\\">\\n\u003C$button set=\u003C\u003CtiddlerInfoState>> setTo=\\\"\\\" tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=\u003C\u003Ctv-config-toolbar-class>> selectedClass=\\\"tc-selected\\\">\\n\u003C$macrocall $name=\\\"button-content\\\" mode=\\\"inline\\\"/>\\n\u003C/$button>\\n\u003C/$reveal>\\n\u003C/$reveal>\"},\"$:/core/ui/Buttons/more-tiddler-actions\":{\"title\":\"$:/core/ui/Buttons/more-tiddler-actions\",\"tags\":\"$:/tags/ViewToolbar\",\"caption\":\"{{$:/core/images/down-arrow}} {{$:/language/Buttons/More/Caption}}\",\"description\":\"{{$:/language/Buttons/More/Hint}}\",\"text\":\"\\\\whitespace trim\\n\\\\define config-title()\\n$:/config/ViewToolbarButtons/Visibility/$(listItem)$\\n\\\\end\\n\u003C$button popup=\u003C\u003Cqualify \\\"$:/state/popup/more\\\">> tooltip={{$:/language/Buttons/More/Hint}} aria-label={{$:/language/Buttons/More/Caption}} class=\u003C\u003Ctv-config-toolbar-class>> selectedClass=\\\"tc-selected\\\">\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/down-arrow}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\\n\u003C$text text={{$:/language/Buttons/More/Caption}}/>\\n\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\\n\u003C$reveal state=\u003C\u003Cqualify \\\"$:/state/popup/more\\\">> type=\\\"popup\\\" position=\\\"belowleft\\\" animate=\\\"yes\\\">\\n\\n\u003Cdiv class=\\\"tc-drop-down\\\">\\n\\n\u003C$set name=\\\"tv-config-toolbar-icons\\\" value=\\\"yes\\\">\\n\\n\u003C$set name=\\\"tv-config-toolbar-text\\\" value=\\\"yes\\\">\\n\\n\u003C$set name=\\\"tv-config-toolbar-class\\\" value=\\\"tc-btn-invisible\\\">\\n\\n\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]] -[[$:/core/ui/Buttons/more-tiddler-actions]]\\\" variable=\\\"listItem\\\">\\n\\n\u003C$reveal type=\\\"match\\\" state=\u003C\u003Cconfig-title>> text=\\\"hide\\\">\\n\\n\u003C$set name=\\\"tv-config-toolbar-class\\\" filter=\\\"[\u003Ctv-config-toolbar-class>] [\u003ClistItem>
2731encodeuricomponent[]addprefix[tc-btn-]]\\\">\\n\\n\u003C$transclude tiddler=\u003C\u003ClistItem>> mode=\\\"inline\\\"/>\\n\\n\u003C/$set>\\n\\n\u003C/$reveal>\\n\\n\u003C/$list>\\n\\n\u003C/$set>\\n\\n\u003C/$set>\\n\\n\u003C/$set>\\n\\n\u003C/div>\\n\\n\u003C/$reveal>\"},\"$:/core/ui/Buttons/new-here\":{\"title\":\"$:/core/ui/Buttons/new-here\",\"tags\":\"$:/tags/ViewToolbar\",\"caption\":\"{{$:/core/images/new-here-button}} {{$:/language/Buttons/NewHere/Caption}}\",\"description\":\"{{$:/language/Buttons/NewHere/Hint}}\",\"text\":\"\\\\whitespace trim\\n\\\\define newHereActions()\\n\\\\whitespace trim\\n\u003C$set name=\\\"tags\\\" filter=\\\"[\u003CcurrentTiddler>] [enlist{$:/config/NewTiddler/Tags}]\\\">\\n\u003C$action-sendmessage $message=\\\"tm-new-tiddler\\\" tags=\u003C\u003Ctags>>/>\\n\u003C/$set>\\n\\\\end\\n\\\\define newHereButton()\\n\\\\whitespace trim\\n\u003C$button actions=\u003C\u003CnewHereActions>> tooltip={{$:/language/Buttons/NewHere/Hint}} aria-label={{$:/language/Buttons/NewHere/Caption}} class=\u003C\u003Ctv-config-toolbar-class>>>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/new-here-button}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\\n\u003C$text text={{$:/language/Buttons/NewHere/Caption}}/>\\n\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\\n\\\\end\\n\u003C\u003CnewHereButton>>\\n\"},\"$:/core/ui/Buttons/new-journal-here\":{\"title\":\"$:/core/ui/Buttons/new-journal-here\",\"tags\":\"$:/tags/ViewToolbar\",\"caption\":\"{{$:/core/images/new-journal-button}} {{$:/language/Buttons/NewJournalHere/Caption}}\",\"description\":\"{{$:/language/Buttons/NewJournalHere/Hint}}\",\"text\":\"\\\\whitespace trim\\n\\\\define journalButtonTags()\\n[[$(currentTiddlerTag)$]] $(journalTags)$\\n\\\\end\\n\\\\define journalButton()\\n\\\\whitespace trim\\n\u003C$button tooltip={{$:/language/Buttons/NewJournalHere/Hint}} aria-label={{$:/language/Buttons/NewJournalHere/Caption}} class=\u003C\u003Ctv-config-toolbar-class>>>\\n\u003C$wikify name=\\\"journalTitle\\\" text=\\\"\\\"\\\"\u003C$macrocall $name=\\\"now\\\" format=\u003C\u003CjournalTitleTemplate>>/>\\\"\\\"\\\">\\n\u003C$action-sendmessage $message=\\\"tm-new-tiddler\\\" title=\u003C\u003CjournalTitle>> tags=\u003C\u003CjournalButtonTags>>/>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/new-journal-button}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\\n\u003C$text text={{$:/language/Buttons/NewJournalHere/Caption}}/>\\n\u003C/span>\\n\u003C/$list>\\n\u003C/$wikify>\\n\u003C/$button>\\n\\\\end\\n\u003C$set name=\\\"journalTitleTemplate\\\" value={{$:/config/NewJournal/Title}}>\\n\u003C$set name=\\\"journalTags\\\" value={{$:/config/NewJournal/Tags}}>\\n\u003C$set name=\\\"currentTiddlerTag\\\" value=\u003C\u003CcurrentTiddler>>>\\n\u003C\u003CjournalButton>>\\n\u003C/$set>\\n\u003C/$set>\\n\u003C/$set>\\n\"},\"$:/core/ui/Buttons/open-window\":{\"title\":\"$:/core/ui/Buttons/open-window\",\"tags\":\"$:/tags/ViewToolbar\",\"caption\":\"{{$:/core/images/open-window}} {{$:/language/Buttons/OpenWindow/Caption}}\",\"description\":\"{{$:/language/Buttons/OpenWindow/Hint}}\",\"text\":\"\\\\whitespace trim\\n\u003C$button message=\\\"tm-open-window\\\" tooltip={{$:/language/Buttons/OpenWindow/Hint}} aria-label={{$:/language/Buttons/OpenWindow/Caption}} class=\u003C\u003Ctv-config-toolbar-class>>>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/open-window}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\\n\u003C$text text={{$:/language/Buttons/OpenWindow/Caption}}/>\\n\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\"},\"$:/core/ui/Buttons/permalink\":{\"title\":\"$:/core/ui/Buttons/permalink\",\"tags\":\"$:/tags/ViewToolbar\",\"caption\":\"{{$:/core/images/permalink-button}} {{$:/language/Buttons/Permalink/Caption}}\",\"description\":\"{{$:/language/Buttons/Permalink/Hint}}\",\"text\":\"\\\\whitespace trim\\n\u003C$button message=\\\"tm-permalink\\\" tooltip={{$:/language/Buttons/Permalink/Hint}} aria-label={{$:/language/Buttons/Permalink/Caption}} class=\u003C\u003Ctv-config-toolbar-class>>>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/permalink-button}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\\n\u003C$text text={{$:/language/Buttons/Permalink/Caption}}/>\\n\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\"},\"$:/core/ui/Buttons/permaview\":{\"title\":\"$:/core/ui/Buttons/permaview\",\"tags\":\"$:/tags/ViewToolbar $:/tags/PageControls\",\"caption\":\"{{$:/core/images/permaview-button}} {{$:/language/Buttons/Permaview/Caption}}\",\"description\":\"{{$:/language/Buttons/Permaview/Hint}}\",\"text\":\"\\\\whitespace trim\\n\u003C$button message=\\\"tm-permaview\\\" tooltip={{$:/language/Buttons/Permaview/Hint}} aria-label={{$:/language/Buttons/Permaview/Caption}} class=\u003C\u003Ctv-config-toolbar-class>>>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/permaview-button}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\\n\u003C$text text={{$:/language/Buttons/Permaview/Caption}}/>\\n\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\"},\"$:/DefaultTiddlers\":{\"title\":\"$:/DefaultTiddlers\",\"text\":\"GettingStarted\\n\"},\"$:/temp/advancedsearch\":{\"title\":\"$:/temp/advancedsearch\",\"text\":\"\"},\"$:/snippets/allfields\":{\"title\":\"$:/snippets/allfields\",\"text\":\"\\\\define renderfield(title)\\n\u003Ctr class=\\\"tc-view-field\\\">\u003Ctd class=\\\"tc-view-field-name\\\">''\u003C$text text=\u003C\u003C__title__>>/>'':\u003C/td>\u003Ctd class=\\\"tc-view-field-value\\\">//{{$:/language/Docs/Fields/$title$}}//\u003C/td>\u003C/tr>\\n\\\\end\\n\\\\whitespace trim\\n\u003Ctable class=\\\"tc-view-field-table\\\">\\n\u003Ctbody>\\n\u003C$list filter=\\\"[fields[]sort[title]]\\\" variable=\\\"listItem\\\">\\n\u003C$macrocall $name=\\\"renderfield\\\" title=\u003C\u003ClistItem>>/>\\n\u003C/$list>\\n\u003C/tbody>\\n\u003C/table>\\n\"},\"$:/config/AnimationDuration\":{\"title\":\"$:/config/AnimationDuration\",\"text\":\"400\"},\"$:/config/AutoFocus\":{\"title\":\"$:/config/AutoFocus\",\"text\":\"title\"},\"$:/config/AutoSave\":{\"title\":\"$:/config/AutoSave\",\"text\":\"yes\"},\"$:/config/BitmapEditor/Colour\":{\"title\":\"$:/config/BitmapEditor/Colour\",\"text\":\"#444\"},\"$:/config/BitmapEditor/ImageSizes\":{\"title\":\"$:/config/BitmapEditor/ImageSizes\",\"text\":\"[[62px 100px]] [[100px 62px]] [[124px 200px]] [[200px 124px]] [[248px 400px]] [[371px 600px]] [[400px 248px]] [[556px 900px]] [[600px 371px]] [[742px 1200px]] [[900
2731px 556px]] [[1200px 742px]]\"},\"$:/config/BitmapEditor/LineWidth\":{\"title\":\"$:/config/BitmapEditor/LineWidth\",\"text\":\"3px\"},\"$:/config/BitmapEditor/LineWidths\":{\"title\":\"$:/config/BitmapEditor/LineWidths\",\"text\":\"0.25px 0.5px 1px 2px 3px 4px 6px 8px 10px 16px 20px 28px 40px 56px 80px\"},\"$:/config/BitmapEditor/Opacities\":{\"title\":\"$:/config/BitmapEditor/Opacities\",\"text\":\"0.01 0.025 0.05 0.075 0.1 0.15 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0\"},\"$:/config/BitmapEditor/Opacity\":{\"title\":\"$:/config/BitmapEditor/Opacity\",\"text\":\"1.0\"},\"$:/config/DefaultMoreSidebarTab\":{\"title\":\"$:/config/DefaultMoreSidebarTab\",\"text\":\"$:/core/ui/MoreSideBar/Tags\"},\"$:/config/DefaultSidebarTab\":{\"title\":\"$:/config/DefaultSidebarTab\",\"text\":\"$:/core/ui/SideBar/Open\"},\"$:/config/ControlPanel/Basics/DefaultTiddlers/RetainStory\":{\"title\":\"$:/config/ControlPanel/Basics/DefaultTiddlers/RetainStory\",\"text\":\"[list[$:/StoryList]]\"},\"$:/config/DownloadSaver/AutoSave\":{\"title\":\"$:/config/DownloadSaver/AutoSave\",\"text\":\"no\"},\"$:/config/Drafts/TypingTimeout\":{\"title\":\"$:/config/Drafts/TypingTimeout\",\"text\":\"400\"},\"$:/config/EditMode/fieldname-filter\":{\"title\":\"$:/config/EditMode/fieldname-filter\",\"first-search-filter\":\"[!is[shadow]!is[system]fields[]search:title\u003CuserInput>sort[]] -created -creator -draft.of -draft.title -modified -modifier -tags -text -title -type\",\"second-search-filter\":\"[fields[]search:title\u003CuserInput>sort[]] -[!is[shadow]!is[system]fields[]]\"},\"$:/config/EditTabIndex\":{\"title\":\"$:/config/EditTabIndex\",\"text\":\"1\"},\"$:/config/EditTemplateBodyFilters/canonical-uri\":{\"title\":\"$:/config/EditTemplateBodyFilters/canonical-uri\",\"tags\":\"$:/tags/EditTemplateBodyFilter\",\"text\":\"[has[_canonical_uri]then[$:/core/ui/EditTemplate/body/canonical-uri]]\"},\"$:/config/EditTemplateBodyFilters/default\":{\"title\":\"$:/config/EditTemplateBodyFilters/default\",\"tags\":\"$:/tags/EditTemplateBodyFilter\",\"text\":\"[[$:/core/ui/EditTemplate/body/default]]\"},\"$:/config/EditTemplateFields/Visibility/title\":{\"title\":\"$:/config/EditTemplateFields/Visibility/title\",\"text\":\"hide\"},\"$:/config/EditTemplateFields/Visibility/tags\":{\"title\":\"$:/config/EditTemplateFields/Visibility/tags\",\"text\":\"hide\"},\"$:/config/EditTemplateFields/Visibility/text\":{\"title\":\"$:/config/EditTemplateFields/Visibility/text\",\"text\":\"hide\"},\"$:/config/EditTemplateFields/Visibility/creator\":{\"title\":\"$:/config/EditTemplateFields/Visibility/creator\",\"text\":\"hide\"},\"$:/config/EditTemplateFields/Visibility/created\":{\"title\":\"$:/config/EditTemplateFields/Visibility/created\",\"text\":\"hide\"},\"$:/config/EditTemplateFields/Visibility/modified\":{\"title\":\"$:/config/EditTemplateFields/Visibility/modified\",\"text\":\"hide\"},\"$:/config/EditTemplateFields/Visibility/modifier\":{\"title\":\"$:/config/EditTemplateFields/Visibility/modifier\",\"text\":\"hide\"},\"$:/config/EditTemplateFields/Visibility/type\":{\"title\":\"$:/config/EditTemplateFields/Visibility/type\",\"text\":\"hide\"},\"$:/config/EditTemplateFields/Visibility/draft.title\":{\"title\":\"$:/config/EditTemplateFields/Visibility/draft.title\",\"text\":\"hide\"},\"$:/config/EditTemplateFields/Visibility/draft.of\":{\"title\":\"$:/config/EditTemplateFields/Visibility/draft.of\",\"text\":\"hide\"},\"$:/config/EditTemplateFields/Visibility/revision\":{\"title\":\"$:/config/EditTemplateFields/Visibility/revision\",\"text\":\"hide\"},\"$:/config/EditTemplateFields/Visibility/bag\":{\"title\":\"$:/config/EditTemplateFields/Visibility/bag\",\"text\":\"hide\"},\"$:/config/Editor/EnableImportFilter\":{\"title\":\"$:/config/Editor/EnableImportFilter\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\"[all[current]type[text/vnd.tiddlywiki]] [all[current]!has[type]]\"},\"$:/config/Editor/ImportContentTypesFilter\":{\"title\":\"$:/config/Editor/ImportContentTypesFilter\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\"[prefix[image/]]\"},\"$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-4\"
2731:{\"title\":\"$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-4\",\"text\":\"hide\"},\"$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-5\":{\"title\":\"$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-5\",\"text\":\"hide\"},\"$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-6\":{\"title\":\"$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-6\",\"text\":\"hide\"},\"$:/config/EditorTypeMappings/image/gif\":{\"title\":\"$:/config/EditorTypeMappings/image/gif\",\"text\":\"bitmap\"},\"$:/config/EditorTypeMappings/image/webp\":{\"title\":\"$:/config/EditorTypeMappings/image/webp\",\"text\":\"bitmap\"},\"$:/config/EditorTypeMappings/image/heic\":{\"title\":\"$:/config/EditorTypeMappings/image/heic\",\"text\":\"bitmap\"},\"$:/config/EditorTypeMappings/image/heif\":{\"title\":\"$:/config/EditorTypeMappings/image/heif\",\"text\":\"bitmap\"},\"$:/config/EditorTypeMappings/image/jpeg\":{\"title\":\"$:/config/EditorTypeMappings/image/jpeg\",\"text\":\"bitmap\"},\"$:/config/EditorTypeMappings/image/jpg\":{\"title\":\"$:/config/EditorTypeMappings/image/jpg\",\"text\":\"bitmap\"},\"$:/config/EditorTypeMappings/image/png\":{\"title\":\"$:/config/EditorTypeMappings/image/png\",\"text\":\"bitmap\"},\"$:/config/EditorTypeMappings/image/x-icon\":{\"title\":\"$:/config/EditorTypeMappings/image/x-icon\",\"text\":\"bitmap\"},\"$:/config/EditorTypeMappings/text/vnd.tiddlywiki\":{\"title\":\"$:/config/EditorTypeMappings/text/vnd.tiddlywiki\",\"text\":\"text\"},\"$:/config/FieldEditorFilters/default\":{\"title\":\"$:/config/FieldEditorFilters/default\",\"tags\":\"$:/tags/FieldEditorFilter\",\"text\":\"[[$:/core/ui/EditTemplate/fieldEditor/default]]\"},\"$:/core/config/GlobalImportFilter\":{\"title\":\"$:/core/config/GlobalImportFilter\",\"text\":\"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!is[draft]] [all[shadows+tiddlers]tag[$:/tags/Global]!is[draft]]\"},\"$:/config/Manager/Show\":{\"title\":\"$:/config/Manager/Show\",\"text\":\"tiddlers\"},\"$:/config/Manager/Filter\":{\"title\":\"$:/config/Manager/Filter\",\"text\":\"\"},\"$:/config/Manager/Order\":{\"title\":\"$:/config/Manager/Order\",\"text\":\"forward\"},\"$:/config/Manager/Sort\":{\"title\":\"$:/config/Manager/Sort\",\"text\":\"title\"},\"$:/config/Manager/System\":{\"title\":\"$:/config/Manager/System\",\"text\":\"system\"},\"$:/config/Manager/Tag\":{\"title\":\"$:/config/Manager/Tag\",\"text\":\"\"},\"$:/state/popup/manager/item/$:/Manager/ItemMain/RawText\":{\"title\":\"$:/state/popup/manager/item/$:/Manager/ItemMain/RawText\",\"text\":\"hide\"},\"$:/config/MissingLinks\":{\"title\":\"$:/config/MissingLinks\",\"text\":\"yes\"},\"$:/config/Navigation/UpdateAddressBar\":{\"title\":\"$:/config/Navigation/UpdateAddressBar\",\"text\":\"no\"},\"$:/config/Navigation/UpdateHistory\":{\"title\":\"$:/config/Navigation/UpdateHistory\",\"text\":\"no\"},\"$:/config/NewImageType\":{\"title\":\"$:/config/NewImageType\",\"text\":\"jpeg\"},\"$:/config/OfficialPluginLibrary\":{\"title\":\"$:/config/OfficialPluginLibrary\",\"tags\":\"$:/tags/PluginLibrary\",\"url\":\"https://tiddlywiki.com/library/v5.3.1/index.html\",\"caption\":\"{{$:/language/OfficialPluginLibrary}}\",\"text\":\"{{$:/language/OfficialPluginLibrary/Hint}}\\n\"},\"$:/config/Navigation/openLinkFromInsideRiver\":{\"title\":\"$:/config/Navigation/openLinkFromInsideRiver\",\"text\":\"below\"},\"$:/config/Navigation/openLinkFromOutsideRiver\":{\"title\":\"$:/config/Navigation/openLinkFromOutsideRiver\",\"text\":\"top\"},\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/advanced-search\":{\"title\":\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/advanced-search\",\"text\":\"hide\"},\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/close-all\":{\"title\":\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/close-all\",\"text\":\"hide\"},\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/encryption\":{\"title\":\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/encryption\",\"text\":\"hide\"},\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/export-page\":{\"title\":\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/export-page\",\"text\":\"hide\"},\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/fold-all\":{\"title\":\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/fold-all\",\"text\":\"hide\"},\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/full-screen\":{\"title\":\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/full-screen\",\"text\":\"hide\"},\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/home\":{\"title\":\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/home\",\"text\":\"hide\"},\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/refresh\":{\"title\":\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/refresh\",\"text\":\"hide\"},\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/import\":{\"title\":\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/import\",\"text\":\"hide\"},\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/language\":{\"title\":\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/language\",\"text\":\"hide\"},\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/tag-manager\":{\"title\":\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/tag-manager\",\"text\":\"hide\"},\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/manager\":{\"title\":\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/manager\",\"text\":\"hide\"},\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/more-page-actions\":{\"title\":\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/more-page-actions\",\"text\":\"hide\"},\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/network-activity\":{\"title\":\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/network-activity\",\"text\":\"hide\"},\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-journal\":{\"title\":\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-journal\",\"text\":\"hide\"},\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-image\":{\"title\":\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-image\",\"text\":\"hide\"},\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/palette\":{\"title\":\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/palette\",\"text\":\"hide\"},\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/permaview\":{\"title\":\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/permaview\",\"text\":\"hide\"},\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/print\":{\"title\":\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/print\",\"text\":\"hide\"},\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/storyview\":{\"title\":\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/storyview\",\"text\":\"hide\"},\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/timestamp\":{\"title\":\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/timestamp\",\"text\":\"hide\"},\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/theme\":{\"title\":\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/theme\",\"text\":\"hide\"},\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/layout\":{\"title\":\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/layout\",\"text\":\"hide\"},\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/unfold-all\":{\"title\":\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/unfold-all\",\"text\":\"hide\"},\"$:/config/Performance/Instrumentation\":{\"title\":\"$:/config/Performance/Instrumentation\",\"text\":\"no\"},\"$:/config/RegisterPluginType/plugin\":{\"title\":\"$:/config/RegisterPluginType/plugin\",\"text\":\"yes\"},\"$:/config/RegisterPluginType/theme\":{\"title\":\"$:/config/RegisterPluginType/theme\",\"text\":\"no\"},\"$:/config/RegisterPluginType/language\":{\"title\":\"$:/config/RegisterPluginType/language\",\"text\":\"no\"},\"$:/config/RegisterPluginType/info\":{\"title\":\"$:/config/RegisterPluginType/info\",\"text\":\"yes\"},\"$:/config/RegisterPluginType/import\":{\"title\":\"$:/config/RegisterPluginType/import\",\"text\":\"no\"},\"$:/config/SaveWikiButton/Template\":{\"title\":\"$:/config/SaveWikiButton/Template\",\"text\":\"$:/core/save/all\"},\"$:/config/SaverFilter\":{\"title\":\"$:/config/SaverFilter\",\"text\":\"[all[]] -[prefix[$:/HistoryList]] -[prefix[$:/StoryList]] -[status[pending]plugin-type[import]] -[[$:/isEncrypted]] -[[$:/UploadName]] -[prefix[$:/state/]] -[prefix[$:/temp/]]\\n\"},\"$:/config/Search/AutoFocus\":{\"title\":\"$:/config/Search/AutoFocus\",\"text\":\"true\"},\"$:/config/Search/MinLength\":{\"title\":\"$:/config/Search/MinLength\",\"text\":\"3\"},\"$:/config/SearchResults/Default\":{\"title\":\"$:/config/SearchResults/Default\",\"text\":\"$:/core/ui/DefaultSearchResultList\"},\"$:/config/Server/ExternalFilters/[all[tiddlers]!is[system]sort[title]]\":{\"title\":\"$:/config/Server/ExternalFilters/[all[tiddlers]!is[system]sort[title]]\",\"text\":\"yes\"},\"$:/config/ShortcutInfo/add-field\":{\"title\":\"$:/config/ShortcutInfo/add-field\",\"text\":\"{{$:/language/EditTemplate/Fields/Add/Button/Hint}}\"},\"$:/config/ShortcutInfo/advanced-search\":{\"title\":\"$:/config/ShortcutInfo/advanced-search\",\"text\":\"{{$:/language/Buttons/AdvancedSearch/Hint}}\"},\"$:/config/ShortcutInfo/advanced-search-sidebar\":{\"title\":\"$:/config/ShortcutInfo/advanced-search-sidebar\",\"text\":\"{{$:/language/Shortcuts/Input/AdvancedSearch/Hint}}\"},\"$:/config/ShortcutInfo/bold\":{\"title\":\"$:/config/ShortcutInfo/bold\",\"text\":\"{{$:/language/Buttons/Bold/Hint}}\"},\"$:/config/ShortcutInfo/cancel-edit-tiddler\":{\"title\":\"$:/config/ShortcutInfo/cancel-edit-tiddler\",\"text\":\"{{$:/language/Buttons/Cancel/Hint}}\"},\"$:/config/ShortcutInfo/change-sidebar-layout\":{\"title\":\"$:/config/ShortcutInfo/change-sidebar-layout\",\"text\":\"{{$:/language/Shortcuts/SidebarLayout/Hint}}\"},\"$:/config/ShortcutInfo/delete-field\":{\"title\":\"$:/config/ShortcutInfo/delete-field\",\"text\":\"{{$:/language/EditTemplate/Field/Remove/Hint}}\"},\"$:/config/ShortcutInfo/excise\":{\"title\":\"$:/config/ShortcutInfo/excise\",\"text\":\"{{$:/language/Buttons/Excise/Hint}}\"},\"$:/config/ShortcutInfo/heading-1\":{\"title\":\"$:/config/ShortcutInfo/heading-1\",\"text\":\"{{$:/language/Buttons/Heading1/Hint}}\"},\"$:/config/ShortcutInfo/heading-2\":{\"title\":\"$:/config/ShortcutInfo/heading-2\",\"text\":\"{{$:/language/Buttons/Heading2/Hint}}\"},\"$:/config/ShortcutInfo/heading-3\":{\"title\":\"$:/config/ShortcutInfo/heading-3\",\"text\":\"{{$:/language/Buttons/Heading3/Hint}}\"}
2731,\"$:/config/ShortcutInfo/heading-4\":{\"title\":\"$:/config/ShortcutInfo/heading-4\",\"text\":\"{{$:/language/Buttons/Heading4/Hint}}\"},\"$:/config/ShortcutInfo/heading-5\":{\"title\":\"$:/config/ShortcutInfo/heading-5\",\"text\":\"{{$:/language/Buttons/Heading5/Hint}}\"},\"$:/config/ShortcutInfo/heading-6\":{\"title\":\"$:/config/ShortcutInfo/heading-6\",\"text\":\"{{$:/language/Buttons/Heading6/Hint}}\"},\"$:/config/ShortcutInfo/input-accept\":{\"title\":\"$:/config/ShortcutInfo/input-accept\",\"text\":\"{{$:/language/Shortcuts/Input/Accept/Hint}}\"},\"$:/config/ShortcutInfo/input-accept-variant\":{\"title\":\"$:/config/ShortcutInfo/input-accept-variant\",\"text\":\"{{$:/language/Shortcuts/Input/AcceptVariant/Hint}}\"},\"$:/config/ShortcutInfo/input-cancel\":{\"title\":\"$:/config/ShortcutInfo/input-cancel\",\"text\":\"{{$:/language/Shortcuts/Input/Cancel/Hint}}\"},\"$:/config/ShortcutInfo/input-down\":{\"title\":\"$:/config/ShortcutInfo/input-down\",\"text\":\"{{$:/language/Shortcuts/Input/Down/Hint}}\"},\"$:/config/ShortcutInfo/input-tab-left\":{\"title\":\"$:/config/ShortcutInfo/input-tab-left\",\"text\":\"{{$:/language/Shortcuts/Input/Tab-Left/Hint}}\"},\"$:/config/ShortcutInfo/input-tab-right\":{\"title\":\"$:/config/ShortcutInfo/input-tab-right\",\"text\":\"{{$:/language/Shortcuts/Input/Tab-Right/Hint}}\"},\"$:/config/ShortcutInfo/input-up\":{\"title\":\"$:/config/ShortcutInfo/input-up\",\"text\":\"{{$:/language/Shortcuts/Input/Up/Hint}}\"},\"$:/config/ShortcutInfo/italic\":{\"title\":\"$:/config/ShortcutInfo/italic\",\"text\":\"{{$:/language/Buttons/Italic/Hint}}\"},\"$:/config/ShortcutInfo/layout-switcher\":{\"title\":\"$:/config/ShortcutInfo/layout-switcher\",\"text\":\"{{$:/language/LayoutSwitcher/Description}}\"},\"$:/config/ShortcutInfo/link\":{\"title\":\"$:/config/ShortcutInfo/link\",\"text\":\"{{$:/language/Buttons/Link/Hint}}\"},\"$:/config/ShortcutInfo/linkify\":{\"title\":\"$:/config/ShortcutInfo/linkify\",\"text\":\"{{$:/language/Buttons/Linkify/Hint}}\"},\"$:/config/ShortcutInfo/list-bullet\":{\"title\":\"$:/config/ShortcutInfo/list-bullet\",\"text\":\"{{$:/language/Buttons/ListBullet/Hint}}\"},\"$:/config/ShortcutInfo/list-number\":{\"title\":\"$:/config/ShortcutInfo/list-number\",\"text\":\"{{$:/language/Buttons/ListNumber/Hint}}\"},\"$:/config/ShortcutInfo/mono-block\":{\"title\":\"$:/config/ShortcutInfo/mono-block\",\"text\":\"{{$:/language/Buttons/MonoBlock/Hint}}\"},\"$:/config/ShortcutInfo/mono-line\":{\"title\":\"$:/config/ShortcutInfo/mono-line\",\"text\":\"{{$:/language/Buttons/MonoLine/Hint}}\"},\"$:/config/ShortcutInfo/new-image\":{\"title\":\"$:/config/ShortcutInfo/new-image\",\"text\":\"{{$:/language/Buttons/NewImage/Hint}}\"},\"$:/config/ShortcutInfo/new-journal\":{\"title\":\"$:/config/ShortcutInfo/new-journal\",\"text\":\"{{$:/language/Buttons/NewJournal/Hint}}\"},\"$:/config/ShortcutInfo/new-tiddler\":{\"title\":\"$:/config/ShortcutInfo/new-tiddler\",\"text\":\"{{$:/language/Buttons/NewTiddler/Hint}}\"},\"$:/config/ShortcutInfo/picture\":{\"title\":\"$:/config/ShortcutInfo/picture\",\"text\":\"{{$:/language/Buttons/Picture/Hint}}\"},\"$:/config/ShortcutInfo/preview\":{\"title\":\"$:/config/ShortcutInfo/preview\",\"text\":\"{{$:/language/Buttons/Preview/Hint}}\"},\"$:/config/ShortcutInfo/quote\":{\"title\":\"$:/config/ShortcutInfo/quote\",\"text\":\"{{$:/language/Buttons/Quote/Hint}}\"},\"$:/config/ShortcutInfo/save-tiddler\":{\"title\":\"$:/config/ShortcutInfo/save-tiddler\",\"text\":\"{{$:/language/Buttons/Save/Hint}}\"},\"$:/config/ShortcutInfo/save-wiki\":{\"title\":\"$:/config/ShortcutInfo/save-wiki\",\"text\":\"{{$:/language/Buttons/SaveWiki/Hint}}\"},\"$:/config/ShortcutInfo/sidebar-search\":{\"title\":\"$:/config/ShortcutInfo/sidebar-search\",\"text\":\"{{$:/language/Buttons/SidebarSearch/Hint}}\"},\"$:/config/ShortcutInfo/stamp\":{\"title\":\"$:/config/ShortcutInfo/stamp\",\"text\":\"{{$:/language/Buttons/Stamp/Hint}}\"},\"$:/config/ShortcutInfo/strikethrough\":{\"title\":\"$:/config/ShortcutInfo/strikethrough\",\"text\":\"{{$:/language/Buttons/Strikethrough/Hint}}\"},\"$:/config/ShortcutInfo/subscript\":{\"title\":\"$:/config/ShortcutInfo/subscript\",\"text\":\"{{$:/language/Buttons/Subscript/Hint}}\"},\"$:/config/ShortcutInfo/superscript\":{\"title\":\"$:/config/ShortcutInfo/superscript\",\"text\":\"{{$:/language/Buttons/Superscript/Hint}}\"},\"$:/config/ShortcutInfo/toggle-sidebar\":{\"title\":\"$:/config/ShortcutInfo/toggle-sidebar\",\"text\":\"{{$:/language/Buttons/ToggleSidebar/Hint}}\"},\"$:/config/ShortcutInfo/transcludify\":{\"title\":\"$:/config/ShortcutInfo/transcludify\",\"text\":\"{{$:/language/Buttons/Transcludify/Hint}}\"},\"$:/config/ShortcutInfo/underline\":{\"title\":\"$:/config/ShortcutInfo/underline\",\"text\":\"{{$:/language/Buttons/Underline/Hint}}\"},\"$:/config/StoryTiddlerTemplateFilters/draft\":{\"title\":\"$:/config/StoryTiddlerTemplateFilters/draft\",\"tags\":\"$:/tags/StoryTiddlerTemplateFilter\",\"text\":\"[is[draft]then{$:/config/ui/EditTemplate}]\"},\"$:/config/StoryTiddlerTemplateFilters/default\":{\"title\":\"$:/config/StoryTiddlerTemplateFilters/default\",\"tags\":\"$:/tags/StoryTiddlerTemplateFilter\",\"text\":\"[{$:/config/ui/ViewTemplate}]\"},\"$:/config/SwitcherTargets/layout\":{\"title\":\"$:/config/SwitcherTargets/layout\",\"text\":\"$:/snippets/LayoutSwitcher\"},\"$:/config/SwitcherTargets/language\":{\"title\":\"$:/config/SwitcherTargets/language\",\"text\":\"$:/snippets/languageswitcher\"},\"$:/config/SwitcherTargets/palette\":{\"title\":\"$:/config/SwitcherTargets/palette\",\"text\":\"$:/core/ui/ControlPanel/Palette\"},\"$:/config/SwitcherTargets/theme\":{\"title\":\"$:/config/SwitcherTargets/theme\",\"text\":\"$:/core/ui/ControlPanel/Theme\"},\"$:/config/SyncFilter\":{\"title\":\"$:/config/SyncFilter\",\"text\":\"[is[tiddler]] -[[$:/core]] -[[$:/library/sjcl.js]] -[prefix[$:/boot/]] -[prefix[$:/HistoryList]] -[status[pending]plugin-type[import]] -[[$:/isEncrypted]] -[prefix[$:/status/]] -[prefix[$:/state/]] -[prefix[$:/temp/]]\\n\"},\"$:/config/SyncSystemTiddlersFromServer\":{\"title\":\"$:/config/SyncSystemTiddlersFromServer\",\"text\":\"no\"},\"$:/config/Tags/MinLength\":{\"title\":\"$:/config/Tags/MinLength\",\"text\":\"0\"},\"$:/config/TextEditor/EditorHeight/Height\":{\"title\":\"$:/config/TextEditor/EditorHeight/Height\",\"text\":\"400px\"},\"$:/config/TextEditor/EditorHeight/Mode\":{\"title\":\"$:/config/TextEditor/EditorHeight/Mode\",\"text\":\"auto\"},\"$:/config/TiddlerColourFilters/color-field\":{\"title\":\"$:/config/TiddlerColourFilters/color-field\",\"tags\":\"$:/tags/TiddlerColourFilter\",\"text\":\"[has[color]then{!!color}]\"},\"$:/config/TiddlerColourFilters/default\":{\"title\":\"$:/config/TiddlerColourFilters/default\",\"tags\":\"$:/tags/TiddlerColourFilter\",\"text\":\"[[$:/config/DefaultTiddlerColour]has[text]get[text]trim[]]\"},\"$:/config/TiddlerIconFilters/icon-field\":{\"title\":\"$:/config/TiddlerIconFilters/icon-field\",\"tags\":\"$:/tags/TiddlerIconFilter\",\"text\":\"[has[icon]then{!!icon}]\"},\"$:/config/TiddlerIconFilters/default\":{\"title\":\"$:/config/TiddlerIconFilters/default\",\"tags\":\"$:/tags/TiddlerIconFilter\",\"text\":\"[{$:/config/DefaultTiddlerIcon}has[text]]\"},\"$:/config/TiddlerInfo/Default\":{\"title\":\"$:/config/TiddlerInfo/Default\",\"text\":\"$:/core/ui/TiddlerInfo/Fields\"},\"$:/config/TiddlerInfo/Mode\":{\"title\":\"$:/config/TiddlerInfo/Mode\",\"text\":\"popup\"},\"$:/config/Tiddlers/TitleLinks\":{\"title\":\"$:/config/Tiddlers/TitleLinks\",\"text\":\"no\"},\"$:/config/Toolbar/ButtonClass\":{\"title\":\"$:/config/Toolbar/ButtonClass\",\"text\":\"tc-btn-invisible\"},\"$:/config/Toolbar/Icons\":{\"title\":\"$:/config/Toolbar/Icons\",\"text\":\"yes\"},\"$:/config/Toolbar/Text\":{\"title\":\"$:/config/Toolbar/Text\",\"text\":\"no\"},\"$:/config/ViewTemplateBodyFilters/stylesheet\":{\"title\":\"$:/config/ViewTemplateBodyFilters/stylesheet\",\"tags\":\"$:/tags/ViewTemplateBodyFilter\",\"text\":\"[tag[$:/tags/Stylesheet]then[$:/core/ui/ViewTemplate/body/rendered-plain-text]]\"},\"$:/config/ViewTemplateBodyFilters/core-ui-tags\":{\"title\":\"$:/config/ViewTemplateBodyFilters/core-ui-tags\",\"tags\":\"$:/tags/ViewTemplateBodyFilter\",\"text\":\"[tag[$:/tags/PageTemplate]] [tag[$:/tags/EditTemplate]] [tag[$:/tags/ViewTemplate]] [tag[$:/tags/KeyboardShortcut]] [tag[$:/tags/ImportPreview]] [tag[$:/tags/EditPreview]][tag[$:/tags/EditorToolbar]] [tag[$:/tags/Actions]] :then[[$:/core/ui/ViewTemplate/body/code]]\"},\"$:/config/ViewTemplateBodyFilters/system\":{\"title\":\"$:/config/ViewTemplateBodyFilters/system\",\"tags\":\"$:/tags/ViewTemplateBodyFilter\",\"text\":\"[prefix[$:/boot/]] [prefix[$:/config/]] [prefix[$:/core/macros]] [prefix[$:/core/save/]] [prefix[$:/core/templates/]]  [prefix[$:/info/]] [prefix[$:/language/]] [prefix[$:/languages/]] [prefix[$:/snippets/]] [prefix[$:/state/]] [prefix[$:/status/]] [prefix[$:/info/]] [prefix[$:/temp/]] +[!is[image]limit[1]then[$:/core/ui/ViewTemplate/body/code]]\"},\"$:/config/ViewTemplateBodyFilters/code-body\":{\"title\":\"$:/config/ViewTemplateBodyFilters/code-body\",\"tags\":\"$:/tags/ViewTemplateBodyFilter\",\"text\":\"[field:code-body[yes]then[$:/core/ui/ViewTemplate/body/code]]\"},\"$:/config/ViewTemplateBodyFilters/import\":{\"title\":\"$:/config/ViewTemplateBodyFilters/import\",\"tags\":\"$:/tags/ViewTemplateBodyFilter\",\"text\":\"[field:plugin-type[import]then[$:/core/ui/ViewTemplate/body/import]]\"},\"$:/config/ViewTemplateBodyFilters/plugin\":{\"title\":\"$:/config/ViewTemplateBodyFilters/plugin\",\"tags\":\"$:/tags/ViewTemplateBodyFilter\",\"text\":\"[has[plugin-type]then[$:/core/ui/ViewTemplate/body/plugin]]\"},\"$:/config/ViewTemplateBodyFilters/hide-body\":{\"title\":\"$:/config/ViewTemplateBodyFilters/hide-body\",\"tags\":\"$:/tags/ViewTemplateBodyFilter\",\"text\":\"[field:hide-body[yes]then[$:/core/ui/ViewTemplate/body/blank]]\"},\"$:/config/ViewTemplateBodyFilters/default\":{\"title\":\"$:/config/ViewTemplateBodyFilters/default\",\"tags\":\"$:/tags/ViewTemplateBodyFilter\",\"text\":\"[[$:/core/ui/ViewTemplate/body/default]]\"},\"$:/config/ViewTemplateTitleFilters/system\":{\"title\":\"$:/config/ViewTemplateTitleFilters/system\",\"tags\":\"$:/tags/ViewTemplateTitleFilter\",\"text\":\"[prefix[$:/]then[$:/core/ui/ViewTemplate/title/system]]\"},\"$:/config/ViewTemplateTitleFilters/default\":{\"title\":\"$:/config/ViewTemplateTitleFilters/default\",\"tags\":\"$:/tags/ViewTemplateTitleFilter\",\"text\":\"[[$:/core/ui/ViewTemplate/title/default]]\"},\"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/clone\":{\"title\":\"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/clone\",\"text\":\"hide\"},\"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/close-others\":{\"title\":\"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/close-others\",\"text\":\"hide\"},\"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/export-tiddler\":{\"title\":\"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/export-tiddler\",\"text\":\"hide\"},\"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/info\":{\"title\":\"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/info\",\"text\":\"hide\"},\"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/more-tiddler-actions\":{\"title\":\"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/more-tiddler-actions\",\"text\":\"show\"},\"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-here\":{\"title\":\"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-here\",\"text\":\"hide\"},\"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-journal-here\":{\"title\":\"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-journal-here\",\"text\":\"hide\"},\"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/open-window\":{\"title\":\"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/open-window\",\"text\":\"hide\"},\"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permalink\":{\"title\":\"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permalink\",\"text\":\"hide\"},\"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permaview\":{\"title\":\"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permaview\",\"text\":\"hide\"},\"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/delete\":{\"title\":\"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/delete\",\"text\":\"hide\"},\"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold\":{\"title\":\"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold\",\"text\":\"hide\"},\"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-bar\":{\"title\":\"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-bar\",\"text\":\"hide\"},\"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-others\":{\"title\":\"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-others\",\"text\":\"hide\"},\"$:/config/shortcuts-mac/bold\":{\"title\":\"$:/config/shortcuts-mac/bold\",\"text\":\"meta-B\"},\"$:/config/shortcuts-mac/italic\":{\"title\":\"$:/config/shortcuts-mac/italic\",\"text\":\"meta-I\"},\"$:/config/shortcuts-mac/underline\":{\"title\":\"$:/config/shortcuts-mac/underline\",\"text\":\"meta-U\"},\"$:/config/shortcuts-mac/new-image\":{\"title\":\"$:/config/shortcuts-mac/new-image\",\"text\":\"ctrl-I\"},\"$:/config/shortcuts-mac/new-journal\":{\"title\":\"$:/config/shortcuts-mac/new-journal\",\"text\":\"ctrl-J\"},\"$:/config/shortcuts-mac/new-tiddler\":{\"title\":\"$:/config/shortcuts-mac/new-tiddler\",\"text\":\"ctrl-N\"},\"$:/config/shortcuts-mac/save-wiki\":{\"title\":\"$:/config/shortcuts-mac/save-wiki\",\"text\":\"meta-S\"},\"$:/config/shortcuts-not-mac/bold\":{\"title\":\"$:/config/shortcuts-not-mac/bold\",\"text\":\"ctrl-B\"},\"$:/config/shortcuts-not-mac/italic\":{\"title\":\"$:/config/shortcuts-not-mac/italic\",\"text\":\"ctrl-I\"},\"$:/config/shortcuts-not-mac/underline\":{\"title\":\"$:/config/shortcuts-not-mac/underline\",\"text\":\"ctrl-U\"},\"$:/config/shortcuts-not-mac/new-image\":{\"title\":\"$:/config/shortcuts-not-mac/new-image\",\"text\":\"alt-I\"},\"$:/config/shortcuts-not-mac/new-journal\":{\"title\":\"$:/config/shortcuts-not-mac/new-journal\",\"text\":\"alt-J\"},\"$:/config/shortcuts-not-mac/new-tiddler\":{\"title\":\"$:/config/shortcuts-not-mac/new-tiddler\",\"text\":\"alt-N\"},\"$:/config/shortcuts/add-field\":{\"title\":\"$:/config/shortcuts/add-field\",\"text\":\"enter\"},\"$:/config/shortcuts/advanced-search\":{\"title\":\"$:/config/shortcuts/advanced-search\",\"text\":\"ctrl-shift-A\"},\"$:/config/shortcuts/advanced-search-sidebar\":{\"title\":\"$:/config/shortcuts/advanced-search-sidebar\",\"text\":\"alt-Enter\"},\"$:/config/shortcuts/cancel-edit-tiddler\":{\"title\":\"$:/config/shortcuts/cancel-edit-tiddler\",\"text\":\"escape\"},\"$:/config/shortcuts/change-sidebar-layout\":{\"title\":\"$:/config/shortcuts/change-sidebar-layout\",\"text\":\"shift-alt-Down\"},\"$:/config/shortcuts/delete-field\":{\"title\":\"$:/config/shortcuts/delete-field\",\"text\":\"shift-alt-D\"},\"$:/config/shortcuts/excise\":{\"title\":\"$:/config/shortcuts/excise\",\"text\":\"ctrl-E\"},\"$:/config/shortcuts/sidebar-search\":{\"title\":\"$:/config/shortcuts/sidebar-search\",\"text\":\"ctrl-shift-F\"},\"$:/config/shortcuts/heading-1\":{\"title\":\"$:/config/shortcuts/heading-1\",\"text\":\"ctrl-1\"},\"$:/config/shortcuts/heading-2\":{\"title\":\"$:/config/shortcuts/heading-2\",\"text\":\"ctrl-2\"},\"$:/config/shortcuts/heading-3\":{\"title\":\"$:/config/shortcuts/heading-3\",\"text\":\"ctrl-3\"}
2731,\"$:/config/shortcuts/heading-4\":{\"title\":\"$:/config/shortcuts/heading-4\",\"text\":\"ctrl-4\"},\"$:/config/shortcuts/heading-5\":{\"title\":\"$:/config/shortcuts/heading-5\",\"text\":\"ctrl-5\"},\"$:/config/shortcuts/heading-6\":{\"title\":\"$:/config/shortcuts/heading-6\",\"text\":\"ctrl-6\"},\"$:/config/shortcuts/input-accept\":{\"title\":\"$:/config/shortcuts/input-accept\",\"text\":\"Enter\"},\"$:/config/shortcuts/input-accept-variant\":{\"title\":\"$:/config/shortcuts/input-accept-variant\",\"text\":\"ctrl-Enter\"},\"$:/config/shortcuts/input-cancel\":{\"title\":\"$:/config/shortcuts/input-cancel\",\"text\":\"Escape\"},\"$:/config/shortcuts/input-down\":{\"title\":\"$:/config/shortcuts/input-down\",\"text\":\"Down\"},\"$:/config/shortcuts/input-tab-left\":{\"title\":\"$:/config/shortcuts/input-tab-left\",\"text\":\"alt-ctrl-Left\"},\"$:/config/shortcuts/input-tab-right\":{\"title\":\"$:/config/shortcuts/input-tab-right\",\"text\":\"alt-ctrl-Right\"},\"$:/config/shortcuts/input-up\":{\"title\":\"$:/config/shortcuts/input-up\",\"text\":\"Up\"},\"$:/config/shortcuts/layout-switcher\":{\"title\":\"$:/config/shortcuts/layout-switcher\",\"text\":\"ctrl-shift-L\"},\"$:/config/shortcuts/link\":{\"title\":\"$:/config/shortcuts/link\",\"text\":\"ctrl-L\"},\"$:/config/shortcuts/linkify\":{\"title\":\"$:/config/shortcuts/linkify\",\"text\":\"alt-shift-L\"},\"$:/config/shortcuts/list-bullet\":{\"title\":\"$:/config/shortcuts/list-bullet\",\"text\":\"ctrl-shift-L\"},\"$:/config/shortcuts/list-number\":{\"title\":\"$:/config/shortcuts/list-number\",\"text\":\"ctrl-shift-N\"},\"$:/config/shortcuts/mono-block\":{\"title\":\"$:/config/shortcuts/mono-block\",\"text\":\"ctrl-shift-M\"},\"$:/config/shortcuts/mono-line\":{\"title\":\"$:/config/shortcuts/mono-line\",\"text\":\"ctrl-M\"},\"$:/config/shortcuts/picture\":{\"title\":\"$:/config/shortcuts/picture\",\"text\":\"ctrl-shift-I\"},\"$:/config/shortcuts/preview\":{\"title\":\"$:/config/shortcuts/preview\",\"text\":\"alt-P\"},\"$:/config/shortcuts/quote\":{\"title\":\"$:/config/shortcuts/quote\",\"text\":\"ctrl-Q\"},\"$:/config/shortcuts/save-tiddler\":{\"title\":\"$:/config/shortcuts/save-tiddler\",\"text\":\"ctrl+enter\"},\"$:/config/shortcuts/save-wiki\":{\"title\":\"$:/config/shortcuts/save-wiki\",\"text\":\"ctrl-S\"},\"$:/config/shortcuts/stamp\":{\"title\":\"$:/config/shortcuts/stamp\",\"text\":\"ctrl-S\"},\"$:/config/shortcuts/strikethrough\":{\"title\":\"$:/config/shortcuts/strikethrough\",\"text\":\"ctrl-T\"},\"$:/config/shortcuts/subscript\":{\"title\":\"$:/config/shortcuts/subscript\",\"text\":\"ctrl-shift-B\"},\"$:/config/shortcuts/superscript\":{\"title\":\"$:/config/shortcuts/superscript\",\"text\":\"ctrl-shift-P\"},\"$:/config/shortcuts/toggle-sidebar\":{\"title\":\"$:/config/shortcuts/toggle-sidebar\",\"text\":\"alt-shift-S\"},\"$:/config/shortcuts/transcludify\":{\"title\":\"$:/config/shortcuts/transcludify\",\"text\":\"alt-shift-T\"},\"$:/config/ui/EditTemplate\":{\"title\":\"$:/config/ui/EditTemplate\",\"text\":\"$:/core/ui/EditTemplate\"},\"$:/config/ui/ViewTemplate\":{\"title\":\"$:/config/ui/ViewTemplate\",\"text\":\"$:/core/ui/ViewTemplate\"},\"$:/config/WikiParserRules/Inline/wikilink\":{\"title\":\"$:/config/WikiParserRules/Inline/wikilink\",\"text\":\"disable\"},\"$:/snippets/currpalettepreview\":{\"title\":\"$:/snippets/currpalettepreview\",\"text\":\"\\\\define resolve-colour(macrocall)\\n\\\\import $:/core/macros/utils\\n\\\\whitespace trim\\n\u003C$wikify name=\\\"name\\\" text=\\\"\\\"\\\"$macrocall$\\\"\\\"\\\">\\n\u003C\u003Cname>>\\n\u003C/$wikify>\\n\\\\end\\n\\\\define swatchStyle()\\nbackground-color: $(swatchColour)$;\\n\\\\end\\n\\\\define swatch-inner()\\n\\\\whitespace trim\\n\u003C$set name=\\\"swatchColour\\\" value={{##$(colourResolved)$}}>\\n\u003C$list filter=\\\"[\u003CswatchColour>!prefix[\u003C\u003Ccolour ]!suffix[>>]]\\\" variable=\\\"ignore\\\">\\n\u003Cdiv class=\\\"tc-swatch\\\" style=\u003C\u003CswatchStyle>> title=\u003C\u003CswatchTitle>>/>\\n&#32;\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003CswatchColour>prefix[\u003C\u003Ccolour ]suffix[>>]]\\\" variable=\\\"ignore\\\">\\n\u003C$wikify name=\\\"colourResolved\\\" text=\\\"\u003C$macrocall $name='resolve-colour' macrocall=\u003C\u003CswatchColour>>/>\\\">\\n\u003C\u003Cswatch-inner>>\\n\u003C/$wikify>\\n\u003C/$list>\\n\u003C/$set>\\n\\\\end\\n\\\\define swatch()\\n\\\\whitespace trim\\n\u003C$set name=\\\"swatchColour\\\" value={{##$(colour)$}}>\\n\u003C$set name=\\\"swatchTitle\\\" value=\u003C\u003Ccolour>>>\\n\u003C$list filter=\\\"[\u003CswatchColour>!prefix[\u003C\u003Ccolour ]!suffix[>>]]\\\" variable=\\\"ignore\\\">\\n\u003Cdiv class=\\\"tc-swatch\\\" style=\u003C\u003CswatchStyle>> title=\u003C\u003CswatchTitle>>/>\\n&#32;\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003CswatchColour>prefix[\u003C\u003Ccolour ]suffix[>>]]\\\" variable=\\\"ignore\\\">\\n\u003C$wikify name=\\\"colourResolved\\\" text=\\\"\u003C$macrocall $name='resolve-colour' macrocall=\u003C\u003CswatchColour>>/>\\\">\\n\u003C\u003Cswatch-inner>>\\n\u003C/$wikify>\\n\u003C/$list>\\n\u003C/$set>\\n\u003C/$set>\\n\\\\end\\n\\\\whitespace trim\\n\u003Cdiv class=\\\"tc-swatches-horiz\\\">
2731\u003C$list filter=\\\"\\nforeground\\nbackground\\nmuted-foreground\\nprimary\\npage-background\\ntab-background\\ntiddler-info-background\\n\\\" variable=\\\"colour\\\">\u003C\u003Cswatch>>\u003C/$list>\u003C/div>\\n\"},\"$:/snippets/DebugStylesheets\":{\"title\":\"$:/snippets/DebugStylesheets\",\"text\":\"\\\\whitespace trim\\n\u003Cstyle>[test]{list-style:'❌'}\u003C/style>\\n\u003Cul>\\n\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/Stylesheet]has[modified]]\\\" counter=\\\"n\\\">\\n\u003Cstyle>{{!!text}}[test=\\\"\u003C\u003Cn>>\\\"]{list-style:disc;}\u003C/style>\\n\u003Cli test=\u003C\u003Cn>>>\u003C$link/>\u003C/li>\\n\u003C/$list>\\n\u003C/ul>\\n\"},\"$:/snippets/download-wiki-button\":{\"title\":\"$:/snippets/download-wiki-button\",\"text\":\"\\\\define lingo-base() $:/language/ControlPanel/Tools/Download/\\n\\\\whitespace trim\\n\u003C$button class=\\\"tc-btn-big-green\\\">\\n\u003C$action-sendmessage $message=\\\"tm-download-file\\\" $param=\\\"$:/core/save/all\\\" filename=\\\"index.html\\\"/>\\n\u003C\u003Clingo Full/Caption>>&#32;{{$:/core/images/save-button-dynamic}}\\n\u003C/$button>\"},\"$:/language\":{\"title\":\"$:/language\",\"text\":\"$:/languages/en-GB\"},\"$:/snippets/languageswitcher\":{\"title\":\"$:/snippets/languageswitcher\",\"text\":\"\\\\define flag-title()\\n$(languagePluginTitle)$/icon\\n\\\\end\\n\\\\whitespace trim\\n\\n\u003C$linkcatcher to=\\\"$:/language\\\">\\n\u003Cdiv class=\\\"tc-chooser tc-language-chooser\\\">\\n\u003C$list filter=\\\"[[$:/languages/en-GB]] [plugin-type[language]sort[description]]\\\">\\n\u003C$set name=\\\"cls\\\" filter=\\\"[all[current]field:title{$:/language}]\\\" value=\\\"tc-chooser-item tc-chosen\\\" emptyValue=\\\"tc-chooser-item\\\">\u003Cdiv class=\u003C\u003Ccls>>>\\n\u003C$link>\\n\u003Cspan class=\\\"tc-image-button\\\">\\n\u003C$set name=\\\"languagePluginTitle\\\" value=\u003C\u003CcurrentTiddler>>>\\n\u003C$transclude subtiddler=\u003C\u003Cflag-title>>>\\n\u003C$list filter=\\\"[all[current]field:title[$:/languages/en-GB]]\\\">\\n\u003C$transclude tiddler=\\\"$:/languages/en-GB/icon\\\"/>\\n\u003C/$list>\\n\u003C/$transclude>\\n\u003C/$set>\\n\u003C/span>\\n&#32;\\n\u003C$view field=\\\"description\\\">\\n\u003C$view field=\\\"name\\\">\\n\u003C$view field=\\\"title\\\"/>\\n\u003C/$view>\\n\u003C/$view>\\n\u003C/$link>\\n\u003C/div>\\n\u003C/$set>\\n\u003C/$list>\\n\u003C/div>\\n\u003C/$linkcatcher>\"},\"$:/core/macros/CSS\":{\"title\":\"$:/core/macros/CSS\",\"tags\":\"$:/tags/Macro\",\"text\":\"\\\\define colour(name)\\n\u003C$transclude tiddler={{$:/palette}} index=\\\"$name$\\\">\u003C$transclude tiddler=\\\"$:/palettes/Vanilla\\\" index=\\\"$name$\\\">\u003C$transclude tiddler=\\\"$:/config/DefaultColourMappings/$name$\\\"/>\u003C/$transclude>\u003C/$transclude>\\n\\\\end\\n\\n\\\\define color(name)\\n\u003C\u003Ccolour $name$>>\\n\\\\end\\n\\n\\\\define box-shadow(shadow)\\n``\\n  -webkit-box-shadow: $shadow$;\\n     -moz-box-shadow: $shadow$;\\n          box-shadow: $shadow$;\\n``\\n\\\\end\\n\\n\\\\define filter(filter)\\n``\\n  -webkit-filter: $filter$;\\n     -moz-filter: $filter$;\\n          filter: $filter$;\\n``\\n\\\\end\\n\\n\\\\define transition(transition)\\n``\\n  -webkit-transition: $transition$;\\n     -moz-transition: $transition$;\\n          transition: $transition$;\\n``\\n\\\\end\\n\\n\\\\define transform-origin(origin)\\n``\\n  -webkit-transform-origin: $origin$;\\n     -moz-transform-origin: $origin$;\\n          transform-origin: $origin$;\\n``\\n\\\\end\\n\\n\\\\define background-linear-gradient(gradient)\\n``\\nbackground-image: linear-gradient($gradient$);\\nbackground-image: -o-linear-gradient($gradient$);\\nbackground-image: -moz-linear-gradient($gradient$);\\nbackground-image: -webkit-linear-gradient($gradient$);\\nbackground-image: -ms-linear-gradient($gradient$);\\n``\\n\\\\end\\n\\n\\\\define column-count(columns)\\n``\\n-moz-column-count: $columns$;\\n-webkit-column-count: $columns$;\\ncolumn-count: $columns$;\\n``\\n\\\\end\\n\\n\\\\define datauri(title)\\n\u003C$macrocall $name=\\\"makedatauri\\\" type={{$title$!!type}} text={{$title$}} _canonical_uri={{$title$!!_canonical_uri}}/>
2731\\n\\\\end\\n\\n\\\\define if-sidebar(text)\\n\u003C$reveal state=\\\"$:/state/sidebar\\\" type=\\\"match\\\" text=\\\"yes\\\" default=\\\"yes\\\">$text$\u003C/$reveal>\\n\\\\end\\n\\n\\\\define if-no-sidebar(text)\\n\u003C$reveal state=\\\"$:/state/sidebar\\\" type=\\\"nomatch\\\" text=\\\"yes\\\" default=\\\"yes\\\">$text$\u003C/$reveal>\\n\\\\end\\n\\n\\\\define if-background-attachment(text)\\n\u003C$reveal state=\\\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\\\" type=\\\"nomatch\\\" text=\\\"\\\">$text$\u003C/$reveal>\\n\\\\end\\n\"},\"$:/core/macros/colour-picker\":{\"title\":\"$:/core/macros/colour-picker\",\"tags\":\"$:/tags/Macro\",\"text\":\"\\\\define colour-picker-update-recent()\\n\u003C$action-listops\\n\\t$tiddler=\\\"$:/config/ColourPicker/Recent\\\"\\n\\t$subfilter=\\\"$(colour-picker-value)$ [list[$:/config/ColourPicker/Recent]remove[$(colour-picker-value)$]] +[limit[8]]\\\"\\n/>\\n\\\\end\\n\\n\\\\define colour-picker-inner(actions)\\n\u003C$button tag=\\\"a\\\" tooltip=\\\"\\\"\\\"$(colour-picker-value)$\\\"\\\"\\\">\\n\\n$(colour-picker-update-recent)$\\n\\n$actions$\\n\\n\u003Cspan style=\\\"display:inline-block; background-color: $(colour-picker-value)$; width: 100%; height: 100%; border-radius: 50%;\\\"/>\\n\\n\u003C/$button>\\n\\\\end\\n\\n\\\\define colour-picker-recent-inner(actions)\\n\\\\whitespace trim\\n\u003C$set name=\\\"colour-picker-value\\\" value=\\\"$(recentColour)$\\\">\\n\u003C$macrocall $name=\\\"colour-picker-inner\\\" actions=\\\"\\\"\\\"$actions$\\\"\\\"\\\"/>\\n\u003C/$set>\\n\\\\end\\n\\n\\\\define colour-picker-recent(actions)\\n\\\\whitespace trim\\n{{$:/language/ColourPicker/Recent}}\u003C$list filter=\\\"[list[$:/config/ColourPicker/Recent]]\\\" variable=\\\"recentColour\\\">\\n&#32;\\n\u003C$macrocall $name=\\\"colour-picker-recent-inner\\\" actions=\\\"\\\"\\\"$actions$\\\"\\\"\\\"/>\\n\u003C/$list>\\n\\\\end\\n\\n\\\\define colour-picker(actions)\\n\\\\whitespace trim\\n\u003Cdiv class=\\\"tc-colour-chooser\\\">\\n\\n\u003C$macrocall $name=\\\"colour-picker-recent\\\" actions=\\\"\\\"\\\"$actions$\\\"\\\"\\\"/>\\n\\n---\\n\\n\u003C$list filter=\\\"LightPink Pink Crimson LavenderBlush PaleVioletRed HotPink DeepPink MediumVioletRed Orchid Thistle Plum Violet Magenta Fuchsia DarkMagenta Purple MediumOrchid DarkViolet DarkOrchid Indigo BlueViolet MediumPurple MediumSlateBlue SlateBlue DarkSlateBlue Lavender GhostWhite Blue MediumBlue MidnightBlue DarkBlue Navy RoyalBlue CornflowerBlue LightSteelBlue LightSlateGrey SlateGrey DodgerBlue AliceBlue SteelBlue LightSkyBlue SkyBlue DeepSkyBlue LightBlue PowderBlue CadetBlue Azure LightCyan PaleTurquoise Cyan Aqua DarkTurquoise DarkSlateGrey DarkCyan Teal MediumTurquoise LightSeaGreen Turquoise Aquamarine MediumAquamarine MediumSpringGreen MintCream SpringGreen MediumSeaGreen SeaGreen Honeydew LightGreen PaleGreen DarkSeaGreen LimeGreen Lime ForestGreen Green DarkGreen Chartreuse LawnGreen GreenYellow DarkOliveGreen YellowGreen OliveDrab Beige LightGoldenrodYellow Ivory LightYellow Yellow Olive DarkKhaki LemonChiffon PaleGoldenrod Khaki Gold Cornsilk Goldenrod DarkGoldenrod FloralWhite OldLace Wheat Moccasin Orange PapayaWhip BlanchedAlmond NavajoWhite AntiqueWhite Tan BurlyWood Bisque DarkOrange Linen Peru PeachPuff SandyBrown Chocolate SaddleBrown Seashell Sienna LightSalmon Coral OrangeRed DarkSalmon Tomato MistyRose Salmon Snow LightCoral RosyBrown IndianRed Red Brown FireBrick DarkRed Maroon White WhiteSmoke Gainsboro LightGrey Silver DarkGrey Grey DimGrey Black\\\" variable=\\\"colour-picker-value\\\">\\n&#32;\\n\u003C$macrocall $name=\\\"colour-picker-inner\\\" actions=\\\"\\\"\\\"$actions$\\\"\\\"\\\"/>\\n\u003C/$list>\\n\\n---\\n\\n\u003C$edit-text tiddler=\\\"$:/config/ColourPicker/New\\\" tag=\\\"input\\\" default=\\\"\\\" placeholder=\\\"\\\"/>\\n&#32;\\n\u003C$edit-text tiddler=\\\"$:/config/ColourPicker/New\\\" type=\\\"color\\\" tag=\\\"input\\\"/>\\n\u003C$set name=\\\"colour-picker-value\\\" value={{$:/config/ColourPicker/New}}>\\n\u003C$macrocall $name=\\\"colour-picker-inner\\\" actions=\\\"\\\"\\\"$actions$\\\"\\\"\\\"/>\\n\u003C/$set>\\n\\n\u003C/div>\\n\\n\\\\end\\n\"}
2731,\"$:/core/macros/copy-to-clipboard\":{\"title\":\"$:/core/macros/copy-to-clipboard\",\"tags\":\"$:/tags/Macro\",\"text\":\"\\\\define copy-to-clipboard(src,class:\\\"tc-btn-invisible\\\",style)\\n\\\\whitespace trim\\n\u003C$button class=\u003C\u003C__class__>> style=\u003C\u003C__style__>> message=\\\"tm-copy-to-clipboard\\\" param=\u003C\u003C__src__>> tooltip={{$:/language/Buttons/CopyToClipboard/Hint}}>\\n{{$:/core/images/copy-clipboard}}\\n&#32;\\n\u003C$text text={{$:/language/Buttons/CopyToClipboard/Caption}}/>\\n\u003C/$button>\\n\\\\end\\n\\n\\\\define copy-to-clipboard-above-right(src,class:\\\"tc-btn-invisible\\\",style)\\n\\\\whitespace trim\\n\u003Cdiv style=\\\"position: relative;\\\">\\n\u003Cdiv style=\\\"position: absolute; bottom: 0; right: 0;\\\">\\n\u003C$macrocall $name=\\\"copy-to-clipboard\\\" src=\u003C\u003C__src__>> class=\u003C\u003C__class__>> style=\u003C\u003C__style__>>/>\\n\u003C/div>\\n\u003C/div>\\n\\\\end\\n\"},\"$:/core/macros/diff\":{\"title\":\"$:/core/macros/diff\",\"tags\":\"$:/tags/Macro\",\"text\":\"\\\\define compareTiddlerText(sourceTiddlerTitle,sourceSubTiddlerTitle,destTiddlerTitle,destSubTiddlerTitle)\\n\\\\whitespace trim\\n\u003C$set name=\\\"source\\\" tiddler=\u003C\u003C__sourceTiddlerTitle__>> subtiddler=\u003C\u003C__sourceSubTiddlerTitle__>>>\\n\u003C$set name=\\\"dest\\\" tiddler=\u003C\u003C__destTiddlerTitle__>> subtiddler=\u003C\u003C__destSubTiddlerTitle__>>>\\n\u003C$diff-text source=\u003C\u003Csource>> dest=\u003C\u003Cdest>>/>\\n\u003C/$set>\\n\u003C/$set>\\n\\\\end\\n\\n\\\\define compareTiddlers(sourceTiddlerTitle,sourceSubTiddlerTitle,destTiddlerTitle,destSubTiddlerTitle,exclude)\\n\\\\whitespace trim\\n\u003Ctable class=\\\"tc-diff-tiddlers\\\">\\n\u003Ctbody>\\n\u003C$set name=\\\"sourceFields\\\" filter=\\\"[\u003C__sourceTiddlerTitle__>fields[]sort[]]\\\">\\n\u003C$set name=\\\"destFields\\\" filter=\\\"[\u003C__destSubTiddlerTitle__>subtiddlerfields\u003C__destTiddlerTitle__>sort[]]\\\">\\n\u003C$list filter=\\\"[enlist\u003CsourceFields>] [enlist\u003CdestFields>] -[enlist\u003C__exclude__>] +[sort[]]\\\" variable=\\\"fieldName\\\">\\n\u003Ctr>\\n\u003Cth>\\n\u003C$text text=\u003C\u003CfieldName>>/>\\n\u003C/th>\\n\u003Ctd>\\n\u003C$set name=\\\"source\\\" tiddler=\u003C\u003C__sourceTiddlerTitle__>> subtiddler=\u003C\u003C__sourceSubTiddlerTitle__>> field=\u003C\u003CfieldName>>>\\n\u003C$set name=\\\"dest\\\" tiddler=\u003C\u003C__destTiddlerTitle__>> subtiddler=\u003C\u003C__destSubTiddlerTitle__>> field=\u003C\u003CfieldName>>>\\n\u003C$diff-text source=\u003C\u003Csource>> dest=\u003C\u003Cdest>>>&#32;\u003C/$diff-text>\\n\u003C/$set>\\n\u003C/$set>\\n\u003C/td>\\n\u003C/tr>\\n\u003C/$list>\\n\u003C/$set>\\n\u003C/$set>\\n\u003C/tbody>\\n\u003C/table>\\n\\\\end\\n\"},\"$:/core/macros/dumpvariables\":{\"title\":\"$:/core/macros/dumpvariables\",\"tags\":\"$:/tags/Macro\",\"text\":\"\\\\define dumpvariables()\\n\\\\whitespace trim\\n\u003Cul>\\n\u003C$list filter=\\\"[variables[]]\\\" variable=\\\"varname\\\">\\n\u003Cli>\\n\u003Cstrong>\u003Ccode>\u003C$text text=\u003C\u003Cvarname>>/>\u003C/code>\u003C/strong>:\u003Cbr/>\\n\u003C$codeblock code={{{ [\u003Cvarname>getvariable[]] }}}/>\\n\u003C/li>\\n\u003C/$list>\\n\u003C/ul>\\n\\\\end\\n\"},\"$:/core/macros/export\":{\"title\":\"$:/core/macros/export\",\"tags\":\"$:/tags/Macro\",\"text\":\"\\\\define exportButtonFilename(baseFilename)\\n$baseFilename$$(extension)$\\n\\\\end\\n\\n\\\\define exportButton(exportFilter:\\\"[!is[system]sort[title]]\\\",lingoBase,baseFilename:\\\"tiddlers\\\")\\n\\\\whitespace trim\\n\u003C$vars hint={{{ [\u003C__lingoBase__>addsuffix[Hint]get[text]] }}} caption={{{  [\u003C__lingoBase__>addsuffix[Caption]get[text]] }}}>\\n\u003Cspan class=\\\"tc-popup-keep\\\">\u003C$button popup=\u003C\u003Cqualify \\\"$:/state/popup/export\\\">> tooltip=\u003C\u003Chint>> aria-label=\u003C\u003Ccaption>> class=\u003C\u003Ctv-config-toolbar-class>> selectedClass=\\\"tc-selected\\\">\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-icons>match[yes]]\\\">\\n{{$:/core/images/export-button}}\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Ctv-config-toolbar-text>match[yes]]\\\">\\n\u003Cspan class=\\\"tc-btn-text\\\">\u003C$text text=\u003C\u003Ccaption>>/>\u003C/span>\\n\u003C/$list>\\n\u003C/$button>\u003C/span>\u003C/$vars>\u003C$reveal state=\u003C\u003Cqualify \\\"$:/state/popup/export\\\">> type=\\\"popup\\\" position=\\\"below\\\" animate=\\\"yes\\\">\\n\u003Cdiv class=\\\"tc-drop-down\\\">\\n\u003C$set name=\\\"count\\\" value={{{ [subfilter\u003C__exportFilter__>count[]] }}}>\\n\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/Exporter]]\\\">\\n\u003C$list filter=\\\"[\u003CcurrentTiddler>has[condition]subfilter{!!condition}limit[1]] ~[\u003CcurrentTiddler>!has[condition]then[true]]\\\" variable=\\\"ignore\\\">\\n\u003C$button class=\\\"tc-btn-invisible\\\">
2731\\n\u003C$action-sendmessage $message=\\\"tm-download-file\\\" $param=\u003C\u003CcurrentTiddler>> exportFilter=\u003C\u003C__exportFilter__>> filename={{{ [\u003C__baseFilename__>addsuffix{!!extension}] }}}/>\\n\u003C$action-deletetiddler $tiddler=\u003C\u003Cqualify \\\"$:/state/popup/export\\\">>/>\\n\u003C$transclude field=\\\"description\\\"/>\\n\u003C/$button>\\n\u003C/$list>\\n\u003C/$list>\\n\u003C/$set>\\n\u003C/div>\\n\u003C/$reveal>\\n\\\\end\\n\"},\"$:/core/macros/image-picker\":{\"title\":\"$:/core/macros/image-picker\",\"created\":\"20170715180840889\",\"modified\":\"20170715180914005\",\"tags\":\"$:/tags/Macro\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\"\\\\define image-picker-thumbnail(actions)\\n\u003C$button tag=\\\"a\\\" tooltip=\\\"\\\"\\\"$(imageTitle)$\\\"\\\"\\\">$actions$\u003C$transclude tiddler=\u003C\u003CimageTitle>>/>\u003C/$button>\\n\\\\end\\n\\n\\\\define image-picker-list(filter,actions)\\n\\\\whitespace trim\\n\u003C$list filter=\\\"\\\"\\\"$filter$\\\"\\\"\\\" variable=\\\"imageTitle\\\">\\n\u003C$macrocall $name=\\\"image-picker-thumbnail\\\" actions=\\\"\\\"\\\"$actions$\\\"\\\"\\\"/>\\n&#32;\\n\u003C/$list>\\n\\\\end\\n\\n\\\\define image-picker(actions,filter:\\\"[all[shadows+tiddlers]is[image]] -[type[application/pdf]] +[!has[draft.of]$subfilter$sort[title]]\\\",subfilter:\\\"\\\")\\n\\\\whitespace trim\\n\u003Cdiv class=\\\"tc-image-chooser\\\">\\n\u003C$vars state-system=\u003C\u003Cqualify \\\"$:/state/image-picker/system\\\">>>\\n\u003C$checkbox tiddler=\u003C\u003Cstate-system>> field=\\\"text\\\" checked=\\\"show\\\" unchecked=\\\"hide\\\" default=\\\"hide\\\">\\n&#32;\\n{{$:/language/SystemTiddlers/Include/Prompt}}\\n\u003C/$checkbox>\\n\u003C$reveal state=\u003C\u003Cstate-system>> type=\\\"match\\\" text=\\\"hide\\\" default=\\\"hide\\\" tag=\\\"div\\\">\\n\u003C$macrocall $name=\\\"image-picker-list\\\" filter=\\\"\\\"\\\"$filter$ +[!is[system]]\\\"\\\"\\\" actions=\\\"\\\"\\\"$actions$\\\"\\\"\\\"/>\\n\u003C/$reveal>\\n\u003C$reveal state=\u003C\u003Cstate-system>> type=\\\"nomatch\\\" text=\\\"hide\\\" default=\\\"hide\\\" tag=\\\"div\\\">\\n\u003C$macrocall $name=\\\"image-picker-list\\\" filter=\\\"\\\"\\\"$filter$\\\"\\\"\\\" actions=\\\"\\\"\\\"$actions$\\\"\\\"\\\"/>\\n\u003C/$reveal>\\n\u003C/$vars>\\n\u003C/div>\\n\\\\end\\n\\n\\\\define image-picker-include-tagged-images(actions)\\n\u003C$macrocall $name=\\\"image-picker\\\" filter=\\\"[all[shadows+tiddlers]is[image]] [all[shadows+tiddlers]tag[$:/tags/Image]] -[type[application/pdf]] +[!has[draft.of]sort[title]]\\\" actions=\\\"\\\"\\\"$actions$\\\"\\\"\\\"/>\\n\\\\end\\n\"},\"$:/core/macros/keyboard-driven-input\":{\"title\":\"$:/core/macros/keyboard-driven-input\",\"tags\":\"$:/tags/Macro\",\"text\":\"\\\\define change-input-tab(stateTitle,tag,beforeafter,defaultState,actions)\\n\\\\whitespace trim\\n\u003C$set name=\\\"tabsList\\\" filter=\\\"[all[shadows+tiddlers]tag\u003C__tag__>!has[draft.of]]\\\">\\n\\t\u003C$let\\n\\t\\tcurrentState={{{ [\u003C__stateTitle__>!is[missing]get[text]] ~[\u003C__defaultState__>] }}}\\n\\t\\tfirstTab={{{ [enlist\u003CtabsList>nth[1]] }}}\\n\\t\\tlastTab={{{ [enlist\u003CtabsList>last[]] }}}\\n\\t\\tnextTab={{{ [all[shadows+tiddlers]tag\u003C__tag__>!has[draft.of]$beforeafter$\u003CcurrentState>] ~[[$beforeafter$]removeprefix[after]suffix[]addprefix\u003CfirstTab>] ~[[$beforeafter$]removeprefix[before]suffix[]addprefix\u003ClastTab>] }}}\\n\\t>\\n\\t\\t\u003C$action-setfield $tiddler=\u003C\u003C__stateTitle__>> text=\u003C\u003CnextTab>>/>\\n\\t\\t$actions$\\n\\t\u003C/$let>\\n\u003C/$set>\\n\\\\end\\n\\n\\\\define keyboard-input-actions()\\n\\\\whitespace trim\\n\u003C$list filter=\\\"[\u003C__index__>match[]]\\\">\\n\\t\u003C$action-setfield $tiddler=\u003C\u003C__storeTitle__>> text={{{ [\u003C__tiddler__>get\u003C__field__>] }}}/>\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003C__index__>!match[]]\\\">\\n\\t\u003C$action-setfield $tiddler=\u003C\u003C__storeTitle__>> text={{{ [\u003C__tiddler__>getindex\u003C__index__>] }}}/>\\n\u003C/$list>\\n\\\\end\\n\\n\\\\define input-next-actions-inner()\\n\\\\whitespace trim\\n\u003C$list filter=\\\"[\u003CnextItem>minlength[1]]\\\" variable=\\\"ignore\\\">\\n\\t\u003C$action-setfield $tiddler=\u003C\u003C__selectionStateTitle__>> text=\u003C\u003CnextItem>>/>\\n\\t\u003C$list filter=\\\"[\u003C__index__>match[]]\\\">\\n\\t\\t\u003C$action-setfield $tiddler=\u003C\u003C__tiddler__>> $field=\u003C\u003C__field__>> $value={{{ [\u003CnextItem>] +[splitregexp[(?:.(?!-))+$]] }}}/>\\n\\t\u003C/$list>\\n\\t\u003C$list filter=\\\"[\u003C__index__>!match[]]\\\">\\n\\t\\t\u003C$action-setfield $tiddler=\u003C\u003C__tiddler__>> $index=\u003C\u003C__index__>> $value={{{ [\u003CnextItem>] +[splitregexp[(?:.(?!-))+$]] }}}/>\\n\\t\u003C/$list>\\n\\t\u003C$action-setfield $tiddler=\u003C\u003C__refreshTitle__>> text=\\\"yes\\\"/>\\n\u003C/$list>
2731\\n\\\\end\\n\\n\\\\define input-next-actions(afterOrBefore:\\\"after\\\",reverse:\\\"\\\")\\n\\\\whitespace trim\\n\u003C$list\\n\\tfilter=\\\"[\u003C__storeTitle__>get[text]minlength\u003C__filterMinLength__>] [\u003C__filterMinLength__>match[0]] +[limit[1]]\\\"\\n\\tvariable=\\\"ignore\\\"\\n>\\n\\t\u003C$let\\n\\t\\tuserInput={{{ [\u003C__storeTitle__>get[text]] }}}\\n\\t\\tselectedItem={{{ [\u003C__selectionStateTitle__>get[text]] }}}\\n\\t\\tconfigTiddler={{{ [subfilter\u003C__configTiddlerFilter__>] }}}\\n\\t\\tprimaryListFilter={{{ [\u003CconfigTiddler>get\u003C__firstSearchFilterField__>] }}}\\n\\t\\tsecondaryListFilter={{{ [\u003CconfigTiddler>get\u003C__secondSearchFilterField__>] }}}\\n\\t>\\n\\t\\t\u003C$set\\n\\t\\t\\tname=\\\"filteredList\\\"\\n\\t\\t\\tfilter=\\\"[subfilter\u003CprimaryListFilter>addsuffix[-primaryList]] =[subfilter\u003CsecondaryListFilter>addsuffix[-secondaryList]]\\\"\\n\\t\\t>\\n\\t\\t\\t\u003C$let\\n\\t\\t\\t\\tnextItem={{{ [enlist\u003CfilteredList>$afterOrBefore$\u003CselectedItem>] ~[enlist\u003CfilteredList>$reverse$nth[1]] }}}\\n\\t\\t\\t\\tfirstItem={{{ [enlist\u003CfilteredList>nth[1]] }}}\\n\\t\\t\\t\\tlastItem={{{ [enlist\u003CfilteredList>last[]] }}}\\n\\t\\t\\t>\\n\\t\\t\\t\\t\u003C$list filter=\\\"[\u003CselectedItem>match\u003CfirstItem>!match\u003ClastItem>]\\\" variable=\\\"ignore\\\">\\n\\t\\t\\t\\t\\t\u003C$set name=\\\"nextItem\\\" value={{{ [[$afterOrBefore$]match[before]then\u003CuserInput>addsuffix[-userInput]] ~[\u003CnextItem>] }}}>\\n\\t\\t\\t\\t\\t\\t\u003C\u003Cinput-next-actions-inner>>\\n\\t\\t\\t\\t\\t\u003C/$set>\\n\\t\\t\\t\\t\u003C/$list>\\n\\t\\t\\t\\t\u003C$list filter=\\\"[\u003CselectedItem>match\u003ClastItem>!match\u003CfirstItem>]\\\" variable=\\\"ignore\\\">\\n\\t\\t\\t\\t\\t\u003C$set name=\\\"nextItem\\\" value={{{ [[$afterOrBefore$]match[after]then\u003CuserInput>addsuffix[-userInput]] ~[\u003CnextItem>] }}}>\\n\\t\\t\\t\\t\\t\\t\u003C\u003Cinput-next-actions-inner>>\\n\\t\\t\\t\\t\\t\u003C/$set>\\n\\t\\t\\t\\t\u003C/$list>\\n\\t\\t\\t\\t\u003C$list filter=\\\"[\u003CselectedItem>match\u003CfirstItem>match\u003ClastItem>]\\\" variable=\\\"ignore\\\">\\n\\t\\t\\t\\t\\t\u003C$set name=\\\"nextItem\\\" value={{{ [\u003CuserInput>addsuffix[-userInput]] }}}>\\n\\t\\t\\t\\t\\t\\t\u003C\u003Cinput-next-actions-inner>>\\n\\t\\t\\t\\t\\t\u003C/$set>\\n\\t\\t\\t\\t\u003C/$list>\\n\\t\\t\\t\\t\u003C$list filter=\\\"[\u003CselectedItem>!match\u003CfirstItem>!match\u003ClastItem>]\\\" variable=\\\"ignore\\\">\\n\\t\\t\\t\\t\\t\u003C\u003Cinput-next-actions-inner>>\\n\\t\\t\\t\\t\u003C/$list>\\n\\t\\t\\t\u003C/$let>\\n\\t\\t\u003C/$set>\\n\\t\u003C/$let>\\n\u003C/$list>\\n\\\\end\\n\\n\\\\define keyboard-driven-input(tiddler,storeTitle,field:\\\"text\\\",index:\\\"\\\",tag:\\\"input\\\",type,focus:\\\"\\\",inputAcceptActions,inputAcceptVariantActions,inputCancelActions,placeholder:\\\"\\\",default:\\\"\\\",class,focusPopup,rows,minHeight,tabindex,size,autoHeight,filterMinLength:\\\"0\\\",refreshTitle,selectionStateTitle,cancelPopups:\\\"\\\",configTiddlerFilter,firstSearchFilterField:\\\"first-search-filter\\\",secondSearchFilterField:\\\"second-search-filter\\\")\\n\\\\whitespace trim\\n\u003C$keyboard key=\\\"((input-accept))\\\" actions=\u003C\u003C__inputAcceptActions__>>>\\n\u003C$keyboard key=\\\"((input-accept-variant))\\\" actions=\u003C\u003C__inputAcceptVariantActions__>>>\\n\u003C$keyboard key=\\\"((input-up))\\\" actions=\u003C\u003Cinput-next-actions \\\"before\\\" \\\"reverse[]\\\">>>\\n\u003C$keyboard key=\\\"((input-down))\\\" actions=\u003C\u003Cinput-next-actions>>>\\n\u003C$keyboard key=\\\"((input-cancel))\\\" actions=\u003C\u003C__inputCancelActions__>>>\\n\\t\u003C$edit-text\\n\\t\\ttiddler=\u003C\u003C__tiddler__>> field=\u003C\u003C__field__>> index=\u003C\u003C__index__>>\\n\\t\\tinputActions=\u003C\u003Ckeyboard-input-actions>> tag=\u003C\u003C__tag__>> class=\u003C\u003C__class__>>\\n\\t\\tplaceholder=\u003C\u003C__placeholder__>> default=\u003C\u003C__default__>> focusPopup=\u003C\u003C__focusPopup__>>\\n\\t\\tfocus=\u003C\u003C__focus__>>
2731 type=\u003C\u003C__type__>> rows=\u003C\u003C__rows__>> minHeight=\u003C\u003C__minHeight__>>\\n\\t\\ttabindex=\u003C\u003C__tabindex__>> size=\u003C\u003C__size__>> autoHeight=\u003C\u003C__autoHeight__>>\\n\\t\\trefreshTitle=\u003C\u003C__refreshTitle__>> cancelPopups=\u003C\u003C__cancelPopups__>>\\n\\t/>\\n\u003C/$keyboard>\\n\u003C/$keyboard>\\n\u003C/$keyboard>\\n\u003C/$keyboard>\\n\u003C/$keyboard>\\n\\\\end\\n\"},\"$:/core/macros/lingo\":{\"title\":\"$:/core/macros/lingo\",\"tags\":\"$:/tags/Macro\",\"text\":\"\\\\define lingo-base()\\n$:/language/\\n\\\\end\\n\\n\\\\define lingo(title)\\n{{$(lingo-base)$$title$}}\\n\\\\end\\n\"},\"$:/core/macros/list\":{\"title\":\"$:/core/macros/list\",\"tags\":\"$:/tags/Macro\",\"text\":\"\\\\define list-links(filter,type:\\\"ul\\\",subtype:\\\"li\\\",class:\\\"\\\",emptyMessage,field:\\\"caption\\\")\\n\\\\whitespace trim\\n\u003C$genesis $type=\u003C\u003C__type__>> class=\u003C\u003C__class__>>>\\n\u003C$list filter=\u003C\u003C__filter__>> emptyMessage=\u003C\u003C__emptyMessage__>>>\\n\u003C$genesis $type=\u003C\u003C__subtype__>>>\\n\u003C$link to={{!!title}}>\\n\u003C$let tv-wikilinks=\\\"no\\\">\\n\u003C$transclude field=\u003C\u003C__field__>>>\\n\u003C$view field=\\\"title\\\"/>\\n\u003C/$transclude>\\n\u003C/$let>\\n\u003C/$link>\\n\u003C/$genesis>\\n\u003C/$list>\\n\u003C/$genesis>\\n\\\\end\\n\\n\\\\define list-links-draggable-drop-actions()\\n\u003C$action-listops $tiddler=\u003C\u003CtargetTiddler>> $field=\u003C\u003CtargetField>> $subfilter=\\\"+[insertbefore\u003CactionTiddler>,\u003CcurrentTiddler>]\\\"/>\\n\\\\end\\n\\n\\\\define list-links-draggable(tiddler,field:\\\"list\\\",emptyMessage,type:\\\"ul\\\",subtype:\\\"li\\\",class:\\\"\\\",itemTemplate)\\n\\\\whitespace trim\\n\u003Cspan class=\\\"tc-links-draggable-list\\\">\\n\u003C$vars targetTiddler=\\\"\\\"\\\"$tiddler$\\\"\\\"\\\" targetField=\\\"\\\"\\\"$field$\\\"\\\"\\\">\\n\u003C$genesis $type=\u003C\u003C__type__>> class=\\\"$class$\\\">\\n\u003C$list filter=\\\"[list[$tiddler$!!$field$]]\\\" emptyMessage=\u003C\u003C__emptyMessage__>>>\\n\u003C$droppable actions=\u003C\u003Clist-links-draggable-drop-actions>> tag=\\\"\\\"\\\"$subtype$\\\"\\\"\\\" enable=\u003C\u003Ctv-enable-drag-and-drop>>>\\n\u003Cdiv class=\\\"tc-droppable-placeholder\\\"/>\\n\u003Cdiv>\\n\u003C$transclude tiddler=\\\"\\\"\\\"$itemTemplate$\\\"\\\"\\\">\\n\u003C$link to={{!!title}}>\\n\u003C$let tv-wikilinks=\\\"no\\\">\\n\u003C$transclude field=\\\"caption\\\">\\n\u003C$view field=\\\"title\\\"/>\\n\u003C/$transclude>\\n\u003C/$let>\\n\u003C/$link>\\n\u003C/$transclude>\\n\u003C/div>\\n\u003C/$droppable>\\n\u003C/$list>\\n\u003C$tiddler tiddler=\\\"\\\">\\n\u003C$droppable actions=\u003C\u003Clist-links-draggable-drop-actions>> tag=\\\"div\\\" enable=\u003C\u003Ctv-enable-drag-and-drop>>>\\n\u003Cdiv class=\\\"tc-droppable-placeholder\\\">\\n{{$:/core/images/blank}}\\n\u003C/div>\\n\u003Cdiv style=\\\"height:0.5em;\\\"/>\\n\u003C/$droppable>\\n\u003C/$tiddler>\\n\u003C/$genesis>\\n\u003C/$vars>\\n\u003C/span>\\n\\\\end\\n\\n\\\\define list-tagged-draggable-drop-actions(tag)\\n\\\\whitespace trim\\n\u003C!-- Save the current ordering of the tiddlers with this tag -->\\n\u003C$set name=\\\"order\\\" filter=\\\"[\u003C__tag__>tagging[]]\\\">\\n\u003C!-- Remove any list-after or list-before fields from the tiddlers with this tag -->\\n\u003C$list filter=\\\"[\u003C__tag__>tagging[]]\\\">\\n\u003C$action-deletefield $field=\\\"list-before\\\"/>\\n\u003C$action-deletefield $field=\\\"list-after\\\"/>\\n\u003C/$list>\\n\u003C!-- Save the new order to the Tag Tiddler -->\\n\u003C$action-listops $tiddler=\u003C\u003C__tag__>> $field=\\\"list\\\" $filter=\\\"+[enlist\u003Corder>] +[insertbefore\u003CactionTiddler>,\u003CcurrentTiddler>]\\\"/>\\n\u003C!-- Make sure the newly added item has the right tag -->\\n\u003C!-- Removing this line makes dragging tags within the dropdown work as intended -->\\n\u003C!--\u003C$action-listops $tiddler=\u003C\u003CactionTiddler>> $tags=\u003C\u003C__tag__>>/>-->\\n\u003C!-- Using the following 5 lines as replacement makes dragging titles from outside into the dropdown apply the tag -->\\n\u003C$list filter=\\\"[\u003CactionTiddler>!contains:tags\u003C__tag__>]\\\">\\n\u003C$fieldmangler tiddler=\u003C\u003CactionTiddler>>>\\n\u003C$action-sendmessage $message=\\\"tm-add-tag\\\" $param=\u003C\u003C__tag__>>/>\\n\u003C/$fieldmangler>\\n\u003C/$list>\\n\u003C/$set>
2731\\n\\\\end\\n\\n\\\\define list-tagged-draggable(tag,subFilter,emptyMessage,itemTemplate,elementTag:\\\"div\\\",storyview:\\\"\\\")\\n\\\\whitespace trim\\n\u003Cspan class=\\\"tc-tagged-draggable-list\\\">\\n\u003C$set name=\\\"tag\\\" value=\u003C\u003C__tag__>>>\\n\u003C$list filter=\\\"[\u003C__tag__>tagging[]$subFilter$]\\\" emptyMessage=\u003C\u003C__emptyMessage__>> storyview=\u003C\u003C__storyview__>>>\\n\u003C$genesis $type=\u003C\u003C__elementTag__>> class=\\\"tc-menu-list-item\\\">\\n\u003C$droppable actions=\\\"\\\"\\\"\u003C$macrocall $name=\\\"list-tagged-draggable-drop-actions\\\" tag=\u003C\u003C__tag__>>/>\\\"\\\"\\\" enable=\u003C\u003Ctv-enable-drag-and-drop>>>\\n\u003C$genesis $type=\u003C\u003C__elementTag__>> class=\\\"tc-droppable-placeholder\\\"/>\\n\u003C$genesis $type=\u003C\u003C__elementTag__>>>\\n\u003C$transclude tiddler=\\\"\\\"\\\"$itemTemplate$\\\"\\\"\\\">\\n\u003C$link to={{!!title}}>\\n\u003C$view field=\\\"title\\\"/>\\n\u003C/$link>\\n\u003C/$transclude>\\n\u003C/$genesis>\\n\u003C/$droppable>\\n\u003C/$genesis>\\n\u003C/$list>\\n\u003C$tiddler tiddler=\\\"\\\">\\n\u003C$droppable actions=\\\"\\\"\\\"\u003C$macrocall $name=\\\"list-tagged-draggable-drop-actions\\\" tag=\u003C\u003C__tag__>>/>\\\"\\\"\\\" enable=\u003C\u003Ctv-enable-drag-and-drop>>>\\n\u003C$genesis $type=\u003C\u003C__elementTag__>> class=\\\"tc-droppable-placeholder\\\"/>\\n\u003C$genesis $type=\u003C\u003C__elementTag__>> style=\\\"height:0.5em;\\\">\\n\u003C/$genesis>\\n\u003C/$droppable>\\n\u003C/$tiddler>\\n\u003C/$set>\\n\u003C/span>\\n\\\\end\\n\"},\"$:/core/macros/tabs\":{\"title\":\"$:/core/macros/tabs\",\"tags\":\"$:/tags/Macro\",\"code-body\":\"yes\",\"text\":\"\\\\define tabs-button()\\n\\\\whitespace trim\\n\u003C$button set=\u003C\u003CtabsState>> setTo=\u003C\u003CcurrentTab>> default=\u003C\u003C__default__>> selectedClass=\\\"tc-tab-selected\\\" tooltip={{!!tooltip}} role=\\\"switch\\\">\\n\\t\u003C$tiddler tiddler=\u003C\u003Csave-currentTiddler>>>\\n\\t\\t\u003C$set name=\\\"tv-wikilinks\\\" value=\\\"no\\\">\\n\\t\\t\\t\u003C$transclude tiddler=\u003C\u003C__buttonTemplate__>> mode=\\\"inline\\\">\\n\\t\\t\\t\\t\u003C$transclude tiddler=\u003C\u003CcurrentTab>> field=\\\"caption\\\">\\n\\t\\t\\t\\t\\t\u003C$macrocall $name=\\\"currentTab\\\" $type=\\\"text/plain\\\" $output=\\\"text/plain\\\"/>\\n\\t\\t\\t\\t\u003C/$transclude>\\n\\t\\t\\t\u003C/$transclude>\\n\\t\\t\u003C/$set>\\n\\t\u003C/$tiddler>\\n\\t\u003C\u003C__actions__>>\\n\u003C/$button>\\n\\\\end\\n\\n\\\\define tabs-tab()\\n\\\\whitespace trim\\n\u003C$set name=\\\"save-currentTiddler\\\" value=\u003C\u003CcurrentTiddler>>>\\n\\t\u003C$tiddler tiddler=\u003C\u003CcurrentTab>>>\\n\\t\\t\u003C\u003Ctabs-button>>\\n\\t\u003C/$tiddler>\\n\u003C/$set>\\n\\\\end\\n\\n\\\\define tabs-tab-list()\\n\\\\whitespace trim\\n\u003C$list filter=\u003C\u003C__tabsList__>> variable=\\\"currentTab\\\" storyview=\\\"pop\\\">\\n\\t\u003C\u003Ctabs-tab>>\\n\u003C/$list>\\n\\\\end\\n\\n\\\\define tabs-tab-body()\\n\\\\whitespace trim\\n\u003C$list filter=\u003C\u003C__tabsList__>> variable=\\\"currentTab\\\">\\n\\t\u003C$reveal type=\\\"match\\\" state=\u003C\u003CtabsState>> text=\u003C\u003CcurrentTab>> default=\u003C\u003C__default__>> retain=\u003C\u003C__retain__>> tag=\\\"div\\\">\\n\\t\\t\u003C$transclude tiddler=\u003C\u003C__template__>> mode=\\\"block\\\">\\n\\t\\t\\t\u003C$transclude tiddler=\u003C\u003CcurrentTab>> mode=\\\"block\\\"/>\\n\\t\\t\u003C/$transclude>\\n\\t\u003C/$reveal>\\n\u003C/$list>\\n\\\\end\\n\\n\\\\define tabs(tabsList,default,state:\\\"$:/state/tab\\\",class,template,buttonTemplate,retain,actions,explicitState)\\n\\\\whitespace trim\\n\u003C$qualify title=\u003C\u003C__state__>> name=\\\"qualifiedState\\\">\\n\\t\u003C$let tabsState={{{ [\u003C__explicitState__>minlength[1]] ~[\u003CqualifiedState>] }}}>\\n\\t\\t\u003Cdiv class={{{ [[tc-tab-set]addsuffix[ ]addsuffix\u003C__class__>] }}}>\\n\\t\\t\\t\u003Cdiv class={{{ [[tc-tab-buttons]addsuffix[ ]addsuffix\u003C__class__>] }}}>\\n\\t\\t\\t\\t\u003C\u003Ctabs-tab-list>>\\n\\t\\t\\t\u003C/div>\\n\\t\\t\\t\u003Cdiv class={{{ [[tc-tab-divider]addsuffix[ ]addsuffix\u003C__class__>] }}}/>\\n\\t\\t\\t\u003Cdiv class={{{ [[tc-tab-content]addsuffix[ ]addsuffix\u003C__class__>] }}}>\\n\\t\\t\\t\\t\u003C\u003Ctabs-tab-body>>\\n\\t\\t\\t\u003C/div>\\n\\t\\t\u003C/div>\\n\\t\u003C/$let>
2731\\n\u003C/$qualify>\\n\\\\end\"},\"$:/core/macros/tag-picker\":{\"title\":\"$:/core/macros/tag-picker\",\"tags\":\"$:/tags/Macro\",\"first-search-filter\":\"[tags[]!is[system]search:title\u003CuserInput>sort[]]\",\"second-search-filter\":\"[tags[]is[system]search:title\u003CuserInput>sort[]]\",\"text\":\"\\\\define get-tagpicker-focus-selector() [data-tiddler-title=\\\"$(currentTiddlerCSSEscaped)$\\\"] .tc-add-tag-name input\\n\\n\\\\define delete-tag-state-tiddlers() \u003C$action-deletetiddler $filter=\\\"[\u003CnewTagNameTiddler>] [\u003CstoreTitle>] [\u003CtagSelectionState>]\\\"/>\\n\\n\\\\define add-tag-actions(actions,tagField:\\\"tags\\\")\\n\\\\whitespace trim\\n\u003C$set name=\\\"tag\\\" value={{{ [\u003C__tiddler__>get[text]] }}}>\\n\\t\u003C$list\\n\\t\\tfilter=\\\"[\u003CsaveTiddler>!contains:$tagField$\u003Ctag>!match[]]\\\"\\n\\t\\tvariable=\\\"ignore\\\"\\n\\t\\temptyMessage=\\\"\u003C$action-listops $tiddler=\u003C\u003CsaveTiddler>> $field=\u003C\u003C__tagField__>> $subfilter='-[\u003Ctag>]'/>\\\"\\n\\t>\\n\\t\\t\u003C$action-listops $tiddler=\u003C\u003CsaveTiddler>> $field=\u003C\u003C__tagField__>> $subfilter=\\\"[\u003Ctag>trim[]]\\\"/>\\n\\t\\t$actions$\\n\\t\u003C/$list>\\n\u003C/$set>\\n\u003C\u003Cdelete-tag-state-tiddlers>>\\n\u003C$action-setfield $tiddler=\u003C\u003CrefreshTitle>> text=\\\"yes\\\"/>\\n\\\\end\\n\\n\\\\define clear-tags-actions-inner()\\n\\\\whitespace trim\\n\u003C$list\\n\\tfilter=\\\"[\u003CstoreTitle>has[text]] [\u003CnewTagNameTiddler>has[text]]\\\"\\n\\tvariable=\\\"ignore\\\"\\n\\temptyMessage=\\\"\u003C\u003Ccancel-delete-tiddler-actions 'cancel'>>\\\"\\n>\\n\\t\u003C\u003Cdelete-tag-state-tiddlers>>\\n\u003C/$list>\\n\\\\end\\n\\n\\\\define clear-tags-actions()\\n\\\\whitespace trim\\n\u003C$set name=\\\"userInput\\\" value={{{ [\u003CstoreTitle>get[text]] }}}>\\n\\t\u003C$list filter=\\\"[\u003CnewTagNameTiddler>get[text]!match\u003CuserInput>]\\\" emptyMessage=\\\"\u003C\u003Cclear-tags-actions-inner>>\\\">\\n\\t\\t\u003C$action-setfield $tiddler=\u003C\u003CnewTagNameTiddler>> text=\u003C\u003CuserInput>>/>\u003C$action-setfield $tiddler=\u003C\u003CrefreshTitle>> text=\\\"yes\\\"/>\\n\\t\u003C/$list>\\n\u003C/$set>\\n\\\\end\\n\\n\\\\define tag-picker-inner(actions,tagField:\\\"tags\\\")\\n\\\\whitespace trim\\n\u003C$vars\\n\\tnewTagNameInputTiddlerQualified=\u003C\u003Cqualify \\\"$:/temp/NewTagName/input\\\">>\\n\\tnewTagNameSelectionTiddlerQualified=\u003C\u003Cqualify \\\"$:/temp/NewTagName/selected-item\\\">>\\n\\tfallbackTarget={{$(palette)$##tag-background}}\\n\\tcolourA={{$(palette)$##foreground}}\\n\\tcolourB={{$(palette)$##background}}\\n>\\n\\t\u003C$vars\\n\\t\\tstoreTitle={{{ [\u003CnewTagNameInputTiddler>!match[]] ~[\u003CnewTagNameInputTiddlerQualified>] }}}\\n\\t\\ttagSelectionState={{{ [\u003CnewTagNameSelectionTiddler>!match[]] ~[\u003CnewTagNameSelectionTiddlerQualified>] }}}\\n\\t>\\n\\t\\t\u003C$vars\\n\\t\\t\\trefreshTitle=\u003C\u003Cqualify \\\"$:/temp/NewTagName/refresh\\\">> \\n\\t\\t\\tnonSystemTagsFilter=\\\"[tags[]!is[system]search:title\u003CuserInput>sort[]]\\\"\\n\\t\\t\\tsystemTagsFilter=\\\"[tags[]is[system]search:title\u003CuserInput>sort[]]\\\"\\n\\t\\t>\\n\\t\\t\\t\u003Cdiv class=\\\"tc-edit-add-tag\\\">\\n\\t\\t\\t\\t\u003Cdiv>\\n\\t\\t\\t\\t\\t\u003Cspan class=\\\"tc-add-tag-name tc-small-gap-right\\\">\\n\\t\\t\\t\\t\\t\\t\u003C$macrocall\\n\\t\\t\\t\\t\\t\\t\\t$name=\\\"keyboard-driven-input\\\"\\n\\t\\t\\t\\t\\t\\t\\ttiddler=\u003C\u003CnewTagNameTiddler>>\\n\\t\\t\\t\\t\\t\\t\\tstoreTitle=\u003C\u003CstoreTitle>>\\n\\t\\t\\t\\t\\t\\t\\trefreshTitle=\u003C\u003CrefreshTitle>>\\n\\t\\t\\t\\t\\t\\t\\tselectionStateTitle=\u003C\u003CtagSelectionState>>\\n\\t\\t\\t\\t\\t\\t\\tinputAcceptActions=\\\"\u003C$macrocall $name='add-tag-actions' actions=\u003C\u003C__actions__>> tagField=\u003C\u003C__tagField__>>/>\\\"\\n\\t\\t\\t\\t\\t\\t\\tinputCancelActions=\u003C\u003Cclear-tags-actions>>\\n\\t\\t\\t\\t\\t\\t\\ttag=\\\"input\\\"\\n\\t\\t\\t\\t\\t\\t\\tplaceholder={{$:/language/EditTemplate/Tags/Add/Placeholder}}\\n\\t\\t\\t\\t\\t\\t\\tfocusPopup=\u003C\u003Cqualify \\\"$:/state/popup/tags-auto-complete\\\">>\\n\\t\\t\\t\\t\\t\\t\\tclass=\\\"tc-edit-texteditor tc-popup-handle\\\"\\n\\t\\t\\t\\t\\t\\t\\ttabindex=\u003C\u003CtabIndex>>\\n\\t\\t\\t\\t\\t\\t\\tfocus={{{ [{$:/config/AutoFocus}match[tags]then[true]] ~[[false]] }}}\\n\\t\\t\\t\\t\\t\\t\\tfilterMinLength={{$:/config/Tags/MinLength}}\\n\\t\\t\\t\\t\\t\\t\\tcancelPopups=\u003C\u003CcancelPopups>>\\n\\t\\t\\t\\t\\t\\t\\tconfigTiddlerFilter=\\\"[[$:/core/macros/tag-picker]]\\\"\\n\\t\\t\\t\\t\\t\\t/>
2731\\n\\t\\t\\t\\t\\t\u003C/span>\\n\\t\\t\\t\\t\\t\u003C$button popup=\u003C\u003Cqualify \\\"$:/state/popup/tags-auto-complete\\\">> \\n\\t\\t\\t\\t\\t\\tclass=\\\"tc-btn-invisible tc-btn-dropdown\\\"\\n\\t\\t\\t\\t\\t\\ttooltip={{$:/language/EditTemplate/Tags/Dropdown/Hint}}\\n\\t\\t\\t\\t\\t\\taria-label={{$:/language/EditTemplate/Tags/Dropdown/Caption}}\\n\\t\\t\\t\\t\\t>\\n\\t\\t\\t\\t\\t\\t{{$:/core/images/down-arrow}}\\n\\t\\t\\t\\t\\t\u003C/$button>\\n\\t\\t\\t\\t\\t\u003C$reveal state=\u003C\u003CstoreTitle>> type=\\\"nomatch\\\" text=\\\"\\\">\\n\\t\\t\\t\\t\\t\\t\u003C$button class=\\\"tc-btn-invisible tc-small-gap tc-btn-dropdown\\\"\\n\\t\\t\\t\\t\\t\\t\\ttooltip={{$:/language/EditTemplate/Tags/ClearInput/Hint}}\\n\\t\\t\\t\\t\\t\\t\\taria-label={{$:/language/EditTemplate/Tags/ClearInput/Caption}}\\n\\t\\t\\t\\t\\t\\t>\\n\\t\\t\\t\\t\\t\\t\\t{{$:/core/images/close-button}}\u003C\u003Cdelete-tag-state-tiddlers>>\\n\\t\\t\\t\\t\\t\\t\u003C/$button>\\n\\t\\t\\t\\t\\t\u003C/$reveal>\\n\\t\\t\\t\\t\\t\u003Cspan class=\\\"tc-add-tag-button tc-small-gap-left\\\">\\n\\t\\t\\t\\t\\t\\t\u003C$set name=\\\"tag\\\" value={{{ [\u003CnewTagNameTiddler>get[text]] }}}>\\n\\t\\t\\t\\t\\t\\t\\t\u003C$button set=\u003C\u003CnewTagNameTiddler>> setTo=\\\"\\\" class=\\\"\\\">\\n\\t\\t\\t\\t\\t\\t\\t\\t\u003C$action-listops $tiddler=\u003C\u003CsaveTiddler>> $field=\u003C\u003C__tagField__>> $subfilter=\\\"[\u003Ctag>trim[]]\\\"/>\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t$actions$\\n\\t\\t\\t\\t\\t\\t\\t\\t\u003C$set name=\\\"currentTiddlerCSSEscaped\\\" value={{{ [\u003CsaveTiddler>escapecss[]] }}}>\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\u003C\u003Cdelete-tag-state-tiddlers>>\u003C$action-sendmessage $message=\\\"tm-focus-selector\\\" $param=\u003C\u003Cget-tagpicker-focus-selector>>/>\\n\\t\\t\\t\\t\\t\\t\\t\\t\u003C/$set>\\n\\t\\t\\t\\t\\t\\t\\t\\t{{$:/language/EditTemplate/Tags/Add/Button}}\\n\\t\\t\\t\\t\\t\\t\\t\u003C/$button>\\n\\t\\t\\t\\t\\t\\t\u003C/$set>\\n\\t\\t\\t\\t\\t\u003C/span>\\n\\t\\t\\t\\t\u003C/div>\\n\\t\\t\\t\\t\u003Cdiv class=\\\"tc-block-dropdown-wrapper\\\">\\n\\t\\t\\t\\t\\t\u003C$reveal state=\u003C\u003Cqualify \\\"$:/state/popup/tags-auto-complete\\\">> type=\\\"nomatch\\\" text=\\\"\\\" default=\\\"\\\">\\n\\t\\t\\t\\t\\t\\t\u003Cdiv class=\\\"tc-block-dropdown tc-block-tags-dropdown\\\">\\n\\t\\t\\t\\t\\t\\t\\t\u003C$set name=\\\"userInput\\\" value={{{ [\u003CstoreTitle>get[text]] }}}>\\n\\t\\t\\t\\t\\t\\t\\t\\t\u003C$list\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tfilter=\\\"[\u003CuserInput>minlength{$:/config/Tags/MinLength}limit[1]]\\\"\\n\\t\\t\\t\\t\\t\\t\\t\\t\\temptyMessage=\\\"\u003Cdiv class='tc-search-results'\\n\\t\\t\\t\\t\\t\\t\\t\\t>\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t{{$:/language/Search/Search/TooShort}}\u003C/div>\\\" variable=\\\"listItem\\\">\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\u003C$list filter=\u003C\u003CnonSystemTagsFilter>> variable=\\\"tag\\\">\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\u003C$list\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tfilter=\\\"[\u003Ctag>addsuffix[-primaryList]] -[\u003CtagSelectionState>get[text]]\\\" \\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\temptyMessage=\\\"\u003C$vars button-classes='tc-btn-invisible tc-tag-button-selected' actions=\u003C\u003C__actions__>> tagField=\u003C\u003C__tagField__>> currentTiddler=\u003C\u003Ctag>>>{{||$:/core/ui/TagPickerTagTemplate}}\u003C/$vars>\\\"\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t>\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\u003C$vars button-classes=\\\"tc-btn-invisible\\\"\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tactions=\u003C\u003C__actions__>> \\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\ttagField=\u003C\u003C__tagField__>>\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tcurrentTiddler=\u003C\u003Ctag>>\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t>\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t{{||$:/core/ui/TagPickerTagTemplate}}\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\u003C/$vars>\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\u003C/$list>\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\u003C/$list>\\n\\t\\t\\t\\t\\t\\t\\t\\t\u003C/$list>\\n\\t\\t\\t\\t\\t\\t\\t\\t\u003Chr>\\n\\t\\t\\t\\t\\t\\t\\t\\t\u003C$list filter=\\\"[\u003CuserInput>minlength{$:/config/Tags/MinLength}limit[1]]\\\" emptyMessage=\\\"\u003Cdiv class='tc-search-results'>\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t{{$:/language/Search/Search/TooShort}}
2731\u003C/div>\\\" variable=\\\"listItem\\\">\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\u003C$list filter=\u003C\u003CsystemTagsFilter>> variable=\\\"tag\\\">\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\u003C$list filter=\\\"[\u003Ctag>addsuffix[-secondaryList]] -[\u003CtagSelectionState>get[text]]\\\"\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\temptyMessage=\\\"\u003C$vars button-classes='tc-btn-invisible tc-tag-button-selected' actions=\u003C\u003C__actions__>> tagField=\u003C\u003C__tagField__>> currentTiddler=\u003C\u003Ctag>>>{{||$:/core/ui/TagPickerTagTemplate}}\u003C/$vars>\\\"\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t>\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\u003C$vars button-classes=\\\"tc-btn-invisible\\\"\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tactions=\u003C\u003C__actions__>>\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\ttagField=\u003C\u003C__tagField__>>\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tcurrentTiddler=\u003C\u003Ctag>>\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t>\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t{{||$:/core/ui/TagPickerTagTemplate}}\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\u003C/$vars>\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\u003C/$list>\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\u003C/$list>\\n\\t\\t\\t\\t\\t\\t\\t\\t\u003C/$list>\\n\\t\\t\\t\\t\\t\\t\\t\u003C/$set>\\n\\t\\t\\t\\t\\t\\t\u003C/div>\\n\\t\\t\\t\\t\\t\u003C/$reveal>\\n\\t\\t\\t\\t\u003C/div>\\n\\t\\t\\t\u003C/div>\\n\\t\\t\u003C/$vars>\\n\\t\u003C/$vars>\\n\u003C/$vars>\\n\\\\end\\n\\n\\\\define tag-picker(actions,tagField:\\\"tags\\\")\\n\\\\whitespace trim\\n\u003C$vars saveTiddler=\u003C\u003CcurrentTiddler>> palette={{$:/palette}}>\\n\\t\u003C$list\\n\\t\\tfilter=\\\"[\u003CnewTagNameTiddler>match[]]\\\"\\n\\t\\temptyMessage=\\\"\u003C$macrocall $name='tag-picker-inner' actions=\u003C\u003C__actions__>> tagField=\u003C\u003C__tagField__>>/>\\\"\\n\\t>\\n\\t\\t\u003C$set name=\\\"newTagNameTiddler\\\" value=\u003C\u003Cqualify \\\"$:/temp/NewTagName\\\">>>\\n\\t\\t\\t\u003C$macrocall $name=\\\"tag-picker-inner\\\" actions=\u003C\u003C__actions__>> tagField=\u003C\u003C__tagField__>>/>\\n\\t\\t\u003C/$set>\\n\\t\u003C/$list>\\n\u003C/$vars>\\n\\\\end\\n\"},\"$:/core/macros/tag\":{\"title\":\"$:/core/macros/tag\",\"tags\":\"$:/tags/Macro\",\"text\":\"\\\\define tag-pill-styles()\\nbackground-color:$(backgroundColor)$;\\nfill:$(foregroundColor)$;\\ncolor:$(foregroundColor)$;\\n\\\\end\\n\\n\u003C!-- This has no whitespace trim to avoid modifying $actions$. Closing tags omitted for brevity. -->
2731\\n\\\\define tag-pill-inner(tag,icon,colour,fallbackTarget,colourA,colourB,element-tag,element-attributes,actions)\\n\\\\whitespace trim\\n\u003C$vars\\n\\tforegroundColor=\u003C\u003Ccontrastcolour target:\\\"\\\"\\\"$colour$\\\"\\\"\\\" fallbackTarget:\\\"\\\"\\\"$fallbackTarget$\\\"\\\"\\\" colourA:\\\"\\\"\\\"$colourA$\\\"\\\"\\\" colourB:\\\"\\\"\\\"$colourB$\\\"\\\"\\\">>\\n\\tbackgroundColor=\u003C\u003C__colour__>>\\n>\\n\u003C$element-tag$\\n\\t$element-attributes$\\n\\tclass=\\\"tc-tag-label tc-btn-invisible\\\"\\n\\tstyle=\u003C\u003Ctag-pill-styles>>\\n>\\n\\t\u003C\u003C__actions__>>\\n\\t\u003C$transclude tiddler=\u003C\u003C__icon__>>/>\\n\\t\u003C$view tiddler=\u003C\u003C__tag__>> field=\\\"title\\\" format=\\\"text\\\" />\\n\u003C/$element-tag$>\\n\\\\end\\n\\n\\\\define tag-pill-body(tag,icon,colour,palette,element-tag,element-attributes,actions)\\n\\\\whitespace trim\\n\u003C$macrocall $name=\\\"tag-pill-inner\\\"\\n\\ttag=\u003C\u003C__tag__>>\\n\\ticon=\u003C\u003C__icon__>>\\n\\tcolour=\u003C\u003C__colour__>>\\n\\tfallbackTarget={{$palette$##tag-background}}\\n\\tcolourA={{$palette$##foreground}}\\n\\tcolourB={{$palette$##background}}\\n\\telement-tag=\u003C\u003C__element-tag__>>\\n\\telement-attributes=\u003C\u003C__element-attributes__>>\\n\\tactions=\u003C\u003C__actions__>>\\n/>\\n\\\\end\\n\\n\\\\define tag-pill(tag,element-tag:\\\"span\\\",element-attributes:\\\"\\\",actions:\\\"\\\")\\n\\\\whitespace trim\\n\u003Cspan class=\\\"tc-tag-list-item\\\" data-tag-title=\u003C\u003C__tag__>>>\\n\\t\u003C$let currentTiddler=\u003C\u003C__tag__>>>\\n\\t\\t\u003C$macrocall $name=\\\"tag-pill-body\\\"\\n\\t\\t\\ttag=\u003C\u003C__tag__>>\\n\\t\\t\\ticon={{{ [\u003CcurrentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerIconFilter]!is[draft]get[text]] }}}\\n\\t\\t\\tcolour={{{ [\u003CcurrentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerColourFilter]!is[draft]get[text]] }}}\\n\\t\\t\\tpalette={{$:/palette}}\\n\\t\\t\\telement-tag=\u003C\u003C__element-tag__>>\\n\\t\\t\\telement-attributes=\u003C\u003C__element-attributes__>>\\n\\t\\t\\tactions=\u003C\u003C__actions__>>/>\\n\\t\u003C/$let>\\n\u003C/span>\\n\\\\end\\n\\n\\\\define tag(tag)\\n{{$tag$||$:/core/ui/TagTemplate}}\\n\\\\end\\n\"},\"$:/core/macros/thumbnails\":{\"title\":\"$:/core/macros/thumbnails\",\"tags\":\"$:/tags/Macro\",\"text\":\"\u003C!-- This macro does not use \\\\whitespace trim because it could affect the caption -->\\n\\\\define thumbnail(link,icon,color,background-color,image,caption,width:\\\"280\\\",height:\\\"157\\\")\\n\u003C$link to=\\\"\\\"\\\"$link$\\\"\\\"\\\">
2731\u003Cdiv class=\\\"tc-thumbnail-wrapper\\\"\\n>\u003Cdiv\\n\\tclass=\\\"tc-thumbnail-image\\\"\\n\\tstyle=\\\"width:$width$px;height:$height$px;\\\">\u003C$reveal\\n\\ttype=\\\"nomatch\\\"\\n\\ttext=\\\"\\\"\\n\\tdefault=\\\"\\\"\\\"$image$\\\"\\\"\\\"\\n\\ttag=\\\"div\\\"\\n\\tstyle=\\\"width:$width$px;height:$height$px;\\\"\\n>[img[$image$]]\u003C/$reveal>\u003C$reveal\\n\\ttype=\\\"match\\\"\\n\\ttext=\\\"\\\"\\n\\tdefault=\\\"\\\"\\\"$image$\\\"\\\"\\\"\\n\\ttag=\\\"div\\\"\\n\\tclass=\\\"tc-thumbnail-background\\\"\\n\\tstyle=\\\"width:$width$px;height:$height$px;background-color:$background-color$;\\\"\\n>\u003C/$reveal>\u003C/div>\u003Cdiv\\n\\tclass=\\\"tc-thumbnail-icon\\\"\\n\\tstyle=\\\"fill:$color$;color:$color$;\\\"\\n>$icon$\u003C/div>\u003Cdiv class=\\\"tc-thumbnail-caption\\\">$caption$\u003C/div>\u003C/div>\u003C/$link>\\n\\\\end\\n\\n\\\\define thumbnail-right(link,icon,color,background-color,image,caption,width:\\\"280\\\",height:\\\"157\\\")\\n\u003Cdiv class=\\\"tc-thumbnail-right-wrapper\\\">\u003C\u003Cthumbnail \\\"\\\"\\\"$link$\\\"\\\"\\\" \\\"\\\"\\\"$icon$\\\"\\\"\\\" \\\"\\\"\\\"$color$\\\"\\\"\\\" \\\"\\\"\\\"$background-color$\\\"\\\"\\\" \\\"\\\"\\\"$image$\\\"\\\"\\\" \\\"\\\"\\\"$caption$\\\"\\\"\\\" \\\"\\\"\\\"$width$\\\"\\\"\\\" \\\"\\\"\\\"$height$\\\"\\\"\\\">>\u003C/div>\\n\\\\end\\n\\n\\\\define list-thumbnails(filter,width:\\\"280\\\",height:\\\"157\\\")\\n\u003C$list filter=\\\"\\\"\\\"$filter$\\\"\\\"\\\">\u003C$macrocall $name=\\\"thumbnail\\\" link={{!!link}} icon={{!!icon}} color={{!!color}} background-color={{!!background-color}} image={{!!image}} caption={{!!caption}} width=\\\"\\\"\\\"$width$\\\"\\\"\\\" height=\\\"\\\"\\\"$height$\\\"\\\"\\\"/>\u003C/$list>\\n\\\\end\\n\"},\"$:/core/macros/timeline\":{\"title\":\"$:/core/macros/timeline\",\"created\":\"20141212105914482\",\"modified\":\"20141212110330815\",\"tags\":\"$:/tags/Macro\",\"text\":\"\u003C!-- Override one or both of the following two macros with a global or local macro of the same name \\nif you need to change how titles are displayed on a timeline -->\\n\\n\\\\define timeline-title() \u003C$view field=\\\"title\\\"/>\\n\\\\define timeline-link() \u003C$link to={{!!title}}>\u003C\u003Ctimeline-title>>\u003C/$link>\\n\\\\define timeline(limit:\\\"100\\\",format:\\\"DDth MMM YYYY\\\",subfilter:\\\"\\\",dateField:\\\"modified\\\")\\n\\\\whitespace trim\\n\u003Cdiv class=\\\"tc-timeline\\\">\\n\u003C$list filter=\\\"[!is[system]$subfilter$has[$dateField$]!sort[$dateField$]limit[$limit$]eachday[$dateField$]]\\\">\\n\u003Cdiv class=\\\"tc-menu-list-item\\\">\\n\u003C$view field=\\\"$dateField$\\\" format=\\\"date\\\" template=\\\"$format$\\\"/>\\n\u003C$list filter=\\\"[sameday:$dateField${!!$dateField$}!is[system]$subfilter$!sort[$dateField$]]\\\">\\n\u003Cdiv class=\\\"tc-menu-list-subitem\\\">\\n\u003C\u003Ctimeline-link>>\\n\u003C/div>\\n\u003C/$list>\\n\u003C/div>\\n\u003C/$list>\\n\u003C/div>\\n\\\\end\\n\"},\"$:/core/macros/toc\":{\"title\":\"$:/core/macros/toc\",\"tags\":\"$:/tags/Macro\",\"text\":\"\\n\\\\define toc-open-icon() $:/core/images/down-arrow\\n\\\\define toc-closed-icon() $:/core/images/right-arrow\\n\\n\\\\define toc-caption()\\n\\\\whitespace trim\\n\u003Cspan class=\\\"tc-toc-caption tc-tiny-gap-left\\\">\\n\u003C$set name=\\\"tv-wikilinks\\\" value=\\\"no\\\">\\n  \u003C$transclude field=\\\"caption\\\">\\n    \u003C$view field=\\\"title\\\"/>\\n  \u003C/$transclude>\\n\u003C/$set>\\n\u003C/span>\\n\\\\end\\n\\n\\\\define toc-body(tag,sort:\\\"\\\",itemClassFilter,exclude,path)\\n\\\\whitespace trim\\n\u003Col class=\\\"tc-toc\\\">\\n  \u003C$list filter=\\\"\\\"\\\"[all[shadows+tiddlers]tag\u003C__tag__>!has[draft.of]$sort$] -[\u003C__tag__>] -[subfilter\u003C__exclude__>]\\\"\\\"\\\">\\n    \u003C$let item=\u003C\u003CcurrentTiddler>> path={{{ [\u003C__path__>addsuffix[/]addsuffix\u003C__tag__>] }}}>\\n      \u003C$set name=\\\"excluded\\\" filter=\\\"[subfilter\u003C__exclude__>] [\u003C__tag__>]\\\">\\n        \u003C$set name=\\\"toc-item-class\\\" filter=\u003C\u003C__itemClassFilter__>> emptyValue=\\\"toc-item-selected\\\" value=\\\"toc-item\\\">\\n          \u003Cli class=\u003C\u003Ctoc-item-class>>>\\n            \u003C$list filter=\\\"[all[current]toc-link[no]]\\\" emptyMessage=\\\"\u003C$link to={{{ [\u003CcurrentTiddler>get[target]else\u003CcurrentTiddler>] }}}>\u003C\u003Ctoc-caption>>\u003C/$link>\\\">\\n              \u003C\u003Ctoc-caption>>\\n            \u003C/$list>\\n            \u003C$macrocall $name=\\\"toc-body\\\" tag=\u003C\u003Citem>> sort=\u003C\u003C__sort__>> itemClassFilter=\u003C\u003C__itemClassFilter__>> exclude=\u003C\u003Cexcluded>> path=\u003C\u003Cpath>>/>\\n          \u003C/li>\\n        \u003C/$set>\\n      \u003C/$set>\\n    \u003C/$let>\\n  \u003C/$list>\\n\u003C/ol>
2731\\n\\\\end\\n\\n\\\\define toc(tag,sort:\\\"\\\",itemClassFilter:\\\"\\\", exclude)\\n\u003C$macrocall $name=\\\"toc-body\\\"  tag=\u003C\u003C__tag__>> sort=\u003C\u003C__sort__>> itemClassFilter=\u003C\u003C__itemClassFilter__>> exclude=\u003C\u003C__exclude__>>/>\\n\\\\end\\n\\n\\\\define toc-linked-expandable-body(tag,sort:\\\"\\\",itemClassFilter,exclude,path)\\n\\\\whitespace trim\\n\u003C!-- helper function -->\\n\u003C$qualify name=\\\"toc-state\\\" title={{{ [[$:/state/toc]addsuffix\u003C__path__>addsuffix[-]addsuffix\u003CcurrentTiddler>] }}}>\\n  \u003C$set name=\\\"toc-item-class\\\" filter=\u003C\u003C__itemClassFilter__>> emptyValue=\\\"toc-item-selected\\\" value=\\\"toc-item\\\">\\n    \u003Cli class=\u003C\u003Ctoc-item-class>>>\\n    \u003C$link to={{{ [\u003CcurrentTiddler>get[target]else\u003CcurrentTiddler>] }}}>\\n      \u003C$reveal type=\\\"nomatch\\\" stateTitle=\u003C\u003Ctoc-state>> text=\\\"open\\\">\\n        \u003C$button setTitle=\u003C\u003Ctoc-state>> setTo=\\\"open\\\" class=\\\"tc-btn-invisible tc-popup-keep\\\">\\n          \u003C$transclude tiddler=\u003C\u003Ctoc-closed-icon>> />\\n        \u003C/$button>\\n      \u003C/$reveal>\\n      \u003C$reveal type=\\\"match\\\" stateTitle=\u003C\u003Ctoc-state>> text=\\\"open\\\">\\n        \u003C$button setTitle=\u003C\u003Ctoc-state>> setTo=\\\"close\\\" class=\\\"tc-btn-invisible tc-popup-keep\\\">\\n          \u003C$transclude tiddler=\u003C\u003Ctoc-open-icon>> />\\n        \u003C/$button>\\n      \u003C/$reveal>\\n      \u003C\u003Ctoc-caption>>\\n    \u003C/$link>\\n    \u003C$reveal type=\\\"match\\\" stateTitle=\u003C\u003Ctoc-state>> text=\\\"open\\\">\\n      \u003C$macrocall $name=\\\"toc-expandable\\\" tag=\u003C\u003CcurrentTiddler>> sort=\u003C\u003C__sort__>> itemClassFilter=\u003C\u003C__itemClassFilter__>> exclude=\u003C\u003C__exclude__>> path=\u003C\u003C__path__>>/>\\n    \u003C/$reveal>\\n    \u003C/li>\\n  \u003C/$set>\\n\u003C/$qualify>\\n\\\\end\\n\\n\\\\define toc-unlinked-expandable-body(tag,sort:\\\"\\\",itemClassFilter,exclude,path)\\n\\\\whitespace trim\\n\u003C!-- helper function -->\\n\u003C$qualify name=\\\"toc-state\\\" title={{{ [[$:/state/toc]addsuffix\u003C__path__>addsuffix[-]addsuffix\u003CcurrentTiddler>] }}}>\\n  \u003C$set name=\\\"toc-item-class\\\" filter=\u003C\u003C__itemClassFilter__>> emptyValue=\\\"toc-item-selected\\\" value=\\\"toc-item\\\">\\n    \u003Cli class=\u003C\u003Ctoc-item-class>>>\\n      \u003C$reveal type=\\\"nomatch\\\" stateTitle=\u003C\u003Ctoc-state>> text=\\\"open\\\">\\n        \u003C$button setTitle=\u003C\u003Ctoc-state>> setTo=\\\"open\\\" class=\\\"tc-btn-invisible tc-popup-keep\\\">\\n        \u003C$transclude tiddler=\u003C\u003Ctoc-closed-icon>> />\\n          \u003C\u003Ctoc-caption>>\\n        \u003C/$button>\\n      \u003C/$reveal>\\n      \u003C$reveal type=\\\"match\\\" stateTitle=\u003C\u003Ctoc-state>> text=\\\"open\\\">\\n        \u003C$button setTitle=\u003C\u003Ctoc-state>> setTo=\\\"close\\\" class=\\\"tc-btn-invisible tc-popup-keep\\\">\\n          \u003C$transclude tiddler=\u003C\u003Ctoc-open-icon>> />\\n          \u003C\u003Ctoc-caption>>\\n        \u003C/$button>\\n      \u003C/$reveal>\\n      \u003C$reveal type=\\\"match\\\" stateTitle=\u003C\u003Ctoc-state>> text=\\\"open\\\">\\n        \u003C$macrocall $name=\\\"toc-expandable\\\" tag=\u003C\u003CcurrentTiddler>> sort=\u003C\u003C__sort__>> itemClassFilter=\u003C\u003C__itemClassFilter__>> exclude=\u003C\u003C__exclude__>> path=\u003C\u003C__path__>>/>\\n      \u003C/$reveal>\\n    \u003C/li>\\n  \u003C/$set>\\n\u003C/$qualify>\\n\\\\end\\n\\n\\\\define toc-expandable-empty-message()\\n\u003C$macrocall $name=\\\"toc-linked-expandable-body\\\" tag=\u003C\u003Ctag>> sort=\u003C\u003Csort>> itemClassFilter=\u003C\u003CitemClassFilter>> exclude=\u003C\u003Cexcluded>> path=\u003C\u003Cpath>>/>\\n\\\\end\\n\\n\\\\define toc-expandable(tag,sort:\\\"\\\",itemClassFilter:\\\"\\\",exclude,path)\\n\\\\whitespace trim\\n\u003C$let tag=\u003C\u003C__tag__>> sort=\u003C\u003C__sort__>> itemClassFilter=\u003C\u003C__itemClassFilter__>> path={{{ [\u003C__path__>addsuffix[/]addsuffix\u003C__tag__>] }}}>\\n  \u003C$set name=\\\"excluded\\\" filter=\\\"[subfilter\u003C__exclude__>] [\u003C__tag__>]\\\">\\n    \u003Col class=\\\"tc-toc toc-expandable\\\">\\n      \u003C$list filter=\\\"\\\"\\\"[all[shadows+tiddlers]tag\u003C__tag__>!has[draft.of]$sort$] -[\u003C__tag__>] -[subfilter\u003C__exclude__>]\\\"\\\"\\\">\\n        \u003C$list filter=\\\"[all[current]toc-link[no]]\\\" emptyMessage=\u003C\u003Ctoc-expandable-empty-message>> >\\n          \u003C$macrocall $name=\\\"toc-unlinked-expandable-body\\\" tag=\u003C\u003C__tag__>> sort=\u003C\u003C__sort__>> itemClassFilter=\\\"\\\"\\\"itemClassFilter\\\"\\\"\\\" exclude=\u003C\u003Cexcluded>> path=\u003C\u003Cpath>> />\\n        \u003C/$list>\\n      \u003C/$list>\\n    \u003C/ol>\\n  \u003C/$set>\\n\u003C/$let>
2731\\n\\\\end\\n\\n\\\\define toc-linked-selective-expandable-body(tag,sort:\\\"\\\",itemClassFilter,exclude,path)\\n\\\\whitespace trim\\n\u003C$qualify name=\\\"toc-state\\\" title={{{ [[$:/state/toc]addsuffix\u003C__path__>addsuffix[-]addsuffix\u003CcurrentTiddler>] }}}>\\n  \u003C$set name=\\\"toc-item-class\\\" filter=\u003C\u003C__itemClassFilter__>> emptyValue=\\\"toc-item-selected\\\" value=\\\"toc-item\\\" >\\n    \u003Cli class=\u003C\u003Ctoc-item-class>>>\\n      \u003C$link to={{{ [\u003CcurrentTiddler>get[target]else\u003CcurrentTiddler>] }}}>\\n          \u003C$list filter=\\\"[all[current]tagging[]$sort$limit[1]]\\\" variable=\\\"ignore\\\" emptyMessage=\\\"\u003C$button class='tc-btn-invisible'>{{$:/core/images/blank}}\u003C/$button>\\\">\\n          \u003C$reveal type=\\\"nomatch\\\" stateTitle=\u003C\u003Ctoc-state>> text=\\\"open\\\">\\n            \u003C$button setTitle=\u003C\u003Ctoc-state>> setTo=\\\"open\\\" class=\\\"tc-btn-invisible tc-popup-keep\\\">\\n            \u003C$transclude tiddler=\u003C\u003Ctoc-closed-icon>> />\\n            \u003C/$button>\\n          \u003C/$reveal>\\n          \u003C$reveal type=\\\"match\\\" stateTitle=\u003C\u003Ctoc-state>> text=\\\"open\\\">\\n            \u003C$button setTitle=\u003C\u003Ctoc-state>> setTo=\\\"close\\\" class=\\\"tc-btn-invisible tc-popup-keep\\\">\\n              \u003C$transclude tiddler=\u003C\u003Ctoc-open-icon>> />\\n            \u003C/$button>\\n          \u003C/$reveal>\\n        \u003C/$list>\\n        \u003C\u003Ctoc-caption>>\\n      \u003C/$link>\\n      \u003C$reveal type=\\\"match\\\" stateTitle=\u003C\u003Ctoc-state>> text=\\\"open\\\">\\n        \u003C$macrocall $name=\\\"toc-selective-expandable\\\" tag=\u003C\u003CcurrentTiddler>> sort=\u003C\u003C__sort__>> itemClassFilter=\u003C\u003C__itemClassFilter__>> exclude=\u003C\u003C__exclude__>> path=\u003C\u003C__path__>>/>\\n      \u003C/$reveal>\\n    \u003C/li>\\n  \u003C/$set>\\n\u003C/$qualify>\\n\\\\end\\n\\n\\\\define toc-unlinked-selective-expandable-body(tag,sort:\\\"\\\",itemClassFilter,exclude,path)\\n\\\\whitespace trim\\n\u003C$qualify name=\\\"toc-state\\\" title={{{ [[$:/state/toc]addsuffix\u003C__path__>addsuffix[-]addsuffix\u003CcurrentTiddler>] }}}>\\n  \u003C$set name=\\\"toc-item-class\\\" filter=\u003C\u003C__itemClassFilter__>> emptyValue=\\\"toc-item-selected\\\" value=\\\"toc-item\\\">\\n    \u003Cli class=\u003C\u003Ctoc-item-class>>>\\n      \u003C$list filter=\\\"[all[current]tagging[]$sort$limit[1]]\\\" variable=\\\"ignore\\\" emptyMessage=\\\"\\\"\\\"\u003C$button class=\\\"tc-btn-invisible\\\">{{$:/core/images/blank}}\u003C/$button>\u003Cspan class=\\\"toc-item-muted\\\">\u003C\u003Ctoc-caption>>\u003C/span>\\\"\\\"\\\">\\n        \u003C$reveal type=\\\"nomatch\\\" stateTitle=\u003C\u003Ctoc-state>> text=\\\"open\\\">\\n          \u003C$button setTitle=\u003C\u003Ctoc-state>> setTo=\\\"open\\\" class=\\\"tc-btn-invisible tc-popup-keep\\\">\\n            \u003C$transclude tiddler=\u003C\u003Ctoc-closed-icon>> />\\n            \u003C\u003Ctoc-caption>>\\n          \u003C/$button>\\n        \u003C/$reveal>\\n        \u003C$reveal type=\\\"match\\\" stateTitle=\u003C\u003Ctoc-state>> text=\\\"open\\\">\\n          \u003C$button setTitle=\u003C\u003Ctoc-state>> setTo=\\\"close\\\" class=\\\"tc-btn-invisible tc-popup-keep\\\">\\n            \u003C$transclude tiddler=\u003C\u003Ctoc-open-icon>> />\\n            \u003C\u003Ctoc-caption>>\\n          \u003C/$button>\\n        \u003C/$reveal>\\n      \u003C/$list>\\n      \u003C$reveal type=\\\"match\\\" stateTitle=\u003C\u003Ctoc-state>> text=\\\"open\\\">\\n        \u003C$macrocall $name=\\\"toc-selective-expandable\\\" tag=\u003C\u003CcurrentTiddler>> sort=\u003C\u003C__sort__>> itemClassFilter=\u003C\u003C__itemClassFilter__>> exclude=\u003C\u003C__exclude__>> path=\u003C\u003C__path__>>/>\\n      \u003C/$reveal>\\n    \u003C/li>\\n  \u003C/$set>\\n\u003C/$qualify>\\n\\\\end\\n\\n\\\\define toc-selective-expandable-empty-message()\\n\u003C$macrocall $name=\\\"toc-linked-selective-expandable-body\\\" tag=\u003C\u003Ctag>> sort=\u003C\u003Csort>> itemClassFilter=\u003C\u003CitemClassFilter>> exclude=\u003C\u003Cexcluded>> path=\u003C\u003Cpath>>/>
2731\\n\\\\end\\n\\n\\\\define toc-selective-expandable(tag,sort:\\\"\\\",itemClassFilter,exclude,path)\\n\\\\whitespace trim\\n\u003C$let tag=\u003C\u003C__tag__>> sort=\u003C\u003C__sort__>> itemClassFilter=\u003C\u003C__itemClassFilter__>> path={{{ [\u003C__path__>addsuffix[/]addsuffix\u003C__tag__>] }}}>\\n  \u003C$set name=\\\"excluded\\\" filter=\\\"[subfilter\u003C__exclude__>] [\u003C__tag__>]\\\">\\n    \u003Col class=\\\"tc-toc toc-selective-expandable\\\">\\n      \u003C$list filter=\\\"\\\"\\\"[all[shadows+tiddlers]tag\u003C__tag__>!has[draft.of]$sort$] -[\u003C__tag__>] -[subfilter\u003C__exclude__>]\\\"\\\"\\\">\\n        \u003C$list filter=\\\"[all[current]toc-link[no]]\\\" variable=\\\"ignore\\\" emptyMessage=\u003C\u003Ctoc-selective-expandable-empty-message>> >\\n          \u003C$macrocall $name=\\\"toc-unlinked-selective-expandable-body\\\" tag=\u003C\u003C__tag__>> sort=\u003C\u003C__sort__>> itemClassFilter=\u003C\u003C__itemClassFilter__>> exclude=\u003C\u003Cexcluded>> path=\u003C\u003Cpath>>/>\\n        \u003C/$list>\\n      \u003C/$list>\\n    \u003C/ol>\\n  \u003C/$set>\\n\u003C/$let>\\n\\\\end\\n\\n\\\\define toc-tabbed-external-nav(tag,sort:\\\"\\\",selectedTiddler:\\\"$:/temp/toc/selectedTiddler\\\",unselectedText,missingText,template:\\\"\\\",exclude)\\n\\\\whitespace trim\\n\u003C$tiddler tiddler={{{ [\u003C__selectedTiddler__>get[text]] }}}>\\n  \u003Cdiv class=\\\"tc-tabbed-table-of-contents\\\">\\n    \u003C$linkcatcher to=\u003C\u003C__selectedTiddler__>>>\\n      \u003Cdiv class=\\\"tc-table-of-contents\\\">\\n        \u003C$macrocall $name=\\\"toc-selective-expandable\\\" tag=\u003C\u003C__tag__>> sort=\u003C\u003C__sort__>> itemClassFilter=\\\"[all[current]] -[\u003C__selectedTiddler__>get[text]]\\\" exclude=\u003C\u003C__exclude__>>/>\\n      \u003C/div>\\n    \u003C/$linkcatcher>\\n    \u003Cdiv class=\\\"tc-tabbed-table-of-contents-content\\\">\\n      \u003C$reveal stateTitle=\u003C\u003C__selectedTiddler__>> type=\\\"nomatch\\\" text=\\\"\\\">\\n        \u003C$transclude mode=\\\"block\\\" tiddler=\u003C\u003C__template__>>>\\n          \u003Ch1>\u003C\u003Ctoc-caption>>\u003C/h1>\\n          \u003C$transclude mode=\\\"block\\\">$missingText$\u003C/$transclude>\\n        \u003C/$transclude>\\n      \u003C/$reveal>\\n      \u003C$reveal stateTitle=\u003C\u003C__selectedTiddler__>> type=\\\"match\\\" text=\\\"\\\">\\n        $unselectedText$\\n      \u003C/$reveal>\\n    \u003C/div>\\n  \u003C/div>\\n\u003C/$tiddler>\\n\\\\end\\n\\n\\\\define toc-tabbed-internal-nav(tag,sort:\\\"\\\",selectedTiddler:\\\"$:/temp/toc/selectedTiddler\\\",unselectedText,missingText,template:\\\"\\\",exclude)\\n\\\\whitespace trim\\n\u003C$linkcatcher to=\u003C\u003C__selectedTiddler__>>>\\n  \u003C$macrocall $name=\\\"toc-tabbed-external-nav\\\" tag=\u003C\u003C__tag__>> sort=\u003C\u003C__sort__>> selectedTiddler=\u003C\u003C__selectedTiddler__>> unselectedText=\u003C\u003C__unselectedText__>> missingText=\u003C\u003C__missingText__>> template=\u003C\u003C__template__>> exclude=\u003C\u003C__exclude__>> />\\n\u003C/$linkcatcher>\\n\\\\end\\n\"},\"$:/core/macros/translink\":{\"title\":\"$:/core/macros/translink\",\"tags\":\"$:/tags/Macro\",\"text\":\"\\\\define translink(title,mode:\\\"block\\\")\\n\\\\whitespace trim\\n\u003C$list filter=\\\"[\u003C__mode__>match[block]]\\\">\\n\u003Cdiv class=\\\"tc-translink\\\">\\n\u003Cdiv>\\n\u003C$link to=\\\"\\\"\\\"$title$\\\"\\\"\\\">\\n\u003Ch1>\u003C$text text=\\\"\\\"\\\"$title$\\\"\\\"\\\"/>\u003C/h1>\\n\u003C/$link>\\n\u003C$transclude tiddler=\\\"\\\"\\\"$title$\\\"\\\"\\\" mode=\\\"block\\\">\\n\u003C$set name=\\\"currentTiddler\\\" value=\\\"\\\"\\\"$title$\\\"\\\"\\\">\u003C$transclude tiddler=\\\"$:/language/MissingTiddler/Hint\\\"/>\u003C/$set>\\n\u003C/$transclude>\\n\u003C/div>\\n\u003C/div>\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003C__mode__>match[inline]]\\\">\\n\u003Cspan class=\\\"tc-translink\\\">\\n\u003C$link to=\\\"\\\"\\\"$title$\\\"\\\"\\\">\\n\u003C$text text=\\\"\\\"\\\"$title$\\\"\\\"\\\"/>\\n\u003C/$link>\\n&#32;(\u003C$transclude tiddler=\\\"\\\"\\\"$title$\\\"\\\"\\\" mode=\\\"inline\\\">\\n\u003C$set name=\\\"currentTiddler\\\" value=\\\"\\\"\\\"$title$\\\"\\\"\\\">\u003C$transclude tiddler=\\\"$:/language/MissingTiddler/Hint\\\"/>\u003C/$set>\\n\u003C/$transclude>)\\n\u003C/span>\\n\u003C/$list>\\n\\\\end\\n\"},\"$:/core/macros/tree\":{\"title\":\"$:/core/macros/tree\",\"tags\":\"$:/tags/Macro\",\"text\":\"\\\\define leaf-link(full-title,chunk,separator: \\\"/\\\")\\n\u003C$link to=\u003C\u003C__full-title__>>>\u003C$text text=\u003C\u003C__chunk__>>/>\u003C/$link>
2731\\n\\\\end\\n\\n\\\\define leaf-node(prefix,chunk)\\n\\\\whitespace trim\\n\u003Cli>\\n\u003C$list filter=\\\"[\u003C__prefix__>addsuffix\u003C__chunk__>is[shadow]] [\u003C__prefix__>addsuffix\u003C__chunk__>is[tiddler]]\\\" variable=\\\"full-title\\\">\\n\u003C$list filter=\\\"[\u003Cfull-title>removeprefix\u003C__prefix__>]\\\" variable=\\\"chunk\\\">\\n\u003Cspan>{{$:/core/images/file}}\u003C/span>&#32;\u003C$macrocall $name=\\\"leaf-link\\\" full-title=\u003C\u003Cfull-title>> chunk=\u003C\u003Cchunk>>/>\\n\u003C/$list>\\n\u003C/$list>\\n\u003C/li>\\n\\\\end\\n\\n\\\\define branch-node(prefix,chunk,separator: \\\"/\\\")\\n\\\\whitespace trim\\n\u003Cli>\\n\u003C$set name=\\\"reveal-state\\\" value={{{ [[$:/state/tree/]addsuffix\u003C__prefix__>addsuffix\u003C__chunk__>] }}}>\\n\u003C$reveal type=\\\"nomatch\\\" stateTitle=\u003C\u003Creveal-state>> text=\\\"show\\\">\\n\u003C$button setTitle=\u003C\u003Creveal-state>> setTo=\\\"show\\\" class=\\\"tc-btn-invisible\\\">\\n{{$:/core/images/folder}}&#32;\u003C$text text=\u003C\u003C__chunk__>>/>\\n\u003C/$button>\\n\u003C/$reveal>\\n\u003C$reveal type=\\\"match\\\" stateTitle=\u003C\u003Creveal-state>> text=\\\"show\\\">\\n\u003C$button setTitle=\u003C\u003Creveal-state>> setTo=\\\"hide\\\" class=\\\"tc-btn-invisible\\\">\\n{{$:/core/images/folder}}&#32;\u003C$text text=\u003C\u003C__chunk__>>/>\\n\u003C/$button>\\n\u003C/$reveal>\\n&#32;\\n\u003Cspan>(\u003C$count filter=\\\"[all[shadows+tiddlers]removeprefix\u003C__prefix__>removeprefix\u003C__chunk__>] -[\u003C__prefix__>addsuffix\u003C__chunk__>]\\\"/>)\u003C/span>\\n\u003C$reveal type=\\\"match\\\" stateTitle=\u003C\u003Creveal-state>> text=\\\"show\\\">\\n\u003C$macrocall $name=\\\"tree-node\\\" prefix={{{ [\u003C__prefix__>addsuffix\u003C__chunk__>] }}} separator=\u003C\u003C__separator__>>/>\\n\u003C/$reveal>\\n\u003C/$set>\\n\u003C/li>\\n\\\\end\\n\\n\\\\define tree-node(prefix,separator: \\\"/\\\")\\n\\\\whitespace trim\\n\u003Col>\\n\u003C$list filter=\\\"[all[shadows+tiddlers]removeprefix\u003C__prefix__>splitbefore\u003C__separator__>sort[]!suffix\u003C__separator__>]\\\" variable=\\\"chunk\\\">\\n\u003C$macrocall $name=\\\"leaf-node\\\" prefix=\u003C\u003C__prefix__>> chunk=\u003C\u003Cchunk>> separator=\u003C\u003C__separator__>>/>\\n\u003C/$list>\\n\u003C$list filter=\\\"[all[shadows+tiddlers]removeprefix\u003C__prefix__>splitbefore\u003C__separator__>sort[]suffix\u003C__separator__>]\\\" variable=\\\"chunk\\\">\\n\u003C$macrocall $name=\\\"branch-node\\\" prefix=\u003C\u003C__prefix__>> chunk=\u003C\u003Cchunk>> separator=\u003C\u003C__separator__>>/>\\n\u003C/$list>\\n\u003C/ol>\\n\\\\end\\n\\n\\\\define tree(prefix: \\\"$:/\\\",separator: \\\"/\\\")\\n\\\\whitespace trim\\n\u003Cdiv class=\\\"tc-tree\\\">\\n\u003Cspan>\u003C$text text=\u003C\u003C__prefix__>>/>\u003C/span>\\n\u003Cdiv>\\n\u003C$macrocall $name=\\\"tree-node\\\" prefix=\u003C\u003C__prefix__>> separator=\u003C\u003C__separator__>>/>\\n\u003C/div>\\n\u003C/div>\\n\\\\end\\n\"},\"$:/core/macros/utils\":{\"title\":\"$:/core/macros/utils\",\"text\":\"\\\\define colour(colour)\\n$colour$\\n\\\\end\\n\"},\"$:/snippets/minifocusswitcher\":{\"title\":\"$:/snippets/minifocusswitcher\",\"text\":\"\\\\whitespace trim\\n\u003C$select tiddler=\\\"$:/config/AutoFocus\\\">\\n\u003C$list filter=\\\"title tags text type fields\\\">\\n\u003Coption value=\u003C\u003CcurrentTiddler>>>\u003C\u003CcurrentTiddler>>\u003C/option>\\n\u003C/$list>\\n\u003C/$select>\\n\"},\"$:/snippets/minilanguageswitcher\":{\"title\":\"$:/snippets/minilanguageswitcher\",\"text\":\"\\\\whitespace trim\\n\u003C$select tiddler=\\\"$:/language\\\">\\n\u003C$list filter=\\\"[[$:/languages/en-GB]] [plugin-type[language]sort[title]]\\\">\\n\u003Coption value=\u003C\u003CcurrentTiddler>>>\u003C$view field=\\\"description\\\">\u003C$view field=\\\"name\\\">\u003C$view field=\\\"title\\\"/>\u003C/$view>\u003C/$view>\u003C/option>\\n\u003C/$list>\\n\u003C/$select>\"},\"$:/snippets/minithemeswitcher\":{\"title\":\"$:/snippets/minithemeswitcher\",\"text\":\"\\\\define lingo-base() $:/language/ControlPanel/Theme/\\n\\\\whitespace trim\\n\u003C\u003Clingo Prompt>>&#32;\u003C$select tiddler=\\\"$:/theme\\\">\\n\u003C$list filter=\\\"[plugin-type[theme]sort[title]]\\\">\\n\u003Coption value=\u003C\u003CcurrentTiddler>>>\u003C$view field=\\\"name\\\">\u003C$view field=\\\"title\\\"/>\u003C/$view>\u003C/option>\\n\u003C/$list>\\n\u003C/$select>\"},\"$:/snippets/modules\":{\"title\":\"$:/snippets/modules\",\"text\":\"\\\\define describeModuleType(type)\\n{{$:/language/Docs/ModuleTypes/$type$}}\\n\\\\end\\n\\\\whitespace trim\\n\u003C$list filter=\\\"[moduletypes[]]\\\">\\n\\n!! \u003C$macrocall $name=\\\"currentTiddler\\\" $type=\\\"text/plain\\\" $output=\\\"text/plain\\\"/>\\n\\n\u003C$macrocall $name=\\\"describeModuleType\\\" type=\u003C\u003CcurrentTiddler>>/>\\n\\n\u003Cul>\u003C$list filter=\\\"[all[current]modules[]]\\\">\u003Cli>\u003C$link>\u003C\u003CcurrentTiddler>>\u003C/$link>\\n\u003C/li>\\n\u003C/$list>\\n\u003C/ul>\\n\u003C/$list>\\n\"},\"$:/palette\":{\"title\":\"$:/palette\",\"text\":\"$:/palettes/Vanilla\"},\"$:/snippets/paletteeditor\":{\"title\":\"$:/snippets/paletteeditor\",\"text\":\"\u003C$transclude tiddler=\\\"$:/PaletteManager\\\"/>\\n\"},\"$:/snippets/palettepreview\":{\"title\":\"$:/snippets/palettepreview\",\"text\":\"\\\\whitespace trim\\n\u003C$set name=\\\"currentTiddler\\\" value={{$:/palette}}>\\n{{||$:/snippets/currpalettepreview}}\\n\u003C/$set>\\n\"},\"$:/snippets/paletteswitcher\":{\"title\":\"$:/snippets/paletteswitcher\",\"text\":\"\\\\whitespace trim\\n\u003C$linkcatcher to=\\\"$:/palette\\\">\\n\u003Cdiv class=\\\"tc-chooser\\\">\\n\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/Palette]sort[name]]\\\">\\n\u003C$set name=\\\"cls\\\" filter=\\\"[all[current]prefix{$:/palette}]\\\" value=\\\"tc-chooser-item tc-chosen\\\" emptyValue=\\\"tc-chooser-item\\\">\\n\u003Cdiv class=\u003C\u003Ccls>>>\\n\u003C$link to={{!!title}}>\\n''\u003C$view field=\\\"name\\\" format=\\\"text\\\"/>''\\n&#32;-&#32;\\n\u003C$view field=\\\"description\\\" format=\\\"text\\\"/>\\n{{||$:/snippets/currpalettepreview}}\\n\u003C/$link>\\n\u003C/div>\\n\u003C/$set>\\n\u003C/$list>\\n\u003C/div>\\n\u003C/$linkcatcher>\\n\"},\"$:/snippets/peek-stylesheets\":{\"title\":\"$:/snippets/peek-stylesheets\",\"text\":\"\\\\define exp
2731andable-stylesheets-list()\\n\\\\whitespace trim\\n\u003Col>\\n\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/Stylesheet]!has[draft.of]]\\\">\\n\u003C$vars state=\u003C\u003Cqualify \\\"$:/state/peek-stylesheets/open/\\\">>>\\n\u003C$set name=\\\"state\\\" value={{{ [\u003Cstate>addsuffix\u003CcurrentTiddler>] }}}>\\n\u003Cli>\\n\u003C$reveal type=\\\"match\\\" state=\u003C\u003Cstate>> text=\\\"yes\\\" tag=\\\"span\\\">\\n\u003C$button set=\u003C\u003Cstate>> setTo=\\\"no\\\" class=\\\"tc-btn-invisible\\\">\\n{{$:/core/images/down-arrow}}\\n\u003C/$button>\\n\u003C/$reveal>\\n\u003C$reveal type=\\\"nomatch\\\" state=\u003C\u003Cstate>> text=\\\"yes\\\" tag=\\\"span\\\">\\n\u003C$button set=\u003C\u003Cstate>> setTo=\\\"yes\\\" class=\\\"tc-btn-invisible\\\">\\n{{$:/core/images/right-arrow}}\\n\u003C/$button>\\n\u003C/$reveal>\\n\u003C$link>\\n\u003C$view field=\\\"title\\\"/>\\n\u003C/$link>\\n\u003C$reveal type=\\\"match\\\" state=\u003C\u003Cstate>> text=\\\"yes\\\" tag=\\\"div\\\">\\n\u003C$set name=\\\"source\\\" tiddler=\u003C\u003CcurrentTiddler>>>\\n\u003C$wikify name=\\\"styles\\\" text=\u003C\u003Csource>>>\\n\u003C$codeblock code=\u003C\u003Cstyles>> language=\\\"css\\\"/>\\n\u003C/$wikify>\\n\u003C/$set>\\n\u003C/$reveal>\\n\u003C/li>\\n\u003C/$set>\\n\u003C/$vars>\\n\u003C/$list>\\n\u003C/ol>\\n\\\\end\\n\\n\\\\define stylesheets-list()\\n\\\\whitespace trim\\n\u003Col>\\n\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/Stylesheet]!has[draft.of]]\\\">\\n\u003Cli>\\n\u003C$link>\\n\u003C$view field=\\\"title\\\"/>\\n\u003C/$link>\\n\u003C$set name=\\\"source\\\" tiddler=\u003C\u003CcurrentTiddler>>>\\n\u003C$wikify name=\\\"styles\\\" text=\u003C\u003Csource>>>\\n\u003Cpre>\\n\u003Ccode>\\n\u003C$text text=\u003C\u003Cstyles>>/>\\n\u003C/code>\\n\u003C/pre>\\n\u003C/$wikify>\\n\u003C/$set>\\n\u003C/li>\\n\u003C/$list>\\n\u003C/ol>\\n\\\\end\\n\\\\whitespace trim\\n\\n\u003C$vars modeState=\u003C\u003Cqualify \\\"$:/state/peek-stylesheets/mode/\\\">>>\\n\\n\u003C$reveal type=\\\"nomatch\\\" state=\u003C\u003CmodeState>> text=\\\"expanded\\\" tag=\\\"div\\\">\\n\u003C$button set=\u003C\u003CmodeState>> setTo=\\\"expanded\\\" class=\\\"tc-btn-invisible\\\">{{$:/core/images/chevron-right}} {{$:/language/ControlPanel/Stylesheets/Expand/Caption}}\u003C/$button>\\n\u003C/$reveal>\\n\u003C$reveal type=\\\"match\\\" state=\u003C\u003CmodeState>> text=\\\"expanded\\\" tag=\\\"div\\\">\\n\u003C$button set=\u003C\u003CmodeState>> setTo=\\\"restored\\\" class=\\\"tc-btn-invisible\\\">{{$:/core/images/chevron-down}} {{$:/language/ControlPanel/Stylesheets/Restore/Caption}}\u003C/$button>\\n\u003C/$reveal>\\n\\n\u003C$reveal type=\\\"nomatch\\\" state=\u003C\u003CmodeState>> text=\\\"expanded\\\" tag=\\\"div\\\">\\n\u003C\u003Cexpandable-stylesheets-list>>\\n\u003C/$reveal>\\n\u003C$reveal type=\\\"match\\\" state=\u003C\u003CmodeState>> text=\\\"expanded\\\" tag=\\\"div\\\">\\n\u003C\u003Cstylesheets-list>>\\n\u003C/$reveal>\\n\\n\u003C/$vars>\\n\"},\"$:/temp/search\":{\"title\":\"$:/temp/search\",\"text\":\"\"},\"$:/tags/AdvancedSearch\":{\"title\":\"$:/tags/AdvancedSearch\",\"list\":\"[[$:/core/ui/AdvancedSearch/Standard]] [[$:/core/ui/AdvancedSearch/System]] [[$:/core/ui/AdvancedSearch/Shadows]] [[$:/core/ui/AdvancedSearch/Filter]]\"},\"$:/tags/AdvancedSearch/FilterButton\":{\"title\":\"$:/tags/AdvancedSearch/FilterButton\",\"list\":\"$:/core/ui/AdvancedSearch/Filter/FilterButtons/dropdown $:/core/ui/AdvancedSearch/Filter/FilterButtons/clear $:/core/ui/AdvancedSearch/Filter/FilterButtons/export $:/core/ui/AdvancedSearch/Filter/FilterButtons/delete\"},\"$:/tags/ControlPanel\":{\"title\":\"$:/tags/ControlPanel\",\"list\":\"$:/core/ui/ControlPanel/Info $:/core/ui/ControlPanel/Appearance $:/core/ui/ControlPanel/Settings $:/core/ui/ControlPanel/Saving $:/core/ui/ControlPanel/Plugins $:/core/ui/ControlPanel/Tools $:/core/ui/ControlPanel/Internals\"},\"$:/tags/ControlPanel/Info\":{\"title\":\"$:/tags/ControlPanel/Info\",\"list\":\"$:/core/ui/ControlPanel/Basics $:/core/ui/ControlPanel/Advanced\"},\"$:/tags/ControlPanel/Plugins\":{\"title\":\"$:/tags/ControlPanel/Plugins\",\"list\":\"$:/core/ui/ControlPanel/Plugins/Installed/Plugins $:/core/ui/ControlPanel/Plugins/Installed/Themes $:/core/ui/ControlPanel/Plugins/Installed/Languages\"},\"$:/tags/EditTemplate\":{\"title\":\"$:/tags/EditTemplate\",\"list\":\"[[$:/core/ui/EditTemplate/controls]] [[$:/core/ui/EditTemplate/title]] [[$:/core/ui/EditTemplate/tags]] [[$:/core/ui/EditTemplate/shadow]] [[$:/core/ui/ViewTemplate/classic]] [[$:/core/ui/EditTemplate/body]] [[$:/core/ui/EditTemplate/type]] [[$:/core/ui/EditTemplate/fields]]\"},\"$:/tags/EditTemplateBodyFilter\":{\"title\":\"$:/tags/EditTemplateBodyFilter\",\"list\":\"$:/config/EditTemplateBodyFilters/canonical-uri $:/config/EditTemplateBodyFilters/default\"},\"$:/tags/EditToolbar\":{\"title\":\"$:/tags/EditToolbar\",\"list\":\"[[$:/core/ui/Buttons/delete]] [[$:/core/ui/Buttons/cancel]] [[$:/core/ui/Buttons/save]]\"},\"$:/tags/EditorToolbar\":{\"title\":\"$:/tags/EditorToolbar\",\"list\":\"$:/core/ui/EditorToolbar/paint $:/core/ui/EditorToolbar/opacity $:/core/ui/EditorToolbar/line-width $:/core/ui/EditorToolbar/rotate-left $:/core/ui/EditorToolbar/clear $:/core/ui/EditorToolbar/bold $:/core/ui/EditorToolbar/italic $:/core/ui/EditorToolbar/strikethrough $:/core/ui/EditorToolbar/underline $:/core/ui/EditorToolbar/superscript $:/core/ui/EditorToolbar/subscript $:/core/ui/EditorToolbar/mono-line $:/core/ui/EditorToolbar/mono-block $:/core/ui/EditorToolbar/quote $:/core/ui/EditorToolbar/list-bullet $:/core/ui/EditorToolbar/list-number $:/core/ui/EditorToolbar/heading-1 $:/core/ui/EditorToolbar/heading-2 $:/core/ui/EditorToolbar/heading-3 $:/core/ui/EditorToolbar/heading-4 $:/core/ui/EditorToolbar/heading-5 $:
2731/core/ui/EditorToolbar/heading-6 $:/core/ui/EditorToolbar/link $:/core/ui/EditorToolbar/excise $:/core/ui/EditorToolbar/picture $:/core/ui/EditorToolbar/stamp $:/core/ui/EditorToolbar/size $:/core/ui/EditorToolbar/editor-height $:/core/ui/EditorToolbar/more $:/core/ui/EditorToolbar/preview $:/core/ui/EditorToolbar/preview-type\"},\"$:/tags/Manager/ItemMain\":{\"title\":\"$:/tags/Manager/ItemMain\",\"list\":\"$:/Manager/ItemMain/WikifiedText $:/Manager/ItemMain/RawText $:/Manager/ItemMain/Fields\"},\"$:/tags/Manager/ItemSidebar\":{\"title\":\"$:/tags/Manager/ItemSidebar\",\"list\":\"$:/Manager/ItemSidebar/Tags $:/Manager/ItemSidebar/Colour $:/Manager/ItemSidebar/Icon $:/Manager/ItemSidebar/Tools\"},\"$:/tags/MoreSideBar\":{\"title\":\"$:/tags/MoreSideBar\",\"list\":\"[[$:/core/ui/MoreSideBar/All]] [[$:/core/ui/MoreSideBar/Recent]] [[$:/core/ui/MoreSideBar/Tags]] [[$:/core/ui/MoreSideBar/Missing]] [[$:/core/ui/MoreSideBar/Drafts]] [[$:/core/ui/MoreSideBar/Orphans]] [[$:/core/ui/MoreSideBar/Types]] [[$:/core/ui/MoreSideBar/System]] [[$:/core/ui/MoreSideBar/Shadows]] [[$:/core/ui/MoreSideBar/Explorer]] [[$:/core/ui/MoreSideBar/Plugins]]\",\"text\":\"\"},\"$:/tags/PageControls\":{\"title\":\"$:/tags/PageControls\",\"list\":\"[[$:/core/ui/Buttons/home]] [[$:/core/ui/Buttons/close-all]] [[$:/core/ui/Buttons/fold-all]] [[$:/core/ui/Buttons/unfold-all]] [[$:/core/ui/Buttons/permaview]] [[$:/core/ui/Buttons/new-tiddler]] [[$:/core/ui/Buttons/new-journal]] [[$:/core/ui/Buttons/new-image]] [[$:/core/ui/Buttons/import]] [[$:/core/ui/Buttons/export-page]] [[$:/core/ui/Buttons/control-panel]] [[$:/core/ui/Buttons/advanced-search]] [[$:/core/ui/Buttons/manager]] [[$:/core/ui/Buttons/tag-manager]] [[$:/core/ui/Buttons/language]] [[$:/core/ui/Buttons/palette]] [[$:/core/ui/Buttons/theme]] [[$:/core/ui/Buttons/layout]] [[$:/core/ui/Buttons/storyview]] [[$:/core/ui/Buttons/encryption]] [[$:/core/ui/Buttons/timestamp]] [[$:/core/ui/Buttons/full-screen]] [[$:/core/ui/Buttons/print]] [[$:/core/ui/Buttons/save-wiki]] [[$:/core/ui/Buttons/refresh]] [[$:/core/ui/Buttons/network-activity]] [[$:/core/ui/Buttons/more-page-actions]]\"},\"$:/tags/PageTemplate\":{\"title\":\"$:/tags/PageTemplate\",\"list\":\"[[$:/core/ui/PageTemplate/topleftbar]] [[$:/core/ui/PageTemplate/toprightbar]] [[$:/core/ui/PageTemplate/sidebar]] [[$:/core/ui/PageTemplate/story]] [[$:/core/ui/PageTemplate/alerts]]\",\"text\":\"\"},\"$:/tags/PluginLibrary\":{\"title\":\"$:/tags/PluginLibrary\",\"list\":\"$:/config/OfficialPluginLibrary\"},\"$:/tags/SideBar\":{\"title\":\"$:/tags/SideBar\",\"list\":\"[[$:/core/ui/SideBar/Open]] [[$:/core/ui/SideBar/Recent]] [[$:/core/ui/SideBar/Tools]] [[$:/core/ui/SideBar/More]]\",\"text\":\"\"},\"$:/tags/SideBarSegment\":{\"title\":\"$:/tags/SideBarSegment\",\"list\":\"[[$:/core/ui/SideBarSegments/site-title]] [[$:/core/ui/SideBarSegments/site-subtitle]] [[$:/core/ui/SideBarSegments/page-controls]] [[$:/core/ui/SideBarSegments/search]] [[$:/core/ui/SideBarSegments/tabs]]\"},\"$:/tags/StoryTiddlerTemplateFilter\":{\"title\":\"$:/tags/StoryTiddlerTemplateFilter\",\"list\":\"$:/config/StoryTiddlerTemplateFilters/draft $:/config/StoryTiddlerTemplateFilters/default\"},\"$:/tags/TiddlerColourFilter\":{\"title\":\"$:/tags/TiddlerColourFilter\",\"list\":\"$:/config/TiddlerColourFilters/color-field $:/config/TiddlerColourFilters/default\",\"text\":\"\"},\"$:/tags/TiddlerIconFilter\":{\"title\":\"$:/tags/TiddlerIconFilter\",\"list\":\"$:/config/TiddlerIconFilters/icon-field $:/config/TiddlerIconFilters/default\",\"text\":\"\"},\"$:/tags/TiddlerInfo\":{\"title\":\"$:/tags/TiddlerInfo\",\"list\":\"[[$:/core/ui/TiddlerInfo/Tools]] [[$:/core/ui/TiddlerInfo/References]] [[$:/core/ui/TiddlerInfo/Tagging]] [[$:/core/ui/TiddlerInfo/List]] [[$:/core/ui/TiddlerInfo/Listed]] [[$:/core/ui/TiddlerInfo/Fields]]\",\"text\":\"\"},\"$:/tags/TiddlerInfo/Advanced\":{\"title\":\"$:/tags/TiddlerInfo/Advanced\",\"list\":\"[[$:/core/ui/TiddlerInfo/Advanced/ShadowInfo]] [[$:/core/ui/TiddlerInfo/Advanced/PluginInfo]]\"},\"$:/tags/ViewTemplate\":{\"title\":\"$:/tags/ViewTemplate\",\"list\":\"[[$:/core/ui/ViewTemplate/title]] [[$:/core/ui/ViewTemplate/unfold]] [[$:/core/ui/ViewTemplate/subtitle]] [[$:/core/ui/ViewTemplate/tags]] [[$:/core/ui/ViewTemplate/classic]] [[$:/core/ui/ViewTemplate/body]]\"},\"$:/tags/ViewTemplateBodyFilter\":{\"title\":\"$:/tags/ViewTemplateBodyFilter\",\"list\":\"$:/config/ViewTemplateBodyFilters/hide-body $:/config/ViewTemplateBodyFilters/code-body $:/config/ViewTemplateBodyFilters/stylesheet $:/config/ViewTemplateBodyFilters/core-ui-advanced-search $:/config/ViewTemplateBodyFilters/core-ui-tags $:/config/ViewTemplateBodyFilters/system $:/config/ViewTemplateBodyFilters/import $:/config/ViewTemplateBodyFilters/plugin $:/config/ViewTemplateBodyFilters/default\"},\"$:/tags/ViewTemplate/Subtitle\":{\"title\":\"$:/tags/ViewTemplate/Subtitle\",\"list\":\"$:/core/ui/ViewTemplate/subtitle/modifier $:/core/ui/ViewTemplate/subtitle/modified\"},\"$:/tags/ViewTemplateTitleFilter\":{\"title\":\"$:/tags/ViewTemplateTitleFilter\",\"list\":\"$:/config/ViewTemplateTitleFilters/system $:/config/ViewTemplateTitleFilters/default\",\"text\":\"\"},\"$:/tags/ViewToolbar\":{\"title\":\"$:/tags/ViewToolbar\",\"list\":\"[[$:/core/ui/Buttons/more-tiddler-actions]] [[$:/core/ui/Buttons/info]] [[$:/core/ui/Buttons/new-here]] [[$:/core/ui/Buttons/new-journal-here]] [[$:/core/ui/Buttons/clone]] [[$:/core/ui/Buttons/export-tiddler]] [[$:/core/ui/Buttons/edit]] [[$:/core/ui/Buttons/delete]] [[$:/core/ui/Buttons/permalink]] [[$:/core/ui/Buttons/permaview]] [[$:/core/ui/Buttons/open-window]] [[$:/core/ui/Buttons/close-others]] [[$:/core/ui/Buttons/close]] [[$:/core/ui/Buttons/fold-others]] [[$:/core/ui/Buttons/fold]]\"},\"$:/snippets/themeswitcher\":{\"title\":\"$:/snippets/themeswitcher\",\"text\":\"\\\\whitespace trim\\n\u003C$linkcatcher to=\\\"$:/theme\\\">\\n\u003Cdiv class=\\\"tc-chooser\\\">\\n\u003C$list filter=\\\"[plugin-type[theme]sort[title]]\\\">\\n\u003C$set name=\\\"cls\\\" filter=\\\"[all[current]field:title{$:/theme}] [[$:/theme]!has[text]addsuffix[s/tiddlywiki/vanilla]field:title\u003CcurrentTiddler>] +[limit[1]]\\\" value=\\\"tc-chooser-item tc-chosen\\\" emptyValue=\\\"tc-chooser-item\\\">\\n\u003Cdiv class=\u003C\u003Ccls>>>\u003C$link to={{!!title}}>\\n''\u003C$view field=\\\"name\\\" format=\\\"text\\\"/>''\\n&#32;\\n\u003C$view field=\\\"description\\\" format=\\\"text\\\"/>\\n\u003C/$link>\\n\u003C/div>\\n\u003C/$set>\\n\u003C/$list>\\n\u003C/div>\\n\u003C/$linkcatcher>\"},\"$:/core/wiki/title\":{\"title\":\"$:/core/wiki/title\",\"text\":\"\\\\whitespace trim\\n{{$:/SiteTitle}}\\n\u003C$list filter=\\\"[{$:/SiteSubtitle}trim[]minlength[1]]\\\" variable=\\\"ignore\\\">\\n&#32;---&#32;{{$:/SiteSubtitle}}\\n\u003C/$list>\"},\"$:/view\":{\"title\":\"$:/view\",\"text\":\"classic\"},\"$:/snippets/viewswitcher\":{\"title\":\"$:/snippets/viewswitcher\",\"text\":\"\\\\define icon()\\n$:/core/images/storyview-$(storyview)$\\n\\\\end\\n\\\\whitespace trim\\n\u003C$linkcatcher to=\\\"$:/view\\\">\\n\u003Cdiv class=\\\"tc-chooser tc-viewswitcher\\\">\\n\u003C$list filter=\\\"[storyviews[]]\\\" variable=\\\"storyview\\\">\\n\u003C$set name=\\\"cls\\\" filter=\\\"[\u003Cstoryview>prefix{$:/view}]\\\" value=\\\"tc-chooser-item tc-chosen\\\" emptyValue=\\\"tc-chooser-item\\\">\u003Cdiv class=\u003C\u003Ccls>>>\\n\u003C$button tag=\\\"a\\\" class=\\\"tc-tiddlylink tc-btn-invisible\\\" to=\u003C\u003Cstoryview>>>\u003C$transclude tiddler=\u003C\u003Cicon>>/>\u003C$text text=\u003C\u003Cstoryview>>/>\u003C/$button>\\n\u003C/div>\\n\u003C/$set>\\n\u003C/$list>\\n\u003C/div>\\n\u003C/$linkcatcher>\\n\"}}}"},
2732{"created":"20240914094652543","text":"\\parameters (size:\"22pt\")\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> class=\"tc-image-github tc-image-button\" viewBox=\"0 0 128 128\">
2732\u003Cpath fill-rule=\"evenodd\" d=\"M63.938 1.607c-35.336 0-63.994 28.69-63.994 64.084 0 28.312 18.336 52.329 43.768 60.802 3.202.59 4.37-1.388 4.37-3.088 0-1.518-.056-5.55-.087-10.897-17.802 3.871-21.558-8.591-21.558-8.591-2.911-7.404-7.108-9.375-7.108-9.375-5.81-3.973.44-3.895.44-3.895 6.424.453 9.803 6.606 9.803 6.606 5.709 9.791 14.981 6.963 18.627 5.322.582-4.138 2.236-6.963 4.063-8.564-14.211-1.617-29.153-7.117-29.153-31.672 0-6.995 2.495-12.718 6.589-17.195-.66-1.621-2.856-8.14.629-16.96 0 0 5.37-1.722 17.597 6.57 5.104-1.424 10.58-2.132 16.022-2.16 5.438.028 10.91.736 16.022 2.16 12.22-8.292 17.582-6.57 17.582-6.57 3.493 8.82 1.297 15.339.64 16.96 4.102 4.477 6.578 10.2 6.578 17.195 0 24.618-14.966 30.035-29.22 31.62 2.295 1.98 4.342 5.89 4.342 11.87 0 8.564-.079 15.476-.079 17.576 0 1.715 1.155 3.71 4.4 3.084 25.413-8.493 43.733-32.494 43.733-60.798 0-35.394-28.657-64.084-64.006-64.084\"/>\u003C/svg>","title":"$:/core/images/github","tags":"$:/tags/Image","modified":"20240914094652543"},
2733{"created":"20241018065810724","text":"\\whitespace trim\n\u003C$button message=\"tm-home\" tooltip={{$:/language/Buttons/Home/Hint}} aria-label={{$:/language/Buttons/Home/Caption}} class=\u003C\u003Ctv-config-toolbar-class>>>\n\u003C$list filter=\"[\u003Ctv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/home-button}}\n\u003C/$list>\n\u003C$list filter=\"[\u003Ctv-config-toolbar-text>match[yes]]\">\n\u003Cspan class=\"tc-btn-text\">\n\u003C$text text={{$:/language/Buttons/Home/Caption}}/>\n\u003C/span>\n\u003C/$list>\n\u003C/$button>","title":"$:/core/ui/Buttons/home","tags":"$:/tags/PageControls","caption":"{{$:/core/images/home-button}} {{$:/language/Buttons/Home/Caption}}","description":"{{$:/language/Buttons/Home/Hint}}","modified":"20241018070013647"},
2734{"created":"20241018095326961","text":"\\whitespace trim\n\\rules except wikilink\n\nTo download the standard single-file version of your wiki:\n\n\u003C$wikify name=\"site-title\" text={{$:/config/SaveWikiButton/Filename}}>\n\u003C$let publishFilter=\"\"\"-[[$:/config/SaveWikiButton/Template]] -[[$:/plugins/tiddlywiki/filesystem]] -[[$:/plugins/tiddlywiki/tiddlyweb]]\"\"\">\n\u003C$button tooltip=\"Download fully standalone wiki\" aria-label=\"download full wiki\" class=\"tc-btn-big-green\">\n\u003C$action-sendmessage $message=\"tm-download-file\" $param=\"$:/core/save/all\" publishFilter=\u003C\u003CpublishFilter>> filename=\u003C\u003Csite-title>>/>\n{{$:/core/images/download-button}}\n\u003Cspan class=\"tc-tiny-gap-left\">\nDownload full wiki\n\u003C/span>\n\u003C/$button>\n\u003C/$let>\n\u003C/$wikify>","title":"$:/core/ui/DownloadFullWiki","modified":"20241018095326961"},
2735{"created":"20241006181853343","text":"\u003C$edit-text tiddler=\u003C\u003CcurrentTiddler>> field=\u003C\u003CcurrentField>> tag=\"input\" default=\"\" class=\"tc-edit-texteditor tc-edit-fieldeditor\" placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}} tabindex={{$:/config/EditTabIndex}} cancelPopups=\"yes\"/>","title":"$:/core/ui/EditTemplate/fieldEditor/default","modified":"20241006181853343"},
2736{"created":"20240921210515694","text":"\u003Cdiv class=\"tc-alerts\">\n\n\u003C$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Alert]!has[draft.of]]\" template=\"$:/core/ui/AlertTemplate\" storyview=\"pop\"/>\n\n\u003C/div>\n","title":"$:/core/ui/PageTemplate/alerts","tags":"$:/tags/PageTemplate","modified":"20240921210515694"},
2737{"created":"20240522080952216","text":"> \u003Cdiv class=\"tc-table-of-contents\"> \u003C\u003Ctoc \"$:/dates\" \"sort[title]\" exclude=\"[[Intelligence Artificielle]]\">>\u003C/div>\n","title":"$:/dates","modified":"20241103143607935","year":"{\"data\":{\"nodeData\":{\"id\":\"fbb46292312b2f6f\",\"topic\":\"新しいトピック\",\"root\":true,\"children\":[],\"style\":{\"color\":\"#3298db\"}},\"linkData\":{},\"summaries\":[],\"direction\":1,\"theme\":{\"name\":\"Custom\",\"palette\":[\"#848FA0\",\"#748BE9\",\"#D2F9FE\",\"#4145A5\",\"#789AFA\",\"#706CF4\",\"#EF987F\",\"#775DD5\",\"#FCEECF\",\"#DA7FBC\"],\"cssVar\":{\"--gap\":\"30px\",\"--root-radius\":\"30px\",\"--main-radius\":\"20px\",\"--root-color\":\"#ffffff\",\"--root-bgcolor\":\"#4b5d68\",\"--main-color\":\"#444446\",\"--main-bgcolor\":\"#ffffff\",\"--topic-padding\":\"5px\",\"--color\":\"#777777\",\"--bgcolor\":\"#f6f6f6\"}}},\"options\":{\"draggable\":true,\"contextMenu\":true,\"toolBar\":true,\"nodeMe
2737nu\":true,\"keypress\":true,\"locale\":\"auto\",\"overflowHidden\":false,\"allowUndo\":false,\"primaryLinkStyle\":\"1\"}}","tags":""},
2738{"created":"20240313160330743","title":"$:/DefaultTiddlers","text":"[[Glossaire DIAL-IA]]\n[[https://dial-ia.fr]]\n","modified":"20241110121819774"},
2739{"created":"20240906110650975","text":"\n__GraphQL__\n\n>GraphQL est un langage de requête pour les API et un environnement d’exécution côté serveur. \n\nLes principes de base de sont fonctionnement sont :\n\n* des requêtes flexibles : Contrairement à REST, où chaque point de terminaison renvoie des données prédéfinies, GraphQL permet aux clients de spécifier exactement les données dont ils ont besoin dans une seule requête.\n\n* un Schéma GraphQL : Tout commence par la définition d’un schéma. Ce schéma décrit les types de données disponibles et les relations entre eux. Il s’agit d’une représentation unifiée de toutes les fonctionnalités de l’API.\n\n* Des résolveurs : Les résolveurs sont des fonctions qui récupèrent les données associées à chaque champ d’un type de données. Par exemple, pour récupérer les articles d’un utilisateur, un résolveur interrogera la base de données pour obtenir ces informations2.\n* Requêtes et mutations : Les clients peuvent formuler des requêtes pour récupérer des données ou effectuer des mutations pour créer, mettre à jour ou supprimer des données.\n* Introspection : GraphQL permet aux clients de découvrir les capacités de l’API via l’introspection, ce qui facilite la compréhension et l’utilisation de l’API.","tags":"","title":"$:/dev/api/graphQL","modified":"20240906125929560","type":"text/markdown"},
2740{"created":"20241017011246426","text":"Cahier des charges\n---\n\n\n\u003Cbr>\n\n### \u003Cu> __Cahier des charges techniques__\u003C/u>\n\n\n\n### Contraintes Techniques (notamment liées au TP)\n\n---\n- **Technologies** : site web avec un menu dynamiques, l'accent est mis sur l'accessibilité\n\n\n\u003Cdetails> \n\u003Csummary> \n\t\u003Cmark>\n\u003Cb> Choix du framework Express \u003C/b> \u003C/mark>\n\u003C/summary>\n\t\nExpress est un Framework Web Node.js minimal et flexible qui fournit un ensemble robuste de fonctionnalités pour les applications Web et mobiles ( notamment un serveur web)\n\n\u003C/details>\n\n---\n\n- **Sécurité :** authentification sécurisée, protection contre les failles courantes (XSS, injections SQL, etc.).\n- ---\n- **Déploiement :** rédaction a minima d'une procédure de déploiement (CI/CD en bonus).\n---\n- **Responsive :** application développée en mobile first et responsive.\n---\n- **Accessibilité :** respect des normes d'accessibilité web [WCAG](https://www.w3.org/Translations/WCAG20-fr/).\n---\n- **RGPD et mentions légales :** mettre en place les mentions légales liées au règlement général sur la protection des données (RGPD).\n\n---\n\n- **Versionning :** utilisation de Git et GitHub.\n\n---\n\n- **API** : en consommer au moins une (qu’elle soit interne ou externe). Un seul appel peut être suffisant, l’API ne doit pas forcément être utilisée pour tout le projet.\n\n---\n\n- **SEO** : appliquer les bonnes pratiques visant à maximiser le référencement du projet.\n\n\t\n---\n\n- **Bonus** :\n    - conteneurisation (Docker) pour l'environnement de développement voire pour le déploiement,\n    - éco-conception (optimisation des images, minification des fichiers, etc.).","tags":"","title":"$:/dev/glossaire/cahier-des-charges","modified":"20241018111523626","type":"text/markdown"},
2741{"created":"20241017073430524","text":"\n\u003Cstyle> @import url('https://cdnjs.cloudflare.com/ajax/libs/github-fork-ribbon-css/0.2.3/gh-fork-ribbon.min.css'); \u003C/style>\n\n# Glossaire DIALIA\n\n## Présentation\n\n**Objectif** : \n\nL'objectif initial était de mettre à dispostion un outil de type \u003Cstrong>web documentaire \u003C/strong> permettant de contribuer au dialogue social technologique au travail.\n\n\u003Cfieldset>\n\t\n Le livrable se présente sous la forme d'__un glossaire, évolutif, de définitions utiles, et de références juridiques dans les domaines du numériques et de la conception de SIA__. \n \u003C/fieldset>\n \u003Ccenter> (MVP)\u003C/center>\n\n \n**Le besoin** : \n\nCe web documentaire devait pouvoir faciliter l'animation d'un atelier d'acculturation sur les thématiques:\n *  de l'\u003Cu>intelligence artificielle\u003C/u>\n *  de la \u003Cu>conception de projet de SIA\u003C/u>.\n\nPublic cible : Les parties prenantes d'un projet de SIA, pour une consultation individuelle ou lors d'une animation dans le cadre d'un atelier de sensibilisation aux enjeux du dialogue social à propos d'IA. \n\n**Contexte** : \n\nL'outil a été réalisé dans le cadre des ateliers du Projet DIALIA, à l'initiative des contributeurs de la thématique \"Acculturation à l'IA\" .\n\n\n>  Le projet DIALIA (“Dialogue IA”) est coordonnée par l’ IRES , avec la contribution de l'ANACT, en partenariat avec quatre des organisations syndicales membres de l’Institut. \n\n\u003Cbr>\n\n## Les fonctionnalités générales du glossaire :\n\n* Un __moteur de recherche__\n* Une __entrée par thématiques__ permet de naviguer facilement entre les notions\n* Une entrée via la __liste des définitions couvertes__\n* Une entrée via __une liste d'abréviations utiles__\n* La navigation est faciltée par un __systeme de renvois et de références entre concepts__ clés via un systeme de tag\n* Le \"fil d'ariane\" de la navigation est interactif. L'ensemble des articles consultées constitue le flux de la page active.\n\n\n### \u003Cu>Le choix des technologies utilisées\u003C/u>  :\n\n\u003Cfieldset>\n\n\u003Cdetails>\n\t\u003Csummary> \u003Cstrong> Benchmark  des solutions techniques open source en fonction des fonctionnalités attendues d'un web documentaire \u003C/strong>\u003C/summary>\n\n\u003Cfieldset>\n\n|Fonctionnalité du web documentaire | Markdowwn \u003Cbr> (+ Marp) | Tiddlywiki.js \u003Cbr>(+ plugins open source) |  autre framework web (exemple reveal.js)|\n|-----------------------------------|---------------------|--------------|------------|\n| Diffusion web de texte| __oui__ | __oui__ |   __oui__     |\n| Diffusion web de photo| __oui__ | __oui__ |   __oui__     |\n| Diffusion de video     | non | __oui__ |   oui  \u003Cbr> (intgré avec plugin) )   | \n| Diffusion de sons audio | non | __oui__ |   oui     | \n| Modalités d'animation interactive | limitée | __oui__ |   developppement \u003Cbr> spécifique    | \n| Modalités de navigation non linéaire | non | __oui__ |   developppement \u003Cbr> spécifique     | \n| Modalités de datavisualisation interactive | non | __oui__ |   developppement \u003Cbr> spécifique     | \n| Possibilité de personnaliser le contenu| __oui__ | __oui__ |   developppement \u003Cbr> spécifique    | \n| Possibilité narrative| non | __oui__ |   oui     | developppement \u003Cbr> spécifique|\n| Modalité de quizz ou d'évaluation| __oui__ | __oui__ |  developppement \u003Cbr> spécifique     | \n\n\u003C/fieldset>\n\t\n\u003C/details>\n\n\u003Cbr>\n\n\u003Cdetails>\n\u003Csummary>\u003Cstrong> Les plateformes de service dédiées au web documentaire \u003C/strong> \u003C/summary> \n\nListe non exhaustives :\n* [Plateforme klynt](https://www.klynt.net/fr/pricingklynt/) \n* [Plateforme Racontr](https://r83c929680.racontr.com/)\n* [Plateforme Génially](https://genial.ly/fr/)\n* [Plateforme Thinglink](https://www.thinglink.com/fr/)\n* ...\n\n\u003C/details>\n\n\u003C/fieldset>\n\n\u003Cp>\n\u003Ca href=\"https://github.com/lordbigdata/iap2p\">\u003Cspan class=\"github-fork-ribbon\"  data-ribbon=\"Fork me on GitHub\" title=\"Fork me on GitHub\">Fork me on GitHub\u003C/span>\n\tLes sources sont également disponibles sur GitHub\u003C/a>\n\u003C/p>\n\t\n{{$:/doc/tiddlywiki}}\n\n\n\u003Cdetails>\n\u003Csummary>\u003Cstrong> Les évolutions à implementer dans le glossaire DIAL-IA \u003C/strong> \u003C/summary> \n\n* Pour implémenter des systémes de QCM, on peut notamment consulter : \n\t* [[https://tw5.xyz/tiddlyquiz.html]]\n\t* [[https://github.com/sobjornstad/TiddlyRemember]] [[https://sobjornstad.github.io/TiddlyRemember/]]\n\t* [[https://tw5flashcards.tiddlyspot.com/]]\n\t* [[http://twiz.tiddlyspot.com/]]\n\n* Pour mettre en place un glossaire multi-utilisateurs pour la redaction en commun et la synchonisation des versions :\n\n   * [[https://github.com/OokTech/TW5-Bob]]\n \n * ou pour publier via AWS [[https://tiddlywiki.com/#OfficialPlugins]]\n * ou pour sauvegarder/synchroniser les tidddler dans une base de données externes CouchDB [[https://github.com/wshallum/couchadaptor]]\n\n* Améliorer l'écoconception :\n\t* utilitaire pour compresser le glossaire et donc diminuer sa taille [[https://github.com/flibbles/tw5-uglify]]\n\n\n\n* Améliorer l'accessibilité : Intégrer des fonctionnalités de \"text-to-speech\" et de \"speech to text\" avec le plugin [[Speek-to-text de |https://speech-to-text.finnsoftware.net/]] [[https://github.com/flancast90/Speech-To-Text-in-TW5]]\n\n\n* Intégrer des médias et video youtube (Vidothèque)\n\n  * [[https://ibnishak.github.io/Tesseract/incomplete/embedding.html#Youtube]]\n\n\u003C/details>","tags":"","title":"$:/dev/glossaire/DCG","modified":"20241110115000860","type":"text/markdown"},
2742{"created":"20241006003333880","text":"\u003Cdiv>\n\u003Ctable >\n\t\t\u003Ctr >\n\t\t\u003Cth >Article du glossaire\u003C/th>\n\t\t\u003Cth>Definition \u003Cbr> \u003Cp style=\"word-wrap: break-word;color:red\"> (source)\u003C/p>\u003C/th>\n\t\t\u003Cth>Origine\u003C/th>\n\t\u003C/tr>\n\t\u003C$list filter=\"[tag[Definition]]\">\n\t\u003Ctr>\n\u003Ctd >\u003C$link to=\u003C\u003CcurrentTiddler>>>\u003C$view field=\"title\"/>\u003C/$link>\u003C/td>\n\t\u003Ctd style=\"word-wrap: break-word;>\u003C$view field=\"definition\"/> \u003Cbr>\n\t\t\u003Cp style=\"word-wrap: break-word;color:red\"> (Source : \u003C$view field=\"source\"/>) \u003C/p>\u003C/td>\n\t\t\u003Ctd >\u003C$view field=\"origine\"/>\u003C/td> \n\t\t\u003C/tr>\n\t\t\u003C/$list>\n\t\n\u003C/table>\n\u003C/div>\n\t\n---\n\n","tags":"","title":"$:/dev/glossaire/dialia/etat des lieux","modified":"20241014073940388","type":"text/markdown"},
2743{"created":"20241017004209918","text":"","tags":"","title":"$:/dev/glossaire/evolutions","modified":"20241017004229213"},
2744{"created":"20241017004034303","text":"","tags":"","title":"$:/dev/glossaire/MVP","modified":"20241017004154498"},
2745{"created":"20241017004239114","text":"","tags":"","title":"$:/dev/glossaire/technologies","modified":"20241017004246599"},
2746{"created":"20241017004328366","text":"","tags":"","title":"$:/dev/glossaire/userStories","modified":"20241017004336964"},
2747{"created":"20241016205050112","text":"Cahier des charges\n---\n\n\u003Cbr>\n\n### \u003Cu> __Liste des livrables__\u003C/u>\n\n- [ ] La **présentation** du projet\n- [ ] La définition :\n- des **besoins** (problèmes auxquels répond le projet) et\n- des **objectifs** (solutions qu'apporte le projet) du projet\n- Les **fonctionnalités** du projet (spécifications fonctionnelles)\n  \n- [ ] Le **MVP (Minimum Viable Product)**:\n    - Le projet va faire l'objet de plusieurs étapes : l'idée c'est qu'**à chaque étape le produit fonctionne, même si ce n'est pas avec toutes les fonctionnalités qui étaient prévues**\n    - Il faut se poser la question : pour que mon projet marche, est-ce que telle fonctionnalité doit marcher (MVP) ou être une fonctionnalité annexe ?\n\n- [ ] Les **évolutions potentielles** (ce qui ne sera pas terminé) : tout ce qui est prévu mais ne fait pas partie du MVP\n\n- [ ] La liste des **technologies** utilisées pour le projet, avec justification (spécifications techniques)\n\n- [ ] La définition de la **cible** du projet (le public visé) : ça permettra entre autres choses d'anticiper certaines contraintes visuelles/ergonomiques/techniques\n- [ ] Les **navigateurs** compatibles\n\n- [ ] L'**arborescence** de l'application (le chemin de l'utilisateur, correspondra aux routes front)\n\n- [ ] La liste des **routes** prévues (les routes front sont couvertes par l'arborescence en toute logique, restent les endpoints de votre API)\n\n- [ ] La liste des **User stories** : micro scénarios “_en tant que tel utilisateur, je dois pouvoir effectuer telle action depuis tel endroit_” (chaque action sera redécoupée en différentes fonctionnalités)\n\n- [ ] La liste des **rôles de chacun**\n\n\u003Cbr>\n\n### \u003Cu> __Cahier des charges techniques__\u003C/u>\n\n\n\n### Contraintes Techniques (notamment liées au TP)\n\n---\n- **Technologies** : site web avec un menu dynamiques, l'accent est mis sur l'accessibilité\n\n\n\u003Cdetails> \n\u003Csummary> \n\t\u003Cmark>\n\u003Cb> Choix du framework Express \u003C/b> \u003C/mark>\n\u003C/summary>\n\t\nExpress est un Framework Web Node.js minimal et flexible qui fournit un ensemble robuste de fonctionnalités pour les applications Web et mobiles ( notamment un serveur web)\n\n\u003C/details>
2747\n\n---\n\n- **Sécurité :** authentification sécurisée, protection contre les failles courantes (XSS, injections SQL, etc.).\n- **Déploiement :** rédaction a minima d'une procédure de déploiement (CI/CD en bonus).\n- **Responsive :** application développée en mobile first et responsive.\n- **Accessibilité :** respect des normes d'accessibilité web [WCAG](https://www.w3.org/Translations/WCAG20-fr/).\n- **RGPD et mentions légales :** mettre en place les mentions légales liées au règlement général sur la protection des données (RGPD).\n- **Versionning :** utilisation de Git et GitHub.\n- **API** : en consommer au moins une (qu’elle soit interne ou externe). Un seul appel peut être suffisant, l’API ne doit pas forcément être utilisée pour tout le projet.\n- **SEO** : appliquer les bonnes pratiques visant à maximiser le référencement du projet.\n- **Bonus** :\n    - conteneurisation (Docker) pour l'environnement de développement voire pour le déploiement,\n    - éco-conception (optimisation des images, minification des fichiers, etc.).\n\nWireframe : [[https://wireframe.cc/ojeQdh]]\n\n","title":"$:/dev/site","modified":"20241018184518412","type":"text/markdown"},
2748{"created":"20241015162651230","text":"\u003Csvg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" width=\"751px\" height=\"891px\" viewBox=\"-0.5 -0.5 751 891\" content=\"&lt;mxfile host=&quot;embed.diagrams.net&quot; agent=&quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0&quot; version=&quot;24.7.17&quot;&gt;&lt;diagram id=&quot;hu8iidRtbiQ_yFPWj5wA&quot; name=&quot;Page-1&quot;&gt;7VtLj6M4EP41OU4UMJD0cfo1e9iVWuqRdue0csANnjEYGec1v35tsBPATDrJpDHR0odWXC4bu+qrhwszAQ/p9guDefIXjRCZuLNoOwGPE9f1gCv+S8KuIviBUxFihqOKVCO84p9IEWeKusIRKhqMnFLCcd4khjTLUMgbNMgY3TTZ3ihpPjWHMTIIryEkJvVvHPGkoi7c+YH+B8Jxop/sBHdVTwo1s9pJkcCIbmok8DQBD4xSXv1Ktw+ISNlpuVTjnn/Ru18YQxk/ZYBXDVhDslJ7U+viO71ZFIm9qyZlPKExzSB5OlDvGV1lEZIzzkTrwPMnpbkgOoL4HXG+U4qEK04FKeEpUb3mqtVGCrpioVqHWhmHLEaKC1QkucLaMLXTL4imiLOdYGCIQI7XTe1BBYJ4z3eQk/ihRNUtNtcQGxYS2E6/F4b4msLZJJij1xyWm9oI4zhREGvEONoe3aTqBQulU2VbnkLa5gBUR6MvqYE0mP2+WILbQRMw0eTbQhPoEFtAxKruI7wWP2Ne7qoiLTVByIkjVmi6eMiyzStotRny1ZLgcIgYdfoEqeN0iHugKPVNlOoY2D9M/YtgKmIwZ5SQs6CaQpwVQ0Sq6/eIVG9+O0idD8ifdontfaBGkMNjCF2yd9yryPokZmnW8bRcyB1i0uxvjreO9X1SagPrTlcQ7B/raIv5P3L41Fetb7Wex62auWzsVOMk+9Buu+HK3WtbiBr6QrFYyl6xntdKCX2/OUW1UDWqpbP9Mk5T4+wi21tjtDkaHt4zPuvG0w4UwPN7NJ4bChQa9A1DCGyFCuduEJK7xO3IxgtiWOwZsbNcUZcGFrY04A4jHbeuAddaXt+Z2P8fNeBZ80KuoYEXWYJsa6Emra6IVoiD1g/0QAmVsshoJvXyhgnRpIkLZrP53WMg6AQuEXmhBeZYZKTgMRTikjK8lzEPh0JxLYYUR1Gpac3wmeBYdnCp4HuoWvt53sTBTylb7E9AYsUJzsTydE1WKqsQO8BZ/LXEyKdADaut97n8k5w/EA8TPSyBuZw43caywDwVi0QpzKdV4fYj4rkfnJgMz68Rz81CGs1R9m91RBlBcR4oIhqu0hIJHwGMRZ/AAMNIV05zsQvTxQJraYZeTU1y+kw+WpRdi9rXGZRFzU+tO1zFom7o6OR21BCAtaOTax71QxGfCI1XaLQpyzbluxZtqvOFloUDRRZ9li/7D4ASlGcsl11pQtgR1xwhgUWBw68JznSXYq2mEiKoHU5k81u973A8KVu7euuiA4oWWQ/1QiECuKsx5LIOWNRmbpUT514TW8Fd647BO+XHFr/4Ua3g0pqjFlUNbhzBdHRBdl1QsLDpgsyLLVlZYh4xYRMTjmMRE37Xu4mBpnqg437K9d3/yUmyGdDfKJWgHO3JbpoXNO2p1yqVd0OXB0HHTRrv6hcULkqn3Fac9L3j6RRwjvL/djrl3VCNqUutFt2k+SIlQTAa3aRtN9m+2dKrmwRmMX9fJxmBcS4whMY/qETSbyHfLEeHkEUjHuzhoV2G7hUPnomHwQZdXf5plKGtXfb0uk517TvIxdHLZbV7ZAwViE+b/B0X12okid6zBpQaLc4awoq0kHIQ8eIZS2M7NrqFmr4vwrWsyPfn0xNvws39K6DBPKmWH4FtpUcbnavd4k8r4HqgTwdr5uY4K0KGcz5Cwzo02l6jX2gM47O1ft4xNQogV/9+8sQKR/vO8y/un5ulj/Y5zm1NVO3OmOijSzLOcf5zSzKiefgCuGI/fEYNnv4D&lt;/diagram&gt;&lt;/mxfile&gt;\">\u003Cdefs/>\u003Cg>\u003Cg data-cell-id=\"0\">\u003Cg data-cell-id=\"1\">\u003Cg data-cell-id=\"4\">\u003Cg>\u003Cpath d=\"M 394 60 L 394 93.63\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003Cpath d=\"M 394 98.88 L 390.5 91.88 L 394 93.63 L 397.5 91.88 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"2\">\u003Cg>\u003Crect x=\"334\" y=\"0\" width=\"120\" height=\"60\" fill=\"rgb(255, 255, 255)\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 30px; margin-left: 335px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">index.js\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"394\" y=\"34\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">index.js\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"6\">\u003Cg>\u003Cpath d=\"M 394 160 L 394 203.63\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003Cpath d=\"M 394 208.88 L 390.5 201.88 L 394 203.63 L 397.5 201.88 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"3\">\u003Cg>\u003Crect x=\"334\" y=\"100\" width=\"120\" height=\"60\" fill=\"rgb(255, 255, 255)\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 130px; margin-left: 335px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Cdiv>\u003Cb>routers\u003C/b>\u003C/div>public.js\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"394\" y=\"134\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">routerspublic.js\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"11\">\u003Cg>\u003Cpath d=\"M 394 270 L 394 290 L 394 285 L 394 298.63\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003Cpath d=\"M 394 303.88 L 390.5 296.88 L 394 298.63 L 397.5 296.88 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"5\">\u003Cg>\u003Crect x=\"334\" y=\"210\" width=\"120\" height=\"60\" fill=\"rgb(255, 255, 255)\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 240px; margin-left: 335px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Cdiv>\u003Cb>controllers\u003C/b>\u003C/div>mains.js\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"394\" y=\"244\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">controllersmains.js\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"47\">\u003Cg>\u003Cpath d=\"M 290 240 L 327.63 240\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003Cpath d=\"M 332.88 240 L 325.88 243.5 L 327.63 240 L 325.88 236.5 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"7\">\u003Cg>\u003Crect x=\"170\" y=\"210\" width=\"120\" height=\"60\" fill=\"rgb(255, 255, 255)\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 240px; margin-left: 171px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Cdiv>\u003Cb>data\u003C/b>\u003Cbr />\u003C/div>
2748pages.json\u003Cdiv>portails.json\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"230\" y=\"244\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">data...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"13\">\u003Cg>\u003Cpath d=\"M 394 365 L 394 513.63\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003Cpath d=\"M 394 518.88 L 390.5 511.88 L 394 513.63 L 397.5 511.88 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"10\">\u003Cg>\u003Crect x=\"334\" y=\"305\" width=\"120\" height=\"60\" fill=\"rgb(255, 255, 255)\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 335px; margin-left: 335px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Cdiv>\u003Cb>views\u003C/b>\u003Cbr />\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"394\" y=\"339\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">views&#xa;\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"17\">\u003Cg>\u003Cpath d=\"M 394 590 L 394 813.63\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003Cpath d=\"M 394 818.88 L 390.5 811.88 L 394 813.63 L 397.5 811.88 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"19\">\u003Cg>\u003Cpath d=\"M 394 590 L 394 650 L 260 650 L 260 703.63\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003Cpath d=\"M 260 708.88 L 256.5 701.88 L 260 703.63 L 263.5 701.88 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"21\">\u003Cg>\u003Cpath d=\"M 394 590 L 394 650 L 530 650 L 530 703.63\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003Cpath d=\"M 530 708.88 L 526.5 701.88 L 530 703.63 L 533.5 701.88 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"25\">\u003Cg>\u003Cpath d=\"M 394 590 L 394 650 L 120 650 L 120 703.63\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003Cpath d=\"M 120 708.88 L 116.5 701.88 L 120 703.63 L 123.5 701.88 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"12\">\u003Cg>\u003Cpath d=\"M 336 590 C 334.9 590 334 589.1 334 588 L 334 522 C 334 520.9 334.9 520 336 520 L 452 520 C 453.1 520 454 520.9 454 522 L 454 588 C 454 589.1 453.1 590 452 590 Z\" fill=\"#0079d6\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 335 536 L 335 588 C 335 588.55 335.45 589 336 589 L 452 589 C 452.55 589 453 588.55 453 588 L 453 536 Z\" fill-opacity=\"0.5\" fill=\"#ffffff\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 521px; margin-left: 335px;\">\u003Cdiv data-drawio-colors=\"color: #FFFFFF; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Page\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"394\" y=\"533\" fill=\"#FFFFFF\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">Page\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"16\">\u003Cg>\u003Cpath d=\"M 336 890 C 334.9 890 334 889.1 334 888 L 334 822 C 334 820.9 334.9 820 336 820 L 452 820 C 453.1 820 454 820.9 454 822 L 454 888 C 454 889.1 453.1 890 452 890 Z\" fill=\"#0079d6\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 372.7 879.51 L 372.7 845.31 C 373.05 842.8 374.98 840.81 377.48 840.39 L 406.5 840.39 L 415.3 849.11 L 415.3 879.51 C 415 882.17 412.91 884.28 410.25 884.61 L 377.61 884.61 C 375.01 884.22 372.99 882.13 372.7 879.51 Z M 383.87 872.22 L 403.64 872.22 L 403.64 868.51 L 383.87 868.51 Z M 403.64 865.16 L 403.64 861.54 L 383.87 861.54 L 383.87 865.16 Z M 383.87 858.19 L 403.64 858.19 L 403.64 854.61 L 383.87 854.61 Z M 404.57 851.26 L 411.82 851.26 L 404.57 843.74 Z M 335 836 L 335 888 C 335 888.55 335.45 889 336 889 L 452 889 C 452.55 889 453 888.55 453 888 L 453 836 Z\" fill-opacity=\"0.5\" fill=\"#ffffff\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 821px; margin-left: 335px;\">\u003Cdiv data-drawio-colors=\"color: #FFFFFF; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">open_data\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"394\" y=\"833\" fill=\"#FFFFFF\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">open_data\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"39\">\u003Cg>\u003Cpath d=\"M 260 780 L 260 813.63\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003Cpath d=\"M 260 818.88 L 256.5 811.88 L 260 813.63 L 263.5 811.88 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"18\">\u003Cg>\u003Cpath d=\"M 202 780 C 200.9 780 200 779.1 200 778 L 200 712 C 200 710.9 200.9 710 202 710 L 318 710 C 319.1 710 320 710.9 320 712 L 320 778 C 320 779.1 319.1 780 318 780 Z\" fill=\"#0079d6\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 238.7 769.51 L 238.7 735.31 C 239.05 732.8 240.98 730.81 243.48 730.39 L 272.5 730.39 L 281.3 739.11 L 281.3 769.51 C 281 772.17 278.91 774.28 276.25 774.61 L 243.61 774.61 C 241.01 774.22 238.99 772.13 238.7 769.51 Z M 249.87 762.22 L 269.64 762.22 L 269.64 758.51 L 249.87 758.51 Z M 269.64 755.16 L 269.64 751.54 L 249.87 751.54 L 249.87 755.16 Z M 249.87 748.19 L 269.64 748.19 L 269.64 744.61 L 249.87 744.61 Z M 270.57 741.26 L 277.82 741.26 L 270.57 733.74 Z M 201 726 L 201 778 C 201 778.55 201.45 779 202 779 L 318 779 C 318.55 779 319 778.55 319 778 L 319 726 Z\" fill-opacity=\"0.5\" fill=\"#ffffff\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 711px; margin-left: 201px;\">\u003Cdiv data-drawio-colors=\"color: #FFFFFF; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">portails\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"260\" y=\"723\" fill=\"#FFFFFF\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">portails\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"37\">\u003Cg>\u003Cpath d=\"M 530 780 L 530 813.63\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003Cpath d=\"M 530 818.88 L 526.5 811.88 L 530 813.63 L 533.5 811.88 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"20\">\u003Cg>\u003Cpath d=\"M 472 780 C 470.9 780 470 779.1 470 778 L 470 712 C 470 710.9 470.9 710 472 710 L 588 710 C 589.1 710 590 710.9 590 712 L 590 778 C 590 779.1 589.1 780 588 780 Z\" fill=\"#0079d6\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 508.7 769.51 L 508.7 735.31 C 509.05 732.8 510.98 730.81 513.48 730.39 L 542.5 730.39 L 551.3 739.11 L 551.3 769.51 C 551 772.17 548.91 774.28 546.25 774.61 L 513.61 774.61 C 511.01 774.22 508.99 772.13 508.7 769.51 Z M 519.87 762.22 L 539.64 762.22 L 539.64 758.51 L 519.87 758.51 Z M 539.64 755.16 L 539.64 751.54 L 519.87 751.54 L 519.87 755.16 Z M 519.87 748.19 L 539.64 748.19 L 539.64 744.61 L 519.87 744.61 Z M 540.57 741.26 L 547.82 741.26 L 540.57 733.74 Z M 471 726 L 471 778 C 471 778.55 471.45 779 472 779 L 588 779 C 588.55 779 589 778.55 589 778 L 589 726 Z\" fill-opacity=\"0.5\" fill=\"#ffffff\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 711px; margin-left: 471px;\">\u003Cdiv data-drawio-colors=\"color: #FFFFFF; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">catalogues\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"530\" y=\"723\" fill=\"#FFFFFF\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">catalogues\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"23\">\u003Cg>\u003Cpath d=\"M 690 703.63 L 690 650 L 394 650 L 394 590\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003Cpath d=\"M 690 708.88 L 687.67 701.88 L 690 703.63 L 692.33 701.88 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"22\">\u003Cg>\u003Cpath d=\"M 632 780 C 630.9 780 630 779.1 630 778 L 630 712 C 630 710.9 630.9 710 632 710 L 748 710 C 749.1 710 750 710.9 750 712 L 750 778 C 750 779.1 749.1 780 748 780 Z\" fill=\"#0079d6\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 668.7 769.51 L 668.7 735.31 C 669.05 732.8 670.98 730.81 673.48 730.39 L 702.5 730.39 L 711.3 739.11 L 711.3 769.51 C 711 772.17 708.91 774.28 706.25 774.61 L 673.61 774.61 C 671.01 774.22 668.99 772.13 668.7 769.51 Z M 679.87 762.22 L 699.64 762.22 L 699.64 758.51 L 679.87 758.51 Z M 699.64 755.16 L 699.64 751.54 L 679.87 751.54 L 679.87 755.16 Z M 679.87 748.19 L 699.64 748.19 L 699.64 744.61 L 679.87 744.61 Z M 700.57 741.26 L 707.82 741.26 L 700.57 733.74 Z M 631 726 L 631 778 C 631 778.55 631.45 779 
2748632 779 L 748 779 C 748.55 779 749 778.55 749 778 L 749 726 Z\" fill-opacity=\"0.5\" fill=\"#ffffff\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 711px; margin-left: 631px;\">\u003Cdiv data-drawio-colors=\"color: #FFFFFF; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">team\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"690\" y=\"723\" fill=\"#FFFFFF\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">team\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"24\">\u003Cg>\u003Cpath d=\"M 62 780 C 60.9 780 60 779.1 60 778 L 60 712 C 60 710.9 60.9 710 62 710 L 178 710 C 179.1 710 180 710.9 180 712 L 180 778 C 180 779.1 179.1 780 178 780 Z\" fill=\"#0079d6\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 98.7 769.51 L 98.7 735.31 C 99.05 732.8 100.98 730.81 103.48 730.39 L 132.5 730.39 L 141.3 739.11 L 141.3 769.51 C 141 772.17 138.91 774.28 136.25 774.61 L 103.61 774.61 C 101.01 774.22 98.99 772.13 98.7 769.51 Z M 109.87 762.22 L 129.64 762.22 L 129.64 758.51 L 109.87 758.51 Z M 129.64 755.16 L 129.64 751.54 L 109.87 751.54 L 109.87 755.16 Z M 109.87 748.19 L 129.64 748.19 L 129.64 744.61 L 109.87 744.61 Z M 130.57 741.26 L 137.82 741.26 L 130.57 733.74 Z M 61 726 L 61 778 C 61 778.55 61.45 779 62 779 L 178 779 C 178.55 779 179 778.55 179 778 L 179 726 Z\" fill-opacity=\"0.5\" fill=\"#ffffff\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 711px; margin-left: 61px;\">\u003Cdiv data-drawio-colors=\"color: #FFFFFF; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">news\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"120\" y=\"723\" fill=\"#FFFFFF\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">news\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"50\">\u003Cg>\u003Cpath d=\"M 510 555 L 460.37 555\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003Cpath d=\"M 455.12 555 L 462.12 551.5 L 460.37 555 L 462.12 558.5 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"33\">\u003Cg>\u003Cpath d=\"M 512 590 C 510.9 590 510 589.1 510 588 L 510 522 C 510 520.9 510.9 520 512 520 L 628 520 C 629.1 520 630 520.9 630 522 L 630 588 C 630 589.1 629.1 590 628 590 Z\" fill=\"#0079d6\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 548.7 579.51 L 548.7 545.31 C 549.05 542.8 550.98 540.81 553.48 540.39 L 582.5 540.39 L 591.3 549.11 L 591.3 579.51 C 591 582.17 588.91 584.28 586.25 584.61 L 553.61 584.61 C 551.01 584.22 548.99 582.13 548.7 579.51 Z M 559.87 572.22 L 579.64 572.22 L 579.64 568.51 L 559.87 568.51 Z M 579.64 565.16 L 579.64 561.54 L 559.87 561.54 L 559.87 565.16 Z M 559.87 558.19 L 579.64 558.19 L 579.64 554.61 L 559.87 554.61 Z M 580.57 551.26 L 587.82 551.26 L 580.57 543.74 Z M 511 536 L 511 588 C 511 588.55 511.45 589 512 589 L 628 589 C 628.55 589 629 588.55 629 588 L 629 536 Z\" fill-opacity=\"0.5\" fill=\"#ffffff\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 521px; margin-left: 511px;\">\u003Cdiv data-drawio-colors=\"color: #FFFFFF; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">footer\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"570\" y=\"533\" fill=\"#FFFFFF\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">footer\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"44\">\u003Cg>\u003Cpath d=\"M 230 520 L 230 500 L 260 500 L 260 466.37\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003Cpath d=\"M 260 461.12 L 263.5 468.12 L 260 466.37 L 256.5 468.12 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"49\">\u003Cg>\u003Cpath d=\"M 290 555 L 327.63 555\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003Cpath d=\"M 332.88 555 L 325.88 558.5 L 327.63 555 L 325.88 551.5 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"35\">\u003Cg>\u003Cpath d=\"M 172 590 C 170.9 590 170 589.1 170 588 L 170 522 C 170 520.9 170.9 520 172 520 L 288 520 C 289.1 520 290 520.9 290 522 L 290 588 C 290 589.1 289.1 590 288 590 Z\" fill=\"#0079d6\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 208.7 579.51 L 208.7 545.31 C 209.05 542.8 210.98 540.81 213.48 540.39 L 242.5 540.39 L 251.3 549.11 L 251.3 579.51 C 251 582.17 248.91 584.28 246.25 584.61 L 213.61 584.61 C 211.01 584.22 208.99 582.13 208.7 579.51 Z M 219.87 572.22 L 239.64 572.22 L 239.64 568.51 L 219.87 568.51 Z M 239.64 565.16 L 239.64 561.54 L 219.87 561.54 L 219.87 565.16 Z M 219.87 558.19 L 239.64 558.19 L 239.64 554.61 L 219.87 554.61 Z M 240.57 551.26 L 247.82 551.26 L 240.57 543.74 Z M 171 536 L 171 588 C 171 588.55 171.45 589 172 589 L 288 589 C 288.55 589 289 588.55 289 588 L 289 536 Z\" fill-opacity=\"0.5\" fill=\"#ffffff\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 521px; margin-left: 171px;\">\u003Cdiv data-drawio-colors=\"color: #FFFFFF; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">header\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"230\" y=\"533\" fill=\"#FFFFFF\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">header\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"36\">\u003Cg>\u003Cpath d=\"M 472 890 C 470.9 890 470 889.1 470 888 L 470 822 C 470 820.9 470.9 820 472 820 L 588 820 C 589.1 820 590 820.9 590 822 L 590 888 C 590 889.1 589.1 890 588 890 Z\" fill=\"#0079d6\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 507.01 844.13 C 507.35 841.24 509.65 838.96 512.55 838.64 L 543.45 838.64 L 552.99 848.14 L 552.99 880.43 C 552.83 883.61 550.31 886.16 547.14 886.36 L 512.55 886.36 C 509.69 886.06 507.41 883.85 507.01 881 Z M 510.77 880.14 C 510.77 881.29 511.57 882.27 512.7 882.5 L 547.21 882.5 C 548.31 882.26 549.09 881.27 549.09 880.14 L 549.09 850.35 L 541.38 850.35 L 541.38 842.54 L 512.7 842.54 C 511.66 842.8 510.92 843.7 510.86 844.76 Z M 519.06 853.92 L 540.36 853.92 L 540.36 857.87 
2748L 519.06 857.87 Z M 519.06 861.44 L 540.36 861.44 L 540.36 865.39 L 519.06 865.39 Z M 519.06 868.96 L 540.36 868.96 L 540.36 872.96 L 519.06 872.96 Z M 471 836 L 471 888 C 471 888.55 471.45 889 472 889 L 588 889 C 588.55 889 589 888.55 589 888 L 589 836 Z\" fill-opacity=\"0.5\" fill=\"#ffffff\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 821px; margin-left: 471px;\">\u003Cdiv data-drawio-colors=\"color: #FFFFFF; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">catalogue\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"530\" y=\"833\" fill=\"#FFFFFF\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">catalogue\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"38\">\u003Cg>\u003Cpath d=\"M 202 890 C 200.9 890 200 889.1 200 888 L 200 822 C 200 820.9 200.9 820 202 820 L 318 820 C 319.1 820 320 820.9 320 822 L 320 888 C 320 889.1 319.1 890 318 890 Z\" fill=\"#0079d6\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 237.01 844.13 C 237.35 841.24 239.65 838.96 242.55 838.64 L 273.45 838.64 L 282.99 848.14 L 282.99 880.43 C 282.83 883.61 280.31 886.16 277.14 886.36 L 242.55 886.36 C 239.69 886.06 237.41 883.85 237.01 881 Z M 240.77 880.14 C 240.77 881.29 241.57 882.27 242.7 882.5 L 277.21 882.5 C 278.31 882.26 279.09 881.27 279.09 880.14 L 279.09 850.35 L 271.38 850.35 L 271.38 842.54 L 242.7 842.54 C 241.66 842.8 240.92 843.7 240.86 844.76 Z M 249.06 853.92 L 270.36 853.92 L 270.36 857.87 L 249.06 857.87 Z M 249.06 861.44 L 270.36 861.44 L 270.36 865.39 L 249.06 865.39 Z M 249.06 868.96 L 270.36 868.96 L 270.36 872.96 L 249.06 872.96 Z M 201 836 L 201 888 C 201 888.55 201.45 889 202 889 L 318 889 C 318.55 889 319 888.55 319 888 L 319 836 Z\" fill-opacity=\"0.5\" fill=\"#ffffff\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 821px; margin-left: 201px;\">\u003Cdiv data-drawio-colors=\"color: #FFFFFF; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">card\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"260\" y=\"833\" fill=\"#FFFFFF\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">card\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"48\">\u003Cg>\u003Cpath d=\"M 120 555 L 163.63 555\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003Cpath d=\"M 168.88 555 L 161.88 558.5 L 163.63 555 L 161.88 551.5 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"40\">\u003Cg>\u003Crect x=\"0\" y=\"517.5\" width=\"120\" height=\"75\" fill=\"rgb(255, 255, 255)\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 555px; margin-left: 1px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Cb>css\u003C/b>\u003Cdiv>reset.css\u003C/div>\u003Cdiv>font.css\u003C/div>\u003Cdiv>styles.css\u003C/div>\u003Cdiv>rsms/me/inter.css\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"60\" y=\"559\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">css...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"43\">\u003Cg>\u003Cpath d=\"M 72 460 C 70.9 460 70 459.1 70 458 L 70 392 C 70 390.9 70.9 390 72 390 L 188 390 C 189.1 390 190 390.9 190 392 L 190 458 C 190 459.1 189.1 460 188 460 Z\" fill=\"#0079d6\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 108.7 449.51 L 108.7 415.31 C 109.05 412.8 110.98 410.81 113.48 410.39 L 142.5 410.39 L 151.3 419.11 L 151.3 449.51 C 151 452.17 148.91 454.28 146.25 454.61 L 113.61 454.61 C 111.01 454.22 108.99 452.13 108.7 449.51 Z M 119.87 442.22 L 139.64 442.22 L 139.64 438.51 L 119.87 438.51 Z M 139.64 435.16 L 139.64 431.54 L 119.87 431.54 L 119.87 435.16 Z M 119.87 428.19 L 139.64 428.19 L 139.64 424.61 L 119.87 424.61 Z M 140.57 421.26 L 147.82 421.26 L 140.57 413.74 Z M 71 406 L 71 458 C 71 458.55 71.45 459 72 459 L 188 459 C 188.55 459 189 458.55 189 458 L 189 406 Z\" fill-opacity=\"0.5\" fill=\"#ffffff\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 391px; margin-left: 71px;\">\u003Cdiv data-drawio-colors=\"color: #FFFFFF; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">connexion\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"130\" y=\"403\" fill=\"#FFFFFF\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">connexion\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"45\">\u003Cg>\u003Cpath d=\"M 202 460 C 200.9 460 200 459.1 200 458 L 200 392 C 200 390.9 200.9 390 202 390 L 318 390 C 319.1 390 320 390.9 320 392 L 320 458 C 320 459.1 319.1 460 318 460 Z\" fill=\"#0079d6\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 238.7 449.51 L 238.7 415.31 C 239.05 412.8 240.98 410.81 243.48 410.39 L 272.5 410.39 L 281.3 419.11 L 281.3 449.51 C 281 452.17 278.91 454.28 276.25 454.61 L 243.61 454.61 C 241.01 454.22 238.99 452.13 238.7 449.51 Z M 249.87 442.22 L 269.64 442.22 L 269.64 438.51 L 249.87 438.51 Z M 269.64 435.16 L 269.64 431.54 L 249.87 431.54 L 249.87 435.16 Z M 249.87 428.19 L 269.64 428.19 L 269.64 424.61 L 249.87 424.61 Z M 270.57 421.26 L 277.82 421.26 L 270.57 413.74 Z M 201 406 L 201 458 C 201 458.55 201.45 459 202 459 L 318 459 C 318.55 459 319 458.55 319 458 L 319 406 Z\" fill-opacity=\"0.5\" fill=\"#ffffff\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 391px; margin-left: 201px;\">\u003Cdiv data-drawio-colors=\"color: #FFFFFF; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">inscription\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"260\" y=\"403\" fill=\"#FFFFFF\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">inscription\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"46\">\u003Cg>\u003Cpath d=\"M 230 520 L 230 500 L 130 500 L 130 466.37\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003Cpath d=\"M 130 461.12 L 133.5 468.12 L 130 466.37 L 126.5 468.12 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003C/g>\u003C/g>\u003C/g>\u003Cswitch>\u003Cg requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\"/>\u003Ca transform=\"translate(0,-5)\" xlink:href=\"https://www.drawio.com/doc/faq/svg-export-text-problems\" target=\"_blank\">\u003Ctext text-anchor=\"middle\" font-size=\"10px\" x=\"50%\" y=\"100%\">Text is not SVG - cannot display\u003C/text>\u003C/a>\u003C/switch>\u003C/svg>","type":"application/vnd.drawio","modified":"20241016190646859","title":"$:/dev/site/structure"},
2749{"created":"20240819072131658","text":"\u003Csvg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" width=\"601px\" height=\"156px\" viewBox=\"-0.5 -0.5 601 156\" content=\"&lt;mxfile host=&quot;embed.diagrams.net&quot; agent=&quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0&quot; version=&quot;24.7.5&quot;&gt;&lt;diagram id=&quot;xlQZc2XfuvkJPHCsGp33&quot; name=&quot;Page-1&quot;&gt;3ZjbjpswEIafhsuuAJdDLrNJepC2VdVU6vbSARdcAaaOSaBP33EyBFiTaqvNqb3Z9fweg+fzbwvHIrO8fitpmX4QMcss145ri8wt13Vc4sE/rTSo+KG9VxLJY9Q6Ycl/MRTbtIrHbD1IVEJkipdDMRJFwSI10KiUYjtM+y6y4VtLmjBDWEY0M9WvPFbpXvVC0unvGE9SfHPoBvuOnLa5WMg6pbHY9iSysMhMCqH2rbyesUzDa7Hsx7050nuYl2SFes4AnPCGZhWWNv30HoTPi+UXnKFq2qqlqIqY6ZG2Re63KVdsWdJI925hoUFLVZ5B5EATH8ykYvXRyTmHksErTORMyQZScIDrIyW0ySviobDtoDstyrQH3GkdRnGhk8PDOxjQQ
2749B5HYNoGHAMJi8EXGAqpUpGIgmaLTr0fQutyHoQoEdUPplSDJqeVEmMg9Yv+jBHmJSoZYRbWr6hMmOqttQlbsowqvhk+/SXcPNNTZanNL1YckDxFCP5Qw4ppxpMC2hEUyCQI2kUcdt8UO3Iexzu4Yx4cAj+BDQ8Oa23oToI7zzCiP+JDYp/AhuYevYYNAZZsHnH8Lvimg7vAa+N53e+dN4MV+Fv/+tfzr2/w/kg3PKGKVVIvOVv9Dx4eOUrP5mD3ph3snsfBwfUcHBi8H0TCI64/w/5555Lggs59fRvOrbl67LX7voWws60OXuba0HTt5EKudcyD9xqwT8bN8S4ELhzd7j8hcH2a611ZrNblrjQ/07s95htoJrqZWzNiTSeKw1bHXnhdL8FYgkvfAkj49ABwnnkL8E9wAkwMtvd0zfTddfcH7pd7gHAbvTYo3zauS2PfqWdD5Yx8+FdKajL2mskNj24Rkhuez00Qdlf5XV/vBxGy+A0=&lt;/diagram&gt;&lt;/mxfile&gt;\">\u003Cdefs/>\u003Cg>\u003Cg data-cell-id=\"0\">\u003Cg data-cell-id=\"1\">\u003Cg data-cell-id=\"3\">\u003Cg>\u003Crect x=\"140\" y=\"20\" width=\"120\" height=\"135\" fill=\"rgb(255, 255, 255)\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 88px; margin-left: 141px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">API REST\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"200\" y=\"91\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">API REST\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"10\">\u003Cg>\u003Cpath d=\"M 60 87.5 L 133.63 87.5\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003Cpath d=\"M 138.88 87.5 L 131.88 91 L 133.63 87.5 L 131.88 84 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"5\">\u003Cg>\u003Crect x=\"0\" y=\"72.5\" width=\"60\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 88px; margin-left: 1px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">App mobile\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"30\" y=\"91\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">App mobile\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"13\">\u003Cg>\u003Cpath d=\"M 60 135.06 L 100.06 135.06 L 100.06 121.29 L 133.63 121.26\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003Cpath d=\"M 138.88 121.25 L 131.89 124.76 L 133.63 121.26 L 131.88 117.76 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"6\">\u003Cg>\u003Crect x=\"0\" y=\"120\" width=\"60\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 135px; margin-left: 1px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Navigateur web\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"30\" y=\"139\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">Navigateur...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"12\">\u003Cg>\u003Cpath d=\"M 60 15.06 L 100.06 15.06 L 100.06 53.76 L 133.63 53.75\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>
2749\u003Cpath d=\"M 138.88 53.75 L 131.88 57.25 L 133.63 53.75 L 131.88 50.25 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"7\">\u003Cg>\u003Crect x=\"0\" y=\"0\" width=\"60\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 15px; margin-left: 1px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Logiciel\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"30\" y=\"19\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">Logiciel\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"14\">\u003Cg>\u003Cpath d=\"M 380 75 L 430.06 75.06 L 430.06 42.47 L 473.63 42.47\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003Cpath d=\"M 478.88 42.47 L 471.88 45.97 L 473.63 42.47 L 471.88 38.97 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"16\">\u003Cg>\u003Cpath d=\"M 380 90 L 430.06 90 L 430.06 120 L 473.63 120\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003Cpath d=\"M 478.88 120 L 471.88 123.5 L 473.63 120 L 471.88 116.5 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"8\">\u003Cg>\u003Crect x=\"260\" y=\"60\" width=\"120\" height=\"60\" fill=\"rgb(255, 255, 255)\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 90px; margin-left: 261px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Logique \u003Cdiv>métier\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"320\" y=\"94\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">Logique...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"9\">\u003Cg>\u003Crect x=\"480\" y=\"12.5\" width=\"120\" height=\"60\" fill=\"rgb(255, 255, 255)\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 43px; margin-left: 481px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Base de données\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"540\" y=\"46\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">Base de données\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"15\">\u003Cg>\u003Crect x=\"480\" y=\"90\" width=\"120\" height=\"60\" fill=\"rgb(255, 255, 255)\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 120px; margin-left: 481px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Autres services\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"540\" y=\"124\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">Autres services\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003C/g>\u003C/g>\u003C/g>\u003Cswitch>\u003Cg requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\"/>\u003Ca transform=\"translate(0,-5)\" xlink:href=\"https://www.drawio.com/doc/faq/svg-export-text-problems\" target=\"_blank\">\u003Ctext text-anchor=\"middle\" font-size=\"10px\" x=\"50%\" y=\"100%\">Text is not SVG - cannot display\u003C/text>\u003C/a>\u003C/switch>\u003C/svg>","type":"application/vnd.drawio","modified":"20240819073533493","title":"$:/diagram/API"},
2750{"created":"20240608165617705","text":"\u003Csvg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" width=\"582px\" height=\"1417px\" viewBox=\"-0.5 -0.5 582 1417\" content=\"&lt;mxfile host=&quot;embed.diagrams.net&quot; modified=&quot;2024-06-17T13:44:29.667Z&quot; agent=&quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0&quot; etag=&quot;FKIVDaLVN0uFGNCmR8hg&quot; version=&quot;24.5.2&quot; type=&quot;embed&quot;&gt;&lt;diagram id=&quot;LHFN1gbd5-IWM2yvykoU&quot; name=&quot;Page-1&quot;&gt;7Z1rk6M21oB/jT/GhRDXjzOe9O5bldRuZXZrk4+0re4mscGLcU/3++tX2AijCw3GkrpHczqpxGDAgI7Oo3PR0QKvdi9/q7L906/lhmwXvrd5WeAvC99HqU//2+x4Pe8II3Te8Vjlm/aYy46v+f+TdqfX7j3mG3LgDqzLclvne37nuiwKsq65fVlVld/4wx7KLf+r++yRSDu+rrOtvPc/+aZ+ap8iwZf9fyf541P7y4kfn7/YZezY9kEOT9mm/NbbhX9e4FVVlvX50+5lRbbNq2Ov5Xze3cC33X1VpKgVJ/z7QKp/3P/ZvBLf22b3tFVOB33OtvmBvlA/ynb7Bf5c3B+a/9HtLb3M503+3Nxr/do+f/TfY3ODnx/Kov7pcGqdT/QAFO1fzme139NPj83///6vX39h16L3crrc+Zvz/W7z4q/zjSx8fD7Y7z2V372Y7oEv9+LX5KW50lO9ax4G0Y/0YR4L+nlNXwKp6I5nUtU5bb1P7Re7fLNpTv/87Smvydd9tm6u9Y2KKt1XlcdiQzbttR7y7XZVbsvq9GP4IWz+aR+9t//8R/cf6qr8i/S+iU5/7RmtJKOoe/R+U7Wt19wteentah/9b6Tckbp6pYe03/p
2750RK3CvbLsVq28XoYzT866nnjyG7WFZ2w0euytfRIV+aN822+wJj1r62pt5zrZHwpqzFahT09d5Td8629Vr/15rqlqk17S0v+ybb+hrq/Ns+xu9max4PLVlXdJjv3jNj5GHuv14X9Z1uWtPrto30HyxL/OiPj1++Jn+S1/ICi1CegcruoXYFv2XF4GiLMgUCWO/20hTnRePq9OBfzQ/vmzE51Bk+3+V/2xugt0cWR+rQ/5MfiPnHnW6zexYl+1mc1BdEXJHlRW9Ym/Pr+XzZUdBvv28ocqKvdK41x9J98WlizY9t/u+oE30+hvZZnVeFj8rjqavp9s41LQRPjXadOByp5elPpcUm5lnHsjjrukx/RMbLPQOoS/ymXZg7gj+GuWxWpN/kiqnYk+qRtyaF9g/gb8ifdJHUo+cEH9R9f80xfjujvX/tlWQoA8CPfoAY8TpAxxI6iDxZHWAr1cHUt8PFH1f6NqkJ5ZDksZJVdfdOmnp9jApoO/Ou7R4qyPUrXvuUAMtef7yovqbLfKS17+femyQJO32uQd7J1XfbH956R385bXdGBaC5rDux9ujBxv+/CCtam+V6/n+OX3bvNc3paM6veZnfuyiauz21LNaukgVijmpQmHAX6J94eezBJHpbmOSFIUjBDkNFAAgABAAiBmABD7X1RN7AIncA8jbGGjREodXoUUFEPoc1evv/Y0/2ic5bVwudNpiV5qNndASdpiVwowbX5CyAezIFwoEfkXChdom1cCveIRf9FIZ8Av4Bfwywy+UjPIrNcSvxD1+9SjlC5SK4o9gAMV2SOSnKQ+QxJgBlEpSVGQ73um6IYd1le8bsbnsXC6XQBIgyQ9CEh2k4MeEClCgQOE510EKhKCTQyeHTm69k/s2O7nv8HiwNxZEM8eBk8Z8sTzkY8rTuPchEWQnnTbmo82SvfYOa/Xm4O8g4Xfan7lI2fmCc8eTSI7JVm3Qn/XFfN1nDAAGAAOAmQqYIBglTGIKMA5HXBlUjAMmVADGUlQ18AWvNDIDmFCM3vqaCSPHbEXCnCTy8ERIDZwBzgBnbueMyl2BTIHGwcjshwCNpThqkARLTwiL4GXK/U0izxw4yP5sZ2RnuhXcxee7kPyU+Lx+2zm1I3AoVo84rg7co5C/UCRcZyBuf7UJngr36+kdIY3mRT+RbANZATA6+iFHRxayArppEayDsxwAC2kBypRWkYASx3pdW4BPl+q1DGL/GpyctqTMsS7Cz8X3TY6EfJlLkxOZe+0VKtqL7bt1wIR5ccFzE8+ChL+QHxtLPJuUPjldzKZlLvaT4n8aTwp5O3XxLIE3Jy9+EBnCnr8M+UE3xvFy4khbdTn+WsicJKkSmfqjlfty8wqjFRitwGjFzmgFB/ZGK+wavc7/NStunhccDMwLPixWePEp3WVUZP97PM0/HpwjDOoF1Isj6qWvRHyVulmtosjzzKgXHKJlgr3LX8D7WEJZ2yD/jYHSTepGzoSTR63fmXtwuDF7Q2fUdzx7y3TGyHmasZXI1hbT8cYzaDBa9sTM46cmx940o2rGCBb7klTdldXuuM3yigBMACZOw0REhqSPmr64WmmCCQ6WCV+DJMaK4Wq4ZFkI2kesKuf6d46QIR8LmjU7VCEAwSpNb0KIbwchvuBAw4k5aMjpVF9560SX0bM5Nm+TvNSkeYPFoil/9Fh0lwfbB3AFuOprq7s7780B73Rchcky5K2dWGHtBKasnSmhoO8MVTOaiwNJYAkkqQASMRKjKdlS9N0FsVCvTzze448PsSdI1G2pB1gOC33elmtw6AHUAGoWHXp3d4lnzKEXKJP5mKYLQ5lwxvx5qvon3znhNEx661p/vsEV2eEkFjLuQjHOrIuTA4adNu7JQez/22WPt1e4DQfA10xt8HZn+m3yDLgH3APuNWWR7+4ucfO2aUM93ENJKFhzoa+w5jxTrHMxtX1WovpAEuEyvbZKaicteuNdiSUbU8z3irz5+V5CSnoYCBKrKfW9yyNj9mrytr0qHh96ernNHrPvhaXUy5sy/q0iNGK3bhpf7JoeTIojsBvYDexurJZ2SQMDNmuAkBg3VBqqplyxwY+QeNI14Gx0stdv3Oz0PC5VxIs40fD9dOkJF9VkiGLBAcuKzmoDmpyLsuCyqfPd4wKSqQE07oJmmlEYLMTk6tspE2PRQFQkNxpbEMPlxJTFbF9o1/iToIRVULKUfCK6Qs3lngSqUj59SGTHTV6KmNBj+fA/9JxvyMAPgTkElAJKmaBUpNYzI9N9tJhBDmakfAxGWcprEVyO0cQilXMYpZpg3EdH+0rAlgFK/IiU0AACoVBf5E0DgRZjZWzS93noB10burarXfvtYZ5yTniw0pWYHKTBm5MyFVPAY1OqwMW49tXl/sisJdWG535OG0l6ipGkpeh1iLE0k4vVsDewzqcc5xVGk/usAOAAcAA41yiTa4CD34q4xRbHnqGDsVgN9WVvRwdTsubRES6xgI4wMYYOVUTVEXGZ7rPSVFL2Ok8X82px4xNLmemR4OmKZ9aUFRaIjA0l1gnrKMd8ntzY4VH6nodLTkWth0fXvRnp6omgP27LzwjHQm+Hc/ohjEVhLOrwWHRG7tgVE9RSqUiIKlPf2PjS5SDXMgz8/qBh6XUr9Y45NpapzxcQZtVF5hQRHi06Mi5Q3NDVVvwMRUthAbaAmULXjizCphaO4MIXKwdrGl2Ecvps4IVv310i3V2AR9AbpFK/jfSmR4ZjUcUig7gDoNdl9F7tBtKK5lhWJIri+KZyJEOX54svg66qY4vXETIbwKgl4zz04mUS9UoQ8Gm3gRdPQurVRnYsASpAmgE1FhjPDvkGsl4AUS4jyiiCglBCkCoF0hiCHAx330oNWyFnlRVjZhHUcVK8B1xYsbBhuDQKeAt4AbwAXubixZOdj4pZYKacj5GDwe0b8cK0nnmjRFbgrZPMQFiahbUGdflDWTZ6D1Q5qHJ3Vfn7OrMCSdUHkUVV7/KE32UgxJlG0lP0+7KYgjWPjeBtX5axxbKjsVyEZp1gQAggBBBiDCHyeiaBIhVWWVRQC0OczlWQAiKx9YhIZCuxYCwiMi0/9urEAJXNgwUJvNFpNRay32U5pMsBo4BRFhmlWnPLFKLcjtknrGbte8XsI2sx+3QZ82sFTI3Tz6BGos0PyrdcWdVP5WNZZNtfyhMaGrH4k9T1a9s/G90q0OUdxW54aYDrZwwNShM3LyiSJSyO7UgYYn52IXxmwnRWRXH7g5LjFoYkMCRxfUjSG4KMrqs2vijJFUvWC9ZNJJfyNVWugF3XxeHIDbNHr1tyRkUJplKNU0Jck6+THs22MZJW/xNy5m82jWPVIKdPoRIoBBQCChmiUCB2b4tVc2JV+N8RDDUruQiTzLRYxbcSiqlb86tQi4IVG0sjiVUxQEfk6F2HMzG2IyxYEpbEnLCookVcwPh3GG/AeAPGG2bGG/ICdDi1aPiq4nDfOSlM6P3Qjt4PJL2fmtP7qhAMN29gs6nI4QDKH5S/w8rfrHLnK7B2CyHbyAKKx6IZTxV0beja0LV1jduCwN64LXEwYGFi3GYp/BCJ47YQmRu3qWYI9PX6HtQ6qHWH1fq7mutMeYtzAXs6PzKl81XRgX7HJzvo+dDzHe75Us/2vLs7beknYuQvVhQQMTaec3ja3w0Rm/H25UaAisrSTGmaHgFKq8Qm5vIUk9Fyw/Q9FrAiNMAAYDATBojPaY8tFvtInJ69lyKW9aEvCUQDJSxN6EskSoi1fTVSYmyK3T34f4EQQIi55gJPiEQR2jFmLDg8ee59jQVLs+ZSCQOiWOjKVk990agN3y5YiBLpjEBvvcJktBjuPZAJyARkmu2i5pMOEkUCu6k6uImDdXA/BpksVdNFnoQmcW0zfRYKs6AHSVDT1gESAAmABPNIEAgksFgRPXWwZO2HIAFTmsZJgCQShOZIoAxttxVvT3d1ERvWh5ovfjrrOqoJPBTsX07v9aIFohYZ5wvd93b0rY1G+CvywF2b+8Th53wt+jz34vXpvvO9RkAqIBWQ6rp4i5ApnaoypX1TrILguyFWWQq+I19iVWSOVXL0/ZecFIfmOV9oqxTkALofdL9Tur+fcumbZkEodmbkKQqwm6OB0/F3HCZ9Iiy9rpru9AC8Bmnok4NRgiOHpYA8CgVRQ+bStlI5IM/AkRcADgAHgEOruwt5Vo0Ih4PyFBviwh2YVbj9WNiwFMBHkYgNc3lcqRwv/1SsqwYWXlHudosVXnxKgR3ADmDHDelcXH9OYwU5sClyOBw0p+QQl+uYYXDQu61eO29Ws/FHf+NyodMWu5IN3lgKy8dDBvEIbuQqdPz0xTQVrtM28a15Z6ngzQ1ioUPclkLW1cwYzm0+UmjAAiIASOcBec0CIh79W600GVuRtO52kiqoaaq8DbXu3MXmTVGbsTbmojYKqHVNZrzKZeir5Uf7uu089djE3sFF24VJ/iw7Wx++lOkO/WV+c7LdHEgNAAOAOQwws4BiqwWxXs88dBbmcCLPwZQCI6ixlCGAIx41qWfMX4e8sen5VIDpSyAZaHfQ7qDdZ2r3uFmj1Lv88R6HWJUxYM4UcTBlwIi2txTVx7Gg7c0F9ZE3Ns3+oaygLhdoepc1/bs6ojCSVrJVVe4yNdEFeQ4H/t/ZD2Upmo8TARfmgvnIG5v9fiBbqt8BGAAMAIZJYAyaDsq0MXOOIgeD/8OtZ2p9aiU9LMXmuwUCRdPTAD2YZA7SY0seaZsDPYAeDtPDgmOJ69GqCirGgIAcDGvfaBx0UQJOvzNdaFy/s1/vkpkM6vexw
2750HBe7I9gHIB6d1m9v29aE5LUP/IU2cDm9L+DkeOP4U5iytU4MJAADHN1UxCSI0/16/78qeuqx/td3u/tbcGSTf68aIuVSOdU5Jx9JJxC76d3FpAHyOMUecySJYx4teDLVOkGtX2siOPNeVhxcKFf61jpMgh4rlhaHDhMPLUAmeCKHNTK1o0kgM4HnQ86f/KsQrbItrjcg4Uq8QipQo2OqHz2eVzld3MHu40pcwdvBoViMdJOqZoGRWecXrkUlXwhgThSVS1N0wWxJ/wOX3J+/PhY8wQNJEfl6OlP5QbwB/gD/M3Gn2IZLWN5WQy1LuFvRmvxBLK0HjZG8wg0R1f72hym/LsuK6rwH8si2/5SnlR105B/krp+bZ3Tja4TtP07CgqIhkI05FgqKdYXZ6foBr0oyN1xW+cNtE9VnavdJqszcIfC2ADGBtrGBpgfG6SKJAsUKgYHWtyhjBEwOLgQgO10igDyXMzmgUFTg6YGTT1VU0d8PoSqNr+qNpoYnpinqB2cWnlxSS6DcNH3SrLqaG94Jq8Pep3On7CI8lUOTqZY38eG8LylkJU3teC/wlmKl5Gwlmtsxs3pC3VokkSz29KXo3b78gC4A9wB7qZPD8LeMu3/ja9ME4TLAJkCoItRvB4ABf6d60pP4N+VEUDt/Ivfl39q2/n6AJ/goDdUD1QKJKaayccSPvsBu5MLr1GsQD+gn0P002HSITHFXVEvx1hkDjuc4j4dS9M4w2axcpxh2s54Ign7oW6ZA1bpyICrDsuuugU396nc14/0pe8XMP0J1Lu76t2ocYNSoUd7Vms2Yxe9eVY1v6UKar7PGwYIGZz1isdKqFHNn0M1f9D7Tut9q9NcfU8c2WGZA8bmuGLZT/0DYuDmHHMlICzVTPOFGvkIiUETnYCQfaDSjFWqa7mOD3QAOjhEB8MV0aLFO9LAwRJo9qemsqIDPA1s1UBjTXZZD3Oao+jaQEIoFFtDnu61WdgPiKxRZAv38bPPDodvZdXXDpAkDGACMN0GJk9RjUflsTJWN4HF9QFO2uHE2sc8nERflkFTJZAD0ZKpsslqInPirXI8NW3UcbKMX6f5ZV3XKo67e4oC4B3wDninyy2H8NLr/wns81XL2vgK9okabh77HI7Tvzf7LEXwAyxY9v7EyTZXG2ahaJgFug0zOT9AYtL6iaz/ui9frqNrlW3yEkAGIAOQaQMZS1tm6gArPIpINWtIj9XmcJ7Be5PLUgZCwCzvjlwGy6gGcgYClFEFsgBZPh5ZAqaAOr1g1x/ocurCMsVxny7UFo3eJEyzoXtmjZo6ltIa5PiSwby3YCCtgRr0zYbX63vk5UrykF2Wb3W4+Q4kq9ZPwDBgGDBMm3UUCH49rFiwVMkwcZb7PIZBwoUxTtlKuBDdbVhMxflu/HrsB5S213CFtvWp4QBLgCXAki7TKkJStoWvKMummhgqOmdmgSmEZAtTYGLtYx9MBpMtQjnZYpvdky2ofVD7oPanqv2Yr36FuumfNhapCB3OMbA3FYhNC+VVvqUcAyw4ZJHBQE0oJwEcyJbq66ZngtIHpQ9Kf6bSt7nGdehweN6i0letMRRaC88L8iNWDtOp9FWL0a3JvlY4iC5Vv9piAcX9Yb+4IgCyzvb1sSJDxwNjgDHAmKnTSuXZO53u54yLJVsaTXusI3SxfKZ91KhKDTC1bH45O5+XIamwqkbWRLILcpcXKtBkL5OZcqjJHoACQAGg3AaUVDBafEXYPFIYLVpIEsnOZiDJ1SRhE184kjCla9xoEeQHT1w0YBZIZMfm+on8BX4qUPmg8q8oWOnFA33WRqXiSFWTFnT+tTpfFZ1g+tG0zo8E+QkMrjYWqQpZzhKX73op0mlSEYWyVGiPWA309H8fSPWP+z8pSul555SBtrX6ZUcP6yo/ORmlsqOXFg97N9iKA6Ad0O4q2vFJ9y/kaqWn7bZpAz3ox1HEF0Pgp7KrMtM0RazoZk9DDCl7OSqxIQ9NRRQY34MScEgJaOjKQSxnlsZy9zWWZRQ5HAWYnlg6bVwWI9Vo3ZKv/yd/QMkbGK0zafvBR+uELcaG2MYf/Y2BZdgmjvFThSzF2r190/WAPPMpO7wWa2A2MBuYLTM75JWxTWQzLdHP9KzWpw+XBrl8gv4L/Rf6Lz+bi0/R67ImrPReh4OlugfcKkeogUGSesDdVY9spQRrG3DTzaos6/7hVA8//VpuGm/rz/8D&lt;/diagram&gt;&lt;/mxfile&gt;\">\u003Cdefs/>\u003Cg>\u003Ca xlink:href=\"#HTML\">\u003Cg>\u003Crect x=\"261\" y=\"236\" width=\"79\" height=\"50\" rx=\"7.5\" ry=\"7.5\" fill=\"#f5f5f5\" stroke=\"#666666\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 77px; height: 1px; padding-top: 261px; margin-left: 262px;\">\u003Cdiv data-drawio-colors=\"color: #333333; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 16px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Balises \u003Cdiv style=\"font-size: 16px;\">HTML\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"301\" y=\"266\" fill=\"#333333\" font-family=\"Helvetica\" font-size=\"16px\" text-anchor=\"middle\">Balises...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/a>\u003Cg>\u003Crect x=\"329\" y=\"10\" width=\"80\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 329 10 M 409 10 M 409 40 L 329 40\" fill=\"none\" stroke=\"#9933ff\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 37px; margin-left: 330px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">&lt;title&gt;\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"369\" y=\"37\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\">&lt;title&gt;\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 301.92 166.99 Q 311.92 166.99 315.46 103.5 Q 319 40 329 40\" fill=\"none\" stroke=\"#9933ff\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"340\" y=\"60\" width=\"80\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 340 60 M 420 60 M 420 90 L 340 90\" fill=\"none\" stroke=\"#9933ff\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 87px; margin-left: 341px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">&lt;link&gt;
2750\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"380\" y=\"87\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\">&lt;link&gt;\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 300.75 166.99 Q 310.75 166.99 320.38 128.5 Q 330 90 340 90\" fill=\"none\" stroke=\"#9933ff\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"180\" y=\"60\" width=\"90\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 180 60 M 270 60 M 270 90 L 180 90\" fill=\"none\" stroke=\"#9933ff\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 87px; margin-left: 181px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">&lt;meta&gt;\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"225\" y=\"87\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\">&lt;meta&gt;\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 296.25 168.01 Q 286.25 168.01 283.13 129 Q 280 90 270 90\" fill=\"none\" stroke=\"#9933ff\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"15\" y=\"60\" width=\"149\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 15 60 M 164 60 M 164 90 L 15 90\" fill=\"none\" stroke=\"#9933ff\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 147px; height: 1px; padding-top: 87px; margin-left: 16px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">name=\"description\"...\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"90\" y=\"87\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">name=\"description\"...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Crect x=\"15\" y=\"0\" width=\"149\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 15 0 M 164 0 M 164 30 L 15 30\" fill=\"none\" stroke=\"#9933ff\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 147px; height: 1px; padding-top: 27px; margin-left: 16px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">name=\"description\"...\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"90\" y=\"27\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">name=\"description\"...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 180 90 Q 170 90 170 75 Q 170 60 172 60 Q 174 60 174 45 Q 174 30 164 30\" fill=\"none\" stroke=\"#9933ff\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"445\" y=\"0\" width=\"89\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 445 0 M 534 0 M 534 30 L 445 30\" fill=\"none\" stroke=\"#9933ff\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 87px; height: 1px; padding-top: 27px; margin-left: 446px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">rel=\"icon\"\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"490\" y=\"27\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">rel=\"icon\"\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 420 90 Q 430 90 432.5 60 Q 435 30 445 30\" fill=\"none\" stroke=\"#9933ff\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"445\" y=\"60\" width=\"119\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 445 60 M 564 60 M 564 90 L 445 90\" fill=\"none\" stroke=\"#9933ff\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 117px; height: 1px; padding-top: 87px; margin-left: 446px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">rel=\"stylesheet\"\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"505\" y=\"87\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">rel=\"stylesheet\"\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 420 90 Q 430 90 432.5 90 Q 435 90 445 90\" fill=\"none\" stroke=\"#9933ff\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Cpath d=\"M 180 90 Q 170 90 172 90 Q 174 90 164 90\" fill=\"none\" stroke=\"#9933ff\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"258\" y=\"166\" width=\"90\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 258 166 M 348 166 M 348 196 L 258 196\" fill=\"none\" stroke=\"#9933ff\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 193px; margin-left: 259px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">&lt;head&gt;\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"303\" y=\"193\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\">&lt;head&gt;\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 300.5 236 L 300.48 196\" fill=\"none\" stroke=\"#9933ff\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Cpath d=\"M 300.52 313.99 L 300 286\" fill=\"none\" stroke=\"#9933ff\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"258\" y=\"316\" width=\"90\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 258 316 M 348 316 M 348 346 L 258 346\" fill=\"none\" stroke=\"#9933ff\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 343px; margin-left: 259px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">&lt;body&gt;
2750\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"303\" y=\"343\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\">&lt;body&gt;\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Crect x=\"349.83\" y=\"626\" width=\"120\" height=\"50\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 349.83 626 M 469.83 626 M 469.83 676 L 349.83 676\" fill=\"none\" stroke=\"#cc6600\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 673px; margin-left: 351px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; overflow-wrap: normal;\">Sans \u003Cdiv style=\"font-size: 14px;\">sémantiques\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"410\" y=\"673\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-style=\"italic\">Sans...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 294.99 345.01 Q 304.99 345.01 322.41 510.51 Q 339.83 676 350 676\" fill=\"none\" stroke=\"#cc6600\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"332.83\" y=\"706\" width=\"95.17\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 332.83 706 M 428 706 M 428 736 L 332.83 736\" fill=\"none\" stroke=\"#0000cc\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 93px; height: 1px; padding-top: 733px; margin-left: 334px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; overflow-wrap: normal;\">Formulaire\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"380\" y=\"733\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-style=\"italic\">Formulaire\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 301.02 346.99 Q 311.02 346.99 316.92 541.49 Q 322.83 736 333 736\" fill=\"none\" stroke=\"#004c99\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"56.5\" y=\"646\" width=\"140\" height=\"50\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 56.5 646 M 196.5 646 M 196.5 696 L 56.5 696\" fill=\"none\" stroke=\"#00ff00\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 138px; height: 1px; padding-top: 693px; margin-left: 58px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; overflow-wrap: normal;\">Sémantique\u003Cdiv style=\"font-size: 14px;\">du texte en ligne\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"127\" y=\"693\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-style=\"italic\">Sémantique...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 288 346 Q 298 346 298 521 Q 298 696 197 696\" fill=\"none\" stroke=\"#00ff00\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"33\" y=\"331\" width=\"120\" height=\"50\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 33 331 M 153 331 M 153 381 L 33 381\" fill=\"none\" stroke=\"#ff8000\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 378px; margin-left: 34px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; overflow-wrap: normal;\">Blocs \u003Cdiv style=\"font-size: 14px;\">sémantiques\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"93\" y=\"378\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-style=\"italic\">Blocs...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 258 346 Q 248 346 205.5 363.5 Q 163 381 153 381\" fill=\"none\" stroke=\"#ff8000\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"183.5\" y=\"496\" width=\"100\" height=\"50\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 183.5 496 M 283.5 496 M 283.5 546 L 183.5 546\" fill=\"none\" stroke=\"#33ffff\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 543px; margin-left: 185px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 15px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; overflow-wrap: normal;\">Images \u003Cdiv style=\"font-size: 15px;\">et média\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"234\" y=\"543\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"15px\" text-anchor=\"middle\" font-style=\"italic\">Images...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 303 343.99 Q 293 343.99 293 394.49 Q 293 444.99 293.25 495.5 Q 293.5 546 283.5 546\" fill=\"none\" stroke=\"#33ffff\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"409.83\" y=\"331\" width=\"140\" height=\"50\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 409.83 331 M 549.83 331 M 549.83 381 L 409.83 381\" fill=\"none\" stroke=\"#ff3333\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 138px; height: 1px; padding-top: 378px; margin-left: 411px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; overflow-wrap: normal;\">Sectionnement \u003Cdiv style=\"font-size: 14px;\">de contenu\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"480\" y=\"378\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-style=\"italic\">Sectionnement...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 348 346 Q 358 346 378.91 363.5 Q 399.83 381 410 381\" fill=\"none\" stroke=\"#ff3333\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"71.5\" y=\"526\" width=\"80\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 71.5 526 M 151.5 526 M 151.5 556 L 71.5 556\" fill=\"none\" stroke=\"#33ffff\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 553px; margin-left: 73px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">&lt;img&gt;\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"112\" y=\"553\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\">&lt;img&gt;\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 183.5 546 Q 173.5 546 167.5 551 Q 161.5 556 152 556\" fill=\"none\" stroke=\"#33ffff\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"74\" y=\"556\" width=\"90\" height=\"50\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 74 556 M 164 556 M 164 606 L 74 606\" fill=\"none\" stroke=\"#33ffff\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 603px; margin-left: 75px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">&lt;audio&gt;\u003Cdiv style=\"font-size: 14px;\">&lt;video&gt;\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"119\" y=\"603\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\">&lt;audio&gt;...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 183.5 546 Q 173.5 546 173.5 561 Q 173.5 576 173.75 591 Q 174 606 164 606\" fill=\"none\" stroke=\"#33ffff\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"15\" y=\"576\" width=\"90\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 15 576 M 105 576 M 105 606 L 15 606\" fill=\"none\" stroke=\"#33ffff\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 603px; margin-left: 16px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">&lt;source&gt;\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"60\" y=\"603\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">&lt;source&gt;\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Crect x=\"492.83\" y=\"616\" width=\"70\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 492.83 616 M 562.83 616 M 562.83 646 L 492.83 646\" fill=\"none\" stroke=\"#994c00\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 643px; margin-left: 494px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">&lt;div&gt;\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"528\" y=\"643\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\">&lt;div&gt;\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 469.83 676 Q 479.83 676 481.33 661 Q 482.83 646 492.83 646\" fill=\"none\" stroke=\"#cc6600\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"491\" y=\"676\" width=\"90\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 491 676 M 581 676 M 581 706 L 491 706\" fill=\"none\" stroke=\"#cc6600\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items
2750: unsafe flex-end; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 703px; margin-left: 492px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">&lt;span&gt;\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"536\" y=\"703\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\">&lt;span&gt;\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 469.83 676 Q 479.83 676 480.41 691 Q 481 706 491 706\" fill=\"none\" stroke=\"#cc6600\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Cpath d=\"M 74 606 Q 84 606 89.5 606 Q 95 606 105 606\" fill=\"none\" stroke=\"#33ffff\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"392.83\" y=\"496\" width=\"90\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 392.83 496 M 482.83 496 M 482.83 526 L 392.83 526\" fill=\"none\" stroke=\"#ff3333\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 523px; margin-left: 394px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">&lt;section&gt;\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"438\" y=\"523\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">&lt;section&gt;\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 514.87 382 Q 524.87 382 524.87 454.49 Q 524.87 526.99 475.81 526.99\" fill=\"none\" stroke=\"#ff3333\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"369.83\" y=\"466\" width=\"80\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 369.83 466 M 449.83 466 M 449.83 496 L 369.83 496\" fill=\"none\" stroke=\"#ff3333\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 493px; margin-left: 371px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">&lt;nav&gt;\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"410\" y=\"493\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\">&lt;nav&gt;\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 505.87 383 Q 515.87 383 515.87 439.5 Q 515.87 496 450 496\" fill=\"none\" stroke=\"#ff3333\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"449.83\" y=\"556\" width=\"80\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 449.83 556 M 529.83 556 M 529.83 586 L 449.83 586\" fill=\"none\" stroke=\"#ff3333\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 583px; margin-left: 451px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">&lt;aside&gt;\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"490\" y=\"583\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">&lt;aside&gt;\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 509.83 380 Q 539.83 380 539.83 483 Q 539.83 586 530 586\" fill=\"none\" stroke=\"#ff3333\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"402.83\" y=\"526\" width=\"90\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 402.83 526 M 492.83 526 M 492.83 556 L 402.83 556\" fill=\"none\" stroke=\"#ff3333\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 553px; margin-left: 404px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">&lt;article&gt;\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"448\" y=\"553\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">&lt;article&gt;\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 507.83 381 Q 517.83 381 517.83 468.5 Q 517.83 556 493 556\" fill=\"none\" stroke=\"#ff3333\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"342.83\" y=\"436\" width=\"90\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 342.83 436 M 432.83 436 M 432.83 466 L 342.83 466\" fill=\"none\" stroke=\"#ff3333\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 463px; margin-left: 344px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">&lt;footer&gt;\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"388\" y=\"463\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\">&lt;footer&gt;\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 502.87 385 Q 512.87 385 512.87 425.5 Q 512.87 466 433 466\" fill=\"none\" stroke=\"#ff3333\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"332.83\" y=\"376\" width=\"100\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 332.83 376 M 432.83 376 M 432.83 406 L 332.83 406\" fill=\"none\" stroke=\"#ff3333\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 403px; margin-left: 334px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">&lt;header&gt;\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"383\" y=\"403\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\">&lt;header&gt;\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 505.87 384 Q 515.87 384 515.87 395 Q 515.87 406 433 406\" fill=\"none\" stroke=\"#ff3333\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"332.83\" y=\"406\" width=\"90\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 332.83 406 M 422.83 406 M 422.83 436 L 332.83 436\" fill=\"none\" stroke=\"#ff3333\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 433px; margin-left: 334px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">&lt;main&gt;\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"378\" y=\"433\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\">&lt;main&gt;\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 507.79 383 Q 517.79 383 517.79 409.5 Q 517.79 436 423 436\" fill=\"none\" stroke=\"#ff3333\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Cpath d=\"M 153 381 Q 143 381 132.5 448.5 Q 122 516 112 516\" fill=\"none\" stroke=\"#ff8000\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"23\" y=\"441\" width=\"70\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 23 441 M 93 441 M 93 471 L 23 471\" fill=\"none\" stroke=\"#ff8000\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 468px; margin-left: 24px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">&lt;ul&gt;\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"58\" y=\"468\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\">&lt;ul&gt;\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 153 381 Q 143 381 123 426 Q 103 471 93 471\" fill=\"none\" stroke=\"#ff8000\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"2.5\" y=\"416\" width=\"70\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 2.5 416 M 72.5 416 M 72.5 446 L 2.5 446\" fill=\"none\" stroke=\"#ff8000\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 443px; margin-left: 4px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">&lt;ol&gt;\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"38\" y=\"443\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\">&lt;ol&gt;\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 144.84 383.5 Q 134.84 383.5 108.67 414.75 Q 82.5 446 73 446\" fill=\"none\" stroke=\"#ff8000\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Cpath d=\"M 153 381 Q 143 381 120.5 396 Q 98 411 88 411\" fill=\"none\" stroke=\"#ff8000\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"183.5\" y=\"371\" width=\"70\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 183.5 371 M 253.5 371 M 253.5 401 L 183.5 401\" fill=\"none\" stroke=\"#ff8000\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 398px; margin-left: 185px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">&lt;hX&gt;
2750\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"219\" y=\"398\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\">&lt;hX&gt;\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 153 381 Q 163 381 168.25 391 Q 173.5 401 184 401\" fill=\"none\" stroke=\"#ff8000\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"12\" y=\"486\" width=\"100\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 12 486 M 112 486 M 112 516 L 12 516\" fill=\"none\" stroke=\"#ff8000\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 513px; margin-left: 13px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">&lt;address&gt;\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"62\" y=\"513\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">&lt;address&gt;\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Crect x=\"183.5\" y=\"421\" width=\"70\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 183.5 421 M 253.5 421 M 253.5 451 L 183.5 451\" fill=\"none\" stroke=\"#ff8000\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 448px; margin-left: 185px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">&lt;hr&gt;\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"219\" y=\"448\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">&lt;hr&gt;\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 153 381 Q 163 381 168.25 416 Q 173.5 451 184 451\" fill=\"none\" stroke=\"#ff8000\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"28\" y=\"381\" width=\"60\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 28 381 M 88 381 M 88 411 L 28 411\" fill=\"none\" stroke=\"#ff8000\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 408px; margin-left: 29px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">&lt;p&gt;\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"58\" y=\"408\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\">&lt;p&gt;\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Crect x=\"22.5\" y=\"756\" width=\"70\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 22.5 756 M 92.5 756 M 92.5 786 L 22.5 786\" fill=\"none\" stroke=\"#00ff00\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 783px; margin-left: 24px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">&lt;em&gt;\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"58\" y=\"783\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">&lt;em&gt;\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 196.5 696 Q 186.5 696 144.5 741 Q 102.5 786 93 786\" fill=\"none\" stroke=\"#00ff00\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"17\" y=\"726\" width=\"90\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 17 726 M 107 726 M 107 756 L 17 756\" fill=\"none\" stroke=\"#00ff00\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 753px; margin-left: 18px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">&lt;strong&gt;\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"62\" y=\"753\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">&lt;strong&gt;\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 184.6 698.5 Q 174.6 698.5 145.8 727.25 Q 117 756 107 756\" fill=\"none\" stroke=\"#00ff00\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"27\" y=\"786\" width=\"70\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 27 786 M 97 786 M 97 816 L 27 816\" fill=\"none\" stroke=\"#00ff00\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 68px; height: 1px;
2750 padding-top: 813px; margin-left: 28px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">&lt;br&gt;\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"62\" y=\"813\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">&lt;br&gt;\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 196.5 696 Q 186.5 696 146.75 756 Q 107 816 97 816\" fill=\"none\" stroke=\"#00ff00\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"32\" y=\"816\" width=\"80\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 32 816 M 112 816 M 112 846 L 32 846\" fill=\"none\" stroke=\"#00ff00\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 843px; margin-left: 33px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">&lt;abbr&gt;\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"72\" y=\"843\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">&lt;abbr&gt;\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 196.5 696 Q 186.5 696 154.25 771 Q 122 846 112 846\" fill=\"none\" stroke=\"#00ff00\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"42\" y=\"856\" width=\"80\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 42 856 M 122 856 M 122 886 L 42 886\" fill=\"none\" stroke=\"#00ff00\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 883px; margin-left: 43px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">&lt;time&gt;\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"82\" y=\"883\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">&lt;time&gt;\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 196.5 696 Q 186.5 696 159.25 791 Q 132 886 122 886\" fill=\"none\" stroke=\"#00ff00\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"112\" y=\"886\" width=\"120\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 112 886 M 232 886 M 232 916 L 112 916\" fill=\"none\" stroke=\"#00ff00\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 913px; margin-left: 113px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Cfont style=\"font-size: 14px;\">\u003Cb>&lt;a href=\"\"&gt;\u003C/b>\u003C/font>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"172\" y=\"913\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">&lt;a href=\"\"&gt;\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 196.5 696 Q 242 696 242 806 Q 242 916 232 916\" fill=\"none\" stroke=\"#00ff00\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"51.5\" y=\"1036\" width=\"120\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 51.5 1036 M 171.5 1036 M 171.5 1066 L 51.5 1066\" fill=\"none\" stroke=\"#00ff00\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 1063px; margin-left: 53px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; overflow-wrap: normal;\">Liens externes\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"112\" y=\"1063\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\" font-style=\"italic\">Liens externes\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 154.96 918.01 Q 181.5 918.01 181.5 992.01 Q 181.5 1066 171 1066\" fill=\"none\" stroke=\"#00ff00\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"42\" y=\"986\" width=\"120\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 42 986 M 162 986 M 162 1016 L 42 1016\" fill=\"none\" stroke=\"#00ff00\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 1013px; margin-left: 43px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; overflow-wrap: normal;\">Liens internes\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"102\" y=\"1013\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\" font-style=\"italic\">Liens internes\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 153.04 919.99 Q 172 919.99 172 967.99 Q 172 1016 162 1016\" fill=\"none\" stroke=\"#00ff00\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"0\" y=\"946\" width=\"130\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 0 946 M 130 946 M 130 976 L 0 976\" fill=\"none\" stroke=\"#00ff00\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 973px; margin-left: 1px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; overflow-wrap: normal;\">Ancres nommées\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"65\" y=\"973\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\" font-style=\"italic\">Ancres nommées\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 156.04 918.01 Q 146.04 918.01 143.02 947.01 Q 140 976 130 976\" fill=\"none\" stroke=\"#00ff00\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"459.83\" y=\"866\" width=\"100\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 459.83 866 M 559.83 866 M 559.83 896 L 459.83 896\" fill=\"none\" stroke=\"#0000cc\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 893px; margin-left: 461px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">&lt;button&gt;\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"510\" y=\"893\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\">&lt;button&gt;\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 428 736 Q 438 736 443.91 816 Q 449.83 896 460 896\" fill=\"none\" stroke=\"#0000cc\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"479\" y=\"773\" width=\"90\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 479 773 M 569 773 M 569 803 L 479 803\" fill=\"none\" stroke=\"#0000cc\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 800px; margin-left: 480px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">&lt;fieldset&gt;\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"524\" y=\"800\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">&lt;fieldset&gt;\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 428 736 Q 438 736 453.5 769.5 Q 469 803 479 803\" fill=\"none\" stroke=\"#0000cc\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"477.83\" y=\"736\" width=\"100\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 477.83 736 M 577.83 736 M 577.83 766 L 477.83 766\" fill=\"none\" stroke=\"#0000cc\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 763px; margin-left: 479px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">&lt;textarea&gt;
2750\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"528\" y=\"763\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">&lt;textarea&gt;\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 428 736 Q 438 736 452.91 751 Q 467.83 766 478 766\" fill=\"none\" stroke=\"#0000cc\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"312.83\" y=\"756\" width=\"80\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 312.83 756 M 392.83 756 M 392.83 786 L 312.83 786\" fill=\"none\" stroke=\"#0000cc\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 783px; margin-left: 314px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">&lt;form&gt;\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"353\" y=\"783\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\">&lt;form&gt;\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 428 736 Q 418 736 410.41 761 Q 402.83 786 393 786\" fill=\"none\" stroke=\"#0000cc\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"312.83\" y=\"986\" width=\"90\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 312.83 986 M 402.83 986 M 402.83 1016 L 312.83 1016\" fill=\"none\" stroke=\"#0000cc\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 1013px; margin-left: 314px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">&lt;select&gt;\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"358\" y=\"1013\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\">&lt;select&gt;\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 428 736 Q 418 736 415.41 876 Q 412.83 1016 403 1016\" fill=\"none\" stroke=\"#0000cc\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"477.83\" y=\"816\" width=\"90\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 477.83 816 M 567.83 816 M 567.83 846 L 477.83 846\" fill=\"none\" stroke=\"#0000cc\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 843px; margin-left: 479px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">&lt;legend&gt;\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"523\" y=\"843\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">&lt;legend&gt;\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 569 803 Q 579 803 579 824.5 Q 579 846 568 846\" fill=\"none\" stroke=\"#0000cc\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"417.83\" y=\"1046\" width=\"90\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 417.83 1046 M 507.83 1046 M 507.83 1076 L 417.83 1076\" fill=\"none\" stroke=\"#0000cc\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 1073px; margin-left: 419px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">&lt;input&gt;\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"463\" y=\"1073\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\">&lt;input&gt;\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 428 736 Q 517.83 736 517.83 906 Q 517.83 1076 508 1076\" fill=\"none\" stroke=\"#0000cc\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"454\" y=\"896\" width=\"110\" height=\"40\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 454 896 M 564 896 M 564 936 L 454 936\" fill=\"none\" stroke=\"#0000cc\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 108px; height: 1px; padding-top: 933px; margin-left: 455px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">type=\"submit\"\u003Cdiv>type=\"reset\"\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"509\" y=\"933\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">type=\"submit\"...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 559.83 896 Q 574 896 574 916 Q 574 936 564 936\" fill=\"none\" stroke=\"#0000cc\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"275\" y=\"796\" width=\"70\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 275 796 M 345 796 M 345 826 L 275 826\" fill=\"none\" stroke=\"#0000cc\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 823px; margin-left: 276px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">action\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>
2750\u003Ctext x=\"310\" y=\"823\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">action\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 312.83 786 Q 302.83 786 293.91 806 Q 285 826 275 826\" fill=\"none\" stroke=\"#0000cc\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"275\" y=\"826\" width=\"80\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 275 826 M 355 826 M 355 856 L 275 856\" fill=\"none\" stroke=\"#0000cc\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 853px; margin-left: 276px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">method\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"315\" y=\"853\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">method\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 308 786 Q 365 786 365 821 Q 365 856 355 856\" fill=\"none\" stroke=\"#0000cc\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Cpath d=\"M 308 786 Q 365 786 365 821 Q 365 856 355 856\" fill=\"none\" stroke=\"#0000cc\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"235\" y=\"916\" width=\"150\" height=\"40\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 235 916 M 385 916 M 385 956 L 235 956\" fill=\"none\" stroke=\"#0000cc\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 148px; height: 1px; padding-top: 953px; margin-left: 236px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">enctype=\u003Cdiv>\"multipart/formdata\"\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"310\" y=\"953\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">enctype=...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 308 786 Q 395 786 395 871 Q 395 956 385 956\" fill=\"none\" stroke=\"#0000cc\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"261\" y=\"886\" width=\"30\" height=\"20\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 261 886 M 291 886 M 291 906 L 261 906\" fill=\"none\" stroke=\"#0000cc\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 28px; height: 1px; padding-top: 903px; margin-left: 262px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">get\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"276\" y=\"903\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">get\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 291 906 Q 301 906 301 894 Q 301 882.01 301 870.01 Q 301 858.01 311 858.01\" fill=\"none\" stroke=\"#0000cc\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"329\" y=\"886\" width=\"45.41\" height=\"20\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 329 886 M 374.41 886 M 374.41 906 L 329 906\" fill=\"none\" stroke=\"#0000cc\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 43px; height: 1px; padding-top: 903px; margin-left: 330px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">post\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"352\" y=\"903\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">post\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 329 906 Q 319 906 318 881.49 Q 317 856.99 307 856.99\" fill=\"none\" stroke=\"#0000cc\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"211\" y=\"1036\" width=\"80\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 211 1036 M 291 1036 M 291 1066 L 211 1066\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 1063px; margin-left: 212px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">multiple\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"251\" y=\"1063\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">multiple\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 312.83 1016 Q 302.83 1016 301.92 1041 Q 301 1066 291 1066\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"190\" y=\"1066\" width=\"100\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 190 1066 M 290 1066 M 290 1096 L 190 1096\" fill=\"none\" stroke=\"#0000cc\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 1093px; margin-left: 191px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">&lt;optgroup&gt;
2750\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"240\" y=\"1093\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">&lt;optgroup&gt;\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 312.83 1016 Q 302.83 1016 301.42 1056 Q 300 1096 290 1096\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"200\" y=\"1106\" width=\"90\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 200 1106 M 290 1106 M 290 1136 L 200 1136\" fill=\"none\" stroke=\"#0000cc\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 1133px; margin-left: 201px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">&lt;option&gt;\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"245\" y=\"1133\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\" font-weight=\"bold\">&lt;option&gt;\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 312.83 1016 Q 302.83 1016 301.42 1076 Q 300 1136 290 1136\" fill=\"none\" stroke=\"#0000cc\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"314\" y=\"1106\" width=\"90\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 314 1106 M 404 1106 M 404 1136 L 314 1136\" fill=\"none\" stroke=\"#0000cc\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 1133px; margin-left: 315px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">type=\"file\"\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"359\" y=\"1133\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">type=\"file\"\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 507.83 1076 Q 497.83 1076 455.91 1106 Q 414 1136 404 1136\" fill=\"none\" stroke=\"#0000cc\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"307.83\" y=\"1066\" width=\"110\" height=\"40\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 307.83 1066 M 417.83 1066 M 417.83 1106 L 307.83 1106\" fill=\"none\" stroke=\"#0000cc\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 108px; height: 1px; padding-top: 1103px; margin-left: 309px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">type\u003Cdiv>=\"password\"\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"363\" y=\"1103\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">type...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 507.83 1076 Q 497.83 1076 462.83 1091 Q 427.83 1106 418 1106\" fill=\"none\" stroke=\"#0000cc\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"211\" y=\"1236\" width=\"120\" height=\"70\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 211 1236 M 331 1236 M 331 1306 L 211 1306\" fill=\"none\" stroke=\"#0000cc\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 1303px; margin-left: 212px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">type=\"date\"\u003Cdiv>type=\"time\"\u003C/div>\u003Cdiv>type=\"datetime\"\u003C/div>\u003Cdiv>type=\"number\"\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"271\" y=\"1303\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">type=\"date\"...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 507.83 1076 Q 497.83 1076 419.41 1191 Q 341 1306 331 1306\" fill=\"none\" stroke=\"#0000cc\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"226\" y=\"1306\" width=\"130\" height=\"40\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 226 1306 M 356 1306 M 356 1346 L 226 1346\" fill=\"none\" stroke=\"#0000cc\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 1343px; margin-left: 227px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">type=\"checkbox\"\u003Cdiv>type=\"radio\"\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"291\" y=\"1343\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">type=\"checkbox\"...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 507.83 1076 Q 497.83 1076 431.91 1211 Q 366 1346 356 1346\" fill=\"none\" stroke=\"#0000cc\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"442\" y=\"1266\" width=\"110\" height=\"40\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 442 1266 M 552 1266 M 552 1306 L 442 1306\" fill=\"none\" stroke=\"#0000cc\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 108px; height: 1px; padding-top: 1303px; margin-left: 443px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">type=\"submit\"\u003Cdiv>type=\"reset\"\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"497\" y=\"1303\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">type=\"submit\"...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 502.16 1076.18 Q 562 1076.18 562 1191.09 Q 562 1306 552 1306\" fill=\"none\" stroke=\"#0000cc\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"241\" y=\"1356\" width=\"110\" height=\"60\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 241 1356 M 351 1356 M 351 1416 L 241 1416\" fill=\"none\" stroke=\"#0000cc\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 108px; height: 1px; padding-top: 1413px; margin-left: 242px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">type = \"text\"\u003Cdiv>type=\"email\"\u003C/div>\u003Cdiv>type=\"search\"\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"296\" y=\"1413\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">type = \"text\"...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 507.83 1076 Q 497.83 1076 429.41 1246 Q 361 1416 351 1416\" fill=\"none\" stroke=\"#0000cc\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"459.83\" y=\"1216\" width=\"80\" height=\"50\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 459.83 1216 M 539.83 1216 M 539.83 1266 L 459.83 1266\" fill=\"none\" stroke=\"#0000cc\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 1263px; margin-left: 461px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">type=\u003Cdiv>\"color\"\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"500\" y=\"1263\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">type=...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 507.83 1076 Q 549.83 1076 549.83 1171 Q 549.83 1266 540 1266\" fill=\"none\" stroke=\"#0000cc\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"77\" y=\"1076\" width=\"70\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 77 1076 M 147 1076 M 147 1106 L 77 1106\" fill=\"none\" stroke=\"#0000cc\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 1103px; margin-left: 78px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">label\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"112\" y=\"1103\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">label\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 190 1096 Q 180 1096 168.5 1101 Q 157 1106 147 1106\" fill=\"none\" stroke=\"#0000cc\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"77\" y=\"1116\" width=\"90\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 77 1116 M 167 1116 M 167 1146 L 77 1146\" fill=\"none\" stroke=\"#0000cc\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 1143px; margin-left: 78px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">selected\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"122\" y=\"1143\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">selected\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 200 1136 Q 190 1136 183.5 1141 Q 177 1146 167 1146\" fill=\"none\" stroke=\"#0000cc\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"317.83\" y=\"1131\" width=\"70.17\" height=\"60\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 317.83 1131 M 388 1131 M 388 1191 L 317.83 1191\" fill=\"none\" stroke=\"#0000cc\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-ite
2750ms: unsafe flex-end; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 1188px; margin-left: 319px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">accept\u003Cdiv>multiple \u003C/div>\u003Cdiv>capture\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"353\" y=\"1188\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">accept...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 314 1136 Q 324 1136 324 1149.75 Q 324 1163.5 315.91 1163.5 Q 307.83 1163.5 307.83 1177.25 Q 307.83 1191 318 1191\" fill=\"none\" stroke=\"#0000cc\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"97\" y=\"1256\" width=\"60\" height=\"60\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 97 1256 M 157 1256 M 157 1316 L 97 1316\" fill=\"none\" stroke=\"#0000cc\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 1313px; margin-left: 98px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">min\u003Cdiv>max\u003C/div>\u003Cdiv>step\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"127\" y=\"1313\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">min...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 211 1306 Q 201 1306 184 1311 Q 167 1316 157 1316\" fill=\"none\" stroke=\"#0000cc\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"105\" y=\"1336\" width=\"80\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 105 1336 M 185 1336 M 185 1366 L 105 1366\" fill=\"none\" stroke=\"#0000cc\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 1363px; margin-left: 106px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">cheked\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"145\" y=\"1363\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">cheked\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 226 1346 Q 216 1346 205.5 1356 Q 195 1366 185 1366\" fill=\"none\" stroke=\"#0000cc\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Cpath d=\"M 364 246 Q 354 246 352 253.5 Q 350 261 340 261\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"364\" y=\"216\" width=\"90\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 364 216 M 454 216 M 454 246 L 364 246\" fill=\"none\" stroke=\"#330000\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 243px; margin-left: 365px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">&lt;script&gt;\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"409\" y=\"243\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\">&lt;script&gt;\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Crect x=\"469.83\" y=\"146\" width=\"70\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 469.83 146 M 539.83 146 M 539.83 176 L 469.83 176\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 173px; margin-left: 471px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">defer\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"505\" y=\"173\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">defer\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 532 226 Q 549.83 226 549.83 201 Q 549.83 176 540 176\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Cpath d=\"M 540 276 Q 549.5 276 549.5 251 Q 549.5 226 532 226\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"469.5\" y=\"246\" width=\"70\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 469.5 246 M 539.5 246 M 539.5 276 L 469.5 276\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 273px; margin-left: 471px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">async\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"505\" y=\"273\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">async\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Crect x=\"462\" y=\"196\" width=\"70\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 462 196 M 532 196 M 532 226 L 462 226\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 223px; margin-left: 463px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">src=\"\"\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"497\" y=\"223\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">src=\"\"\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 454 246 Q 464 246 464 241 Q 464 236 458 236 Q 452 236 452 231 Q 452 226 462 226\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cswitch>\u003Cg requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\"/>\u003Ca transform=\"translate(0,-5)\" xlink:href=\"https://www.drawio.com/doc/faq/svg-export-text-problems\" target=\"_blank\">\u003Ctext text-anchor=\"middle\" font-size=\"10px\" x=\"50%\" y=\"100%\">Text is not SVG - cannot display\u003C/text>\u003C/a>\u003C/switch>\u003C/svg>","type":"application/vnd.drawio","modified":"20240617134932060","title":"$:/diagram/balises_html"},
2751{"created":"20240523083545350","text":"\u003Csvg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" width=\"840px\" height=\"574px\" viewBox=\"-0.5 -0.5 840 574\" content=\"&lt;mxfile host=&quot;embed.diagrams.net&quot; modified=&quot;2024-06-05T11:21:40.018Z&quot; agent=&quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0&quot; etag=&quot;Wxyzy5CW_IW6R43Tbk0l&quot; version=&quot;24.4.9&quot; type=&quot;embed&quot;&gt;&lt;diagram id=&quot;uQ_vVKtjYTHsjBUBS-4d&quot; name=&quot;Page-1&quot;&gt;7Vtbj5s4FP41eayFbQzkcS7tblddqdJIu+3TygOexFoCFJxJsr9+7WDAYDJhMiGXdlA0g4+ND/78nePjCxN8t1j/ltNs/mcasXiCnGg9wfcThHyfyL9KsCkFxIOlYJbzqBQZggf+H9NCR0uXPGJFq6BI01jwrC0M0yRhoWjJaJ6nq3axpzRua83ojFmCh5DGtvRvHom5bkWAG/nvjM/mWnOA/DJjQauyuiHFnEbpyhDhjxN8l6epKO8W6zsWK+gqWMrnPu3Ird8rZ4kY8gDSb/xM46Vum34xsakaO8vTZWZXrHU9s1ywdR/q9LGqoWmZJARLF0zkG1mueioAQfmgZoOrwVk10GJPy+YGrKQqSHV3zuq6mybLG93qfgTc/QA
2751UIk//rTtatuR2Lhayvnsob2UPZqrcYj1TVAdPcboK5zQXIGIhL3iayEKrORfsIaOhKrmS5aTMRrTujC6ku6GrDGJTpTHwAgs96PSg50PgkLfjR64ZP+R08Atc4LsWftPx4PP2wyfNL4lYpPHqg8KAkz4WabwU7CYPtdvcSpuUqzC3OuQoYJI2mGgKAUY2GeF4aPo/D5oQnR3N4CdAcw96IzpGCPfDx5LoRoUjMhXGtCh42EasgdeRKbbm4ptx/13dA6JT92sj635jJL6ynMvXZ3klS2RTvjUPq+R3M6+papuq6trdEUW6zEPWGlAFzWdMtIjEolZUZXeW0TOkb7zXspzFVPDndizW11Vaw9eUyxdu/JTrATT16h9u2ZkLEYAOQR6GxA+mbtCuvmyprtEMrLpK/AD4Dm5+pKUF+x7YVu9jL3BrrlRaSvAsLZIrdGMUy1SBYndLOw4ZklYwKG/KChs6130xjOFoLIbDMzF8m+pWdjDtyWXR3nHAFJHmRzrk8ICmfMlJdBjxMYQAmpf7KjVHYv7LNg7dKUC2kR/NLgZMqg70/LUtfDes5KLtAtl24V6WXVztcHAINQdMd88TlAxj04W51FNQB/rdiYAziB2vdZnQCwCBQfNrt0aOH6BuiqIpOa7PHLCOcF2xxKsIbbpH79fj+EVEy9hpa+2snb6d4gNWJ04QFjR0hm6b0Kbg+IFAYDMdXxbTCQK+cXUWpWE7ZuysEAz25oQAYl5+W4t0wjXNlTJvtEhgwOrOSdl4qoDUf+ehUhIQYA72qO1wA7WP4NZ6Anc0Gk4vjIYBOaVT9N7JONkbep7OKQ7ZzdqxHbpzTfr1+6GuAzwz5CKD0DD44BEQQCOcIjY9tovcRjzfMfBDFrwHrHocuBNYyB4W/6DhG4FkR1+8aEUSNbeF+37UgrejVqF0XbDpXA8EjhHLuG279VtTg559VQJBYNp9D+JEqmjGIX96BJraYfgnnliYSwREZ/sq5rNEjUESMOXmbxVOPKTxjc5Y8ChSj/fC3R6kjgE+BnLKYhl5NXmRwx8ymOrb4E9ttPERDlT0bMJ+fiq9YMSF2s8/AOqnNBEfVtWbPm7P67wFf1Xfg36DnkMzB2zXYgh82OoCiB2AnGlz2Qcz+k61HKUP7OCexQWTkl+gK2Q4ATprVw4CU/OyrWG0nrDj2+ec8vO7m1dvoUPsnovOVR0GiE90ub4mEOvVtM6WbM9Zt9FQtA8kXBsVd52NOZ99V4dKrp+a2OmCSgDqmVuMBaQ9fficyMB3GR46UJ3b1P3uMKS2xvW2yUkQHbDCN/5kFsnZas9IoeZabnP5NgRjzLX2A3KiqVbdN4Pp5ADHgW6gf8QheOrvwPXkc1hsn2K9n9zhyc30cSnObrqvwNqYPEl3WF/YwnmsyRO29+ev2wtCl4DOZl6/FxwNUXtJ77oRVeQ0uOnAs6I7YPm+DcGeM8JPPI7v0jhVy+hJmrBe0HZ9evKCQVuIuH1Hf4l/BExce7YyQV68pRVsQeP9WKoPfW4XNJ/x5INIJRg3soSTrbftrvLl3Uz9/+u2CHOeiao6+SaqxjKzEmaV4Euas4V6r6xYqv/RFlapn6uldyrbNUF35YheyBGdiaXKpRHPeMFDnsxkisVclypkD6o6lJAvi0WqkoItsm2dPAl5xKPldlVf+Xwnpo9SvyotKt0qtaCzhCo1Mf+xpMBoSdY0ZK9N9pEolXRQA7KUzKVFsmSA9Q0nks79gDpf3GBsUwsGPdSqw7w3UavvTPlRqPUHfabv5Do3uax57Sm51RcdH4VbXzdirobad16dh1eue05a9W0LHoVWX2gyU9/pIufh5uGdXZfCLgxHpJdMNh9Hlxv8zQfm+OP/&lt;/diagram&gt;&lt;/mxfile&gt;\">\u003Cdefs/>\u003Cg>\u003Cg/>\u003Cg>\u003Cpath d=\"M 398.8 133.68 L 448.8 169.21 L 398.8 204.73 L 348.8 169.21 Z\" fill=\"rgb(255, 255, 255)\" stroke=\"rgb(0, 0, 0)\" stroke-width=\"2\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cpath d=\"M 483.8 204.74 L 528.8 240.26 L 483.8 275.79 L 438.8 240.26 Z\" fill=\"rgb(255, 255, 255)\" stroke=\"rgb(0, 0, 0)\" stroke-width=\"2\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Crect x=\"488.8\" y=\"311.32\" width=\"110\" height=\"71.05\" rx=\"7\" ry=\"7\" fill=\"rgb(255, 255, 255)\" stroke=\"rgb(0, 0, 0)\" stroke-width=\"2\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Crect x=\"358.8\" y=\"311.32\" width=\"110\" height=\"71.05\" rx=\"7\" ry=\"7\" fill=\"rgb(255, 255, 255)\" stroke=\"rgb(0, 0, 0)\" stroke-width=\"2\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Crect x=\"238.8\" y=\"311.32\" width=\"100\" height=\"71.05\" rx=\"7\" ry=\"7\" fill=\"rgb(255, 255, 255)\" stroke=\"rgb(0, 0, 0)\" stroke-width=\"2\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cpath d=\"M 348.8 169.21 L 288.8 170 L 288.8 304.95\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003Cpath d=\"M 288.8 310.2 L 285.3 303.2 L 288.8 304.95 L 292.3 303.2 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cpath d=\"M 448.8 169.21 L 485.1 169.21 L 484.03 198.38\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003Cpath d=\"M 483.84 203.62 L 480.6 196.5 L 484.03 198.38 L 487.59 196.76 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cpath d=\"M 400.51 91.05 L 399.06 127.32\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003Cpath d=\"M 398.84 132.56 L 395.63 125.43 L 399.06 127.32 L 402.62 125.71 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cpath d=\"M 438.8 240.26 L 407.32 240.26 L 408.66 303.63\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003Cpath d=\"M 408.78 308.88 L 405.13 301.96 L 408.66 303.63 L 412.13 301.81 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cpath d=\"M 528.8 240.26 L 543.8 240 L 543.8 304.95\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003Cpath d=\"M 543.8 310.2 L 540.3 303.2 L 543.8 304.95 L 547.3 303.2 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cpath d=\"M 288.8 382.37 L 384.78 494.41\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003Cpath d=\"M 388.19 498.4 L 380.98 495.36 L 384.78 494.41 L 386.3 490.81 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cpath d=\"M 413.8 382.37 L 412.26 482.58\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003Cpath d=\"M 412.18 487.83 L 408.79 480.78 L 412.26 482.58 L 415.79 480.88 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cpath d=\"M 543.8 382.37 L 439.73 494.58\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003Cpath d=\"M 436.16 498.43 L 438.35 490.92 L 439.73 494.58 L 443.49 495.68 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg/>\u003Cg>\u003Cellipse cx=\"412.16\" cy=\"524.47\" rx=\"32.73148148148148\" ry=\"35.52631578947369\" fill=\"rgb(255, 255, 255)\" stroke=\"rgb(0, 0, 0)\" stroke-width=\"2\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cellipse cx=\"412.16\" cy=\"524.47\" rx=\"25.925925925925927\" ry=\"28.42105263157895\" fill=\"rgb(255, 255, 255)\" stroke=\"rgb(0, 0, 0)\" stroke-width=\"2\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Crect x=\"382.66\" y=\"509.47\" width=\"59\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 57px; height: 1px; padding-top: 524px; margin-left: 384px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Fin\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"412\" y=\"528\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">Fin\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Crect x=\"370.51\" y=\"150.21\" width=\"60\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 165px; margin-left: 372px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">If condition\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"401\" y=\"169\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\" font-weight=\"bold\">If conditi...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Crect x=\"455.1\" y=\"223\" width=\"60\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 238px; margin-left: 456px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">else If condition\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"485\" y=\"242\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\" font-weight=\"bold\">else If co...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Crect x=\"238.8\" y=\"154.21\" width=\"60\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 169px; margin-left: 240px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">vrai\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"269\" y=\"173\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">vrai\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Crect x=\"478.8\" y=\"160\" width=\"60\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 175px; margin-left: 480px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">faux\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"509\" y=\"179\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">faux\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Crect x=\"358.8\" y=\"223\" width=\"60\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 238px; margin-left: 360px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">vrai\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"389\" y=\"242\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">vrai\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Crect x=\"538.8\" y=\"225.26\" width=\"60\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 240px; margin-left: 540px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">faux\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"569\" y=\"244\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">faux\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Crect x=\"515.1\" y=\"331.85\" width=\"60\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 347px; margin-left: 516px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Instruction\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"545\" y=\"350\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">Instruction\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg/>\u003Cg>\u003Cellipse cx=\"400.51\" cy=\"55.53\" rx=\"32.73148148148148\" ry=\"35.52631578947369\" fill=\"rgb(255, 255, 255)\" stroke=\"rgb(0, 0, 0)\" stroke-width=\"2\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Crect x=\"367.78\" y=\"40.53\" width=\"59\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 57px; height: 1px; padding-top: 56px; margin-left: 369px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Début\u003C/div>\u003C/div>\u003C
2751/div>\u003C/foreignObject>\u003Ctext x=\"397\" y=\"59\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">Début\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Crect x=\"384.3\" y=\"331.85\" width=\"59\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 57px; height: 1px; padding-top: 347px; margin-left: 385px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Instruction\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"414\" y=\"350\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">Instruction\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Crect x=\"259.3\" y=\"331.85\" width=\"59\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 57px; height: 1px; padding-top: 347px; margin-left: 260px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Instruction\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"289\" y=\"350\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">Instruction\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Crect x=\"220\" y=\"0\" width=\"400\" height=\"570\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Crect x=\"10\" y=\"310\" width=\"180\" height=\"260\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 178px; height: 1px; padding-top: 317px; margin-left: 12px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: left; max-height: 256px; overflow: hidden;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Ch1 style=\"margin-top: 0px;\">VBscript\u003C/h1>\u003Cp>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\u003C/p>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"12\" y=\"329\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\">VBscript...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Crect x=\"0\" y=\"0\" width=\"180\" height=\"260\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 178px; height: 1px; padding-top: 7px; margin-left: 2px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: left; max-height: 256px; overflow: hidden;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Ch1 style=\"margin-top: 0px;\">Javascript\u003C/h1>\u003Cp>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\u003C/p>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"2\" y=\"19\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\">Javascript...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Crect x=\"660\" y=\"0\" width=\"180\" height=\"260\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 178px; height: 1px; padding-top: 7px; margin-left: 662px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: left; max-height: 256px; overflow: hidden;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Ch1 style=\"margin-top: 0px;\">Python\u003C/h1>\u003Cp>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\u003C/p>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"662\" y=\"19\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\">Python...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Crect x=\"660\" y=\"290\" width=\"180\" height=\"260\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 178px; height: 1px; padding-top: 297px; margin-left: 662px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: left; max-height: 256px; overflow: hidden;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Ch1 style=\"margin-top: 0px;\">Langage SAS\u003C/h1>\u003Cp>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\u003C/p>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"662\" y=\"309\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\">Langage SAS...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cswitch>\u003Cg requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\"/>\u003Ca transform=\"translate(0,-5)\" xlink:href=\"https://www.drawio.com/doc/faq/svg-export-text-problems\" target=\"_blank\">\u003Ctext text-anchor=\"middle\" font-size=\"10px\" x=\"50%\" y=\"100%\">Text is not SVG - cannot display\u003C/text>\u003C/a>\u003C/switch>\u003C/svg>","type":"application/vnd.drawio","modified":"20240605112224684","title":"$:/diagram/condition_imbriquee"},
2752{"created":"20240608192451836","text":"\u003Csvg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" width=\"1072px\" height=\"1452px\" viewBox=\"-0.5 -0.5 1072 1452\" content=\"&lt;mxfile host=&quot;embed.diagrams.net&quot; modified=&quot;2024-06-10T12:25:08.500Z&quot; agent=&quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0&quot; etag=&quot;P7jMfqpoNg7ai4lW5Lt_&quot; version=&quot;24.5.2&quot; type=&quot;embed&quot;&gt;&lt;diagram id=&quot;DFQn04sXhlKGhJA2tZAp&quot; name=&quot;Page-1&quot;&gt;7V1tb9s4Ev41RncPcKB3WR/TtOkdsAWK7QF7/ahYtK2rLHkl2Un2w/32IyVSFl/syAkpZ+1Ji8SiJFriDJ9nODMkJ+7d+ulLGW9WX4sEZRPHSp4m7qeJ44Shj3+Tgue2wHZns7ZkWaYJLdsXfE//QrTQoqXbNEEVd2FdFFmdbvjCeZHnaF5zZXFZFo/8ZYsi4791Ey+RVPB9Hmdy6R9pUq/aUn/m7sv/idLlin7zzAnbE+uYXUtfpFrFSfHYK3I/T9y7sijq9tP66Q5lpO1Ys7T33R842z1XifJ6yA1Oe8Muzrb01b4VVZ2SZiuJgHA
2752j4xru3MltlLV/1rjmij58/cwapEZP+Ps+rup1hgts/DHO0mWOP8/x9bgu9+MOlXWKm/CWnlinSUJu//i4Smv0fRPPSV2PWGFwWVls8wQltK5FkddUCeyAHKdZdldkRdl8ubvwyT96Xa+8/cHlVV0WP1HvTND8sJrpaygajxaRR0dPvSLamF9QsUZ1+YwvoWenNpMsVW2fHj7u1cR2admqryK0LKaaueyq3ksPf6ACVAvTlYT5nYoO9wEsUyLQD9tcJVEQ6FCBBuGIEvUliTYis9q3qtO2j+JfWTxxgnhNWjp/qMgffJwRCSbpjpNs8OeWgEvTUNOqkcEtvsD2Nk/tXfQ8/rQkf+dZXFXkK+6+f2d14sduqm2vkHRHJf+eImHM25AzzRvE2e9YOeN82WhOXeBrP1n4U4YWNf34UNR1saY3l7SByYlNkRIswt/pf8T/cavc2RMfP8EdPrLZEf7PK1he5GiIPrPvJbpbp/nyrrnwB/nyG6KcVR5v/l18Iw/BHg7Nt2WV7tDvqG3Z5jHjbV3QQ3JRXSJ0jwkH19gr+Vrs9gU5evycYMJhTRr25IK6E3tREQl25/M6rZ9/R1lMuvxnxdW4ebqDqsZCuCWMeKC6prHU96I8eeWdFVq2oNO7kVB77xLckDsMF9wVfB3Ftpyjb6hMca9CJVE30oD9G/ga8ZsuUf3CDeEnFbrc31vWzBJwyxPQxtGANr5IHgqscRRY42vAmkDGGrFjo55SHtIzTqe6ztbpSlfCdAC3pLWXN0UItWzb7nRAju3JPc1YRwV5UFZt7Rz6krc+KryyaYQdbxuqREFvbSGjE7rNCz20BWHS1mhvEuTZPcUgEYcD6cQMk2Qf/pUAgwCDXCODWPjn/n4MBvF5BgkUDGIbYpDZ5TEIekrr/9A6yed93yVHn556l316PsQ6nfAPyrd9XG4U1yeicBwiihxedxxjRBQNIaKtKSLKMSb3xk3WAwZyMsQBagJqukZqIlbx+IObwFFQk2eImhjlATcdkv5ruSkaaZAkjJI80b2mj5w8T5eu8PIqynpVLIs8zn4rGioggvsvqutn2usIlgpsckZlk1TlDv8MVxXbHkcxHME/O7MExaAvqUEx2CsdN1saD7sZwyWu6zJ92NZgqoCpco2mSodApk2VwL7hx9GhKo5nyhNry1FZMFZOZyCFsTIWKdlMhGwo7RmzVmw56vutQtukmLaROzlWD7QAtHBRtHB/j42+MWgh5E1N2xo6hHV1sIK2YcnFsUIQvI0V3JFYwRFYQTQWNLKCnDlCWQFlSJnwA6wArHBhrGCdhxU6tB+FFS4wbUMLK3TifzUrjJX+4QqsEJhjBUXcDTybQ9KCOM9mKCuLdl0Z3P8VOT3UO0hw7k3uRlbRAyu4yYv1NEHTLJ6ytNDOEfkg3oXL2icA7yQYHNdicBxHkeE2hR0NyAQNDNkUjBWAJt5CE8w3wNkU2jN5BstUFQCnUapebKqBdY4sFJDfdVZAdEB0QPRhiO4GPKJ7isxMxzKF6HKQwISV+KZaXIY00zQBuxJQCFDopdxxHXbmTLAzVfniqji3FlS6kogG+2wkXVzhjHDGimcIlBaYm7mkb27B33pIIsyH7jTljTrE3FdmlWgwLChmPSuGKvRycZzSWg+08ObmBuwDsA+uxD7QMUoRZyB7I/qdXEV+7RWCvELAp6S9sYx8o0n6g7FcFXF6VwPPvX/rIc6EeWAw9gRuuXZuOZBxrWPsGfE51soJYca4RuURA645kWtY6gI3cDgb2bCnOThw4LAeQ/1N8wMoDih+JSiuY4QgOH38aEzUVngM/aZbd1Pj+jYgvgxtywmb6/+hN3+ONZr/Cbo/dP/L7v78tLlucUQjRp0T+DfMAmB2nQIhunly2hFC5TyEmMLr5m73zToGvcbnc9sWViBr/+NwyiRN79Y471+b6vythwS4xvK5Uzdy8KN/sFe45kjXXE1FGEv/ZM3BIHI4qbbaxPlJ/iarOfFIYY6cCmmzSP4s3pL5B1f9BmsRXcK3W7dooHnTua7aZwfXFVg9V2X16LBqhGX1QsUUHzc0ZNKwEMyV89JhAb+OsYbxkiKYMtrKNlZ0E0X+bIaNWifybJYuw3Qwwqc92w4DL7TwVS5fv75lb9zDMZzx2HCC3577ghS4ELgQuPAMXOj5xwZooWJ/BNfU7FdPlTEwNjT9jzfUCSggACIAIgCiswLRzFa4HWemgEgVegS349vdjt5Yxvb53I6Q2nxgtuWBVZ0G6ZIXKAZuZ0tp9hSrdLi3q2JHdlkDzgfOvyDOP7bcjq2D9kPeFzdTTFkyRfO+NpoHrO5htcrJdj6sPo+7y8XAmf+ckBxI/KC3u7TCNJDAQBFI4xpIQwOivD6aY1uBK1GIck9PLRwCs1wMcAjLJ3ofHOKrQnZjcEher6bzVZolv/wK1AHUAdShP72Rpw7bUlCHaoM9LdShyksC6ngrdYyyJPRgGR9eqscsdSzSsqpb8qCjEPwbj0rifSkQChAKEIrpfPloJju0uvUgdVNKAKMRE5Qye1eUooowjTIaKWoYhwBtAG3opw1h3baITVkYIQgSqJwbQBlvpYx3FQTxzxUEWRTzbQWUAZQBlKGbMoS4eaRYUt4YZcBqKwYoI3DeE2WwpxmdMsqiqIExgDGAMbQPMsQ4uWKFLlOzHgPFUi9Yhu5thTLcLZu50NC5oXNfUOc+njmp7Pwv7XF3inkobmOo2nLI1AYVASzb8joBc/MnFMt4B2Mt2+KJ6mNuc9tAmU3fhTAzbP9DXj2wA7CDSXbwFexgKu8l0Jb3AuzAs0MwFjsIIwnX3Hy6QI52Jmm1yWJ8/+1DVsx/AjUANVwUNRiFfs8RoV+1v7kx6Ne2ZfUVQ3+gmAzLYNI09LvCKu92F2TQD/3MSFFAP0A+QP4lQf5LS/m2iPEHRWjnEIbo2t2UbUNHO/lUsW2QqdhiqC2D8X0zRNuhX+KIN0qc20hIJg0GsKZJQxguTEU90UgZEJlWGhiWFd73thbsq9Ug5QkV2uPoVp7BECGHpjeY7iCIBIbBZRoGp7gJX9PTT9guxOGQvFtGvmcYmJraECrCBFcL7RrtgtAbwzAYLGU5TwAP+Oao7aPkXci3xhuygDr5qu0TubhIqzSvAPwB/C8P/Gnb73v6aKNAW1hYY2orXIWOqe3kQ22uwgvAe24RRrL/1xtMecXeHGfEezkW2Mf7BGFUtyZ37uQ2yto/5AwpnONWz8nkAusXlC9iXPgrEAAQABDAyQRA+lKWxZsKJYNoQcgNUmSRGksjnclDfyCF/qbxryQF5s3lSEF7rtlgKcuBnzTP0hxNIeAPMH/ZMH84+vPG7n5CioAA8FNbsSarsRSBGezbZwbiFesinRHi5UANYDtgO2C7cWwXfTojTgKbyS781q6DXg+9Hnq9wV7vWzfOLNr/BDwIKDb5MoYBF5j8r0WafbtsNlIivzsTLX1zifyRPKgHu/6wP98dbNcrFqdjXvUz2PXydI1FhkEKCB4I/uII/pS8nCiyrCgyRvBk3dEjBK/YPC8wRPARpGAawflIYSecD+fZ0/SkvCzxScB5wPmrxvnXdPMTcF6YuK1wzBvDdci/NOKXjxT5l2xYdgZcl/Mvf/sg5d+Qt8IvhfuklcXNL/zs2xJ/ytuL5qiq4rQke2ZviuZEvFik8xVZyAO/fd7m79Qo37b9Ml4TYsgfqk3TbO3qb0m6m9CV3+L5HG3qZgtukhEkXm+tyQOQXCD0VLdPUKb4garmBswezn1LFs49oRXnnuL5fpm53ncBhwGHXRSHjexs9APRqaRwL7qqaQKeDpqS/YvHAazGvQHJQJZ0ZX81greSDy2ExUv0MkAdAqSmqIUgiksMiRhAASIBIgEimUYkRSK7q9ohUgsiadsR/v1EPDSseWEinyXS7g9Rx018YfHtKUtaMhA2kadBXJRBDnwHfAd8Z5jvFFuQGTPAuxAy8J1evlOs+sTIYXS+ExVFH9/ZlhxZwHqAcRSX/dLO/03QAkMgTPcCmrh4mji4mMPxwMTbOUSc/KvKE7V9Q7EG23KAQ07Th0EcolrGpwNc46vG2rxGOZZnjkRga20jCtTtj85lITi6FWg4TsjJJt2XgHUA1gFYB4asg0CwDtgOkyMsBGVb2hyqAO48uKuWgjojuMu5CBWGwp+w/C9AO0C7MWgXUsxcRazM1OK/3aRygHbd0K7YLuSc0C5P8l+kT6T7AbIDsgOym0F2YbZft5vcCNM+bQuW8zOE7Iq40DmRXU4Tjx+qImuS7ADcAdwB3Ecx2x3FlD9jHhkb5vxZgwHbVkzkMxCEGS48OeCuzjArU
2752dVkfCVx3uZx4V+LjKzAfUfqI5VWbYJZRcSa96/9UJRJSdOoN7iF6G4NXF2NFIEjgCMuiSM0QLsrbtlny852z5jhbsN6fCdgu8KD3pnE58D2odP5qnY/hWQrYzpG/ebZGKzHD1kP2bncYZKchfI9BfTfCb/JDs0Z1m+yZunuTVnMV6Rnv5hv3N4LU2eAT4BPNPOJY8lDBV/l4teSHmxD9PYEPlE4d7qkl3Pwiezd+YZfoeGJP7e92SUsZZewyDpOq44YGtwXuIXt3saoJd6Ve7RvUf2h3CO6jP8N/APQA9AD0B8dOHjywMHcPBBH9itcI9DjGsvnLu+XHPzoH+wzf5sjlvo7kB4iFT3456OHI5MV0eGRRr4nCcmBJO741tRmTY7NzYexBFAMUMyZxhK+HFPu9pPQTzEQdxhOFqxteLI42w4Q3fMc9k2h9QtxB4sbYDQjiia60Nz+uZa5AL98U2U7Vun7rtrZ8u14ZJdWaTMSAbwHvAe85/De5fFelR3qaVqCkFhjBXmF7twX3OdWX4sEkSv+Dw==&lt;/diagram&gt;&lt;/mxfile&gt;\">\u003Cdefs/>\u003Cg>\u003Cg>\u003Crect x=\"0\" y=\"221\" width=\"130\" height=\"80\" rx=\"12\" ry=\"12\" fill=\"#f5f5f5\" stroke=\"#666666\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 261px; margin-left: 1px;\">\u003Cdiv data-drawio-colors=\"color: #333333; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 16px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">Postionner des éléments\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"65\" y=\"266\" fill=\"#333333\" font-family=\"Helvetica\" font-size=\"16px\" text-anchor=\"middle\" font-weight=\"bold\">Postionner des é...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Crect x=\"0\" y=\"841\" width=\"130\" height=\"80\" rx=\"12\" ry=\"12\" fill=\"#f5f5f5\" stroke=\"#666666\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 881px; margin-left: 1px;\">\u003Cdiv data-drawio-colors=\"color: #333333; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 16px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">Sélection d'un élément\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"65\" y=\"886\" fill=\"#333333\" font-family=\"Helvetica\" font-size=\"16px\" text-anchor=\"middle\" font-weight=\"bold\">Sélection d'un é...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Crect x=\"170\" y=\"671\" width=\"120\" height=\"50\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 170 671 M 290 671 M 290 721 L 170 721\" fill=\"none\" stroke=\"#ff0080\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 718px; margin-left: 171px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; overflow-wrap: normal;\">à partir de la \u003Cdiv style=\"font-size: 14px;\">classe CSS\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"230\" y=\"718\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-style=\"italic\">à partir de la...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 130 881 Q 140 881 150 801 Q 160 721 170 721\" fill=\"none\" stroke=\"#ff0080\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"175\" y=\"731\" width=\"110\" height=\"50\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 175 731 M 285 731 M 285 781 L 175 781\" fill=\"none\" stroke=\"#0000ff\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 108px; height: 1px; padding-top: 778px; margin-left: 176px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; overflow-wrap: normal;\">à partir de \u003Cdiv style=\"font-size: 14px;\">l'Id\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"230\" y=\"778\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-style=\"italic\">à partir de...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 130 881 Q 140 881 152.5 831 Q 165 781 175 781\" fill=\"none\" stroke=\"#0000ff\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"170\" y=\"791\" width=\"140\" height=\"50\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 170 791 M 310 791 M 310 841 L 170 841\" fill=\"none\" stroke=\"#00ff00\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 138px; height: 1px; padding-top: 838px; margin-left: 171px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; overflow-wrap: normal;\">à partir du \u003Cdiv style=\"font-size: 14px;\">nom de la balise\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"240\" y=\"838\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-style=\"italic\">à partir du...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 130 881 Q 140 881 150 861 Q 160 841 170 841\" fill=\"none\" stroke=\"#00ff00\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Cpath d=\"M 302 971 Q 311.5 971 320.75 971 Q 330 971 340 971\" fill=\"none\" stroke=\"#cccc00\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"181.5\" y=\"921\" width=\"120\" height=\"50\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 181.5 921 M 301.5 921 M 301.5 971 L 181.5 971\" fill=\"none\" stroke=\"#cccc00\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 968px; margin-left: 183px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; overflow-wrap: normal;\">à partir d'un \u003Cdiv style=\"font-size: 14px;\">attribut\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"242\" y=\"968\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-style=\"italic\">à partir d'un...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 130 881 Q 140 881 155.75 926 Q 171.5 971 182 971\" fill=\"none\" stroke=\"#cccc00\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"190\" y=\"1191\" width=\"140\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 190 1191 M 330 1191 M 330 1221 L 190 1221\" fill=\"none\" stroke=\"#ff8000\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 138px; height: 1px; padding-top: 1218px; margin-left: 191px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; overflow-wrap: normal;\">
2752Pseudo-classes\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"260\" y=\"1218\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-style=\"italic\">Pseudo-classes\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 130 881 Q 140 881 160 1051 Q 180 1221 190 1221\" fill=\"none\" stroke=\"#cc6600\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"190\" y=\"1401\" width=\"140\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 190 1401 M 330 1401 M 330 1431 L 190 1431\" fill=\"none\" stroke=\"#ff0000\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 138px; height: 1px; padding-top: 1428px; margin-left: 191px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; overflow-wrap: normal;\">Pseudo-element\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"260\" y=\"1428\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-style=\"italic\">Pseudo-element\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 130 881 Q 140 881 160 1156 Q 180 1431 190 1431\" fill=\"none\" stroke=\"#ff0000\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Cpath d=\"M 310 701 Q 300 701 300 711 Q 300 721 290 721\" fill=\"none\" stroke=\"#ff0080\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"310\" y=\"671\" width=\"160\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 310 671 M 470 671 M 470 701 L 310 701\" fill=\"none\" stroke=\"#ff0080\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 698px; margin-left: 311px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Cfont style=\"font-size: 14px;\">\u003Cb>.nom-de-la-classe\u003C/b>\u003C/font>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"390\" y=\"698\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">.nom-de-la-classe\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 480 661 Q 470 661 470 671 Q 470 681 475 681 Q 480 681 480 691 Q 480 701 470 701\" fill=\"none\" stroke=\"#ff0080\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"480\" y=\"631\" width=\"200\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 480 631 M 680 631 M 680 661 L 480 661\" fill=\"none\" stroke=\"#ff0080\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 658px; margin-left: 481px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">&lt;div class=\"nom-de-la-classe\"\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"580\" y=\"658\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">&lt;div class=\"nom-de-la-classe\"\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Crect x=\"300\" y=\"731\" width=\"120\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 300 731 M 420 731 M 420 761 L 300 761\" fill=\"none\" stroke=\"#0000ff\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 758px; margin-left: 301px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Cfont style=\"font-size: 14px;\">\u003Cb style=\"font-size: 14px;\">#nom-de-l-id\u003C/b>\u003C/font>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"360\" y=\"758\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\">#nom-de-l-id\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 285 781 Q 295 781 295 776 Q 295 771 292.5 771 Q 290 771 290 766 Q 290 761 300 761\" fill=\"none\" stroke=\"#0000ff\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Cpath d=\"M 470 741 Q 460 741 445 751 Q 430 761 420 761\" fill=\"none\" stroke=\"#0000ff\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"470\" y=\"711\" width=\"160\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 470 711 M 630 711 M 630 741 L 470 741\" fill=\"none\" stroke=\"#0000ff\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 738px; margin-left: 471px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">&lt;div id=\"nom-de-l-id\"...\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"550\" y=\"738\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">&lt;div id=\"nom-de-l-id\"...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 315 821 Q 305 821 305 826 Q 305 831 312.5 831 Q 320 831 320 836 Q 320 841 310 841\" fill=\"none\" stroke=\"#00cc00\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"315\" y=\"791\" width=\"160\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 315 791 M 475 791 M 475 821 L 315 821\" fill=\"none\" stroke=\"#00cc00\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 158px; height: 1px;
2752 padding-top: 818px; margin-left: 316px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Cfont style=\"font-size: 14px;\">\u003Cb style=\"font-size: 14px;\">nom-de-la-ballise\u003C/b>\u003C/font>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"395\" y=\"818\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\">nom-de-la-ballise\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 480 791 Q 470 791 470 798.5 Q 470 806 477.5 806 Q 485 806 485 813.5 Q 485 821 475 821\" fill=\"none\" stroke=\"#00cc00\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"480\" y=\"761\" width=\"160\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 480 761 M 640 761 M 640 791 L 480 791\" fill=\"none\" stroke=\"#00cc00\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 788px; margin-left: 481px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">&lt;nom-de-la-balise......\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"560\" y=\"788\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">&lt;nom-de-la-balise......\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Crect x=\"385.29\" y=\"861\" width=\"250\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 385.29 861 M 635.29 861 M 635.29 891 L 385.29 891\" fill=\"none\" stroke=\"#cccc00\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 248px; height: 1px; padding-top: 888px; margin-left: 386px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">[nom-attribut=\"valeur de l'attribut\"]\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"510\" y=\"888\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\">[nom-attribut=\"valeur de l'attribut\"]\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 301.5 971 Q 311.5 971 343.39 931 Q 375.29 891 385 891\" fill=\"none\" stroke=\"#cccc00\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Cpath d=\"M 375 931 Q 365 931 338.25 951 Q 311.5 971 301.5 971\" fill=\"none\" stroke=\"#cccc00\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"375\" y=\"901\" width=\"370\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 375 901 M 745 901 M 745 931 L 375 931\" fill=\"none\" stroke=\"#cccc00\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 368px; height: 1px; padding-top: 928px; margin-left: 376px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Cspan style=\"font-size: 14px; font-weight: 700;\">[nom-attribut*=\"portion de la valeur de l'attribut\"]\u003C/span>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"560\" y=\"928\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">[nom-attribut*=\"portion de la valeur de l'attribut\"]\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 365 971 Q 355.29 971 333.39 971 Q 311.5 971 301.5 971\" fill=\"none\" stroke=\"#cccc00\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"365.29\" y=\"941\" width=\"340\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 365.29 941 M 705.29 941 M 705.29 971 L 365.29 971\" fill=\"none\" stroke=\"#cccc00\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 338px; height: 1px; padding-top: 968px; margin-left: 366px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Cspan style=\"font-size: 14px; font-weight: 700;\">[nom-attribut$=\"fin de la valeur de l'attribut\"]\u003C/span>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"535\" y=\"968\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">[nom-attribut$=\"fin de la valeur de l'attribut\"]\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Crect x=\"365.29\" y=\"981\" width=\"280\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 365.29 981 M 645.29 981 M 645.29 1011 L 365.29 1011\" fill=\"none\" stroke=\"#cccc00\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 278px; height: 1px; padding-top: 1008px; margin-left: 366px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Cspan style=\"font-size: 14px; font-weight: 700;\">[nom-attribut~=\"partie de l'attribut\"]\u003C/span>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"505\" y=\"1008\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">[nom-attribut~=\"partie de l'attribut\"]\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 301.5 971 Q 311.5 971 333.39 991 Q 355.29 1011 365 1011\" fill=\"none\" stroke=\"#cccc00\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Cpath d=\"M 395 1061 Q 385 1061 362.5 1141 Q 340 1221 330 1221\" fill=\"none\" stroke=\"#ff8000\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"395\" y=\"1031\" width=\"80\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 395 1031 M 475 1031 M 475 1061 L 395 1061\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 1058px; margin-left: 396px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">:hover\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"435\" y=\"1058\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\">:hover\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 375 1264 Q 365 1264 352.5 1242.5 Q 340 1221 330 1221\" fill=\"none\" stroke=\"#ff8000\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"375\" y=\"1234\" width=\"130\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 375 1234 M 505 1234 M 505 1264 L 375 1264\" fill=\"none\" stroke=\"#ff8000\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 1261px; margin-left: 376px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Cspan style=\"font-size: 14px; font-weight: 700;\">:link /:visited\u003C/span>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"440\" y=\"1261\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\">:link /:visited\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 385 1304 Q 375 1304 357.5 1262.5 Q 340 1221 330 1221\" fill=\"none\" stroke=\"#ff8000\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"385\" y=\"1274\" width=\"110\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 385 1274 M 495 1274 M 495 1304 L 385 1304\" fill=\"none\" stroke=\"#ff8000\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 108px; height: 1px; padding-top: 1301px; margin-left: 386px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Cspan style=\"font-size: 14px; font-weight: 700;\">:nth-child()\u003C/span>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"440\" y=\"1301\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\">:nth-child()\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 385 1181 Q 375.29 1181 357.64 1201 Q 340 1221 330 1221\" fill=\"none\" stroke=\"#ff8000\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"385.29\" y=\"1151\" width=\"190\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 385.29 1151 M 575.29 1151 M 575.29 1181 L 385.29 1181\" fill=\"none\" stroke=\"#ff8000\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 188px; height: 1px; padding-top: 1178px; margin-left: 386px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Cspan style=\"font-size: 14px; font-weight: 700;\">:first-child / :last-child\u003C/span>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"480\" y=\"1178\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\">:first-child / :last-child\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 400 1138 Q 390 1138 365 1179.5 Q 340 1221 330 1221\" fill=\"none\" stroke=\"#ff8000\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"400\" y=\"1108\" width=\"80\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 400 1108 M 480 1108 M 480 1138 L 400 1138\" fill=\"none\" stroke=\"#ff8000\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 1135px; margin-left: 401px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Cspan style=\"font-size: 14px; font-weight: 700;\">:not()\u003C/span>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"
2752440\" y=\"1135\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\">:not()\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 395 1101 Q 385 1101 362.5 1161 Q 340 1221 330 1221\" fill=\"none\" stroke=\"#ff8000\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"395\" y=\"1071\" width=\"80\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 395 1071 M 475 1071 M 475 1101 L 395 1101\" fill=\"none\" stroke=\"#ff8000\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 1098px; margin-left: 396px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Cspan style=\"font-size: 14px; font-weight: 700;\">:focus\u003C/span>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"435\" y=\"1098\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\">:focus\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 405 1221 Q 395 1221 367.5 1221 Q 340 1221 330 1221\" fill=\"none\" stroke=\"#ff8000\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"405\" y=\"1191\" width=\"70\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 405 1191 M 475 1191 M 475 1221 L 405 1221\" fill=\"none\" stroke=\"#ff8000\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 1218px; margin-left: 406px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Cspan style=\"font-size: 14px; font-weight: 700;\">:root\u003C/span>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"440\" y=\"1218\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\">:root\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Crect x=\"390\" y=\"1371\" width=\"100\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 390 1371 M 490 1371 M 490 1401 L 390 1401\" fill=\"none\" stroke=\"#ff0000\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 1398px; margin-left: 391px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">::selection\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"440\" y=\"1398\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\">::selection\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 330 1431 Q 340 1431 360 1416 Q 380 1401 390 1401\" fill=\"none\" stroke=\"#ff0000\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"390\" y=\"1421\" width=\"110\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 390 1421 M 500 1421 M 500 1451 L 390 1451\" fill=\"none\" stroke=\"#ff0000\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 108px; height: 1px; padding-top: 1448px; margin-left: 391px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">::first-letter\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"445\" y=\"1448\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\">::first-letter\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 330 1431 Q 340 1431 360 1441 Q 380 1451 390 1451\" fill=\"none\" stroke=\"#ff0000\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"540\" y=\"1401\" width=\"110\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 540 1401 M 650 1401 M 650 1431 L 540 1431\" fill=\"none\" stroke=\"#ff0000\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 108px; height: 1px; padding-top: 1428px; margin-left: 541px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">display:block\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"595\" y=\"1428\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">display:block\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 500 1451 Q 510 1451 520 1441 Q 530 1431 540 1431\" fill=\"none\" stroke=\"#ff0000\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"147\" y=\"131\" width=\"80\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 147 131 M 227 131 M 227 161 L 147 161\" fill=\"none\" stroke=\"#ff0080\" stroke-width=\"2\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 158px; margin-left: 148px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">display\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"187\" y=\"158\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\">display\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 130 261 Q 140 261 140 236 Q 140 211 138.5 211 Q 137 211 137 186 Q 137 161 147 161\" fill=\"none\" stroke=\"#ff0080\" stroke-width=\"2\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Cpath d=\"M 152 435 Q 142 435 141 348 Q 140 261 130 261\" fill=\"none\" stroke=\"#007fff\" stroke-width=\"2\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"152\" y=\"405\" width=\"90\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 152 405 M 242 405 M 242 435 L 152 435\" fill=\"none\" stroke=\"#007fff\" stroke-width=\"2\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 432px; margin-left: 153px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">position\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"197\" y=\"432\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\">position\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 275 71 Q 265 71 251 116 Q 237 161 227 161\" fill=\"none\" stroke=\"#ff0080\" stroke-width=\"2\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"275\" y=\"41\" width=\"220\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 275 41 M 495 41 M 495 71 L 275 71\" fill=\"none\" stroke=\"#ff0080\" stroke-width=\"2\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 218px; height: 1px; padding-top: 68px; margin-left: 276px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; overflow-wrap: normal;\">placement par rapport aux voisins\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"385\" y=\"68\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\" font-style=\"italic\">placement par rapport aux voisins\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 260 221 Q 250 221 243.5 191 Q 237 161 227 161\" fill=\"none\" stroke=\"#cc00cc\" stroke-width=\"2\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"260\" y=\"191\" width=\"270\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 260 191 M 530 191 M 530 221 L 260 221\" fill=\"none\" stroke=\"#ff0080\" stroke-width=\"2\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 268px; height: 1px; padding-top: 218px; margin-left: 261px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; overflow-wrap: normal;\">placement des éléments conenus (enfants)\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"395\" y=\"218\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\" font-style=\"italic\">placement des éléments conenus (enfants)\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 560 41 Q 550 41 527.5 56 Q 505 71 495 71\" fill=\"none\" stroke=\"#0000ff\" stroke-width=\"2\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"560\" y=\"11\" width=\"110\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 560 11 M 670 11 M 670 41 L 560 41\" fill=\"none\" stroke=\"#0000ff\" stroke-width=\"2\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 108px; height: 1px; padding-top: 38px; margin-left: 561px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">inline-block\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"615\" y=\"38\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\">inline-block\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 565 81 Q 555 81 530 76 Q 505 71 495 71\" fill=\"none\" stroke=\"#0000ff\" stroke-width=\"2\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"565\" y=\"51\" width=\"70\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 565 51 M 635 51 M 635 81 L 565 81\" fill=\"none\" stroke=\"#0000ff\" stroke-width=\"2\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-a
2752lign: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 78px; margin-left: 566px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">block\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"600\" y=\"78\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\">block\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Crect x=\"570.29\" y=\"101\" width=\"70\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 570.29 101 M 640.29 101 M 640.29 131 L 570.29 131\" fill=\"none\" stroke=\"#0000ff\" stroke-width=\"2\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 128px; margin-left: 571px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">inline\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"605\" y=\"128\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\">inline\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 500 71 Q 510 71 535.14 101 Q 560.29 131 570 131\" fill=\"none\" stroke=\"#0000ff\" stroke-width=\"2\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Cpath d=\"M 585 191 Q 575.29 191 557.64 206 Q 540 221 530 221\" fill=\"none\" stroke=\"#cc00cc\" stroke-width=\"3\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"585.29\" y=\"161\" width=\"60\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 585.29 161 M 645.29 161 M 645.29 191 L 585.29 191\" fill=\"none\" stroke=\"#990099\" stroke-width=\"2\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 188px; margin-left: 586px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">flex\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"615\" y=\"188\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\">flex\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 590 261 Q 580 261 560 241 Q 540 221 530 221\" fill=\"none\" stroke=\"#cc00cc\" stroke-width=\"3\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"590\" y=\"231\" width=\"60\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 590 231 M 650 231 M 650 261 L 590 261\" fill=\"none\" stroke=\"#cc00cc\" stroke-width=\"3\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 258px; margin-left: 591px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">grid\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"620\" y=\"258\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\">grid\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 680 41 Q 670 41 675 41 Q 680 41 670 41\" fill=\"none\" stroke=\"#0000ff\" stroke-width=\"2\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>
2752\u003Crect x=\"680\" y=\"1\" width=\"390\" height=\"40\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 680 1 M 1070 1 M 1070 41 L 680 41\" fill=\"none\" stroke=\"#0000ff\" stroke-width=\"2\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 388px; height: 1px; padding-top: 38px; margin-left: 681px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">L'élément prend la largeur nécessaire pour afficher son contenu, \u003Cdiv>accepte les  marges extérieurs left/right/top/bottom\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"875\" y=\"38\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">L'élément prend la largeur nécessaire pour afficher son contenu,...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Crect x=\"680\" y=\"41\" width=\"330\" height=\"40\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 680 41 M 1010 41 M 1010 81 L 680 81\" fill=\"none\" stroke=\"#0000ff\" stroke-width=\"2\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 328px; height: 1px; padding-top: 78px; margin-left: 681px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">L'élément prend toute la largeur de la zone d'affichage\u003Cdiv>accepte les marges extérieures top/left/bottom/right\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"845\" y=\"78\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">L'élément prend toute la largeur de la zone d'affichage...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 635 81 Q 645 81 657.5 81 Q 670 81 680 81\" fill=\"none\" stroke=\"#0000ff\" stroke-width=\"2\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"680\" y=\"91\" width=\"390\" height=\"40\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 680 91 M 1070 91 M 1070 131 L 680 131\" fill=\"none\" stroke=\"#0000ff\" stroke-width=\"2\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 388px; height: 1px; padding-top: 128px; margin-left: 681px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">L'élément prend la largeur nécessaire pour afficher son contenu, \u003Cdiv>accepte les  marges extérieurs left/right\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"875\" y=\"128\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">L'élément prend la largeur nécessaire pour afficher son contenu,...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 640.29 131 Q 650.29 131 660.14 131 Q 670 131 680 131\" fill=\"none\" stroke=\"#0000ff\" stroke-width=\"2\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"275\" y=\"291\" width=\"150\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 275 291 M 425 291 M 425 321 L 275 321\" fill=\"none\" stroke=\"#007fff\" stroke-width=\"2\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 148px; height: 1px; padding-top: 318px; margin-left: 276px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">static (par defaut)\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"350\" y=\"318\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\">static (par defaut)\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 242 435 Q 252 435 258.5 378 Q 265 321 275 321\" fill=\"none\" stroke=\"#007fff\" stroke-width=\"2\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Cpath d=\"M 285 360 Q 275 360 263.5 397.5 Q 252 435 242 435\" fill=\"none\" stroke=\"#007fff\" stroke-width=\"2\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"285\" y=\"330\" width=\"90\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 285 330 M 375 330 M 375 360 L 285 360\" fill=\"none\" stroke=\"#007fff\" stroke-width=\"2\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 357px; margin-left: 286px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">relative\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"330\" y=\"357\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\">relative\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 290 531 Q 280 531 266 483 Q 252 435 242 435\" fill=\"none\" stroke=\"#007fff\" stroke-width=\"2\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"290\" y=\"501\" width=\"80\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 290 501 M 370 501 M 370 531 L 290 531\" fill=\"none\" stroke=\"#007fff\" stroke-width=\"2\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 528px; margin-left: 291px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">sticky\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"330\" y=\"528\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\">sticky\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 300 465 Q 290 465 271 450 Q 252 435 242 435\" fill=\"none\" stroke=\"#007fff\" stroke-width=\"2\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"300\" y=\"435\" width=\"70\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 300 435 M 370 435 M 370 465 L 300 465\" fill=\"none\" stroke=\"#007fff\" stroke-width=\"2\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 462px; margin-left: 301px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">fixed\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"335\" y=\"462\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\">
2752fixed\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 290 411 Q 280 411 266 423 Q 252 435 242 435\" fill=\"none\" stroke=\"#007fff\" stroke-width=\"2\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"290\" y=\"381\" width=\"90\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 290 381 M 380 381 M 380 411 L 290 411\" fill=\"none\" stroke=\"#007fff\" stroke-width=\"2\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 408px; margin-left: 291px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">absolute\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"335\" y=\"408\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\">absolute\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 440 320 Q 430 320 432.5 320.25 Q 435 320.5 425 321\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"440\" y=\"290\" width=\"470\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 440 290 M 910 290 M 910 320 L 440 320\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 468px; height: 1px; padding-top: 317px; margin-left: 441px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">L'élément reste dans le flux, il se postionne dans l'ordre d'apparition dans le html\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"675\" y=\"317\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">L'élément reste dans le flux, il se postionne dans l'ordre d'apparition dans l...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 440 411 Q 430 411 410 411 Q 390 411 380 411\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"440\" y=\"371\" width=\"580\" height=\"40\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 440 371 M 1020 371 M 1020 411 L 440 411\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 578px; height: 1px; padding-top: 408px; margin-left: 441px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">L'élément sort du flux, il est repostionnable dans son contenur en postion relative avec le plus proche \u003Cdiv>avec top/left/bottom/right\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"730\" y=\"408\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">L'élément sort du flux, il est repostionnable dans son contenur en postion relative avec le plus...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 440 360 Q 430 360 407.5 360 Q 385 360 375 360\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>
2752\u003Crect x=\"440\" y=\"320\" width=\"390\" height=\"40\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 440 320 M 830 320 M 830 360 L 440 360\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 388px; height: 1px; padding-top: 357px; margin-left: 441px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Pareil que pour static, mais en plus, il est positionnable avrec top\u003Cbr />/left/bottom/rght\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"635\" y=\"357\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">Pareil que pour static, mais en plus, il est positionnable avrec...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 440 465 Q 430 465 405 465 Q 380 465 370 465\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"440\" y=\"425\" width=\"440\" height=\"40\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 440 425 M 880 425 M 880 465 L 440 465\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 438px; height: 1px; padding-top: 462px; margin-left: 441px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">L'élement sort du flux,n mais se postionne par rapport à la zone d'affichage \u003Cdiv>avec top/left/bottom/right\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"660\" y=\"462\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">L'élement sort du flux,n mais se postionne par rapport à la zone d'affich...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 450 531 Q 440 531 410 531 Q 380 531 370 531\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"450\" y=\"501\" width=\"460\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 450 501 M 910 501 M 910 531 L 450 531\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 458px; height: 1px; padding-top: 528px; margin-left: 451px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">L'éléemnt reste dans le flux , mais il apparît  tant que son conteneur est visible\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"680\" y=\"528\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">L'éléemnt reste dans le flux , mais il apparît  tant que son conteneur est v...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cswitch>\u003Cg requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\"/>\u003Ca transform=\"translate(0,-5)\" xlink:href=\"https://www.drawio.com/doc/faq/svg-export-text-problems\" target=\"_blank\">\u003Ctext text-anchor=\"middle\" font-size=\"10px\" x=\"50%\" y=\"100%\">Text is not SVG - cannot display\u003C/text>\u003C/a>\u003C/switch>\u003C/svg>","type":"application/vnd.drawio","modified":"20240610122509769","title":"$:/diagram/css"},
2753{"created":"20241018220018481","text":"\u003Csvg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" width=\"640px\" height=\"50px\" viewBox=\"-0.5 -0.5 640 50\" content=\"&lt;mxfile host=&quot;embed.diagrams.net&quot; agent=&quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0&quot; version=&quot;24.8.0&quot;&gt;&lt;diagram id=&quot;HWivPzLR9UPwS-6m1pYm&quot; name=&quot;Page-1&quot;&gt;jZNLj4IwEIB/DXcerq5HRXBNdi+LZs8NHaFJoaRWwf31O9CpQIzJenHmm5nOEy+Kq26vWVN+KQ7SC33eedHOC8NgES3wryd3S9ZBYEGhBSenEWTiFwj6RK+Cw2XmaJSSRjRzmKu6htzMGNNatXO3s5LzrA0r4AlkOZPP9EdwU1r6Hq5G/gGiKF3mYLm2loo5Z+rkUjKu2gmKEi+KtVLGSlUXg+yH5+Zi49IX1kdhGmrzn4DQBtyYvFJv+9NhlyA6HQ+fh2xzTE7fVKq5u/4NdPj6tjSVRBCgyKQoapRzzAsawQ20ETixDRkqwXkfvm1LYSBrWN6/1eJ9INPqWnPoS/JRO
27536va0M7DwOmUfNCFlLGSSg/FRL6/StOU/CY8HX7IqUUsCLqXYwoew8erBVWB0Xd0cQE+7YsOdkFqO25/6Vg52fwbMUYHVzxeHneCAq3FqeP6B9vkI4qSPw==&lt;/diagram&gt;&lt;/mxfile&gt;\">\u003Cdefs/>\u003Cg>\u003Cg data-cell-id=\"0\">\u003Cg data-cell-id=\"1\">\u003Cg data-cell-id=\"2\">\u003Cg>\u003Crect x=\"0\" y=\"0\" width=\"640\" height=\"50\" fill=\"#007fff\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 638px; height: 1px; padding-top: 25px; margin-left: 1px;\">\u003Cdiv data-drawio-colors=\"color: #FFFFFF; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 21px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">GUIDE UTILISATEUR\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"320\" y=\"31\" fill=\"#FFFFFF\" font-family=\"&quot;Helvetica&quot;\" font-size=\"21px\" text-anchor=\"middle\" font-weight=\"bold\">GUIDE UTILISATEUR\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003C/g>\u003C/g>\u003C/g>\u003Cswitch>\u003Cg requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\"/>\u003Ca transform=\"translate(0,-5)\" xlink:href=\"https://www.drawio.com/doc/faq/svg-export-text-problems\" target=\"_blank\">\u003Ctext text-anchor=\"middle\" font-size=\"10px\" x=\"50%\" y=\"100%\">Text is not SVG - cannot display\u003C/text>\u003C/a>\u003C/switch>\u003C/svg>","type":"application/vnd.drawio","modified":"20241018220133149","title":"$:/diagram/glossaire/bandeau"},
2754{"created":"20241017084124055","text":"\u003Csvg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" width=\"641px\" height=\"851px\" viewBox=\"-0.5 -0.5 641 851\" content=\"&lt;mxfile host=&quot;embed.diagrams.net&quot; agent=&quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0&quot; version=&quot;24.8.0&quot;&gt;&lt;diagram id=&quot;UMJPad6qmUtgzidmCr-K&quot; name=&quot;Page-1&quot;&gt;7Vttb+I4EP41fGyVd8hHKLRXqbuq1D3d7keTuOBrEnOO08L9+rNjJySxQ4G6lD2x0rbxxC/jmcePxxN34N6k6zsCVstvOIbJwLHi9cCdDhzHDh32kws2QuAHthAsCIplna3gCf0LpdCS0gLFMG9VpBgnFK3awghnGYxoSwYIwW/tas84aY+6AguoCJ4ikKjSv1BMl0I6coZb+R8QLZbVyHYQijcpqCrLmeRLEOO3hsidDdwbgjEVT+n6BibcdpVdRLvbnre1YgRmdJ8Gzki0eAVJIScnF
2754aObarYEF1kMeQNr4E7elojCpxWI+Ns35l4mW9I0YSWbPT6jJLnBCSasnOGMVZqoOkk1XyGhcN0QSR3vIE4hJRtWpXobSHtJwFTFt631A0/Klg3Lj3wpBNLji7rrrVHYg7RLj42C923Ep4IYQB7AHCaPOEcU4Yy9mmNKccqMUDua2zAG+bI2KEjQgleNmHkgaVuz6nYs61DMzZ1Tgl9q5Nmi9xXXJF0v+IK7TnH0UqyuU5RH12npIiaPERvhfHxjDw34RueaIGEjTObsYUHLKQrBM2ZTbDot+KfA1YurvCSZMatge6u1aCbfVx2No6iAiI9+xf7fJTjPASKw6p+pKoZoD8vEDVU6sGm4WreuhKM7LmuusIHjWtYwnAZMnnSgV+OpD5spimOuSA/KFFzy2UkuthkeJrigCcqYehXJcjTnbAYoW/zgXUyvAtmsoe9t+Y/XfIE0WlbNOgBmSkIG3OsMcq6eYN4r5QALLTOodYf2td/CreOrwLV9HamEH8etPXyfU2DMNh1ZxIQu8QJnIJltpZM2M2/rPODS/BxWf0NKN9JroKC4zS+9hqSALGAlkouM67PTtAQmgKLX9iaps5Js+ohRuSTXFc92XeJ1KSLHBYmgbNexdq3IfqRun4UD4BrRn7w5m7ko/Wq8ma5lz2Vh0yg8QoLYbPm6nO5cEcJiQhSexo+e4x7pR01XXqcr3+10JZBqAhKhgohZRsngxh2MQxZtlublS2NZikYpvND5oXS+YkuERdsIGyLxwOoizdKQuKsh8dBA8GE7Z8EhvYb89IXutSM/1ztymfuhwvzWfst8TAjYNKqteIX8AJVH1juaObvqswehwbGcY7sXCOnsezCENMHDJ0FIHck4KDwNKDqnmscEZDyDUnCsMHa9HDdM7E/yt5ndKfBGHaAEuiOGo9mdAhNHDP8sqOWkEa48qbROL96JmMxyurTQjTH23g6DLnA850TboRvu1OzQ7XNohZ/LlGr+h/EDhRmnxbgM2mMRwD+jrCSi/EKKH87BjAzlYGwl7KtPd02C1CZ2TRCkmvu+gOe3AY/vfC141GzBV+yuvYZsbYGj02yB/BhXtfpo5kfT1yemfpwzP4Y1Y5wqFGh6uFLXnIf3/jhm7SLRosyXwUuq7JhUWU7NMKWaJdMypS5LZoIpK2xettlTbrNDU9/JfL97iA2c022zjpoKaSflA5ByJ2TzXJzaZZL+gqiPIirGUZGWuDET6rcPjto8vQ5EJvL0jpoJ0X7ZAXMpe0XggpozQI3v9iZ1W7ip0yXGkaN+pn98GH9nkumf7MfT/Y+ZghE2N9oO6xTPdB1Ye1YHqnZU2XCqY1dlOXj3/pVAm/Ben1dNrO3OBSBbE11obwAZuZz1G53DTvX93Qta/jj6s5yj3JHx7BPlIT2zeUJXPaV8BUoYOMjmp2xfFnguXGbGeXGbDi9Lm2Zp74R4E3KuexrMuaa+43mucuOjC19DmFNVtndq5naX1YH1RzIMMYZpXc7iwKuOTs9VR/VzYzFP2I5VRiLaL40770DG6FWrTv/A5mdQC8juG5rvXeYs53J+0/s2/n5/O3vi8cj/aFbT+/HD/djAlC5x/GFx/BzhUrAxFMj7ba4djjRhvO6u7RFBPCtu/35C8Or2j1Dc2X8=&lt;/diagram&gt;&lt;/mxfile&gt;\">\u003Cdefs/>\u003Cg>\u003Cg data-cell-id=\"0\">\u003Cg data-cell-id=\"1\">\u003Cg data-cell-id=\"28\">\u003Cg>\u003Crect x=\"0\" y=\"0\" width=\"640\" height=\"850\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"26\">\u003Cg>\u003Crect x=\"0\" y=\"0\" width=\"637.45\" height=\"169.32\" fill=\"#ffffff\" stroke=\"#000000\" stroke-width=\"0.68\" pointer-events=\"all\"/>\u003Cpath d=\"M 38.25 0 L 32.72 2.82 L 15.3 0.11 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 14.45 12.3 L 35.27 12.53 L 34 16.71 L 54.82 17.95 L 48.02 31.49 L 25.07 30.14 L 23.37 34.09 L 3.4 33.41 L 8.5 27.66 L 0.85 27.09 L 0.85 19.64 L 13.6 16.93 Z\" fill=\"#d87146\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 55.67 8.13 L 48.87 6.21 L 59.5 0.34 L 100.29 0 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 65.87 11.85 L 107.09 4.74 L 117.72 10.05 L 72.67 17.27 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 139.39 12.19 L 154.27 18.74 L 71.82 30.25 L 76.07 27.43 L 76.92 22.24 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 121.54 2.03 L 135.99 8.13 L 147.47 6.21 L 169.99 16.71 L 211.21 11.51 L 191.24 0.23 L 132.17 0.11 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 228.63 9.93 L 211.21 0.11 L 259.23 0.11 L 290.68 4.85 L 257.96 12.98 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 244.36 16.59 L 238.83 16.25 L 228.21 9.6 L 249.46 7.79 L 261.36 12.3 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 308.95 1.92 L 301.73 0.23 L 314.48 0.11 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 326.38 6.32 L 317.88 4.29 L 334.03 0.11 L 354 0.11 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 402.45 3.5 L 388.85 0.11 L 414.35 0.23 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 418.59 6.43 L 439.84 0.9 L 446.64 1.58 L 438.14 8.58 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 373.97 18.4 L 410.94 9.26 L 436.44 12.76 L 416.04 27.88 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 390.97 14.22 L 410.94 9.48 L 436.44 12.76 L 427.09 19.3 Z\" fill=\"#d87146\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 452.59 11.18 L 460.24 4.85 L 488.29 9.14 L 462.79 16.
275403 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 510.39 4.06 L 491.69 0 L 525.26 0 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 527.81 4.29 L 540.98 1.13 L 576.26 7.34 L 561.38 10.72 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 571.16 15.69 L 591.98 10.61 L 637.45 18.85 L 637.03 28 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 591.13 4.18 L 567.76 0.23 L 595.8 0.11 L 600.9 1.35 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 621.73 3.73 L 634.48 0.23 L 638.3 0.34 L 637.45 7.11 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 470.01 19.53 L 516.76 6.77 L 551.61 13.09 L 484.04 27.77 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 448.77 20.43 L 473.41 31.27 L 450.04 36.12 L 430.49 31.04 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 521.44 26.19 L 554.16 18.85 L 580.08 23.71 L 563.51 33.19 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 575.41 35.45 L 592.41 25.74 L 631.08 32.62 L 592.83 38.83 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 608.13 41.09 L 637.88 36.12 L 637.03 46.17 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 574.98 49.1 L 592.83 44.81 L 633.2 51.7 L 611.53 57.34 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 507.41 40.64 L 518.04 32.17 L 580.08 42.33 L 543.11 48.43 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 541.84 59.26 L 548.21 54.75 L 543.11 52.26 L 563.08 51.36 L 601.33 60.17 L 583.91 66.6 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 483.61 35.67 L 505.29 29.46 L 509.54 30.14 L 508.26 32.06 L 496.36 38.61 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 421.57 47.07 L 474.69 37.82 L 487.01 40.75 L 453.02 48.99 L 463.21 52.26 L 449.62 55.31 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 467.47 49.67 L 489.14 43.35 L 507.41 47.3 L 485.74 53.84 Z\" fill=\"#d87146\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 508.69 53.05 L 518.46 49.89 L 531.21 53.05 L 529.09 57.23 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 501.89 66.71 L 461.52 58.13 L 472.99 55.76 L 486.59 58.81 L 497.21 56.33 L 523.99 60.73 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 514.64 68.41 L 535.46 62.99 L 574.13 70.78 L 569.46 73.37 L 555.43 74.5 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 631.5 60.05 L 614.93 66.6 L 637.88 69.76 L 638.3 60.96 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 613.23 80.26 L 621.3 77.21 L 637.88 78.68 L 636.6 83.42 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 595.8 91.32 L 604.73 84.44 L 630.65 86.92 L 616.2 92.56 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 566.06 114.24 L 589.86 96.74 L 608.98 96.74 L 635.75 99.67 L 604.73 119.88 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 618.33 121.91 L 627.25 115.93 L 637.45 116.72 L 637.45 124.62 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 633.2 112.54 L 637.88 109.27 L 637.88 112.54 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 545.66 130.83 L 561.81 119.65 L 637.45 130.15 L 637.03 143.25 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 526.96 145.73 L 540.98 135.8 L 637.88 149 L 637.45 159.39 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 516.34 155.66 L 522.71 151.15 L 638.3 164.69 L 638.3 166.61 
2754L 629.8 167.63 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 511.66 159.95 L 590.7 168.19 L 588.58 169.21 L 528.23 169.21 L 501.89 166.95 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 457.27 167.86 L 453.87 169.66 L 392.25 169.21 L 401.6 162.21 Z\" fill=\"#d87146\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 472.99 163.9 L 418.17 157.81 L 430.07 151.26 L 482.76 157.36 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 487.44 152.73 L 442.82 147.09 L 452.59 142.34 L 494.24 147.2 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 486.59 127.67 L 515.06 132.18 L 498.91 143.47 L 461.09 139.18 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 504.44 125.3 L 524.41 114.24 L 536.74 116.38 L 520.59 127.78 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 543.53 100.47 L 553.73 101.71 L 541.41 111.41 L 529.51 109.83 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 527.39 86.13 L 540.56 78.9 L 577.11 82.86 L 568.61 89.74 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 516.34 92.68 L 522.29 89.4 L 562.66 93.92 L 556.71 97.98 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 509.96 96.18 L 520.16 97.53 L 506.56 105.88 L 494.66 104.42 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 505.71 90.42 L 482.34 102.5 L 467.47 100.35 L 490.84 88.73 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 526.96 78 L 510.39 86.92 L 496.79 85.34 L 511.66 76.53 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 497.21 74.84 L 452.17 98.43 L 428.79 95.05 L 485.31 73.26 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 413.07 92.68 L 400.74 90.87 L 458.12 70.78 L 467.89 71.68 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 441.97 67.05 L 390.55 86.47 L 375.25 79.13 L 427.94 63.89 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 413.92 60.84 L 362.07 75.97 L 349.33 77.44 L 317.45 79.36 L 312.78 76.42 L 328.5 74.16 L 327.23 71.91 L 396.92 56.1 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 342.95 78 L 317.88 79.47 L 312.78 76.31 L 328.93 74.16 L 328.08 71.91 L 331.48 71 Z\" fill=\"#d87146\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 323.4 83.87 L 359.1 81.73 L 376.52 91.32 L 340.4 95.39 Z\" fill=\"#d87146\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 348.9 100.01 L 388.85 94.93 L 402.02 97.19 L 364.2 110.85 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 370.57 117.06 L 418.17 99.11 L 444.09 102.61 L 386.72 128.01 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 396.5 131.96 L 419.02 123.27 L 461.09 128.69 L 441.12 136.47 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 427.52 120.11 L 459.39 105.88 L 497.64 110.62 L 470.44 125.19 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 315.33 10.39 L 352.3 19.53 L 341.25 22.13 L 312.35 15.58 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 364.2 23.03 L 432.62 39.62 L 416.04 42.11 L 355.27 25.96 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 301.73 8.58 L 297.48 16.93 L 328.5 25.51 L 309.38 29.8 L 271.13 16.14 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 342.1 29.01 L 407.12 45.72 L 373.97 53.39 L 321.7 34.77 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 309.38 38.15 L 360.8 56.67 L 323.4 65.25 L 294.93 62.88 L 274.11 48.65 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 312.35 67.5 L 297.9 66.37 L 294.5 62.42 L 310.65 59.83 L 324.68 65.13 Z\" fill=\"#d87146\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 240.11 38.38 L 272.83 60.39 L 257.11 64.23 L 194.64 60.62 L 198.89 51.47 L 215.03 48.65 L 205.26 43.23 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 271.98 59.26 L 276.66 62.31 L 276.23 66.04 L 256.68 64.23 L 253.28 64.12 L 257.96 59.04 Z\" fill=\"#d87146\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 268.58 42.78 L 257.96 35.45 L 288.13 31.04 L 295.78 33.98 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 254.13 31.04 L 242.23 23.93 L 259.23 20.43 L 277.08 27.09 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 238.41 33.41 L 196.76 39.62 L 186.14 32.06 L 226.08 26.64 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 223.53 22.35 L 181.04 28.45 L 169.56 22.46 L 214.19 16.37 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 125.37 35.9 L 112.19 30.48 L 154.69 24.95 L 166.16 29.8 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 158.94 35.33 L 170.84 40.86 L 148.31 44.14 L 135.99 41.77 L 137.27 38.15 Z\" fill=\"#d87146\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 101.99 32.28 L 135.14 46.62 L 113.89 50.01 L 76.92 35.67 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 121.54 52.72 L 143.21 48.88 L 184.86 51.25 L 176.36 60.17 L 144.49 61.63 Z\" fill=\"#d87146\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 305.13 126.09 L 353.57 117.62 L 399.47 151.37 L 39
27540.55 153.97 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 285.15 123.83 L 359.95 146.75 L 336.15 145.96 L 272.41 126.54 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 364.2 152.39 L 387.57 157.24 L 368.87 169.21 L 269.86 169.32 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 42.5 147.65 L 93.92 162.66 L 64.6 169.55 L 18.7 169.32 L 20.82 152.39 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 0 157.47 L 24.65 151.49 L 58.65 161.31 L 23.8 169.44 L 0.43 169.66 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 34.42 145.39 L 0.85 152.5 L 0.85 142.57 L 15.72 139.97 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 68 137.94 L 56.52 134.1 L 108.37 122.7 L 107.52 119.54 L 136.84 113.45 L 150.44 114.35 L 157.24 117.17 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 65.45 118.07 L 91.8 126.31 L 76.92 129.25 L 49.3 121.35 Z\" fill=\"#d87146\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 84.57 114.24 L 31.02 125.64 L 0.43 115.14 L 49.3 103.74 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 159.79 108.37 L 175.09 105.21 L 191.66 110.06 L 168.29 114.8 L 159.37 112.43 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 63.75 37.93 L 129.62 64.46 L 118.14 67.16 L 135.99 73.49 L 129.62 74.84 L 77.35 55.43 L 85.84 53.96 L 62.47 44.59 L 39.95 48.43 L 55.67 56.1 L 46.32 57.57 L 30.6 52.38 L 34.42 46.06 L 56.52 42.44 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 56.95 47.3 L 71.82 52.49 L 62.9 54.3 L 50.15 48.54 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 45.05 61.86 L 68.85 57.34 L 106.67 70.89 L 96.04 72.81 L 64.17 62.88 L 53.12 64.34 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 54.4 83.19 L 50.15 82.29 L 54.4 76.08 L 84.15 76.53 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 43.77 82.18 L 37.82 82.4 L 23.8 76.76 L 42.92 76.99 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 14.45 79.47 L 33.15 83.76 L 28.47 85.45 L 11.48 82.97 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 18.7 73.49 L 22.52 64.23 L 36.55 64.23 L 43.77 66.71 L 40.37 73.94 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 26.78 55.31 L 38.67 58.7 L 25.92 60.05 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 10.2 62.65 L 0.85 73.71 L 1.7 62.31 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 124.09 77.78 L 59.92 90.53 L 64.6 92.11 L 127.92 79.81 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 51.42 92.22 L 54.4 93.24 L 23.37 99.67 L 21.68 98.66 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 101.57 90.87 C 101.57 90.87 138.97 82.4 138.97 82.4 C 138.97 82.4 177.21 93.35 177.21 93.35 C 177.21 93.35 138.54 102.72 138.54 102.72 C 138.54 102.72 130.89 101.03 130.89 101.03 C 130.89 101.03 108.37 93.58 108.37 93.58 C 108.37 93.58 101.14 90.98 101.14 90.98 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 93.49 92.9 C 93.49 92.9 101.14 95.61 101.14 95.61 C 101.14 95.61 119.42 103.29 119.42 103.29 C 119.42 103.29 126.64 105.54 126.64 105.54 
2754C 126.64 105.54 91.37 113.56 91.37 113.56 C 91.37 113.56 54.82 101.48 54.82 101.48 C 54.82 101.48 94.35 92.9 94.35 92.9 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 10.63 86.58 C 10.63 86.58 15.3 87.14 15.3 87.14 C 15.3 87.14 29.75 93.24 29.75 93.35 C 29.75 93.47 1.7 99.45 1.7 99.45 C 1.7 99.45 0.85 88.95 0.85 88.95 C 0.85 88.95 10.63 86.69 10.63 86.69 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cellipse cx=\"43.56\" cy=\"88.05\" rx=\"8.286852589641434\" ry=\"2.2577490039840633\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"0.68\" pointer-events=\"all\"/>\u003Cpath d=\"M 60.77 84.77 L 113.47 74.28 L 119.42 76.65 L 67.57 87.26 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 11.48 59.71 L 17 53.73 C 15.28 52.14 12.42 51.11 9.25 50.95 C 6.09 50.8 2.98 51.53 0.85 52.94 L 0.85 59.26 L 11.05 59.83 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 1.7 44.48 L 28.05 45.72 L 23.8 51.47 C 19.17 49.34 10.54 48.05 1.28 48.09 L 1.28 44.25 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 159.79 66.71 C 178.3 65.48 197.61 65.36 216.31 66.37 C 232.71 66.88 248.58 68.22 263.06 70.33 C 264.35 75.18 278.43 79.11 296.63 79.69 L 326.38 97.42 L 295.35 100.92 L 312.35 112.43 L 342.52 109.5 L 354 117.85 L 312.78 124.73 L 284.73 116.49 L 146.19 151.6 L 107.52 140.65 L 140.66 132.07 C 160.22 133.75 181.67 132.15 195.06 128.01 L 186.99 126.31 L 202.29 123.04 L 207.39 124.51 C 222.59 121.22 229.37 115.91 224.81 110.85 L 188.26 102.05 L 211.21 95.95 L 153.84 77.89 L 174.66 72.24 L 159.79 66.71 Z\" fill=\"#d87146\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 631.25 93.58 L 637.88 90.73 L 637.88 94.39 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 216.14 140.72 C 216.14 140.72 257.45 130.56 257.45 130.56 C 257.45 130.56 278.86 135.71 278.86 135.71 C 278.86 135.71 229.4 142.34 229.4 142.34 C 229.4 142.34 216.14 140.85 216.14 140.85 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 208.49 142.48 L 224.81 143.83 C 215.09 146.47 215.09 150.68 224.81 153.32 L 207.98 154.4 L 184.52 148.98 L 208.49 142.48 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 181.46 149.52 C 200.78 156.79 231.48 159.42 258.98 156.16 L 263.06 158.46 C 249.33 163.06 230.54 164.45 213.59 162.12 L 219.2 159.68 L 193.19 157.65 L 176.36 150.88 L 181.46 149.52 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 170.75 151.96 C 170.75 151.96 187.07 157.79 187.07 157.79 C 187.07 157.79 180.95 159.95 180.95 159.95 C 180.95 159.95 202.88 164.02 202.88 164.02 C 202.88 164.02 196.25 166.18 196.25 166.18 C 196.25 166.18 146.78 158.33 146.78 158.33 C 146.78 158.33 170.24 151.83 170.24 151.83 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 209.51 164.02 C 209.51 164.02 224.81 164.97 224.81 164.97 C 224.81 164.97 223.79 169.03 223.79 169.03 C 223.79 169.03 194.21 169.57 194.21 169.57 C 194.21 169.57 209.51 164.15 209.51 164.15 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 286.51 138.42 C 286.51 138.42 295.18 140.58 295.18 140.58 C 295.18 140.58 265.61 153.18 265.61 153.18 C 265.61 153.18 237.05 151.01 237.05 151.01 C 237.05 151.01 246.74 142.75 246.74 142.75 C 246.74 142.75 286.51 138.42 286.51 138.42 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 302.83 143.43 C 302.83 143.43 312.52 146.54 312.52 146.54 C 312.52 146.54 269.68 158.19 269.68 158.19 C 269.68 158.19 266.63 156.
275416 266.63 156.16 C 266.63 156.16 302.32 143.43 302.32 143.43 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 320.68 147.76 L 342.1 150.2 L 244.7 169.44 L 230.42 169.3 L 231.95 165.37 C 244.17 165.33 255.93 164.13 265.1 161.99 C 286.86 158.23 305.73 153.4 320.68 147.76 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 286.43 83.19 L 305.13 90.98 L 292.8 95.05 L 267.31 88.16 Z\" fill=\"#ffffff\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 176.36 75.52 L 201.86 69.54 L 237.13 79.13 L 209.09 86.02 Z\" fill=\"#ffffff\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 252.01 90.64 L 273.68 96.29 L 257.96 100.58 L 237.56 94.14 Z\" fill=\"#ffffff\" stroke=\"#d87146\" stroke-width=\"0.68\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Crect x=\"0.43\" y=\"0.11\" width=\"637.45\" height=\"169.32\" fill=\"none\" stroke=\"#000000\" stroke-width=\"1.35\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"6\">\u003Cg>\u003Cpath d=\"M 214 279 C 213.34 279 212.7 278.73 212.23 278.26 C 211.76 277.78 211.5 277.13 211.5 276.46 L 211.5 192.54 C 211.5 191.14 212.62 190 214 190 L 359 190 C 360.38 190 361.5 191.14 361.5 192.54 L 361.5 276.46 C 361.5 277.13 361.24 277.78 360.77 278.26 C 360.3 278.73 359.66 279 359 279 Z\" fill-opacity=\"0.9\" fill=\"#0079d6\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 284.56 254.19 L 298.4 254.19 L 298.4 258.19 L 284.56 258.19 Z M 284.56 246.1 L 302.38 246.1 L 302.38 250.08 L 284.56 250.08 Z M 284.56 238.01 L 302.38 238.01 L 302.38 241.97 L 284.56 241.97 Z M 262.63 233.89 L 262.63 229.87 L 302.38 229.87 L 302.38 233.89 Z M 262.63 258.19 L 262.63 238.01 L 280.47 238.01 L 280.47 258.19 Z M 307.81 266.31 C 306.97 265.38 306.46 264.14 306.46 262.25 L 306.46 221.78 L 258.61 221.78 L 258.61 261.65 C 258.61 264.64 259.96 266.31 263 266.31 Z M 262.45 270.32 C 257.58 270.32 254.67 266.66 254.67 262.19 L 254.67 217.72 L 310.37 217.72 L 310.37 225.84 L 318.31 225.84 L 318.31 262.26 C 318.31 266.51 316.44 270.32 311.72 270.32 Z M 212.75 210.34 L 212.75 276.46 C 212.75 277.16 213.31 277.73 214 277.73 L 359 277.73 C 359.69 277.73 360.25 277.16 360.25 276.46 L 360.25 210.34 Z\" fill-opacity=\"0.5\" fill=\"#ffffff\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 148px; height: 1px; padding-top: 191px; margin-left: 213px;\">\u003Cdiv data-drawio-colors=\"color: #FFFFFF; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Cb>\u003Cfont style=\"font-size: 14px;\">Accueil - Glossaire\u003C/font>\u003C/b>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"287\" y=\"203\" fill=\"#FFFFFF\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">Accueil - Glossaire\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"17\">\u003Cg>\u003Cpath d=\"M 101.5 410 L 102 440.5 L 101.61 463.63\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003Cpath d=\"M 101.52 468.88 L 98.14 461.82 L 101.61 463.63 L 105.14 461.94 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"21\">\u003Cg>\u003Cpath d=\"M 265.5 430 L 265.5 450 L 264.82 463.64\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003Cpath d=\"M 264.56 468.88 L 261.41 461.72 L 264.82 463.64 L 268.4 462.07 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"9\">\u003Cg>
2754\u003Cpath d=\"M 202.67 430 C 202.09 430 201.54 429.73 201.13 429.25 C 200.73 428.76 200.5 428.11 200.5 427.43 L 200.5 342.57 C 200.5 341.15 201.47 340 202.67 340 L 328.33 340 C 329.53 340 330.5 341.15 330.5 342.57 L 330.5 427.43 C 330.5 428.11 330.27 428.76 329.87 429.25 C 329.46 429.73 328.91 430 328.33 430 Z\" fill=\"#0079d6\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 257.22 375.47 L 257.22 373.43 C 257.22 371.16 259.11 369.82 260.38 369.82 L 270.7 369.82 C 272.78 369.82 273.79 372.11 273.79 373.28 L 273.79 375.47 L 271.12 375.47 L 271.12 373.7 C 271.12 373.27 270.91 373.01 270.54 373.01 L 260.42 373.01 C 260.09 373.01 259.89 373.25 259.89 373.71 L 259.89 375.47 Z M 263.58 402.71 L 263.58 394.16 L 267.44 394.16 L 267.44 402.71 Z M 241.98 381.2 C 241.98 379.05 243.4 377.4 245.29 377.4 L 286.04 377.4 C 287.72 377.4 289.02 379.44 289.02 380.99 L 289.02 390.27 C 289.02 393.68 285.43 397.46 282.11 397.46 L 269.02 397.46 L 269.02 394.65 C 269.02 393 267.97 392.26 267.27 392.26 L 263.96 392.26 C 262.95 392.26 261.97 393.16 261.97 394.32 L 261.97 397.46 L 248.24 397.46 C 246.1 397.46 241.98 394.19 241.98 390.07 Z M 245.25 419.45 C 243.39 419.45 241.98 417.96 241.98 415.3 L 241.98 395.14 C 243.34 397.46 246.23 399.38 248.83 399.38 L 261.97 399.38 L 261.97 402.41 C 261.97 403.58 262.88 404.6 263.89 404.6 L 267.27 404.6 C 268.23 404.6 269.02 403.48 269.02 402.49 L 269.02 399.38 L 281.99 399.38 C 284.06 399.38 287.39 398.03 289.02 395.05 L 289.02 415.65 C 289.02 418.39 287 419.45 285.96 419.45 Z M 201.58 360.57 L 201.58 427.43 C 201.58 428.14 202.07 428.71 202.67 428.71 L 328.33 428.71 C 328.93 428.71 329.42 428.14 329.42 427.43 L 329.42 360.57 Z\" fill-opacity=\"0.5\" fill=\"#ffffff\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 341px; margin-left: 202px;\">\u003Cdiv data-drawio-colors=\"color: #FFFFFF; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Entrées par thème\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"266\" y=\"353\" fill=\"#FFFFFF\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">Entrées par thème\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"12\">\u003Cg>\u003Cpath d=\"M 280 280 L 280 320 L 431.5 320 L 431.5 333.63\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003Cpath d=\"M 431.5 338.88 L 428 331.88 L 431.5 333.63 L 435 331.88 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"13\">\u003Cg>\u003Cpath d=\"M 280 320 L 101.5 320 L 101.5 333.63\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003Cpath d=\"M 101.5 338.88 L 98 331.88 L 101.5 333.63 L 105 331.88 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"14\">\u003Cg>\u003Cpath d=\"M 490.5 659 C 489.4 659 488.5 658.12 488.5 657.03 L 488.5 591.97 C 488.5 590.88 489.4 590 490.5 590 L 606.5 590 C 607.6 590 608.5 590.88 608.5 591.97 L 608.5 657.03 C 608.5 658.12 607.6 659 606.5 659 Z\" fill=\"#0079d6\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 525.09 651.96 C 523.66 651.96 522.1 650.81 522.1 648.99 L 522.1 614.76 C 522.1 613.03 523.64 611.82 525.02 611.82 L 571.95 611.82 C 573.39 611.82 574.9 613.05 574.9 614.74 L 574.9 649 C 574.9 650.77 573.36 651.96 571.98 651.96 Z M 566.6 637.84 L 562.83 637.84 L 562.83 631.89 L 549.25 631.89 L 549.25 627.43 L 554.53 627.43 L 554.53 619.26 L 542.47 619.26 L 542.47 627.43 L 547.75 627.43 L 547.75 631.89 L 534.17 631.89 L 534.17 637.84 L 530.4 637.84 L 530.4 644.53 L 539.45 644.53 L 539.45 637.84 L 535.68 637.84 L 535.68 633.38 L 547.75 633.38 L 547.75 637.84 L 543.98 637.84 L 543.98 644.53 L 553.03 644.53 L 553.03 637.84 L 549.25 637.84 L 549.25 633.38 L 561.32 633.38 L 561.32 637.84 L 557.55 637.84 L 557.55 644.53 L 566.6 644.53 Z M 489.5 605.77 L 489.5 657.03 C 489.5 657.57 489.95 658.01 490.5 658.01 L 606.5 658.01 C 607.05 658.01 607.5 657.57 607.5 657.03 L 607.5 605.77 Z\" fill-opacity=\"0.5\" fill=\"#ffffff\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 591px; margin-left: 490px;\">\u003Cdiv data-drawio-colors=\"color: #FFFFFF; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Cb>Plan du site\u003C/b>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"549\" y=\"603\" fill=\"#FFFFFF\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">Plan du site\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"15\">\u003Cg>
2754\u003Cpath d=\"M 286.5 279 L 280 279 L 280 320 L 549 320 L 549 583.63\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003Cpath d=\"M 549 588.88 L 545.5 581.88 L 549 583.63 L 552.5 581.88 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"16\">\u003Cg>\u003Cpath d=\"M 33.83 559 C 33.21 559 32.62 558.73 32.18 558.26 C 31.75 557.78 31.5 557.13 31.5 556.46 L 31.5 472.54 C 31.5 471.87 31.75 471.22 32.18 470.74 C 32.62 470.27 33.21 470 33.83 470 L 169.17 470 C 169.79 470 170.38 470.27 170.82 470.74 C 171.25 471.22 171.5 471.87 171.5 472.54 L 171.5 556.46 C 171.5 557.13 171.25 557.78 170.82 558.26 C 170.38 558.73 169.79 559 169.17 559 Z\" fill-opacity=\"0.8\" fill=\"#0079d6\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 99.69 534.19 L 112.61 534.19 L 112.61 538.19 L 99.69 538.19 Z M 99.69 526.1 L 116.33 526.1 L 116.33 530.08 L 99.69 530.08 Z M 99.69 518.01 L 116.33 518.01 L 116.33 521.97 L 99.69 521.97 Z M 79.22 513.89 L 79.22 509.87 L 116.33 509.87 L 116.33 513.89 Z M 79.22 538.19 L 79.22 518.01 L 95.87 518.01 L 95.87 538.19 Z M 121.39 546.31 C 120.6 545.38 120.12 544.14 120.12 542.25 L 120.12 501.78 L 75.46 501.78 L 75.46 541.65 C 75.46 544.64 76.73 546.31 79.57 546.31 Z M 79.05 550.32 C 74.51 550.32 71.8 546.66 71.8 542.19 L 71.8 497.72 L 123.78 497.72 L 123.78 505.84 L 131.19 505.84 L 131.19 542.26 C 131.19 546.51 129.45 550.32 125.03 550.32 Z M 32.67 490.34 L 32.67 556.46 C 32.67 557.16 33.19 557.73 33.83 557.73 L 169.17 557.73 C 169.81 557.73 170.33 557.16 170.33 556.46 L 170.33 490.34 Z\" fill-opacity=\"0.5\" fill=\"#ffffff\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 138px; height: 1px; padding-top: 471px; margin-left: 33px;\">\u003Cdiv data-drawio-colors=\"color: #FFFFFF; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Contenu des définitions\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"102\" y=\"483\" fill=\"#FFFFFF\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">Contenu des définitions\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"18\">\u003Cg>\u003Cpath d=\"M 363.83 559 C 363.21 559 362.62 558.73 362.18 558.26 C 361.75 557.78 361.5 557.13 361.5 556.46 L 361.5 472.54 C 361.5 471.87 361.75 471.22 362.18 470.74 C 362.62 470.27 363.21 470 363.83 470 L 499.17 470 C 499.79 470 500.38 470.27 500.82 470.74 C 501.25 471.22 501.5 471.87 501.5 472.54 L 501.5 556.46 C 501.5 557.13 501.25 557.78 500.82 558.26 C 500.38 558.73 499.79 559 499.17 559 Z\" fill-opacity=\"0.8\" fill=\"#0079d6\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 429.69 534.19 L 442.61 534.19 L 442.61 538.19 L 429.69 538.19 Z M 429.69 526.1 L 446.33 526.1 L 446.33 530.08 L 429.69 530.08 Z M 429.69 518.01 L 446.33 518.01 L 446.33 521.97 L 429.69 521.97 Z M 409.22 513.89 L 409.22 509.87 L 446.33 509.87 L 446.33 513.89 Z M 409.22 538.19 L 409.22 518.01 L 425.87 518.01 L 425.87 538.19 Z M 451.39 546.31 C 450.6 545.38 450.12 544.14 450.12 542.25 L 450.12 501.78 L 405.46 501.78 L 405.46 541.65 C 405.46 544.64 406.73 546.31 409.57 546.31 Z M 409.05 550.32 C 404.51 550.32 401.8 546.66 401.8 542.19 L 401.8 497.72 L 453.78 497.72 L 453.78 505.84 L 461.19 505.84 L 461.19 542.26 C 461.19 546.51 459.45 550.32 455.03 550.32 Z M 362.67 490.34 L 362.67 556.46 C 362.67 557.16 363.19 557.73 363.83 557.73 L 499.17 557.73 C 499.81 557.73 500.33 557.16 500.33 556.46 L 500.33 490.34 Z\" fill-opacity=\"0.5\" fill=\"#ffffff\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 138px; height: 1px; padding-top: 471px; margin-left: 363px;\">\u003Cdiv data-drawio-colors=\"color: #FFFFFF; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Contenu des définitions\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"432\" y=\"483\" fill=\"#FFFFFF\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">Contenu des définitions\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"19\">\u003Cg>\u003Cpath d=\"M 431.21 410 L 431.7 440.5 L 431.54 463.63\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003Cpath d=\"M 431.51 468.88 L 428.06 461.86 L 431.54 463.63 L 435.
275405 461.91 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"23\">\u003Cg>\u003Cpath d=\"M 265.5 559 L 265.5 595.63\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003Cpath d=\"M 265.5 600.88 L 262 593.88 L 265.5 595.63 L 269 593.88 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"20\">\u003Cg>\u003Cpath d=\"M 202.67 559 C 202.09 559 201.54 558.73 201.13 558.26 C 200.73 557.78 200.5 557.13 200.5 556.46 L 200.5 472.54 C 200.5 471.87 200.73 471.22 201.13 470.74 C 201.54 470.27 202.09 470 202.67 470 L 328.33 470 C 328.91 470 329.46 470.27 329.87 470.74 C 330.27 471.22 330.5 471.87 330.5 472.54 L 330.5 556.46 C 330.5 557.13 330.27 557.78 329.87 558.26 C 329.46 558.73 328.91 559 328.33 559 Z\" fill=\"#0079d6\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 261.4 547.46 L 241.5 547.46 L 241.5 495.86 L 285.46 495.86 L 285.46 520.36 L 281.21 520.36 L 281.21 500.62 L 245.5 500.62 L 245.54 542.7 L 261.45 542.7 Z M 249.5 538.12 L 249.5 524.04 L 261.45 524.04 L 261.45 538.12 Z M 261.4 519.28 L 249.5 519.28 L 249.5 505.25 L 261.4 505.25 Z M 265.5 505.25 L 277.5 505.25 L 277.5 519.28 L 265.5 519.28 Z M 289.5 524.04 L 289.5 552.21 L 265.5 552.21 L 265.5 524.04 Z M 201.58 490.34 L 201.58 556.46 C 201.58 556.79 201.7 557.12 201.9 557.36 C 202.1 557.59 202.38 557.73 202.67 557.73 L 328.33 557.73 C 328.62 557.73 328.9 557.59 329.1 557.36 C 329.3 557.12 329.42 556.79 329.42 556.46 L 329.42 490.34 Z\" fill-opacity=\"0.5\" fill=\"#ffffff\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 471px; margin-left: 202px;\">\u003Cdiv data-drawio-colors=\"color: #FFFFFF; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Contenu du theme\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"266\" y=\"483\" fill=\"#FFFFFF\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">Contenu du theme\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"22\">\u003Cg>\u003Cpath d=\"M 197.83 691 C 197.21 691 196.62 690.73 196.18 690.26 C 195.75 689.78 195.5 689.13 195.5 688.46 L 195.5 604.54 C 195.5 603.87 195.75 603.22 196.18 602.74 C 196.62 602.27 197.21 602 197.83 602 L 333.17 602 C 333.79 602 334.38 602.27 334.82 602.74 C 335.25 603.22 335.5 603.87 335.5 604.54 L 335.5 688.46 C 335.5 689.13 335.25 689.78 334.82 690.26 C 334.38 690.73 333.79 691 333.17 691 Z\" fill-opacity=\"0.7\" fill=\"#0079d6\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 263.69 666.19 L 276.61 666.19 L 276.61 670.19 L 263.69 670.19 Z M 263.69 658.1 L 280.33 658.1 L 280.33 662.08 L 263.69 662.08 Z M 263.69 650.01 L 280.33 650.01 L 280.33 653.97 L 263.69 653.97 Z M 243.22 645.89 L 243.22 641.87 L 280.33 641.87 L 280.33 645.89 Z M 243.22 670.19 L 243.22 650.01 L 259.87 650.01 L 259.87 670.19 Z M 285.39 678.31 C 284.6 677.38 284.12 676.14 284.12 674.25 L 284.12 633.78 L 239.46 633.78 L 239.46 673.65 C 239.46 676.64 240.73 678.31 243.57 678.31 Z M 243.05 682.32 C 238.51 682.32 235.8 678.66 235.8 674.19 L 235.8 629.72 L 287.78 629.72 L 287.78 637.84 L 295.19 637.84 L 295.19 674.26 C 295.19 678.51 293.45 682.32 289.03 682.32 Z M 196.67 622.34 L 196.67 688.46 C 196.67 689.16 197.19 689.73 197.83 689.73 L 333.17 689.73 C 333.81 689.73 334.33 689.16 334.33 688.46 L 334.33 622.34 Z\" fill-opacity=\"0.5\" fill=\"#ffffff\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 138px; height: 1px; padding-top: 603px; margin-left: 197px;\">\u003Cdiv data-drawio-colors=\"color: #FFFFFF; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Contenu des définitions\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"266\" y=\"615\" fill=\"#FFFFFF\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">Contenu des définitions\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"24\">\u003Cg>\u003Cpath d=\"M 32.33 430 C 31.71 430 31.12 429.73 30.68 429.25 C 3
27540.25 428.76 30 428.11 30 427.43 L 30 342.57 C 30 341.15 31.04 340 32.33 340 L 167.67 340 C 168.29 340 168.88 340.27 169.32 340.75 C 169.75 341.24 170 341.89 170 342.57 L 170 427.43 C 170 428.11 169.75 428.76 169.32 429.25 C 168.88 429.73 168.29 430 167.67 430 Z\" fill=\"#0079d6\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 75.15 416.52 L 75.15 372.54 C 75.56 369.32 77.82 366.76 80.73 366.22 L 114.58 366.22 L 124.85 377.43 L 124.85 416.52 C 124.49 419.94 122.06 422.64 118.96 423.07 L 80.88 423.07 C 77.84 422.57 75.49 419.88 75.15 416.52 Z M 88.19 407.15 L 111.24 407.15 L 111.24 402.38 L 88.19 402.38 Z M 111.24 398.06 L 111.24 393.41 L 88.19 393.41 L 88.19 398.06 Z M 88.19 389.1 L 111.24 389.1 L 111.24 384.5 L 88.19 384.5 Z M 112.34 380.19 L 120.79 380.19 L 112.34 370.53 Z M 31.17 360.57 L 31.17 427.43 C 31.17 427.77 31.29 428.1 31.51 428.34 C 31.73 428.58 32.02 428.71 32.33 428.71 L 167.67 428.71 C 167.98 428.71 168.27 428.58 168.49 428.34 C 168.71 428.1 168.83 427.77 168.83 427.43 L 168.83 360.57 Z\" fill-opacity=\"0.5\" fill=\"#ffffff\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 138px; height: 1px; padding-top: 341px; margin-left: 31px;\">\u003Cdiv data-drawio-colors=\"color: #FFFFFF; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Entrées  par définitions\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"100\" y=\"353\" fill=\"#FFFFFF\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">Entrées  par définitions\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"25\">\u003Cg>\u003Cpath d=\"M 373.98 430 C 373.32 430 372.69 429.73 372.22 429.25 C 371.76 428.76 371.5 428.11 371.5 427.43 L 371.5 342.57 C 371.5 341.89 371.76 341.24 372.22 340.75 C 372.69 340.27 373.32 340 373.98 340 L 517.52 340 C 518.18 340 518.81 340.27 519.28 340.75 C 519.74 341.24 520 341.89 520 342.57 L 520 427.43 C 520 428.11 519.74 428.76 519.28 429.25 C 518.81 429.73 518.18 430 517.52 430 Z\" fill=\"#0079d6\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 419.39 416.52 L 419.39 372.54 C 419.82 369.32 422.22 366.76 425.31 366.22 L 461.21 366.22 L 472.11 377.43 L 472.11 416.52 C 471.73 419.94 469.15 422.64 465.86 423.07 L 425.47 423.07 C 422.25 422.57 419.75 419.88 419.39 416.52 Z M 433.22 407.15 L 457.67 407.15 L 457.67 402.38 L 433.22 402.38 Z M 457.67 398.06 L 457.67 393.41 L 433.22 393.41 L 433.22 398.06 Z M 433.22 389.1 L 457.67 389.1 L 457.67 384.5 L 433.22 384.5 Z M 458.84 380.19 L 467.8 380.19 L 458.84 370.53 Z M 372.74 360.57 L 372.74 427.43 C 372.74 427.77 372.87 428.1 373.1 428.34 C 373.33 428.58 373.65 428.71 373.98 428.71 L 517.52 428.71 C 517.85 428.71 518.17 428.58 518.4 428.34 C 518.63 428.1 518.76 427.77 518.76 427.43 L 518.76 360.57 Z\" fill-opacity=\"0.5\" fill=\"#ffffff\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 147px; height: 1px; padding-top: 341px; margin-left: 373px;\">\u003Cdiv data-drawio-colors=\"color: #FFFFFF; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Entrées par abréviations\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"446\" y=\"353\" fill=\"#FFFFFF\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">Entrées par abréviations\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"27\">\u003Cg>\u003Crect x=\"0\" y=\"70\" width=\"640\" height=\"50\" fill=\"#007fff\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 638px; height: 1px; padding-top: 95px; margin-left: 1px;\">\u003Cdiv data-drawio-colors=\"color: #FFFFFF; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 21px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">PLAN DU SITE\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"320\" y=\"101\" fill=\"#FFFFFF\" font-family=\"&quot;Helvetica&quot;\" font-size=\"21px\" text-anchor=\"middle\" font-weight=\"bold\">PLAN DU SITE\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"29\">\u003Cg>\u003Cpath d=\"M 286 280 L 280 280 L 280 333.63\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003Cpath d=\"M 280 338.88 L 276.5 331.88 L 280 333.63 L 283.5 331.88 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"30\">\u003Cg>\u003Cpath d=\"M 180 320 L 180 321 L 186 321 L 186 765 L 383.63 765\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003Cpath d=\"M 388.88 765 L 381.88 768.5 L 383.63 765 L 381.88 761.5 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"33\">\u003Cg>\u003Cpath d=\"M 392.5 810 C 391.84 810 391.2 809.73 390.73 809.25 C 390.26 808.76 390 808.11 390 807.43 L 390 722.57 C 390 721.89 390.26 721.24 390.73 720.75 C 391.2 720.27 391.84 720 392.5 720 L 537.5 720 C 538.16 720 538.8 720.27 539.27 720.75 C 539.74 721.24 540 721.89 54
27540 722.57 L 540 807.43 C 540 808.11 539.74 808.76 539.27 809.25 C 538.8 809.73 538.16 810 537.5 810 Z\" fill=\"#0079d6\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 460.01 771.05 C 454.32 771.05 448.83 766.05 448.83 758.44 C 448.83 751.53 453.58 745.66 459.91 745.66 C 465.99 745.66 471.08 751.37 471.08 758.03 C 471.08 766.14 465.66 771.05 460.01 771.05 Z M 437.33 796.69 C 438.02 790.7 438.25 784.31 439.97 779.19 C 440.51 777.71 441.35 776.47 442.56 775.54 C 443.73 774.62 447.61 772.37 448.35 772.16 C 449.06 771.88 449.91 771.9 450.47 772.36 C 456.23 777.84 464.31 777.22 469.57 772.46 C 469.96 772.08 470.76 771.9 471.65 772.22 C 473.37 772.88 477.15 775.24 477.49 775.58 C 478.45 776.29 479.13 777.18 479.63 778.18 C 479.27 778.37 478.92 778.57 478.58 778.84 C 477.74 778.19 476.81 777.79 475.87 777.71 L 467.77 777.71 C 465.73 777.71 463.92 779.47 463.76 781.48 C 463.1 782.04 462.25 782.92 462.26 784.64 L 462.26 796.69 Z M 469.67 787.63 L 469.67 786.1 L 475.61 786.1 L 475.61 787.63 Z M 469.67 791.44 L 469.67 789.92 L 475.61 789.92 L 475.61 791.44 Z M 469.67 795.26 L 469.67 793.73 L 475.61 793.73 L 475.61 795.26 Z M 481.56 787.63 L 481.56 786.1 L 487.49 786.1 L 487.49 787.63 Z M 481.56 791.44 L 481.56 789.92 L 487.49 789.92 L 487.49 791.44 Z M 481.56 795.26 L 481.56 793.73 L 487.49 793.73 L 487.49 795.26 Z M 489.35 781.51 L 482.19 781.51 C 480.91 781.51 479.32 782.74 479.32 784.74 L 479.32 800.59 C 480.75 799.98 480.94 799.89 481.83 799.82 L 489.71 799.83 L 489.71 781.93 C 489.71 781.61 489.5 781.51 489.35 781.51 Z M 477.07 803.63 C 476.66 803.63 476.35 803.33 476.35 802.87 L 465.9 802.87 C 465.11 802.87 464.49 802.18 464.49 801.5 L 464.49 784.47 C 464.49 783.77 465.14 783.05 465.97 783.05 L 465.97 781.79 C 465.97 780.79 466.91 780 467.69 780 L 475.64 780 C 476.79 780.02 477.98 781.22 478.58 782.28 C 479.49 780.69 480.71 780.01 481.5 780 L 489.4 780 C 490.43 780 491.19 780.93 491.19 781.84 L 491.19 783.05 L 491.44 783.06 C 492.12 783.19 492.67 783.8 492.67 784.48 L 492.67 801.47 C 492.67 802.31 491.95 802.87 491.3 802.87 L 480.8 802.87 C 480.8 803.34 480.51 803.63 480.12 803.63 Z M 467.45 799.82 L 475.02 799.82 C 476.2 799.84 476.61 799.98 477.84 800.59 L 477.84 784.4 C 477.84 783.28 476.68 781.51 474.84 781.51 L 467.8 781.51 C 467.54 781.51 467.45 781.74 467.45 781.91 Z M 391.25 740.57 L 391.25 807.43 C 391.25 807.77 391.38 808.1 391.62 808.34 C 391.85 808.58 392.17 808.71 392.5 808.71 L 537.5 808.71 C 537.83 808.71 538.15 808.58 538.38 808.34 C 538.62 808.1 538.75 807.77 538.75 807.43 L 538.75 740.57 Z\" fill-opacity=\"0.5\" fill=\"#ffffff\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 148px; height: 1px; padding-top: 721px; margin-left: 391px;\">\u003Cdiv data-drawio-colors=\"color: #FFFFFF; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Cfont style=\"font-size: 12px;\">\u003Cb>Publication\u003C/b>\u003C/font>\u003Cdiv style=\"\">\u003Cfont style=\"font-size: 12px;\">\u003Cb>\u003Cbr />\u003C/b>\u003C/font>\u003C/div>\u003Cdiv style=\"\">\u003Cfont style=\"font-size: 12px;\">\u003Cb>MANIFESTE\u003C/b>\u003C/font>\u003C/div>\u003Cdiv style=\"\">\u003Cfont style=\"font-size: 12px;\">\u003Cb>DIALIA\u003C/b>\u003C/font>\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"465\" y=\"733\" fill=\"#FFFFFF\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">Publication...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003C/g>\u003C/g>\u003C/g>\u003Cswitch>\u003Cg requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\"/>\u003Ca transform=\"translate(0,-5)\" xlink:href=\"https://www.drawio.com/doc/faq/svg-export-text-problems\" target=\"_blank\">\u003Ctext text-anchor=\"middle\" font-size=\"10px\" x=\"50%\" y=\"100%\">Text is not SVG - cannot display\u003C/text>\u003C/a>\u003C/switch>\u003C/svg>","type":"application/vnd.drawio","modified":"20241018220113185","title":"$:/diagram/glossaire/plan_du_site"},
2755{"created":"20241017093131570","text":"\u003Csvg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" width=\"742px\" height=\"903px\" viewBox=\"-0.5 -0.5 742 903\" content=\"&lt;mxfile host=&quot;embed.diagrams.net&quot; agent=&quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0&quot; version=&quot;24.8.0&quot;&gt;&lt;diagram id=&quot;6QHPF_d1CmfSBgKFUZJZ&quot; name=&quot;Page-1&quot;&gt;7Vxdc5s4F/4t70Wm24swCPFhLvPZ3ZluZ2e7M3stg2JrIgMVOB/7619JCAzokOAGJ24bdxobSQjpPM85OjqSOMEXm4dPghTrP/OU8hPPTR9O8OWJ56HYk39VwmOdEISoTlgJlpoyu4Sv7D9qEl2TumUpLXsFqzznFSv6iUmeZTSpemlEiPy+X+wm5/2nFmRFrYSvCeF26r8srdZ16sKLdum/U
27557ZaN09GYVznbEhT2PSkXJM0v+8k4asTfCHyvKp/bR4uKFeya+RS33c9kts2TNCsmnJDUN9wR/jW9M20q3psOrsS+bY4weeb/I4sdaIrrwQt2X/d67wiVedaIk671zRl3UueJ7dUtQHJCwNTJ9vuhunZHRUVfYBANnf35Cj5R/MNrcSjLGfuiozkDfVCc3m/wzFsaLbuYLiIfMdtKGTos2or30lY/jBChgUePi/wshL5bUssJaCWJVqypFxr0akLwtkqk78TKSgqZMK62vDdXYWqcvOwUlrobKTMt4Uj5VURllFROkulClT8yzJd/bkwqqZqrltxkfNc6GbhUH/6OV6d5bqL5Oamn4XrrMRX/xR95DP/oQ+1OC80g5KtKNkd/VtRqXnsjmVowDI0YBkasAz1WYa6LHMtlhne1ZIYZV0wwjqbXa/Fn+h5/qjWMmmsPpMl5X/lJatYrjiyzKsq33w3nZpqz0yZKi9axAdkhWiXkTu2IqopTpmInPNzIiCaxfojc5ZEyMbLRE+17IZx3qVcHKfpkHIqK8szqnrFJL1Mv7NcqMa9CF6TG8R964GQbT48AP0ocF8O/eLNTceGlYkjhB5SnzYWLYotbnX6jf7sZeFHwZDDqtMMrI+N7JGFR+ACgATxy/GIjwMPkiVrJV5ApIt9ReqHYV+esRO8XFCNkjwpKdNDeaf04uiAOUarLZq1A8/QHenIzhZLvK9YTr2+2p9OVHtvBq1HaILwfjSa4YPQzJtOM872JBRgr/Y2WEMaBZNIhOYgEX5eNH0ejLBnyJClnKlIIZLCESRl+flWuhiZp1yvgfMh6g6djzknG5amqiUtPzm96ZZvvI623Eo9UIIxMBGD8eZaf5Svt6YdX7AsSMKylbwKdnnXTMnPsCC4vtjlfNU0GYxg5S2tkvUoPfZXCoQcjPruReQAHAnaUa9na4JZdMg/LlO9txTxAg+l6CFnoqrNYq8nTKl/cFWTaF5e+aGSCAT98asaRv4RqBoUCgi5QuJGTkx7jAm/bfMm47SeLZ/JAnHxoAXSZMtfK/X9ZasCWJ6bqj8bSZumYtmmuu66XJOcsruXPG6uZv92wdm3rTINH2US2aj5ZbYsi84jRjogk3UfmtTX9Y8k6ypHKg7Pt+rx0re4bSId+FxlmpkSisw1FFVR918ylfrlylx+NT0wzorquKkpNpdQRU0HhmYAmrdD9wOezr76FaC+o+P72NatCAG+zizOjh0jOSdy1qoU4oOEiPHy52eIrumIKRJ6rtMA1ZjgAEMDNYoWNlEWM8zfkR1Q+dIGqd4Z8uYMwRZDQmDejRaAIxfPYUbs+M5fTELcHTPr8UYNs6PDVW9csm7VK02/6CB2/AQMW3tkCBhhgIDSbEXBYTjo2ZGzK9mfC3xydlZRiIofSJJsKePvpDpWUvVdIxzbrhGKPCf0bUbNsYjgTQgnjk0oB/PFyUs/GyL0wuNW8MdzQRJqcWdsCjy6rACt7+jFwTrpFC3geML+eDVRxSaYEIXAEGRjhX13lvW+Bp5jCcjsLUB/sOAuP68ZjvGgyOdwsHbnTGrnGuqPZOmaCvn/tS0vuFQXWDxooqYdAxrYBnRsNS9NKdUUGlqGOubzWV/pp96vWUW/Flr3L+9lQ+chF/IH5EKuswDmmiHALhw7GM9AMDti+onnZUmYeHXQO1s72uWafcdGA+GhAMOLvkNlW4KFB1iCxQxA2YHZdVWpHWNnqg7v+v7+3mGk8ApH9ieh3CFFcQwIdhfavxPNGZDz3L6qIQ9YAw0gKx7OgN2EbVPHue3F+D5j642tZZ3FGPZD2iEQdfPdyEZojqAbsDHpQnFZjj9j7ooanEi24rZggLU8k9SfQTyjDa786OFJlzMN8PvwWtDPoSpBu5792Ni0heN6tuMI6QueAw07tPWn7I9UiFKmcroinAJB0J8dGN/13xoYIKjESabcxa0Cg1WA0/Czw4LwW8OC7TjL+/hijy/RECapTwBMBxtk8HvwYr/ghRs7fj9+EcW7fcjPhDBm2rGM7QiGXmbZSk14Ze+6swd57/lR1ybOBA/yw4FCRV7suLbXFuIDmT0wOPImkeJnoPF8GxqiP4eBRm1JXAymqtiDsIECV7NgY8cVrrJK6Nh/rJw31UHtzKnfZGly7hgxbt5R4Qe7GyYAeQj8/Mn4YeyEQMhhFgztkMPO9FkrhoPro8fvsKYR98ALwwgCLwJ2Z80CHLg3690wKsMYDRVLkuBVDaMdafjMyqoOuStbmNaW8IZl9UaOemq12gVl3cs/zj7/cXZkSL62icTudCSBxchZoBzZgQPax6MH68D2cOAqhjHoKkaHchWh007vFlFbxIWlRzE4Wh3KIvp29GLgKsoW6IuNFNu3rUr64bTroN5igCZCiCJ0MG/Rf49u7Bnd8KwNgj4YkIKiG2imDRpNfOUXeoUCaqLYzR6mJt7XETmOoaXAOfbE+RPOstUCP6AEBru4vIW9GCo1ArATsxiKCYe0jjRarXalbEhfFw7/ogebCS2JJlubPuV9CO+DMX7yW1qm93M65btdhPbRePEMmzN8e8L9CZiwQfuvuNlxlPUE0jt6dG+aqw4fySFpQ/gJeP7orN47+7GzebaueMTRrfTK2pPLY6OH6qANNhLDLG15DPm0O8fHhvq7XlbSGqQupP4cpJ3wppIx0o71ZG87PTDTKAbUFhIAcufgNDC7BQ7mgQcHJp7IC/1njuQtxSzVPLOL/NX0ILT14M1HkmiErG+kduA8/WkbmdRevGKCWC1/c9X7mfR2L/31sba0mjI3ZMP4Y130d8rvqMK0k7+jlNdQymTUDx0Y4DrvjghG5DdXU8KtoOUz5RJSjBXpGnrfrd1gV+ItOXjaHkQe3pmLYk0yU6VXpylGnxoSq+TOdoc6j0mCZuZJbtNVnVMJWdmNrL95kl6Zr+HXb57rPOY+F2m/YW1dsi/LWyarU3XWDtapIVCvnNYfXQcg3yVJbldam04HIMspb41v98fHTjdSmuRCT9pOqzVLbjNamrazTDqTzROGZTtAP1mu05xeuZSVBSePTY7e1+C5/2ObQk4lSVYZsHlOqoF8nz5NvM94Dpmkjm37YexNk+sOl5mDhTUMIsggzXHgpKmjY5D+qYNRvP5K1kSsRk/QdYYdrpjQCeN/55E7KXHC6YbqU+TTbtn3gHswdsC9IHqB4gPLyopwrlWhy873s+3Hf7Yd91cmY/jFEZBT2YSKXqROdpDwb1rlWzFBgbS+uWpE/NVPCR45x/zBsZYImLY00eIew8I5DPaEgCYQERoNNFmE0DHs89Yzgd4OODnMNETB99S/Jwk6JCHLy8hhcugtnbWU1kwI4n68qPPOmO6ge6DXfQUTQqRPHxrUr87C8mMJ2fhbXa1++u08L7aw7Rm+3k5giP1zvJYnsIOrx3Gi791KWq/6GixDgAdLfRcylN8RlpWXu/dy67zOy83x1f8B&lt;/diagram&gt;&lt;/mxfile&gt;\">\u003Cdefs/>\u003Cg>\u003Cg data-cell-id=\"0\">\u003Cg data-cell-id=\"1\">\u003Cg data-cell-id=\"5\">\u003Cg/>\u003Cg data-cell-id=\"6\">\u003Cg>\u003Cpath d=\"M 0 28 L 610 28 L 610 902.01 L 0 902.01 Z\" fill=\"rgb(255, 255, 255)\" stroke=\"#666666\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cellipse cx=\"545\" cy=\"43\" rx=\"10\" ry=\"10\" fill=\"none\" stroke=\"#666666\" pointer-events=\"all\"/>\u003Cellipse cx=\"570\" cy=\"43\" rx=\"10\" ry=\"10\" fill=\"none\" stroke=\"#666666\" pointer-events=\"all\"/>\u003Cellipse cx=\"595\" cy=\"43\" rx=\"10\" ry=\"10\" fill=\"none\" stroke=\"#008cff\" pointer-events=\"all\"/>\u003Cpath d=\"M 0 68 L 30 68 L 30 43 C 30 40.24 32.24 38 35 38 L 170 38 C 172.76 38 175 40.24 
2755175 43 L 175 68 L 610 68\" fill=\"none\" stroke=\"#c4c4c4\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 0 138 L 610 138\" fill=\"none\" stroke=\"#c4c4c4\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 100 88 C 100 85.24 102.24 83 105 83 L 595 83 C 597.76 83 600 85.24 600 88 L 600 113 C 600 115.76 597.76 118 595 118 L 105 118 C 102.24 118 100 115.76 100 113 Z\" fill=\"none\" stroke=\"#c4c4c4\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cg fill=\"#666666\" font-family=\"&quot;Arial&quot;, &quot;Helvetica&quot;\" font-size=\"17px\"/>\u003Cg fill=\"#666666\" font-family=\"&quot;Arial&quot;, &quot;Helvetica&quot;\" font-size=\"17px\"/>\u003Cpath d=\"M 37 45 L 48 45 L 52 49 L 52 63 L 37 63 Z\" fill=\"none\" stroke=\"#c4c4c4\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 48 45 L 48 49 L 52 50\" fill=\"none\" stroke=\"#c4c4c4\" stroke-width=\"0.5\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 107 92 L 118 92 L 122 96 L 122 110 L 107 110 Z\" fill=\"none\" stroke=\"#c4c4c4\" stroke-width=\"2\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 118 92 L 118 96 L 122 97\" fill=\"none\" stroke=\"#c4c4c4\" stroke-width=\"0.5\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 12 102 L 22 92 L 22 98 L 32 98 L 32 106 L 22 106 L 22 112 Z\" fill=\"#c4c4c4\" stroke=\"#c4c4c4\" stroke-width=\"2\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 62 102 L 52 92 L 52 98 L 42 98 L 42 106 L 52 106 L 52 112 Z\" fill=\"#c4c4c4\" stroke=\"#c4c4c4\" stroke-width=\"2\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 87.6 105.3 C 85.9 108.13 82.22 109.06 79.38 107.36 C 76.54 105.67 75.61 102 77.29 99.15 C 78.98 96.31 82.65 95.36 85.5 97.04 L 83.9 98.5 L 91.8 100.3 L 90 92.8 L 88.3 94.4 C 85.11 92.03 80.8 91.82 77.39 93.87 C 73.99 95.92 72.16 99.83 72.77 103.76 C 73.37 107.69 76.3 110.86 80.16 111.79 C 84.03 112.72 88.07 111.22 90.4 108 Z\" fill=\"#c4c4c4\" stroke=\"#c4c4c4\" stroke-width=\"2\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"7\">\u003Cg>\u003Crect x=\"225\" y=\"503\" width=\"750\" height=\"20\" fill=\"rgb(255, 255, 255)\" stroke=\"#999999\" transform=\"rotate(270,600,513)\" pointer-events=\"all\"/>\u003Cpath d=\"M 245 503 L 245 523 M 955 503 L 955 523\" fill=\"none\" stroke=\"#999999\" stroke-miterlimit=\"10\" transform=\"rotate(270,600,513)\" pointer-events=\"all\"/>\u003Cpath d=\"M 229 513 L 241 507 L 241 519 Z M 971 513 L 959 507 L 959 519 Z\" fill=\"#99ddff\" stroke=\"none\" transform=\"rotate(270,600,513)\" pointer-events=\"all\"/>\u003Crect x=\"375\" y=\"506\" width=\"60\" height=\"14\" rx=\"5\" ry=\"5\" fill=\"#99ddff\" stroke=\"none\" transform=\"rotate(270,600,513)\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"8\">\u003Cg>\u003Crect x=\"46.69\" y=\"169\" width=\"500\" height=\"59\" fill=\"#ffffff\" stroke=\"#999999\" pointer-events=\"all\"/>\u003C/g>\u003Cg data-cell-id=\"9\">\u003Cg data-cell-id=\"10\">\u003Cg>\u003Cellipse cx=\"502.69\" cy=\"198.5\" rx=\"10\" ry=\"10\" fill=\"none\" stroke=\"#008cff\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"11\">\u003Cg data-cell-id=\"12\">\u003Cg>\u003Cpath d=\"M 462.69 208.5 L 482.69 208.5\" fill=\"none\" stroke=\"#008cff\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"13\">\u003Cg>\u003Cellipse cx=\"470.85\" cy=\"199.25\" rx=\"12.845\" ry=\"12.75\" fill=\"#ffffff\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"14\">\u003Cg>\u003Cellipse cx=\"440\" cy=\"200.25\" rx=\"10\" ry=\"10\" fill=\"none\" stroke=\"#008cff\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"15\">\u003Cg>\u003Cellipse cx=\"373.85\" cy=\"199.25\" rx=\"12.845\" ry=\"12.75\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"16\">\u003Cg>\u003Cpath d=\"M 711 436.5 L 641 436.5 L 440 521\" fill=\"none\" stroke=\"#666666\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cg fill=\"#666666\" font-family=\"&quot;Arial&quot;, &quot;Helvetica&quot;\" text-anchor=\"middle\" font-size=\"17px\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-end; width: 1px; height: 1px; padding-top: 418px; margin-left: 709px;\">\u003Cdiv data-drawio-colors=\"color: #666666; \" style=\"box-sizing: border-box; font-size: 0px; text-align: right;\">\u003Cdiv style=\"display: inline-block; font-size: 9px; font-family: Helvetica; color: rgb(102, 102, 102); line-height: 1.2; pointer-events: all; white-space: nowrap;\">\u003Cfont style=\"font-size: 9px;\">Nuage de mots\u003C/font>\u003Cdiv style=\"font-size: 9px;\">\u003Cfont style=\"font-size: 9px;\">(Cliquable) \u003C/font>\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"709\" y=\"427\" fill=\"#666666\" font-family=\"&quot;Helvetica&quot;\" font-size=\"9px\" text-anchor=\"end\">Nuage de mots...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"17\">\u003Cg>\u003Cpath d=\"M 728.17 146.75 L 658.17 146.75 L 550.17 210.25\" fill=\"none\" stroke=\"#666666\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cg fill=\"#666666\" font-family=\"&quot;Arial&quot;, &quot;Helvetica&quot;\" text-anchor=\"middle\" font-size=\"17px\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-end; width: 1px; height: 1px; padding-top: 128px; margin-left: 726px;\">\u003Cdiv data-drawio-colors=\"color: #666666; \" style=\"box-sizing: border-box; font-size: 0px; text-align: right;\">\u003Cdiv style=\"display: inline-block; font-size: 17px; font-family: Helvetica; color: rgb(102, 102, 102); line-height: 1.2; pointer-events: all; white-space: nowrap;\">Barre d'outils\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"726\" y=\"145\" fill=\"#666666\" font-family=\"&quot;Helvetica&quot;\" font-size=\"17px\" text-anchor=\"end\">Barre d'outils\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"18\">\u003Cg>\u003Cpath d=\"M 740.17 603.5 L 670.17 603.5 L 560.17 668\" fill=\"none\" stroke=\"#666666\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cg fill=\"#666666\" font-family=\"&quot;Arial&quot;, &quot;Helvetica&quot;\" text-anchor=\"middle\" font-size=\"17px\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-end; width: 1px; height: 1px; padding-top: 585px; margin-left: 738px;\">\u003Cdiv data-drawio-colors=\"color: #666666; \" style=\"box-sizing: border-box; font-size: 0px; text-align: right;\">\u003Cdiv style=\"display: inline-block; font-size: 17px; font-family: Helvetica; color: rgb(102, 102, 102); line-height: 1.2; pointer-events: all; white-space: nowrap;\">Navigation\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"738\" y=\"602\" fill=\"#666666\" font-family=\"&quot;Helvetica&quot;\" font-size=\"17px\" text-anchor=\"end\">Navigation\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"19\">\u003Cg>\u003Cpath d=\"M 720 723.5 L 650 723.5 L 566.25 788\" fill=\"none\" stroke=\"#666666\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cg fill=\"#666666\" font-family=\"&quot;Arial&quot;, &quot;Helvetica&quot;\" text-anchor=\"middle\" font-size=\"17px\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-end; width: 1px; height: 1px; padding-top: 705px; margin-left: 718px;\">\u003Cdiv data-drawio-colors=\"color: #666666; \" style=\"box-sizing: border-box; font-size: 0px; text-align: right;\">\u003Cdiv style=\"display: inline-block; font-size: 17px; font-family: Helvetica; color: rgb(102, 102, 102); line-height: 1.2; pointer-events: all; white-space: nowrap;\">Pied\u003Cdiv>de \u003C/div>\u003Cdiv>page\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"718\" y=\"722\" fill=\"#666666\" font-family=\"&quot;Helvetica&quot;\" font-size=\"17px\" text-anchor=\"end\">Pied...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"20\">\u003Cg>\u003Cpath d=\"M 732.64 386.5 L 662.64 386.5 L 560 411\" fill=\"none\" stroke=\"#666666\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cg fill=\"#666666\" font-family=\"&quot;Arial&quot;, &quot;Helvetica&quot;\" text-anchor=\"middle\" font-size=\"17px\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-end; width: 1px; height: 1px; padding-top: 368px; margin-left: 731px;\">\u003Cdiv data-drawio-colors=\"color: #666666; \" style=\"box-sizing: border-box; font-size: 0px; text-align: right;\">\u003Cdiv style=\"display: inline-block; font-size: 17px; font-family: Helvetica; color: rgb(102, 102, 102); line-height: 1.2; pointer-events: all; white-space: nowrap;\">Entête\u003Cdiv>d'accueil\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"731\" y=\"385\" fill=\"#666666\" font-family=\"&quot;Helvetica&quot;\" font-size=\"17px\" text-anchor=\"end\">Entête...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"21\">\u003Cg>\u003Cpath d=\"M 381 423 C 381 418.03 385.02 414 390 414 L 542 414 C 54
27556.97 414 551 409.98 551 405 C 551 409.98 555.03 414 560 414 L 712 414 C 716.98 414 721 418.03 721 423\" fill=\"none\" stroke=\"#999999\" stroke-miterlimit=\"10\" transform=\"rotate(89,551,414)\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"22\">\u003Cg>\u003Cellipse cx=\"410\" cy=\"200.25\" rx=\"10\" ry=\"10\" fill=\"none\" stroke=\"#008cff\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"23\">\u003Cg>\u003Crect x=\"70\" y=\"178.83\" width=\"260\" height=\"39.33\" rx=\"5\" fill=\"#ddeeff\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 253px; height: 1px; padding-top: 198px; margin-left: 77px;\">\u003Cdiv data-drawio-colors=\"color: #999999; \" style=\"box-sizing: border-box; font-size: 0px; text-align: left;\">\u003Cdiv style=\"display: inline-block; font-size: 15px; font-family: Helvetica; color: rgb(153, 153, 153); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">          Barre de recherche\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"77\" y=\"203\" fill=\"#999999\" font-family=\"&quot;Helvetica&quot;\" font-size=\"15px\">          Barre de recherche\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"24\">\u003Cg/>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 80px; height: 1px; padding-top: 57px; margin-left: 70px;\">\u003Cdiv data-drawio-colors=\"color: #666666; \" style=\"box-sizing: border-box; font-size: 0px; text-align: left;\">\u003Cdiv style=\"display: inline-block; font-size: 17px; font-family: Helvetica; color: rgb(102, 102, 102); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Glossaire\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"70\" y=\"62\" fill=\"#666666\" font-family=\"&quot;Helvetica&quot;\" font-size=\"17px\">Glossaire\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"25\">\u003Cg/>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 1px; height: 1px; padding-top: 101px; margin-left: 132px;\">\u003Cdiv data-drawio-colors=\"color: #666666; \" style=\"box-sizing: border-box; font-size: 0px; text-align: left;\">\u003Cdiv style=\"display: inline-block; font-size: 17px; font-family: Helvetica; color: rgb(102, 102, 102); line-height: 1.2; pointer-events: all; white-space: nowrap;\">https://www.iap2p.vercel.app\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"132\" y=\"106\" fill=\"#666666\" font-family=\"&quot;Helvetica&quot;\" font-size=\"17px\">https://www.iap2p.vercel.app\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"26\">\u003Cg>\u003Cpath d=\"M 71 616 L 478 616\" fill=\"none\" stroke=\"#999999\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"27\">\u003Cg>\u003Crect x=\"189.5\" y=\"796.02\" width=\"150\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px;
2755 padding-top: 811px; margin-left: 265px;\">\u003Cdiv data-drawio-colors=\"color: #0000ff; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 17px; font-family: Helvetica; color: rgb(0, 0, 255); line-height: 1.2; pointer-events: all; text-decoration: underline; white-space: nowrap;\">Contact\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"265\" y=\"816\" fill=\"#0000ff\" font-family=\"&quot;Helvetica&quot;\" font-size=\"17px\" text-anchor=\"middle\" text-decoration=\"underline\">Contact\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"28\">\u003Cg>\u003Crect x=\"334.5\" y=\"796.02\" width=\"150\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 811px; margin-left: 410px;\">\u003Cdiv data-drawio-colors=\"color: #0000ff; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 17px; font-family: Helvetica; color: rgb(0, 0, 255); line-height: 1.2; pointer-events: all; text-decoration: underline; white-space: nowrap;\">Mentions legales\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"410\" y=\"816\" fill=\"#0000ff\" font-family=\"&quot;Helvetica&quot;\" font-size=\"17px\" text-anchor=\"middle\" text-decoration=\"underline\">Mentions legales\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"29\">\u003Cg>\u003Crect x=\"64.5\" y=\"796.02\" width=\"150\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 811px; margin-left: 140px;\">\u003Cdiv data-drawio-colors=\"color: #0000ff; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 17px; font-family: Helvetica; color: rgb(0, 0, 255); line-height: 1.2; pointer-events: all; text-decoration: underline; white-space: nowrap;\">Plan du site\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"140\" y=\"816\" fill=\"#0000ff\" font-family=\"&quot;Helvetica&quot;\" font-size=\"17px\" text-anchor=\"middle\" text-decoration=\"underline\">Plan du site\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"30\">\u003Cg>\u003Cpath d=\"M 77.5 777.02 L 484.5 777.02\" fill=\"none\" stroke=\"#999999\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"31\">\u003Cg>\u003Cpath d=\"M 511.41 808.02 C 511.41 803.04 515.44 799.02 520.41 799.02 L 539.42 799.02 C 544.39 799.02 548.42 794.99 548.42 790.02 C 548.42 794.99 552.45 799.02 557.42 799.02 L 576.42 799.02 C 581.4 799.02 585.42 803.04 585.42 808.02\" fill=\"none\" stroke=\"#999999\" stroke-miterlimit=\"10\" transform=\"rotate(89,548.42,799.02)\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"32\">\u003Cg/>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 712px; margin-left: 108px;\">\u003Cdiv data-drawio-colors=\"color: #666666; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 17px; font-family: Helvetica; color: rgb(102, 102, 102); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: nowrap;\">Naviguer\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"108\" y=\"717\" fill=\"#666666\" font-family=\"&quot;Helvetica&quot;\" font-size=\"17px\" text-anchor=\"middle\" font-weight=\"bold\">Naviguer\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"33\">\u003Cg/>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 715px; margin-left: 170px;\">\u003Cdiv data-drawio-colors=\"color: #aaaaaa; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 24px; font-family: Helvetica; color: rgb(170, 170, 170); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: nowrap;\">&gt;
2755\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"170\" y=\"722\" fill=\"#aaaaaa\" font-family=\"&quot;Helvetica&quot;\" font-size=\"24px\" text-anchor=\"middle\" font-weight=\"bold\">&gt;\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"34\">\u003Cg/>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 715px; margin-left: 297px;\">\u003Cdiv data-drawio-colors=\"color: #008cff; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 17px; font-family: Helvetica; color: rgb(0, 140, 255); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: nowrap;\">Entrées par les abréviations\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"297\" y=\"720\" fill=\"#008cff\" font-family=\"&quot;Helvetica&quot;\" font-size=\"17px\" text-anchor=\"middle\" font-weight=\"bold\">Entrées par les abréviations\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"35\">\u003Cg/>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 650px; margin-left: 113px;\">\u003Cdiv data-drawio-colors=\"color: #666666; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 17px; font-family: Helvetica; color: rgb(102, 102, 102); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: nowrap;\">Naviguer  \u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"113\" y=\"655\" fill=\"#666666\" font-family=\"&quot;Helvetica&quot;\" font-size=\"17px\" text-anchor=\"middle\" font-weight=\"bold\">Naviguer  \u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"36\">\u003Cg/>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 649px; margin-left: 168px;\">\u003Cdiv data-drawio-colors=\"color: #aaaaaa; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 24px; font-family: Helvetica; color: rgb(170, 170, 170); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: nowrap;\">&gt;\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"168\" y=\"656\" fill=\"#aaaaaa\" font-family=\"&quot;Helvetica&quot;\" font-size=\"24px\" text-anchor=\"middle\" font-weight=\"bold\">&gt;\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"37\">\u003Cg/>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 649px; margin-left: 340px;\">\u003Cdiv data-drawio-colors=\"color: #008cff; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 17px; font-family: Helvetica; color: rgb(0, 140, 255); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: nowrap;\">Liste des défintion du glossaire DIALIA\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"340\" y=\"654\" fill=\"#008cff\" font-family=\"&quot;Helvetica&quot;\" font-size=\"17px\" text-anchor=\"middle\" font-weight=\"bold\">Liste des défintion du g...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"38\">\u003Cg/>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 682px; margin-left: 110px;\">\u003Cdiv data-drawio-colors=\"color: #666666; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 17px; font-family: Helvetica; color: rgb(102, 102, 102); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: nowrap;\">Naviguer \u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"110\" y=\"687\" fill=\"#666666\" font-family=\"&quot;Helvetica&quot;\" font-size=\"17px\" text-anchor=\"middle\" font-weight=\"bold\">Naviguer \u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"39\">\u003Cg/>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 680px; margin-left: 169px;\">\u003Cdiv data-drawio-colors=\"color: #aaaaaa; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 24px; font-family: Helvetica; color: rgb(170, 170, 170); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: nowrap;\">&gt;
2755\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"169\" y=\"687\" fill=\"#aaaaaa\" font-family=\"&quot;Helvetica&quot;\" font-size=\"24px\" text-anchor=\"middle\" font-weight=\"bold\">&gt;\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"40\">\u003Cg/>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 680px; margin-left: 268px;\">\u003Cdiv data-drawio-colors=\"color: #008cff; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 17px; font-family: Helvetica; color: rgb(0, 140, 255); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: nowrap;\">Entrées thématiques \u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"268\" y=\"685\" fill=\"#008cff\" font-family=\"&quot;Helvetica&quot;\" font-size=\"17px\" text-anchor=\"middle\" font-weight=\"bold\">Entrées thématiques \u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"41\">\u003Cg>\u003Cpath d=\"M 471.16 691.03 C 471.16 686.05 475.19 682.03 480.16 682.03 L 532.17 682.03 C 537.14 682.03 541.17 678 541.17 673.03 C 541.17 678 545.2 682.03 550.17 682.03 L 602.17 682.03 C 607.15 682.03 611.17 686.05 611.17 691.03\" fill=\"none\" stroke=\"#999999\" stroke-miterlimit=\"10\" transform=\"rotate(89,541.17,682.03)\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"42\">\u003Cg/>\u003C/g>\u003Cg data-cell-id=\"43\">\u003Cg/>\u003Cg data-cell-id=\"44\">\u003Cg>\u003Crect x=\"69\" y=\"288\" width=\"388.45\" height=\"288.84\" fill=\"#ffffff\" stroke=\"#000000\" stroke-width=\"1.16\" pointer-events=\"all\"/>\u003Cpath d=\"M 92.31 288 L 88.94 292.81 L 78.32 288.19 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 77.81 308.99 L 90.5 309.37 L 89.72 316.5 L 102.41 318.62 L 98.26 341.73 L 84.28 339.41 L 83.24 346.15 L 71.07 345 L 74.18 335.18 L 69.52 334.22 L 69.52 321.51 L 77.29 316.88 Z\" fill=\"#d87146\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 102.93 301.86 L 98.78 298.59 L 105.26 288.58 L 130.12 288 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 109.14 308.22 L 134.26 296.09 L 140.73 305.14 L 113.28 317.46 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 153.94 308.8 L 163.01 319.97 L 112.77 339.61 L 115.36 334.79 L 115.87 325.94 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 143.06 291.47 L 151.87 301.86 L 158.86 298.59 L 172.59 316.5 L 197.71 307.64 L 185.54 288.39 L 149.54 288.19 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 208.32 304.95 L 197.71 288.19 L 226.97 288.19 L 246.13 296.28 L 226.19 310.15 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 217.91 316.31 L 214.54 315.73 L 208.07 304.37 L 221.01 301.29 L 228.26 308.99 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 257.27 291.27 L 252.87 288.39 L 260.63 288.19 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 267.89 298.78 L 262.71 295.32 L 272.55 288.19 L 284.72 288.19 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 314.24 293.97 L 305.95 288.19 L 321.49 288.39 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 324.08 298.98 L 337.03 289.54 L 341.17 290.7 L 335.99 302.64 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 296.89 319.39 L 319.42 303.79 L 334.96 309.76 L 322.53 335.56 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 307.25 312.26 L 319.42 304.18 L 334.96 309.76 L 329.26 320.93 Z\" fill=\"#d87146\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 344.8 307.06 L 349.46 296.28 L 366.55 303.6 L 351.01 315.34 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 380.02 294.93 L 368.62 288 L 389.08 288 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 390.64 295.32 L 398.66 289.93 L 420.16 300.52 L 411.09 306.29 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 417.05 314.77 L 429.74 306.1 L 457.45 320.16 L 457.19 335.76 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 429.22 295.13 L 414.98 288.39 L 432.07 288.19 L 435.18 290.31 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 447.87 294.35 L 455.63 288.39 L 457.97 288.58 L 457.45 300.13 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 355.42 321.31 L 383.9 299.55 L 405.14 310.34 L 363.96 335.37 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>
2755\u003Cpath d=\"M 342.47 322.85 L 357.49 341.34 L 343.24 349.62 L 331.33 340.96 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 386.75 332.68 L 406.69 320.16 L 422.49 328.44 L 412.39 344.61 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 419.64 348.47 L 430 331.9 L 453.56 343.65 L 430.26 354.24 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 439.58 358.09 L 457.71 349.62 L 457.19 366.76 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 419.38 371.76 L 430.26 364.45 L 454.86 376.19 L 441.65 385.82 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 378.2 357.32 L 384.68 342.88 L 422.49 360.21 L 399.96 370.61 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 399.18 389.1 L 403.07 381.39 L 399.96 377.16 L 412.13 375.62 L 435.44 390.64 L 424.82 401.61 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 363.7 348.85 L 376.91 338.26 L 379.5 339.41 L 378.72 342.69 L 371.47 353.86 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 325.89 368.3 L 358.26 352.51 L 365.77 357.52 L 345.06 371.57 L 351.27 377.16 L 342.99 382.36 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 353.86 372.73 L 367.07 361.94 L 378.2 368.68 L 365 379.85 Z\" fill=\"#d87146\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 378.98 378.51 L 384.94 373.11 L 392.71 378.51 L 391.41 385.63 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 374.84 401.8 L 350.24 387.17 L 357.23 383.13 L 365.51 388.33 L 371.99 384.09 L 388.3 391.6 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 382.61 404.69 L 395.3 395.45 L 418.86 408.74 L 416.01 413.17 L 407.47 415.09 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 453.82 390.44 L 443.72 401.61 L 457.71 407 L 457.97 391.98 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 442.69 424.91 L 447.61 419.71 L 457.71 422.22 L 456.93 430.3 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 432.07 443.78 L 437.51 432.04 L 453.3 436.27 L 444.5 445.9 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 413.94 482.87 L 428.44 453.03 L 440.1 453.03 L 456.41 458.03 L 437.51 492.5 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 445.79 495.97 L 451.23 485.76 L 457.45 487.11 L 457.45 500.59 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 454.86 479.99 L 457.71 474.4 L 457.71 479.99 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 401.51 511.18 L 411.35 492.12 L 457.45 510.03 L 457.19 532.36 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 390.12 536.6 L 398.66 519.65 L 457.71 542.18 L 457.45 559.9 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 383.64 553.55 L 387.53 545.84 L 457.97 568.95 L 457.97 572.22 L 452.79 573.96 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 380.79 560.86 L 428.96 574.92 L 427.67 576.65 L 390.89 576.65 L 374.84 572.8 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 347.65 574.34 L 345.58 577.42 L 308.02 576.65 L 313.72 564.71 Z\" fill=\"#d87146\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 357.23 567.6 L 323.82 557.2 L 331.07 546.04 L 363.18 556.43 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>
2755\u003Cpath d=\"M 366.03 548.54 L 338.84 538.91 L 344.8 530.82 L 370.18 539.1 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 365.51 505.79 L 382.87 513.49 L 373.02 532.75 L 349.98 525.43 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 376.39 501.75 L 388.56 482.87 L 396.07 486.53 L 386.23 505.98 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 400.22 459.38 L 406.43 461.5 L 398.92 478.06 L 391.67 475.36 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 390.38 434.93 L 398.4 422.6 L 420.67 429.34 L 415.5 441.09 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 383.64 446.1 L 387.27 440.51 L 411.87 448.21 L 408.24 455.15 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 379.76 452.06 L 385.97 454.37 L 377.69 468.62 L 370.44 466.12 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 377.17 442.24 L 362.92 462.85 L 353.86 459.19 L 368.11 439.35 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 390.12 421.06 L 380.02 436.27 L 371.73 433.58 L 380.79 418.56 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 371.99 415.67 L 344.54 455.92 L 330.3 450.14 L 364.74 412.97 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 320.71 446.1 L 313.2 443.01 L 348.16 408.74 L 354.12 410.28 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 338.32 402.38 L 306.99 435.5 L 297.67 422.99 L 329.78 396.99 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 321.23 391.79 L 289.64 417.6 L 281.87 420.1 L 262.45 423.37 L 259.6 418.37 L 269.18 414.51 L 268.4 410.66 L 310.87 383.7 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 277.99 421.06 L 262.71 423.57 L 259.6 418.17 L 269.44 414.51 L 268.92 410.66 L 270.99 409.12 Z\" fill=\"#d87146\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 266.07 431.08 L 287.83 427.42 L 298.44 443.78 L 276.43 450.72 Z\" fill=\"#d87146\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 281.61 458.61 L 305.95 449.95 L 313.98 453.8 L 290.93 477.1 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 294.82 487.69 L 323.82 457.07 L 339.62 463.04 L 304.66 506.37 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 310.62 513.11 L 324.34 498.28 L 349.98 507.52 L 337.81 520.81 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 329.52 492.89 L 348.94 468.62 L 372.25 476.71 L 355.67 501.55 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 261.15 305.72 L 283.68 321.31 L 276.95 325.74 L 259.34 314.57 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 290.93 327.28 L 332.63 355.59 L 322.53 359.83 L 285.5 332.29 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 252.87 302.64 L 250.28 316.88 L 269.18 331.52 L 257.53 338.84 L 234.22 315.54 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 277.47 337.49 L 317.09 365.99 L 296.89 379.08 L 265.04 347.31 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 257.53 353.09 L 288.86 384.67 L 266.07 399.3 L 248.72 395.26 L 236.03 371 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 259.34 403.15 L 250.53 401.23 L 248.46 394.49 L 258.3 390.06 
2755L 266.85 399.11 Z\" fill=\"#d87146\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 215.32 353.47 L 235.26 391.02 L 225.67 397.57 L 187.61 391.41 L 190.2 375.81 L 200.04 371 L 194.08 361.75 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 234.74 389.1 L 237.59 394.29 L 237.33 400.65 L 225.41 397.57 L 223.34 397.38 L 226.19 388.71 Z\" fill=\"#d87146\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 232.67 360.98 L 226.19 348.47 L 244.58 340.96 L 249.24 345.96 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 223.86 340.96 L 216.61 328.82 L 226.97 322.85 L 237.85 334.22 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 214.28 345 L 188.9 355.59 L 182.43 342.69 L 206.77 333.45 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 205.22 326.13 L 179.32 336.53 L 172.33 326.32 L 199.52 315.92 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 145.39 349.24 L 137.37 339.99 L 163.26 330.56 L 170.26 338.84 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 165.85 348.27 L 173.11 357.71 L 159.38 363.29 L 151.87 359.25 L 152.65 353.09 Z\" fill=\"#d87146\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 131.15 343.07 L 151.35 367.53 L 138.4 373.31 L 115.87 348.85 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 143.06 377.93 L 156.27 371.38 L 181.65 375.42 L 176.47 390.64 L 157.05 393.14 Z\" fill=\"#d87146\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 254.94 503.09 L 284.46 488.65 L 312.43 546.23 L 306.99 550.66 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 242.77 499.24 L 288.34 538.33 L 273.84 536.98 L 235 503.86 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 290.93 547.96 L 305.18 556.24 L 293.78 576.65 L 233.44 576.84 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 94.9 539.87 L 126.23 565.48 L 108.36 577.23 L 80.4 576.84 L 81.69 547.96 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 69 556.63 L 84.02 546.42 L 104.74 563.17 L 83.5 577.04 L 69.26 577.42 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 89.98 536.02 L 69.52 548.15 L 69.52 531.21 L 78.58 526.78 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 110.43 523.31 L 103.44 516.76 L 135.04 497.32 L 134.52 491.92 L 152.39 481.53 L 160.67 483.07 L 164.82 487.88 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 108.88 489.42 L 124.94 503.48 L 115.87 508.49 L 99.04 495.01 Z\" fill=\"#d87146\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 120.53 482.87 L 87.9 502.32 L 69.26 484.41 L 99.04 464.97 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 166.37 472.86 L 175.69 467.47 L 185.79 475.75 L 171.55 483.84 L 166.11 479.79 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 107.85 352.7 L 147.99 397.95 L 140.99 402.58 L 151.87 413.36 L 147.99 415.67 L 116.13 382.55 L 121.31 380.05 L 107.07 364.06 L 93.34 370.61 L 102.93 383.7 L 97.23 386.21 L 87.65 377.35 L 89.98 366.57 L 103.44 360.4 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 103.7 368.68 L 112.77 377.54 L 107.33 380.62 L 99.56 370.8 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 96.45 393.53 L 110.95 385.82 L 134 408.93 L 127.53 412.2 L 108.1 395.26 L 101.37 397.76 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 102.15 429.92 L 99.56 428.38 L 102.15 417.79 L 120.28 418.56 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 95.67 428.19 L 92.05 428.57 L 83.5 418.94 L 95.16 419.33 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 77.81 423.57 L 89.2 430.88 L 86.35 433.77 L 75.99 429.53 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 80.4 413.36 L 82.73 397.57 L 91.27 397.57 L 95.67 401.8 L 93.6 414.13 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 85.32 382.36 L 92.57 388.13 L 84.8 390.44 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 75.22 394.87 L 69.52 413.74 L 70.04 394.29 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 144.62 420.68 L 105.52 442.44 L 108.36 445.13 L 146.95 424.14 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 100.34 445.32 L 102.15 447.06 L 83.24 458.03 L 82.21 456.3 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 130.89 443.01 C 130.89 443.01 153.68 428.57 153.68 428.57 C 153.68 428.57 176.99 447.25 176.99 447.25 C 176.99 447.25 153.42 463.23 153.42 463.23 C 153.42 463.23 148.76 460.34 148.76 460.34 C 148.76 460.34 135.04 447.64 135.04 447.64 C 135.04 447.64 130.63 443.21 130.63 443.21 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 125.97 446.48 C 125.97 446.48 130.63 451.1 130.63 451.1 C 130.63 451.1 141.77 464.2 141.77 464.2 C 141.77 464.2 146.17 468.05 146.17 468.05 C 146.17 468.05 124.68 481.72 124.68 481.72 C 124.68 481.72 102.41 461.11 102.41 461.11 C 102.41 461.11 126.49 446.48 126.49 446.48 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 75.47 435.7 C 75.47 435.7 78.32 436.66 78.32 436.66 C 78.32 436.66 87.
275513 447.06 87.13 447.25 C 87.13 447.44 70.04 457.65 70.04 457.65 C 70.04 457.65 69.52 439.74 69.52 439.74 C 69.52 439.74 75.47 435.89 75.47 435.89 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cellipse cx=\"95.54\" cy=\"438.2\" rx=\"5.0498007968127485\" ry=\"3.8514541832669322\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"1.16\" pointer-events=\"all\"/>\u003Cpath d=\"M 106.03 432.62 L 138.14 414.71 L 141.77 418.75 L 110.18 436.85 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 75.99 389.87 L 79.36 379.66 C 78.31 376.94 76.57 375.18 74.64 374.92 C 72.71 374.66 70.82 375.91 69.52 378.31 L 69.52 389.1 L 75.73 390.06 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 70.04 363.87 L 86.09 365.99 L 83.5 375.81 C 80.68 372.17 75.43 369.96 69.78 370.03 L 69.78 363.49 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 166.37 401.8 C 177.65 399.7 189.42 399.5 200.81 401.23 C 210.81 402.08 220.48 404.37 229.3 407.97 C 230.09 416.25 238.67 422.96 249.76 423.95 L 267.89 454.18 L 248.98 460.15 L 259.34 479.79 L 277.73 474.79 L 284.72 489.04 L 259.6 500.78 L 242.51 486.73 L 158.08 546.61 L 134.52 527.93 L 154.72 513.3 C 166.64 516.17 179.71 513.43 187.87 506.37 L 182.95 503.48 L 192.27 497.89 L 195.38 500.4 C 204.64 494.79 208.77 485.74 205.99 477.1 L 183.72 462.08 L 197.71 451.68 L 162.75 420.87 L 175.44 411.24 L 166.37 401.81 Z\" fill=\"#d87146\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 453.67 447.64 L 457.71 442.78 L 457.71 449.02 Z\" fill=\"#ffca8c\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 200.71 528.05 C 200.71 528.05 225.88 510.72 225.88 510.72 C 225.88 510.72 238.93 519.5 238.93 519.5 C 238.93 519.5 208.79 530.82 208.79 530.82 C 208.79 530.82 200.71 528.28 200.71 528.28 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 196.05 531.05 L 205.99 533.36 C 200.07 537.86 200.07 545.05 205.99 549.54 L 195.74 551.39 L 181.44 542.15 L 196.05 531.05 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 179.58 543.07 C 191.35 555.46 210.06 559.95 226.81 554.39 L 229.3 558.32 C 220.93 566.17 209.49 568.54 199.16 564.56 L 202.57 560.4 L 186.73 556.93 L 176.47 545.38 L 179.58 543.07 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 173.05 547.23 C 173.05 547.23 183 557.17 183 557.17 C 183 557.17 179.27 560.86 179.27 560.86 C 179.27 560.86 192.63 567.79 192.63 567.79 C 192.63 567.79 188.59 571.49 188.59 571.49 C 188.59 571.49 158.45 558.09 158.45 558.09 C 158.45 558.09 172.74 547 172.74 547 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 196.67 567.79 C 196.67 567.79 205.99 569.41 205.99 569.41 C 205.99 569.41 205.37 576.34 205.37 576.34 C 205.37 576.34 187.35 577.27 187.35 577.27 C 187.35 577.27 196.67 568.03 196.67 568.03 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 243.59 524.12 C 243.59 524.12 248.88 527.82 248.88 527.82 C 248.88 527.82 230.85 549.31 230.85 549.31 C 230.85 549.31 213.45 545.61 213.45 545.61 C 213.45 545.61 219.36 531.52 219.36 531.52 C 219.36 531.52 243.59 524.12 243.59 524.12 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 253.54 532.67 C 253.54 532.67 259.44 537.99 259.44 537.99 C 259.44 537.99 233.34 557.86 233.34 557.86 C 233.34 557.86 231.47 554.39 231.47 554.39 C 231.47 554.39 253.23 532.67 253.23 532.67 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 264.41 540.07 L 277.47 544.22 L 218.11 577.04 L 209.41 576.81 L 210.34 570.11 C 217.79 570.04 224.96 567.99 230.54 564.33 C 243.81 557.92 255.3 549.68 264.41 540.07 Z\" fill=\"#b2d8ad\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 243.54 429.92 L 254.94 443.21 L 247.43 450.14 L 231.89 438.39 Z\" fill=\"#ffffff\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 176.47 416.82 L 192.01 406.62 L 213.5 422.99 L 196.41 434.73 Z\" fill=\"#ffffff\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 222.57 442.63 L 235.77 452.26 L 226.19 459.57 L 213.76 448.6 Z\" fill=\"#ffffff\" stroke=\"#d87146\" stroke-width=\"1.16\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Crect x=\"69.26\" y=\"288.19\" width=\"388.45\" height=\"288.84\" fill=\"none\" stroke=\"#000000\" stroke-width=\"2.31\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"45\">\u003Cg/>\u003Cg data-cell-id=\"46\">\u003Cg>\u003Crect x=\"60\" y=\"248\" width=\"330\" height=\"40\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 328px; height: 1px; padding-top: 268px; margin-left: 61px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 24px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">Glossaire DIALIA  \u003Cspan style=\"font-weight: normal;\">(Accueil)\u003C/span>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"225\" y=\"275\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"24px\" text-anchor=\"middle\" font-weight=\"bold\">Glossaire DIALIA  (Accueil)\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"47\">\u003Cg/>\u003Cg data-cell-id=\"48\">\u003Cg>\u003Crect x=\"90\" y=\"438\" width=\"330\" height=\"40\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 328px; height: 1px; padding-top: 458px; margin-left: 91px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 64px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">Nuage de mots \u003Cdiv style=\"font-size: 64px;\">\u003Cbr style=\"font-size: 64px;\" />\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"255\" y=\"477\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"64px\" text-anchor=\"middle\" font-weight=\"bold\">Nuage de mo...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"49\">\u003Cg>\u003Crect x=\"196.5\" y=\"496\" width=\"130\" height=\"50\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 128px; height: 1px; padding-top: 503px; margin-left: 199px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: left;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Cspan style=\"color: rgb(0, 0, 0); font-family: Helvetica; font-size: 24px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: center; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(251, 251, 251); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;\">(Cliquable)\u003C/span>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"199\" y=\"515\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\">(Cliquable)\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"50\">\u003Cg>\u003Cpath d=\"M 713 91 L 643 91 L 463 207.5\" fill=\"none\" stroke=\"#666666\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cg fill=\"#666666\" font-family=\"&quot;Arial&quot;, &quot;Helvetica&quot;\" text-anchor=\"middle\" font-size=\"17px\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-end; width: 1px; height: 1px; padding-top: 73px; margin-left: 711px;\">\u003Cdiv data-drawio-colors=\"color: #666666; \" style=\"box-sizing: border-box; font-size: 0px; text-align: right;\">\u003Cdiv style=\"display: inline-block; font-size: 9px; font-family: Helvetica; color: rgb(102, 102, 102); line-height: 1.2; pointer-events: all; white-space: nowrap;\">Télécharge \u003Cdiv>le glossaire \u003C/div>\u003Cdiv>localement\u003C/div>\u003Cdiv>\u003Cfont style=\"font-size: 5px;\">(pas d'installation)\u003C/font>\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"711\" y=\"82\" fill=\"#666666\" font-family=\"&quot;Helvetica&quot;\" font-size=\"9px\" text-anchor=\"end\">Télécharge...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"51\">\u003Cg>\u003Cpath d=\"M 711 63.5 L 641 63.5 L 370 198\" fill=\"none\" stroke=\"#666666\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cg fill=\"#666666\" font-family=\"&quot;Arial&quot;, &quot;Helvetica&quot;\" text-anchor=\"middle\" font-size=\"17px\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-end; width: 1px; height: 1px; padding-top: 45px; margin-left: 709px;\">\u003Cdiv data-drawio-colors=\"color: #666666; \" style=\"box-sizing: border-box; font-size: 0px; text-align: right;\">\u003Cdiv style=\"display: inline-block; font-size: 9px; font-family: Helvetica; color: rgb(102, 102, 102); line-height: 1.2; pointer-events: all; white-space: nowrap;\">Retour \u003Cdiv>à l'accueil\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"709\" y=\"54\" fill=\"#666666\" font-family=\"&quot;Helvetica&quot;\" font-size=\"9px\" text-anchor=\"end\">Retour...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"52\">\u003Cg>\u003Cpath d=\"M 369.63 203.5 L 369.63 197.62 L 374 194.09 L 378.38 197.62 L 378.38 203.5 L 375.25 203.5 L 375.25 200.56 L 372.75 200.56 L 372.75 203.5 Z\" fill=\"rgb(255, 255, 255)\" stroke=\"#424242\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 370.75 196.21 L 370.75 194.68 L 371.5 194.68 L 371.5 195.62\" fill=\"rgb(255, 255, 255)\" stroke=\"#424242\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>
2755\u003Cpath d=\"M 369 197.62 L 374 193.5 L 379 197.62\" fill=\"none\" stroke=\"#424242\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"53\">\u003Cg>\u003Cellipse cx=\"470.5\" cy=\"199.25\" rx=\"7.5\" ry=\"8.25\" fill=\"#ff3333\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"54\">\u003Cg>\u003Cpath d=\"M 720 25.75 L 650 25.75 L 319 190.25\" fill=\"none\" stroke=\"#666666\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cg fill=\"#666666\" font-family=\"&quot;Arial&quot;, &quot;Helvetica&quot;\" text-anchor=\"middle\" font-size=\"17px\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-end; width: 1px; height: 1px; padding-top: 7px; margin-left: 718px;\">\u003Cdiv data-drawio-colors=\"color: #666666; \" style=\"box-sizing: border-box; font-size: 0px; text-align: right;\">\u003Cdiv style=\"display: inline-block; font-size: 9px; font-family: Helvetica; color: rgb(102, 102, 102); line-height: 1.2; pointer-events: all; white-space: nowrap;\">Barre de recherche\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"718\" y=\"16\" fill=\"#666666\" font-family=\"&quot;Helvetica&quot;\" font-size=\"9px\" text-anchor=\"end\">Barre de recherche\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003C/g>\u003C/g>\u003C/g>\u003Cswitch>\u003Cg requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\"/>\u003Ca transform=\"translate(0,-5)\" xlink:href=\"https://www.drawio.com/doc/faq/svg-export-text-problems\" target=\"_blank\">\u003Ctext text-anchor=\"middle\" font-size=\"10px\" x=\"50%\" y=\"100%\">Text is not SVG - cannot display\u003C/text>\u003C/a>\u003C/switch>\u003C/svg>","type":"application/vnd.drawio","modified":"20241018220518873","title":"$:/diagram/glossaire/wireframe/accueil"},
2756{"created":"20241017093025267","text":"\u003Csvg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" width=\"721px\" height=\"701px\" viewBox=\"-0.5 -0.5 721 701\" content=\"&lt;mxfile host=&quot;embed.diagrams.net&quot; agent=&quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0&quot; version=&quot;24.8.0&quot;&gt;&lt;diagram id=&quot;xOmoJy2NuRLm2l4kesIv&quot; name=&quot;Page-1&quot;&gt;7Vtbc6M2FP41nrYPYRDi+hh7N+1D2+k0ndlnGWRbE0BUQJLdX19JCCyQyOKEeLudOrOJObognfOdq7QbuCuef2aoOv1GM5xvPDd73sAPG88DIPH5H0H53FESADrCkZFMdToT7skXrIiuorYkw/WoY0Np3pBqTExpWeK0GdEQY/Rp3O1A8/FbK3TEBuE+RblJ/USy5tRRYy8603/B5Hjq3wzCpGspUN9Z7aQ+oYw+aST4cQN3jNKm+1Y873AumNfzpRt3N9M6LIzhslk0IFSieER5q3anVtZ87rd7ZLStNnBb0Ee0l0TAnxiuyRf9mTao0Z650LH+jDOiP+Y0fcBiFS5/UILSms2NqL09YtbgZ5uY1egRJzkEMS1wwz7zfmpUpHivwBeqx6ezJKNePCdNipGriEih5zjMfGYw/6J4bOe393Vu1w2jDwOuBC8GkAhWZag+DXxDOTmW/HvKuYQZJ5yaIj+PqsSUxfNRaKFTcIa3lcOZ1SBSYlY7e6EJmH0ipZx+y5SmiZm7VexoTplcFgzlZ9zidU2uG6eHw7gJdk2pL34Edvg7/8LPHS93Ej5py2ryiP8UOOpfe02IDZxQPSyQG7RjCjoTXBp8QvBe8Omh+xJ+xFoJt1W/oj3O/6A1aQgVGNnTpqHFq+HUT3ur+jS0GiQ+AasNdiV6JEckluLUKaN5vkXMBrNEfnjLHjG+eE70xMoOJM91yCVJlk0hJ5pKWmKxK8LhpfZdUiYW90bxqtYgGRsPAEzrYTMeQRQ7Ufx2AIAosCAgzPlrti3vGB4budWOkpOeck9blmLhcsWvHIlvmx3c3CYHUkpGee6POcFlx42671TLcT/1E/LlnefUiPqrJ3BspNLrSOpRluNDYwFWQbJMDN4+nUiD7yuUipmeOJikBWjLbMDrKiKFY4n6wHVc1w0DPwH8IfBM+cYWAXu+43oRiAPXh6GfwDhcQdixTd07pu9HXA7/bqmkovThK
2756Hl0k3Y6dSvmK7kNQHknMtWzl9cfXMBimXmOxd8qb6XsKSk18e6/X+nGE+n6iZMkQRJCCGI/6bVJly68mnRNVf7rJJUyLoSWAoPbZ/6AGQ7qgmCp8ueB6dCVnTTN92BoOzt7d7fdecLrH7iz1Oiu/MwsYikEaj6MlMdfZTcpcvGWe7Vf0D93mwDwPEI8roaQPjZXCOE+luu/H3lJmPggjD0TIj1qdISA0HFBDDwIQ8+HXuL5ayAkfBkhpvMfx38zbn7qovc83eBIQJXDmEyXhkgweDVwILwN/Z0JnDv5+YbACdbCDQiDS4ETXg04kQGc30UA1gojH6JCMLvc15XmxTPy2Ft5zhiRUWtIGzyB1uvaiYtwNQ5HQ07bLrYpH/qEAm5FYy/vSD3bkhcx/gMR1N8/qsceNnxCPEFOZOJ3mKnfAetE+WJ8bBu/Cga9YOzePNcMR/3Imo2sEYvastkOKidgjU8KxI6kvJG8EZGJWz1bo5IPQ2xKVHCatfzXzzmta8Rjew2R4k3jeLSaErjylyuFSzuOBly25/CZZ5CcKfLrTHStdjDVOncRya6rfNvdnsb73DNLaG5wQyeMZnfso74a8dksOeUYPuRS90/cavO84l2iuyAawR9a4A9t0XqP3LfBH1rgPxuxzQVLGiN1F6r87DpcGhsJ6FuMRGDhUriCkYjB15n0zo6jIHVqRDbWGtdQfJgEMwf5sYvj4rCBO/xpyNmH+ppAAtdWRUhWEIitgPANBILK9CT4a+FpfDFT/TAcczRxghVYZYbfJqvUFvlIUtXYrsUG0IaKqV7hdMfMs/AluJQvN95Y9W8Wlqu8NTTfjEH/A0CD7wK0eDnQVJi6HFKWbUeXbnuKI0vZxIIisAKKkgX+461JL8oI3bZNQ0tPJBaTuvk0wJ/W1YesdGn2ehQvxOesQhkJo/KiEuX0hLVjjHEiq9ruRAzaoyC4251b7iVMJl6sfsBNepqHx+VaAYADwQghIHIsIAkG1zeyNsEaSgSCBfHYVc31xXyEMZzy0QPOQm1bw2aDYIHL+87Vjcvzw0c/FCyxCf87UDcI/G+vboHps4ys/f8CkQXQbygQXQqU0B2XKH0Ok8TECYg8p88qR+nGGhZlgVGeMwETDV981lwgJm86tCz/vGUy294uM1qzCaHtQFneRuhINyC+7NLKCwfMvjNJZmDgOa5vSi22qDbkXaM1/MCCa0HX9KWXhySTWz78c01HGltLo68qAS4kbRFjwwE/B+sJM/7v2jbYWmuZPUXSTWlgmtK5ckyWYSwhNDUQo2OhYKbgtgK4gD8BF3CdGJrgCi3ogokD4dsBZppVrTh+XZlrN8qGXPtSJ6kk+F7ygvFIXpZj/15hR4ZghQs7ph09NY24pnorpvDunp6eHIIqr3L4dlKcO6iq/g0C1OukrxTmCoIbzrP6MNez1K9spWtvjQsawYIK1n/sbizwxqVp2EcT+olKYmN4skawGC4ohFnuJM5edTSUQYaa2+HYz1bjX3zRcRrZ+J74uSgrJrSOHMJlVDsnzq6VQh84OV44J3x6+PhOBbvhrvvrQ0dZ/YL8Mxc36Cbt5eT68vi7d84D80y/DuzXONaoYVnjxgnzGkZQeZy9RKcxZwbtGT6gVp70Trg+IHgNn+uNc8+gz1eugcHYDI92tKjUQX0hdmVee8l+IOWBskImdfULZ++jSzDGND/ucvJ3i78IBnaXK9VdgConmP00N8//tZLNN62VwGmtJLTWSqy3aV5RKOGP5//lI9u0/ysFP/4D&lt;/diagram&gt;&lt;/mxfile&gt;\">\u003Cdefs/>\u003Cg>\u003Cg data-cell-id=\"0\">\u003Cg data-cell-id=\"1\">\u003Cg data-cell-id=\"164\">\u003Cg/>\u003Cg data-cell-id=\"2\">\u003Cg>\u003Cpath d=\"M 0 0 L 610 0 L 610 700 L 0 700 Z\" fill=\"rgb(255, 255, 255)\" stroke=\"#666666\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cellipse cx=\"545\" cy=\"15\" rx=\"10\" ry=\"10\" fill=\"none\" stroke=\"#666666\" pointer-events=\"all\"/>\u003Cellipse cx=\"570\" cy=\"15\" rx=\"10\" ry=\"10\" fill=\"none\" stroke=\"#666666\" pointer-events=\"all\"/>\u003Cellipse cx=\"595\" cy=\"15\" rx=\"10\" ry=\"10\" fill=\"none\" stroke=\"#008cff\" pointer-events=\"all\"/>\u003Cpath d=\"M 0 40 L 30 40 L 30 15 C 30 12.24 32.24 10 35 10 L 170 10 C 172.76 10 175 12.24 175 15 L 175 40 L 610 40\" fill=\"none\" stroke=\"#c4c4c4\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 0 110 L 610 110\" fill=\"none\" stroke=\"#c4c4c4\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 100 60 C 100 57.24 102.24 55 105 55 L 595 55 C 597.76 55 600 57.24 600 60 L 600 85 C 600 87.76 597.76 90 595 90 L 105 90 C 102.24 90 100 87.76 100 85 Z\" fill=\"none\" stroke=\"#c4c4c4\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cg fill=\"#666666\" font-family=\"&quot;Arial&quot;, &quot;Helvetica&quot;\" font-size=\"17px\"/>\u003Cg fill=\"#666666\" font-family=\"&quot;Arial&quot;, &quot;Helvetica&quot;\" font-size=\"17px\"/>\u003Cpath d=\"M 37 17 L 48 17 L 52 21 L 52 35 L 37 35 Z\" fill=\"none\" stroke=\"#c4c4c4\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 48 17 L 48 21 L 52 22\" fill=\"none\" stroke=\"#c4c4c4\" stroke-width=\"0.5\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 107 64 L 118 64 L 122 68 L 122 82 L 107 82 Z\" fill=\"none\" stroke=\"#c4c4c4\" stroke-width=\"2\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 118 64 L 118 68 L 122 69\" fill=\"none\" stroke=\"#c4c4c4\" stroke-width=\"0.5\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 12 74 L 22 64 L 22 70 L 32 70 L 32 78 L 22 78 L 22 84 Z\" fill=\"#c4c4c4\" stroke=\"#c4c4c4\" stroke-width=\"2\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 62 74 L 52 64 L 52 70 L 42 70 L 42 78 L 52 78 L 52 84 Z\" fill=\"#c4c4c4\" stroke=\"#c4c4c4\" stroke-width=\"2\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 87.6 77.3 C 85.9 80.13 82.22 81.06 79.38 79.36 C 76.54 77.67 75.61 74 77.29 71.15 C 78.98 68.31 82.65 67.36 85.5 69.04 L 83.9 70.5 L 91.8 72.3 L 90 64.8 L 88.3 66.4 C 85.11 64.03 80.8 63.82 77.39 65.87 C 73.99 67.92 72.16 71.83 72.77 75.76 C 73.37 79.69 76.3 82.86 80.16 83.79 C 84.03 84.72 88.07 83.22 90.4 80 Z\" fill=\"#c4c4c4\" stroke=\"#c4c4c4\" stroke-width=\"2\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"70\">\u003Cg>\u003Crect x=\"310.61\" y=\"389.39\" width=\"578.78\" height=\"20\" fill=\"rgb(255, 255, 255)\" stroke=\"#999999\" transform=\"rotate(270,600,399.39)\" pointer-events=\"all\"/>\u003Cpath d=\"M 330.61 389.39 L 330.61 409.39 M 869.39 389.39 L 869.39 409.39\" fill=\"none\" stroke=\"#999999\" stroke-miterlimit=\"10\" transform=\"rotate(270,600,399.39)\" pointer-events=\"all\"/>\u003Cpath d=\"M 314.61 399.39 L 326.61 393.39 L 326.61 405.39 Z M 885.39 399.39 L 873.39 393.39 L 873.39 405.39 Z\" fill=\"#99ddff\" stroke=\"none\" transform=\"rotate(270,600,399.39)\" pointer-events=\"all\"/>\u003Crect x=\"426.37\" y=\"392.39\" width=\"60\" height=\"14\" rx=\"5\" ry=\"5\" fill=\"#99ddff\" stroke=\"none\" transform=\"rotate(270,600,399.39)\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"175\">\u003Cg>\u003Crect x=\"30\" y=\"410\" width=\"280\" height=\"24.03\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 278px; height: 1px; padding-top: 422px; margin-left: 32px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: left;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Cul>\u003Cli>Source de la défintion (lien vers la source)\u003C/li>\u003C/ul>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"32\" y=\"426\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\">Source de la défintion (lien vers la source)\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"180\">\u003Cg>\u003Crect x=\"80\" y=\"450\" width=\"230\" height=\"24.03\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 228px; height: 1px; padding-top: 462px; margin-left: 82px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: left;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Cb style=\"background-color: initial;\">Pour aller plus loin\u003C/b>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"82\" y=\"466\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\">Pour aller plus loin\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"185\">\u003Cg>\u003Crect x=\"69\" y=\"270\" width=\"75\" height=\"16.02\" rx=\"8.01\" ry=\"8.01\" fill=\"#ffbc26\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 57px; height: 1px; padding-top: 278px; margin-left: 79px;\">\u003Cdiv data-drawio-colors=\"color: #000000; \" style=\"box-sizing: border-box; font-size: 0px; text-align: left;\">\u003Cdiv style=\"display: inline-block; font-size: 13px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">Thème 1\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"79\" y=\"282\" fill=\"#000000\" font-family=\"&quot;Helvetica&quot;\" font-size=\"13px\" font-weight=\"bold\">Thème 1\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"186\">\u003Cg>\u003Crect x=\"165\" y=\"270\" width=\"65\" height=\"16.02\" rx=\"5\" fill=\"#33a64c\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 57px; height: 1px; padding-top: 278px; margin-left: 170px;\">\u003Cdiv data-drawio-colors=\"color: #FFFFFF; \" style=\"box-sizing: border-box; font-size: 0px; text-align: left;\">\u003Cdiv style=\"display: inline-block; font-size: 13px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">Thème 2\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"170\" y=\"282\" fill=\"#FFFFFF\" font-family=\"&quot;Helvetica&quot;\" font-size=\"13px\" font-weight=\"bold\">Thème 2\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"187\">\u003Cg>\u003Cpath d=\"M 720 225.5 L 650 225.5 L 250 270\" fill=\"none\" stroke=\"#666666\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cg fill=\"#666666\" font-family=\"&quot;Arial&quot;, &quot;Helvetica&quot;\" text-anchor=\"middle\" font-size=\"17px\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-end; width: 1px; height: 1px; padding-top: 207px; margin-left: 718px;\">\u003Cdiv data-drawio-colors=\"color: #666666; \" style=\"box-sizing: border-box; font-size: 0px; text-align: right;\">\u003Cdiv style=\"display: inline-block; font-size: 17px; font-family: Helvetica; color: rgb(102, 102, 102); line-height: 1.2; pointer-events: all; white-space: nowrap;\">Naviguer \u003Cdiv>par thème\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"718\" y=\"224\" fill=\"#666666\" font-family=\"&quot;Helvetica&quot;\" font-size=\"17px\" text-anchor=\"end\">Naviguer...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"172\">\u003Cg>\u003Crect x=\"57\" y=\"300\" width=\"380\" height=\"72\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 378px; height: 1px; padding-top: 307px; margin-left: 59px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: left; max-height: 68px; overflow: hidden;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Ch1 style=\"margin-top: 0px;\">Définition du Glossaire\u003C/h1>\u003Cp>\u003Cspan style=\"background-color: initial;\">Contenu détaillé de la définition      \u003C/span>\u003Cbr />\u003C/p>\u003Cp> .\u003C/p>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"59\" y=\"319\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\">Définition du Glossaire...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"173\">\u003Cg>\u003Crect x=\"50\" y=\"340\" width=\"450\" height=\"60\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"81\">\u003Cg>\u003Crect x=\"46.69\" y=\"141\" width=\"500\" height=\"59\" fill=\"#ffffff\" stroke=\"#999999\" pointer-events=\"all\"/>\u003C/g>\u003Cg data-cell-id=\"85\">\u003Cg data-cell-id=\"86\">\u003Cg>\u003Cellipse cx=\"502.69\" cy=\"170.5\" rx=\"10\" ry=\"10\" fill=\"none\" stroke=\"#008cff\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"87\">\u003Cg data-cell-id=\"88\">\u003Cg>\u003Cpath d=\"M 462.69 180.5 L 482.69 180.5\" fill=\"none\" stroke=\"#008cff\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"91\">\u003Cg>
2756\u003Cellipse cx=\"470.85\" cy=\"171.25\" rx=\"12.845\" ry=\"12.75\" fill=\"#ffffff\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"153\">\u003Cg>\u003Cellipse cx=\"440\" cy=\"172.25\" rx=\"10\" ry=\"10\" fill=\"none\" stroke=\"#008cff\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"156\">\u003Cg>\u003Cellipse cx=\"373.85\" cy=\"171.25\" rx=\"12.845\" ry=\"12.75\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"58\">\u003Cg>\u003Cpath d=\"M 707.64 383.45 L 637.64 383.45 L 535 407.95\" fill=\"none\" stroke=\"#666666\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cg fill=\"#666666\" font-family=\"&quot;Arial&quot;, &quot;Helvetica&quot;\" text-anchor=\"middle\" font-size=\"17px\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-end; width: 1px; height: 1px; padding-top: 365px; margin-left: 706px;\">\u003Cdiv data-drawio-colors=\"color: #666666; \" style=\"box-sizing: border-box; font-size: 0px; text-align: right;\">\u003Cdiv style=\"display: inline-block; font-size: 17px; font-family: Helvetica; color: rgb(102, 102, 102); line-height: 1.2; pointer-events: all; white-space: nowrap;\">Définition\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"706\" y=\"382\" fill=\"#666666\" font-family=\"&quot;Helvetica&quot;\" font-size=\"17px\" text-anchor=\"end\">Définition\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"13\">\u003Cg>\u003Cpath d=\"M 417.62 417.08 C 417.62 412.1 421.65 408.08 426.62 408.08 L 524.66 408.08 C 529.63 408.08 533.66 404.05 533.66 399.08 C 533.66 404.05 537.69 408.08 542.66 408.08 L 640.69 408.08 C 645.67 408.08 649.69 412.1 649.69 417.08\" fill=\"none\" stroke=\"#999999\" stroke-miterlimit=\"10\" transform=\"rotate(89,533.66,408.08)\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"154\">\u003Cg>\u003Cellipse cx=\"410\" cy=\"172.25\" rx=\"10\" ry=\"10\" fill=\"none\" stroke=\"#008cff\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"82\">\u003Cg>\u003Crect x=\"70\" y=\"150.83\" width=\"260\" height=\"39.33\" rx=\"5\" fill=\"#ddeeff\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 253px; height: 1px; padding-top: 170px; margin-left: 77px;\">\u003Cdiv data-drawio-colors=\"color: #999999; \" style=\"box-sizing: border-box; font-size: 0px; text-align: left;\">\u003Cdiv style=\"display: inline-block; font-size: 15px; font-family: Helvetica; color: rgb(153, 153, 153); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">          Barre de recherche\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"77\" y=\"175\" fill=\"#999999\" font-family=\"&quot;Helvetica&quot;\" font-size=\"15px\">          Barre de recherche\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"3\">\u003Cg/>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 80px; height: 1px; padding-top: 29px; margin-left: 70px;\">\u003Cdiv data-drawio-colors=\"color: #666666; \" style=\"box-sizing: border-box; font-size: 0px; text-align: left;\">\u003Cdiv style=\"display: inline-block; font-size: 17px; font-family: Helvetica; color: rgb(102, 102, 102); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Glossaire\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"70\" y=\"34\" fill=\"#666666\" font-family=\"&quot;Helvetica&quot;\" font-size=\"17px\">Glossaire\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"4\">\u003Cg/>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 1px; height: 1px; padding-top: 73px; margin-left: 132px;\">\u003Cdiv data-drawio-colors=\"color: #666666; \" style=\"box-sizing: border-box; font-size: 0px; text-align: left;\">\u003Cdiv style=\"display: inline-block; font-size: 17px; font-family: Helvetica; color: rgb(102, 102, 102); line-height: 1.2; pointer-events: all; white-space: nowrap;\">https://www.iap2p.vercel.app\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"132\" y=\"78\" fill=\"#666666\" font-family=\"&quot;Helvetica&quot;\" font-size=\"17px\">https://www.iap2p.vercel.app\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"157\">\u003Cg/>\u003C/g>\u003Cg data-cell-id=\"168\">\u003Cg>\u003Cpath d=\"M 369.63 175.5 L 369.63 169.62 L 374 166.09 L 378.38 169.62 L 378.38 175.5 L 375.25 175.5 L 375.25 172.56 L 372.75 172.56 L 372.75 175.5 Z\" fill=\"rgb(255, 255, 255)\" stroke=\"#424242\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 370.75 168.21 L 370.75 166.68 L 371.5 166.68 L 371.5 167.62\" fill=\"rgb(255, 255, 255)\" stroke=\"#424242\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>
2756\u003Cpath d=\"M 369 169.62 L 374 165.5 L 379 169.62\" fill=\"none\" stroke=\"#424242\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"169\">\u003Cg>\u003Cellipse cx=\"470.5\" cy=\"171.25\" rx=\"7.5\" ry=\"8.25\" fill=\"#ff3333\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"182\">\u003Cg>\u003Cpath d=\"M 55 458 L 65 463 L 55 468 Z\" fill=\"#424242\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"183\">\u003Cg>\u003Cpath d=\"M 705 433.45 L 635 433.45 L 235 457.95\" fill=\"none\" stroke=\"#666666\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cg fill=\"#666666\" font-family=\"&quot;Arial&quot;, &quot;Helvetica&quot;\" text-anchor=\"middle\" font-size=\"17px\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-end; width: 1px; height: 1px; padding-top: 415px; margin-left: 703px;\">\u003Cdiv data-drawio-colors=\"color: #666666; \" style=\"box-sizing: border-box; font-size: 0px; text-align: right;\">\u003Cdiv style=\"display: inline-block; font-size: 17px; font-family: Helvetica; color: rgb(102, 102, 102); line-height: 1.2; pointer-events: all; white-space: nowrap;\">Complément\u003Cdiv>d'informations \u003C/div>\u003Cdiv>(Cliquez pour déplier)\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"703\" y=\"432\" fill=\"#666666\" font-family=\"&quot;Helvetica&quot;\" font-size=\"17px\" text-anchor=\"end\">Complément...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003C/g>\u003C/g>\u003C/g>\u003Cswitch>\u003Cg requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\"/>\u003Ca transform=\"translate(0,-5)\" xlink:href=\"https://www.drawio.com/doc/faq/svg-export-text-problems\" target=\"_blank\">\u003Ctext text-anchor=\"middle\" font-size=\"10px\" x=\"50%\" y=\"100%\">Text is not SVG - cannot display\u003C/text>\u003C/a>\u003C/switch>\u003C/svg>","type":"application/vnd.drawio","modified":"20241018220458536","title":"$:/diagram/glossaire/wireframe/definition"},
2757{"created":"20241017092838340","text":"\u003Csvg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" width=\"520px\" height=\"398px\" viewBox=\"-0.5 -0.5 520 398\" content=\"&lt;mxfile host=&quot;embed.diagrams.net&quot; agent=&quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0&quot; version=&quot;24.7.17&quot;&gt;&lt;diagram id=&quot;8eCutogGVIvOUzOMlCSj&quot; name=&quot;Page-1&quot;&gt;3Vddb9owFP010baHIYz5fAyQUaSWVZRuzyZxE6tOHCUOH/v1u05sSDBVkRpN6pAC9vG143vO9b3GwbP4sMhIGj2IgHKn1w0ODp47vR5Ckz78KORYIROEKiDMWKCNzsAT+0M12NVowQKaNwylEFyytAn6IkmoLxsYyTKxb5q9CN58a0pCagFPPuE2+psFMqrQcW90xu8oCyPzZjScVCMxMcbakzwigdjXIOw5eJYJIatWfJhRrsgzvFTzfrwxetpYRhN5y4ReNWFHeKF9uxeh0HuTR+NwJookoGpO18HTfcQkfUqJr0b3IDFgkYw59BA0XxjnM8FFVs7FFAUDOgI8l5l4pWYkEQlMn9ob1j7saCbpoQZpBxZUxFRmRzDRo2PN5dEEybDq78/SDAzfUV2Wvg5DosMhPC19ZgwamrTrBGKLwKm7mnvuM4Df4dlCvFEV6l9EIRnPoblhQcCPe/bKPhfPl0QbTms842s897sfp3lk0fy49OBnSGLFSrLN09LJ7tyDr0d34dljQw4bmgZsB81QNb8qU04SJU+hhAC6tWwzkUgCmaPqPQBpTCg77syw405CSAX5N7MkbL626ucS9UJTPBrfdnjaEBXZh8ciT3nCIPPeky3ljwIkUkLg+VZIKWJFjMmgityA5NGJacJZqEx9YIdmTZrNsq62kSI9kWxSOqpWT9VO4kOoSlknFv5rkXbKDvPzTs7ilNOlr/Z0oRGoNyk/SlUIJ13G0Kil0zgYNNMespVDo2tpr9eGdH1Lus1ys/b+YfD76oiyRClbTm7/MAxvPAu4DUIHFqGrQl1DIDepr1jI3E5pF2SDm7LJqHUGLgM/VsWIviFNU7xaEPcmbQXxuBnEQ9QZ3BbGGLdA+tAi/cFbPZsysnJ/LRfuZvlzdaV4GKjglwhnBvESmVUFg+YVVUrOCnlhSZnL8loVOc+8cS1gSEHjmH5oGbLV2I6R9/cEoO30f1QDT0H57gUStXHw7avN1F2rTFoF4dqb3XlreD43p/ZdEY3buVZA9/x/qRyr/evE3l8=&lt;/diagram&gt;&lt;/mxfile&gt;\">\u003Cdefs/>\u003Cg>\u003Cg data-cell-id=\"0\">\u003Cg data-cell-id=\"1\">\u003Cg data-cell-id=\"2\">\u003Cg>\u003Crect x=\"0\" y=\"86\" width=\"520\" height=\"144\" fill=\"#e1d5e7\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 518px; height: 1px; padding-top: 158px; margin-left: 1px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Logo\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"260\" y=\"162\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">Logo\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"3\">\u003Cg>\u003Crect x=\"200\" y=\"0\" width=\"320\" height=\"40\" fill=\"#e1d5e7\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 318px; height: 1px; padding-top: 20px; margin-left: 201px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">BANDEAU - barre d'outils Tiddlywiki\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"360\" y=\"24\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">BANDEAU - barre d'outils Tiddlywiki\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"7\">\u003Cg>\u003Crect x=\"0\" y=\"358\" width=\"520\" height=\"40\" fill=\"#e1d5e7\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 518px; height: 1px; padding-top: 378px; margin-left: 1px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">PIED  DE PAGE \u003Cdiv>( Plan du site - Contact - Mention légales)\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"260\" y=\"382\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">PIED  DE PAGE...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"13\">\u003Cg>\u003Crect x=\"175\" y=\"98\" width=\"170\" height=\"120\" fill=\"rgb(255, 255, 255)\" stroke=\"#999999\" pointer-events=\"all\"/>\u003Cpath d=\"M 175 98 L 345 218 M 175 218 L 345 98\" fill=\"none\" stroke=\"#999999\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"14\">\u003Cg>\u003Crect x=\"0\" y=\"48\" width=\"520\" height=\"30\" fill=\"#e1d5e7\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 518px; height: 1px; padding-top: 63px; margin-left: 1px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">TITRE\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"260\" y=\"67\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">TITRE\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"15\">\u003Cg>\u003Crect x=\"178\" y=\"141.5\" width=\"170\" height=\"33\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 168px; height: 1px; padding-top: 158px; margin-left: 179px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 29px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Nuage de mots \u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"263\" y=\"167\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"29px\" text-anchor=\"middle\">Nuage de mot...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"16\">\u003Cg>\u003Crect x=\"0\" y=\"238\" width=\"520\" height=\"110\" fill=\"#e1d5e7\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 518px; height: 1px; padding-top: 293px; margin-left: 1px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">MENU DE NAVIGATION\u003Cdiv>\u003Cul>\u003Cli>Entrées par définitions\u003C/li>\u003Cli>Entrées par thèmes\u003C/li>\u003Cli>Entrées par abréviations\u003C/li>\u003C/ul>\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"260\" y=\"297\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">MENU DE NAVIGATION...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"17\">\u003Cg>\u003Crect x=\"0\" y=\"0\" width=\"180\" height=\"40\" fill=\"#e1d5e7\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 178px; height: 1px; padding-top: 20px; margin-left: 1px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">BARRE DE RECHERCHE\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"90\" y=\"24\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">BARRE DE RECHERCHE\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003C/g>\u003C/g>\u003C/g>\u003Cswitch>\u003Cg requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\"/>\u003Ca transform=\"translate(0,-5)\" xlink:href=\"https://www.drawio.com/doc/faq/svg-export-text-problems\" target=\"_blank\">\u003Ctext text-anchor=\"middle\" font-size=\"10px\" x=\"50%\" y=\"100%\">Text is not SVG - cannot display\u003C/text>\u003C/a>\u003C/switch>\u003C/svg>","type":"application/vnd.drawio","modified":"20241018113320241","title":"$:/diagram/glossaire/zoning"},
2758{"created":"20240917095143783","text":"\u003Csvg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" width=\"831px\" height=\"446px\" viewBox=\"-0.5 -0.5 831 446\" content=\"&lt;mxfile host=&quot;embed.diagrams.net&quot; agent=&quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0&quot; version=&quot;24.7.14&quot;&gt;&lt;diagram id=&quot;kS8o0m8w9q9OaMfxbmi4&quot; name=&quot;Page-1&quot;&gt;7V1bc5s4FP41num+dMxNwGPiJN3ZmW47TXe3fVRsxWYWIxdkJ95fv5IRNhzJMcGg2A5JJoOEJMSnc5HOORIDZzR//pTixewznZB4YA8nzwPnZmDbfujy/yJjnWd4gZVnTNNokmeVMu6j/4jMHMrcZTQhWaUgozRm0aKaOaZJQsaskofTlD5Viz3SuPrUBZ4SJeN+jGM1959owmYy10Lh7sbvJJrO5KMD289vzHFRWL5JNsMT+lTKcm4HziillOVX8+cRiQV2BS55vbs9d7cdS0nC6lSw8worHC/lu/2BVzgbp9GCyR6ydfHaKV0mEyJqWgPn+mkWMXK/wGNx94mPM8+bsXksbz9GcTyiMU03dZ1bJH5FPk3YvWxT012ZtSIpI8+lLNn9T4TOCUvXvIi86/gSSklLdiDTT6WRGcq8WWlQXJmHJTFMt03v8OIXEjI9fJ4C3984jfBDzKmzTfSsK/Er0Svl321+eH4LQHpOFchQxTHQwOi0ACNSYPy+XggIUcyfcj2JVvxyyjbvmWdFRcYHxkvSx9+KG/xRESzM8ypNnNnAIP/NBsZXB0YQN14+H4dixlL6LynwmpBHvNyM1FugO/Qq6G7liQF4AwXea7ocn6PwsL0qjVq2ORRDBcURTSYRi2hyfkA6IQDSMgdk8agSknc0GZ8nkC4A0kUGgbQUIL8sSIoZWabnhyRywQzL88whqU5Q+WpieZYiMgAEGbjmYFQVuYIfmfA1jkzyt4zY+huJsWD+290drrlxyq7EGooXS2gi8kgyATkZmc5zpLhMca7Hy3S1HZmMLtMx+UrSiL8GScUYRcmU3xQleetTwvbc3I3wcPNUDsKPcuKnSHz0iuTNc/nmzVqm9g5l/uxBeWIvMHlxbNMNRKvqulA3UrLqVxrxp+6EFJjaOUMw2BKsvFZ5HQca8izAowFoSAILG9oQzvZ96tGSOmt5t7REniP2Q/ZFXJdq8dSukkgcpL/8ZSr0VyZJZIgkgZhyrKYk6e1RGx2QpD
2758oF7EmybZK0VZL03wlJ8uHH61KxhSiQ7e8wfE4h1vf2C4F+hZXy/CLvQVP+sNWJ/bvnjx1P/CyzRKv8ERjiD/uA8q/NH6Ahp+Ys4rX8oazNpL6ryx+Od6A8nFa5lfLH85O6vuv5yQA/hYb4CZCnE/oN+cmBdG53o2+G4DnIfx1/hAfKQwUcVMofz0/qKv9i+cluxlBWJwxVTKS65iiFQD3QRG2OArYo10fdcBRYT3vynetySPGCe8tDDehWyh/PUc774aiTYijblIpyq/RZPPj1Kgo05ABd15qKAs8J7AMqSv+C+xkQlB9Wyh/PUG7PUG9hYihcKcbnfE0tsT7wJ7tuRzYGwLjIcl/sF4IM6B4ob0HBUCl/PEOpsTNKcEfGUkG72tAOwHuv8v7sJcb63hwfKHyraOKAN8cGZNXEm6OJl1GgS5bzB5KeB3SFtewAdIWV9yjodI4wAN0DpTHByXlgp4l26ww7neMHYhdNN1LkDKCza0ZWtAKdzkGhcKyocg7AueaAKwwoLwEn0HiMEo7IWaBXM76sFfR6O2X3q0CpjMuTVmPhA605xoDh3/I789U6dk+Tb0KThuIHfEhKMH6p9kIKTnU6WkgpHYZbJg72q11nrdOb7t6GQQxFM/jAKeQEQNPXZhBoQy5W+GYZ5HiCf0emtbfz/ugo3lB8gg+cNk7YkOID6EayOqJ4EL+DZIdbo3id7etCKf6kCN5QAAGkH3fYlOCBG9K16xF8E5rUGRUvlCZPSgoX04HOiRJB4dmUKMF8wHW6I8p+30L3XjdTQSAIam9oZKhLgAhScjjsigDd3oJmgABtMwQI91Z60BlXlwCh3c1zOjOXuaq5LCbq0QyH9lvP8ELc4QPBIhx/I2OGk+mGLhldyLGKySOTlw+UMTqXlVNplBY35MyZP9O75n8chpE18HgPRjxlFSn+V91iJ6kbx9E04ckxpwbC86+FGT0a4/hK3iieKyiWcfodbQruCC1L8OI7zXGVnSOcRzJOE99Ilp8TIrqJl4zKpCjEUkLuaDzJOaLI+UxXu4yEPJW49Wbgi9MDfi3FORzXOwbfZg2cq9L9PUy/K83h2SZKgkDf3AYsfd2twHh1zUKwlCsKwV8qIoVNpUS1Db0AKleotrhHKFUr+BtiKZ0KYu8VGs139et8zEVW25st3Us04HU1IdZsdHMNqQNlN1DNkJ8mUlw1ca1w2kvxXor3UvxFKX442gV1JcUv0Ea3d0gq4tc1JH59vVuhC/Gr2rbGNMn6aXQvgHsB/CoBrDnWye9KAF+i7c/kNNpQwAfcnGv53cnxGhGoi8HIGVyFfDA2FwEXUScZF+ih6grV1rBWVwHkbn9ehsbV44T2oGzZDK2XGVMktl07lllNHRUQAqprGp3lAAOLHXRmAi2W6S/uFFnPH+h5hE9vdxYZCAD23pH74qScugXNdu7UBQECWzvn0U5d1JlT11NdGiOacIbKzvKgSWsIJskGz+f13lHo3Ju5J3XsbcpErZwZ2dRlDowtHrR1t8jeNXYnjumcg46jbMPwp6i04QlehSY1obQvceF7ckrb0pg+PVN7JGBAbNNAhBCoHoSCWmz92oBYBDextXxAnVdjYT/GcxKPcHaiy/mh+xGsiGpua25jQe9d9IK+JCV+VoSEYZGhWbd7htbt8Nwjy/I/NpwKwKP6nSGCTbU3GUDq2v3PzckEH35TCLR3vvTOl975UlqSw09BuOocNOxoYYku0XDU2bFFmhUiMmQACqAXHdWbSjaR5ardRpmkxXQa/VqSE13UwWl3UO9DFm0s6tAlBgWexaKuINvOtzfAQ1Ub768Bct+XR9m1vqiDHbbbPeELaYyT/kj82QjPBXsnD9lisPtOW+kjbR9o8b0c3sCXv8qfd3vpU279FLKfQvZTyJIogYcRas682sb0tP1xTHSBEZTd+RBtjeYyFImpHCTh1NNcTXSC1jmQa4P8/75kTV1x+73XFb2u6HVFC7pCY7/uTldcos/LqK4w5boKbeDnUHZfN9YWPLn78nlefPf5eOf2fw==&lt;/diagram&gt;&lt;/mxfile&gt;\">\u003Cdefs/>\u003Cg>\u003Cg data-cell-id=\"0\">\u003Cg data-cell-id=\"1\">\u003Cg data-cell-id=\"2\">\u003Cg>\u003Crect x=\"120\" y=\"190\" width=\"100\" height=\"40\" rx=\"6\" ry=\"6\" fill=\"#e6e6e6\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 210px; margin-left: 121px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">Javascript\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"170\" y=\"214\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\" font-weight=\"bold\">Javascript\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"5\">\u003Cg>\u003Crect x=\"280\" y=\"0\" width=\"80\" height=\"30\" rx=\"4.5\" ry=\"4.5\" fill=\"#1a1a1a\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 15px; margin-left: 281px;\">\u003Cdiv data-drawio-colors=\"color: #FFFFFF; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Variables\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"320\" y=\"19\" fill=\"#FFFFFF\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">Variables\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"6\">\u003Cg>\u003Crect x=\"420\" y=\"0\" width=\"80\" height=\"30\" rx=\"4.5\" ry=\"4.5\" fill=\"#1a1a1a\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 15px; margin-left: 421px;\">\u003Cdiv data-drawio-colors=\"color: #FFFFFF; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Types\u003Cdiv>\u003Ci>(typeof)\u003C/i>\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"460\" y=\"19\" fill=\"#FFFFFF\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">Types...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"7\">\u003Cg>\u003Crect x=\"355\" y=\"280\" width=\"80\" height=\"30\" rx=\"4.5\" ry=\"4.5\" fill=\"#1a1a1a\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 295px; margin-left: 356px;\">\u003Cdiv data-drawio-colors=\"color: #FFFFFF; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Tableaux\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"395\" y=\"299\" fill=\"#FFFFFF\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">Tableaux\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"8\">\u003Cg>\u003Crect x=\"0\" y=\"30\" width=\"80\" height=\"30\" rx=\"4.5\" ry=\"4.5\" fill=\"#1a1a1a\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 45px; margin-left: 1px;\">\u003Cdiv data-drawio-colors=\"color: #FFFFFF; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Boucles\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"40\" y=\"49\" fill=\"#FFFFFF\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">Boucles\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"9\">\u003Cg>\u003Crect x=\"140\" y=\"20\" width=\"80\" height=\"30\" rx=\"4.5\" ry=\"4.5\" fill=\"#1a1a1a\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 35px; margin-left: 141px;\">\u003Cdiv data-drawio-colors=\"color: #FFFFFF; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Conditions\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"180\" y=\"39\" fill=\"#FFFFFF\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">Conditions\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"10\">\u003Cg>\u003Crect x=\"240\" y=\"370\" width=\"80\" height=\"30\" rx=\"4.5\" ry=\"4.5\" fill=\"#1a1a1a\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 385px; margin-left: 241px;\">\u003Cdiv data-drawio-colors=\"color: #FFFFFF; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Fonctions\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"280\" y=\"389\" fill=\"#FFFFFF\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">Fonctions\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"11\">\u003Cg>\u003Crect x=\"390\" y=\"165\" width=\"80\" height=\"30\" rx=\"4.5\" ry=\"4.5\" fill=\"#1a1a1a\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 180px; margin-left: 391px;\">\u003Cdiv data-drawio-colors=\"color: #FFFFFF; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Operateurs\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"430\" y=\"184\" fill=\"#FFFFFF\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">Operateurs\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"12\">\u003Cg>\u003Crect x=\"30\" y=\"394\" width=\"80\" height=\"30\" rx=\"4.5\" ry=\"4.5\" fill=\"#1a1a1a\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 409px; margin-left: 31px;\">\u003Cdiv data-drawio-colors=\"color: #FFFFFF; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Modules\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"70\" y=\"413\" fill=\"#FFFFFF\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">Modules\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"17\">\u003Cg>\u003Cpath d=\"M 220 210 Q 230 210 250 112.5 Q 270 15 280 15\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"18\">\u003Cg>\u003Cpath d=\"M 360 15 Q 370 15 390 15 Q 410 15 420 15\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"19\">\u003Cg>\u003Cpath d=\"M 220 210 Q 230 210 287.5 252.5 Q 345 295 355 295\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"20\">\u003Cg>\u003Cpath d=\"M 170 190 Q 160 190 85 117.5 Q 10 45 0 45\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"21\">\u003Cg>\u003Cpath d=\"M 170 190 Q 160 190 155 112.5 Q 150 35 140 35\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"22\">\u003Cg>\u003Cpath d=\"M 170 230 Q 180 230 205 303.75 Q 230 377.5 240 377.5\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"23\">\u003Cg>\u003Cpath d=\"M 170 230 Q 160 230 100 319.5 Q 40 409 30 409\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"24\">\u003Cg>\u003Cpath d=\"M 220 210 Q 230 210 305 195 Q 380 180 390 180\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"25\">\u003Cg>\u003Crect x=\"530\" y=\"31\" width=\"80\" height=\"20\" rx=\"3\" ry=\"3\" fill=\"rgb(255, 255, 255)\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 41px; margin-left: 531px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Ci>string\u003C/i>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"570\" y=\"45\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">string\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"26\">\u003Cg>\u003Crect x=\"530\" y=\"60\" width=\"80\" height=\"19\" rx=\"2.85\" ry=\"2.85\" fill=\"rgb(255, 255, 255)\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/
2758SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 70px; margin-left: 531px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Ci>number\u003C/i>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"570\" y=\"73\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">number\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"27\">\u003Cg>\u003Crect x=\"530\" y=\"90\" width=\"80\" height=\"19\" rx=\"2.85\" ry=\"2.85\" fill=\"rgb(255, 255, 255)\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 100px; margin-left: 531px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Ci>boolean\u003C/i>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"570\" y=\"103\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">boolean\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"28\">\u003Cg>\u003Crect x=\"530\" y=\"120\" width=\"80\" height=\"19\" rx=\"2.85\" ry=\"2.85\" fill=\"rgb(255, 255, 255)\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 130px; margin-left: 531px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Ci>bigint\u003C/i>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"570\" y=\"133\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">bigint\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"29\">\u003Cg>\u003Crect x=\"530\" y=\"150\" width=\"80\" height=\"19\" rx=\"2.85\" ry=\"2.85\" fill=\"rgb(255, 255, 255)\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 160px; margin-left: 531px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Ci>null\u003C/i>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"570\" y=\"163\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">null\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"30\">\u003Cg>\u003Crect x=\"530\" y=\"180\" width=\"80\" height=\"19\" rx=\"2.85\" ry=\"2.85\" fill=\"rgb(255, 255, 255)\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 190px; margin-left: 531px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Ci>undefined\u003C/i>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"570\" y=\"193\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">undefined\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"31\">\u003Cg>\u003Cpath d=\"M 460 30 Q 470 30 495 35.5 Q 520 41 530 41\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"32\">\u003Cg>\u003Cpath d=\"M 460 30 Q 470 30 495 49.75 Q 520 69.5 530 69.5\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"33\">\u003Cg>\u003Cpath d=\"M 460 30 Q 470 30 495 64.75 Q 520 99.5 530 99.5\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"34\">\u003Cg>\u003Cpath d=\"M 460 30 Q 470 30 495 77.38 Q 520 124.75 530 124.75\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"35\">\u003Cg>\u003Cpath d=\"M 460 30 Q 470 30 495 94.75 Q 520 159.5 530 159.5\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"36\">\u003Cg>\u003Cpath d=\"M 460 30 Q 470 30 495 107.38 Q 520 184.75 530 184.75\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"37\">\u003Cg>\u003Cpath d=\"M 320 385 Q 330 385 365 392.5 Q 400 400 410 400\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"41\">\u003Cg>\u003Cpath d=\"M 110 409 Q 120 409 170 427 Q 220 445 230 445\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"42\">\u003Cg>\u003Crect x=\"355\" y=\"60\" width=\"50\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 355 60 M 405 60 M 405 90 L 355 90\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 48px; height: 1px; padding-top: 87px; margin-left: 356px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; overflow-wrap: normal;\">let\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"380\" y=\"87\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\" font-style=\"italic\">let\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"43\">\u003Cg>
2758\u003Cpath d=\"M 320 30 Q 330 30 337.5 60 Q 345 90 355 90\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"44\">\u003Cg>\u003Crect x=\"350\" y=\"90\" width=\"60\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 350 90 M 410 90 M 410 120 L 350 120\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 117px; margin-left: 351px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; overflow-wrap: normal;\">
2758var\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"380\" y=\"117\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\" font-style=\"italic\">var\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"45\">\u003Cg>\u003Cpath d=\"M 320 30 Q 330 30 335 75 Q 340 120 350 120\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"46\">\u003Cg>\u003Crect x=\"350\" y=\"30\" width=\"70\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 350 30 M 420 30 M 420 60 L 350 60\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 57px; margin-left: 351px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; overflow-wrap: normal;\">const\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"385\" y=\"57\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\" font-style=\"italic\">const\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"47\">\u003Cg>\u003Cpath d=\"M 320 30 Q 330 30 335 45 Q 340 60 350 60\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"48\">\u003Cg>\u003Crect x=\"315\" y=\"130\" width=\"80\" height=\"20\" rx=\"3\" ry=\"3\" fill=\"rgb(255, 255, 255)\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 140px; margin-left: 316px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Ci>périmètre\u003C/i>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"355\" y=\"144\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">périmètre\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"49\">\u003Cg>\u003Cpath d=\"M 311.36 27.33 Q 321.36 27.33 321.36 55.5 Q 321.36 83.66 313.18 83.66 Q 305 83.66 305 111.83 Q 305 140 315 140\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"50\">\u003Cg>\u003Crect x=\"530\" y=\"210\" width=\"80\" height=\"19\" rx=\"2.85\" ry=\"2.85\" fill=\"rgb(255, 255, 255)\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 220px; margin-left: 531px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Ci>symbol\u003C/i>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"570\" y=\"223\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">symbol\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"51\">\u003Cg>\u003Cpath d=\"M 460 30 Q 470 30 495 122.38 Q 520 214.75 530 214.75\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"52\">\u003Cg>\u003Crect x=\"750\" y=\"0\" width=\"80\" height=\"30\" rx=\"4.5\" ry=\"4.5\" fill=\"#1a1a1a\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 15px; margin-left: 751px;\">\u003Cdiv data-drawio-colors=\"color: #FFFFFF; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Conversions\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"790\" y=\"19\" fill=\"#FFFFFF\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">Conversions\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"54\">\u003Cg>\u003Cpath d=\"M 500 15 Q 510 15 625 15 Q 740 15 750 15\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"56\">\u003Cg>\u003Crect x=\"500\" y=\"261\" width=\"80\" height=\"19\" rx=\"2.85\" ry=\"2.85\" fill=\"rgb(255, 255, 255)\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 271px; margin-left: 501px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Ci>comparaisons\u003C/i>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"540\" y=\"274\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">comparaisons\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"57\">\u003Cg>
2758\u003Cpath d=\"M 430 195 Q 440 195 465 230.38 Q 490 265.75 500 265.75\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"58\">\u003Cg>\u003Crect x=\"254.5\" y=\"160\" width=\"80\" height=\"20\" rx=\"3\" ry=\"3\" fill=\"rgb(255, 255, 255)\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 170px; margin-left: 256px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Ci>camelCase\u003C/i>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"295\" y=\"174\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">camelCase\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"59\">\u003Cg>\u003Cpath d=\"M 320 30 Q 310 30 297.25 95 Q 284.5 160 274.5 160\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"60\">\u003Cg>\u003Crect x=\"640\" y=\"51\" width=\"90\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 640 51 M 730 51 M 730 81 L 640 81\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 78px; margin-left: 641px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; overflow-wrap: normal;\">Number()\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"685\" y=\"78\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\" font-style=\"italic\">Number()\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"61\">\u003Cg>\u003Cpath d=\"M 610 69.5 Q 620 69.5 625 75.25 Q 630 81 640 81\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"62\">\u003Cg>\u003Crect x=\"490\" y=\"295\" width=\"80\" height=\"19\" rx=\"2.85\" ry=\"2.85\" fill=\"rgb(255, 255, 255)\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 305px; margin-left: 491px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Ci>logiques\u003C/i>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"530\" y=\"308\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">logiques\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"63\">\u003Cg>
2758\u003Cpath d=\"M 430 195 Q 440 195 460 247.38 Q 480 299.75 490 299.75\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"64\">\u003Cg>\u003Crect x=\"555\" y=\"320\" width=\"120\" height=\"40\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 555 320 M 675 320 M 675 360 L 555 360\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 357px; margin-left: 556px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; overflow-wrap: normal;\">|| \u003Cdiv>(operateur OU)\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"615\" y=\"357\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\" font-style=\"italic\">...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"65\">\u003Cg>\u003Cpath d=\"M 530 314 Q 540 314 542.5 337 Q 545 360 555 360\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"66\">\u003Cg>\u003Crect x=\"555\" y=\"360\" width=\"120\" height=\"40\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 555 360 M 675 360 M 675 400 L 555 400\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 397px; margin-left: 556px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; overflow-wrap: normal;\">&amp;&amp; \u003Cdiv>(operateur ET)\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"615\" y=\"397\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\" font-style=\"italic\">&amp;&amp;...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"67\">\u003Cg>\u003Cpath d=\"M 530 314 Q 540 314 542.5 357 Q 545 400 555 400\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003C/g>\u003C/g>\u003C/g>\u003Cswitch>\u003Cg requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\"/>\u003Ca transform=\"translate(0,-5)\" xlink:href=\"https://www.drawio.com/doc/faq/svg-export-text-problems\" target=\"_blank\">\u003Ctext text-anchor=\"middle\" font-size=\"10px\" x=\"50%\" y=\"100%\">Text is not SVG - cannot display\u003C/text>\u003C/a>\u003C/switch>\u003C/svg>","type":"application/vnd.drawio","modified":"20240917103700465","title":"$:/diagram/js"},
2759{"created":"20240610133711381","text":"\u003Csvg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" width=\"1104px\" height=\"592px\" viewBox=\"-0.5 -0.5 1104 592\" content=\"&lt;mxfile host=&quot;embed.diagrams.net&quot; modified=&quot;2024-06-10T14:54:55.523Z&quot; agent=&quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0&quot; etag=&quot;z3WSdjFf-rwpBB4wYqXE&quot; version=&quot;24.5.2&quot; type=&quot;embed&quot;&gt;&lt;diagram id=&quot;l-a_m1xrFyUj5Ui0IaB_&quot; name=&quot;Page-1&quot;&gt;7Z1bd5u4FoB/jVfSh7IEQlweU6ed07Omp13trHVmHomtOJxi8IDsOOfXjwSSDUh2sCOIS9S51Ii7tPf+9hZb0gROl9vf8mj18CWb42TigPl2Am8njmOHDv0/K3iqCpBnVwWLPJ7zY/YFP+L/Y14IeOk6nuOicSDJsoTEq2bhLEtTPCONsijPs8fmYfdZ0rzrKlpgqeDHLErk0v/Gc/LA3yKA+/J/4XjxwO8cOH61YxmJY/mLFA/RPHusFcGPEzjNs4xUv5bbKU5Y1Ylqqc77dGDv7rlynJIuJ/B22ETJmr/av6NNVMzyeEX4E5In8dYEb+lFPzyQZUILbPozSuJFSn/P6O1wTgs2OCcxracbvmMZz+fs9A+PDzHBP1bRjF3rkQoFLcuzdTrHc36t+ywlvKVtV2zzm5f74ySZZkmWlw8D7xH7hx9XK6/+0PKC5NlPXNvjlX/oHrmSeL2xp8fbWhGvtN9wtsQkf6KH8L0I2RaqTuIiLFr0cS8PAS96qIkC4mURl8DF7tL7VqI/eEOpG82VGu3m2+eJ40VLVqvpXbEqX9JLWGvN402jFb2/10y4ymp7X5T1fUMPsN3VtjqL76e/FuX5a7o3jTbxIiJ4nYvL0mcsr1wdJImKqrlrckPFfsX20DYgcZR8pzoapYtSUEhGj70F9FeC7wn/eZcRki35yTmvTbZjlcUpKasSfaD/0sqd2hNEn2BKt2yxRf9tyk+apbiL+Ir7MlElcbqYlgf+xW5uMdkr0mj1R/aNPYR4ODxb50W8wd9xVbnlY0ZrkvFNdhDJMf5EbQ69Yq3kS7bZF6T48eOc2hxRpX6tafBux761WCPu9qckJk/fcRKROEs/Ko6m1bPbKAhthBtmFA9crqws9bk4nZ95ZoEXS6Z+9ROZda8dQityQ61D44jmNbJ1PsPfcB5TFcI5EzdWgfUTmlekb7rA5JkT/NuW8VEak0+fAgDAbo+ggKMwZDrMDQQtc2MDx3J9yeTYsCeb40k25zFOGbqM5hvNH6vmC7fkU7SME6Z4U3rfmMqLA/6DH9VmARwyCxrMgAeDthnwurkdUIMJ8CUTICk/rgnuIVlsyN1OIXfytCsRckKbAexlglsRdftXKnegraude5+TbeFtTP4sddqlxrTarnQ89BHfvt3WDr59qm3sbsHLtIkKfe386U9xJ7bxF3/xcmP/ROWWeKSDAlbVVsN3rOqoYdpZ2x0Vwrxsyk0zBFIJFD+1Mo5HXGbXsXcME9fhLVudWg9cWlfz3NCyXR+gIHAgcsK2M+5YDqzths27cBFp36XUgN0bd1IK4fa/XCuakpnl5CFbZGmU/J6VXGSt/z9MyBN3LRhYWmh9RbXaS6zlQnSK1JZbL9Wkg76YUHC7ptz2UcXupEXIltXIHUiNhMUXBAhBJw2iYhA91Q7j/tPh+8DwsMu515fqsudqDzLa09IeCMOG9lgOC
2759M7RoBrZ6rIPLACPy78KbE29Oh4PddKf4NUo5IWMOTsuuHZDxKEfWr5X298JG6eqloeaKizUQJdWBZJS3WazdeV0g+vbr1/emajNRG0manvOgYB6ojbktpxTX47ZbLenoM2WCZtkVGN+kCxnHzmMITCGwBiCYbpvAupSu17T4QgCC3myOVB142oxB7ZkDs50uC+vE6d7jHdUKNoSpEVI6s6vJzu/wkr37f36dit4DGwLoE7x4xl+qA2NsJ3bmXdxIgqHElHHsUKvJaVuVymVLhd4nmV7+3Cv5Yp5oRU4Q/QT2vJH+wKTP6jAfV2T6/t1OqMif/3Osmm7mfDMeGXj88qGtWaneGVu2yuzfWAB2StzevPKkAHlBSLPHqhLX4m8zo7Zqb2PftDyAX29vY+2nCryEBck4yphsGawNiasXWxnA7KlzgaoxFrYF9VGnDDyK1NtoC9tvh0MSTUo9WwcjQv99jc4oJmC8ke4WZYWWWK63A0Fx0fBiw3uZAo66uCuNwqGhoKXSMFgqNiuzSW4kz79Pe5OF2GTRKYGm1Y77/OSTsvp2ycfeTUReU8Vz4ZH5USVfdSpiRV5rU7HFq4ZAaQwAqLspYIAYVMQOubtKeL31oXc1oX0dVoL+1cTpyihtvfa9FAbJ8Y4Ma/pxDiDOjFQThtIsoUxA8YMGDMwmBkIA9kMIKUZ6GsEGHRMLPPasYytyJ0X5rnvYCZEntSnDECP8QyUM4jmcW64Y7hjuDMYd2wAJLV3PCV4EDocP78IPHL2lAHPJYAHDgQeTwaP3St45Iycu2j205DHkGeE5LnUHIbQ75rD0FvEIyczvVHwDCsjDfCostHRUBGPLIFeZ/CcmsQQQhlz+7vpSk2Acl5OgclngpfXPzF93Gm5w5DOkG58pLsYssl9eVCdlyDSc/WjTc5QMmgbGm1AgTZ/ILQFEmxcp9eYSk5OWOy5Y3hjeDM+3lxsZKVQfhAq+dPXoCdXTi4x/LkE/oSvxx8U9sgfMddTTeCm+WQKJzdhKVJ01/xqzf6qCpPqL25i9pNpV1NeRxs8YxVMbTI7OcX8OOUk3O3ZsqWrzaOUxoUguYryuxyzJ2HTbt9+/XLoCoaVhpUjYuUpUzLVTaajgYWeK8VirrhKHYSeAoSeDhCOOKuCTawrMn75xLro9AxgLRN2PTP/oKBD39hzfachaqidvqsReHL2RMHRRgFQEu/ImhEcTFcSDAvDJMMkw6RemeRCrzX7LgxdGUlAgaS2PTkLSSPOt6BIcuqjUiiSQjFV9IUhaaDsCiTSxgWS2l6NRiTJeRXLbB7fU4NrgGSAZIB0uUBqr95Qz/ytM8nui0kjTsVozdJuW8B/ZlLB10LSQHkXPmghye8NSZ42X+eXXoNA+xz/YmWXfsWns/WQk17YcpZTaiZxKi91aVwF4yr8+q5CN20++slJg+vgIGSh5ph16Kp9B6enb41I/vSzwMWJEcem/CtIcfWtx0QdxpS8HVPySlGH0446bDGc6LkUBR0hB9I2L+ubcQ3rU8bYzUljLICenThGtZRVJ29TAKbubSLtn3Q6C4785SWazz9u6Bv8HhfU48RmEKshxdhI8dLxiX0uwgRbK1/sFu4cItUaaUu1HgFHujU57m8JXKQYT4QG+tQCgWPRVz6w/CCbzqMqtstVCEWqgOb1B2FrTjrd6w8iuaeW5BFl27EUuXrAxRLg7rN8uU6imGXDmTjL0HP09HzNOItGVe0uGlsFyL6+7SAzVbgul6gx76mjIN1A039T+WmLlORLafyIo21dO+NhafCwwrfuYbWjDVezhyUPpZsl8ewna4d13sHFOj7MwXhaxtMynlY/npavtgyDpHWKvD7jZul1s1R9zwONoqMuueRmdZxZ/Bw3y5EEaLvdWu2+bQVwrq+K9d0yJldUZ9lql6Rc7pJZPv/2neGO4c4b4M6pY3v77A9XBPw+kkjk9BXwe6qloSsjUKyitKH3oiJZ9b2/5/V3w/xX4efyA5pV2tpZ+cE7qalMzDHjRV+hehTFoN1hnu76qnTqjck0JvOtmsyhraKUqbZzpupWsTf/XNtaUSPoxdKYiuxdVCqyp5p/r+jQaRMRksd3a5N5aIz/mzD+zb4XTXbhhJSR1hgUGMiTQqjmndVCAjM5Xx8gEJ1vdRB4A823t5twUcwxAruthHtGN40v9/MVmNxwfGCTemhQMUJUnJh6OBhH7Lbig9CSu1p2yzjqTj70VV0tby+oOO9zt34C2UMQqLNsyGkTsyQqCtYXZhhhGGEYMRQjvCYjoC93Oymz77QQQtvMCiMhhOX6boMSbLDqGSOX9NNDscy1/lmCOsuNPHNCmVdU4HVi6GHoMSp6nDqiXmfSEAR+axgssmU+9LUGki/3V6+SdRFjKtZGzY2aGzXXpOauCzqoeV9rvPsj7nJm82uhSWOCrXBy3vxaOmdIUuQN+gP1RsPAUUtaD73R8lftv9c4f/qBEzzL8pskMR3ShiMj48glj4Wn2t7mTKDoblDNd68DNIH8dWo8oKlD5ihhtGeh+4okF3+gLHSF59Je9lsfTwK503oyQO4oKK/xyJWBXcPnqN/bpyoRh1b/x6Qc7P7h6fP8up6r2cwoNcwzzBsR8wbGWCB1iqiGrPdGMcdQrA+KKXq4hcHvPSZCgWW7YPenOXQYsfVZgbS3B769ztiI7nzbR28kyw3eDN4M3gbBm6fAG+oLb2NeAebC8DbYzBjAcr09wJzmmncebPLN6cS3k2fGAFLfg+a5MQL5cxWtKmDR/6Y5jgjmsdlEHmDhWNFqRWWTMQ1kbAXOVY5FgRlyYRhnGNeaGqNjF+fLaeiH0mrBCDiKPNrehiwH4/4+FtSgCKzQv4Al0cTcTQ1YDvR9DPnSorDI28nbi4M+uplnTPf2h1NYPHzJ5pgd8Q8=&lt;/diagram&gt;&lt;/mxfile&gt;\">\u003Cdefs/>\u003Cg>\u003Cg>\u003Crect x=\"501.5\" y=\"0\" width=\"80\" height=\"50\" rx=\"7.5\" ry=\"7.5\" fill=\"#f5f5f5\" stroke=\"#666666\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 25px; margin-left: 503px;\">\u003Cdiv data-drawio-colors=\"color: #333333; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">Javascript\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"542\" y=\"29\" fill=\"#333333\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\">Javascript\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Crect x=\"480.5\" y=\"82.47\" width=\"130\" height=\"50\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 480.5 82.47 M 610.5 82.47 M 610.5 132.47 L 480.5 132.47\" fill=\"none\" stroke=\"#ff8000\" stroke-width=\"2\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 129px; margin-left: 482px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; font-style: italic; white-space: normal; overflow-wrap: normal;\">API \u003Cdiv style=\"font-size: 14px;\">du navigateur\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>
2759\u003Ctext x=\"546\" y=\"129\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\" font-style=\"italic\">API...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Crect x=\"588.5\" y=\"140\" width=\"80\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 588.5 140 M 668.5 140 M 668.5 170 L 588.5 170\" fill=\"none\" stroke=\"#ff0000\" stroke-width=\"2\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 167px; margin-left: 590px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: &quot;Courier New&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">window\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"629\" y=\"167\" fill=\"rgb(0, 0, 0)\" font-family=\"Courier New\" font-size=\"12px\" text-anchor=\"middle\" font-weight=\"bold\">window\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 538.61 131.22 Q 548.61 131.22 563.56 150.61 Q 578.5 170 588.5 170\" fill=\"none\" stroke=\"#ff0000\" stroke-width=\"2\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Cpath d=\"M 501.5 170 Q 511.5 170 519.27 151.24 Q 527.05 132.47 537.05 132.47\" fill=\"none\" stroke=\"#ff8000\" stroke-width=\"2\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Cpath d=\"M 552.4 250.93 Q 562.4 250.93 584.01 213.59 Q 605.62 176.24 615.62 176.24\" fill=\"none\" stroke=\"#ff8000\" stroke-width=\"3\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"495\" y=\"250\" width=\"140\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 495 250 M 635 250 M 635 280 L 495 280\" fill=\"none\" stroke=\"#ff8000\" stroke-width=\"3\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 138px; height: 1px; padding-top: 277px; margin-left: 496px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: &quot;Courier New&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">Document (DOM)\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"565\" y=\"277\" fill=\"rgb(0, 0, 0)\" font-family=\"Courier New\" font-size=\"12px\" text-anchor=\"middle\" font-weight=\"bold\">Document (DOM)\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Crect x=\"789.46\" y=\"368.56\" width=\"130\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 789.46 368.56 M 919.46 368.56 M 919.46 398.56 L 789.46 398.56\" fill=\"none\" stroke=\"#ff0000\" stroke-width=\"2\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 396px; margin-left: 790px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: &quot;Courier New&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">localStorage\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"854\" y=\"396\" fill=\"rgb(0, 0, 0)\" font-family=\"Courier New\" font-size=\"12px\" text-anchor=\"middle\" font-weight=\"bold\">localStorage\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 668.5 170 Q 678.5 170 728.98 284.28 Q 779.46 398.56 789 399\" fill=\"none\" stroke=\"#ff0000\" stroke-width=\"2\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Cpath d=\"M 668.5 170 Q 678.5 170 734.98 200.03 Q 791.46 230.06 801.46 230.06\" fill=\"none\" stroke=\"#ff0000\" stroke-width=\"2\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"784.46\" y=\"150.06\" width=\"230\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 784.46 150.06 M 1014.46 150.06 M 1014.46 180.06 L 784.46 180.06\" fill=\"none\" stroke=\"#ff0000\" stroke-width=\"2\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 228px; height: 1px; padding-top: 177px; margin-left: 785px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: &quot;Courier New&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">setTimeOut(funcion().1000)\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"899\" y=\"177\" fill=\"rgb(0, 0, 0)\" font-family=\"Courier New\" font-size=\"12px\" text-anchor=\"middle\" font-weight=\"bold\">setTimeOut(funcion().1000)\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 668.5 170 Q 678.5 170 726.48 175.03 Q 774.46 180.06 784 180\" fill=\"none\" stroke=\"#ff0000\" stroke-width=\"2\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"801.46\" y=\"310.06\" width=\"90\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 801.46 310.06 M 891.46 310.06 M 891.46 340.06 L 801.46 340.06\" fill=\"none\" stroke=\"#ff0000\" stroke-width=\"2\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 337px; margin-left: 802px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: &quot;Courier New&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">history\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"846\" y=\"337\" fill=\"rgb(0, 0, 0)\" font-family=\"Courier New\" font-size=\"12px\" text-anchor=\"middle\" font-weight=\"bold\">history\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 668.5 170 Q 678.5 170 734.98 255.03 Q 791.46 340.06 801 340\" fill=\"none\" stroke=\"#ff0000\" stroke-width=\"2\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"801.46\" y=\"250.06\" width=\"90\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 801.46 250.06 M 891.46 250.06 M 891.46 280.06 L 801.46 280.06\" fill=\"none\" stroke=\"#ff0000\" stroke-width=\"2\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 277px; margin-left: 802px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: &quot;Courier New&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">console\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"846\" y=\"277\" fill=\"rgb(0, 0, 0)\" font-family=\"Courier New\" font-size=\"12px\" text-anchor=\"middle\" font-weight=\"bold\">console\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 668.5 170 Q 678.5 170 734.98 225.03 Q 791.46 280.06 801 280\" fill=\"none\" stroke=\"#ff0000\" stroke-width=\"2\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Cpath d=\"M 540.3 81.82 L 541.5 50\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"801.46\" y=\"200.06\" width=\"90\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>
2759\u003Cpath d=\"M 801.46 200.06 M 891.46 200.06 M 891.46 230.06 L 801.46 230.06\" fill=\"none\" stroke=\"#ff0000\" stroke-width=\"2\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 227px; margin-left: 802px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: &quot;Courier New&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">alert()\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"846\" y=\"227\" fill=\"rgb(0, 0, 0)\" font-family=\"Courier New\" font-size=\"12px\" text-anchor=\"middle\" font-weight=\"bold\">alert()\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Crect x=\"931.46\" y=\"230.06\" width=\"80\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 931.46 230.06 M 1011.46 230.06 M 1011.46 260.06 L 931.46 260.06\" fill=\"none\" stroke=\"#ff0000\" stroke-width=\"2\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 257px; margin-left: 932px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: &quot;Courier New&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">log()\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"971\" y=\"257\" fill=\"rgb(0, 0, 0)\" font-family=\"Courier New\" font-size=\"12px\" text-anchor=\"middle\" font-weight=\"bold\">log()\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 891.46 280.06 Q 901.46 280.06 911.46 270.06 Q 921.46 260.06 931 260\" fill=\"none\" stroke=\"#ff0000\" stroke-width=\"2\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"956.46\" y=\"240.06\" width=\"55\" height=\"50\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 956.46 240.06 M 1011.46 240.06 M 1011.46 290.06 L 956.46 290.06\" fill=\"none\" stroke=\"#ff0000\" stroke-width=\"2\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 53px; height: 1px; padding-top: 287px; margin-left: 957px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: &quot;Courier New&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">dir()\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"984\" y=\"287\" fill=\"rgb(0, 0, 0)\" font-family=\"Courier New\" font-size=\"12px\" text-anchor=\"middle\" font-weight=\"bold\">dir()\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 891.46 280.06 Q 901.46 280.06 923.96 285.06 Q 946.46 290.06 956 290\" fill=\"none\" stroke=\"#ff0000\" stroke-width=\"2\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"921.46\" y=\"310.06\" width=\"80\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 921.46 310.06 M 1001.46 310.06 M 1001.46 340.06 L 921.46 340.06\" fill=\"none\" stroke=\"#ff0000\" stroke-width=\"2\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 337px; margin-left: 922px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: &quot;Courier New&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">back()\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"961\" y=\"337\" fill=\"rgb(0, 0, 0)\" font-family=\"Courier New\" font-size=\"12px\" text-anchor=\"middle\" font-weight=\"bold\">back()\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 891.46 340.06 Q 901.46 340.06 906.46 340.06 Q 911.46 340.06 921 340\" fill=\"none\" stroke=\"#ff0000\" stroke-width=\"2\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"931.46\" y=\"350.06\" width=\"170\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 931.46 350.06 M 1101.46 350.06 M 1101.46 380.06 L 931.46 380.06\" fill=\"none\" stroke=\"#ff0000\" stroke-width=\"2\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 168px; height: 1px; padding-top: 377px; margin-left: 932px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: &quot;Courier New&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">setItem(key,value)\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"1016\" y=\"377\" fill=\"rgb(0, 0, 0)\" font-family=\"Courier New\" font-size=\"12px\" text-anchor=\"middle\">setItem(key,value)\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 919.46 398.56 Q 929.46 398.56 929.46 393.93 Q 929.46 389.31 925.46 389.31 Q 921.46 389.31 921.46 384.68 Q 921.46 380.06 931 380\" fill=\"none\" stroke=\"#ff0000\" stroke-width=\"2\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"936.46\" y=\"389.06\" width=\"130\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 936.46 389.06 M 1066.46 389.06 M 1066.46 419.06 L 936.46 419.06\" fill=\"none\" stroke=\"#ff0000\" stroke-width=\"2\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 416px; margin-left: 937px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: &quot;Courier New&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">getItem(key)\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"1001\" y=\"416\" fill=\"rgb(0, 0, 0)\" font-family=\"Courier New\" font-size=\"12px\" text-anchor=\"middle\" font-weight=\"bold\">getItem(key)\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 919.46 398.56 Q 929.46 398.56 929.46 403.68 Q 929.46 408.81 927.96 408.81 Q 926.46 408.81 926.46 413.93 Q 926.46 419.06 936 419\" fill=\"none\" stroke=\"#ff0000\" stroke-width=\"2\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"591.46\" y=\"401\" width=\"160\" height=\"60\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 591.46 401 M 751.46 401 M 751.46 461 L 591.46 461\" fill=\"none\" stroke=\"#ff8000\" stroke-width=\"3\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 458px; margin-left: 592px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; overflow-wrap: normal;\">Création d'un élément\u003Cdiv>avec positionnement \u003C/div>\u003Cdiv>dans l'arbre du DOM\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"671\" y=\"458\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\" font-style=\"italic\">Création d'un élément...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 557.02 278.59 Q 567.02 278.59 574.24 369.8 Q 581.46 461 591 461\" fill=\"none\" stroke=\"#ff8000\" stroke-width=\"3\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"386.5\" y=\"374\" width=\"100\" height=\"40\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 386.5 374 M 486.5 374 M 486.5 414 L 386.5 414\" fill=\"none\" stroke=\"#ff8000\" stroke-width=\"3\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 411px; margin-left: 388px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; overflow-wrap: normal;\">sélection \u003Cdiv>d'éléments\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"437\" y=\"411\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\" font-style=\"italic\">sélection...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 554.64 279.76 Q 544.64 279.76 520.57 346.88 Q 496.5 414 487 414\" fill=\"none\" stroke=\"#ff8000\" stroke-width=\"3\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"381.5\" y=\"280.06\" width=\"110\" height=\"40\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 381.5 280.06 M 491.5 280.06 M 491.5 320.06 L 381.5 320.06\" fill=\"none\" stroke=\"#ff8000\" stroke-width=\"3\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 108px; height: 1px; padding-top: 317px; margin-left: 383px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; overflow-wrap: normal;\">modification \u003Cdiv>d'éléments\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"437\" y=\"317\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\" font-style=\"italic\">modification...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 552.4 282.13 Q 542.4 282.13 521.95 301.1 Q 501.5 320.06 492 320\" fill=\"none\" stroke=\"#ff8000\" stroke-width=\"3\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Cpath d=\"M 326 350 Q 335.53 350.06 353.51 335.06 Q 371.5 320.06 382 320\" fill=\"none\" stroke=\"#ff8000\" stroke-width=\"3\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"205.53\" y=\"320.06\" width=\"120\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 205.53 320.06 M 325.53 320.06 M 325.53 350.06 L 205.53 350.06\" fill=\"none\" stroke=\"#ff8000\" stroke-width=\"3\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 347px; margin-left: 207px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: &quot;Courier New&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">textContent\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"266\" y=\"347\" fill=\"rgb(0, 0, 0)\" font-family=\"Courier New\" font-size=\"12px\" text-anchor=\"middle\">textContent\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Crect x=\"371.5\" y=\"130\" width=\"130\" height=\"40\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 371.5 130 M 501.5 130 M 501.5 170 L 371.5 170\" fill=\"none\" stroke=\"#ff8000\" stroke-width=\"3\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObje
2759ct pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 167px; margin-left: 373px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; overflow-wrap: normal;\">gestion \u003Cdiv>d'évènenements\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"437\" y=\"167\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\" font-style=\"italic\">gestion...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 430 230 Q 440 230 440 215.51 Q 440 201.02 434.23 201.02 Q 428.45 201.02 428.45 186.53 Q 428.45 172.04 438.45 172.04\" fill=\"none\" stroke=\"#ff8000\" stroke-width=\"3\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"260\" y=\"200\" width=\"170\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 260 200 M 430 200 M 430 230 L 260 230\" fill=\"none\" stroke=\"#ff8000\" stroke-width=\"3\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 168px; height: 1px; padding-top: 227px; margin-left: 261px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: &quot;Courier New&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">addEventListener()\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"345\" y=\"227\" fill=\"rgb(0, 0, 0)\" font-family=\"Courier New\" font-size=\"12px\" text-anchor=\"middle\" font-weight=\"bold\">addEventListener()\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 211 140 Q 220.53 140 235.26 185 Q 250 230 260 230\" fill=\"none\" stroke=\"#ff8000\" stroke-width=\"3\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"100.53\" y=\"100\" width=\"110\" height=\"40\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 100.53 100 M 210.53 100 M 210.53 140 L 100.53 140\" fill=\"none\" stroke=\"#ff8000\" stroke-width=\"3\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 108px; height: 1px; padding-top: 137px; margin-left: 102px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; overflow-wrap: normal;\">traitement \u003Cdiv>de formulaire\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"156\" y=\"137\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\" font-style=\"italic\">traitement...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 210.53 195 Q 220.53 195 220.53 167.5 Q 220.53 140 211 140\" fill=\"none\" stroke=\"#ff8000\" stroke-width=\"3\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Cpath d=\"M 220 260 Q 230 260 240 245 Q 250 230 260 230\" fill=\"none\" stroke=\"#ff8000\" stroke-width=\"3\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"120\" y=\"220\" width=\"100\" height=\"40\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 120 220 M 220 220 M 220 260 L 120 260\" fill=\"none\" stroke=\"#ff8000\" stroke-width=\"3\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 257px; margin-left: 121px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; overflow-wrap: normal;\">click sur \u003Cdiv>un élément\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"170\" y=\"257\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\" font-style=\"italic\">click sur...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 205.53 310 Q 230 310 230 285 Q 230 260 220 260\" fill=\"none\" stroke=\"#ff8000\" stroke-width=\"3\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"0.53\" y=\"155\" width=\"210\" height=\"40\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 0.53 155 M 210.53 155 M 210.53 195 L 0.53 195\" fill=\"none\" stroke=\"#ff8000\" stroke-width=\"3\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 208px; height: 1px; padding-top: 192px; margin-left: 2px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: &quot;Courier New&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">xxx.addEventListener\u003Cdiv>('submit',function(){})\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"106\" y=\"192\" fill=\"rgb(0, 0, 0)\" font-family=\"Courier New\" font-size=\"12px\" text-anchor=\"middle\">xxx.addEventListener...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Crect x=\"5.53\" y=\"270\" width=\"200\" height=\"40\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 5.53 270 M 205.53 270 M 205.53 310 L 5.53 310\" fill=\"none\" stroke=\"#ff8000\" stroke-width=\"3\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 307px; margin-left: 7px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Cspan style=\"font-family: &quot;Courier New&quot;;\">xxx.addEventListener\u003C/span>\u003Cdiv style=\"font-family: &quot;Courier New&quot;;\">('click',function(){})\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"106\" y=\"307\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">xxx.addEventListener...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 330 401 Q 340 401 355.75 360.53 Q 371.5 320.06 382 320\" fill=\"none\" stroke=\"#ff8000\" stroke-width=\"3\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"250\" y=\"361\" width=\"80\" height=\"40\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 250 361 M 330 361 M 330 401 L 250 401\" fill=\"none\" stroke=\"#ff8000\" stroke-width=\"3\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 398px; margin-left: 251px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; overflow-wrap: normal;\">ses \u003Cdiv>attributs\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"290\" y=\"398\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\" font-style=\"italic\">ses...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 228 419.5 Q 238 419.5 239 410.25 Q 240 401 250 401\" fill=\"none\" stroke=\"#ff8000\" stroke-width=\"3\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"88\" y=\"389.5\" width=\"140\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 88 389.5 M 228 389.5 M 228 419.5 L 88 419.5\" fill=\"none\" stroke=\"#ff8000\" stroke-width=\"3\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 138px; height: 1px; padding-top: 417px; margin-left: 89px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: &quot;Courier New&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">setAttribute()\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"158\" y=\"417\" fill=\"rgb(0, 0, 0)\" font-family=\"Courier New\" font-size=\"12px\" text-anchor=\"middle\" font-weight=\"bold\">setAttribute()\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 228 380 Q 238 380 239 390.5 Q 240 401 250 401\" fill=\"none\" stroke=\"#ff8000\" stroke-width=\"3\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"118\" y=\"350\" width=\"110\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 118 350 M 228 350 M 228 380 L 118 380\" fill=\"none\" stroke=\"#ff8000\" stroke-width=\"3\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 108px; height: 1px; padding-top: 377px; margin-left: 119px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: &quot;Courier New&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">classList\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"173\" y=\"377\" fill=\"rgb(0, 0, 0)\" font-family=\"Courier New\" font-size=\"12px\" text-anchor=\"middle\" font-weight=\"bold\">classList\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 338 520 Q 347.5 520 385.7 468.2 Q 423.9 416.4 433.9 416.4\" fill=\"none\" stroke=\"#ff8000\" stroke-width=\"3\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"257.5\" y=\"490\" width=\"80\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 257.5 490 M 337.5 490 M 337.5 520 L 257.5 520\" fill=\"none\" stroke=\"#ff8000\" stroke-width=\"3\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 517px; margin-left: 259px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; overflow-wrap: normal;\">un seul\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"298\" y=\"517\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\" font-style=\"italic\">un seul\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Crect x=\"390.5\" y=\"490\" width=\"90\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 390.5 490 M 480.5 490 M 480.5 520 L 390.5 520\" fill=\"none\" stroke=\"#ff8000\" stroke-width=\"3\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 517px; margin-left: 392px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u00
27593Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; overflow-wrap: normal;\">plusieurs\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"436\" y=\"517\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\" font-style=\"italic\">plusieurs\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 428 417.6 Q 490.5 417.6 490.5 468.8 Q 490.5 520 481 520\" fill=\"none\" stroke=\"#ff8000\" stroke-width=\"3\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"175.5\" y=\"560\" width=\"160\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 175.5 560 M 335.5 560 M 335.5 590 L 175.5 590\" fill=\"none\" stroke=\"#ff8000\" stroke-width=\"3\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 587px; margin-left: 177px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: &quot;Courier New&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">querySelecorAll()\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"256\" y=\"587\" fill=\"rgb(0, 0, 0)\" font-family=\"Courier New\" font-size=\"12px\" text-anchor=\"middle\" font-weight=\"bold\">querySelecorAll()\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 390.5 520 Q 380.5 520 363 555 Q 345.5 590 336 590\" fill=\"none\" stroke=\"#ff8000\" stroke-width=\"3\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"37.5\" y=\"500\" width=\"160\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 37.5 500 M 197.5 500 M 197.5 530 L 37.5 530\" fill=\"none\" stroke=\"#ff8000\" stroke-width=\"3\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 527px; margin-left: 39px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Cspan style=\"font-family: &quot;Courier New&quot;; font-weight: 700;\">getElementById()\u003C/span>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"118\" y=\"527\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">getElementById()\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 257.5 520 Q 247.5 520 227.5 525 Q 207.5 530 198 530\" fill=\"none\" stroke=\"#ff8000\" stroke-width=\"3\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"37.5\" y=\"540\" width=\"150\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 37.5 540 M 187.5 540 M 187.5 570 L 37.5 570\" fill=\"none\" stroke=\"#ff8000\" stroke-width=\"3\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 148px; height: 1px; padding-top: 567px; margin-left: 39px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Cspan style=\"font-family: &quot;Courier New&quot;; font-weight: 700;\">querySelector()\u003C/span>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"113\" y=\"567\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">querySelector()\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 257.5 520 Q 247.5 520 222.5 545 Q 197.5 570 187 570\" fill=\"none\" stroke=\"#ff8000\" stroke-width=\"3\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"746.46\" y=\"482.5\" width=\"210\" height=\"40\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 746.46 482.5 M 956.46 482.5 M 956.46 522.5 L 746.46 522.5\" fill=\"none\" stroke=\"#ff8000\" stroke-width=\"3\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 208px; height: 1px; padding-top: 520px; margin-left: 747px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: &quot;Courier New&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">1 . CreateElement\u003Cdiv>2.append() ou prepend()\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"851\" y=\"520\" fill=\"rgb(0, 0, 0)\" font-family=\"Courier New\" font-size=\"12px\" text-anchor=\"middle\" font-weight=\"bold\">1 . CreateElement...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 668.26 459.32 Q 678.26 459.32 707.36 490.91 Q 736.46 522.5 74
27596 523\" fill=\"none\" stroke=\"#ff8000\" stroke-width=\"3\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cswitch>\u003Cg requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\"/>\u003Ca transform=\"translate(0,-5)\" xlink:href=\"https://www.drawio.com/doc/faq/svg-export-text-problems\" target=\"_blank\">\u003Ctext text-anchor=\"middle\" font-size=\"10px\" x=\"50%\" y=\"100%\">Text is not SVG - cannot display\u003C/text>\u003C/a>\u003C/switch>\u003C/svg>","type":"application/vnd.drawio","modified":"20240610145457370","title":"$:/diagram/js/API_web"},
2760{"created":"20240916073517849","text":"\u003Csvg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" width=\"736px\" height=\"671px\" viewBox=\"-0.5 -0.5 736 671\" content=\"&lt;mxfile host=&quot;embed.diagrams.net&quot; agent=&quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0&quot; version=&quot;24.7.17&quot;&gt;&lt;diagram id=&quot;Qadlj6rUFvg_Q1YQk-Tu&quot; name=&quot;Page-1&quot;&gt;7V1bk9uoEv41rso+xKX75XFu2d1Tm2xqkqqT86ixsK2NLHQkeS7n1x+QQBfAY9kDcsZmdqsiIUAIur9uupv2zL7ZPP9eRPn6M4xBOrOM+Hlm384syzRcA/2DS16aEt9ym4JVkcSkUlfwLfkfoC1J6TaJQTmoWEGYVkk+LFzALAOLalAWFQV8GlZbwnT41jxaAa7g2yJK+dJ/J3G1JqWmF3YP/gDJak1eHVh+82AT0crkS8p1FMOnXpF9N7NvCgir5mrzfANSPHl0Xpp2n3Y8bQdWgKwa08BqGjxG6ZZ8WwGiRTX/pyTjq17oRxdwm8UAtzNn9vXTOqnAtzxa4KdPaJlR2brapOTxEmYVWTfTQ/dp9ADS62jxc1V3cwNTWNTd2nce/g83SdJUVM5/EvnKR1BU4LlXRD7xdwA3oCpeUBXytJ1uQm9OSO6futULSNG6t24OKYsIvazanrspRRdkVncsSchNMTe1IEbkRW7RVybVyz1IoyqB2V335LpbAAPdwaJawxXMovQvCHMy7f+Aqnoh8x5tKzhclLKKiuoK0z8qyGCGOwVZzJSUYLVpptrE71lsi8d21Uu4LRbgKygSNA+gwOufZCsyItT7ClQ7HoLnpPpBesHX/8Hlc5fc3T73qt2+kJudK98MY0DBzctJraApw9P6KnkU9Sw/DrlatNik6VeYoJG0ZOUaxtw0fc/xDTcILNtzB1Tm+szjYf9kLpsuGXpqxziOxAKOxBZwk6PlJF0fzcaYxRKEe1dpsspQ2SaJ45oW+8xK6AbTW0lYHpMKRTa8khFpv0AjAgXFBzIoAWgdzOG2PeRwN3RHcbgtgcMFIHqJHH4st1r2NNxqs0LAZNZeHkPST2LF6i3cXCg/Wv44iSuFHz3Nj0dKXDSK4uVH/6bXCt92zeq7gyQ1FVN95rfdaZjfcRj54I9j/r0dOVTQ0I7ImshAEV6sazqWqDmK6NEKJ6JH25mHvb+Aoc5gFHWi+Y9eetVyXKF85a2mmAs6Gm16PJpi+b1OXsD8jXvJdyP0OJAxeKHnKhJ6tI8BWHgpesP1A7pY4Qu8Fh+rlxyU9BHqtX2K/o02eOqzhzJv7us6cfJIq3wowCZPo8Xsxp5dhc107WqGuu61FHQWbzHv4dEsiiSvftvVkCGdPcSCVjzHT9DIqiRK78GiirJVTS5VDXaYElKwrMjlA6wqpJU1jQuyJvgB4SX0Tvca/Y+m98acuWgEN+jOpHfofzEdsrTGEjF9L8bmCoHdTV2xw7Yyi/LvsOFfMjiAALVEkHMPCIUbPMFXBQCfYBo38ElLPsPHriADTz3ZcDvz8eL8d4stTtedOGmLZvZV7/kOEdPVRtPT3vSkhri7erLEbVvpcnBLKoX6DTHu9aoQyTSoMexDLK36DYY97pBgwwb+7WuiaTzOeCzOmPxm17QEQOPJABpTADRHaSWnVCqGGpFIxaDXb1Aw7FCg8BrTKBitgkv1VJfRU+Xtdm2RERnNbvHhN43eGr3PCr37KqMlQ2W0hzZjm2LGBHYSm7dSvXskH4XL1Dw3wGVrqo0fa4V0lOGyI2t9z8J+QK/H2A/KqoA/AZUKMVhG22b7EpXrdkijaI2K4VMYvVxvSGu2p47WXI7W/vXtB0dul7HvdywexJXt+7WxW6UGL/BX2f403OsZQ6pqSUgB9/ocEd3+/flCuNd1GRXMmJB7RcEhjNWuWiflnJhRx1jt9I5L77jOaMclg8PZ4BBLYC8zFLG4IzLMv/NdlrpgLpHFbCKXnMvEh3imMouZw1vMLlFpG0USjsmThHwv7Whu5q3fnXyeL9ZJGqOvEfjEtJDWQvp8hbRssyiLxY4vkNiOKonN2zIuEZ3bWDCT3kiMBXMcHtV96a6x0SvOW0oXaVSWX6INYkiD0oBGbI3Y54LYC4TYUZJhougO7EhEcI/Zc7UBwX0EN1UhuDaKTh456UxkFmXD+FtVQXWsZCA3VtLhba7gEZAhXYDZlXWaeBYPEJ4qfNCR1eM1NV/A61NFSbvMNiAcx+vHsCNviUdLU4EL4Ube+DVd6LLL21QWBUBzf5cCTPU6jExr32emfcvXtoc+zJZX+9q2rYp/pVmzL8DDYQvEKQVA5REFAbMnU+fhcHmLyqf7v798R0V3X3hrCiLzagjhe7GzFaUiWTAyKPCADBImc7ZfsJ0NVfEXv1O4RG1VqT3SFexofWsitmSN3dTjKf9IqctvfLYlIg+kbGktS2tZZ6ZlKbdxmvs3TcriSjzROawmPgx/5wxnv6LJlLrFs/Hfctkv6nE8LcQdfGxIHRGCEebPdc2uTRN7lmxyJEOwgwQTtkGRpC5AvRnLAue7MLqGdRKM/kr1T4s2o95x6lOtgtDLVhXK0Rc8w5tbQ5XBE+nkhj93efpgTZpH0YdIKz8pfQw29ZpIeB+JFfCRp6ajij5Ep3+OoY9X1voe57F7faE/xrj00yJNGEFytqvuWNaciTj2BetuqFp30amgk+LC1wLm35usBLtIZZC54PxJxA3YTHKC8JdAFYHo8JdjLUBK0yeJTpJ53jRbVIexHHFZj8amT3KZjlzWBCVvr+vxQQCPWyAIzawhpMyjTIhpD23S0o8EGDG0JVmC97xCeEPbjjjBvJChAYEeRjXv2IFR5+lX4sJABJlXhakqpGyRtOFs8jAQb6LcqzYDJN7IhG6HhoFw73HkhoF4vEXu6uufE6BDP8XyGyCiue912vzN2DPU6IlX/0lSopnoEV+AK6rig2mWbw0rUx25lR8ZvEM74VLEKjswTz/pIg/Mc4kJqLtwgmgTX1r+qrPjXmVKwVSeNIeNYlKkFHDvkawU0Pnq0egawp8Xgg5cZKggd7QydJCWE+l9o8ORvnZRrh0JOoHIOz9VDKprDG1xvjHOYsG7+VlvIZuNUaJywdt4tyW4Wy7BQkdTaj+/9vMfaMQSOHMFMkmZq98XWeRP7epv0GSm3biIPFiHni8MBFHm6vf1cbdfUGmhQvgUGyGXyR3mjfyVir2xid7IJGQH76hC5j2ST9v5vCsAYdg9WGp1SKtDWh06TN5ZJqsO+Q4v8ETh8Exg81HCTn
2760R289TK0D3QmlC9xeU0IeosEWtCbyIE7Yb5FbUewfmmU2k9PvubB6O1HiZqwVeUY4AfsFyth/queyzyV5L9xMsD61tjAG4dNH6A+Md5vkSPXXWSBoevrhUorUCdlwIlW2HymTQGluB3wSxVxqNAmr/zAk7nhoI9OwVR1dIrYJzibVYy+f6BgPcvnliHbuTMzUDoXLw67fssRQjMiqrOh4TaqNjBBsP7e3EkEPzCTIMtb4CN0YjP+7DRGjyVoLhHigwi85rP6uuyucYKDp/pRqtxWo3TalzPRu0MbRtmMKUaJ+3HnC5AjRP9wBdFReUxaGYw95lsPME488Exmpws17A+xXkgGHjMGgvSFyo7wxnwutm2BEhzTlY6k4cW5ecnyke4tDjWFTD47p0Ww82mKFeDqmNqgeiY2q/v0fpY7xqKBvrfB+K/jUYYqW6KjjKqC/IJdM7aU7i7Dt75ewp2/mJN0zdZs7LF+lXHOrz8gHXctokKJbu8PJd7Ezmmu9sZx7agmSx3tmAsqWbbw+gWzt4WwZ53vNl5R+GFzdUGC22q0fqd1u8Okd0uA5W+FVJM6f/QuqVGwQv1kcP3ILop4PKhK/JFNxNW23p2DhbcISdOfYfVAmSJbo9LXGU4+8Skwwlvz9/XhnF7mf4ecc/WD16vzwVH76nvha+O5+2CniLcr7T/I3rG6zvAKN4k2UVs/pyQj3l9PbRRuj+WdwC8rzPBb5p/jzXQCDbfks4Eo9sCW7x77Izmbf0ZxgDX+D8=&lt;/diagram&gt;&lt;/mxfile&gt;\">\u003Cdefs/>\u003Cg>\u003Cg data-cell-id=\"0\">\u003Cg data-cell-id=\"1\">\u003Cg data-cell-id=\"2\">\u003Cg>\u003Crect x=\"5\" y=\"340\" width=\"80\" height=\"40\" rx=\"6\" ry=\"6\" fill=\"#e6e6e6\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 360px; margin-left: 6px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); background-color: #E6E6E6; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 16px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(230, 230, 230); white-space: normal; overflow-wrap: normal;\">react.js\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"45\" y=\"365\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"16px\" text-anchor=\"middle\">react.js\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"19\">\u003Cg>\u003Cpath d=\"M 85 360 Q 95 360 100 410 Q 105 460 115 460\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"18\">\u003Cg>\u003Crect x=\"115\" y=\"445\" width=\"80\" height=\"30\" rx=\"4.5\" ry=\"4.5\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 460px; margin-left: 116px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">component\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"155\" y=\"464\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\" font-weight=\"bold\">component\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"22\">\u003Cg>\u003Cpath d=\"M 85 360 Q 95 360 100 247.5 Q 105 135 115 135\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"23\">\u003Cg>\u003Crect x=\"115\" y=\"120\" width=\"80\" height=\"30\" rx=\"4.5\" ry=\"4.5\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 135px; margin-left: 116px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">reactDom\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"155\" y=\"139\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\" font-weight=\"bold\">reactDom\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"26\">\u003Cg>\u003Cpath d=\"M 195 460 Q 205 460 210 377 Q 215 294 225 294\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"28\">\u003Cg>\u003Cpath d=\"M 195 460 Q 205 460 210 412.5 Q 215 365 225 365\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"29\">\u003Cg>\u003Crect x=\"225\" y=\"350\" width=\"50\" height=\"30\" rx=\"4.5\" ry=\"4.5\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 48px; height: 1px; padding-top: 365px; margin-left: 226px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">props\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"250\" y=\"369\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\" font-weight=\"bold\">props\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"30\">\u003Cg>\u003Crect x=\"425\" y=\"365\" width=\"120\" height=\"60\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 425 365 M 545 365 M 545 425 L 425 425\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 422px; margin-left: 426px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Cb>prop-types\u003C/b> \u003Cdiv>(remplacé par \u003C/div>\u003Cdiv>du typescript)\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"485\" y=\"422\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">prop-types...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"31\">\u003Cg>\u003Cpath d=\"M 415 405 Q 425 405 425 410 Q 425 415 420 415 Q 415 415 415 420 Q 415 425 425 425\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"32\">\u003Cg>\u003Crect x=\"220\" y=\"189\" width=\"80\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 220 189 M 300 189 M 300 219 L 220 219\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 216px; margin-left: 221px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; overflow-wrap: normal;\">render()\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"260\" y=\"216\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\" font-style=\"italic\">render()\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"33\">\u003Cg>\u003Cpath d=\"M 195 135 Q 205 135 207.5 177 Q 210 219 220 219\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"34\">\u003Cg>\u003Cpath d=\"M 345 219 Q 335 219 310 256.5 Q 285 294 275 294\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" stroke-dasharray=\"3 3\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"35\">\u003Cg>\u003Crect x=\"225\" y=\"279\" width=\"50\" height=\"30\" rx=\"4.5\" ry=\"4.5\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 48px; height: 1px; padding-top: 294px; margin-left: 226px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">JSX\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"250\" y=\"298\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\" font-weight=\"bold\">JSX\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"36\">\u003Cg>\u003Cpath d=\"M 300 219 Q 310 219 320 196.5 Q 330 174 340 174\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"37\">\u003Cg>\u003Crect x=\"340\" y=\"159\" width=\"50\" height=\"30\" rx=\"4.5\" ry=\"4.5\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 48px; height: 1px; padding-top: 174px; margin-left: 341px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">DOM\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"365\" y=\"178\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\" font-weight=\"bold\">DOM\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"39\">\u003Cg>\u003Crect x=\"315\" y=\"375\" width=\"100\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 315 375 M 415 375 M 415 405 L 315 405\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 402px; margin-left: 316px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Cb>this.props\u003C/b> \u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"365\" y=\"402\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">this.props \u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"40\">\u003Cg>\u003Cpath d=\"M 275 365 Q 285 365 295 385 Q 305 405 315 405\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"42\">\u003Cg>\u003Cpath d=\"M 305 355 Q 295 355 290 360 Q 285 365 275 365\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"41\">\u003Cg>\u003Crect x=\"305\" y=\"325\" width=\"140\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 305 325 M 445 325 M 445 355 L 305 355\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 138px; height: 1px; padding-top: 352px; margin-left: 306px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; overflow-wrap: normal;\">this.props.children  \u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"375\" y=\"352\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\" font-style=\"italic\">this.props.children  \u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"45\">\u003Cg>\u003Cpath d=\"M 415 210 Q 405 210 405 214.5 Q 405 219 395 219\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>
2760\u003Cg data-cell-id=\"44\">\u003Cg>\u003Crect x=\"415\" y=\"180\" width=\"110\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 415 180 M 525 180 M 525 210 L 415 210\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 108px; height: 1px; padding-top: 207px; margin-left: 416px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; overflow-wrap: normal;\">className =\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"470\" y=\"207\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\" font-style=\"italic\">className =\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"46\">\u003Cg>\u003Cpath d=\"M 195 460 Q 205 460 210 472.5 Q 215 485 225 485\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"47\">\u003Cg>\u003Crect x=\"225\" y=\"470\" width=\"60\" height=\"30\" rx=\"4.5\" ry=\"4.5\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 485px; margin-left: 226px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">events\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"255\" y=\"489\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\" font-weight=\"bold\">events\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"48\">\u003Cg>\u003Cpath d=\"M 285 485 Q 295 485 295 482.5 Q 295 480 295 477.5 Q 295 475 305 475\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"49\">\u003Cg>\u003Crect x=\"305\" y=\"460\" width=\"50\" height=\"30\" rx=\"4.5\" ry=\"4.5\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 48px; height: 1px; padding-top: 475px; margin-left: 306px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">state\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"330\" y=\"479\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\" font-weight=\"bold\">state\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"51\">\u003Cg>\u003Crect x=\"420\" y=\"100\" width=\"130\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 420 100 M 550 100 M 550 130 L 420 130\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 127px; margin-left: 421px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; overflow-wrap: normal;\">createElement()\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"485\" y=\"127\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\" font-style=\"italic\">createElement()\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"52\">\u003Cg>\u003Cpath d=\"M 390 174 Q 400 174 405 152 Q 410 130 420 130\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"54\">\u003Cg>\u003Crect x=\"0\" y=\"380\" width=\"90\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 395px; margin-left: 1px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">FRONT END\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"45\" y=\"399\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">FRONT END\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"57\">\u003Cg>\u003Cpath d=\"M 395 490 Q 385 490 335 512.5 Q 285 535 275 535\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"58\">\u003Cg>\u003Crect x=\"395\" y=\"460\" width=\"100\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 395 460 M 495 460 M 495 490 L 395 490\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 487px; margin-left: 396px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; overflow-wrap: normal;\">useState()\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"445\" y=\"487\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\" font-style=\"italic\">useState()\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"61\">\u003Cg>\u003Crect x=\"391.25\" y=\"500\" width=\"107.5\" height=\"20\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 106px; height: 1px; padding-top: 510px; margin-left: 392px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 9px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Cfont style=\"font-size: 9px;\" color=\"#3333ff\">
2760import { useState } from \"react\";\u003C/font>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"445\" y=\"513\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"9px\" text-anchor=\"middle\">import { useState } fro...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"62\">\u003Cg>\u003Crect x=\"415\" y=\"139\" width=\"145\" height=\"20\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 143px; height: 1px; padding-top: 149px; margin-left: 416px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 9px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Cfont style=\"font-size: 9px;\" color=\"#3333ff\">import { createElement } from \"react\";\u003C/font>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"488\" y=\"152\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"9px\" text-anchor=\"middle\">import { createElement } from \"r...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"63\">\u003Cg>\u003Crect x=\"207.5\" y=\"229\" width=\"105\" height=\"20\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 103px; height: 1px; padding-top: 239px; margin-left: 209px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 9px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Cfont color=\"#3333ff\">import { createRoot } from \"react-dom/client\";\u003C/font>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"260\" y=\"242\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"9px\" text-anchor=\"middle\">import { createRoot } f...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"64\">\u003Cg>\u003Crect x=\"370\" y=\"425\" width=\"185\" height=\"20\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 183px; height: 1px; padding-top: 435px; margin-left: 371px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 9px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Cfont style=\"font-size: 9px;\" color=\"#3333ff\">import { PropTypes } from \"prop-types\";\u003C/font>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"463\" y=\"438\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"9px\" text-anchor=\"middle\">import { PropTypes } from \"prop-types\";\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"65\">\u003Cg>\u003Cpath d=\"M 395 219 Q 405 219 405 228 Q 405 237 405 246 Q 405 255 415 255\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"66\">\u003Cg>\u003Crect x=\"415\" y=\"240\" width=\"120\" height=\"30\" rx=\"4.5\" ry=\"4.5\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 255px; margin-left: 416px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">vue \u003Cspan style=\"background-color: initial;\">conditionnelle\u003C/span>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"475\" y=\"259\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\" font-weight=\"bold\">vue conditionnelle\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"67\">\u003Cg>\u003Cpath d=\"M 195 460 Q 205 460 210 557.5 Q 215 655 225 655\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"68\">\u003Cg>\u003Crect x=\"225\" y=\"640\" width=\"40\" height=\"30\" rx=\"4.5\" ry=\"4.5\" fill=\"#e6e6e6\" stroke=\"#666666\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 655px; margin-left: 226px;\">\u003Cdiv data-drawio-colors=\"color: #333333; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">API\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"245\" y=\"659\" fill=\"#333333\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\" font-weight=\"bold\">API\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"69\">\u003Cg>\u003Cpath d=\"M 300 219 Q 310 219 322.5 219 Q 335 219 345 219\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"70\">\u003Cg>\u003Crect x=\"345\" y=\"204\" width=\"50\" height=\"30\" rx=\"4.5\" ry=\"4.5\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 48px; height: 1px; padding-top: 219px; margin-left: 346px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">JSX\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"370\" y=\"223\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\" font-weight=\"bold\">JSX\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"71\">\u003Cg>\u003Cpath d=\"M 195 460 Q 205 460 210 497.5 Q 215 535 225 535\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"72\">\u003Cg>\u003Crect x=\"225\" y=\"520\" width=\"50\" height=\"30\" rx=\"4.5\" ry=\"4.5\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 48px; height: 1px; padding-top: 535px; margin-left: 226px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">hook\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"250\" y=\"539\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\" font-weight=\"bold\">hook\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"73\">\u003Cg>\u003Cpath d=\"M 395 490 Q 385 490 375 482.5 Q 365 475 355 475\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"74\">\u003Cg>\u003Crect x=\"391.25\" y=\"520\" width=\"100\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 391.25 520 M 491.25 520 M 491.25 550 L 391.25 550\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 547px; margin-left: 392px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; overflow-wrap: normal;\">useEffect()\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"441\" y=\"547\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\" font-style=\"italic\">useEffect()\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"75\">\u003Cg>\u003Crect x=\"387.5\" y=\"560\" width=\"107.5\" height=\"20\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 106px; height: 1px; padding-top: 570px; margin-left: 389px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 9px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Cfont style=\"font-size: 9px;\" color=\"#3333ff\">import { useEffect } from \"react\";\u003C/font>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"441\" y=\"573\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"9px\" text-anchor=\"middle\">import { useEffect } fr...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"76\">\u003Cg>\u003Cpath d=\"M 391.25 550 Q 381.25 550 333.13 542.5 Q 285 535 275 535\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"77\">\u003Cg>\u003Crect x=\"406.25\" y=\"590\" width=\"90\" height=\"9\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 406.25 590 M 496.25 590 M 496.25 599 L 406.25 599\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 596px; margin-left: 407px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; overflow-wrap: normal;\">useRef()\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"451\" y=\"596\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\" font-style=\"italic\">useRef()\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"78\">\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 106px; height: 1px; padding-top: 620px; margin-left: 399px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 9px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Cfont style=\"font-size: 9px;\" color=\"#3333ff\">import { useRet } from \"react\";\u003C/font>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"451\" y=\"622\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"9px\" text-anchor=\"middle\">import { useRet } from...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"79\">\u003Cg>\u003Cpath d=\"M 406.25 599 Q 396.25 599 340.63 567 Q 285 535 275 535\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"80\">\u003Cg>\u003Crect x=\"535\" y=\"50\" width=\"200\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 535 50 M 735 50 M 735 80 L 535 80\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u00
27603Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 77px; margin-left: 536px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; overflow-wrap: normal;\">Link to= \"\" (ou NavLink to =\"\")\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"635\" y=\"77\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\" font-style=\"italic\">Link to= \"\" (ou NavLink to =\"\")\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"81\">\u003Cg>
2760\u003Cpath d=\"M 500 55 Q 510 55 517.5 67.5 Q 525 80 535 80\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"82\">\u003Cg>\u003Crect x=\"555\" y=\"90\" width=\"145\" height=\"20\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 143px; height: 1px; padding-top: 100px; margin-left: 556px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 9px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Cfont style=\"font-size: 9px;\" color=\"#3333ff\">import { Link, NavLink } from \"react\";\u003C/font>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"628\" y=\"103\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"9px\" text-anchor=\"middle\">import { Link, NavLink } from \"r...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"96\">\u003Cg>\u003Cpath d=\"M 430 60 Q 440 60 440 58.75 Q 440 57.5 440 56.25 Q 440 55 450 55\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"83\">\u003Cg>\u003Crect x=\"230\" y=\"30\" width=\"200\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 230 30 M 430 30 M 430 60 L 230 60\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 57px; margin-left: 231px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; overflow-wrap: normal;\">BrowserRouter, Routes, route\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"330\" y=\"57\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\" font-style=\"italic\">BrowserRouter, Routes, route\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"84\">\u003Cg>\u003Cpath d=\"M 195 135 Q 205 135 212.5 97.5 Q 220 60 230 60\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"85\">\u003Cg>\u003Crect x=\"250\" y=\"70\" width=\"105\" height=\"20\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 103px; height: 1px; padding-top: 80px; margin-left: 251px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 9px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Cfont color=\"#3333ff\">import { createRoot } from \"react-dom/client\";\u003C/font>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"303\" y=\"83\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"9px\" text-anchor=\"middle\">import { createRoot } f...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"86\">\u003Cg>\u003Crect x=\"550\" y=\"0\" width=\"120\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 550 0 M 670 0 M 670 30 L 550 30\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 27px; margin-left: 551px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; overflow-wrap: normal;\">useNavigate()\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"610\" y=\"27\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\" font-style=\"italic\">useNavigate()\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"87\">\u003Cg>\u003Crect x=\"560\" y=\"40\" width=\"107.5\" height=\"20\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 106px; height: 1px; padding-top: 50px; margin-left: 561px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 9px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Cfont style=\"font-size: 9px;\" color=\"#3333ff\">import { useRet } from \"react-router-dom\";\u003C/font>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"614\" y=\"53\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"9px\" text-anchor=\"middle\">import { useRet } from...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"88\">\u003Cg>\u003Cpath d=\"M 550 30 Q 540 30 525 42.5 Q 510 55 500 55\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"90\">\u003Cg>\u003Crect x=\"295\" y=\"579.5\" width=\"82\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 295 579.5 M 377 579.5 M 377 609.5 L 295 609.5\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 80px; height: 1px; padding-top: 607px; margin-left: 296px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; overflow-wrap: normal;\">useStore\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"336\" y=\"607\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\" font-style=\"italic\">useStore\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"91\">\u003Cg>\u003Cpath d=\"M 295 609.5 Q 285 609.5 285 572.25 Q 285 535 275 535\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"92\">\u003Cg>\u003Crect x=\"276.25\" y=\"619\" width=\"107.5\" height=\"20\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 106px; height: 1px; padding-top: 629px; margin-left: 277px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 9px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Cfont style=\"font-size: 9px;\" color=\"#3333ff\">
2760import { useStore } from \"react-admin\";\u003C/font>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"330\" y=\"632\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"9px\" text-anchor=\"middle\">import { useStore } fro...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"94\">\u003Cg>\u003Crect x=\"450\" y=\"40\" width=\"50\" height=\"30\" rx=\"4.5\" ry=\"4.5\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 48px; height: 1px; padding-top: 55px; margin-left: 451px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">hook\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"475\" y=\"59\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\" font-weight=\"bold\">hook\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003C/g>\u003C/g>\u003C/g>\u003Cswitch>\u003Cg requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\"/>\u003Ca transform=\"translate(0,-5)\" xlink:href=\"https://www.drawio.com/doc/faq/svg-export-text-problems\" target=\"_blank\">\u003Ctext text-anchor=\"middle\" font-size=\"10px\" x=\"50%\" y=\"100%\">Text is not SVG - cannot display\u003C/text>\u003C/a>\u003C/switch>\u003C/svg>","type":"application/vnd.drawio","modified":"20241002071120262","title":"$:/diagram/js/react","tags":"$:/doc/react"},
2761{"created":"20240726072342830","text":"\u003Csvg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" width=\"306px\" height=\"641px\" viewBox=\"-0.5 -0.5 306 641\" content=\"&lt;mxfile host=&quot;embed.diagrams.net&quot; agent=&quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0&quot; version=&quot;24.7.7&quot;&gt;&lt;diagram id=&quot;XZiQxhkp9WdscX2US44G&quot; name=&quot;Page-1&quot;&gt;7Vpbc5s6EP41nj5lhotx7EfbSZqHtudM05nzrMAa1ApEhfClv/6skLANyKkzJUzsc14StLrtfrva/QQe+ct0+1GQPPnMI2Ajz4m2I/9u5Hlj38O/SrDTgmDiakEsaKRFR4In+guM0DHSkkZQNAZKzpmkeVMY8iyDUDZkRAi+aQ5bcdbcNScxdARPIWFd6T80komxYuof5I9A48TsPPVudUdK6rHGkCIhEd8cifz7kb8UnEv9lG6XwBR0NSx63sOJ3r1eAjJ5zoSpnrAmrDSmGb3krrYVIjTdNLmQCY95Rtj9QboQvMwiUCs62DqM+cR5jkIXhd9Byp3xIyklR1EiU2Z6IYvmyivYzHgGWvJAGTNLdq0yhha8FKHR02AviYjBjDKoKwuOphkkPgJPQYodDhDAiKTrpnOJiZF4P+6AIz4YKO2w+hZYJwy1WuQNcCc/S+XpRYpK02zkz518u2/eSAXffFyJJGzlDWE0VqNCxAFELY0g5AL156pLeUIwWoF4WB+fYvO/0uK5FmCgZgigEaNZz+2hKMvbskQoK+pTWW/iHu9nMfKZC9TtxnTMC84UXC9o+RqsGKywcz6tZKeXLGsB5o9M0hUlGFHo6zYM5Tkw9KhfxlOVDlEFh33oaPOWO9dLFjnJ7G4j4Y+4OuI3IWccw26uIj2jkhJmXRJSQtmR+nrpVgSKgRGWwCBPVHYZZj8SCSiKoXZbY7I8sVcrna9BSIqVbK5zyV2VZBYms9zpbRYcR61YlZBXVRo+ztabhEp4ykmVeDdY31/K0Go72L6YfU2vd2tqouEEE9PcHAqsW8uSo+Lq1rX0TxJ2TSyuoRCO31EhdG2V8HpwdYO+gTVT/+a0KkzmbEz9oHE2/HbMa6XMrJZ79mqc5bHxpVCX9Wjpj+azhIYl+5/BrKEDxNAc
2761Bkf9LIcqeCmPKv9PT5W93nfMS1oUpCJmDiiqFCawJuV2MP6S4uUWOSK61cHT71TmqwdXNQdiGVJzGrzIbmlKBsM+ZETvCxmIWB98SYeLNkyvdIXLfcdygHWHgrhwrhW06olrIVszG9ma9EG2JtdDCoIhSMG5wAaXUrtDPEKqbP1XinaPl+vf8IAOsjYW8C4u5G+ATcpl/RYlJ83L97Wa3L74vws7Gy+A3iD2rQbZLL/Q6tx+E2KrzrZXIbMeivNtp4Y8zp862B2K7ykcjmCqId3XDzvyfSA3ayK3/85yjJxnQc7vg9Z0y+/X+y/fBsGukIL/gKU+RncRrEhZHYAVz+QDSSlTgDwCW4OabDoMM3I907ZMx5DvSt/AUUEN3m8dFfy5oyyfZ1BbnOZkHWcpqvNKj6Q0iiqGanNtk7X2gKQfNJF0p92Qt+WKPiLe8rLIAOleHpCd3HE7IJDd1OFcbES2gRwPCWS3fF0ykF4zSQ4JZPeXAd92uWLW0Qek1jyk+uqH8Fa0rXPF+0t9aXPwzu05n0m2s9/1Ls0j42krR1iY2dTikT7emnizsz3S9oV2wLU7Yzw7zxnB652BzcNvcvRHlcPvmvz7fwE=&lt;/diagram&gt;&lt;/mxfile&gt;\">\u003Cdefs/>\u003Cg>\u003Cg data-cell-id=\"0\">\u003Cg data-cell-id=\"1\">\u003Cg data-cell-id=\"8\">\u003Cg>\u003Cpath d=\"M 95 120 L 95 160\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"3\">\u003Cg>\u003Crect x=\"15\" y=\"0\" width=\"160\" height=\"120\" fill=\"rgb(255, 255, 255)\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 162px; height: 120px; padding-top: 0px; margin-left: 15px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: left; width: 160px; height: 120px; overflow: hidden;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; width: 100%; height: 100%; white-space: normal; overflow-wrap: normal;\">\u003Cp style=\"margin:0px;margin-top:4px;text-align:center;text-decoration:underline;\">\u003Cb>agence\u003C/b>\u003C/p>\u003Chr style=\"border-style:solid;\" size=\"1\" />\u003Cp style=\"margin:0px;margin-left:8px;\">\u003Cu>identifiant agence\u003C/u>\u003C/p>\u003Cp style=\"margin:0px;margin-left:8px;\">nom de l'agence\u003C/p>\u003Cp style=\"margin:0px;margin-left:8px;\">\u003Cspan style=\"background-color: initial;\">email\u003C/span>\u003Cbr />\u003C/p>\u003Cp style=\"margin:0px;margin-left:8px;\">telephone\u003C/p>\u003Cp style=\"margin:0px;margin-left:8px;\">adresse\u003C/p>\u003Cp style=\"margin:0px;margin-left:8px;\">ville\u003C/p>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"15\" y=\"12\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\">agence...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"10\">\u003Cg>\u003Cpath d=\"M 95 250 L 95 190\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"13\">\u003Cg>\u003Cpath d=\"M 95 410 L 95 455\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"4\">\u003Cg>\u003Crect x=\"0\" y=\"250\" width=\"190\" height=\"160\" fill=\"rgb(255, 255, 255)\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 192px; height: 160px; padding-top: 250px; margin-left: 0px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: left; width: 190px; height: 160px; overflow: hidden;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; width: 100%; height: 100%; white-space: normal; overflow-wrap: normal;\">\u003Cp style=\"margin:0px;margin-top:4px;text-align:center;text-decoration:underline;\">\u003Cb>véhicule\u003C/b>\u003C/p>\u003Chr style=\"border-style:solid;\" size=\"1\" />\u003Cp style=\"margin:0px;margin-left:8px;\">\u003Cu>identifiant vehicule\u003C/u>\u003C/p>\u003Cp style=\"margin:0px;margin-left:8px;\">marque\u003C/p>\u003Cp style=\"margin:0px;margin-left:8px;\">modèle\u003C/p>\u003Cp style=\"margin:0px;margin-left:8px;\">puissance en chevaux\u003C/p>\u003Cp style=\"margin:0px;margin-left:8px;\">temps du 0 à 100\u003C/p>\u003Cp style=\"margin:0px;margin-left:8px;\">vitesse maximale\u003C/p>\u003Cp style=\"margin:0px;margin-left:8px;\">classe energétique\u003C/p>\u003Cp style=\"margin:0px;margin-left:8px;\">tarif journalier\u003C/p>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"0\" y=\"262\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\">véhicule...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"16\">\u003Cg>\u003Cpath d=\"M 95 550 L 95 490\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"5\">\u003Cg>\u003Crect x=\"15\" y=\"550\" width=\"160\" height=\"90\" fill=\"rgb(255, 255, 255)\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 162px; height: 90px; padding-top: 550px; margin-left: 15px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: left; width: 160px; height: 90px; overflow: hidden;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; width: 100%; height: 100%; white-space: normal; overflow-wrap: normal;\">\u003Cp style=\"margin:0px;margin-top:4px;text-align:center;text-decoration:underline;\">\u003Cb>client\u003C/b>\u003C/p>\u003Chr style=\"border-style:solid;\" size=\"1\" />\u003Cp style=\"margin:0px;margin-left:8px;\">\u003Cspan style=\"background-color: initial;\">\u003Cu>identifiant client\u003C/u>\u003C/span>\u003Cbr />\u003C/p>\u003Cp style=\"margin:0px;margin-left:8px;\">\u003Cspan style=\"background-color: initial;\">mot de passe\u003C/span>\u003Cbr />\u003C/p>\u003Cp style=\"margin:0px;margin-left:8px;\">\u003Cspan style=\"background-color: initial;\">ville\u003C/span>\u003Cbr />\u003C/p>\u003Cp style=\"margin:0px;margin-left:8px;\">email\u003Cspan style=\"background-color: initial;\">\u003Cbr />\u003C/span>\u003C/p>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"15\" y=\"562\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\">client...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"7\">\u003Cg>\u003Crect x=\"35\" y=\"160\" width=\"120\" height=\"30\" rx=\"4.5\" ry=\"4.5\" fill=\"rgb(255, 255, 255)\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 167px; margin-left: 36px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">HAS\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"95\" y=\"179\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">HAS\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"15\">\u003Cg>\u003Crect x=\"35\" y=\"455\" width=\"120\" height=\"35\" rx=\"5.25\" ry=\"5.25\" fill=\"rgb(255, 255, 255)\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 462px; margin-left: 36px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">RENT\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"95\" y=\"474\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">RENT\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"23\">\u003Cg>\u003Crect x=\"95\" y=\"120\" width=\"60\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 135px; margin-left: 96px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">1, n\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"125\" y=\"139\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">1, n\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"24\">\u003Cg>\u003Crect x=\"35\" y=\"210\" width=\"60\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 225px; margin-left: 36px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">1, 1\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"65\" y=\"229\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">1, 1\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"25\">\u003Cg>\u003Crect x=\"35\" y=\"410\" width=\"60\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 425px; margin-left: 36px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">0, n\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"65\" y=\"429\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">0, n\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"27\">\u003Cg>\u003Crect x=\"37\" y=\"510\" width=\"60\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 525px; margin-left: 38px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">0, n\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"67\" y=\"529\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">0, n\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"28\">\u003Cg>\u003Crect x=\"225\" y=\"150\" width=\"80\" height=\"60\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 180px; margin-left: 226px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Type d'association : \u003Cb>One to Many\u003C/b>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"265\" y=\"184\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">Type d'associ...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"29\">\u003Cg>\u003Crect x=\"225\" y=\"430\" width=\"80\" height=\"50\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 455px; margin-left: 226px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-bo
2761x; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Type d'association \u003Cb>Many to Many\u003C/b>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"265\" y=\"459\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">Type d'associ...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003C/g>\u003C/g>\u003C/g>\u003Cswitch>\u003Cg requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\"/>\u003Ca transform=\"translate(0,-5)\" xlink:href=\"https://www.drawio.com/doc/faq/svg-export-text-problems\" target=\"_blank\">\u003Ctext text-anchor=\"middle\" font-size=\"10px\" x=\"50%\" y=\"100%\">Text is not SVG - cannot display\u003C/text>\u003C/a>\u003C/switch>\u003C/svg>","type":"application/vnd.drawio","modified":"20240826112810645","title":"$:/diagram/MCD/exemple"},
2762{"created":"20240726084132831","text":"\u003Csvg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" width=\"624px\" height=\"451px\" viewBox=\"-0.5 -0.5 624 451\" content=\"&lt;mxfile host=&quot;embed.diagrams.net&quot; agent=&quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0&quot; version=&quot;24.7.5&quot;&gt;&lt;diagram id=&quot;XZiQxhkp9WdscX2US44G&quot; name=&quot;Page-1&quot;&gt;7Vtdd5s4EP01Pn1KDhhjO492nLR7um32nDxs91GBsVErEBHCcfbXryQkG5CcOFtM4rQvCRp9je5IM1cDHgSX6eYjQ3nyhcZABkMv3gyCxWA49C8C8VcKHitBOPYrwYrhWLfZCW7xv6CFnpaWOIai0ZBTSjjOm8KIZhlEvCFDjNGHZrMlJc1Zc7QCS3AbIWJL/8YxT/QqpsFO/gnwKtEzT4eTqiJFpq1eSJGgmD7URMHVILhklPLqKd1cApHQGViqftd7ard6Mcj4IR2mVYc1IqVemtaLP5q1QiyWrouU8YSuaIbI1U46Z7TMYpAjeqK0a/MnpbkQ+kL4HTh/1HZEJadClPCU6FrI4pm0iihmNINKco0J0UPaq9ILLWjJIq2nxp4jtgLdSqMuV1DrppH4CDQFzh5FAwYEcbxuGhfpPbLattvhKB40lG5YAwesYyK0mucNcMf3pbT0PBVK42wQzLx8sy2ecQnfbKREHDb8DBG8kq0igQMwI40hokzoT2WVtAQjWIG4G188rfR/pcWdEYiNmgkAtVgs667dVMjytixhchXmVJpJ/Pp8jkXeUSZ0O9MVs4ISCdcTWr4EKwJLUTmbKtn+Icu9SAiHknG8xEhsMWH8Q3CxBnNh1eEiMppKnynU8sgHS8NjzmyGLHKUuW2Loh8r5QfOIkqo2JszeRwyzDEiziEhRZjU1K+GbhmH9YwwBwJ5Il1QP/OhmEFR9DXbWnjUPXO1fP4aGMci3M0qh7NQnmiu3c+immZORaslUV57qXx13aU/JJjDbY6Ud34QJOApNy6ng82TLlrXTnTcNLxBFx92Qdgfa1lSC8C+ibc/49QN+XgPwXL0hoKl74qWbw9X2GD+TT6fh7r0T61msakXHl9EXDzbGH7YtTV0178oVgHOnKeLsHGgRqPWQamU0r1aNt2qcRgnGp2Emf/v8QmC1zo/LlzfJNlcDy6DwewiwVFJfnNOi3Ou4SBk+madotV92RdFSWmsNsl0H1HpfMa8xEWBFJX2QJLbKIE1Kje9Mc40LySrF2b1hO/11PLlgy+LPfFCXrFQL0UbnKLesI8IquaFDNiq8g4c97fbhP/GSzHcd+HaRQzBwHq+T+GdIHjmAorbfU+TwI8n503GEfguDh86OPy0Cw4/fj8kJOyDNh4KbHgqJCQSx1yesF+FfXSYsrEITdNlWci6mMqbSPMcAZuUcpOby1EzpfNel9xOJ72JdTbSikfY+84FuVZ+muE59Iat+ByGh6XYLjqIzhMriHya3Vrg7aLvPiBqOBlMtwHEDX0H0BkANG5DF68ZOoALuqA1dvj9Mvt81Qt0BWf0B1xWx2gRwxKV6gAsacavUYqJBOQTkDXIzrpCMyN/qMuO7mLL29Iutrh5O/diQ4U/byjHm0GhrejmZZaxJNV5oUVSHMeKobpM22StHSCpbqg1JP2JjaTLVXSx4x1ZLw2kf/pADqc9Amm7jtMFcvsFhgHyokcg7ejlnezRDqeto+1403YsIM0Yb/8uyaqUVQFsXY3wy9wqD81pqwsRg0MR6ju3LRN/RssY7spnVO5LlSXOXk+RGHEwsxMk7/UM9Pw1Yf96mSH350wdL1CeyZq+gpJWluS1VHzuan4qV9bRpJVQHtmhantB6vyjkMDfG6wS/wmj6fAkWnjP2Elej5wDyYqzKnrIcfzxnoG+Ul4/EtV4luWlttaeqwQLlMlXVBFw5RlgA2kuT5mnfEKmcl7CgHFRJb8G5kUaTXPVQbVdIiyXcV9+KGVl612wl4Nyvko640x1o2XVSDqeSoVSTWbejXjAlSfK1MuzZpNSjHEuFoBSuc2yuyI/dKPb3My1cWs7PRHMTCz4CCxsS7HM1xmOm+rUwcK62dnv6FVJ4Pg42NDMV/g62E4C/HEryvObm89XouTdfLWQ/p25kbe5lqefOnKTx0qxBe/perf1JAbJse1Zjna9s39zcLoJh5Ef9gWkKO5+F1J9f7f7bU1w9R8=&lt;/diagram&gt;&lt;/mxfile&gt;\">\u003Cdefs/>\u003Cg>\u003Cg data-cell-id=\"0\">\u003Cg data-cell-id=\"1\">\u003Cg data-cell-id=\"8\">\u003Cg>\u003Cpath d=\"M 83 130 L 83 170\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"3\">\u003Cg>\u003Crect x=\"3\" y=\"10\" width=\"160\" height=\"120\" fill=\"rgb(255, 255, 255)\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 162px; height: 120px; padding-top: 10px; margin-left: 3px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: left; width: 160px; height: 120px; overflow: hidden;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; width: 100%; height: 100%; white-space: normal; overflow-wrap: normal;\">\u003Cp style=\"margin:0px;margin-top:4px;text-align:center;text-decoration:underline;\">\u003Cb>agence\u003C/b>\u003C/p>\u003Chr style=\"border-style:solid;\" size=\"1\" />\u003Cp style=\"margin:0px;margin-left:8px;\">\u003Cu>\u003Cb>identifiant agence\u003C/b>\u003C/u>\u003C/p>\u003Cp style=\"margin:0px;margin-left:8px;\">nom de l'agence\u003C/p>\u003Cp style=\"margin:0px;margin-left:8px;\">\u003Cspan style=\"background-color: initial;\">email\u003C/span>\u003Cbr />\u003C/p>\u003Cp style=\"margin:0px;margin-left:8px;\">telephone\u003C/p>\u003Cp style=\"margin:0px;margin-left:8px;\">adresse\u003C/p>\u003Cp style=\"margin:0px;margin-left:8px;\">ville\u003C/p>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"3\" y=\"22\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\">agence...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"10\">\u003Cg>\u003Cpath d=\"M 83 270 L 83 200\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"13\">\u003Cg>\u003Cpath d=\"M 515.5 300 L 515.5 252.5 L 516 205\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"34\">\u003Cg>\u003Cpath d=\"M 165.5 360 L 228 360\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"4\">\u003Cg>\u003Crect x=\"0.5\" y=\"270\" width=\"165\" height=\"180\" fill=\"rgb(255, 255, 255)\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 167px; height: 180px; padding-top: 270px; margin-left: 1px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: left; width: 165px; height: 180px; overflow: hidden;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; width: 100%; height: 100%; white-space: normal; overflow-wrap: normal;\">\u003Cp style=\"margin:0px;margin-top:4px;text-align:center;text-decoration:underline;\">\u003Cb>véhicule\u003C/b>\u003C/p>\u003Chr style=\"border-style:solid;\" size=\"1\" />\u003Cp style=\"margin:0px;margin-left:8px;\">\u003Cu>\u003Cb>identifiant vehicule\u003C/b>\u003C/u>\u003C/p>\u003Cp style=\"margin:0px;margin-left:8px;\">marque\u003C/p>\u003Cp style=\"margin:0px;margin-left:8px;\">modèle\u003C/p>\u003Cp style=\"margin:0px;margin-left:8px;\">puissance en chevaux\u003C/p>\u003Cp style=\"margin:0px;margin-left:8px;\">temps du 0 à 100\u003C/p>\u003Cp style=\"margin:0px;margin-left:8px;\">vitesse maximale\u003C/p>\u003Cp style=\"margin:0px;margin-left:8px;\">classe energétique\u003C/p>\u003Cp style=\"margin:0px;margin-left:8px;\">tarif journalier\u003C/p>\u003Cp style=\"margin:0px;margin-left:8px;\">\u003Ci>#identifiant agence\u003C/i>\u003C/p>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"1\" y=\"282\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\">véhicule...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"16\">\u003Cg>\u003Cpath d=\"M 515.5 105 L 515.5 137.5 L 516 170\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"5\">\u003Cg>\u003Crect x=\"435.5\" y=\"15\" width=\"160\" height=\"90\" fill=\"rgb(255, 255, 255)\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 162px; height: 90px; padding-top: 15px; margin-left: 436px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: left; width: 160px; height: 90px; overflow: hidden;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; width: 100%; height: 100%; white-space: normal; overflow-wrap: normal;\">\u003Cp style=\"margin:0px;margin-top:4px;text-align:center;text-decoration:underline;\">\u003Cb>client\u003C/b>\u003C/p>\u003Chr style=\"border-style:solid;\" size=\"1\" />\u003Cp style=\"margin:0px;margin-left:8px;\">\u003Cspan style=\"background-color: initial;\">\u003Cu>identifiant client\u003C/u>\u003C/span>\u003Cbr />\u003C/p>\u003Cp style=\"margin:0px;margin-left:8px;\">\u003Cspan style=\"background-color: initial;\">mot de passe\u003C/span>\u003Cbr />\u003C/p>\u003Cp style=\"margin:0px;margin-left:8px;\">\u003Cspan style=\"background-color: initial;\">ville\u003C/span>\u003Cbr />\u003C/p>\u003Cp style=\"margin:0px;margin-left:8px;\">email\u003Cspan style=\"background-color: initial;\">\u003Cbr />\u003C/span>\u003C/p>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"436\" y=\"27\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\">client...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"7\">\u003Cg>\u003Crect x=\"23\" y=\"170\" width=\"120\" height=\"30\" rx=\"4.5\" ry=\"4.5\" fill=\"rgb(255, 255, 255)\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 177px; margin-left: 24px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">HAS\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"83\" y=\"189\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">HAS\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"15\">\u003Cg>\u003Crect x=\"456\" y=\"170\" width=\"120\" height=\"35\" rx=\"5.25\" ry=\"5.25\" fill=\"rgb(255, 255, 255)\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 177px; margin-left: 457px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">MAKE\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"516\" y=\"189\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">MAKE\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"23\">\u003Cg>\u003Crect x=\"33\" y=\"130\" width=\"60\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 145px; margin-left: 34px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">1, n\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"63\" y=\"149\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">1, n\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"24\">\u003Cg>\u003Crect x=\"33\" y=\"240\" width=\"60\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 255px; margin-left: 34px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">1, 1\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"63\" y=\"259\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">1, 1\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"25\">\u003Cg>\u003Crect x=\"516\" y=\"250\" width=\"60\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 265px; margin-left: 517px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">1, 1\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\
2762"546\" y=\"269\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">1, 1\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"27\">\u003Cg>\u003Crect x=\"513\" y=\"110\" width=\"60\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 125px; margin-left: 514px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">0, n\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"543\" y=\"129\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">0, n\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"30\">\u003Cg>\u003Crect x=\"408\" y=\"300\" width=\"215\" height=\"120\" fill=\"rgb(255, 255, 255)\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 217px; height: 120px; padding-top: 300px; margin-left: 408px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: left; width: 215px; height: 120px; overflow: hidden;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; width: 100%; height: 100%; white-space: normal; overflow-wrap: normal;\">\u003Cp style=\"margin:0px;margin-top:4px;text-align:center;text-decoration:underline;\">\u003Cb>réservation\u003C/b>\u003C/p>\u003Chr style=\"border-style:solid;\" size=\"1\" />\u003Cp style=\"margin:0px;margin-left:8px;\">\u003Cu>\u003Cb>identifiant de reservation\u003C/b>\u003C/u>\u003C/p>\u003Cp style=\"margin:0px;margin-left:8px;\">jour de debut de reservation\u003C/p>\u003Cp style=\"margin:0px;margin-left:8px;\">jour de fin de reservation\u003C/p>\u003Cp style=\"margin:0px;margin-left:8px;\">date de la creation de la reservation\u003C/p>\u003Cp style=\"margin:0px;margin-left:8px;\">\u003Ci>#identifiant vehicule\u003C/i>\u003C/p>\u003Cp style=\"margin:0px;margin-left:8px;\">\u003Ci>#identifiant client\u003C/i>\u003C/p>\u003Cp style=\"margin:0px;margin-left:8px;\">\u003Cbr />\u003C/p>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"408\" y=\"312\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\">réservation...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"31\">\u003Cg>\u003Crect x=\"193\" y=\"0\" width=\"180\" height=\"120\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 178px; height: 1px; padding-top: 7px; margin-left: 195px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: left; max-height: 116px; overflow: hidden;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Ch1 style=\"margin-top: 0px;\">\u003Cfont style=\"font-size: 16px;\">Note\u003C/font>\u003C/h1>\u003Cp>Dans cette exemple on ne prends pas en compte le fait qu'un véhicule peut être loué dans une agence et rendu dans une autre. \u003C/p>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"195\" y=\"19\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\">Note...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"36\">\u003Cg>\u003Cpath d=\"M 348 360 L 408 360\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"33\">\u003Cg>\u003Crect x=\"228\" y=\"345\" width=\"120\" height=\"30\" rx=\"4.5\" ry=\"4.5\" fill=\"rgb(255, 255, 255)\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 352px; margin-left: 229px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">IS BOOKED ON\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"288\" y=\"364\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">IS BOOKED ON\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"37\">\u003Cg>\u003Crect x=\"173\" y=\"320\" width=\"60\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 335px; margin-left: 174px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">0, n\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"203\" y=\"339\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">0, n\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"38\">\u003Cg>\u003Crect x=\"348\" y=\"320\" width=\"60\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 335px; margin-left: 349px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">1, 1\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"378\" y=\"339\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">1, 1\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003C/g>\u003C/g>\u003C/g>\u003Cswitch>\u003Cg requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\"/>\u003Ca transform=\"translate(0,-5)\" xlink:href=\"https://www.drawio.com/doc/faq/svg-export-text-problems\" target=\"_blank\">\u003Ctext text-anchor=\"middle\" font-size=\"10px\" x=\"50%\" y=\"100%\">Text is not SVG - cannot display\u003C/text>\u003C/a>\u003C/switch>\u003C/svg>","type":"application/vnd.drawio","modified":"20240726124838795","title":"$:/diagram/MLD/exemple","tags":""},
2763{"created":"20240726091454727","text":"\n```\n\"agence\" (\n  \"id_agence\" INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, \n  \"nom_agence\" TEXT NOT NULL,\n  \"email\" TEXT NOT NULL, \n  \"telephone\" TEXT NOT NULL, \n  \"adresse\" TEXT NOT NULL,\n  \"ville\" TEXT UNIQUE NOT NULL,\n  \"created_at\" TIMESTAMPTZ NOT NULL DEFAULT NOW(),\n  \"updated_at\" TIMESTAMPTZ NOT NULL DEFAULT NOW()\n)\n\n```\n\n```\n\"vehicule\" (\n  \"id_vehicule\" INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, \n  \"marque\" TEXT NOT NULL,\n  \"modele\" TEXT NOT NULL, \n  \"puissance\" INTEGER NOT NULL, \n  \"temps\" INTEGER NOT NULL, \n  \"vitesse\" INTEGER NOT NULL,\n  \"classe_energetique\" TEXT NOT NULL,\n  \"tarif_journalier\" INTEGER NOT NULL,\n  \"ville\" TEXT NOT NULL ,\n  \"id_agence\" INTEGER REFERENCES \"agence\"(\"id_agence\") NOT NULL ,\n  \"created_at\" TIMESTAMPTZ NOT NULL DEFAULT NOW(),\n  \"updated_at\" TIMESTAMPTZ NOT NULL DEFAULT NOW()\n)\n\n```\n\n\n\n\n```\n\"client\" 
2763(\n  \"id_client\" INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, \n  \"email\" TEXT NOT NULL,\n  \"ville\" TEXT NOT NULL,\n  \"password\" TEXT NOT NULL,\n  \"created_at\" TIMESTAMPTZ NOT NULL DEFAULT NOW(),\n  \"updated_at\" TIMESTAMPTZ NOT NULL DEFAULT NOW()\n)\n\n```\n\n```\n\"reservation\" (\n  \"id_reservation\" INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, \n  \"jour_debut\" TIMESTAMPTZ NOT NULL,\n  \"jour_fin\" TEXT NOT NULL, \n  \"id_vehicule\" INTEGER REFERENCES \"vehicule\"(\"id_vehicule\") NOT NULL ,\n  \"id_client\" INTEGER REFERENCES \"client\" (\"id_client\") NOT NULL ,\n  \"created_at\" TIMESTAMPTZ NOT NULL DEFAULT NOW(),\n  \"updated_at\" TIMESTAMPTZ NOT NULL DEFAULT NOW()\n)\n\n```","tags":"","title":"$:/diagram/MPD/exemple","modified":"20240726130844999","type":"text/markdown"},
2764{"created":"20240608154632992","text":"\u003Csvg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" width=\"841px\" height=\"501px\" viewBox=\"-0.5 -0.5 841 501\" content=\"&lt;mxfile host=&quot;embed.diagrams.net&quot; modified=&quot;2024-06-08T16:38:49.407Z&quot; agent=&quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0&quot; etag=&quot;Xc9RrvJ9j_PzeWcHCIzS&quot; version=&quot;24.5.2&quot; type=&quot;embed&quot;&gt;&lt;diagram id=&quot;_9pWgBCAn1OXH3kXGugu&quot; name=&quot;Page-1&quot;&gt;7Z3bcts2EEC/RtP2IRleJevRlu2kM83EY6fT9hEWYQkJRSggaMv9+u6SAG+galsROIkD1anIJQCSwGIPgV1Qk3Cx2b0TZLv+wBOaTgIv2U3C80kQzGYx/B8Fj5UgnvqVYCVYUolaghv2L1VCT0kLltC8k1Bynkq27QqXPMvoUnZkRAj+0E12x9PuWbdkRQ3BzZKkpvQvlsi1uouTsJG/p2y1Vmc+CWbVgQ3RadWN5GuS8IeWKLyYhAvBuay2NrsFTbHqdLVU+S73HK2vS9BMDmT4M6fi4+1nrJLAS8kttEqZ6HqyCCen87vqCzIv6QZLCKYpFHOWsHvYXOHmzcVHLYVSWweqM6cs+1IVOQnCvaUGrUsO6ruu7yaXj7qiJd1h4Wu5wSv1YZOkbJXB9hJKogIE91RIBk1zqg5sWJJg9rOHNZP0ZkuWWNYD6CHIBC+yhCaqrDuWpgueclGeLLyL8T+U80y25NUH5LkU/AttHZmWH5XjRl22r/crtfXx+EqQhNGm1IxntK60dnOpFsSboruWSNXQO8o3VIpHSKKOvvE9pUuqL4V6/6HRTH+qZOuWVmoZUZ1hVZfdKAxsqGbRuy0VGtZB1QfuSVqoRnz/6cMfILmp9GBDMsm+wrGqAzRtPdRerYaHrrLFI1BbkpH0Gq6AZKuypSWHtOcebKX0TqrNWy4l36jMQt02HthylsnynuMz+INaWPiTGK5gAXu+3oO/roKoJntS//R5Udcky1aLMuE/ePK3qFx5Rraf+BVehL44uixEzu7pNc0rncHLJIXkahcTSUHpJdgpKLEl+cDvG0FGHy4SsFO6SmegX9OvBdqSM1ofqEWT8LR1HBpFPl7TlEjGs4uB1FA99U4uoRFO0ZDuKa6srOG8NEsOzJnTlbJKTUYkQisJVOQ9dO9Oim4ZvBBLekUFA12nAtUNK7CdoVsi3OmKyicyzM4HbIBhLS4vp9OzsGcdouOYAT/oWoGTZxqB8OVGwOjxkdHjjb5NW3q5T9U6alX3t1pdaolWA6g8r2lyVefDzVv1qD1NWR1syIB7dMfk36pM3G66L+6d71rJzh+17UGennGRULGv0VtyOvWj+bzORpZfVuUldLKGYZlkvybt1ZyqIlqIhSek8vY7Rhqb5X+1S5StdN997BnSFZW1Mmu1Vk67SunPetqmmqvK1FO4+iqepYOxoYPQzndcAG2W8KToWONY41hjiTV+PACb0BJspg42nhUkxOMgwRiu9JXieEyYG6qygM5As8LhwOHA4cAWDmoz38LB3BIN9ISgw8GxcTAfCQd+V3kizxoOfN/QlXOeZdWsFI4RQGlEsZSFaETG/Cd8kw3iIbvN8SsBi+G943xVGqy986I/LGuqMznSONJ8h6QZnOqOB1ATHwM1gUONHdRow2ybNfMeak7socacEs3B6m/I9u0OLP2PjQQ3/HBQGIBCy9QbJgI/l5cGPiwQYTZAhMDW4MOcdP7hibC/6Q5hxcFEiMYhQtwjQmSPCDNDVwQHg5m/lTvpgOCA4IBgBQjRwGRUPQV9dCCcvD4gHGWIUDf3wUCYjQOEWe9xoj9wPCIQTO/Exy3NcDYJQyYdEhwSHBLsIGE+4hhBl+uQcHQkjOShOOkhoR82ezwkDATSvWdUELFcM3QzJKWTAvRDuIgmx4dXxoeBaWUV/XgEBIS9oJOhgKUhv8FRCPAzzBI93Vhtax6a1jwYacan7wTw7U35DISqLdakXPmAC5OqQCQvIRla9QL7rXcL9jHHjdytlXDW3ln7Q6192O3jA27i+rHu6ObenOj94c390AO/3n62k/hbATF9dYAIzef9a7JlCZOV9S8f+REWa6iHZuWkw4DDgMPA0xjY25PHWBMXvsKn/tExEJsYCMcaJ/SWrgX24lJDc5zwe5ZUj/0eKXZ4M6WruJ4C2nBJwfxpPoAxXFMB/2A7LRPgCwjwu+SIh2UzjD8Sk1706sQMcP31ToW/wvmzJRZJZXmilZKXp/2FbbZcSFxc99u+Ql9VHKxjl2NXl13HGKjoCKK+u7FFqHBooNJ/Jj2IUG6gMkQoDz7P90voQKUOosYaqfSjlywiygxswKV0gqfIFI/c0yWyBxWUF+UEFse5rRVe7abChhRs5xjgGPCqGDDu+GXgnR41CY4+fjHDUxwdjjF+ORkHDmE02vhFn6n97g3SDE4q879VFGCoHo4DjgOOA4dyYGh9tbXXbUTmolnHgZdyYG5yQBvNsQcJtTJZ4IDpzvgjefOZ5GjwtZ87JZOWm7ueOionjNaUJLXETRo5UDhQfNN0UjCwGK5+Y8bRQfEKHR7faPb1uuaO3R/JfxH2Hxrsha1Gpv/iSvsKoHpI9cTvbdMCAfCZp1Uwq+JB6afQyQtInZv+BK/zlg2HBIcEh4QDPQy+iYTQGhKch8ESREbyMES9sOnA3vtbI9PDcI2tUKICfQnov9Z+BQL2tXKAP+3O3hCWN7gpHdrLcnaqhBKrHe1pFWlFNyzTp7xjuPBCNLnbK7adj9ux6edj09Pe0RewqRdiEw6sy7Pm/Y6cf+Ow9n3K+x2N5OCIei8ODOy9zUlPobUntlhehlPti7cqubUtObM39MqxwrHCseKZrAi645hIz6mPMbUVOx/IUPu+bAW3foNH55XjIzlBov4biu05QeLA0JUraHP8PTGoj0LokUY9QUbKAU0VQJXQHP6Wgm2dl9wRwhHiW0YTcWCOJgJbqz1i80fPHCFePJoYcJNrc2rdTd57y0dkkRCmm/yKFrKZjKoZ0Z2Nci+QdWRwZDhoOXhv7DAdIIOtt3/Er9At/n2MHUZypEe9QNraW2aBDKYjvfaST54TLNUaR0x0lFVu5IQrIv2cjieOJ44nz+RJtOdZcZSRhvOpWxppjLVqb2ZrpAG7zQ/HV8nxTbIfeII/837xHw==&lt;/diagram&gt;&lt;/mxfile&gt;\">\u003Cdefs/>\u003Cg>\u003Ca xlink:href=\"#Référencement\">\u003Cg>\u003Crect x=\"0\" y=\"250\" width=\"160\" height=\"60\" rx=\"9\" ry=\"9\" fill=\"#f5f5f5\" stroke=\"#666666\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 280px; margin-left: 1px;\">\u003Cdiv data-drawio-colors=\"color: #333333; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 16px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">Référencement\u003Cdiv>SEO\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"80\" y=\"285\" fill=\"#333333\" font-family=\"Helvetica\" font-size=\"16px\" text-anchor=\"middle\" font-weight=\"bold\">Référencement...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/a>\u003Cg>\u003Crect x=\"220\" y=\"30\" width=\"160\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 220 30 M 380 30 M 380 60 L 220 60\" fill=\"none\" stroke=\"#ff66b3\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 57px; margin-left: 221px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">HTML Sémantique\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"300\" y=\"57\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\">HTML Sémantique\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 160 280 Q 170 280 190 170 Q 210 60 220 60\" fill=\"none\" stroke=\"#ff66b3\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"220\" y=\"100\" width=\"130\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 220 100 M 350 100 M 350 130 L 220 130\" fill=\"none\" stroke=\"#ff66b3\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 127px; margin-left: 221px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">Performances\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"285\" y=\"127\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\">Performances\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 160 280 Q 170 280 190 205 Q 210 130 220 130\" fill=\"none\" stroke=\"#ff66b3\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"220\" y=\"180\" width=\"90\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 220 180 M 310 180 M 310 210 L 220 210\" fill=\"none\" stroke=\"#ff66b3\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 207px; margin-left: 221px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">Contenu\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"265\" y=\"207\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\">Contenu\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 160 280 Q 170 280 190 245 Q 210 210 220 210\" fill=\"none\" stroke=\"#ff66b3\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"220\" y=\"250\" width=\"150\" height=\"50\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 220 250 M 370 250 M 370 300 L 220 300\" fill=\"none\" stroke=\"#ff66b3\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe flex-start; width: 148px; height: 1px; padding-top: 297px; margin-left: 222px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: left;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">Données structurées\u003Cdiv> de Google\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"222\" y=\"297\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" font-weight=\"bold\">Données structurées...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 160 280 Q 170 280 190 290 Q 210 300 220 300\" fill=\"none\" stroke=\"#ff66b3\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"220\" y=\"320\" width=\"120\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 220 320 M 340 320 M 340 350 L 220 350\" fill=\"none\" stroke=\"#3333ff\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 347px; margin-left: 221px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">sitemap.xml\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"280\" y=\"347\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\">sitemap.xml\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 160 280 Q 170 280 190 315 Q 210 350 220 350\" fill=\"none\" stroke=\"#3333ff\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"220\" y=\"380\" width=\"100\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 220 380 M 320 380 M 320 410 L 220 410\" fill=\"none\" stroke=\"#3333ff\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 407px; margin-left: 221px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">robots.txt\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"270\" y=\"407\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\">robots.txt\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 160 280 Q 170 280 190 345 Q 210 410 220 410\" fill=\"none\" stroke=\"#3333ff\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"220\" y=\"440\" width=\"120\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 220 440 M 340 440 M 340 470 L 220 470\" fill=\"none\" stroke=\"#3333ff\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 467px; margin-left: 221px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">Open Graph\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"280\" y=\"467\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\">Open Graph\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 160 280 Q 170 280 190 375 Q 210 470 220 470\" fill=\"none\" stroke=\"#3333ff\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"400\" y=\"0\" width=\"150\" height=\"30\" fill=\"none\" stroke=
2764\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 400 0 M 550 0 M 550 30 L 400 30\" fill=\"none\" stroke=\"#ff3399\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 148px; height: 1px; padding-top: 27px; margin-left: 401px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Hierarchie des titres\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"475\" y=\"27\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">Hierarchie des titres\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 380 60 Q 390 60 390 52.5 Q 390 45 390 37.5 Q 390 30 400 30\" fill=\"none\" stroke=\"#ff3399\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"403\" y=\"50\" width=\"280\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 403 50 M 683 50 M 683 80 L 403 80\" fill=\"none\" stroke=\"#ff3399\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 278px; height: 1px; padding-top: 77px; margin-left: 404px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Chaque contenu dans une balise sémantique\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"543\" y=\"77\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">Chaque contenu dans une balise sémantique\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 380 60 Q 390 60 391.5 70 Q 393 80 403 80\" fill=\"none\" stroke=\"#ff3399\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"390\" y=\"90\" width=\"160\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 390 90 M 550 90 M 550 120 L 390 120\" fill=\"none\" stroke=\"#ff3399\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 117px; margin-left: 391px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Rapidité de chargment\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"470\" y=\"117\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">Rapidité de chargment\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 350 130 Q 360 130 370 125 Q 380 120 390 120\" fill=\"none\" stroke=\"#ff3399\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"415\" y=\"300\" width=\"380\" height=\"40\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 415 300 M 795 300 M 795 340 L 415 340\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 378px; height: 1px; padding-top: 337px; margin-left: 416px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Indique aux robots des moteurs de recherche les pages à visiter \u003Cdiv>(fréquence et degrés d'importance) \u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"605\" y=\"337\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">Indique aux robots des moteurs de recherche les pages à visiter...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 340 350 Q 350 350 377.5 345 Q 405 340 415 340\" fill=\"none\" stroke=\"#0000ff\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"390\" y=\"130\" width=\"240\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 390 130 M 630 130 M 630 160 L 390 160\" fill=\"none\" stroke=\"#ff3399\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 238px; height: 1px; padding-top: 157px; margin-left: 391px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Controler avec lightouse ou gt métrix\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"510\" y=\"157\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">Controler avec lightouse ou gt métrix\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 350 130 Q 360 130 370 145 Q 380 160 390 160\" fill=\"none\" stroke=\"#ff3399\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"390\" y=\"180\" width=\"130\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 390 180 M 520 180 M 520 210 L 390 210\" fill=\"none\" stroke=\"#ff3399\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 207px; margin-left: 391px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Pas de répétition\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"455\" y=\"207\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">Pas de répétition\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 310 210 Q 320 210 350 210 Q 380 210 390 210\" fill=\"none\" stroke=\"#ff3399\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"415\" y=\"220\" width=\"210\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 415 220 M 625 220 M 625 250 L 415 250\" fill=\"none\" stroke=\"#ff3399\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 208px; height: 1px; padding-top: 247px; margin-left: 416px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Ld-jason dans la balise &lt;head&gt;\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"520\" y=\"247\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">Ld-jason dans la balise &lt;head&gt;\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 370 300 Q 380 300 392.5 275 Q 405 250 415 250\" fill=\"none\" stroke=\"#ff3399\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"415\" y=\"260\" width=\"310\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 415 260 M 725 260 M 725 290 L 415 290\" fill=\"none\" stroke=\"#ff3399\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 308px; height: 1px; padding-top: 287px; margin-left: 416px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Présentation plus jolie dans les résutats  de Google\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"570\" y=\"287\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">Présentation plus jolie dans les résutats  de Google\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 370 300 Q 380 300 392.5 295 Q 405 290 415 290\" fill=\"none\" stroke=\"#ff3399\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"460\" y=\"340\" width=\"380\" height=\"40\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 460 340 M 840 340 M 840 380 L 460 380\" fill=\"none\" stroke=\"#0000ff\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 378px; height: 1px; padding-top: 377px; margin-left: 461px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Racine du site ou ailleurs \u003Cdiv>(mais dans ce cas on indique le chemin du fichier dans robots.txt\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"650\" y=\"377\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">Racine du site ou ailleurs...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 340 350 Q 350 350 400 365 Q 450 380 460 380\" fill=\"none\" stroke=\"#0000ff\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"425\" y=\"379\" width=\"210\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 425 379 M 635 379 M 635 409 L 425 409\" fill=\"none\" stroke=\"#0000ff\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 208px; height: 1px; padding-top: 406px; margin-left: 426px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Lister les pages à ne pas visiter \u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"530\" y=\"406\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">Lister les pages à ne pas visiter \u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 320 410 Q 330 410 372.5 409.5 Q 415 409 425 409\" fill=\"none\" stroke=\"#3333ff\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"460\" y=\"470\" width=\"260\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 460 470 M 720 470 M 720 500 L 460 500\" fill=\"none\" stroke=\"#0000ff\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 258px; height: 1px; padding-top: 497px; margin-left: 461px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Partage sur l
2764e réseau avec desdescription\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"590\" y=\"497\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">Partage sur le réseau avec desdescription\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 340 470 Q 350 470 400 485 Q 450 500 460 500\" fill=\"none\" stroke=\"#0000ff\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"405\" y=\"410\" width=\"250\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 405 410 M 655 410 M 655 440 L 405 440\" fill=\"none\" stroke=\"#0000ff\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 248px; height: 1px; padding-top: 437px; margin-left: 406px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Peut indiquer le chemin du sitemap.xml\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"530\" y=\"437\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">Peut indiquer le chemin du sitemap.xml\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 320 410 Q 330 410 362.5 425 Q 395 440 405 440\" fill=\"none\" stroke=\"#3333ff\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003Cg>\u003Crect x=\"440\" y=\"440\" width=\"260\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 440 440 M 700 440 M 700 470 L 440 470\" fill=\"none\" stroke=\"#0000ff\" stroke-linecap=\"square\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 258px; height: 1px; padding-top: 467px; margin-left: 441px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">dans le &lt;head&gt; avec des balises &lt;meta&gt;\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"570\" y=\"467\" fill=\"rgb(0, 0, 0)\" font-family=\"Helvetica\" font-size=\"12px\" text-anchor=\"middle\">dans le &lt;head&gt; avec des balises &lt;meta&gt;\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003Cg>\u003Cpath d=\"M 340 470 Q 350 470 390 470 Q 430 470 440 470\" fill=\"none\" stroke=\"#0000ff\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003C/g>\u003C/g>\u003Cswitch>\u003Cg requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\"/>\u003Ca transform=\"translate(0,-5)\" xlink:href=\"https://www.drawio.com/doc/faq/svg-export-text-problems\" target=\"_blank\">\u003Ctext text-anchor=\"middle\" font-size=\"10px\" x=\"50%\" y=\"100%\">Text is not SVG - cannot display\u003C/text>\u003C/a>\u003C/switch>\u003C/svg>","type":"application/vnd.drawio","modified":"20240608163900685","title":"$:/diagram/referencement"},
2765{"created":"20241016194625873","text":"\u003Csvg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" width=\"801px\" height=\"835px\" viewBox=\"-0.5 -0.5 801 835\" content=\"&lt;mxfile host=&quot;embed.diagrams.net&quot; agent=&quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0&quot; version=&quot;24.7.17&quot;&gt;&lt;diagram id=&quot;qb3vEkxvtpR8gddyqw-_&quot; name=&quot;Page-1&quot;&gt;7Vtbb+MqEP41kc55aGTA18ck7V6krrTaVtrHlWOTBNU2Xoyb7Pn1B/AltqFNsnXSarep1NgDBvN9w8wAkwlapLuPLMw3X2iMkwm04t0EXU8gBAEU/6XgVy3wkFVJ1ozEtWwvuCP/4VrYVCtJjIteRU5pwkneF0Y0y3DEe7KQMbrtV1vRpN9rHq6xJriLwkSXficx31RSH3p7+SdM1pumZ+AGVUkaNpXrkRSbMKbbjgjdTNCCUcqrq3S3wIkEr8Gleu7DE6XtizGc8WMe8Or3eAyTsh5c/WL8VzPagjP60A4UTNC8fWtL3MRhsc
2765FxfRMmZJ2J60j0j5kQbHia7J/KZZPpbi3VYprS6KHMp4IkHpIMs2K6lNRg9p1kqvk5q6mXLVdvsaAJZeq1kKs+/RJYFVmWH61W/SJUFUW2/BNFqejzHu8qlBayMxyVrCCP+Bsu9t3qgNYYP2LG8a4jqgH+iGmKOfslqtSl0Jo61TO1vl+5qJFsO+pj1VxsOqrjo7ZqWCvtuu1gz6u4qKl9gmag0fxV6ji0wCvSHWbRRrI5XwlZTTXw6nsT0013CV4JfObbDeH4Lg8j+eBWdGLkq1XxowlzrR5dAGpcAWDgCrojEAU1ojacS7M2k23AD9vtdhqzcDsl9C0w152hv8niGIwB1KesYbBDGXTORJnjHjahjJZZ3GJv0tsO/CuSJB3cMIgd7GkWMKOZeHwuMSLCM81qUDkdaxagYGC2PAgMZsuzW/PWRdYdwWr5SEN2VnJcMl3za40VNpyH2VqKzXB1sa1FCckeGkdwUIkt8VGeRdWrX8Du86dNrVE03Lf7ZNi6igOjivsjEKFbpa9JmMkQrpRECHX+CymBwWtSYmuUfM6KiJGcE5r9hWzYEPXZQMEF2fA0Nq40DrjC8FkghtY8JXGsuDK5jL5TuZRGI6O5b/zvi0D0/wgQdUX0LwiiHbylaKSFfmg1dKBPXla5B0M+x7Si8ryXg+zo/vAPBdnxDgfWMDgPykBH+VkXd97Vz7LknGZF/f3shsTAJa7UZ7DlgOZVQ42LVOoy4NAeuFGDpsxnAZpdH70WPp3/oM9/4+i6+xbQ4FNHiP6Bo9G/kPt5u3fyL0S+23jkhnz3cuTri+pqw+qdd4gW1zM4vzkf7+DwpPfQmXjXA+l33i/FO/TcV+Ndj/3feb8U78h1Xo13fbnyzvuleLed4cnUBZl3jjh5fP1t85euSpGlL5jaXZXe2t8ZYfHvGI752GSBJrOgEEMKq3VTtWmbMxqXhF8Q8zEiEwR68AIXaPA6vkFjQbNIfRG8+nmEBl+jWLfhEidfaUEU5uh6SYVBSH/bbpn11WgVTfZN3ZComBYkzRP8OTIbuUB9zjIRgGEr0TgRgDvGRNB3x9+Zeoopf3DMZyDKMKOcMSaUvsS/J5zJvIRY/kvCSZ2MA61/1M3PEheSp3/F9QR90Eg97/Zwx38jNFLMbYEp7BMAfN2o2Y4/9QxbxmOYNVf3xLd0racXXAxb6I+k2EE/uNEPrxv30YN0hK1LV1/OjOpo28jwZRvE/fhzhIXEYLe4PdHonsGZNuXHOPlw9aXEBLqJVNmluFjLi/twXTRC0V4rv7CujwF1MIzdTWC7Z8LaOyISOpxFlIZsTbJvKkNTpt/xL0pwLz3mNdgn/XXdZs8P71FVDLGoVm5n8lQ6X4fQc22eWWBADDIRg3zTCWDrfF9Ejh783NFS6L3FpXMtnmSKVUwczAvQDdDJDMHG5JuW0kMzVQiSSLaWj+3vKi25gqapGZac1qSD/RO3Kt9MJSMwpRPNW1utpM3alaIcMyLAxx0UTlafdqKckOjTVx7TpIaGcGwMxdHDscZYbkBPZdyfpcxQnlcz+ErFuDNRw8p3CoamvLGvn3AYSwb3plc22NjeSpg3glvKcCpfKy9K+R0rFVFpRnKAYlgyYVdldxdCYzGXCWGW6CAnBVGKAi2ckLpWIbRPtiGFpCxSKm85TnPVJskiEpO4zGTTJVcx55KqCFR2U/Ut79JwnckAVOjazzKcdkaS/xEDWbLhMPpDO+gfTfOBCrVfJWoNtRHeEWdHeMLTZwxyhrtYeqDnuLbJ3gI4xrQ5IgH0bS42U1JE04SqufkjIixK8A9ZPadE9nXzKLosxooNA28YsNj6bqMpQctGJ3Mkbve/oVBlnV+ioJv/AQ==&lt;/diagram&gt;&lt;/mxfile&gt;\">\u003Cdefs/>\u003Cg>\u003Cg data-cell-id=\"0\">\u003Cg data-cell-id=\"1\">\u003Cg data-cell-id=\"70\">\u003Cg>\u003Cpath d=\"M 0.5 0.5 L 800.5 0.5 L 800.5 834 L 0.5 834 Z\" fill=\"rgb(255, 255, 255)\" stroke=\"#666666\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cellipse cx=\"735.5\" cy=\"15.5\" rx=\"10\" ry=\"10\" fill=\"none\" stroke=\"#666666\" pointer-events=\"all\"/>\u003Cellipse cx=\"760.5\" cy=\"15.5\" rx=\"10\" ry=\"10\" fill=\"none\" stroke=\"#666666\" pointer-events=\"all\"/>\u003Cellipse cx=\"785.5\" cy=\"15.5\" rx=\"10\" ry=\"10\" fill=\"none\" stroke=\"#008cff\" pointer-events=\"all\"/>\u003Cpath d=\"M 0.5 40.5 L 30.5 40.5 L 30.5 15.5 C 30.5 12.74 32.74 10.5 35.5 10.5 L 170.5 10.5 C 173.26 10.5 175.5 12.74 175.5 15.5 L 175.5 40.5 L 800.5 40.5\" fill=\"none\" stroke=\"#c4c4c4\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 0.5 110.5 L 800.5 110.5\" fill=\"none\" stroke=\"#c4c4c4\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 100.5 60.5 C 100.5 57.74 102.74 55.5 105.5 55.5 L 785.5 55.5 C 788.26 55.5 790.5 57.74 790.5 60.5 L 790.5 85.5 C 790.5 88.26 788.26 90.5 785.5 90.5 L 105.5 90.5 C 102.74 90.5 100.5 88.26 100.5 85.5 Z\" fill=\"none\" stroke=\"#c4c4c4\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cg fill=\"#666666\" font-family=\"&quot;Arial&quot;, &quot;Helvetica&quot;\" font-size=\"17px\"/>\u003Cg fill=\"#666666\" font-family=\"&quot;Arial&quot;, &quot;Helvetica&quot;\" font-size=\"17px\"/>\u003Cpath d=\"M 37.5 17.5 L 48.5 17.5 L 52.5 21.5 L 52.5 35.5 L 37.5 35.5 Z\" fill=\"none\" stroke=\"#c4c4c4\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 48.5 17.5 L 48.5 21.5 L 52.5 22.5\" fill=\"none\" stroke=\"#c4c4c4\" stroke-width=\"0.5\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 107.5 64.5 L 118.5 64.5 L 122.5 68.5 L 122.5 82.5 L 107.5 82.5 Z\" fill=\"none\" stroke=\"#c4c4c4\" stroke-width=\"2\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 118.5 64.5 L 118.5 68.5 L 122.5 69.5\" fill=\"none\" stroke=\"#c4c4c4\" stroke-width=\"0.5\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 12.5 74.5 L 22.5 64.5 L 22.5 70.5 L 32.5 70.5 L 32.5 78.5 L 22.5 78.5 L 22.5 84.5 Z\" fill=\"#c4c4c4\" stroke=\"#c4c4c4\" stroke-width=\"2\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 62.5 74.5 L 52.5 64.5 L 52.5 70.5 L 42.5 70.5 L 42.5 78.5 L 52.5 78.5 L 52.5 84.5 Z\" fill=\"#c4c4c4\" stroke=\"#c4c4c4\" stroke-width=\"2\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 88.1 77.8 C 86.4 80.63 82.72 81.56 79.88 79.86 C 77.04 78.17 76.11 74.5 77.79 71.65 C 79.48 68.81 83.15 67.86 86 69.54 L 84.4 71 L 92.3 72.8 L 90.5 65.3 L 88.8 66.9 C 85.61 64.53 81.3 64.32 77.89 66.37 C 74.49 68.42 72.66 72.33 73.27 76.26 C 73.87 8
27650.19 76.8 83.36 80.66 84.29 C 84.53 85.22 88.57 83.72 90.9 80.5 Z\" fill=\"#c4c4c4\" stroke=\"#c4c4c4\" stroke-width=\"2\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003Cg data-cell-id=\"71\">\u003Cg/>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 108px; height: 1px; padding-top: 26px; margin-left: 63px;\">\u003Cdiv data-drawio-colors=\"color: #666666; \" style=\"box-sizing: border-box; font-size: 0px; text-align: left;\">\u003Cdiv style=\"display: inline-block; font-size: 17px; font-family: Helvetica; color: rgb(102, 102, 102); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Page 1\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"63\" y=\"31\" fill=\"#666666\" font-family=\"&quot;Helvetica&quot;\" font-size=\"17px\">Page 1\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"72\">\u003Cg/>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 1px; height: 1px; padding-top: 74px; margin-left: 133px;\">\u003Cdiv data-drawio-colors=\"color: #666666; \" style=\"box-sizing: border-box; font-size: 0px; text-align: left;\">\u003Cdiv style=\"display: inline-block; font-size: 17px; font-family: Helvetica; color: rgb(102, 102, 102); line-height: 1.2; pointer-events: all; white-space: nowrap;\">https://www.draw.io\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"133\" y=\"79\" fill=\"#666666\" font-family=\"&quot;Helvetica&quot;\" font-size=\"17px\">https://www.draw.io\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"56\">\u003Cg>\u003Crect x=\"40\" y=\"722\" width=\"740.5\" height=\"65\" fill=\"#e1d5e7\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"83\">\u003Cg>\u003Crect x=\"184.5\" y=\"740.5\" width=\"150\" height=\"28\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 755px; margin-left: 260px;\">\u003Cdiv data-drawio-colors=\"color: #0000ff; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 17px; font-family: Helvetica; color: rgb(0, 0, 255); line-height: 1.2; pointer-events: all; text-decoration: underline; white-space: nowrap;\">Auteur\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"260\" y=\"760\" fill=\"#0000ff\" font-family=\"&quot;Helvetica&quot;\" font-size=\"17px\" text-anchor=\"middle\" text-decoration=\"underline\">Auteur\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"82\">\u003Cg>\u003Crect x=\"294.5\" y=\"740.5\" width=\"150\" height=\"28\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 755px; margin-left: 370px;\">\u003Cdiv data-drawio-colors=\"color: #0000ff; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 17px; font-family: Helvetica; color: rgb(0, 0, 255); line-height: 1.2; pointer-events: all; text-decoration: underline; white-space: nowrap;\">Plan du site\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"370\" y=\"760\" fill=\"#0000ff\" font-family=\"&quot;Helvetica&quot;\" font-size=\"17px\" text-anchor=\"middle\" text-decoration=\"underline\">Plan du site\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"84\">\u003Cg>\u003Crect x=\"423.5\" y=\"739.5\" width=\"150\" height=\"28\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 754px; margin-left: 499px;\">\u003Cdiv data-drawio-colors=\"color: #0000ff; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 17px; font-family: Helvetica; color: rgb(0, 0, 255); line-height: 1.2; pointer-events: all; text-decoration: underline; white-space: nowrap;\">Inscription\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"499\" y=\"759\" fill=\"#0000ff\" font-family=\"&quot;Helvetica&quot;\" font-size=\"17px\" text-anchor=\"middle\" text-decoration=\"underline\">Inscription\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"87\">\u003Cg>\u003Crect x=\"294.5\" y=\"740.5\" width=\"30.5\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 29px; height: 1px;
2765 padding-top: 756px; margin-left: 296px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">-\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"310\" y=\"759\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">-\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"88\">\u003Cg>\u003Crect x=\"423.5\" y=\"738.5\" width=\"30.5\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 29px; height: 1px; padding-top: 754px; margin-left: 425px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">-\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"439\" y=\"757\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">-\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"49\">\u003Cg>\u003Crect x=\"40\" y=\"124\" width=\"500\" height=\"77\" fill=\"#e1d5e7\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"52\">\u003Cg>\u003Crect x=\"550\" y=\"124\" width=\"229\" height=\"77\" fill=\"#e1d5e7\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"12\">\u003Cg>\u003Cpath d=\"M 570 161 C 570 155.48 574.48 151 580 151 L 642 151 C 647.52 151 652 155.48 652 161 L 652 166 C 652 171.52 647.52 176 642 176 L 580 176 C 574.48 176 570 171.52 570 166 Z\" fill=\"#ba93ad\" stroke=\"#666666\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cg fill=\"#666666\" font-family=\"&quot;Arial&quot;, &quot;Helvetica&quot;\" font-weight=\"bold\" text-anchor=\"middle\" font-size=\"17px\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 80px; height: 1px; padding-top: 164px; margin-left: 571px;\">\u003Cdiv data-drawio-colors=\"color: #ffffff; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">Inscription\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"611\" y=\"168\" fill=\"#ffffff\" font-family=\"&quot;Helvetica&quot;\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\">Inscription\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"15\">\u003Cg>\u003Cpath d=\"M 668 160 C 668 154.48 672.48 150 678 150 L 740 150 C 745.52 150 750 154.48 750 160 L 750 165 C 750 170.52 745.52 175 740 175 L 678 175 C 672.48 175 668 170.52 668 165 Z\" fill=\"#ba93ad\" stroke=\"#666666\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cg fill=\"#666666\" font-family=\"&quot;Arial&quot;, &quot;Helvetica&quot;\" font-weight=\"bold\" text-anchor=\"middle\" font-size=\"17px\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 80px; height: 1px; padding-top: 163px; margin-left: 669px;\">\u003Cdiv data-drawio-colors=\"color: #ffffff; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">Connexion\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"709\" y=\"167\" fill=\"#ffffff\" font-family=\"&quot;Helvetica&quot;\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\">Connexion\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"16\">\u003Cg>\u003Cpath d=\"M 170 161 C 170 155.48 174.48 151 180 151 L 233 151 C 238.52 151 243 155.48 243 161 L 243 166 C 243 171.52 238.52 176 233 176 L 180 176 C 174.48 176 170 171.52 170 166 Z\" fill=\"#cda2be\" stroke=\"#666666\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cg fill=\"#666666\" font-family=\"&quot;Arial&quot;, &quot;Helvetica&quot;\" font-weight=\"bold\" text-anchor=\"middle\" font-size=\"17px\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 71px; height: 1px; padding-top: 164px; margin-left: 171px;\">\u003Cdiv data-drawio-colors=\"color: #ffffff; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">Page\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"207\" y=\"168\" fill=\"#ffffff\" font-family=\"&quot;Helvetica&quot;\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\">Page\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"17\">\u003Cg>\u003Cpath d=\"M 256 161 C 256 155.48 260.48 151 266 151 L 319 151 C 324.52 151 329 155.48 329 161 L 329 166 C 329 171.52 324.52 176 319 176 L 266 176 C 260.48 176 256 171.52 256 166 Z\" fill=\"#cda2be\" stroke=\"#666666\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cg fill=\"#666666\" font-family=\"&quot;Arial&quot;, &quot;Helvetica&quot;\" font-weight=\"bold\" text-anchor=\"middle\" font-size=\"17px\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 71px; height: 1px; padding-top: 164px; margin-left: 257px;\">\u003Cdiv data-drawio-colors=\"color: #ffffff; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">Page\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"293\" y=\"168\" fill=\"#ffffff\" font-family=\"&quot;Helvetica&quot;\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\">Page\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"18\">\u003Cg>\u003Cpath d=\"M 345 161 C 345 155.48 349.48 151 355 151 L 408 151 C 413.52 151 418 155.48 418 161 L 418 166 C 418 171.52 413.52 176 408 176 L 355 176 C 349.48 176 345 171.52 345 166 Z\" fill=\"#cda2be\" stroke=\"#666666\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cg fill=\"#666666\" font-family=\"&quot;Arial&quot;, &quot;Helvetica&quot;\" font-weight=\"bold\" text-anchor=\"middle\" font-size=\"17px\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 71px; height: 1px; padding-top: 164px; margin-left: 346px;\">\u003Cdiv data-drawio-colors=\"color: #ffffff; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">Page\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"382\" y=\"168\" fill=\"#ffffff\" font-family=\"&quot;Helvetica&quot;\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\">Page\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"19\">\u003Cg>
2765\u003Cpath d=\"M 430.5 161 C 430.5 155.48 434.98 151 440.5 151 L 493.5 151 C 499.02 151 503.5 155.48 503.5 161 L 503.5 166 C 503.5 171.52 499.02 176 493.5 176 L 440.5 176 C 434.98 176 430.5 171.52 430.5 166 Z\" fill=\"#cda2be\" stroke=\"#666666\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cg fill=\"#666666\" font-family=\"&quot;Arial&quot;, &quot;Helvetica&quot;\" font-weight=\"bold\" text-anchor=\"middle\" font-size=\"17px\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 71px; height: 1px; padding-top: 164px; margin-left: 432px;\">\u003Cdiv data-drawio-colors=\"color: #ffffff; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;\">Page\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"467\" y=\"168\" fill=\"#ffffff\" font-family=\"&quot;Helvetica&quot;\" font-size=\"14px\" text-anchor=\"middle\" font-weight=\"bold\">Page\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"50\">\u003Cg>\u003Crect x=\"40\" y=\"364\" width=\"740\" height=\"350\" fill=\"#e1d5e7\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"51\">\u003Cg>\u003Crect x=\"111\" y=\"225\" width=\"583\" height=\"129\" fill=\"#e1d5e7\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 581px; height: 1px; padding-top: 290px; margin-left: 112px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Présentation du produit\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"403\" y=\"293\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">Présentation du produit\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"53\">\u003Cg>\u003Crect x=\"40\" y=\"204\" width=\"740\" height=\"160\" fill=\"rgb(255, 255, 255)\" stroke=\"#999999\" pointer-events=\"all\"/>\u003Cpath d=\"M 40 204 L 780 364 M 40 364 L 780 204\" fill=\"none\" stroke=\"#999999\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"54\">\u003Cg>\u003Crect x=\"65\" y=\"134\" width=\"73\" height=\"59\" fill=\"rgb(255, 255, 255)\" stroke=\"#999999\" pointer-events=\"all\"/>\u003Cpath d=\"M 65 134 L 138 193 M 65 193 L 138 134\" fill=\"none\" stroke=\"#999999\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"55\">\u003Cg>\u003Crect x=\"181.25\" y=\"245\" width=\"458.75\" height=\"29\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 457px; height: 1px; padding-top: 260px; margin-left: 182px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 33px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Titre de la page (la question) ?\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"411\" y=\"269\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"33px\" text-anchor=\"middle\">Titre de la page (la questio...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"60\">\u003Cg>\u003Crect x=\"69\" y=\"149\" width=\"61\" height=\"27\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 59px; height: 1px; padding-top: 163px; margin-left: 70px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 28px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Logo\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"100\" y=\"171\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"28px\" text-anchor=\"middle\">Logo\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"68\">\u003Cg>\u003Crect x=\"350\" y=\"294\" width=\"100\" height=\"30\" fill=\"#cda2be\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"69\">\u003Cg>\u003Crect x=\"370.5\" y=\"294\" width=\"60\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 309px; margin-left: 372px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Cb>Tags\u003C/b>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"401\" y=\"313\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">Tags\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"73\">\u003Cg>\u003Crect x=\"81.5\" y=\"404\" width=\"638.5\" height=\"260\" rx=\"10\" ry=\"10\" fill=\"rgb(255, 255, 255)\" stroke=\"rgb(0, 0, 0)\" pointer-events=\"all\"/>\u003C/g>\u003Cg data-cell-id=\"74\">\u003Cg>\u003Crect x=\"99.5\" y=\"424\" width=\"602\" height=\"50\" rx=\"10\" ry=\"10\" fill=\"#cda2be\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 596px; height: 1px; padding-top: 448px; margin-left: 105px;\">\u003Cdiv data-drawio-colors=\"color: #ffffff; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 17px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Sous titres\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"403\" y=\"453\" fill=\"#ffffff\" font-family=\"&quot;Helvetica&quot;\" font-size=\"17px\" text-anchor=\"middle\">Sous titres\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"75\">\u003Cg>\u003Crect x=\"117\" y=\"479\" width=\"564.5\" height=\"120\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 563px; height: 1px; padding-top: 486px; margin-left: 119px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: left; max-height: 116px; overflow: hidden;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">\u003Ch1 style=\"margin-top: 0px;\">Heading\u003C/h1>\u003Cp>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\u003C/p>\u003Cp>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\u003Cbr />\u003C/p>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"119\" y=\"498\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\">Heading...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"76\">\u003Cg>\u003Crect x=\"377.5\" y=\"311\" width=\"50\" height=\"43\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003Cellipse cx=\"389.43\" cy=\"318.68\" rx=\"6.818181818181818\" ry=\"6.142857142857142\" fill=\"#888888\" stroke=\"none\" pointer-events=\"all\"/>\u003Cellipse cx=\"383.75\" cy=\"331.48\" rx=\"6.250000000000001\" ry=\"5.6309523809523805\" fill=\"#999999\" stroke=\"none\" pointer-events=\"all\"/>\u003Cellipse cx=\"389.43\" cy=\"344.27\" rx=\"5.6818181818181825\" ry=\"5.119047619047619\" fill=\"#aaa
2765aaa\" stroke=\"none\" pointer-events=\"all\"/>\u003Cellipse cx=\"403.64\" cy=\"349.39\" rx=\"5.113636363636364\" ry=\"4.607142857142857\" fill=\"#bbbbbb\" stroke=\"none\" pointer-events=\"all\"/>\u003Cellipse cx=\"417.84\" cy=\"344.27\" rx=\"4.545454545454546\" ry=\"4.095238095238095\" fill=\"#cccccc\" stroke=\"none\" pointer-events=\"all\"/>\u003Cellipse cx=\"423.52\" cy=\"331.48\" rx=\"3.9772727272727275\" ry=\"3.583333333333333\" fill=\"#dddddd\" stroke=\"none\" pointer-events=\"all\"/>\u003Cellipse cx=\"417.84\" cy=\"318.68\" rx=\"3.409090909090909\" ry=\"3.071428571428571\" fill=\"#eeeeee\" stroke=\"none\" pointer-events=\"all\"/>\u003Cellipse cx=\"403.64\" cy=\"313.56\" rx=\"2.8409090909090913\" ry=\"2.5595238095238093\" fill=\"#f3f3f3\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003C/g>\u003C/g>\u003C/g>\u003Cswitch>\u003Cg requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\"/>\u003Ca transform=\"translate(0,-5)\" xlink:href=\"https://www.drawio.com/doc/faq/svg-export-text-problems\" target=\"_blank\">\u003Ctext text-anchor=\"middle\" font-size=\"10px\" x=\"50%\" y=\"100%\">Text is not SVG - cannot display\u003C/text>\u003C/a>\u003C/switch>\u003C/svg>","type":"application/vnd.drawio","modified":"20241018184419538","title":"$:/diagram/site/wireframe","tags":"$:/dev/site"},
2766{"created":"20241016190515299","text":"\u003Csvg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" width=\"849px\" height=\"768px\" viewBox=\"-0.5 -0.5 849 768\" content=\"&lt;mxfile host=&quot;embed.diagrams.net&quot; agent=&quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0&quot; version=&quot;24.7.17&quot;&gt;&lt;diagram id=&quot;nQxJRcITJbT3vqW4sBES&quot; name=&quot;Page-1&quot;&gt;7Zpfb+MoEMA/TaS7h0Y2xDh+bNN2d6XtqqeetM/Upglb20QY9899+gMbEtvjbHtb0ja3TaXKjAGb3wzDMHiCF8XDJ0nXqwuRsXyCguxhgk8nCCUx1v+N4LEVIBK3gqXkWSsKt4Ir/g+zwsBKa56xqldRCZErvu4LU1GWLFU9GZVS3Per3Yi8/9Q1XTIguEppDqXfeaZWrXSO4q38M+PLlXtySJL2TkFdZTuSakUzcd8R4bMJXkghVHtVPCxYbtg5Lm278x13Ny8mWame0yC2Le5oXtvB2RdTj260UtRlxkyDYIJP7ldcsas1Tc3de61eLVupItelUF/e8DxfiFxIXS5FqSudVEqKW+aEE4SPT82fvpPRatV0bFrCV3fvxqRiDx2RHconJgqm5KOu4u6SKYraRtaycGjL91s9xSGexla86qgJu7bUmsdy84AtQX1hIY4DxXvkqdGxMItYDKBa0oYU12Z6nPNlqcUFzzLz1JMbUSo7jcLYE2tnwpZ0PAegcRJAylH8csiz9wRZibUforM+UOwAd4iS+QhRHCQvRxoBpJdyssCT46TSI6KKi9I47NoMUoqs5uoVkXuAm/ThhlEC4EZzDOGGyANct269D4Pdp1eInvYKKNiTVwjR05Qdi6/0muWXouKNYePTa6GUKAxBtyAH3fXJFKjFl2o6TPb1Me4TWm24CCFse1+bNykeliYwmhYiva3X06bA02pa8WKdsy+peSe4bibNby/OZmw+jDqbEPuYD8mHpn5VUzFUVDzityIPakJQTX/VrLJrAS+VWQhSxe+YLk7wOdChHqHq4weq2emcxjxg30d23BfGnoKaKJ72A0gUzgDvGdrU6iL3sVLgZ/iwww9tiNvvPeVtiI9gMQZIr0RdmT0jV5I1AU0b6aS8onqIKMiNtKp/MFNQkupgp6nwdgaOiCcDDwZB5ozAOGg2ogm3sXmRJub7Ne6T0xO8QO8hDBpEm7MAQ8rR2OqaeMAcwWhzoYfIShO8Z8a0c2qgs9R68qqWA6M/eDPHuK8ADBUwi9AmW+Db0iOYVvkqluINwc49OfK4xzWBiyMJR5B6cOMRXBkvWpP+Ru/40u5QD95w4+ApwHjUPfsgDHNXLWGSG4gZv9OXS3P5paxSydct8vau7rxT4Q0V4SmVGM2jpxRBRsJuL3qA6a3jWrHGSR+ZceV0k4vR2yLttgktDJTyumrjteCPS67hWG9v0tF/wkqHrqEE9RRE5mQKc70kHJsscw9KesYWlpXZsTltMAxzWlU8bWITKhUUd7j3ye0kxbLeIQXk1A02xlIuViZZTps9XLfzMTT2CZeCN0GyVcNRONwxBf0uKlHLlNlWW8Cgo5gEP+1Hc1syBfppFLUZ9bN0R+Dq/Lvqrkd8o4H/qrpBP7P9aQ66xs1Lv5ov8+C7cISn7kzQQQO+Kwqm8xjq3kOWgZD/B8ajaLCbJTDdvINi6CHKJzCzABgezuHpIHNPEEAZjy6mLoPwIpIwM/CZ0Uyb2JDnaKb2F/LAO/K7xuSn2p5zURvTz3l5+3czCwxxc7ObKDDljmZI89Ny0/6UG+m3M1u8siPQHQ5TDi48GuvJjUC2vH+avR6zkeY59tHIg41sLMBNOHhE6U58+ifrLzeRGO7/DniywS8VSDTCcseXCmEYeAAKt3vnQqiPOffe5lww2Oi4COA1Jh2Mty4oh3mWDwt5UwsZLN0ogWGQJwvRxe3HaW0Av/3CD5/9Cw==&lt;/diagram&gt;&lt;/mxfile&gt;\">\u003Cdefs/>\u003Cg>\u003Cg data-cell-id=\"0\">\u003Cg data-cell-id=\"1\">\u003Cg data-cell-id=\"71\">\u003Cg>\u003Crect x=\"66.25\" y=\"313\" width=\"713.75\" height=\"325\" fill=\"none\" stroke=\"#adadad\" stroke-dasharray=\"3 3\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"3\">\u003Cg>\u003Crect x=\"170\" y=\"76\" width=\"390\" height=\"57\" fill=\"#e1d5e7\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"4\">\u003Cg>\u003Crect x=\"90\" y=\"318\" width=\"680\" height=\"309\" fill=\"#e1d5e7\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"5\">\u003Cg>\u003Crect x=\"140\" y=\"157\" width=\"583\" height=\"129\" fill=\"#e1d5e7\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 581px; height: 1px; padding-top: 222px; margin-left: 141px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Présentation du produit\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"432\" y=\"225\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">Présentation du produit\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"10\">\u003Cg>\u003Crect x=\"570\" y=\"76\" width=\"200\" height=\"57\" fill=\"#e1d5e7\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"12\">\u003Cg>\u003Crect x=\"90\" y=\"157\" width=\"680\" height=\"139\" fill=\"rgb(255, 255, 255)\" stroke=\"#999999\" pointer-events=\"all\"/>\u003Cpath d=\"M 90 157 L 770 296 M 90 296 L 770 157\" fill=\"none\" stroke=\"#999999\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"19\">\u003Cg>\u003Crect x=\"90\" y=\"77\" width=\"73\" height=\"59\" fill=\"rgb(255, 255, 255)\" stroke=\"#999999\" pointer-events=\"all\"/>\u003Cpath d=\"M 90 77 L 163 136 M 90 136 L 163 77\" fill=\"none\" stroke=\"#999999\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"29\">\u003Cg>\u003Crect x=\"207.5\" y=\"212\" width=\"427.5\" height=\"29\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 426px; height: 1px; padding-top: 227px; margin-left: 209px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 33px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Question introductive ?\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"421\" y=\"236\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"33px\" text-anchor=\"middle\">Question introductive ?\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"32\">\u003Cg>\u003Crect x=\"90\" y=\"665\" width=\"680\" height=\"67\" fill=\"#e1d5e7\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"47\">\u003Cg>\u003Crect x=\"150\" y=\"344\" width=\"540\" height=\"23\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 538px; height: 1px; padding-top: 356px; margin-left: 151px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 26px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Sous titre précisant le sujet traité\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"420\" y=\"363\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"26px\" text-anchor=\"middle\">Sous titre précisant le sujet traité\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"48\">\u003Cg>\u003Crect x=\"140\" y=\"401\" width=\"550\" height=\"193\" fill=\"#bdb3c2\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"50\">\u003Cg>\u003Crect x=\"183\" y=\"431\" width=\"452.25\" height=\"23\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 450px; height: 1px; padding-top: 443px; margin-left: 184px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 26px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Contenu de la section sur le sujet\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"409\" y=\"450\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"26px\" text-anchor=\"middle\">Contenu de la section sur le sujet\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"51\">\u003Cg>\u003Crect x=\"97\" y=\"92\" width=\"61\" height=\"27\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 59px; height: 1px; padding-top: 106px; margin-left: 98px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 28px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Logo\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"128\" y=\"114\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"28px\" text-anchor=\"middle\">Logo\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"52\">\u003Cg>\u003Crect x=\"220\" y=\"92\" width=\"340\" height=\"27\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 338px; height: 1px; padding-top: 106px; margin-left: 221px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 26px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Menu Navigation\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"390\" y=\"113\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"26px\" text-anchor=\"middle\">Menu Navigation\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"53\">\u003Cg>\u003Crect x=\"635\" y=\"92\" width=\"63\" height=\"27\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 61px; height: 1px; padding-top: 106px; margin-left: 636px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 21px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Menu\u003Cdiv>Inscription\u003C/div>\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"667\" y=\"112\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"21px\" text-anchor=\"middle\">Menu...\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"54\">\u003Cg>\u003Crect x=\"142\" y=\"684.5\" width=\"610\" height=\"28\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 608px; height: 1px; padding-top: 699px; margin-left: 143px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 21px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Auteur - plan du site  (Pied de page) \u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"447\" y=\"705\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"21px\" text-anchor=\"middle\">Auteur - plan du site  (Pied de page) \u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"59\">\u003Cg>\u003Cpath d=\"M 54.87 18 L 803.63 18\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003Cpath d=\"M 49.62 18 L 56.62 14.5 L 54.87 18 L 56.62 21.5 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 808.88 18 L 801.88 21.5 L 803.63 18 L 801.88 14.5 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"61\">\u003Cg>\u003Cpath d=\"M 49 751.63 L 49 44.37\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003Cpath d=\"M 49 756.88 L 45.5 749.88 L 49 751.63 L 52.5 749.88 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cpath d=\"M 49 39.12 L 52.5 46.12 L 49 44.37 L 45.5 46.12 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"64\">\u003Cg>\u003Crect x=\"403.69\" y=\"2\" width=\"50.87\" height=\"9\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003Cforei
2766gnObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 49px; height: 1px; padding-top: 7px; margin-left: 405px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">760\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"429\" y=\"10\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">760\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"66\">\u003Cg>\u003Crect x=\"0\" y=\"366\" width=\"50.87\" height=\"13\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 49px; height: 1px; padding-top: 373px; margin-left: 1px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">760\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"25\" y=\"376\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">760\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"67\">\u003Cg>\u003Crect x=\"70\" y=\"60\" width=\"710\" height=\"246\" fill=\"none\" stroke=\"#adadad\" stroke-dasharray=\"3 3\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"68\">\u003Cg>\u003Cpath d=\"M 838 53.5 L 768 53.5 L 760 60\" fill=\"none\" stroke=\"#adadad\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cg fill=\"#666666\" font-family=\"&quot;Arial&quot;, &quot;Helvetica&quot;\" text-anchor=\"middle\" font-size=\"17px\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-end; width: 1px; height: 1px; padding-top: 35px; margin-left: 836px;\">\u003Cdiv data-drawio-colors=\"color: #666666; \" style=\"box-sizing: border-box; font-size: 0px; text-align: right;\">\u003Cdiv style=\"display: inline-block; font-size: 10px; font-family: Helvetica; color: rgb(102, 102, 102); line-height: 1.2; pointer-events: all; font-style: italic; white-space: nowrap;\">Header\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"836\" y=\"45\" fill=\"#666666\" font-family=\"&quot;Helvetica&quot;\" font-size=\"10px\" text-anchor=\"end\" font-style=\"italic\">Header\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"72\">\u003Cg>\u003Crect x=\"66.25\" y=\"648\" width=\"713.75\" height=\"110\" fill=\"none\" stroke=\"#adadad\" stroke-dasharray=\"3 3\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"73\">\u003Cg>\u003Cpath d=\"M 830 652.5 L 760 652.5 L 752 659\" fill=\"none\" stroke=\"#adadad\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cg fill=\"#666666\" font-family=\"&quot;Arial&quot;, &quot;Helvetica&quot;\" text-anchor=\"middle\" font-size=\"17px\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-end; width: 1px; height: 1px; padding-top: 634px; margin-left: 828px;\">\u003Cdiv data-drawio-colors=\"color: #666666; \" style=\"box-sizing: border-box; font-size: 0px; text-align: right;\">\u003Cdiv style=\"display: inline-block; font-size: 10px; font-family: Helvetica; color: rgb(102, 102, 102); line-height: 1.2; pointer-events: all; font-style: italic; white-space: nowrap;\">Footer\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"828\" y=\"644\" fill=\"#666666\" font-family=\"&quot;Helvetica&quot;\" font-size=\"10px\" text-anchor=\"end\" font-style=\"italic\">Footer\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"74\">\u003Cg>\u003Cpath d=\"M 848 321.5 L 778 321.5 L 770 328\" fill=\"none\" stroke=\"#adadad\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003Cg fill=\"#666666\" font-family=\"&quot;Arial&quot;, &quot;Helvetica&quot;\" text-anchor=\"middle\" font-size=\"17px\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-end; width: 1px; height: 1px; padding-top: 303px; margin-left: 846px;\">\u003Cdiv data-drawio-colors=\"color: #666666; \" style=\"box-sizing: border-box; font-size: 0px; text-align: right;\">\u003Cdiv style=\"display: inline-block; font-size: 10px; font-family: Helvetica; color: rgb(102, 102, 102); line-height: 1.2; pointer-events: all; font-style: italic; white-space: nowrap;\">Main\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"846\" y=\"313\" fill=\"#666666\" font-family=\"&quot;Helvetica&quot;\" font-size=\"10px\" text-anchor=\"end\" font-style=\"italic\">Main\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003C/g>\u003C/g>\u003C/g>\u003Cswitch>\u003Cg requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\"/>\u003Ca transform=\"translate(0,-5)\" xlink:href=\"https://www.drawio.com/doc/faq/svg-export-text-problems\" target=\"_blank\">\u003Ctext text-anchor=\"middle\" font-size=\"10px\" x=\"50%\" y=\"100%\">Text is not SVG - cannot display\u003C/text>\u003C/a>\u003C/switch>\u003C/svg>","type":"application/vnd.drawio","modified":"20241016204343459","title":"$:/diagram/site/zoning"},
2767{"created":"20240829195921151","text":"\u003Csvg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" width=\"990px\" height=\"490px\" viewBox=\"-0.5 -0.5 990 490\" content=\"&lt;mxfile host=&quot;embed.diagrams.net&quot; agent=&quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0&quot; version=&quot;24.7.17&quot;&gt;&lt;diagram id=&quot;6HiATtBj7p3_dW1rnopz&quot; name=&quot;Page-1&quot;&gt;7VpLk5s4EP41PmaKh/HjOONxsods1VTN1iY5pRSQQRtBs0KM7fz6SEYyD+HJMEPAqcIX3K2WkLo/dbdazNxNfPjAUBr9DQGmM8cKDjP3fuY4tuutxENyjgXHW9gFI2QkUEIl45H8wIppKW5OApzVBDkA5SStM31IEuzzGg8xBvu62A5o/a0pCrHBePQRNbmfSMAjtYqVW/L/wiSM1JtXzrJoiJGWVQvJIhTAvsJytzN3wwB48S8+bDCVutNqKfq9v9B6nhfDCX9Rh3XR4wnRXK1NTYwf9WJxINauSGA8ghASRLcl945BngRYDmkJqpT5CJAKpi2Y/2HOj8qQKOcgWBGPqWrFB8I/y+43nqK+VFruD2rkE3GsEA+YkRhzzDQv4exYGUiSX6pt5VAn6lilmoOZulTqzSBnvlKOo0zOEQuxFlPWloqrdFQW+IBBvIUdhQDDFHHyVAcVUtgMz3Lnrg9AxFQcS+2jdwuFIrWLHMuqD1FMVPUqUXDLGDpWxFIpkHV4j9sAVUPedrzn5MWfYgaaquikZJ2A2g5avXkm0L4StC2YXfQN2Yq1nzemfRXGfK3ebGcsxbmG3m7lChikkBkarKx0HxGOH1N0WtRexGfByziD73gDFCSOEkikTneEUs2aiT1sLdf3C8Gn6BumD5ARTiARbb5QmcTf3RNmnIgg+bEhEJMgOFlJC9xSEsoGLo1zhxR1HmcHCVeGEuoV5sw5JYmYng7m0saZWAFJwn9O9n23UN0q831/+knJ75j7ke4WoVQOHB9CmZrciEniGKU3JNnBczCQU8eHZy2svaXt1N3lmd6XqcKZF1XShKX1dlR4BioyLGgKoVDthIqOqIiEAfpBxaqOCXc9ICbs+VW42OHj3ML01649UG42dy5YXI9RzMpIzl6RD9nmpr/aENpiEn2oGz6ELgy9/Uvk1p88ZWdPmVF5Io/kWbaXIDq3GmeO5YAOc2XgYpMLYAirTrjoiAthb95XXrUeM4aaZ07tK9zbJ2HRCRudsZFGwPtKul13THA4Bji2jMEURjpDAp/U1gsknEbVynOHRIQZQq42JdPlympO5o2VkunJVGOvBNxBYnjaTh230w5Y3NP5tVHSbUvH7N+0mRzTvY6xmc713llZ7S1rvy+v975oU7aUGke6VbCbB9cLtwrmQLZ3IYfv/whseo0HipKvQf5VboXJcXQ+zhXPnpKzhd0IxfMBQ3HLKX9U7/HG26LXeg/N+2Pch9MooJ1LqL/wHpdvN9/gX1oczNXmc23WX42Vz7nmufmPUpyzHktzLRd820Qugon3/J9PQa1zUGN4hwUAfPnl0G+56Ru0SKmRWa1IgY++5RQRNqGjezWKQZD7vC9sePMaNAatR+lLrtZiZYA5InT6RGDUcuV8uR4MHoIsPygscp/yq0x3+xM=&lt;/diagram&gt;&lt;/mxfile&gt;\">\u003Cdefs/>\u003Cg>\u003Cg data-cell-id=\"0\">\u003Cg data-cell-id=\"1\">\u003Cg data-cell-id=\"19\">\u003Cg>\u003Cpath d=\"M 550 220 L 550 110 L 735 110 L 735 150 L 743.63 150\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003Cpath d=\"M 748.88 150 L 741.88 153.5 L 743.63 150 L 741.88 146.5 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"20\">\u003Cg>\u003Cpath d=\"M 550 70 L 550 110 L 270 110 L 270 143.63\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003Cpath d=\"M 270 148.88 L 266.5 141.88 L 270 143.63 L 273.5 141.88 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"21\">\u003Cg>\u003Cpath d=\"M 610 35 L 930 35 L 930 403.63\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003Cpath d=\"M 930 408.88 L 926.5 401.88 L 930 403.63 L 933.5 401.88 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"3\">\u003Cg>\u003Cpath d=\"M 492 70 C 490.9 70 490 69.1 490 68 L 490 2 C 490 0.9 490.9 0 492 0 L 608 0 C 609.1 0 610 0.9 610 2 L 610 68 C 610 69.1 609.1 70 608 70 Z\" fill=\"#0079d6\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 552.93 34.33 C 551.24 34.33 550.02 33.01 550.02 31.4 C 550.02 29.89 551.2 28.47 552.93 28.47 C 554.3 28.47 555.86 29.63 555.86 31.4 C 555.86 33.07 554.55 34.33 552.93 34.33 Z M 553.79 51.48 C 553.01 52.78 552 54.31 550.68 55.39 C 550 55.92 548.96 56.81 547.03 56.
276768 C 545.71 56.62 544.1 55.48 544.64 53.24 L 548 41.46 C 548.14 40.89 548.16 40.24 547.67 39.86 C 547.44 39.67 547.13 39.53 546.99 39.53 L 545.93 39.56 L 546.19 38.74 L 553.02 37.66 L 554.15 37.68 L 549.72 52.97 C 549.59 53.51 549.74 53.71 549.97 53.91 C 550.44 54.26 550.85 53.84 551.27 53.46 C 551.87 52.91 552.47 51.97 553.11 51.08 Z M 549.99 60.05 C 559.4 60.05 567.5 53.03 567.5 42.66 C 567.5 32.18 559.84 25 549.95 25 C 541.5 25 532.48 31.28 532.48 42.61 C 532.48 52.58 540.25 60.05 549.99 60.05 Z M 549.92 63.87 C 537.46 63.87 528.58 53.14 528.58 42.68 C 528.58 30.3 539.13 21.12 549.88 21.12 C 562.24 21.12 571.4 31.4 571.4 42.64 C 571.4 53.92 561.86 63.87 549.92 63.87 Z M 491 16 L 491 68 C 491 68.55 491.45 69 492 69 L 608 69 C 608.55 69 609 68.55 609 68 L 609 16 Z\" fill-opacity=\"0.5\" fill=\"#ffffff\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 1px; margin-left: 491px;\">\u003Cdiv data-drawio-colors=\"color: #FFFFFF; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">A propos\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"550\" y=\"13\" fill=\"#FFFFFF\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">A propos\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"5\">\u003Cg>\u003Cpath d=\"M 692 340 C 690.9 340 690 339.1 690 338 L 690 272 C 690 270.9 690.9 270 692 270 L 808 270 C 809.1 270 810 270.9 810 272 L 810 338 C 810 339.1 809.1 340 808 340 Z\" fill=\"#0079d6\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 731.21 334.7 L 731.21 313.23 L 729.39 313.23 C 728 313.18 727.41 311.72 728.23 310.72 L 748.4 291.08 C 749.74 290 750.29 290.11 751.47 290.97 L 760.73 299.82 L 760.73 294.43 C 760.73 293.83 761.23 293.11 762.07 293.11 L 766.13 293.11 C 766.8 293.11 767.44 293.65 767.44 294.46 L 767.44 306.53 L 771.74 310.7 C 772.68 311.8 771.85 313.23 770.56 313.23 L 768.78 313.23 L 768.78 334.7 L 754.69 334.7 L 754.69 318.6 L 745.3 318.6 L 745.3 334.7 Z M 691 286 L 691 338 C 691 338.55 691.45 339 692 339 L 808 339 C 808.55 339 809 338.55 809 338 L 809 286 Z\" fill-opacity=\"0.5\" fill=\"#ffffff\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 271px; margin-left: 691px;\">\u003Cdiv data-drawio-colors=\"color: #FFFFFF; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">se loger\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"750\" y=\"283\" fill=\"#FFFFFF\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">se loger\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"14\">\u003Cg>\u003Cpath d=\"M 270 220 L 270 245 L 191 245 L 191 263.63\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003Cpath d=\"M 191 268.88 L 187.5 261.88 L 191 263.63 L 194.5 261.88 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"15\">\u003Cg>\u003Cpath d=\"M 270 220 L 270 245 L 340 245 L 340 263.63\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003Cpath d=\"M 340 268.88 L 336.5 261.88 L 340 263.63 L 343.5 261.88 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"6\">\u003Cg>\u003Cpath d=\"M 212 220 C 210.9 220 210 219.1 210 218 L 210 152 C 210 150.9 210.9 150 212 150 L 328 150 C 329.1 150 330 150.9 330 152 L 330 218 C 330 219.1 329.1 220 328 220 Z\" fill=\"#0079d6\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 265.06 213.77 L 265.06 171.18 L 292.32 178.06 L 292.32 206.96 Z M 256.19 211.81 L 256.19 173.14 L 262.72 175.37 L 262.72 209.63 Z M 247.68 209.95 L 247.68 175.01 L 253.99 177.17 L 253.99 207.82 Z M 211 166 L 211 218 C 211 218.55 211.45 219 212 219 L 328 219 C 328.55 219 329 218.55 329 218 L 329 166 Z\" fill-opacity=\"0.5\" fill=\"#ffffff\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 151px; margin-left: 211px;\">\u003Cdiv data-drawio-colors=\"color: #FFFFFF; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Visiter\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"270\" y=\"163\" fill=\"#FFFFFF\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">Visiter\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"8\">\u003Cg>\u003Cpath d=\"M 422 340 C 420.9 340 420 339.1 420 338 L 420 272 C 420 270.9 420.9 270 422 270 L 538 270 C 539.1 270 540 270.9 540 272 L 540 338 C 540 339.1 539.1 340 538 340 Z\" fill=\"#0079d6\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 457.01 294.13 C 457.35 291.24 459.65 288.96 462.55 288.64 L 493.45 288.64 L 502.99 298.14 L 502.99 330.43 C 502.83 333.61 500.31 336.16 497.14 336.36 L 462.55 336.36 C 459.69 336.06 457.41 333.85 457.01 331 Z M 460.77 330.14 C 460.77 331.29 461.57 332.27 462.7 332.5 L 497.21 332.5 C 498.31 332.26 499.09 331.27 499.09 330.14 L 499.09 300.35 L 491.38 300.35 L 491.38 292.54 L 462.7 292.54 C 461.66 292.8 460.92 293.7 460.86 294.76 Z M 469.06 303.92 L 490.36 303.92 L 490.36 307.87 L 469.06 307.87 Z M 469.06 311.44 L 490.36 311.44 L 490.36 315.39 L 469.06 315.39 Z M 469.06 318.96 L 490.36 318.96 L 490.36 322.96 L 469.06 322.96 Z M 421 286 L 421 338 C 421 338.55 421.45 339 422 339 L 538 339 C 538.55 339 539 338.55 539 338 L 539 286 Z\" fill-opacity=\"0.5\" fill=\"#ffffff\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 271px; margin-left: 421px;\">\u003Cdiv data-drawio-colors=\"color: #FFFFFF; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Cuisine\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"480\" y=\"283\" fill=\"#FFFFFF\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">Cuisine\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"10\">\u003Cg>\u003Cpath d=\"M 282 340 C 280.9 340 280 339.1 280 338 L 280 272 C 280 270.9 280.9 270 282 270 L 398 270 C 399.1 270 400 270.9 400 272 L 400 338 C 400 339.1 399.1 340 398 340 Z\" fill=\"#0079d6\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 354.51 307.66 C 352.03 307.66 349.68 305.58 349.68 302.7 C 349.68 300.31 351.78 298 354.54 298 C 356.61 298 359.32 299.67 359.32 302.86 C 359.32 305.63 356.89 307.66 354.51 307.66 Z M 320.66 327 L 330.34 301.2 L 343.21 317.35 L 349.67 312.51 L 359.36 327 Z M 317.43 330.25 L 362.58 330.25 L 362.58 294.76 L 317.43 294.76 Z M 314.21 333.44 L 314.21 291.56 L 365.79 291.56 L 365.79 333.44 Z M 281 286 L 281 338 C 281 338.55 281.45 339 282 339 L 398 339 C 398.5
27675 339 399 338.55 399 338 L 399 286 Z\" fill-opacity=\"0.5\" fill=\"#ffffff\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 271px; margin-left: 281px;\">\u003Cdiv data-drawio-colors=\"color: #FFFFFF; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Visiter:ville\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"340\" y=\"283\" fill=\"#FFFFFF\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">Visiter:ville\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"12\">\u003Cg>\u003Cpath d=\"M 872 480 C 870.9 480 870 479.1 870 478 L 870 412 C 870 410.9 870.9 410 872 410 L 988 410 C 989.1 410 990 410.9 990 412 L 990 478 C 990 479.1 989.1 480 988 480 Z\" fill=\"#0079d6\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 930.02 457.68 L 923.88 463.8 L 919.36 459.32 L 925.52 453.16 L 919.29 447.02 L 923.91 442.46 L 930.03 448.62 L 936.17 442.49 L 940.69 447.04 L 934.51 453.18 L 940.69 459.28 L 936.14 463.84 Z M 929.95 473.98 C 917.96 473.98 908.53 464.4 908.53 452.28 C 908.53 440.54 918.17 431.01 930.22 431.01 C 942.52 431.01 951.49 441.46 951.49 452.3 C 951.49 465.32 941.09 473.98 929.95 473.98 Z M 871 426 L 871 478 C 871 478.55 871.45 479 872 479 L 988 479 C 988.55 479 989 478.55 989 478 L 989 426 Z\" fill-opacity=\"0.5\" fill=\"#ffffff\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 411px; margin-left: 871px;\">\u003Cdiv data-drawio-colors=\"color: #FFFFFF; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Error\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"930\" y=\"423\" fill=\"#FFFFFF\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">Error\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"18\">\u003Cg>\u003Cpath d=\"M 750 220 L 750 263.63\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003Cpath d=\"M 750 268.88 L 746.5 261.88 L 750 263.63 L 753.5 261.88 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"17\">\u003Cg>\u003Cpath d=\"M 696.83 220 C 695.82 220 695 219.1 695 218 L 695 152 C 695 150.9 695.82 150 696.83 150 L 803.17 150 C 804.18 150 805 150.9 805 152 L 805 218 C 805 219.1 804.18 220 803.17 220 Z\" fill=\"#0079d6\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 765.96 174.65 L 767.8 174.65 L 767.8 172.64 L 765.96 172.64 Z M 762.27 174.65 L 764.12 174.65 L 764.12 172.64 L 762.27 172.64 Z M 758.59 174.65 L 760.44 174.65 L 760.44 172.64 L 758.59 172.64 Z M 761.71 206.78 L 763.54 204.78 L 767.22 204.78 C 767.57 204.78 767.8 204.47 767.8 204.15 L 767.8 200.11 L 769.64 198.09 L 769.64 204.23 C 769.64 205.52 768.52 206.78 767.31 206.78 Z M 753.5 207.92 L 751.35 211.67 L 751.72 212.08 L 755.15 209.74 Z M 753.37 206.72 L 769.49 189 C 769.9 188.62 770.5 188.61 770.81 188.9 L 772.53 190.78 C 772.83 191.19 772.72 191.83 772.45 192.2 L 756.26 209.93 L 749.73 214.33 C 749.47 214.51 749.16 214.17 749.29 213.85 Z M 743.86 182.68 L 732.2 182.68 L 732.2 181.34 L 743.86 181.34 Z M 756.19 200.76 L 732.2 200.76 L 732.2 185.36 L 764.73 185.36 L 764.73 191.39 L 763.5 192.73 L 763.5 186.69 L 733.43 186.69 L 733.43 199.42 L 757.4 199.42 Z M 751.14 206.78 L 729.63 206.78 C 728.44 206.78 727.29 205.55 727.29 204.18 L 727.29 173.33 C 727.29 171.61 728.63 170.62 729.67 170.62 L 767.19 170.62 C 768.5 170.62 769.64 171.79 769.64 173.27 L 769.64 186.78 C 768.8 186.97 768.27 187.47 767.8 188.04 L 767.8 177.32 L 729.13 177.32 L 729.13 204.16 C 729.18 204.62 729.41 204.74 729.69 204.77 L 752.52 204.77 L 751.9 205.46 Z M 695.92 166 L 695.92 218 C 695.92 218.55 696.33 219 696.83 219 L 803.17 219 C 803.67 219 804.08 218.55 804.08 218 L 804.08 
2767166 Z\" fill-opacity=\"0.5\" fill=\"#ffffff\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 108px; height: 1px; padding-top: 151px; margin-left: 696px;\">\u003Cdiv data-drawio-colors=\"color: #FFFFFF; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Connexion\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"750\" y=\"163\" fill=\"#FFFFFF\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">Connexion\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"22\">\u003Cg>\u003Cpath d=\"M 490 35 L 60 35 L 60 413.63\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003Cpath d=\"M 60 418.88 L 56.5 411.88 L 60 413.63 L 63.5 411.88 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"7\">\u003Cg>\u003Cpath d=\"M 2 490 C 0.9 490 0 489.1 0 488 L 0 422 C 0 420.9 0.9 420 2 420 L 118 420 C 119.1 420 120 420.9 120 422 L 120 488 C 120 489.1 119.1 490 118 490 Z\" fill=\"#0079d6\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 36.59 482.86 C 35.16 482.86 33.6 481.69 33.6 479.84 L 33.6 445.12 C 33.6 443.36 35.14 442.14 36.52 442.14 L 83.45 442.14 C 84.89 442.14 86.4 443.39 86.4 445.1 L 86.4 479.86 C 86.4 481.65 84.86 482.86 83.48 482.86 Z M 78.1 468.53 L 74.33 468.53 L 74.33 462.5 L 60.75 462.5 L 60.75 457.97 L 66.03 457.97 L 66.03 449.68 L 53.97 449.68 L 53.97 457.97 L 59.25 457.97 L 59.25 462.5 L 45.67 462.5 L 45.67 468.53 L 41.9 468.53 L 41.9 475.32 L 50.95 475.32 L 50.95 468.53 L 47.18 468.53 L 47.18 464.01 L 59.25 464.01 L 59.25 468.53 L 55.48 468.53 L 55.48 475.32 L 64.53 475.32 L 64.53 468.53 L 60.75 468.53 L 60.75 464.01 L 72.82 464.01 L 72.82 468.53 L 69.05 468.53 L 69.05 475.32 L 78.1 475.32 Z M 1 436 L 1 488 C 1 488.55 1.45 489 2 489 L 118 489 C 118.55 489 119 488.55 119 488 L 119 436 Z\" fill-opacity=\"0.5\" fill=\"#ffffff\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 421px; margin-left: 1px;\">\u003Cdiv data-drawio-colors=\"color: #FFFFFF; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Plan_du_site\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"60\" y=\"433\" fill=\"#FFFFFF\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">Plan_du_site\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"26\">\u003Cg>\u003Cpath d=\"M 550 70 L 550 143.63\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003Cpath d=\"M 550 148.88 L 546.5 141.88 L 550 143.63 L 553.5 141.88 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"27\">\u003Cg>\u003Cpath d=\"M 550 220 L 550 245 L 480 245 L 480 263.63\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003Cpath d=\"M 480 268.88 L 476.5 261.88 L 480 263.63 L 483.5 261.88 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"30\">\u003Cg>\u003Cpath d=\"M 550 220 L 550 245 L 616 245 L 616 263.63\" fill=\"none\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"stroke\"/>\u003Cpath d=\"M 616 268.88 L 612.5 261.88 L 616 263.63 L 619.5 261.88 Z\" fill=\"rgb(0, 0, 0)\" stroke=\"rgb(0, 0, 0)\" stroke-miterlimit=\"10\" pointer-events=\"all\"/>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"23\">\u003Cg>\u003Cpath d=\"M 492 220 C 490.9 220 490 219.1 490 218 L 490 152 C 490 150.9 490.9 150 492 150 L 608 150 C 609.1 150 610 150.9 610 152 L 610 218 C 610 219.1 609.1 220 608 220 Z\" fill=\"#0079d6\" stroke=\"none\" pointer-events=\"all\"/>
2767\u003Cpath d=\"M 571.04 196.53 L 577.79 196.53 L 577.79 193.13 L 571.04 193.13 Z M 571.04 206.67 L 577.79 206.67 L 577.79 203.28 L 571.04 203.28 Z M 560.88 196.53 L 560.88 193.13 L 554.08 193.13 L 554.08 196.53 Z M 554.08 206.67 L 560.88 206.67 L 560.88 203.28 L 554.08 203.28 Z M 536.04 197.13 L 537.74 194.21 L 531.93 190.76 L 530.19 193.68 Z M 530.91 205.9 L 532.61 202.97 L 526.82 199.55 L 525.08 202.48 Z M 567.66 213.46 L 567.66 172.81 L 581.23 172.81 L 581.23 213.46 Z M 530.39 213.45 L 518.73 206.57 L 539.29 171.55 L 550.73 178.27 L 550.73 172.81 L 564.23 172.81 L 564.23 213.46 L 550.73 213.46 L 550.73 178.74 Z M 491 166 L 491 218 C 491 218.55 491.45 219 492 219 L 608 219 C 608.55 219 609 218.55 609 218 L 609 166 Z\" fill-opacity=\"0.5\" fill=\"#ffffff\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 151px; margin-left: 491px;\">\u003Cdiv data-drawio-colors=\"color: #FFFFFF; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">En pratique\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"550\" y=\"163\" fill=\"#FFFFFF\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">En pratique\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"29\">\u003Cg>\u003Cpath d=\"M 558 340 C 556.9 340 556 339.1 556 338 L 556 272 C 556 270.9 556.9 270 558 270 L 674 270 C 675.1 270 676 270.9 676 272 L 676 338 C 676 339.1 675.1 340 674 340 Z\" fill=\"#0079d6\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 618.28 316.75 C 618.28 314.86 618.92 313.96 620.61 313.16 L 634.7 305.87 C 635.21 305.61 636.07 305.68 636.07 306.2 L 636.07 323.55 C 636.07 324.38 635.16 325.33 634.54 325.63 L 619.93 334.03 C 618.87 334.75 618.28 334.09 618.28 333.14 Z M 597.93 301.62 C 596.97 301.11 597.27 300.34 597.99 299.97 L 614.48 291.37 C 615.5 290.77 616.91 290.86 617.78 291.31 L 634.38 299.99 C 635.12 300.38 635.32 301.09 634.45 301.56 L 617.91 310.19 C 617.02 310.79 615.4 310.83 614.34 310.16 Z M 597.9 325.71 C 596.88 325.17 596.09 324.07 596.09 322.61 L 596.09 306.96 C 596.09 305.88 596.7 305.41 597.73 305.94 L 612.15 313.38 C 613.54 314 614.05 315.29 614.05 316.18 L 614.05 333.39 C 614.05 334.21 613.21 334.57 612.47 334.06 Z M 557 286 L 557 338 C 557 338.55 557.45 339 558 339 L 674 339 C 674.55 339 675 338.55 675 338 L 675 286 Z\" fill-opacity=\"0.5\" fill=\"#ffffff\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 271px; margin-left: 557px;\">\u003Cdiv data-drawio-colors=\"color: #FFFFFF; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Vocabulaire\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"616\" y=\"283\" fill=\"#FFFFFF\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">Vocabulaire\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"31\">\u003Cg>\u003Cpath d=\"M 133 340 C 131.9 340 131 339.1 131 338 L 131 272 C 131 270.9 131.9 270 133 270 L 249 270 C 250.1 270 251 270.9 251 272 L 251 338 C 251 339.1 250.1 340 249 340 Z\" fill=\"#0079d6\" stroke=\"none\" pointer-events=\"all\"/>\u003Cpath d=\"M 205.51 307.66 C 203.03 307.66 200.68 305.58 200.68 302.7 C 200.68 300.31 202.78 298 205.54 298 C 207.61 298 210.32 299.67 210.32 302.86 C 210.32 305.63 207.89 307.66 205.51 307.66 Z M 171.66 327 L 181.34 301.2 L 194.21 317.35 L 200.67 312.51 L 210.36 327 Z M 168.43 330.25 L 213.58 330.25 L 213.58 294.76 L 168.43 294.76 Z M 165.21 333.44 L 165.21 291.56 L 216.79 291.56 L 216.79 333.44 Z M 132 286 L 132 338 C 132 338.55 132.45 339 133 339 L 249 339 C 249.55 339 250 338.55 250 338 L 250 286 Z\" fill-opacity=\"0.5\" fill=\"#ffffff\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 271px; margin-left: 132px;\">\u003Cdiv data-drawio-colors=\"color: #FFFFFF; \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Visiter:details\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"191\" y=\"283\" fill=\"#FFFFFF\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">Visiter:details\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003C/g>\u003C/g>\u003C/g>\u003Cswitch>\u003Cg requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\"/>\u003Ca transform=\"translate(0,-5)\" xlink:href=\"https://www.drawio.com/doc/faq/svg-export-text-problems\" target=\"_blank\">\u003Ctext text-anchor=\"middle\" font-size=\"10px\" x=\"50%\" y=\"100%\">Text is not SVG - cannot display\u003C/text>\u003C/a>\u003C/switch>\u003C/svg>","type":"application/vnd.drawio","modified":"20241015163440993","title":"$:/diagram/site2/plan_du_site"},
2768{"created":"20241012182514717","text":"\u003Csvg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" width=\"450px\" height=\"290px\" viewBox=\"-0.5 -0.5 450 290\" content=\"&lt;mxfile host=&quot;embed.diagrams.net&quot; agent=&quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0&quot; version=&quot;24.7.17&quot;&gt;&lt;diagram id=&quot;CL7WIGKbNvycp-sjLxS_&quot; name=&quot;Page-1&quot;&gt;1ZZBb4IwFIB/DdlVKMg8TqbuMJMlHnZu7Bs0KzxTiuh+/Yq0CtZFl7kDF9N+r0/6vj4tHkny3ULSTbZEBsILRmznkWcvCEIS6M8G7FsQjf0WpJKzFnXAin+BgSNDK86g7C1UiELxTR+usShgrXqMSol1f9kHiv5TNzQFB6zWVLj0nTOVtfQxiE/8BXia2Sf740kbyaldbCopM8qw7iAy80giEVU7yncJiMad9dLmzX+IHjcmoVC3JJiD2FJRmdpeMUWzN7W3BUusCgZNzsgj0zrjClYbum6itT5hzTKVCz3z9fCDC5GgQHnIJeCzCGLNSyXxE2ykwEKnT90Nmxq2IBXsOsgUsADMQcm9XmKjti32tkvMvD6djW+FZ51zGRtGTTukx68+GdMDI+2yQOIInFKtilbDchiE1x2S/3IYOg6XUAxMoNOE8Y1NeFz4F4ORY/BNegnxnialLokqjkXzd1s1VUpkFVfDsnvenseb4Fp7+uQOdseO3Tk/3GcPVHKqaxy0y0udetHlPVTGrkp914EclsLzHzuJXIVhdEFh+HuFenp6HTjEOu9UZPYN&lt;/diagram&gt;&lt;/mxfile&gt;\">\u003Cdefs/>\u003Cg>\u003Cg data-cell-id=\"0\">\u003Cg data-cell-id=\"1\">\u003Cg data-cell-id=\"2\">\u003Cg>\u003Crect x=\"0\" y=\"0\" width=\"120\" height=\"60\" fill=\"#e1d5e7\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 30px; margin-left: 1px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Logo\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"60\" y=\"34\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">Logo\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"3\">\u003Cg>\u003Crect x=\"130\" y=\"0\" width=\"320\" height=\"60\" fill=\"#e1d5e7\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 318px; height: 1px; padding-top: 30px; margin-left: 131px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Bandeau\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"290\" y=\"34\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">Bandeau\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"4\">\u003Cg>\u003Crect x=\"0\" y=\"70\" width=\"120\" height=\"170\" fill=\"#e1d5e7\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 155px; margin-left: 1px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Menu\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"60\" y=\"159\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">Menu\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"5\">\u003Cg>\u003Crect x=\"130\" y=\"110\" width=\"320\" height=\"130\" fill=\"#e1d5e7\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 318px; height: 1px; padding-top: 175px; margin-left: 131px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Présentation du produit\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"290\" y=\"179\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">Présentation du produit\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"6\">\u003Cg>\u003Crect x=\"130\" y=\"70\" width=\"320\" height=\"30\" fill=\"#e1d5e7\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 318px; height: 1px; padding-top: 85px; margin-left: 131px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Fil d'ariane\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"290\" y=\"89\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">Fil d'ariane\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003Cg data-cell-id=\"7\">\u003Cg>\u003Crect x=\"0\" y=\"250\" width=\"450\" height=\"40\" fill=\"#e1d5e7\" stroke=\"none\" pointer-events=\"all\"/>\u003C/g>\u003Cg>\u003Cg transform=\"translate(-0.5 -0.5)\">\u003Cswitch>\u003CforeignObject pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\" style=\"overflow: visible; text-align: left;\">\u003Cdiv xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 448px; height: 1px; padding-top: 270px; margin-left: 1px;\">\u003Cdiv data-drawio-colors=\"color: rgb(0, 0, 0); \" style=\"box-sizing: border-box; font-size: 0px; text-align: center;\">\u003Cdiv style=\"display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;\">Footer\u003C/div>\u003C/div>\u003C/div>\u003C/foreignObject>\u003Ctext x=\"225\" y=\"274\" fill=\"rgb(0, 0, 0)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">Footer\u003C/text>\u003C/switch>\u003C/g>\u003C/g>\u003C/g>\u003C/g>\u003C/g>\u003C/g>\u003Cswitch>\u003Cg requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\"/>\u003Ca transform=\"translate(0,-5)\" xlink:href=\"https://www.drawio.com/doc/faq/svg-export-text-problems\" target=\"_blank\">\u003Ctext text-anchor=\"middle\" font-size=\"10px\" x=\"50%\" y=\"100%\">Text is not SVG - cannot display\u003C/text>\u003C/a>\u003C/switch>\u003C/svg>","type":"application/vnd.drawio","modified":"20241018112157376","title":"$:/diagram/zoning"},
2769{"created":"20240318150100841","text":"\u003C$viz text=' digraph { \nsize=\"6,6\";\nrankdir = \"\"\nsplines=line\n\n{rank=same d c  } \n\ne -> d  [style=dashed; penwidth=0.75]\nd -> r  [style=dashed; penwidth=0.75]\nl -> d  [style=dashed; penwidth=0.75]\n;   \na -> c \nb -> c;\na [label=\"Induction \\n(Raisonnement \\n probabiliste)\"; shape = circle; style=filled; color=\"#e5f01d\" ; fontsize  = 10;] ;\nb [label=\"Déduction \\n (Raisonnement \\n logique)\"; shape = circle ; style=filled ; color=\"#e5f01d\" ; fontsize=10; ] ;\nc [label=\"Apprentissage \\n (Inférence)\";
2769 shape = circle, style=filled , color=\"#aaaaaa\" ;            URL = \"./#Apprentissage\" ;   fontsize  = 14;] ;\nl [label=\"Données \\n déja labelisées \\n\", \n\t\tcolor=\"#aaaaaa\" ;    \nshape = \"box\" ;  fontsize  = 10;] ;\ne [label=\"Entrée \\n de données\\n nouvelles\", \n\t\tcolor=\"#aaaaaa\" ;   \nshape = \"box\" ;          \n        fontsize  = 10;] ;\nr [label=\"Prédiction \\n d un résultat \\n (Classement, \\n Score, Test ...) \",\nshape = \"box\" ;  color=\"#aaaaaa\" ;    fontsize  = 10;] \nd [label=\"Apprentissage \\n automatique\", shape = circle; style=filled ; color=\"#e0b115\" ;  URL = \"#Apprentissage%20automatique\" ;  fontsize  = 14;] ;\n }  ' />\n\n","tags":"","title":"$:/diagrammes/apprentissage","modified":"20241108180416029"},
2770{"created":"20240318131857042","text":"\u003C$viz text='\n\ndigraph {\n size=\"8,8\";\n         node [shape=circle; style=filled ]\n         edge [color=black, fontsize=10, forcelabels=false ]\n         edge [penwidth=2.75,arrowsize=1.0]\n          rankdir=\"RL\";\n\na1 -> a\na2 -> a\na3 -> a\na5 -> a\nsubgraph cluster_0 {\n         style=invisible;\n\nc1->a2 [style=dashed; penwidth=0.75]\nc2->a2 [style=dashed; penwidth=0.75]\n c3->a2 [style=dashed; penwidth=0.75]\n\n } \n\nsubgraph cluster_1 {\n         style=invisible;\n\nc4->a1 [style=dashed; penwidth=0.75]\nc5->a1 [style=dashed; penwidth=0.75]\nc6->a1 [style=dashed; penwidth=0.75]\n } \n\nsubgraph cluster_2 {\n         style=invisible;\n{rank=same \na4 -> a3\n }\n\nc7->a3 [style=dashed; penwidth=0.75]\nc8->a3 [style=dashed; penwidth=0.75]\nc9->a3 [style=dashed; penwidth=0.75]\nc10->a3 [style=dashed; penwidth=0.75]\nc11->a3 [style=dashed; penwidth=0.75]\n\n } \na [label=\"Apprentissage \\n automatique\"; \n\tfillcolor=\"#e0b115\" ;            \n        URL = \"#Apprentissage%20automatique\" ;            \n        fontsize  = 20;\n        ]\n\n\na1 [label=\"Apprentissage \\n par renforcement\"; \nURL = \"#Apprentissage%20par%20renforcement\" ;\n        fillcolor=\"#e5f01d\" ;           \n        fontsize  = 14;] ;\n\na2 [label=\"Apprentissage \\n supervisé\";  \n        fillcolor=\"#e5f01d\" ;   \n        URL = \"#Apprentissage%20supervisé\" ;            \n        fontsize  = 14;] ;\n\n\na3 [label=\"Apprentissage \\n non supervisé\";\n\tfillcolor=\"#e5f01d\" ;            \n        URL = \"#Apprentissage%20non%20supervisé\" ;            \n        fontsize  = 14;] ;\na4 [label=\"Apprentissage \\n auto supervisé\"; \n\tcolor=\"#e6f0b8\" ;     \n URL = \"#Apprentissage%20auto-supervisé\" ;       \n        fontsize  = 14;] ;\na5 [label=\"Apprentissage \\n continu\";\n\tcolor=\"#e6f0b8\" ;                \n        URL = \"#Apprentissage%20continu\" ;            \n        fontsize  = 14;] ;\n\n\n\nc1 [label=\"Classification \\n d images\";    style=\"filled,dashed\"; \n        color=\"#090909\" ;  \n        shape = box;      \n        fillcolor=lightgray ;     \n        fontsize  = 12;] ;\nc2 [label=\"Détection \\n de fraude\";    style=\"filled,dashed\"; \n        color=\"#090909\" ;  \n        shape = box;      \n        fillcolor=lightgray ;     \n        fontsize  = 12;] ;       \nc3 [label=\"Prévisions \\n météorologiques\";    style=\"filled,dashed\"; \n        color=\"#090909\" ;  \n        shape = box;      \n        fillcolor=lightgray ;     \n        fontsize  = 12;] ;       \nc4 [label=\"Décisions en \\n temps réel\";    style=\"filled,dashed\"; \n        color=\"#090909\" ;  \n        shape = box;      \n        fillcolor=lightgray ;     \n        fontsize  = 12;] ;       \nc5 [label=\"Apprentissage \\n des tâches\";    style=\"filled,dashed\"; \n        color=\"#090909\" ;  \n        shape = box;      \n        fillcolor=lightgray ;     \n        fontsize  = 12;] ;       \nc6 [label=\"Navigation \\n robotique\";    style=\"filled,dashed\"; \n        color=\"#090909\" ;  \n        shape = box;      \n        fillcolor=lightgray ;     \n        fontsize  = 12;] ;       \nc7 [label=\"Ciblage \\n marketing\";    style=\"filled,dashed\"; \n        color=\"#090909\" ;  \n        shape = box;      \n        fillcolor=lightgray ;     \n        fontsize  = 12;] ;       \nc8 [label=\"Système de  \\n recommandation\";    style=\"filled,dashed\"; \n        color=\"#090909\" ;  \n        shape = box;      \n        fillcolor=lightgray ;     \n        fontsize  = 12;] ;       \nc9 [label=\"Visualisation \\n de mégadonnées \\n (Big data)\";    style=\"filled,dashed\"; \n        color=\"#090909\" ;  \n        shape = box;      \n        fillcolor=lightgray ;     \n        fontsize  = 12;] ;     \nc10 [label=\"Compression \\n de données\";    style=\"filled,dashed\"; \n        color=\"#090909\" ;  \n        shape = box;      \n        fillcolor=lightgray ;     \n        fontsize  = 12;] ;     \nc11 [label=\"Systeme de \\n recommandation\";    style=\"filled,dashed\"; \n        color=\"#090909\" ;  \n        shape = box;      \n        fillcolor=lightgray ;     \n        fontsize  = 12;] ;     \nc11 [label=\"Prédiction \\n (population, etc.)\";    style=\"filled,dashed\"; \n        color=\"#090909\" ;  \n        shape = box;      \n        fillcolor=lightgray ;     \n        fontsize  = 12;] ;     \n\n } \n' class=\"apprentissage\"/>","tags":"","title":"$:/diagrammes/apprentissage_automatique","modified":"20240323190612156"},
2771{"created":"20240319103112904","text":"\u003C$viz text='\n\ndigraph {\n size=\"6,6\";\n         node [shape=circle; style=filled ]\n         edge [color=black, fontsize=10, forcelabels=false ]\n         edge [penwidth=2.75,arrowsize=1.0]\n          rankdir=\"LR\";\n\n{rank=same a10 a11  }
2771 \n{rank=same \na4 -> a3\n }\na10-> a3\na11-> a3\n\na3 -> a\n\n\n\nsubgraph cluster_2 {\n         style=invisible;\n\nc10-> a10  [style=dashed; penwidth=0.75]\nc7->a11 [style=dashed; penwidth=0.75]\nc8->a11 [style=dashed; penwidth=0.75]\nc9->a10 [style=dashed; penwidth=0.75]\n\n } \na [label=\"Apprentissage \\n automatique\"; \n\tfillcolor=\"#e0b115\" ;            \n        URL = \"#Apprentissage%20automatique\" ;            \n        fontsize  = 20;\n        ]\n\n\na3 [label=\"Apprentissage \\n non supervisé\";\n\tfillcolor=\"#e5f01d\" ;            \n        URL = \"#Apprentissage%20non%20supervisé\" ;            \n        fontsize  = 14;] ;\na4 [label=\"Apprentissage \\n auto supervisé\"; \n  URL = \"#Apprentissage%20auto-supervisé\" ;   \n\tcolor=\"#e6f0b8\" ;            \n        fontsize  = 14;] ;\n\n   \nc7 [label=\"Ciblage \\n marketing\";    style=\"filled,dashed\"; \n        color=\"#090909\" ;  \n        shape = box;      \n        fillcolor=lightgray ;     \n        fontsize  = 12;] ;       \nc8 [label=\"Système de  \\n recommandation\";    style=\"filled,dashed\"; \n        color=\"#090909\" ;  \n        shape = box;      \n        fillcolor=lightgray ;     \n        fontsize  = 12;] ;       \nc9 [label=\"Visualisation \\n BigData\";    style=\"filled,dashed\"; \n        color=\"#090909\" ;  \n        shape = box;      \n        fillcolor=lightgray ;     \n        fontsize  = 12;] ;     \nc10 [label=\"Compresssion \\n de données\";    style=\"filled,dashed\"; \n        color=\"#090909\" ;  \n        shape = box;      \n        fillcolor=lightgray ;     \n        fontsize  = 12;] ;      \n\na10 [label=\"Réduction de \\n dimension\"\n  URL = \"#Réduction%20de%20dimension\";\n        fillcolor=white;   \n        fontsize  = 12;] ;      \n\na11 [label=\"Regroupement\"\n  URL = \"#Regroupement\";\n        fillcolor=white;   \n        fontsize  = 12;] ;      \n\n } \n' class=\"myexample\"/>","tags":"","title":"$:/diagrammes/apprentissage_non_supervise","modified":"20240325123015216"},
2772{"created":"20240318145751310","text":"\u003C$viz text='\n\ndigraph G {\ngraph [size=\"10,10\"];\nnode [label=\"\\N\"];\n\nsubgraph cluster_racine {\n\tgraph [ \n\t\tstyle=filled ;\n\t\tcolor=lightgrey ;\n            margin=15 ;\n            label=\"Intelligence Artificielle\" ;\n            URL = \"#Apprentissage%20profond\" ;\n            fontsize  = 18;\n            ] \n\nsubgraph cluster_branche_ {\n\tgraph [ \tstyle=filled ;\n\t\tcolor=\"#e0b115\" ;\n            margin=16 \n            label=\"Apprentissage \\n automatique (ML)\"\n            URL = \"#Apprentissage%20automatique\" ;\n            fontsize  = 15\n            ] \n\n\nsubgraph cluster_branche_ {\n\tgraph [ \tstyle=filled ;\n\t\tcolor=\"#fbda88\" ;\n            margin=15 \n            label=\"Apprentissage \\n profond\"\n            URL = \"#Apprentissage%20profond\" ;\n            fontsize  = 12\n            ] \n\n\n\n\tx0 [ label=\"\"\n         fontsize  = 5\n         style=invisible ;\n        ]\n\n\n      }\n    }\n  }\n}\n\n' class=\"myexample\"/>","tags":"","title":"$:/diagrammes/apprentissage_profond","modified":"20240319132152532"},
2773{"created":"20240323160506321","text":"\u003C$viz text='\n\ndigraph G {\ngraph [size=\"4,4\"];\nnode [label=\"\\N\" ; shape=\"circle\";  style=\"filled\"];\n  rankdir=\"LR\";               \n\n{rank = same a a1}\n{rank = same c4 c5 c6}\na1->a\n\nsubgraph cluster_0 {\n         style=invisible;\n\nc4->a1 [style=dashed; penwidth=0.75]\nc5->a1 [style=dashed; penwidth=0.75]\nc6->a1 [style=dashed; penwidth=0.75]\n } \n\n\na [label=\"Apprentissage \\n automatique\"; \n\tfillcolor=\"#e0b115\" ;            \n        URL = \"#Apprentissage%20automatique\" ;            \n        fontsize  = 20;\n        ]\na1 [label=\"Apprentissage \\n par renforcement\"; \n  URL = \"#Apprentissage%20par%20renforcement\" ;\n        fillcolor=\"#e5f01d\" ;           \n        fontsize  = 14;] ;\nc4 [label=\"Décisions en \\n temps réel\";    style=\"filled,dashed\"; \n        color=\"#090909\" ;  \n        shape = box;      \n        fillcolor=lightgray ;     \n        fontsize  = 12;] ;       \nc5 [label=\"Apprentissage \\n des tâches\";    style=\"filled,dashed\"; \n        color=\"#090909\" ;  \n        shape = box;      \n        fillcolor=lightgray ;     \n        fontsize  = 12;] ;       \nc6 [label=\"Navigation \\n robotique\";    style=\"filled,dashed\"; \n        color=\"#090909\" ;  \n        shape = box;      \n        fillcolor=lightgray ;     \n        fontsize  = 12;] ;       \n          }  ' />","tags":"","title":"$:/diagrammes/apprentissage_renforcement_fig1","modified":"20241014155425178"},
2774{"created":"20240319105658011","text":"\u003C$viz text='\n\ndigraph {\n size=\"8,8\";\n         node [shape=circle; style=filled ]\n         edge [color=black, fontsize=10, forcelabels=false ]\n         edge [penwidth=2.75,arrowsize=1.0]\n          rankdir=\"RL\";\n\n{rank=same  a20 ; a21 }\n\na2 -> a\na20 -> a2\na21 -> a2 \n\nsubgraph cluster_0 {\n         style=invisible;\n{rank=same  c9 , c10 }\n\nc1->
2774a20 [style=dashed; penwidth=0.75]\nc2->a20 [style=dashed; penwidth=0.75]\n c3->a21 [style=dashed; penwidth=0.75]\n c4->a20 \n c4->a21 \n c5->a21 [style=dashed; penwidth=0.75]\nc6->a20 [style=dashed; penwidth=0.75]\nc7->a20 [style=dashed; penwidth=0.75]\nc8->a21\nc8->a20 \nc9->a21\nc10->a21 \n\n } \n\n\n\na [label=\"Apprentissage \\n automatique\"; \n\tfillcolor=\"#e0b115\" ;            \n        URL = \"#Apprentissage%20automatique\" ;            \n        fontsize  = 20;\n        ]\n\n\na2 [label=\"Apprentissage \\n supervisé\";  \n        fillcolor=\"#e5f01d\" ;   \n        URL = \"#Apprentissage%20supervisé\" ;            \n        fontsize  = 16;] ;\n\n\na20 [label=\"Classement\"\n        fillcolor=white;   \n       URL = \"#Classification\" ;  \n        fontsize  = 14;] ;      \na21 [label=\"Regréssion\"\n         URL = \"#Régression\" ;  \n        fillcolor=white;   \n        fontsize  = 14;] ;      \n\n\nc1 [label=\"Classification \\n d images\";    style=\"filled,dashed\"; \n        color=\"#090909\" ;  \n        shape = box;      \n        fillcolor=lightgray ;     \n        fontsize  = 12;] ;\nc2 [label=\"Détection \\n de fraude\";    style=\"filled,dashed\"; \n        color=\"#090909\" ;  \n        shape = box;      \n        fillcolor=lightgray ;     \n        fontsize  = 12;] ;       \nc3 [label=\"Prévisions \\n météorologiques, marchés, etc.\";    style=\"filled,dashed\"; \n        color=\"#090909\" ;  \n        shape = box;      \n        fillcolor=lightgray ;     \n        fontsize  = 12;] ;       \nc4 [label=\"Arbres de \\n décision\";    style=\"filled\"; \n       color=\"#e6f0b8\" ;  \n       URL = \"#Arbres de décision\" ;  \n        shape = circle;      \n        fillcolor=\"#e5f01d\" ;     \n        fontsize  = 12;] ;       \nc5 [label=\"Prédiction \\n (population, etc...) etc.\";    style=\"filled,dashed\"; \n        color=\"#090909\" ;  \n        shape = box;      \n        fillcolor=lightgray ;     \n        fontsize  = 12;] ;       \nc6 [label=\"Reconnaissance \\n de formes\";    style=\"filled,dashed\"; \n        color=\"#090909\" ;  \n        shape = box;      \n        fillcolor=lightgray ;     \n        fontsize  = 12;] ;    \nc7 [label=\"Diagnostiques\";    style=\"filled,dashed\"; \n        color=\"#090909\" ;  \n        shape = box;      \n        fillcolor=lightgray ;     \n        fontsize  = 12;] ;      \nc8 [label=\"Réseau de \\n neurones \\n artificiels\";    style=\"filled\";
2774 \nURL = \"#R%C3%A9seau%20de%20neurones%20artificiels\" ;\n       color=\"#e6f0b8\" ;  \n        shape = circle;      \n        fillcolor=\"#e5f01d\" ;   \n        fontsize  = 12;] ;        \n\nc9 [label=\"Régression \\n linéaire\";    style=\"filled\"; \nURL = \"#Modèles de régression\" ;\n       color=\"#e6f0b8\" ;  \n        shape = circle;      \n        fillcolor=\"#e5f01d\" ;   \n        fontsize  = 12;] ;     \n\nc10 [label=\"Régression \\n logistique\";    style=\"filled\"; \nURL = \"#Modèles de régression\" ;\n       color=\"#e6f0b8\" ;  \n        shape = circle;      \n        fillcolor=\"#e5f01d\" ;   \n        fontsize  = 12;] ;     \n\n } \n' class=\"myexample\"/>","tags":"","title":"$:/diagrammes/apprentissage_supervise","modified":"20241014155240480"},
2775{"created":"20240323114637505","text":"\u003C$viz text='\n\ndigraph {\n         size=\"6,6\";\n         node [shape=circle; style=filled ]\n         edge [color=black, fontsize=10, \n         forcelabels=false ]\n         edge [penwidth=.75,arrowsize=0.5]\n        ;\n        f->r1\n        f->f2\n        \nf  [label=\"Fonction \\n de décision\"; \n\tfillcolor=\"#ffffff\" ;            \n        fontsize  = 10;\n        ]\n\nf2  [label=\"Retour \\n positif \"; \n\tfillcolor=\"#ffffff\" ;            \n      shape = box;             \n        fontsize  = 10;\n        ]\n\nr1  [label=\"Retour \\n négatif \"; \n\t   fillcolor=lightgray ;                \n        color=\"#090909\" ;  \n        shape = box;                 \n        fontsize  = 10;\n        ]\n\n\n } \n' class=\"myexample\"/>","tags":"","title":"$:/diagrammes/arbres_decision/fig1","modified":"20241014154704459"},
2776{"created":"20240323120743376","text":"\u003C$viz text='\n\ndigraph {\n         size=\"6,6\";\n         node [shape=circle; style=filled ]\n         edge [color=black, fontsize=10, \n         forcelabels=false ]\n         edge [penwidth=.75,arrowsize=0.5]\n        ;\n        f->r1\n        f->f2\n        f2->r2\n        f2->r3\n\nf  [label=\"A \u003C 20\"; \n\tfillcolor=\"#ffffff\" ;            \n        fontsize  = 10;\n        ]\n\nf2  [label=\"B \u003C 90 \"; \n\tfillcolor=\"#ffffff\" ;            \n            \n        fontsize  = 10;\n        ]\n\nr1  [label=\"poids : 2\"; \n\t   fillcolor=lightgray ;                \n        color=\"#090909\" ;  \n        shape = box;                 \n        fontsize  = 10;\n        ]\nr2  [label=\"poids : 4\"; \n\t   fillcolor=lightgray ;                \n        color=\"#090909\" ;  \n        shape = box;                 \n        fontsize  = 10;\n        ]\n\nr3  [label=\"poids : 6\"; \n\t   fillcolor=lightgray ;                \n        color=\"#090909\" ;  \n        shape = box;                 \n        fontsize  = 10;\n        ]\n\n\n } \n' class=\"myexample\"/>","tags":"","title":"$:/diagrammes/arbres_decision/fig2","modified":"20240323121118013"},
2777{"created":"20240323131438029","text":"\u003C$viz text='\n\ndigraph {\n size=\"6,6\";\n         node [shape=circle; style=filled ]\n         edge [color=black, fontsize=10,  ]\n         edge [penwidth=2.75,arrowsize=1.0]\n       ;\n\n{rank=same F1 F2 }\n\nF1->R1\nF1->R2\nF2->R3\nF2->R4\n\n\nF3->R5\nF3->R6\n\nF1 [ fillcolor= white , label= \" x \u003C 2\"]\nF2 [ fillcolor= white , label= \"x \u003C 3\"]\nF3 [ fillcolor= white , label= \"x \u003C 4\"]\n\nR1 [ shape=\"box\", label=\"poids : 8\"]\nR2 [ shape=\"box\", label=\"poids : 9\"]\nR3[ shape=\"box\" ,label=\"poids : -6\"]\nR4[ shape=\"box\", label=\"poids : -5\"]\nR5[ shape=\"box\", label=\"poids : -1\"]\nR6[ shape=\"box\", label=\"poids : 0\"]\n\n\n\n } \n' class=\"myexample\"/>","tags":"","title":"$:/diagrammes/arbres_decision/fig3","modified":"20240323133925907"},
2778{"created":"20241014154327830","text":"Un  JSON est essentiellement un tree graph, soit un [[arbre|$:/doc/graph/arbre]] :\n\n\u003C$viz text=' digraph { \nsize=\"5,5\";\nrankdir = \"LR\"\nsplines=line\n\na -> b [label=\"Livre\"]\na [label=\"Freud\"; shape = circle; style=filled; color=\"#e5f01d\" ;]\nb [label=\"Abrégé de \\n psychanalyse\"; shape = circle; style=filled; color=\"#e0b115\" ;]\n\n }  ' />\n\n```json\n{ \n   \"id\": 1, \n   \"type\": \"auteur\", \n   \"name\": \"Freud\", \n   \"Livre\": [{ \n      \"type\": \"livre\", \n      \"id\": 1, \n      \"producer\": \"maison d'edition\", \n      \"title\": \"Abrégé de psychanalyse\" \n   }] \n}\n```\n\nOn peut exploiter la procédure `apoc.graph.fromDocument`  afin de transformer n'importe quelle donnée JSON en graphe.\n\nCe principe peut être exploiter avec une base [[MongoDB|$:/doc/MongoDB]]\n\nPour aller plus loin :\n\n*  [[Transformer automatiqueemnt les collections MongoDB en graphes|https://medium.com/neo4j/transform-mongodb-collections-automagically-into-graphs-9ea085d6e3ef]]\n* [[https://community.neo4j.com/t/integrate-or-migrate-data-from-mongo-db-to-neo4j/33522/5]]\n* [[https://neo4j.com/labs/apoc/4.0/database-integration/mongodb/]]","tags":"","title":"$:/diagrammes/arbres/fig1","modified":"20241014161229569"},
2779{"created":"20240318145942232","text":"\u003C$viz text='\n\ndigraph G {\ngraph [size=\"6,4\"];\nnode [label=\"\\N\"];\n\nsubgraph cluster_racine {\n\tgraph [ \n\t\tstyle=filled ;\n\t\tcolor=lightgrey ;\n            margin=15 ;\n            label=\"Intelligence Artificielle\" ;\n            URL = \"#Apprentissage%20profond\" ;\n            fontsize  = 20;\n            ] \n\nx [label=\" Systeme \\n expert\" ;\n        fillcolor=lightgrey ;   \n\t     shape=\"circle\" ;\n\tstyle=filled ;\n   URL = \"#Les%20systemes%20experts\" ;\n         fontsize  = 12\n]\n;\nsubgraph cluster_branche_ {\n\tgraph [ \tstyle=filled ;\n\t\tcolor=\"#e0b115\" ;\n            margin=16 \n            label=\"Apprentissage \\n automatique (ML)\"\n            URL = \"#Apprentissage%20automatique\" ;\n            fontsize  = 18\n            ] \n\tx1 [ label=\" Autres \\n modèles \\n de ML\" ;
2779\n        fillcolor=\"#e5f01d\" ;   \n\t     shape=\"circle\" ;\n\tstyle=filled ;\n         fontsize  = 12]\n         ;\n\nsubgraph cluster_branche_ {\n\tgraph [ \tstyle=filled ;\n\t\tcolor=\"#fbda88\" ;\n            margin=15 \n            label=\"Apprentissage \\n profond\"\n            URL = \"#Apprentissage%20profond\" ;\n            fontsize  = 14\n            ] \n\n\tx0 [ label=\"Réseaux de \\n neurones \\n artificiels\" ;\n     URL = \"#R%C3%A9seau%20de%20neurones%20artificiels\" ;\n\t     shape=\"circle\" ;\n\tstyle=filled ;\n        fillcolor=\"#e5f01d\" ;   \n         fontsize  = 12\n         ;\n        ]\n\n\n      }\n    }\n  }\n}\n\n' class=\"myexample\"/>","tags":"","title":"$:/diagrammes/intelligence_artificielle","modified":"20240331131637793"},
2780{"created":"20240323160002838","text":"\u003C$viz text='\n\ndigraph G {\ngraph [size=\"5,5\"];\nnode [label=\"\\N\"];\n          rankdir=\"LR\";\n\na20 [label=\"Classement\"\n        fillcolor=white;   \n\tstyle=filled ;\nshape=\"circle\";\n       URL = \"#Classification\" ;  \n        fontsize  = 14;] ;      \na21 [label=\"Regréssion\" ;\n      shape=\"circle\";\n\tstyle=filled ;\n         URL = \"#Régression\" ;  \n        fillcolor=white;   \n        fontsize  = 14;] ;      \n\nsubgraph cluster_racine {\n\tgraph [ \n\t\tstyle=filled ;\n\t\tcolor=lightgrey ;\n            margin=15 ;\n            label=\"Intelligence Artificielle\" ;\n            URL = \"#Apprentissage%20profond\" ;\n            fontsize  = 20;\n            ] \n\nsubgraph cluster_branche_ {\n\tgraph [ \tstyle=filled ;\n\t\tcolor=\"#e0b115\" ;\n            margin=16 \n            label=\"Apprentissage \\n automatique (ML)\"\n            URL = \"#Apprentissage%20automatique\" ;\n            fontsize  = 18\n            ] \n\n\nsubgraph cluster_branche_ {\n\tgraph [ \tstyle=filled ;\n\t\tcolor=\"#fbda88\" ;\n            margin=15 \n            label=\"Apprentissage \\n profond\"\n            URL = \"#Apprentissage%20profond\" ;\n            fontsize  = 14\n            ] \n\tx0 [ label=\"Réseaux de \\n neurones \\n artificiels\" ;
2780\n     URL = \"#R%C3%A9seau%20de%20neurones%20artificiels\" ;\n\t     shape=\"circle\" ;\n\tstyle=filled ;\n        fillcolor=\"#e5f01d\" ;   \n         fontsize  = 12\n         ;\n        ]\n\n      }\n\n\n    }\n\n  }\n\na20-> c1\na20-> c2\n\na21 -> c5\na21-> c3\n\nx0->a20 \nx0->a21 \n\n\n\nc1 [label=\"Détection \\n de fraude\";    style=\"filled,dashed\"; \n        color=\"#090909\" ;  \n        shape = box;      \n        fillcolor=lightgray ;     \n        fontsize  = 12;] ;\nc2 [label=\"Reconnaissance \\n de formes\";    style=\"filled,dashed\"; \n        color=\"#090909\" ;  \n        shape = box;      \n        fillcolor=lightgray ;     \n        fontsize  = 12;] ;      \n\nc3 [label=\"Prévisions \\n météorologiques, \\n marchés, etc.\";    style=\"filled,dashed\"; \n        color=\"#090909\" ;  \n        shape = box;      \n        fillcolor=lightgray ;     \n        fontsize  = 12;] ;       \n \nc5 [label=\"Prédiction \\n (population, etc...)\";    style=\"filled,dashed\"; \n        color=\"#090909\" ;  \n        shape = box;      \n        fillcolor=lightgray ;     \n        fontsize  = 12;] ;  \n}\n\n' class=\"myexample\"/>","tags":"","title":"$:/diagrammes/reseau_neuronaux_artificiel_fig1","modified":"20240323164432512"},
2781{"created":"20240828070605693","text":"# Accessibilité : les points essentiels à retenir\n\n## Structure de page et sémantique\n\n\n- [ ]  Penser au `DOCTYPE`.\n- [ ]  Indiquer la langue principale de la page avec l'attribut `lang` sur la balise `\u003Chtml>`.\n- [ ]  Indiquer les changements de langue avec l'attribut `lang` sur les balises qui contiennent des textes qui ne sont pas dans la langue principale.\n- [x]  Mettre un `\u003Ctitle>` pertinent sur chaque page (nom de la page et nom du site).\n- [ ] Chaque `\u003Ctitle>` doit être unique.\n- [ ]  Mettre en place une structure de titres (`\u003Ch1>`, `\u003Ch2>`...) logique et complète.\n- [x] Structurer les zones de la page avec les bonnes balises sémantiques (`\u003Cheader>`, etc.) ou en utilisant les attributs role associés (`role=\"banner\"`, etc.).\n- [ ]  Structurer les listes avec les balises appropriées (`\u003Cul>\u003Cli>` ou `\u003Col>\u003Cli>`).\n- [ ]  Structurer les citations avec les balises `\u003Cblockquote>` ou `\u003Cq>`.\n- [x]  Ecrire un code HTML valide (cf. le validateur du W3C).\n\n## Images\n\n- Se demander si l'image est informative, décorative ou image-lien.\n- Pour les images intégrées avec des balises `\u003Cimg>`:\n    - [ ]  Décorative : `\u003Cimg alt=\"\">`\n    - [x]  Informative : `\u003Cimg alt=\"Information contenue dans l'image\">`\n    - [ ]  Image-lien : `\u003Cimg alt=\"Destination du lien\">`\n- Pour les images intégrées avec des balises `\u003Csvg>` :\n    - [ ] Décorative : `\u003Csvg aria-hidden=\"true\" focusable=\"false\">\u003C/svg>`\n   - [ ]  Informative : `\u003Csvg aria-label=\"Information contenue dans l'image\" role=\"img\" focusable=\"false\">\u003C/svg>`\n   - [ ]  Image-lien : `\u003Csvg aria-label=\"Destination du lien\" role=\"img\" focusable=\"false\">\u003C/svg>`\n- Pour les images intégrées avec des polices d'icones (`\u003Ci>`) :\n   - [ ]  Décorative : `\u003Ci aria-hidden=\"true\">\u003C/i>`\n   - [ ]  Informative : `\u003Ci aria-hidden=\"true\">\u003C/i>\u003Cspan class=\"sr-only\">Information contenue dans l'icone\u003C/span>`\n    - [ ]  Image-lien : `\u003Ci aria-hidden=\"true\">\u003C/i>\u003Cspan class=\"sr-only\">Destination du lien\u003C/span>`\n\n- [ ] : la classe `.sr-only` doit être créée si elle n'existe pas encore dans le projet. Elle sert à masquer le texte visuellement tout en le laissant accessible aux lecteurs d'écran. Dans certains projets, elle peut aussi s'appeler `.assistive-text`, `.accessible-text`, `.visually-hidden`...\nExemple de classe `.sr-only` : [[https://codepen.io/jeanne-a11y/pen/PodGYyd]]\n\n- [ ]  Pour les images qui ont besoin d'une description détaillée (graphiques...) indiquer dans l'alternative de l'image une description courte et où trouver la description détaillée. Ajouter la description détaillée à proximité de l'image sous une forme accessible (en texte HTML).\n- [ ]  Pour les images légendées, utiliser les balises `\u003Cfigure>` et `\u003Cfigcaption>`.\n\n## Navigation, liens et boutons\n\n- [ ]  Vérifier la présence de 2 moyens de navigation parmi les 3 possibles :\n    - Menu\n    - Recherche globale\n    - Plan du site\n- [ ]  Structurer chaque menu de navigation avec une balise `\u003Cnav>` (ou avec le `role=\"navigation\"`) et ajouter un attribut `aria-label` pour donner un nom à chaque menu.\n- [ ]  Structurer les menus dans des listes (`\u003Cul>\u003Cli>`). Lorsqu'il y a plusieurs niveaux, attention à bien imbriquer les listes.\n- [x] Ajouter un attribut `aria-current=\"true\"` ou `aria-current=\"page\"` sur l'élément courant dans le menu.\n- [x]  Les liens et les boutons doivent être explicites. Un intitulé trop générique ne permet pas de connaître la destination du lien (par exemple : \"Lire la suite\", \"En savoir plus\"...). Pour rendre un lien explicite, utiliser l'attribut `aria-label` (ou `title`). **Cet attribut doit reprendre l'intitulé visible du lien**, puis le compléter. Exemple : `\u003Ca href=\"#\" aria-label=\"En savoir plus : La migration des hirondelles\">
2781En savoir plus\u003C/a>`\n- [ ]  Bien faire la différence entre liens et boutons :\n    - Lien : navigation vers une autre page ou une zone de la page\n    - Bouton : action dans la page\n- Dans les liens de téléchargement de fichiers, c'est une bonne pratique d'indiquer le poids et le format du fichier.\n- [ ]  Différencier visuellement les liens qui sont dans des paragraphes de texte grâce au soulignement.\n\n## Navigation au clavier\n\n- [x]  Mettre en place un lien d'évitement permettant d'accéder directement à la zone de contenu principal. Ce lien doit être le premier élément tabulable dans la page.\n- [x]  S'assurer de la visibilité du focus (en particulier, pas masquer l'outline avec `outline: none;`).\n- Ne jamais utiliser de tabindex positifs (seulement `tabindex=\"0\"`) pour rendre un élément tabulable.\n-  S'assurer qu'il n'y ait pas de piège au clavier.\n\n- [ ]  S'assurer que chaque élément interactif puisse être atteint et activé au clavier. Pour cela, penser à utiliser les balises appropriées (`\u003Ca>` ou `\u003Cbutton>`).\n- [x]  Faire en sorte que l'ordre de tabulation soit logique (de haut en bas et de gauche à droite le plus souvent). Pour cela, il suffit de mettre les éléments dans le bon ordre dans le HTML.\n\n## Polices et styles\n\n- [ ]  S'assurer que le site s'affiche correctement jusqu'à un zoom de 200%. Pour cela, utiliser notamment des unités relatives pour les tailles de textes (em ou rem) et pour toutes les tailles (%, vw, vh...) en général (largeur, padding, margin, etc.)\n- [ ]  S'assurer que les textes puissent être espacés par les utilisateurs sans perte ou chevauchement de contenus. Pour cela, ne pas fixer la hauteur des blocs.\n- Lorsque c'est possible, toujours préférer l'intégration de texte en HTML/CSS plutôt que dans des images.\n- [ ]  S'assurer que les textes alternatifs des images restent lisibles quand les images ne s'affichent pas.\n- Ne pas obliger l'utilisateur à tourner son écran dans un sens ou dans l'autre.\n- [ ]  Ne pas faire porter de l'information par les CSS (par exemple : une image de fond avec du texte). Vérifier qu'il n'y a pas de perte d'information quand les CSS sont désactivés.\n- [ ]  Le site doit être responsive. On doit pouvoir réduire la taille de l'écran jusqu'à 320px de large sans scroll horizontal. Ne pas supprimer de contenus en version mobile.\n\n## Couleurs\n\n- [x]  Vérifier les contrastes entre les textes et leur arrière-plan.\n- [ ]  Vérifier les contrastes entre les éléments graphiques porteurs d'information et leur arrière-plan.\n- [ ]  Vérifier les contrastes entre les élément d'interface et leur arrière-plan (exemple : les bordures d'un champ).\n- L'information ne doit pas être portée uniquement par la couleur, la taille ou la position.\n\n## Formulaires\n\n- [x]  Relier chaque champ à son étiquette avec les attriuts `for=\"\"` et `id=\"\"`.\n- [ ]  Positionner les étiquettes à proximité des champs de formulaire.\n- Dans des cas très rares, un champ peut ne pas avoir d'étiquette visible (par exemple : champ de recherche). Dans ce cas, utiliser `title=\"\"` ou `aria-label` pour lui donner une étiquette.\n- [ ]  Utiliser `\u003Cfieldset>` pour regrouper :\n    - Les boutons radio\n    - Les checkbox\n    - Les champs qui se répètent (par exemple : adresse de livraison / adresse de facturation, participant 1 / participant 2...)\n- [ ]  Dans chaque `\u003Cfieldset>`, prévoir une balise `\u003Clegend>` (premier enfant direct du `\u003Cfieldset>`).\n- [ ]  Ajouter des attributs `autocomplete` pour tous les champs qui contiennent des données personnelles (voir la liste : https://developer.mozilla.org/fr/docs/Web/HTML/Attributes/autocomplete)\n- Pour les champs obligatoires :\n   - [x]  Ajouter `required` et `aria-required=\"true\"` sur la balise `\u003Cinput>` (ou `\u003Ctextarea>`, `\u003Cselect>`...)\n    - [x]  Ajouter une indication visuelle dans l'étiquette du champ. Si c'est une astérisque, ajouter une phrase explicative au début du formulaire.\n- Pour les champs qui ont un format spécifique à respecter :\n   - [ ] Indiquer le format attendu soit dans la balise `\u003Clabel>`, soit dans un texte relié au champ avec `aria-describedby`.\n- Pour les champs en erreur :\n   - [ ] Ajouter `aria-invalid=\"true\"` sur la balise `\u003Cinput>` (ou `\u003Ctextarea>`, `\u003Cselect>`...)\n   - [ ] Indiquer dans chaque message d'erreur la cause de l'erreur, le nom du champ en erreur, et si besoin redonner le format et/ou un exemple de valeur attendue.\n   - [ ] Relier le message d'erreur au champ correspondant avec `aria-describedby`. Il est possible de mettre plusieurs id dans le même attribut `aria-describedby`, on peut donc y mettre l'id du message d'erreur et de l'indication de format.\n- Ne pas utiliser `placeholder=\"\"` pour donner des informations (ni étiquette de champ, ni format attendu).\n\n## Tableaux\n\n- Se demander si le tableau est un tableau de données ou un tableau de mise en forme.\n- Tableau de mise en forme :\n    - `\u003Ctable role=\"presentation\">`\n    - Ne pas utiliser de balises `\u003Cthead>`, `\u003Cth>` et d'attributs `scope=\"\"`\n- Tableaux de données :\n    - [ ]  `\u003Cth scope=\"row\">` pour les en-têtes de lignes\n    - [ ]  `\u003Cth scope=\"col\">` pour les en-têtes de colonnes\n    - [ ]  Si le tableau a un titre et/ou une description, le mettre dans une balise `\u003Ccaption>`\n- Tableaux de données complexes :\n    - A éviter, essayer de simplifier pour obtenir des tableaux de données simples.\n    - Sinon, utiliser la technique des `headers=\"\"` et des `id=\"\"`.\n\n## Vidéos\n\n- Un texte (titre ou court paragraphe) doit introduire la vidéo et permettre de comprendre de quoi elle parle.\n- La vidéo doit disposer de :\n    - Sous-titres (si nécessaire).\n    - Audiodescription (si nécessaire).\n    - Transcription textuelle (si nécessaire).\n- [ ]  Le player doit fonctionner au clavier et avec un lecteur d'écran.\n- [ ]  Il doit être possible de contrôler la lecture et le son.\n\n## ARIA et composants d'interface riche\n\n- Règle n°1 : ne pas utiliser ARIA.\n- Les attributs `role=\"\"` servent à changer la sémantique de base d'un élément HTML. On les utilise principalement pour ajouter de la sémantique quand l'élément HTML n'existe pas. (Exemple : `role=\"tab\"`).\n- Les attributs `aria-*` apportent des informations supplémentaires sur les éléments, qui ne sont pas disponibles en HTML (exemple : champ invali
2781de, panneau déplié...)\n- ARIA ne change QUE la sémantique, pas le comportement ni l'apparence d'un élément.\n- [ ]  Les éléments non visibles à l'écran doivent être masqués avec `visibility: hidden;` ou `display: none;`\n- Pour les composants d'interface riche, il existe des patrons de conceptions (patterns) pour rendre ces composants accessibles grâce à ARIA. Ces recettes définissent :\n    - Les attributs ARIA à utiliser, et les valeurs à leur donner selon l'état du composant.\n    - Les comportements attendus au clavier et avec un lecteur d'écran.\n- Ces recettes nécessitent d'utiliser du Javascript. Elles doivent être absolument suivies pour s'assurer de l'accessibilité des composants.\n- Attention lorsqu'on choisit d'intégrer des composants d'interface venant d'une librairie tiers (par ex: bootstrap, daisyUi...etc) : bien vérifier que le composant choisi est accessible.\n\n\n## Pour ouvrir l’onglet Accessibilité dans le navigateur :\n\nDans une page web rendue, cliquez avec le bouton droit sur un élément, puis sélectionnez Inspecter. DevTools s’ouvre, avec l’outil Éléments sélectionné. ...\nDans l’arborescence DOM, cliquez sur l’élément que vous souhaitez inspecter. Vous pouvez utiliser les touches de direction pour parcourir l’arborescence DOM.\nCliquez sur l’onglet Accessibilité , à droite de l’onglet Styles . ...\n\n\nNota bene : sur linux, installer le navigateur lynk pour naviguer en ligne de commande sur le web.","tags":"$:/accessibilité","title":"$:/doc/Accessibilité","modified":"20241011122419370","type":"text/markdown"},
2782{"created":"20240827095622281","text":"__ASCII__\n\n> ASCII signifie American Standard Code for Information Interchange. Il s'agit d'un code de caractère à 7 bits où chaque bit individuel représente un caractère unique. \n>
2782 * La __table ASCII étendue__ basée sur le jeu de caractères Windows-1252 est une table ASCII 8 bits avec 256 caractères et symboles. Elle comprend tous les codes ASCII de la norme ASCII et constitue un sur-ensemble de la __norme ISO 8859-1__ en termes de caractères imprimables. Dans la plage 128 à 159 (hex 80 à 9F), ISO/IEC 8859-1 a des caractères de contrôle invisibles, tandis que Windows-1252 a des caractères inscriptibles. Windows-1252 est probablement le codage de caractères 8 bits le plus utilisé au monde.\n\n__Unicode__\n\n> Unicode est un standard informatique qui permet des échanges de textes dans différentes langues, à un niveau mondial. Il est développé par le Consortium Unicode, qui vise au codage de texte écrit en donnant à tout caractère de n'importe quel système d'écriture un nom et un identifiant numérique, et ce de manière unifiée, quelle que soit la plateforme informatique ou le logiciel utilisé.\n>Ce standard est lié à la __norme ISO/CEI 10646__ qui décrit une table de caractères équivalente. La dernière version, Unicode 15.1, a été publiée en septembre 20232.\n\n* Caractère spéciaux utiles :\n\n|Symbole|Code HTML|nom HTML|unicode| Description|\n|-|-|-|-|-|\n|•|&#149;|&bull|U+2022|Puce|\n|NBSP|&#160;|&nbsp|????|Espace insécable (NBSP)|\n\n[[https://www.ascii-code.com/fr]]\n","tags":"","title":"$:/doc/ACSII","modified":"20240828070330389","type":"text/markdown"},
2783{"created":"20240902203913920","text":"### 10 algorithmes habituellement utilisés pour tester les compétences javascript des developpeurs en entretien d'embauche\n\n1. Find the Symmetric Difference\n1. [[Inventory Update|$:/code/js/array/reduce/exo1]]\n1. No Repeats Please\n1. Pairwise\n1. Implement Bubble Sort\n1. Implement Selection Sort\n1. Implement Insertion Sort\n1. Implement Quick Sort\n1. Implement Merge Sort\n1. Implement Binary Search\n  ","tags":"","title":"$:/doc/algorithme","modified":"20240902215238539","type":"text/markdown"},
2784{"created":"20241018093156238","text":"## 🪶 Le serveur HTTP Apache 2 \n\n\n\n### Historique\n\nLe serveur HTTP Apache a été créé en 1995 par la [Apache Software Foundation](https://www.apache.org/) en tant que logiciel open-source, avec sa propre licence. Il est l'un de serveurs web les plus populaires. Depuis sa version 2, il a réussi à combler ses défauts qui faisaient de Nginx un meilleur choix à une époque.\n\n### Installation\n\nOn oublie pas de mettre à jour le système d'exploitation avant, si ce n'est pas déjà fait.\n\n> Mettre à jour le système d'exploitation avant toute nouvelle installation est une bonne pratique !\n\nPuis tout simplement : \n\n`sudo apt-get install -y apache2`\n\n**❓pourquoi `sudo` ?**\n\n**sudo** est une commande qui permet d'utiliser les droits d'administrateur sans changer de compte. Lorsque vous devez effectuer des actions sensibles sur une distribution GNU/Linux, on vous dira que vous n'avez pas les droits, sauf si vous utilisez votre commande préfixée par **sudo**. Lorsque vous utilisez **sudo** avant une commande, on vous demande alors de taper votre mot de passe. Cela a plusieurs avantages sécuritaires listés ici : [ubuntu-fr.org sudo](https://doc.ubuntu-fr.org/utilisateurs/roschan/sudo#avantages_de_sudo). \n\n#### Des modules supplémentaires\n\nNous avons installé la version de base de Apache2, mais il peut arriver qu'il soit nécessaire d'ajouter des modules complémentaires pour des usages particuliers. \nQuand on a un framework PHP, comme Symfony ou comme Laravel, il peut être utile d'installer en plus un module de réécriture d'url. \n\nDans ce cas, on pourra taper la commande suivante, sans oublier de redémarrer Apache2 ensuite : \n```bash\nsudo a2enmod rewrite\nsudo service apache2 restart\n```\n\n### Apache, comment ça marche ?\n\nEn premier, comme tout logiciel, il faut l'exécuter. \n\n`sudo service apache2 start`\n\nPour vérifier que Apache est bien en état de fonctionnement, on peut directement aller dans notre navigateur. D'abord, rendez-vous dans [la page d'admin de la VM Cloud dans Kourou](https://kourou.oclock.io/ressources/vm-cloud/). Ici vous avez dans la liste des informations, **Adresse de la machine**. Cliquez sur le lien directement, et vous devriez voir s'afficher la page d'accueil de Apache2.\n\nSur cette page, vous avez un peu de lecture sur les aspects configurables de Apache2, mais pour le moment, nous n'en avons pas besoin.\n\nPar contre, dans le paragraphe **Document Roots**, on vous dit que par défaut dans Ubuntu, Apache2 sert les fichiers qui seront placés dans le répertoire `/var/www/html` ! C'est donc ici précisément que nous placerons nos sites tout à l'heure, quand nous ferons le déploiement !\n\n#### 👀 Pour aller plus loin : [Ubuntu-fr.org Apache2](https://doc.ubuntu-fr.org/apache2)\n\n### D'autres serveurs web ?\n\n- [Nginx](https://www.nginx.com/)\n- [Apache Tomcat](https://tomcat.apache.org/)\n- Node.js bien sur !\n- [LightHTTPD](https://www.lighttpd.net/)\n- [Microsoft IIS](https://www.iis.net/)\n\nLequel est le plus utilisé ? [w3techs.com : serveurs web](https://w3techs.com/technologies/overview/web_server)\n\nPour en savoir plus : [ZD-NET.fr les serveurs web gratuits](https://www.zdnet.fr/guide-achat/quels-sont-les-serveurs-web-open-source-39840852.htm)\n\n## 📨 Déploiement du code \n\n- [Déploiement par SFTP](#d%C3%A9ploiement-par-sftp)\n- [Déploiement par SCP](#d%C3%A9ploiement-par-scp)\n- [Déploiement en SSH avec l'aide Git](#d%C3%A9ploiement-en-ssh-avec-laide-git)\n\nMaintenant que nous avons vu comment installer un serveur HTTP, voyons comment ajouter nos fichiers HTML et autres assets pour mettre en ligne un site web.\n\n### Déploiement par SFTP\n\nAujourd'hui, on utilise pratiquement plus le **protocole SFTP** pour transférer des fichiers d'une machine à une autre, à cause notamment des services comme Github qui permettent de déployer un site *beaucoup* plus proprement.\nSon ancêtre, le **FTP (File Transfert Protocole)**, était encore très utilisé dans les années 2000. \n\nConcrètement, il suffit d'installer un **serveur SFTP** sur le serveur web. Ensuite, grâce à un **client SFTP**, on se connecte au serveur et peut commencer des échanges de fichiers et de dossiers.\nSi vous voulez savoir à quoi ressemble un client SFTP, voici des [screenshots de Filezilla](https://filezilla-project.org/client_screenshots.php).\n\nNous ne verrons pas ensemble cette techno.\n\nMais si vous souhaitez installer un serveur SFTP, voici un [tuto linuxhint.com](https://linuxhint.com/setup-sftp-server-ubuntu/) pour ce faire.\n\n### Déploiement par SCP\n\nLa commande `scp` (OpenSSH secure file copy) permet de transférer des fichiers ou dossiers à travers une connexion SSH sécurisée. Pour pouvoir l'utiliser, il est nécessaire de disposer d'une connexion SSH et de droits d'utilisateur suffisants. \nCette commande va nous permettre de copier des backups par exemple, des exports SQL, des images... Tout dépend du contexte.\n\nPour connaitre la façon dont on utilise cette c
2784ommande, on peut taper `man scp` pour obtenir son manuel. Voici une version simplifiée du synopsis du manuel : \n\n```bash\nscp [options] [utilisateur_source@adresse_source]:/[/chemin/du/dossier/ou/fichier] [utilisateur_destination@adresse_destination]:/[dossier_destination]\n```\n\nDifférents cas de figures peuvent se présenter :\n\n- une copie de ma propre machine **vers** une machine distante\n```bash\nscp image.png [email protected]:/home/student\n```\n- une copie de la machine distante **vers** ma propre machine\n```bash\nscp [email protected]:/home/student/backup.zip .\n```\n\n❕*On peut très bien copier des fichiers entre deux machines distantes aussi !*\n\nSi on souhaite garder les mêmes droits et permissions, ainsi que les dates de création et de modification des éléments, on utilise l'option `-p`.\n\nSi on veut copier un répertoire avec tout ce qu'il contient, il faut utiliser l'option `-r` qui permet d'exécuter la commande de manière *récursive*.\n\n👀 **Pour aller plus loin : [tuto hostinger.fr](https://www.hostinger.fr/tutoriels/comment-utiliser-la-commande-scp-linux)**\n\n### Déploiement en SSH avec l'aide Git\n\n#### 🤙 A la Mano \n\nCe sera peut être la partie la plus simple de l'épisode. Car finalement, déployer avec Git, c'est un peu déjà ce que vous avez fait depuis le début de la formation.\n\n- ouvrir le terminal de la VM de production (pour nous, c'est le terminal de VScode qui se connecte à la VM Cloud via l'extension Remote-SSH)\n- se déplacer dans le répertoire `/var/www/html`,\n- puis faire un git clone du dépôt du site que vous voulez mettre en ligne,\n- ça pourrait s'arrêter là, sauf si il faut installer des dépendances avec npm !\n\nSi vous souhaitez installer Node.JS et NPM sur la VM Ubuntu, allez vers le [bonus de cette fiche objectif](https://github.com/O-clock-DWA-Peda/Programme/blob/master/cours/s09/e02.md#bonus--installer-nodejs-).\n\n#### 🐱 Avec Github Actions \n\n**Github** a mis en place **Github Actions** afin d'automatiser certaines tâches, comme par exemple, lancer une batterie de tests unitaires et fonctionnels à chaque push de nouveau code sur une machine dédiée aux tests justement. \n\n> Les test unitaires et/ou fonctionnels permettent d'éviter les régressions du code, c'est à dire, évitent qu'une fonctionnalité qui fonctionnait très bien puisse se retrouver bugguée par effet de bord. On parle alors d'intégration continue, ou **CI** (continuous integration). On détecte ainsi plus rapidement tout nouveau bug car on sait de quelles modifications il peut provenir.\n\n**Github Actions** permet aussi de livrer et déployer automatiquement les nouveautés sur une autre machine ! Dans ce cas, on parle de livraison et de déploiement continus, ou **CD** (continuous delivery, continuous deployment). Cette fois, c'est la livraison du code sur les machines de pré-production et de production qui se voit automatisé. Quand un projet devient assez conséquent, il faut penser à pas mal de manipulations à faire, comme  : mettre en maintenance le site, mettre à jour les librairies tiers, mettre à jour les données de la BDD, vider certains répertoires, redémarrer des applications... Toute cette charge mentale est retirée, grâce à des scripts qui automatisent le processus de mise en production.\n\n**Github** n'est pas la seule plateforme à proposer ce type de service. Chaque service d'hébergement peut potentiellement proposer une solution qui permet de mettre en place la livraison continue ainsi que l'automatisation des tests.\n\nCes bonnes pratiques ont donné naissance à un nouveau métier hybride, dédié à la fois au développement, mais aussi à l'intégration et la livraison continus : **Devops**. Ce poste demande des compétences en développement certes, mais aussi en administration système !\n\n**Mais concrètement, ça ressemble à quoi l'automatisation ?**\n\nEt bien, cela ressemble à une suite d'instructions à exécuter, lors d'événements... Ca ressemble beaucoup à tout ce qu'on a appris, sauf que le but recherché est différent !\n\nEn résumé, **Github Actions** nous permet d'écrire un script qui sera déclenché au moment voulu, souvent au push de code via une pull request ou non. Ce script sera formaté en [YAML](https://fr.wikipedia.org/wiki/YAML) et sera enregistré dans un fichier inséré dans le dépôt dans le répertoire `.github/workflows/`. Dans ce script ou **workflow**, nous pourrons ajouter des **jobs** qui seront composés de **steps**. Les **jobs** peuvent être asynchrones ou/et interdépendants. Les **jobs** peuvent être exécutés sur des **runners**, c'est à dire des petites machines virtuelles qui sont mises en route exprès pour ce **job**.\
2784n\nVoici une page qui présente concrètement un workflow : [docs.github.com - comprendre Github Action](https://docs.github.com/fr/actions/learn-github-actions/understanding-github-actions)\n\n## 🌻 Bonus : installer Node.JS \n\nPour installer Node.JS avec la version dont nous avons besoin, il est préférable de passer par le programme [NVM](https://github.com/nvm-sh/nvm).\n\n### 1. installation de NVM\n\nPour cela, on va utiliser la commande **curl** qui permet de charger une ressource disponible via une url !\n\nLa commande ci-dessous charge un script sh qui est téléchargeable via l'url : https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh\n\n```sh\ncurl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash\n```\nA partir de là, le terminal affiche un message qui vous propose de fermer et réouvrir le terminal, ou bien de lancer la commande suivante : \n\n```sh\nexport NVM_DIR=\"$([ -z \"${XDG_CONFIG_HOME-}\" ] && printf %s \"${HOME}/.nvm\" || printf %s \"${XDG_CONFIG_HOME}/nvm\")\"\n[ -s \"$NVM_DIR/nvm.sh\" ] && \\. \"$NVM_DIR/nvm.sh\" # This loads nvm\n```\n👌NVM est maintenant disponible dans notre console. \n\n### 2. installation de Node.JS\n\nNous allons pouvoir installer la bonne version de Node.JS, celle que nous avons utilisé depuis le début de la formation. Pour connaitre quelle est cette version, rendez-vous dans GotBash et tapez `node -v`.\n\nSi vous avez Node.JS version 16.15.1, vous pouvez l'installer sur le VM Ubuntu ainsi : \n```sh\nnvm install 16.15.1\n```\nMaintenant, vous devez disposer de **npm** pour installer les dépendances de vos projets front.","tags":"","title":"$:/doc/apache2","modified":"20241018093248833","type":"text/markdown"},
2785{"created":"20240819063937487","text":"\n## Qu'est-ce qu'une API REST ?\n\nAPI REST est une abréviation de \"Representational State Transfer\", ce qui signifie en français \"Transfert d'État Représentatif\". C'est un style d'architecture pour les services web qui utilise les protocoles HTTP et HTTPS pour créer des interfaces web entre des applications. \n\nUne API REST utilise les verbes HTTP (GET, POST, PUT, DELETE, etc.) pour effectuer des opérations sur des ressources, qui sont des objets manipulés par l'API.\n\n* Pour transmettre des données en passant par une API, il faut utiliser POST. Les informations sont transmises dans le coprs de la requête HTTP/\n* Pour récupérer des données, il faut utiliser GET. Les informations sont alors transmise dans l'url via des paramètres de l'URL.\n* Le premier paramètre d'une URL se situe aprés le caractère `?` et si il y a plusieurs paramètres dans l'URL, on les sépare avec le caractère `&`\n\nUne API REST suit plusieurs principes de base, notamment :\n\n- **L'architecture client-serveur** : Une API REST est basée sur une architecture client-serveur, ce qui signifie que le client et le serveur sont séparés et communiquent via des demandes et des réponses HTTP.\n- **L'utilisation de verbes HTTP** : Les verbes HTTP (GET, POST, PUT, DELETE, etc.) sont utilisés pour effectuer des opérations sur les ressources.\n- **La notion de ressources**: Les ressources sont des objets manipulés par l'API, tels que des utilisateurs, des produits ou des commandes. Chaque ressource est identifiée par une URL.\n- La représentation des ressources : Les ressources sont représentées par des formats de données tels que JSON ou XML.\n- **L'utilisation de codes d'état HTTP**: Les codes d'état HTTP (200 OK, 404 Not Found, etc.) sont utilisés pour indiquer le statut de la demande.\n\nL'objectif principal des API REST est de fournir une interface standardisée et facile à utiliser pour accéder à des ressources sur le web. Les API REST permettent à différents systèmes de communiquer entre eux en utilisant des protocoles web standard tels que HTTP et HTTPS.\n\nEn utilisant une API REST, un client peut demander et récupérer des ressources à partir d'un serveur en utilisant les verbes HTTP tels que GET, POST, PUT, DELETE, etc. Les ressources sont des objets tels que des utilisateurs, des produits, des commandes, des photos, des vidéos, etc., qui sont identifiés par des URL.\n\nLes API REST sont également conçues pour être évolutives et flexibles, ce qui signifie qu'elles peuvent être mises à jour ou modifiées sans affecter les clients existants. Les API REST sont largement utilisées dans les applications web modernes, telles que les applications mobiles, les sites de commerce électronique, les réseaux sociaux, les services bancaires en ligne, etc.\n\nEn somme, l'objectif des API REST est de faciliter la communication entre les applications en utilisant des protocoles web standardisés et des formats de données tels que JSON ou XML.\n\n{{$:/diagram/API}}
2785\n\n## res.json()\n\nLorsque l'on souhaite mettre en place une API Rest, on utilise très fréquement le format JSON pour retourner le résultat. La méthode res.json() pour renvoyer les données en format JSON. Cette méthode est fournie par [[Express|$:/doc/module/express]] (par exemple) et permet de renvoyer des données au format JSON en définissant le type de contenu de la réponse dans l'en-tête HTTP.\n\nLa méthode res.json() prend en paramètre l'objet JavaScript que vous souhaitez renvoyer sous forme de JSON. Elle convertit automatiquement cet objet en JSON et définit les en-têtes HTTP nécessaires pour renvoyer la réponse au client.\n\nIl est important de noter que vous pouvez également utiliser d'autres méthodes pour renvoyer les données au format JSON, telles que res.send() ou res.end(). Cependant, res.json() est la méthode recommandée car elle prend en charge la conversion automatique des objets JavaScript en JSON et définit correctement les en-têtes HTTP pour renvoyer la réponse.\n\n## Exemple\n\n```js\nconst express = require('express');\nconst app = express();\n\n// Route principale\napp.get('/', (req, res) => {\n  res.send('Bienvenue sur mon API REST!');\n});\n\n// Route pour récupérer une ressource\napp.get('/users/:id', (req, res) => {\n  const userId = req.params.id;\n  // Code pour récupérer l'utilisateur avec l'ID userId\n  res.json({ id: userId, name: 'John Doe' });\n});\n\n```\n\nEvidemment, l'exemple est volontairement simple, comme vous pouvez l'imaginer, en appelant un controller qui pourrait par exemple aller chercher dans la base de données l'utilisateur en question. Mis en place dans toute une application, on pourrait séparer complètement les parties frontend et backend dans des projets distincts :\n\n- Le backend : sous la forme d'un serveur n'exposant que des API REST (on appelle une URL qui nous répond au format JSON)\n- Le frontend : Appelle les URLs en question pour manipuler la base de données sans connaitre le fonctionnement du backend.\n\nNos deux parties sont alors totalement indépendantes l'une de l'autre.\n\n{{$:/code/API/REST/CORS}}\n\n__Documentation de l'API__\n\nSwagger UI : ","tags":"","title":"$:/doc/API/REST","modified":"20240924083038520","type":"text/markdown"},
2786{"created":"20240820064408301","text":"__Bruno__\n> Histoire\nBruno est un client d’API open source sous licence MIT, en d’autres termes, une application qui vous permettra de faire des appels REST ou GraphQL à vos API et d’en automatiser le test, entre autres.\n\nBruno permet en effet de gérer ses secrets de 2 manières : \n\nà partir de fichiers .env (KEY=value), qu’on évitera de commiter avec le bon .gitignore dans son projet\nou grâce à l'attribut “secret” de l’interface qui conservera le mot de passe dans Bruno lui-même.\n\nQuitte à faire du  “As Code” je vous recommande d’opter pour la première solution afin de pouvoir manipuler ses mots de passe dans un fichier également.\n\nSite de référence : [[https://www.usebruno.com/]]\n\nPour terminer, Bruno dispose également d’un CLI qui vous permettra d'exécuter vos collections en ligne de commande pour du test par exemple, à l’instar de newman.\n\n__Postman__\n\n\n__ThunderClient__\nThunder Client est une extension client d’API REST légère pour Visual Studio Code,\n\nSite de référence : [[https://github.com/thunderclient/thunder-client-support]]\n\n__Insomnia__, est une plateforme open-source de Kong Inc. (en) pour tester des API.\n\nPour tester les routes API que l'on a définies, on peut ainsi utiliser l'application Insomnia. Insomnia est une application qui permet de faire des requêtes HTTP.\n\nSite de référence : [[https://insomnia.rest/download]]\n","tags":"","title":"$:/doc/API/REST/Clients_API","modified":"20240910092937208","type":"text/markdown"},
2787{"created":"20240819085934182","text":"\n## Les CORS\n\n>Les CORS (Cross-Origin Resource Sharing) sont un mécanisme qui permet aux ressources d'une origine d'accéder à des ressources d'une autre origine. Les CORS sont utilisés pour permettre aux applications web d'accéder à des ressources situées sur un autre domaine que celui de l'application web.\n\n{{$:/code/js/express/cors}}\n\n{{$:/doc/API/REST/CORS/Same-Origine Policy}}","tags":"","title":"$:/doc/API/REST/CORS","modified":"20240910112118043","type":"text/markdown"},
2788{"created":"20240910100956222","text":"### Politique de même origine par défaut (same-origin policy):\nLes navigateurs web appliquent par défaut une politique de sécurité dite \"de même origine\" (same-origin policy).\nCette politique restreint les requêtes HTTP faites par des scripts à la même origine que la page web qui les a chargés.\n* Définition d'une origine :\nUne origine est définie par la combinaison du protocole (http/https), du domaine et du port.\nPar exemple, https://monapi.com et https://monapi.com:8080 sont considérées comme des origines différentes.\n* Comportement sans configuration CORS :\nSans configuration CORS explicite, le serveur ne fournit pas les en-têtes nécessaires pour autoriser les requêtes cross-origin.\nLes navigateurs bloqueront alors automatiquement les requêtes provenant d'origines différentes.\n\n* Sécurité par défaut :\nCette restriction par défaut est une mesure de sécurité pour prévenir certains types d'attaques, comme le Cross-Site Scripting (XSS).\n* Nécessité de configuration CORS :\nPour permettre à d'autres origines d'accéder à l'API, il faut explicitement configurer CORS sur le serveur.\nCela se fait généralement en ajoutant des en-têtes spécifiques comme Access-Control-Allow-Origin.","tags":"","title":"$:/doc/API/REST/CORS/Same-Origine Policy","modified":"20240910101238241","type":"text/markdown"},
2789{"created":"20240819080014482","text":"\nConsulter le prix des voyages :\n\n* [[https://developers.skyscanner.net/docs/intro]]\n\nConsulter les API de data.gouv\n\n* [[https://api.gouv.fr/les-api/api_data_gouv]]\n\nLes données disponibles sur les associations :\n\n* la BNA\n* Subvention des associations : https://api.gouv.fr/les-api/api-data-subventions\n\nLes données disponibles sur l'adresse :\n* Les codes postaux : https://api.gouv.fr/les-api/api_carto_codes_postaux","tags":"","title":"$:/doc/API/REST/services_gratuits","modified":"20240911080744099"},
2790{"created":"20240613075532173","text":"__Bundler__\n\n>Un Bundler est un outil spécifique qui cible en premier lieu les fichiers JavaScript et qui a pour but de fusionner un fichier et ses différentes dépendances. L'objectif est de n'avoir qu'un seul fichier en sortie pour optimiser les temps de chargement d'une application.\n\nL'utilité principale d'un bundler est de transformer les différents fichiers sources (HTML, JS, TS, CSS, SCSS, images...) de notre site ou de notre application web en fichiers utilisables en production. C'est ces fichiers qui seront servis via un serveur.\n\nExemple de bundler :\n*   [[Parcel|$:/doc/bundler/parcel]]\n*   [Webpack](https://webpack.js.org/)\n*   [Rollup](https://rollupjs.org/guide/en/)\n*   [Vite](https://vitejs.dev/guide/)\n*   ...\n\n  \n__Bundler vs Task Runner__\nUn task runner a pour but d'effectuer une série de tâches sur un ou plusieurs fichiers (minification des images, conversion d'un fichier SASS en CSS...) et n'inclue aucune logique. Son seul but est de lancer des outils spécifiques suivant certaines conditions.\n\nSource : [[grafikart.fr|https://grafikart.fr/tutoriels/module-bundler-979]]\n\nExemple gulp 
2790:\n \n* Gulp sass, tout est dit dans son nom, il permet de compiler de SASS à CSS.\n* Gulp autoprefixer, il permet de préfixer automatiquement vos CSS de manière intelligente.\n* Gulp jshint, il permet de vérifier vos fichiers JS.\n* Gulp uglify, il permet de minifier vos fichiers Js.\n* Gulp imagemin, il optimise vos images.\n* Gulp clean : nettoie votre fichier de prod. A utiliser avec précaution puisque vous pouvez effacer vos fichiers sources !\n* Gulp minify : Il minifie vos fichiers CSS.\n\n\n__Bundler vs Transpiler__\n* Un bundler, comme Webpack ou Browserify, combine plusieurs fichiers JavaScript (et parfois CSS, images, etc.) en un seul fichier ou en quelques fichiers. Cela permet de réduire le nombre de requêtes HTTP nécessaires pour charger une page web, ce qui peut améliorer les performances1. En résumé, un bundler organise et fusionne les fichiers pour optimiser le chargement des ressources.\n\n\n* Un __transpiler__, comme Babel ou TypeScript, convertit le code écrit dans une version ou un dialecte de JavaScript en une autre version plus compatible avec les navigateurs actuels (il peut le mimifier également). Par exemple, Babel peut transformer du code ES6 en ES5 pour s’assurer qu’il fonctionne sur des navigateurs plus anciens. En résumé, un transpiler traduit le code d’un langage ou d’une version à une autre.\n\n_Différences Clés_\n* Fonction : Le bundler fusionne les fichiers, tandis que le transpiler traduit le code.\n* Objectif : Le bundler vise à optimiser le chargement des ressources, tandis que le transpiler vise à assurer la compatibilité du code avec différents environnements.","tags":"","title":"$:/doc/bundler","modified":"20240912095620700","type":"text/markdown"},
2791{"created":"20240829150352758","text":"__Parcel__\n\n>ParcelJS est un empaqueteur d’applications web ultra-rapide et sans configuration. \n\n* Empaquetage rapide : Parcel utilise des processus de travail en parallèle pour permettre la compilation multicœur et dispose d’un cache de système de fichiers pour des reconstructions rapides.\n* Support prêt à l’emploi : Il prend en charge les fichiers JS, CSS, HTML, etc., sans nécessiter de plugins1.\n* Transformations automatiques : Le code est automatiquement transformé en utilisant Babel, PostCSS et PostHTML.\n* Découpage du code : En utilisant la syntaxe dynamique import(), Parcel découpe la génération de vos paquets pour optimiser le chargement initial1.\n* Remplacement de module à chaud : Pendant le développement, Parcel met à jour automatiquement les modules dans le navigateur lorsque vous apportez des modifications1.\n* Journal d’erreur convivial : Il affiche des extraits de code avec coloration syntaxique pour aider à identifier les problèmes.\n\n\n### Parcel\n\n1. **Philosophie et Objectif :**\n    - **Zéro configuration :** Parcel se distingue par son approche « zéro configuration », permettant aux développeurs de commencer à coder immédiatement sans avoir à écrire des fichiers de configuration.\n    - **Out-of-the-box :** Parcel offre une multitude de fonctionnalités prêtes à l’emploi, telles que le support de TypeScript, Less, Sass, PostCSS, etc., sans nécessiter de plugins additionnels.\n2. **Technologie et Fonctionnement :**\n    - **Bundling automatique :** Parcel effectue un bundling complet dès le début, ce qui peut être plus lent que l'approche de Vite pendant le développement.\n    - **Caching intelligent :** Utilise un cache intelligent pour éviter de recompresser les fichiers inchangés, accélérant ainsi les builds incrémentales.\n    - **HMR :** Offre également une fonctionnalité de HMR, mais elle est généralement moins rapide comparée à celle de Vite.\n3. **Configuration et Utilisation :**\n    - **Simplicité :** Parcel ne nécessite pas de fichier de configuration pour démarrer, ce qui le rend extrêmement facile à utiliser pour les débutants et les petits projets.\n    - **Flexibilité :** Malgré son approche zéro configuration, Parcel permet une configuration avancée via des fichiers comme `.parcelrc` si nécessaire.\n4. **Support des Frameworks :**\n    - **Support étendu :** Parcel supporte une large gamme de technologies front-end, y compris React, Vue, Svelte, et bien d'autres, souvent avec une configuration minimale.\n5. **Performance de Build :**\n    - **Optimisation des assets :** Gère automatiquement l'optimisation des assets comme les images et les fichiers CSS.\n    - **Code splitting :** Parcel offre une gestion automatique du code splitting, ce qui permet de charger les parties nécessaires de l'application de manière asynchrone pour améliorer les performances.\n\n\nUn organisation typique avec le bundler Parcel donne ceci :\n\n```\nproject/\n├─ .parcel-cache/     // crée par parcel pour son bon fonctionnement, on n'y touche pas\n├─ dist/              // contient le code final transformé par parcel, on n'y touche pas, c'est ce qu'il faudra servir\n│  ├─ index.html\n│  └─ project.js\n├─ node\\_modules/      // les fichiers de code des dépendances nécessaires à notre projet, on n'y touche pas\n├─ src/               // contient notre c
2791ode, c'est là qu'on développe et qu'on s'organise\n│  ├─ styles.css\n│  └─ index.html\n├─ package-lock.json  // crée par npm pour son bon fonctionnement, on n'y touche pas \n├─ package.json       // carte d'identité du projet avec la liste des dépendances et des scripts disponibles\n└─ .gitignore         // permet d'exclure des dossiers/fichiers du dépot git tels que .parcel-cache, dist ou node\\_modules\n```\n\n\n\u003Cdetails> \n\t\u003Csummary> installation de parcel\u003C/summary> \n\t\n* avec npn : `npm install parcel`\n\n* avec yarn : \n```\nyarn add --dev parcel\n```\nau lieu d'utiliser la commande npm on utilisera la commande `yarn parcel FICHIER_ENTREE`\n\n\u003C/details>\n\u003Cbr>\nrmq : Parcel permet est un transcoder et permet notamment de travailler avec React (mimification et traduction).\n\n### npn contenu du package.json\n```json\n \"source\": \"src/index.html\",\n    \"scripts\": {\n      \"start\": \"parcel --no-cache\",\n      \"build\": \"parcel build\"\n    }\n```\nAjouter dans votre package.json : `--no-cache`\n\nRmq: parcel autorise de ne pas mettre l'extension .js pour les import. \n\nAvec le module `@parcel/transformer-sass\"` , il est possiblde d'utiliser Sass dans un projet : Parcel détectera automatiquement les fichiers .sass ou .
2791scss et utilisera le transformateur Sass pour les compiler. Vous pouvez référencer vos fichiers Sass dans votre HTML ou les importer dans vos fichiers JavaScript/TypeScript. \n * Exemple d’importation dans un fichier JavaScript :\n   ```js\n   import './style.scss';\n   ```\n\nEn cas de problème avec la version de parcel :\n\n```\nnpm uninstall @parcel/transformer-sass\nnpm uninstall parcel\nnpm i @parcel/transformer-sass\nnpm i parcel\n```\n\n\t \nPour aller plus loin : [[https://parceljs.org/]]\n(module-3/e11)\n(module-8/e4)","tags":"","title":"$:/doc/bundler/parcel","modified":"20240926135543952","type":"text/markdown"},
2792{"created":"20240916111451456","text":"\n* **@parcel/transformer-sass**\n  * Parcel prend en charge les fichiers Sass automatiquement à l’aide du plugin. Lorsqu’un fichier ou est détecté, il est automatiquement installé dans votre projet.@parcel/transformer-sass.sass.scss\n* **parcel-reporter-static-files-copy**\n  * Permet de copier les fichiers statistiques (images/etc) dans le dossier build. Ces fichers seront disponibles dans le dossier static.\n  * Grâce à ça, plus besoin d'effectuer des imports pour les images publiques, il suffit de les appeler directement avec leur chemin relatif depuis static. Si par exemple je veux appeler l'image /static/assets/img/games/ff7.jpg dans mon code, je peux l'appeler directement avec le chemin assets/img/games/ff7.jpg.","tags":"","title":"$:/doc/bundler/parcel/plugins","modified":"20240916113221727","type":"text/markdown"},
2793{"created":"20240926114915329","text":"- **Vite** est connu pour sa rapidité et son efficacité, surtout pour les projets modernes avec ES Modules.\n- **Parcel** est un bundler plus généraliste, plus lent mais avec plus de fonctionnalités out-of-the-box.\n\n* [Documentation Vite](https://vitejs.dev/guide/) \n\n\n### Vite\n\n1. **Philosophie et Objectif :**\n    - **Vitesse :** Vite est conçu pour être ultra-rapide. Il utilise la fonctionnalité native d’ES Modules dans les navigateurs modernes pour éviter le bundling pendant le développement, ce qui réduit drastiquement les temps de démarrage et les temps de rafraîchissement à chaud (Hot Module Replacement - HMR).\n    - **Simplicité :** Vite vise à fournir une configuration minimale par défaut, en se concentrant sur la facilité d’utilisation et les performances.\n2. **Technologie et Fonctionnement :**\n    - **ES Modules :** Utilise les ES Modules natifs pour le développement, ce qui élimine le besoin de regénérer des bundles entiers lorsque les fichiers changent.\n    - **HMR :** Offre un HMR très rapide, grâce à son approche modulaire.\n    - **Build avec Esbuild :** Pour la production, Vite utilise Esbuild pour le bundling, qui est très rapide et performant. Esbuild est écrit en Go et est conçu pour être extrêmement rapide.\n3. **Configuration et Utilisation :**\n    - **Configuration minimale :** Vite nécessite peu de configuration pour démarrer. Les fichiers de configuration sont simples et suivent des conventions claires.\n    - **Plug-and-play :** Support intégré pour TypeScript, JSX, CSS modules, etc., sans nécessiter de configuration supplémentaire.\n4. **Support des Frameworks :**\n    - **React, Vue, et autres :** Vite offre un excellent support pour plusieurs frameworks populaires comme React et Vue, avec des templates prêts à l’emploi.\n5. **Performance de Build :**\n    - **Optimisation :** Les builds de production sont optimisées grâce à Esbuild, ce qui permet d'obtenir des bundles minifiés et optimisés pour la performance.\n\n\u003Cbr>\n\n\t\n\u003Cdetails> \n\u003Csummary> Installation\n\u003C/summary> \n\n```\nnpm create vite@latest\n\n//puis dans le dossier du projet\n\nnpm install\n\n// pour tester l'installatin\n\nnpm run dev\n\n```\n\n\n```\nnpm install -D vite\n```\npuis\n```\nnpm init vite@latest\n  cd vite-project\n  npm install\n  npm run dev\n```\n\n```\nnpm create vite@latest\n```\n\n\u003C/details>\n\n[[https://vitejs.dev/guide/#scaffolding-your-first-vite-project]]\n\t\t\n```js\n// src/Button.test.js\nimport React from 'react';\nimport { render, screen, fireEvent } from '@testing-library/react';\nimport '@testing-library/jest-dom/extend-expect'; // Pour des assertions DOM supplémentaires\nimport Button from './Button'; // Import du composant\n\ntest('it renders the button with the correct text', () => {\n  render(\u003CButton text=\"Click me\" onClick={() => {}} />); // Rendre le composant\n\n  // Vérifier si le bouton est rendu avec le texte \"Click me\"\n  const buttonElement = screen.getByText('Click me');\n  expect(buttonElement).toBeInTheDocument(); // Assertion que le bouton est dans le DOM\n});\n\ntest('it triggers the onClick handler when clicked', () => {\n  const handleClick = jest.fn(); // Simuler une fonction\n  render(\u003CButton text=\"Click me\" onClick={handleClick} />);\n\n  // Trouver le bouton\n  const buttonElement = screen.getByText('Click me');\n\n  // Simuler un clic\n  fireEvent.click(buttonElement);\n\n  // Vérifier si la fonction de clic a été appelée\n  expect(handleClick).toHaveBeenCalledTimes(1);\n});\n```","tags":"$:/doc/bundler/vite","title":"$:/doc/bundler/vite","modified":"20240929184102819","type":"text/markdown","icon":"$:/img/ico/vite.js.svg"},
2794{"created":"20240906123143027","text":"__Un réseau de diffusion de contenu (CDN)__ est un groupe de serveurs répartis géographiquement qui met en cache le contenu à proximité des utilisateurs finaux. Un CDN permet le transfert rapide des ressources nécessaires au chargement du contenu Internet, notamment les pages HTML, les fichiers JavaScript, les feuilles de style, les images et les vidéos.\n\nAujourd'hui, la majorité du trafic web est desservie par des CDN, y compris le trafic de sites majeurs tels que Facebook, Netflix et Amazon.\n\n### Mettre en œuvre un CDN (Content Delivery Network) implique plusieurs étapes clés :\n\n1. Choisir un Fournisseur de CDN\n Parmi les fournisseurs populaires, on trouve Cloudflare, Akamai, Amazon CloudFront et Fastly.\n\n2. Configurer le CDN\n* Création d’un Compte \n* Ajout de votre Site Web : Ajoutez votre site web ou application à la plateforme du CDN.\n3. Mise à Jour des DNS\n4. Configuration des Règles de Cache\n* Définir les Politiques de Cache : Configurez les règles de cache pour déterminer quels types de contenu doivent être mis en cache et pour combien de temps. Cela peut inclure des fichiers statiques comme des images, des vidéos, des fichiers CSS et JavaScript2.\n* Purge du Cache : Mettez en place des mécanismes pour purger le c
2794ache lorsque le contenu est mis à jour.\n5. Sécurité et Optimisation\nSSL/TLS :\n* Configurez les certificats SSL/TLS pour sécuriser les communications entre les utilisateurs et les serveurs du CDN.\n* Protection DDoS : Activez les fonctionnalités de protection contre les attaques DDoS offertes par le fournisseur de CDN.\n* Optimisation des Performances : Utilisez les outils d’optimisation fournis par le CDN pour améliorer les temps de chargement, comme la minification des fichiers et la compression des images.\n6. Surveillance et Maintenance\nSurveillance :\n* Utilisez les outils de surveillance du CDN pour suivre les performances, les temps de réponse et les éventuelles erreurs.\n* Rapports et Analyses : Analysez les rapports fournis par le CDN pour comprendre le comportement des utilisateurs et optimiser davantage la distribution du contenu.\n7. Tests et Validation\n* Tests de Performance : Effectuez des tests de performance pour vérifier que le CDN améliore effectivement les temps de chargement et la disponibilité du contenu.\n* Validation : Assurez-vous que toutes les configurations fonctionnent comme prévu et que le contenu est correctement distribué aux utilisateurs finaux.","tags":"","title":"$:/doc/cdn","modified":"20240906124339387","type":"text/markdown"},
2795{"created":"20241011083416091","text":"\n\n\n## Installer Certbot sur notre serveur\n\nSource : \n[[Documentation installation certbot|https://certbot.eff.org/instructions?ws=apache&os=snap]]\n\nOn utilise **Snapd** , si il n'est pas sur la machine, il est nécessaire de l'installer\n\n```sh\nsudo snap install --classic certbot\n```\nSi tout se passe bien, on doit voir s'afficher dans notre terminal : \n\n```sh\ncertbot 2.11.0 from Certbot Project (certbot-eff✓) installed\n```\nVoici la commande à exécuter pour pouvoir utiliser Certbot avec sa commande dédiée : \n\n```sh\nsudo ln -s /snap/bin/certbot /usr/bin/certbot\n```\nPas de message : c'est que tout s'est bien passé 🎊\n\n## Configurer Certbot pour notre serveur web Apache2\n\nNous allons laisser Certbot configurer Apache2 pour nous : \n\n```sh\nsudo certbot --apache\n```\n\nIl va vous demander votre adresse mail, pas de souci, vous pouvez donner celle *@oclock.school*.\n\n```sh\nSaving debug log to /var/log/letsencrypt/letsencrypt.log\nEnter email address (used for urgent renewal and security notices)\n (Enter 'c' to cancel): [email protected]\n```\n\nAccepter les conoditions en tapant `Y` : \n\n```sh\nPlease read the Terms of Service at\nhttps://letsencrypt.org/documents/LE-SA-v1.4-April-3-2024.pdf. You must agree in\norder to register with the ACME server. Do you agree?\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n(Y)es/(N)o: Y\n```\n\nEnsuite Certbot vous demande si vous voulez recevoir des courriers de sa part.\n\n## Générer les certificats\n\nA cette étape, Certbot va vouloir vérifier si il arrive à accéder à nos sites ! Sauf que notre Pomodoro n'est accessible qu'à ceux qui sont connectés au VPN O'clock.\n\nNous allons devoir rendre notre VM serveur \"publique\", c'est à dire : accessible depuis tout internet ! \n\nCertbot nous demande pour quels sites il doit générer un certificat. Nous avons besoin d'un certificat pour les deux !\n\nDonc, on tape : `
27951 2`\n\n```sh\nWhich names would you like to activate HTTPS for?\nWe recommend selecting either all domains, or all domains in a VirtualHost/server block.\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n1: front.eddi.cloud\n2: backend.eddi.cloud\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\nSelect the appropriate numbers separated by commas and/or spaces, or leave input\nblank to select all options shown (Enter 'c' to cancel): 1 2\n```\n","tags":"","title":"$:/doc/CertBot","modified":"20241011083949062","type":"text/markdown"},
2796{"created":"20240620080438977","text":" * collaborative whiteboarding tool\n\n* [[https://www.tldraw.com/]]\n* [[https://excalidraw.com/]]\n\nexemple : https://www.tldraw.com/v/MokKcV7vz7ugfoo2nW9Nf1l?v=-776,-237,3235,1464&p=-RmY9uNZoOMdtztmcPfLH\n\n\n * Outil de formation\n\nhttps://bbb1.oclock.school/home","tags":"","title":"$:/doc/collaborative_tools","modified":"20240909073221649"},
2797{"created":"20240605152054115","text":"---\n\n!!! Semantic UI\n---\n\n>Semantic UI est un framework CSS offrant une bibliothèque de styles préconçus afin de créer une interface simple pour démarrer un nouveau projet.\n\nUn projet Semantic UI comprend la structure de dossiers suivante.\n\n```\nsrc\n| > site\n| > themes\n|       > default\n|       > packaged-theme\n|         \ndist \n| > components\n| > semantic.css\n[ > semantic.js\n\n```\n\n\n* Site de référence : [[Depot du projet sur gitHub|https://github.com/Semantic-Org/Semantic-UI]]\n\n---\n\n!!! Tailwind CSS\n\n---\n\n> Tailwind CSS est un framework permettant aux développeurs de personnaliser totalement et simplement le design de leur application ou de leur site web. Avec ce framework CSS, il est possible de créer un design d’interface au sein même du fichier HTML.\n\n* Site de référence : __[[Tailwind |https://fr.wikipedia.org/wiki/Tailwind_CSS]]__\n\u003Cbr>\n\n---\n\n!!!Autres FrameWork CSS :\n\n---\n\n\n!!!!! __[[Bulma|https://bulma.io/]]__\n\nNb: Utilisé par TiddlyJam\n\n!!!!! __[[Bootstrap|https://getbootstrap.com/]]__\n\n\n\nvoir aussi\n\n!!!!! __[[Spectre|https://picturepan2.github.io/spectre/#google_vignette]]__\n\n\n!!!!! __[[GridFlex|https://gridlex.devlint.fr/]]__\n\n!!!!! __[[PanFlex|http://panflex.tiddlyspot.com/]]__\n\n!!!!! __[[Smart CSS GRid|https://github.com/vladocar/SMART-CSS-GRID]]__\n\n\n!!! Des fichiers css tout prêt à l'emploi :\n\n* Pico css\n\n```\n// installation node\n\nnpm install @picocss/pico\n```","tags":"$:/code/css","title":"$:/doc/css/framework_CSS","modified":"20240929184416635"},
2798{"created":"20240805142728258","text":"__SASS__\n\n>Sass est un préprocesseur CSS. Un préprocesseur est un programme qui procède à des transformations sur un code source avant l’étape de traduction proprement dite (compilation dans le cas de Sass ou interprétation pour d’autres types de préprocesseur).\n\nSass permet en quelques sortes “d’étendre” les possibilités du CSS classique en nous permettant d’utiliser des variables, des règles imbriquées, des mixins, des fonctions, etc.\n\nSource : [[https://www.pierre-giraud.com/sass-apprendre-cours-complet/presentation-installation-sass/]]\n\n__Différence entre SCSS et SASS__\n\nSCSS :\n\n* La syntaxe est similaire à celle du CSS (à tel point que tout CSS3 valide régulier est également un SCSS valide, mais la relation dans l’autre sens ne se produit évidemment pas)\n\n* Utilise des crochets {}\n \n* Utilise des points-virgules ;\n \n* Le signe d’affectation est :\n \n* Pour créer un mixin, il utilise la directive @mixin\n\n* Pour utiliser mixin, il le précède de la directive @include\n\n* Les fichiers ont l’extension .scss.\n\nSass original :\n\n* La syntaxe est similaire à Ruby\n* Pas de crochet {}\n* Pas d’indentation stricte\n* Pas de points-virgules\n* Le signe d’affectation is à la place de =:\n* Pour créer un mixin, il utilise le signe=\n* Pour utiliser mixin, il le précède du signe+\n* Les fichiers ont l’extension .sass.\n\n```css\n\n\t// SCSS\n@mixin cover {\n  $color: red;\n  @for $i from 1 through 5 {\n    &.bg-cover#{$i}
2798 { background-color: adjust-hue($color, 15deg * $i) }\n  }\n}\n.wrapper { @include cover }\n\n\n// SASS\n=cover\n  $color: red\n  @for $i from 1 through 5\n    &.bg-cover#{$i}\n      background-color: adjust-hue($color, 15deg * $i)\n.wrapper\n  +cover\n\n```","tags":"","title":"$:/doc/css/scss/sass","modified":"20240805144129612","type":"text/markdown"},
2799{"created":"20240826113813392","text":"## Design Pattern : Active Record\n\nLe design pattern **Active Record** est un modèle architectural utilisé principalement dans le développement d'applications web pour gérer les interactions entre les objets d'une application et une base de données relationnelle. Chaque classe correspond à une table dans la base de données, et chaque instance de cette classe représente une ligne dans cette table.\n\n### Principe de l'Active Record\nLe pattern Active Record encapsule à la fois la logique métier et les opérations de base de données dans une seule classe. Cela signifie que les objets Active Record sont responsables de :\n\n1. **Interagir avec la base de données** : Les opérations CRUD (Create, Read, Update, Delete) sont directement gérées par l'objet.\n2. **Encapsuler la logique métier** : Les validations, associations et autres règles métier sont intégrées dans la même classe.\n\n#### Exemple simple\nVoici un exemple de classe `User` qui suit le pattern Active Record en utilisant `async/await`, avec des propriétés privées, des getters et des setters, et en protégeant les requêtes SQL avec des placeholders (`$1`, `$2`, etc.) :\n\n```javascript\nclass User {\n  #id;\n  #name;\n  #email;\n\n  constructor(id, name, email) {\n    this.#id = id;\n    this.#name = name;\n    this.#email = email;\n  }\n\n  // Getters\n  get id() {\n    return this.#id;\n  }\n\n  get name() {\n    return this.#name;\n  }\n\n  get email() {\n    return this.#email;\n  }\n\n  // Setters\n  set name(value) {\n    if (typeof value !== 'string' || value.trim() === '') {\n      throw new Error('Nom invalide');\n    }\n    this.#name = value.trim();\n  }\n\n  set email(value) {\n    if (typeof value !== 'string' || value.trim() === '') {\n      throw new Error('Email invalide');\n    }\n    this.#email = value.trim();\n  }\n\n  // Trouve un utilisateur par son ID\n  static async find(id) {\n    const result = await db.query('SELECT * FROM users WHERE id = $1', [id]);\n    if (result.rows.length > 0) {\n      const { id, name, email } = result.rows[0];\n      return new User(id, name, email);\n    } else {\n      throw new Error('Utilisateur non trouvé');\n    }\n  }\n\n  // Sauvegarde l'utilisateur (insertion ou mise à jour)\n  async save() {\n    if (this.#id) {\n      // Mise à jour\n      await db.query(\n        'UPDATE users SET name = $1, email = $2 WHERE id = $3',\n        [this.#name, this.#email, this.#id]\n      );\n    } else {\n      // Insertion\n      const result = await db.query(\n        'INSERT INTO users (name, email) VALUES ($1, $2) RETURNING id',\n        [this.#name, this.#email]\n      );\n      this.#id = result.rows[0].id;\n    }\n  }\n\n  // Supprime l'utilisateur\n  async delete() {\n    if (!this.#id) {\n      throw new Error('Utilisateur non trouvé');\n    }\n    await db.query('DELETE FROM users WHERE id = $1', [this.#id]);\n  }\n}\n```\n\n### Avantages de l'Active Record\n- **Simplicité** : Le pattern est facile à comprendre et à utiliser. Il regroupe la logique métier et la gestion des données en un seul endroit.\n- **Productivité** : Les frameworks utilisant Active Record permettent de gagner du temps en offrant des méthodes de base prêtes à l'emploi pour les opérations courantes.\n\n### Inconvénients de l'Active Record\n- **Couplage fort** : L'Active Record lie étroitement la logique métier et l'accès aux données, ce qui peut rendre difficile la séparation des préoccupations.\n- **Problèmes de scalabilité** : Pour les applications complexes ou très volumineuses, l'Active Record peut devenir difficile à maintenir, car la logique métier et les opérations de base de données sont fortement couplées.\n- **Limitation des relations complexes** : Gérer des relations complexes (comme les relations entre plusieurs tables) peut être plus difficile avec Active Record qu'avec d'autres patterns, comme Data Mapper.\n\n### Frameworks utilisant Active Record\n
2799De nombreux frameworks web populaires utilisent ou offrent une implémentation de l'Active Record, notamment :\n\n- **Ruby on Rails** : Le framework qui a popularisé l'Active Record, où chaque modèle de données hérite de la classe `ActiveRecord::Base`.\n- **Laravel (PHP)** : Utilise Eloquent, une implémentation de l'Active Record.\n- **Django (Python)** : Bien que Django utilise le pattern ORM, il emprunte certaines idées de l'Active Record.\n- **[[Sequelize|$:/doc/node.js/ORM/Sequelize]] (Node.js)** : Bien que Sequelize soit techniquement un ORM, il utilise de nombreuses idées de l'Active Record, où chaque modèle gère ses propres opérations de base de données.\n","tags":"","title":"$:/doc/design_patern/active_record","modified":"20240903085501580","type":"text/markdown"},
2800{"created":"20240903084949553","text":"__Design Patern__ ou patrons de conception\n\n> Les patrons de conception sont des solutions classiques à des problèmes récurrents de la conception de logiciels. \n> \nSource : [[Refactoring guru|https://refactoring.guru/fr/design-patterns/what-is-pattern]]\n\n### Patron de conception Backend : \n\n* Active record : [[$:/doc/design_patern/active_record]]\n\n* voir également Refactoring GURU : [[https://refactoring.guru/fr/design-patterns/typescript]]\n\n  \n### Patron de conception front end :\n\nComposants riches :\n* Daisy UI : [[https://daisyui.com/]]\n\n\n  ","tags":"","title":"$:/doc/design_pattern","modified":"20240926085043493","type":"text/markdown"},
2801{"created":"20240926085026522","text":"## Atomic Design\n\n> Un design system est une collection de composants réutilisables, de lignes directrices et de principes visuels qui aident à maintenir la cohérence dans la conception et le développement de produits numériques.\n\n### Les éléments d'un design system :\n\n* Composants UI : Boutons, formulaires, icônes, etc.\n* Principes visuels : Typographie, palettes de couleurs, grilles de mise en page.\n* Guidelines : Règles et bonnes pratiques pour l’utilisation des composants et des visuels.\n* Documentation : Instructions détaillées pour les développeurs et les designers.\n\n### Atomic system\n\n[[https://blog-ux.com/quest-ce-que-latomic-design/]]\n[[https://atomicdesign.bradfrost.com/]]","tags":"","title":"$:/doc/design_system","modified":"20240926104350499","type":"text/markdown"},
2802{"created":"20240825130721678","text":"\n\n''__template strings__'' (backticks ``` ``` en JavaScript)\nLes template strings sont simplement une autre façon de construire des chaînes de caractères et n'offrent aucune protection contre les injections.","tags":"","title":"$:/doc/developpement/lower_snake_case","modified":"20240826080254453","type":""},
2803{"created":"20240903205927136","text":"__Liste des paradigmes en prgrammation__\n\n1. __Paradigme Impératif__\n>Le paradigme impératif est basé sur des instructions qui changent l’état du programme. Il se concentre sur comment accomplir une tâche en spécifiant une série d’étapes. Les langages procéduraux comme C et Pascal en sont des exemples typiques.\n\nEn programmation impérative, on se concentre sur l’obtention d’un résultat en décrivant le comportement étape par étape dans notre code, tout en conservant le contrôle sur notre code à chacune de ces étapes. C’est un peu notre approche “plan d’action” qu’on a pu découvrir avec la programmation.\n\n```js\n// style impératif\nbuttonElement.addEventListener('click', () => {\n  // on décrit comment réagir\n  document.body.className+= ' dark';\n  // étape par étape\n  document.querySelector('h1').textContent = 'Le thème sombre est activé';\n});\n\n``````\nLe problème de la programmation impérative, c’est que l’on peut vite rencontrer des soucis lorsqu’on souhaite faire évoluer notre code, ou y apporter des modifications. On risque de rapidement casser ce qui existe déjà, et il devient difficile de s’y retrouver.\n\nC’est ici que l’approche déclarative fait son entrée.\n\n2. __Paradigme Déclaratif__\n> Le paradigme déclaratif se concentre sur quoi accomplir plutôt que sur comment le faire. Il décrit le résultat souhaité sans spécifier les étapes pour y parvenir. SQL et Prolog sont des exemples de langages déclaratifs.\n\nSi en programmation impérative, on se concentre sur le “comment” on procède pour aller au but, la programmation déclarative se concentre elle sur le “l’objectif” lui-même.\n\n```js\n// style déclaratif\nbuttonElement.addEventListener('click', () => {\n  // on comprend directement l'intention\n  enableDarkMode(); \n  // bien sûr la tuyauterie de cette fonction doit être présente quelque part (dans une bibliothèque ou une fonction d'un module perso)\n});\n\n``````\nOn mettra donc la priorité sur les intentions pour que le code se rapproche du comportement attendu par l’utilisateur.\n\n3. Paradigme Orienté Objet :\n>Ce paradigme organise le code en objets, qui sont des instances de classes. Chaque objet contient des données et des méthodes pour manipuler ces données. Java, C++, et Python sont des exemples de langages orientés objet.\n\n4. __Paradigme Fonctionnel__\n>Le paradigme fonctionnel traite le calcul comme l’évaluation de fonctions mathématiques et évite les états et les données mutables.\n\n Exemples : Haskell et Lisp sont des exemples de langages fonctionnels.\n>\nLa programmation fonctionnelle est **une des formes que peut prendre la programmation déclarative**.\n\nL'objectif est de créer des fonctions qui seront comme des boites noires avec des entrées (paramètres) et une sortie (retour). Ce qu'elles exécutent comme instructions nous intéresse moins que ce qu'elles fournissent comme résultat.\n\n5. Paradigme Logique\n>Ce paradigme est basé sur la logique formelle. Les programmes sont exprimés en termes de relations, et l’exécution consiste à prouver des assertions. Prolog est un exemple de langage de programmation logique1.\n\n6. Paradigme Concurrent\n>Ce paradigme permet l’exécution simultanée de plusieurs processus ou threads. Il est utilisé pour améliorer les performances des applications sur les systèmes multi-cœurs. Erlang et Go sont des exemples de langages supportant la programmation concurrente1.\n\n7. Paradigme Événementiel\n>Dans ce paradigme, le flux du programme est déterminé par des événements tels que les actions de l’utilisateur, les messages provenant d’autres programmes ou les capteurs. JavaScript est souvent utilisé dans un style événementiel pour le développement web.\n\n\n__Langages et leurs paradigmes__\n\n*JavaScript*\n\n* Paradigmes : Impératif, Orienté Objet, Fonctionnel\n* Description : Utilisé principalement pour le développement web, JavaScript supporte plusieurs paradigmes, ce qui le rend très flexible.\n\n*Python*\n* Paradigmes : Impératif, Orienté Objet, Fonctionnel\n* Description : Python est c
2803onnu pour sa simplicité et sa lisibilité. Il est utilisé dans divers domaines, y compris le développement web, l’analyse de données, et l’intelligence artificielle.\n\n*SQL*\n* Paradigmes : Déclaratif\n* Description : SQL est utilisé pour gérer et manipuler des bases de données relationnelles. Il se concentre sur le “quoi” plutôt que le \"comment\"1.\n\n__Autres langages populaires__\n\n*Java*\n* Paradigmes : Orienté Objet, Impératif\n* Description : Java est largement utilisé pour le développement d’applications d’entreprise, mobiles et web1.\n\n*C*\n* Paradigmes : Impératif, Procédural\n* Description : C est un langage de bas niveau souvent utilisé pour la programmation système et le développement de logiciels embarqués\n\n---\n\n__Langage procédural__\nUn langage procédural est un type de langage de programmation qui repose sur le concept de procédures ou de routines. Ces procédures sont des blocs de code qui effectuent des tâches spécifiques et peuvent être appelées à partir de n’importe quel point du programme. Les langages procéduraux suivent généralement une approche impérative, où le programmeur spécifie explicitement les étapes à suivre pour atteindre un objectif. Exemples de langages procéduraux : C, Pascal, et Fortran.\n\n__Langage séquentiel__\nUn langage séquentiel se réfère à la manière dont les instructions sont exécutées dans un programme. Dans un langage séquentiel, les instructions sont exécutées une par une dans l’ordre où elles apparaissent, de haut en bas. Cela signifie que chaque instruction doit être complétée avant que la suivante ne commence. Bien que la plupart des langages procéduraux soient également séquentiels, le terme “séquentiel” met l’accent sur l’ordre d’exécution des instructions.\n\n*Différences clés*\n* Approche : Les langages procéduraux se concentrent sur la décomposition des tâches en procédures ou fonctions, tandis que les langages séquentiels mettent l’accent sur l’exécution ordonnée des instructions.\n* Modularité : Les langages procéduraux favorisent la modularité en permettant de réutiliser des blocs de code (procédures), ce qui peut rendre le code plus facile à gérer et à maintenir2.\n* Exécution : Dans un langage séquentiel, l’exécution suit strictement l’ordre des instructions, ce qui est également vrai pour les langages procéduraux, mais ces derniers peuvent inclure des structures de contrôle comme les boucles et les conditions pour modifier cet ordre.","tags":"","title":"$:/doc/developpement/paradigme_de_programmation","modified":"20241012181634323","type":"text/markdown"},
2804{"created":"20240911083437144","text":"https://discord.gg/SA96eyHqUH\n\nhttps://discord.com/channels/1283431752991375401/1283431964430569613\n\n","tags":"","title":"$:/doc/discord","modified":"20240911142648681"},
2805{"created":"20240911140617560","text":"\n```js\n/**\n * This is a function.\n *\n * @param {string} n - A string param\n * @param {string} [o] - A optional string param\n * @param {string} [d=DefaultValue] - A optional string param\n * @return {string} A good string\n *\n * @example\n *\n *     foo('hello')\n */\n\nfunction foo(n, o, d) {\n  return n\n}\n```\n\navec vsCode `/**`\n\n[[https://devhints.io/jsdoc]]\n","tags":"","title":"$:/doc/docBlock","modified":"20240919151122256"},
2806{"created":"20241011084137232","text":"# Travailler avec des conteneurs\n\n### Qu'est-ce qu'un conteneur ?\n\nUn **conteneur** *(container)* est une machine virtuelle très légère, qui contient les logiciels nécessaires à faire tourner nos applications : \u003Chttp://docker.com/ressources/what-container>. Cet outil sert notamment à harmoniser les environnements d'exécution des machines de développement, de pré-production *(staging)* et de production.\n\n\u003Cfieldset>\nUn conteneur Docker contient principalement un système d'exploitation et/ou des programmes. Plus précisément :\n\n* Un système d'exploitation minimal : Chaque conteneur inclut les composants essentiels du système d'exploitation nécessaires pour exécuter des applications.\n\n* Des programmes/applications\n\u003C/fieldset>\n\n\n### Docker, un gestionnaire de conteneurs\n\nAvec Docker, on peut configurer des conteneurs très rapidement et les répliquer à l'identique pour tout le monde. Ainsi pendant le développement, les tests et la mise en production, le même environnement d'exécution sera installé.\n\nChaque conteneur contient un système d'exploitation *(OS)*, mais aussi les logiciels nécessaires et notre c
2806ode source.\n\n### Les avantages de Docker\n\nDocker permet de faire tourner notre application sans avoir à configurer une machine spécifiquement pour. On peut sur la même machine faire tourner plusieurs applications qui ont besoin d'environnements différents, sans installer de lourdes machines virtuelles. Les conteneurs ne contiennent que ce qui est nécessaire pour faire tourner notre application, on utilise donc moins de ressources.\n\nLes conteneurs sont portables et peuvent être déployés n'importe où très rapidement et à grande échelle.\n\nLe conteneur, c'est à dire l'environnement d'exécution, peut être partagé très facilement et très rapidement avec ses collègues.\n\n### Comment créer un conteneur avec Docker\n\nPour créer un conteneur, nous écrirons un script qui donnera les instructions de création à Docker. Ce script, stocké dans un fichier, permettra de construire une **image** qui servira ensuite de modèle pour la création des conteneurs.\n\nQui dit \"script\", sous-entend \"nouveau langage de script\" ! Mais heureusement, nous aurons aussi à disposition un vaste catalogue d'images tout prêtes grâce à [DockerHub](https://hub.docker.com/) et sa communauté.\n\n### DockerHub\n\n[DockerHub](https://hub.docker.com/) regroupe toutes les images disponibles, officielles ou pas. Nous pouvons contribuer à cette bibliothèque en créant un compte, et en déposant nos propres images pour les mettre à disposition de la communauté.\n\nUn moteur de recherche nous permet de trouver les images nécessaires au fonctionnement de notre application. Seulement, nous allons nous trouver face à un dilemne, quelle version choisir ? Il y a beaucoup de tags différents pour une même version.\n\nVoici un article pour comprendre ces tags justement : [medium.com Alpine, Slim, Stretch, Buster, Jessie, Bullseye — What are the Differences in Docker Images?](https://medium.com/swlh/alpine-slim-stretch-buster-jessie-bullseye-bookworm-what-are-the-differences-in-docker-62171ed4531d)\n","tags":"$:/code/docker","title":"$:/doc/docker","modified":"20241018081630394","type":"text/markdown","icon":"$:/img/ico/docker.svg"},
2807{"created":"20240918080724354","text":"raccourcis windows 10 ou 11 : `windows` + `.` ou `windows` + `;`","tags":"","title":"$:/doc/émoticônes","modified":"20240918080817675"},
2808{"created":"20240621081703473","text":"!! Express.js\n\nExpress est un Framework Web Node.js minimal et flexible qui fournit un ensemble robuste de fonctionnalités pour les applications Web et mobiles ( notamment un serveur web)\n\n* Site de référence : [[https://expressjs.com/]]\n\nPour des fonctionnalités à l'image d'Express.js, voir aussi [[Fastify|https://fastify.dev/]] par exemple pour javascript ou codeigniter pour PHP ou encore Nest.js pour Typescript.\n\n!!! ''Organisation type des dossiers et fichiers'' (exemple) \n\n\n```\n├─ node_modules/\n├─ app/\n│  └─ views/   (si on utilise un moteur de template de type ejs)\n│     └─ partials/   (si on utilise un moteur de template de type ejs)\n│        └─ header.ejs\n│        └─ footer.ejs\n│  └─ models/   (si on utilise un moteur de template de type ejs)\n│  └─ controllers/   (si on utilise un moteur de template de type ejs)\n│     └─ controllers.js \n│  └─ middlewares.js  \n│  └─ router.js\n├─ public/\n│  ├─ css/\n│  │  ├─ style.css\n│  │  └─ reset.css\n│  └─ img/\n|     └─ background.png\n├─ .gitignore                        {{$:/doc/git}}\n├─ .env\n├─ .env_exemple\n├─ index.js         {{$:/code/js/module/express/template/ejs/index.js}}\n└─ package.json                   {{$:/code/node.js/ejs/package.json}}\n\n```\n\n!!! ''installation from scratch (et impact sur package.json)''\n\n```\n// creation des dépendance pour nodes et du fichier package.json\n// npm init -y\n// creation des fichiers nécessaires pour dotenv et git \n// soit le .gitignore et le .env (et.env_exemple)\n// si on utilise la syntaxe ESM (.ejs), on ajoute l option  type:module dans package.json\n\nnpm install express \n//ou plus complet\nnpm install express dotenv mongodb \n\n```\non peut maintenant créer un fichier index.js avec un console log de controle.\n\nA ce moment, le fichier package.json contient par exemple les éléments suivants :\n\n```js\n{  \n\"type\": \"module\" ,\n  \"dependencies\": {\n    \"express\": \"^4.19.2\"\n  }\n}\n```\nOn peut aussi installer node-dev si il n'est pas déja installer. Il n'est utile que sur l'environnement de developpement.\n\n```\nnpm install node-dev --save-dev\n```\net installer quelques scripts pratiques :\n\n```js\n  \"scripts\": {\n    \"start\": \"node index\",\n    \"dev\": \"node-dev index --clear --notify=false\"\n  },\n\n```\nPour la gestion de la session, si on utilise express-session il faut l'installer et les autres possibles dépendances:\n\n```\nnpm install express-session\nnpm install dotenv\nnpm install ejs\nnpm install bcrypt\nnpm install validator\n\n```\n\n!!! ''Mise en place des dépendances du module express dans le fichiers js principal : exemple index.js''\n\n```js\nimport express from \"express\";\nimport dotenv from \"dotenv\" ;\n\n// gestion des variables d'environnement\ndotenv.config() ;\n\n// On definit le port sur lequel on veut que notre serveur ecoute (plusieurs serveurs peuvent tourner sur la meme machine, en revanche chacun doit tourner sur un port unique)\nconst port = process.env.PORT || 3000;\n\n// on instancie le serveur\nconst app = express();\n\n// on configure le moteur de template\napp.set('view engine', 'ejs');\n\n// on configure le chemin vers le dossier des views\napp.set('views', './app/views/');\n// ...\n\n\n\n\n\n```\n\n!!! '' mise en place du middleware afin d'identification des fichiers public (convention de nommage) ''\n\n```js\n// on configure le chemin des données publics 
2808si nécessaire\napp.use(express.static('./public'));\n\n//  pour gérer des formulaires envoyant des informations dans le corps de la requête qu'il faudra parser on ajoute le middlawre unrlencoded\napp.use(express.urlencoded({ extended: true }));\n```\n!!! '' Mise en écoute du serveur ''\n\n```js\napp.listen(port, () => {\n    console.log(`Listening on http://localhost:${port}/`)\n})\n```\n\n\n!!! '' Pour déclarer les éléments standards des pages web (middleware) ''\n\n```js\n// On voudrait faire un console.log affichant la route demandee par l'utilisateur et ce, peu importe la demande (qu'il aille sur la page d'accueil ou n'importe quelle autre page)\n// Et egalement definir la langue de contenu\napp.use((req, res, next) => {\n    console.log(req.url);\n    res.set('Content-Language', 'fr')\n    next();\n})\n\n```\n\nOn ajoute si nécessaire le middleware pour la gestion de la session \n\n {{$:/code/js/module/express/express-session}}\n\n!!! ''Mise en place du router (si les routes ne sont pas gérees dans index.js)''\n\n```js\n// on importer les elements pour la gestion générique des routes\nimport router from './app/router.js';\n\n\n```\n\n\n!!! '' gestion de la réponse (avec plusieurs routes possibles) - mise en place du controller ''\n\n```js\n\n// On gere la reponse pour la page d'accueil ('/')\napp.get('/', (req, res) => {\n    res.send(`\n        \u003Cnav>\n            \u003Ca href=\"/\">Accueil\u003C/a>\n            \u003Ca href=\"/contact\">Contact\u003C/a>\n            \u003Ca href=\"/a-propos\">A propos\u003C/a>\n        \u003C/nav>\n        \u003Ch1>Boulangerie-Pâtisserie Miam\u003C/h1>\n        \u003Cp>Des petits gâteaux à tout moment du tantôt.\u003C/p>\n        `)\n})\n\n\napp.get('/contact', (req, res) => {\n    res.send(`\n        \u003Cnav>\n            \u003Ca href=\"/\">Accueil\u003C/a>\n            \u003Ca href=\"/contact\">Contact\u003C/a>\n            \u003Ca href=\"/a-propos\">A propos\u003C/a>\n        \u003C/nav>\n        \u003Ch1>Contact\u003C/h1>\n        \u003Ca href=\"mailto:[email protected]\">Nous contacter\u003C/a>\n        `)\n})\n```\n!!! '' Gestion des redirections ''\n\n\n```js\napp.get('/qui', (req, res) => {\n    res.statut(403).send('\u003Ch1> Acces interdit\u003C/h1>')\n})\n\n```\n\n\n```js\napp.get('/qui-sommes-nous', (req, res) => {\n    res.redirect(301,'contact')\n})\n\n```\n\n\n\n* res.locals est un objets vide dans lequel on peut stocker ce qu'on veut, ce qui permet d'exploiter des données d'une fonction d'un middleware\n\n```js\nconsole.log(res.locals)\napp.use((req, res) => {\n    res.locals.toto = \"roger\";\n})\n\n```\n\n* Le routeur (router.js):\n\n```js\n// le routeur analyse la demande de l'utilisateur pour servir la bonne route\n\nimport express forme 'express';\nconst router = express.Router();\n\n```\n* le rooteur doit être appeler dans le fichier principal (index.js) \n\n```js\napp.use(router);\n```\n\nastuce : Ctrl+D à partir d'un texte selectionné, on a toutes les occurences de la selection  à valider pour modifier.\n\nDRY: don't repeat yourself\n\n* Convention de nommage \n\n>:id = nombre \n>:slug=chaine sans espace\n\n\n* Réponses dynamiques et réponses statiques\n\n> On distingue 2 types de réponses :\n> * statique\n> * dynamique\n\n```js\n//Express fourni une fonction retournant un middleware tout fait pour servir le contenu des fichiers d'un dossier chaque fois qu'un chemin correspondant est demandé : La fonction express.static\n\nimport express from 'express';\n\nconst app = express();\n\n// on ajoute un middleware via .use à qui on passe la fonction retournée par express.static\n// on doit configurer en argument le chemin vers le dossier à servir\napp.use(express.static('./public'));\n```\n\nLes alternatives à express :\n---\n\n1. Koa.js: Créé par les développeurs d'Express, Koa est plus moderne et promet une meilleure modularité.\n\nInconvénients: Moins de middleware par défaut, ce qui peut être un frein si tu souhaites des solutions toutes faites.\n\n2. Hapi.js: Conçu pour des applications plus robustes et sécurisées.\n\nInconvénients: Courbe d'apprentissage plus raide et moins de flexibilité comparé à Express.\n\n3. Sails.js: Inspiré par les frameworks MVC, il est idéal pour des applications de données lourdes.\n\nInconvénients: Overkill pour des projets plus petits, et peut être lourd.\n\n4. Nest.js: Un framework Node.js progressif basé sur TypeScript.\n\nInconvénients: La nécessité de bien connaître Type
2808Script et une certaine complexité initiale.\n\nEn ce qui concerne Fastify.js pour ceraints projets react :\n\n* Courbe d'apprentissage: en raison de son architecture basée sur les plugins et de ses fonctionnalités avancées\n.\n\n* Complexité de configuration: Pour des projets simples, Fastify peut être un peu trop robuste et nécessiter une configuration plus complexe par rapport à Express.js.\n\n* Moins de documentation: Bien que la documentation de Fastify soit en constante amélioration, elle peut encore être moins complète que celle d'autres frameworks plus populaires comme Express.js.\n\n* Adoption: Fastify n'est pas aussi largement adopté que certains autres frameworks, ce qui peut limiter la disponibilité des plugins et des ressources communautaires.","tags":"","title":"$:/doc/express","modified":"20241028145552289","type":""},
2809{"created":"20240924083134581","text":"","tags":"","title":"$:/doc/express-jsdoc-swagger","modified":"20240924083149801"},
2810{"created":"20240710073607556","text":"https://code.fittenlab.com/","tags":"","title":"$:/doc/Fcoder","modified":"20240710073629074"},
2811{"created":"20240723060534163","text":"Pour retrouver une font à partir d'une image\n\n* https://www.myfonts.com/\n* https://www.whatfontis.com\n* https://www.fontspring.com/matcherator\n\n\n\nPour télécharger des fonts \n\n* https://www.ffonts.net/Asimov-Print-B.font?text=FEATURES#\n\n\n\n","tags":"","title":"$:/doc/font","modified":"20240723071028145"},
2812{"created":"20240914124008741","text":"","tags":"","title":"$:/doc/Gdorks","modified":"20240914124025702"},
2813{"created":"20241009063617434","text":"__GIT__\n\n> Git est un outil collaboratif de gestion de version (versioning).\n\n* Différences entre Git & GitHub\n  * Git (commande git) est l’outil open source de gestion de version, qu’on installe sur sa machine pour versionner notre code « localement » \n  * GitHub (github.com) est une plateforme de services & un réseau social permettant de partager son code dans un dépôt Git centralisé et partagé sur internet, mais également de communiquer avec d’autres développeurs par l’intermédiaire de commentaires, d’issues, etc.\n\nGitHub est probablement LE réseau social de développeurs le plus populaire aujourd’hui, mais certainement pas le seul. Il existe également Gitlab, Bitbucket, etc.\n\nPour un dossier de travail donné, Git manipule différents « espaces virtuels » :\n\n1. Workspace (ou working directory) : espace stockant les modifications en cours qui ne sont pas prises en compte par Git.\n1. Staging area (ou index) : espace stockant les modifications en cours qui seront prises en compte par Git dans le prochain commit.\n1. Local repository : espace stockant les modifications prises en compte par Git dans les commits.\n1. Remote repository : dépôt distant (sur GitHub par exemple) auquel est relié votre dépôt local. Les commits du dépôt local doivent y être pushés pour mettre le dépôt distant à jour et collaborer avec d’autres personnes.\n\n### Pour protéger la branche principale d'un dépôt public sur GitHub, suivez ces étapes :\n\n\n\n1. Accédez aux paramètres du dépôt : Ouvrez votre dépôt GitHub, puis allez dans Paramètres (Settings).\n\n1. Accédez aux paramètres des branches : Dans le menu latéral, cliquez sur Branches (Branches) sous Code et automation.\n\n1. Protégez la branche : Sous la section Protection des branches (Branch protection rules), cliquez sur Ajouter une règle (Add rule).\n\n1. Définissez les règles : Indiquez main (ou le nom de votre branche principale) dans le champ Nom du modèle (Branch name pattern). Ensuite, cochez les options suivantes pour protéger votre branche :\n\n* Require pull request reviews before merging (Exiger des revues de pull requests avant la fusion)\n\n* Require status checks to pass before merging (Exiger que les vérifications de statut réussissent avant la fusion)\n\n* Include administrators (Inclure les administrateurs) si vous souhaitez que les administrateurs suivent également ces règles.\n\n* Enregistrez les modifications : Cliquez sur Créer (Create) ou Enregistrer (Save changes) en bas de la page pour appliquer les règles de protection.","tags":"$:/sigle","t
2813itle":"$:/doc/git","modified":"20241021134750814","type":"text/markdown","icon":"$:/img/ico/git.svg"},
2814{"created":"20240607141519007","text":"\n* [[https://search.google.com/search-console?resource_id=https%3A%2F%2Fiap2p.vercel.app%2F]]","tags":"","title":"$:/doc/google_search_console","modified":"20240607141556059"},
2815{"created":"20241014153244065","text":"__Les arbres__\n> En théorie des graphes , un arbre est un graphe non orienté dans lequel deux sommets quelconques sont connectés par exactement un chemin , ou de manière équivalente un graphe non orienté acyclique connexe .\n\n* Source : {{!!source}}\n  \nLes arbres sont une structure de donnée, à l'image d'une arborescence que l'on retrouve régulièrement en informatique \n\n{{$:/diagrammes/arbres/fig1}}\n \n__Les forêts__\n> Une forêt est un graphe non orienté dans lequel deux sommets quelconques sont connectés par au plus un chemin, ou de manière équivalente un graphe non orienté acyclique, ou de manière équivalente une union disjointe d'arbres.\n\n* Source : {{!!source}}\n","tags":"","title":"$:/doc/graph/arbre","modified":"20241014155736120","type":"text/markdown","source":"[[Wikipedia|https://en.wikipedia.org/wiki/Tree_(graph_theory)]]"},
2816{"created":"20241007080753152","text":"https://www.alwaysdata.com/fr\n\nhttps://github.com/alwaysdata/autodeploy-git-hook","tags":"","title":"$:/doc/hebergement/alwaysdata","modified":"20241007081457068"},
2817{"created":"20241007075417415","text":"","tags":"","title":"$:/doc/hebergement/netify","modified":"20241007075623755"},
2818{"created":"20240708070255501","text":"Voir également : [[$:/doc/hebergement/netify]]\n\n[[https://vercel.com/guides/using-express-with-vercel]]\n\n```ksh\nnpm i -g vercel\n```\n* login to vercel\n```\nvercel login\nvercel dev\n```\n\n[[https://medium.com/@ShrianshAgarwal/deploying-express-backend-to-vercel-7664ef880005]]\n\n\n* contenu de package.json\n\n```json\n{\n \"version\": 2,\n \"builds\": [\n  {\n   \"src\": \"app.js\",\n   \"use\": \"@vercel/node\",\n   \"config\": { \"includeFiles\": [\"app/**\"] }\n  }\n ],\n \"routes\": [\n  {\n   \"src\": \"/(.*)\",\n   \"dest\": \"app.js\"\n  }\n ]\n}\n\n\n{\n  \"version\": 2,\n  \"builds\": [\n    {\n      \"src\": \"index.js\",\n      \"use\": \"@vercel/node\"\n    }\n  ],\n  \"routes\": [\n    {\n      \"src\": \"/(.*)\",\n      \"dest\": \"index.js\"\n    }\n  ]\n}\n\n\n```\n\n```js\n\nimport express from \"express\";\nimport * as middlewares from \"./app/middlewares.js\";\nimport * as dotenv from \"dotenv\";\nimport router from \"./app/router.js\";\nimport { join } from \"path\";
2818\n\ndotenv.config();\n\n\nconst app = express();\nconst port = process.env.PORT || 3000;\n\n\napp.use(express.static(join(process.cwd(), \"public\")));\n\n\n// app.use('/:location', middlewares.userTracker)\napp.use(router);\napp.use(middlewares.errorHandler);\n\n\napp.listen(port, () => {\n  console.log(`Serveur lancé sur http://localhost:${port}/`);\n});\n\n\nexport default app;\n```","tags":"","title":"$:/doc/hebergement/vercel","modified":"20241007075709756"},
2819{"created":"20240902084137101","text":"\n## La validité du code html :\n\nLes outils pour vérifier la validité du code\n\n### En mode création\n\n- Can i include : [https://caninclude.glitch.me/](https://caninclude.glitch.me/)\n- Can i use : [https://caniuse.com/](https://caniuse.com/)\n- Extensions Chrome (Existe aussi pour Firefox) : \n   - [Web Developper](https://chromewebstore.google.com/detail/web-developer/bfbameneiokkgbdmiekhjnmfkcnldhhm)\n   - [HeadingsMap](https://chromewebstore.google.com/detail/headingsmap/flbjommegcjonpdmenkdiocclhjacmbi)\n   - [WCAG Contrast Checker](https://chrome.google.com/webstore/detail/wcag-color-contrast-check/plnahcmalebffmaghcpcmpaciebdhgdf?hl=fr)\n   - [RGAA](https://assistant-rgaa.empreintedigitale.fr/)\n\n### En mode vérification\n\n- Validateur du W3C (HTML seulement) : [https://validator.w3.org/](https://validator.w3.org/) \n- Bookmarklet validateur du DOM : [Deque University - Validator](https://dequeuniversity.com/validator)\n- Bookmarklets pour encadrer les éléments par type : [Accessibility Bookmarklets](https://accessibility-bookmarklets.org/install.html)\n- Barre du développeur : [https://chrome.google.com/webstore/detail/web-developer/bfbameneiokkgbdmiekhjnmfkcnldhhm](https://chrome.google.com/webstore/detail/web-developer/bfbameneiokkgbdmiekhjnmfkcnldhhm) \n- [Arbre d’accessibilité](https://blog.ineat-group.com/2023/04/utiliser-larbre-daccessibilite/)\n- [Cheat sheet pour NVDA](https://dequeuniversity.com/screenreaders/nvda-keyboard-shortcuts#nvda-the_basics)\nNVDA : NVDA+F7 → régions\n\n### 🚀 Pour aller plus loin \n\n- [FreecodeCamp - What are Bookmarklets](https://www.freecodecamp.org/news/what-are-bookmarklets/)\n\n### ✔️ Checklist\n\n- [x]  Le titre de la page doit être unique\n- [ ]  L’ensemble des éléments de la page doit être réparti dans des zones de repère.\n- [ ]  Un seul `\u003Cmain>` autorisé\n- Plusieurs `\u003Cheader>` et `\u003Cfooter>` sont autorisés\n- [ ]  `\u003Caside>` est optionnel\n- [ ]  L’ordre des titres doit être logique et en rapport avec le contenu\n- [ ]  PLusieurs `\u003Cnav>` sont autorisées\n- [ ]  `\u003Cnav role=\"navigation\">` ne doit contenir que des liens permettant de naviguer sur le site ou dans la page\n- [ ]  Les liens de navigation contenus dans `\u003Cnav role=\"navigation\">` doivent être listés dans un `\u003Cul>`","tags":"","title":"$:/doc/html/validité","modified":"20240904082959091","type":"text/markdown"},
2820{"created":"20240820063752001","text":"## Les méthodes HTTP\n\nLes méthodes HTTP sont des verbes qui décrivent l'action que l'on souhaite effectuer sur une ressource. Les méthodes HTTP les plus utilisées sont :\n\n- **GET** : pour récupérer une ressource\n- **POST** : pour créer une ressource\n- **PUT** : pour mettre à jour une ressource\n- **PATCH** : pour mettre à jour partiellement une ressource\n- **DELETE** : pour supprimer une ressource\n\nOn utilise ces méthodes HTTP dans les requêtes HTTP. Par exemple, pour récupérer les informations d'un utilisateur, on peut faire une requête HTTP de type GET sur l'URL `/utilisateurs/1`.\n\nMais on peut aussi, avec la même URL, faire une requête HTTP de type PUT pour modifier un utilisateur.\nOu encore, faire une requête HTTP de type PATCH pour mettre à jour partiellement les informations d'un utilisateur.\n\n## GET\n\nGET est la principale et la plus ancienne des requêtes HTTP. Cette méthode de requête existe depuis le début du Web. Elle est utilisée pour demander des ressources au serveur, par exemple des données JSON ou un fichier HTML.\n\nDans le cadre d'une API web, GET servira à récupérer une ressource ou plusieurs ressources du même type.\n\nExemple :\n\nGET http://localhost/api/rooms devrait renvoyer la liste des chambres.\nGET http://localhost/api/rooms/3 devrait renvoyer les informations de la chambre qui a pour identifiant 3.\n\n## POST\nLe GET avec des paramètres c’est déjà super cool, mais si on a beaucoup d’informations à transmettre au serveur, ce n’est pas optimal. On risque de se retrouver avec une requête avec des paramètres à rallonge.\n\nC’est pour ça qu’on a la méthode POST. Au lieu de transmettre nos paramètres dans l’URL de la requête, on va les ajouter dans le corps de la requête HTTP (aussi appelé BODY).\n\nLa méthode POST est majoritairement utilisée pour les formulaires.\n\nDans le cadre d'une API web, POST servira à créer une nouvelle ressource.\n\nExemple :\n\nPOST http://localhost/api/rooms devrait créer une nouvelle chambre. Il faudra aussi transmettre les informations de la nouvelle chambre.\n\n## PATCH\nDans le cadre d'une API web, PATCH servira à modifier une ressource déjà existante.\n\nExemple :\n\nPATCH http://localhost/api/rooms/3 devrait modifier les informations de la chambre qui a pour identifiant 3. Il faudra aussi transmettre les nouvelles informations pour permettre l'édition.\n\n## DELETE\n\nDans le cadre d'une API web, DELETE servira à modifier une ressource existante.\n\nExemple :\n\nDELETE http://localhost/api/rooms/3 devrait supprimer les informations de la chambre qui a pour identifiant 3.\n\n## Paramètres URL\nIl est possible d'ajouter des informations supplémentaires à notre requête. Cela va permettre au serveur de traiter les informations à renvoyer.\n\nLa chaîne de requête est introduite par un « ? » (point d’interrogation).\nChaque paramètre est nommé, il se compose donc d’un nom et d’une valeur : « Nom=Valeur ».\nSi plusieurs paramètres doivent être inclus, ils sont reliés par un « & ».\n\n\n","type":"text/markdown","title":"$:/doc/HTTP","tags":"","modified":"20241010074409573"},
2821{"created":"20240910080050383","text":"# AJAX\n\nAjax permet d'exécuter une requête HTTP depuis un serveur pour dynamiser une vue.\n\nIl est possible de récupérer, envoyer, supprimer, modifier des données avec des [[requêtes HTTP|$:/doc/HTTP]] \n\nMais quand on effectue une requête HTTP via le navigateur, notre page se recharge. Il n'est plus possible demander à nos clients de charger des url d'une API web....\n\nOn va donc parler de AJAX, un outil qui va nous permettre d’effectuer des requêtes HTTP vers une API, sans recharger la page (donc depuis le front).\n\n> AJAX est l'acronyme de **Asynchronous Javascript And Xml**. \n\n## Asynchrone\n\nPourquoi **asynchrone** au fait ?\n\nImaginons qu'un site web fasse appel à une API web de manière __synchrone__ : notre application va **exécuter une requête HTTP** (appeler une des urls de l'API web), puis va attendre la réponse à cette requête pour continuer d'exécuter le code.\n\n\nMais il se passe quoi si le serveur web de l'API web est très lent, voir même hors-ligne ou a tout simplement crashé ? Et bien notre application va se bloquer... L'utilisateur devra attendre et ne pourra plus utiliser l'interface...\n\nDe plus, faire une requête HTTP n’est jamais instantané. \n\nGrâce à l'utilisation de l'__asynchronicité__, notre application n’est pas en pause ou bloquée. L'utilisateur peut continuer à utiliser le site web, en attendant la réponse de l'API web.\n\nAinsi, si on execute une requête HTTP de manière asynchrone, puis on affiche un message (synchrone cette fois), JS va afficher le message pendant que la requête récupère la réponse.\n\nUne requête asynchrone va donc nous permettre de décrire l’application dans un état de chargement tant qu’une réponse n’est pas arrivée, puis quand elle arrive, décrire un état chargé.\n\nCette asynchronicité est possible grâce à l'utilisation des [Promesses](https://developer.mozilla.org/fr/docs/Web/JavaScript/Guide/Using_promises) de Javascript.\n\n### Comment faire ?\n\nOK mais comment exécuter nos requêtes AJAX du coup ?\n\nIl existe plusieurs méthodes :\n\n* Via XMLHttpRequest ([MDN](https://developer.mozilla.org/fr/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest)) – old school et pratique, mais syntaxe lourde\n* Via fetch ([MDN](https://developer.mozilla.org/fr/docs/Web/API/Fetch_API/Using_Fetch)) – new school et pratique, pourquoi pas\n* Via une bibliothèque (comme [Axios](https://github.com/axios/axios)) – offrira des petites possibilités de configuration parfois bien pratiques\n\nNous utiliserons Fetch ensemble.\n\n## FETCH\n\n>Fetch est une manière de travailler avec les requêtes HTTP de manière asynchrone assez récente. L’avantage de cette méthode, c’est que la syntaxe est légère.\nFetch() est toujours utilisée de manière asynchrone. \nL'asynchronicité, les promesses en Javascript, peut être gérée avec *then* ou avec *async/await*.\n\nExemple de syntaxe :\n\n```javascript\nfetch(MyURL, myOptions).then((response) => {\n  console.log(response)\n})\n```\n\n- myURL = C’est l’url/endpoint de la ressource que l’on souhaite récupérer\n- myOptions = C’est dans cet objet qu’on met les options de notre requête, par exemple :  GET ou POST ou la gestion du cache\n- then = contient le retour de notre requête asynchrone, on va pouvoir l’utiliser dans la fonction qui a comme paramètre retour en question\n- response = la réponse à notre requête\n\nVoici deux exemples d'utilisation de fetch, tu pourras croiser les deux dans ta vie de développeur. Choisis celle avec laquelle tu te sens plus à l'aise, elles font la même chose.\n\nExemple de requête en méthode *GET* en utilisant *async/await* :\n\n```js\n/**\n * Options de la future requête HTTP\n */\nlet fetchOptions = {\n  // --- Toujours défini :\n\n  // La méthode HTTP (GET, POST, etc.)\n  method: 'GET',\n  \n  // --- Bonus (exemples) :\n\n  // On utilisera souvent Cross Origin Resource Sharing qui apporte\n  // une sécurité pour les requêtes HTTP effectuée avec XHR entre 2\n  // domaines différents.\n  mode: 'cors',\n  \n  // Veut-on que la réponse puisse être mise en cache par le navigateur ?\n  // Non durant le développement, oui en production.\n  
2821cache: 'no-cache'\n  \n  // Si on veut envoyer des données avec la requête => décommenter et remplacer data par le tableau de données\n  // , body : JSON.stringify(data)\n};\n\n/**\n * La fonction native fetch() permet de lancer une requête HTTP depuis JS.\n *\n * Dans DevTools > onglet \"Network\", on pourra voir cette requête avec le\n * filtre \"XHR\".\n *\n * Arguments de fetch() :\n * 1. l'URL à laquelle on veut accéder\n * 2. les options de cette requête HTTP\n */\n\n// On envoie la requête et on attend qu'elle soit terminée pour exécuter ce qui suit\nconst response = await fetch('http://www.domaine.tld/endpoint', fetchOptions);\n\n// Le résultat n'est pas dans un format qui nous plait, on le transforme en objets javascript !\n// La fonction json retournant une promise, on attend un résultat pour poursuivre\nconst jsonResponse = await response.json();\n\n// Une fois qu'on a toutes les données qui nous intéressent, on affiche notre résultat\nconsole.log(jsonResponse);\n```\n\nExemple de requête en méthode *GET* en utilisant *.then* :\n```javascript\n/**\n * Options de la future requête HTTP\n */\nlet fetchOptions = {\n  // --- Toujours défini :\n\n  // La méthode HTTP (GET, POST, etc.)\n  method: 'GET',\n\n  // --- Bonus (exemples) :\n\n  // On utilisera souvent Cross Origin Resource Sharing qui apporte\n  // une sécurité pour les requêtes HTTP effectuée avec XHR entre 2\n  // domaines différents.\n  mode: 'cors',\n  // Veut-on que la réponse puisse être mise en cache par le navigateur ?\n  // Non durant le développement, oui en production.\n  cache: 'no-cache'\n  \n  // Si on veut envoyer des données avec la requête => décommenter et remplacer data par le tableau de données\n  // , body : JSON.stringify(data)\n};\n\n\n/**\n * La fonction native fetch() permet de lancer une requête HTTP depuis JS.\n *\n * Dans DevTools > onglet \"Network\", on pourra voir cette requête avec le\n * filtre \"XHR\".\n *\n * Arguments de fetch() :\n * 1. l'URL à laquelle on veut accéder\n * 2. les options de cette requête HTTP\n */\nconst request = fetch('http://www.domaine.tld/endpoint', fetchOptions);\n// La requête vient d'être envoyée !\n\n// On n'a pas encore la réponse, mais on se prépare déjà à la recevoir.\n// Une fois la réponse reçue, la fonction de callback précisée en argument\n// sera automatiquement appelée.\nrequest.then(\n  // Cette fonction de callback est définie directement \"à la volée\" => fonction anonyme.\n  // Elle recevra en argument la réponse brute provenant du serveur.\n  function(response) {\n    // On sait que la réponse est au format JSON (JavaScript Object Notation),\n    // donc on transforme la réponse : conversion texte => objet JS\n    return response.json();\n  }\n)\n\n// On peut enchaîner les fonctions de traitement de la réponse.\n.then(\n  // Celle-ci étant chaînée à la précédente, elle recevra en argument la réponse\n  // précédemment convertie en objet JS.\n  function(jsonResponse) {\n    // Désormais, on a accès aux données facilement et on peut travailler avec :\n    console.log(jsonResponse);\n\n    // TODO, utiliser ces données pour modifier la page, afficher les données, etc.\n  }\n);\n```\n\n### Et en cas d'erreur ?\n\nEn cas d'erreur, nous aimerions récupérer le message afin de l'afficher en console. Comment faire ? Simplement avec `try/catch`.\n\nVoici un exemple :\n```js\n try {\n    const response = await fetch('http://www.domaine.tld/endpoint', { \n      method: DELETE,\n      mode: 'cors',\n      cache: 'no-cache'\n    });\n  } catch (error) {\n    console.log('Fetch error: ', error);\n  }\n```\n\nNous pouvons aussi lancer une exception créée de toute pièce. Par exemple, voici une fonction qui utilise `fetch` : \n\n```js\nasync function sendRequestToAPI() {\n  const response = await fetch('http://www.domaine.tld/endpoint');\n\n  if (!response.ok) {\n    const message = `An error has occured: ${response.status}`;\n    throw new Error(message);\n  }\n\n  const result = await response.json();\n  return result;\n}\n```\nOn peut voir qu'en cas d'erreur, on *lance une exception*. Quand nous utiliserons cette fonction, nous pourrons alors mettre en place la récupération de cette exception si elle survient !\n\nAvec `try/catch` : \n\n```js\ntry {\n  const result = await sendRequestToAPI();\n}\ncatch(error) {\n  console.log(error.message);\n}\n```\n\nAvec `catch()` :\n\n```js\nsendRequestToAPI().catch(error => {\n  error.message;\n});\n```\n","tags":"","title":"$:/doc/HTTP/AJAX","modified":"20241002073627089","type":"text/markdown"},
2822{"created":"20240826090101037","text":"**Liste des principaux codes d'erreur HTTP :
2822**\n\n[[https://fr.wikipedia.org/wiki/Liste_des_codes_HTTP]]\n\n**1xx - Information  :**\n* 100 Continue - Attente de la suite de la requête.\n* 102 Processing - Traitement en cours (évite que le client dépasse le temps d’attente limite).\n\n**2xx - Succèss  :**\n* **200** Ok - Attente de la suite de la requête -\tRequête traitée avec succès\n* **201** Created - Requête traitée avec succès et création d’un document.\n* 202 \tAccepted - Requête traitée, mais sans garantie de résultat\n* 204 No Content -\tRequête traitée avec succès mais pas d’information à renvoyer.\n\n**3xx - Redirection**\n\n* 303 See Other - \tLa réponse à cette requête est ailleurs.\n\n**4xx - Erreurs côté client :**\n* **400** Bad Request\n* **401** Unauthorized\n* **403** Forbidden\n* **404** Not Found\n* 405 Method Not Allowed\n* 406 Not Acceptable\n* 408 Request Timeout\n* 409 Conflict\n* 410 Gone - La ressource n'est plus disponible et aucune adresse de redirection n’est connue.\n* 413 Payload Too Large\n* 414 URI Too Long\n* 415 Unsupported Media Type\n* 429 Too Many Requests\n  \n**5xx - Erreurs côté serveur :**\n* 500 Internal Server Error\n* 501 Not Implemented\n* 502 Bad Gateway\n* 503 Service Unavailable\n* 504 Gateway Timeout\n* 505 HTTP Version Not Supported\n* 507 Insufficient Storage\n* 508 Loop Detected\n* 511 Network Authentication Required\n  \nLes codes 4xx indiquent généralement un problème avec la requête du client, tandis que les codes 5xx signalent un problème du côté du serveur.\nParmi les plus courants, on retrouve le 404 (ressource non trouvée), le 403 (accès interdit), le 500 (erreur interne du serveur) et le 503 (service indisponible)\n\nSite web illustrant les codes erreurs : [[https://http.cat/]]","tags":"","title":"$:/doc/HTTP/codes_erreurs","modified":"20240925052925334","type":"text/markdown"},
2823{"created":"20241031111706919","text":"* site d'icones gratuites :\n  * https://friconix.com/","tags":"","title":"$:/doc/icone","modified":"20241031111755535","type":"text/markdown"},
2824{"created":"20240723090729608","text":"Sources d'image libre :\n\n* https://www.pexels.com/fr-fr/\n* https://iconduck.com/ ou [[https://www.logo.wine]] (pour les icônes)\n\n\nInformation sur les logos (historique, codes couleurs...):\n\n* https://dwglogo.com/reactjs/\n* https://icon-icons.com/fr/recherche/icones/nodejs\n* https://logos-world.net/","tags":"","title":"$:/doc/img","modified":"20240913105351875"},
2825{"created":"20240826222020332","text":"https://proseandconst.xyz/blog/underlined-link-inkscape/\n\nMaitriser les dimension dans Inksscape :\nhttps://www.labellenote.fr/logiciels/quelques_trucs/maitriserlesdimensionsdansinkscape/\n","tags":"","title":"$:/doc/inkscape","modified":"20240925152832946","type":"text/vnd.tiddlywiki"},
2826{"created":"20240911181744482","text":"* Documentation : [[theAlgorithms|https://github.com/TheAlgorithms/JavaScript]]","tags":"","title":"$:/doc/js/algorithmes","modified":"20240911181910082"},
2827{"created":"20240911182455384","text":"\n```js\n\n/**\n * Hamming Distance: https://en.wikipedia.org/wiki/Hamming_distance\n *\n *\n * Hamming distance is a metric for comparing two binary data strings.\n *\n * While comparing two binary strings of equal length, Hamming distance\n * is the number of bit positions in which the two bits are different.\n * The Hamming distance between two strings, a and b is denoted as d(a,b)\n */\n\n /**\n * @param {string} a\n * @param {string} b\n * @return {number}\n */\n\nexport const hammingDistance = (a, b) => {\n  if (a.length !== b.length) {\n    throw new Error('Strings must be of the same length')\n  }\n\n  let distance = 0\n\n  for (let i = 0; i \u003C a.length; i += 1) {\n    if (a[i] !== b[i]) {\n      distance += 1\n    }\n  }\n\n  return distance\n}\n```\n\n```js\n/* The Levenshtein distance (a.k.a edit distance) is a\nmeasure of similarity between two strings. It is\ndefined as the minimum number of changes required to\nconvert string a into string b (this is done by\ninserting, deleting or replacing a character in\nstring a).\nThe smaller the Levenshtein distance,\nthe more similar the strings are. This is a very\ncommon problem in the application of Dynamic Programming.\n*/\n\nconst levenshteinDistance = (a, b) => {\n  // Declaring array 'D' with rows = len(a) + 1 and columns = len(b) + 1:\n  const distanceMatrix = Array(b.length + 1)\n    .fill(null)\n    .map(() => Array(a.length + 1).fill(null))\n\n  // Initializing first column:\n  for (let i = 0; i \u003C= a.length; i += 1) {\n    distanceMatrix[0][i] = i\n  }\n\n  // Initializing first row:\n  for (let j = 0; j \u003C= b.length; j += 1) {\n    distanceMatrix[j][0] = j\n  }\n\n  for (let j = 1; j \u003C= b.length; j += 1) {\n    for (let i = 1; i \u003C= a.length; i += 1) {\n      const indicator = a[i - 1] === b[j - 1] ? 0 : 1\n      // choosing the minimum of all three, vis-a-vis:\n      distanceMatrix[j][i] = Math.min(\n        distanceMatrix[j][i - 1] + 1, // deletion\n        distanceMatrix[j - 1][i] + 1, // insertion\n        distanceMatrix[j - 1][i - 1] + indicator // substitution\n      )\n    }\n  }\n\n  return distanceMatrix[b.length][a.length]\n}\n\nexport { levenshteinDistance }\n```\n\n```js\n\n/**\n * Returns whether the given string is a valid email address or not.\n */\nconst validateEmail = (str) => {\n  if (str === '' || str === null) {\n    throw new TypeError('Email Address String Null or Empty.')\n  }\n\n  return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(str)\n}\n\nexport { validateEmail }\n\n```","tags":"","title":"$:/doc/js/algorithmes/string","modified":"20240911182835264","type":"text/markdown"},
2828{"created":"20240909121201322","text":"Le Destructurng permet de récupérer le contenu d'un tableau ou objet directement dans de
2828s variables\n\n```js\n const plats = ['Ratatouille', 'Tchoutchouka', 'Caponata ', 'Piperade', 'Bohémienne'];.\n\n// pour récupter les deux premières valeurs\nconst [ premierPlat, secondPlat ] = plats;\n```\n\n```js\nconst employe = { prenom: 'Pierre', nom: 'Dupond', age = 43 };.\n\n// pour récupérer uniquement le nom, mais cette fois-ci, le nom de la variable doit être en anglais \"lastname\" :\nconst { nom: lastname } = employe;\n\n```\n on peut également utiliser le destructuring avec un objet reçu en paramètre d’une fonction :\n\n```js\nimport {addCardToDom} from './front.js';\n\n/**\n * Cette fonction permet de générer des cartes en fonction des données qu'on lui passe\n * @param {object} data - les données passées en paramètre\n */\nexport const insertCardsFromObject = (data) => {\n    // on constate que data est un objet avec 3 clés, dont \"items\" qui contient les repos\n    \n    //data.items.forEach((repo) => {\n\n    // data.items? => if(data.items) data.items.forEach()\n\n    data.items?.forEach(({owner, name, description, html_url}) => {\n        // repoName => repo.name\n        // avatar => repo.owner.avatar_url\n        // authorName => repo.owner.login\n        // description => repo.description\n        // url => repo.html_url\n\n        // je peux construire une carte avec ces éléments\n        addCardToDom(owner.avatar_url, owner.login, name, description, html_url);\n    })\n}\n\n/**\n * Cette fonction permet de générer des cartes en fonction des données qu'on lui passe\n * @param {object} data - les données passées en paramètre\n */\nexport const insertCardsFromObject = (data) => {\n    // on constate que data est un objet avec 3 clés, dont \"items\" qui contient les repos\n    \n    //data.items.forEach((repo) => {\n    data.items.forEach(({owner, name, description, html_url}) => {\n        // repoName => repo.name\n        // avatar => repo.owner.avatar_url\n        // authorName => repo.owner.login\n        // description => repo.description\n        // url => repo.html_url\n\n        // je peux construire une carte avec ces éléments\n        addCardToDom(owner.avatar_url, owner.login, name, description, html_url);\n    })\n}\n```\n```\n\n```js\n// en 2 temps\nconst demoFunction = (objectParam) => {\n  // const demoProperty = objectParam.demoProperty;\n  const { demoProperty } = objectParam;\n  console.log(demoProperty);\n};\n\n// en 1 temps\nconst demoFunction = ({ demoProperty }) = {\n  console.log(demoProperty);\n};\n\n```\n\n```js\nfunction dessinGrapheES2015({\n  size = \"big\",\n  coords = { x: 0, y: 0 },\n  radius = 25,\n} = {}) {\n  console.log(size, coords, radius);\n  // on dessine le graphe\n}\n\ndessinGrapheES2015({\n  coords: { x: 18, y: 30 },\n  radius: 30,\n});\n\n```\n\nNote : Dans la signature de la fonction dessinGrapheES2015 ci avant, la valeur décomposée à gauche utilise un objet vide comme opérande droit ({size = 'big', coords = { x: 0, y: 0 }, radius = 25} = {}). On aurait également pu écrire la fonction sans cet objet vide mais, dans ce cas, il aurait fallu au moins un argument pour utiliser la fonction. Avec cette « forme », dessinGrapheES2015() pourra être appelée sans paramètre.\n\nPour aller plus loin : [[https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment]]\n","tags":"","title":"$:/doc/js/destructuring","modified":"20240912081858216"},
2829{"created":"20240606182201417","text":"\n__Javascript__\n\n>JavaScript est un langage interprété par le navigateur. Le JavaScript est un langage « client », c'est-à-dire exécuté chez l'utilisateur lorsque la page Web est chargée. Il a pour but de dynamiser les sites Internet (ajout d'interactivité). Il est utiliser coté serveur (server-side code)  via le framework node.js.\n\n**Langage asynchrone**  avec des opérations indépendantes.\n\n**Code impératif** : La machine lit les lignes de code du haut vers le bas.\n\n_QCM sur Javascript_\n* [[https://roadmap.sh/questions/javascript]]\n\n\n_Mindmap sur javascript_\n\n* [[Roadmap des concept de javascript |https://roadmap.sh/javascript]]\n* [[https://www.mindmeister.com/app/map/138103876?fullscreen=1&v=public]]\n\n* [[https://gogeometry.com/software/javascript/javascript-language-mind-map.html]]\n\n\n\n__Les versions ES6 (ECMAScript 2015) et ES7 (ECMAScript 2016) de JavaScript__  : \n\n_ES6_ (ECMAScript 2015)\n\n* `Let` et `Const` : Introduction des mots-clés let et const pour la déclaration de variables.\n* Fonctions fléchées : Syntaxe plus concise pour les fonctions anonymes.\n* Classes : Syntaxe pour la création de classes, facilitant la programmation orientée objet.\n* Modules : Importation et exportation de modules.\n* Promesses : Gestion asynchrone plus simple avec les promesses.\n* Template Literals : Chaînes de caractères multi-lignes et interpolation de variables.\n\n_ES7_ (ECMAScript 2016)\n* Opérateur d’exponentiation : Utilisation de `**` pour les opérations exponentielles (par exemple, `2 ** 3` pour 2 à la puissance 3).\n* Array.prototype.includes : Méthode pour vérifier si un tableau contient un certain élément (par exemple, [1, 2, 3].includes(2) retourne true).\n\n\n\n* Pour aller plus loin :\n\n   * [[Introduction au javascript - www.developppez.com|https://javascript.developpez.com/tutoriels/introduction/?page=page_1]]\n   * [[https://fr.javascript.info/]]\n\n\n\n__API Web javascript du navigateur__\n\n{{$:/diagram/js/API_web}}","tags":"$:/code/js","title":"$:/doc/js/javascript","modified":"20241018091348076","type":"text/markdown"},
2830{"created":"20241001105452934","text":"__zod__\n\n> Zod est une bibliothèque de validation de schémas pour TypeScript et JavaScript. Elle permet de définir des schémas pour vos données et de les valider de manière sécurisée et typée.\n\n Zod est souvent utilisé pour :\n\n* Valider les données des formulaires : Assurez-vous que les données soumises par les utilisateurs respectent les contraintes définies.\n* Valider les réponses des API : Vérifiez que les données reçues des API sont conformes aux attentes.\n* Valider les variables d’environnement : Assurez-vous que toutes les variables d’environnement nécessaires sont définies et valides.\n\nAvantages\n* Intégration TypeScript : Zod permet d’inférer les types TypeScript directement à partir des schémas, ce qui améliore la sécurité et la maintenabilité du code.\n* API simple et puissante : La syntaxe de Zod est intuitive et flexible, ce qui facilite la création et la gestion des schémas1.\n","tags":"","title":"$:/doc/js/module/zod","modified":"20241001105652180","type":"text/markdown"},
2831{"created":"20241014153143369","text":"","tags":"","title":"$:/doc/json","modified":"20241014153211173"},
2832{"created":"20240910085740895","text":"__JSON Web Token__\n\n>Les JSON Web Tokens (JWT) sont utilisés pour sécuriser les échanges de données entre différentes parties.\n> Ils sont souvent utilisés pour l'authentification et la gestion des droits d'accès.\n\n\nUn JWT se compose de trois parties : \n* l'en-tête (header),\n* la charge utile (payload)\n* et la signature\n\n**L'en-tête** contient des informations sur le type de token et l'algorithme de signature, **la charge utile** contient les données encodées en base64, et la **signature** est utilisée pour vérifier l'intégrité et l'authenticité du token.\n\n\nVoici quelques modules JavaScript associés à JWT :\n\n* jsonwebtoken: Un module populaire pour créer et vérifier des JWT en Node.js.\n\n* express-jwt: Un middleware pour Express.js qui permet de vérifier les JWT dans les requêtes HTTP.\n\n* passport-jwt: Un plugin pour Passport.js qui facilite l'authentification basée sur JWT\n\n* jwt-decode: Un petit module pour décoder les JWT en JavaScript côté client\n\n---\n\nModule : \"jsonwebtoken\"\n\n> Le module jsonwebtoken de JavaScript est utilisé pour implémenter des JSON Web Tokens (JWT). Les JWT sont des jetons compacts et sécurisés utilisés pour l’authentification et l’échange d’informations entre parties.\n\nle JWT , c'est du cryptage (et pas du hashage).\n\n* Utilisation courante : Les JWT sont souvent utilisés dans les applications web pour gérer les sessions utilisateur de manière sécurisée, notamment dans les API RESTful.\n\n{{$:/code/js/module/JWT}}\n\n---\n\nModule :  \"jwt-decode\"\n\n>Le module jwt-decode est utilisé pour décoder les JSON Web Tokens (JWT). Contrairement à d’autres modules comme jsonwebtoken, jwt-decode ne vérifie pas la validité du jeton ni sa signature. Il se contente de décoder le payload du JWT, ce qui peut être utile pour extraire des informations rapidement, notamment dans les applications côté client.\n\n\n\njwt-decode: Un petit module pour décoder les JWT en JavaScript côté client4\n\n---\n\npassport-jwt: Un plugin pour Passport.js qui facilite l'authentification basée sur JWT4\n.\n","tags":"$:/code/js","title":"$:/doc/json/module/JWT","modified":"20241028150629564","type":"text/markdown"},
2833{"created":"20240925190243438","text":"La **licence ISC** (de l'anglais « Internet Systems Consortium License ») est une licence de logiciel libre écrite par l'Internet Systems Consortium. Également connue sous le nom licence OpenBSD, elle est compatible avec la licence publique générale GNU.\n\n* Source : [[Défintion wikipédia|https://fr.wikipedia.org/wiki/Licence_ISC]]","tags":"","title":"$:/doc/logiciel/lice
2833nce/ISC","modified":"20240925190523426","type":"text/markdown"},
2834{"created":"20240726073945232","text":"## __Modele Conceptuel de Données__ (MCD)\n\nPour une application qui gère des données, on voudra mettre en place une base de données. Une base de données mal conçue est l'assurance d'une fondation instable pour un projet et donc un départ sur de mauvaises bases.\n\nOn peut appliquer la méthode _Merise_ pour concevoir notre base de données. L'objectif est d'éviter les erreurs de conceptions, à savoir principalement la duplication des données.\n\nOn va concevoir la base de données en une série d'étapes permettant de se focaliser sur un problème à la fois, à savoir :\n\n1. **Le MCD pour lister les entités, leurs attributs et leurs associations**\n2. Le MLD pour traduire les associations\n3. Le MPD pour ajouter les contraintes spécifiques à notre DBMS\n\n\n\n\u003Cu>Exemple de schema d'un MCD :\u003C/u>\n\n{{$:/diagram/MCD/exemple}}\n\n* Outil utile pour les MCD :[[https://www.mocodo.net/]]\n\n \u003Cu> Clés étrangères et MCD \u003C/u>\n \n* Absence de clés étrangères : Le MCD ne contient pas de clés étrangères. C'est un modèle conceptuel qui représente les entités et leurs relations, sans entrer dans les détails de l'implémentation.\n* Objectif du MCD : Le MCD vise à modéliser la structure logique des données, indépendamment de toute considération technique ou physique.\n* Représentation des relations : Dans un MCD, les relations entre entités sont représentées par des associations, généralement symbolisées par des ovales ou des losanges, avec des cardinalités.\n\n\u003Cu>Transition vers le Modèle Logique de Données (MLD) \u003C/u>\n* Apparition des clés étrangères : Les clés étrangères apparaissent lors de la transformation du MCD en Modèle Logique de Données (MLD).\n* Règles de transformation :\nToute entité du MCD devient une table du MLD.\nL'identifiant de chaque entité devient la clé primaire de la table correspondante.\n* Les associations sont traduites différemment selon leurs cardinalités.\nCas des associations :\nPour les associations de type 1:N, la clé étrangère est placée dans la table du côté N.\n* Pour les associations de type N:M, une table d'association est créée avec des clés étrangères vers les deux tables impliquées.\n\n\u003Cu>Importance de la distinction \u003C/u>\nIl est crucial de ne pas confondre le MCD avec le MLD. Le MCD est un outil de modélisation conceptuelle, tandis que le MLD se rapproche davantage de la structure réelle de la base de données, incluant les clés étrangères et les tables d'association.\n\n## Cardinalités dans les Bases de Données\n\n>Les **cardinalités** définissent les relations entre les entités dans un modèle de base de données relationnelle. Elles indiquent combien d'instances d'une entité peuvent être associées à une instance d'une autre entité. Comprendre les cardinalités est essentiel pour concevoir des schémas de bases de données efficaces et cohérents.\n\n{{$:/code/MCD/Cardinalités}}","tags":"","title":"$:/doc/MCD","modified":"20240826113406770","type":"text/markdown"},
2835{"created":"20240726085206613","text":"__Modele Logique des Données__ (MCD)\n\n> MLD signifie Modèle Logique des Données. Son rôle est de traduire les associations vers quelque chose d'implémentable dans notre RDBMS.\n\nLe MLD découle du MCD. On applique les règles suivantes :\n\n1. Chaque entité du MCD devient une table\n2. Chaque attribut d'une entité devient une colonne de cette table qu'on écrit entre parenthèses à côté\n3. L'attribut discriminant devient un identifiant qu'on souligne\n4. On traduit les associations selon la méthode qui suit :\n   1. Pour une association One To One on crée une clé étrangère sur une des 2 entités de l'association au choix\n   2. Pour une association One To Many on crée une clé étrangère sur l'entité du côté 1. Une clé étrangère est une colonne qui fait référence à l'indentifiant de la table côté N\n   3. Pour une association Many To Many on crée une table de liaison (souvent nommé firstentity_has_secondentity). Cette table de liaison contient 2 
2835colonnes : une clé étrangère vers la première entité et une clé étrangère vers la seconde entité et éventuellement une colonne d'identifiant.\n5. On met un dièse # devant les clés étrangères pour les reconnaître tout de suite","tags":"","title":"$:/doc/MLD","modified":"20240726085501656","type":"text/markdown"},
2836{"created":"20240820064901542","text":"__Mock__\n\n> En programmation orientée objet, les __mocks__ (simulacres ou mock object) sont des objets simulés qui reproduisent le comportement d'objets réels de manière contrôlée. Un programmeur crée un mock dans le but de tester le comportement d'autres objets, réels, mais liés à un objet inaccessible ou non implémenté. Ce dernier est alors remplacé par un mock.\n\n Source: [[https://fr.wikipedia.org/wiki/Mock_(programmation_orient%C3%A9e_objet)]]","type":"text/markdown","title":"$:/doc/mocks","tags":"","modified":"20240820065100702"},
2837{"created":"20240901143756028","text":"__Gsap__\n\n[[https://gsap.com/resources/get-started/]]\n\nSource : [[https://gsap.com/docs/v3/GSAP/Tween]]\n\nComparaison des tendances avec d'autres modules d'animation du même type : [[https://npmtrends.com/animate.css-vs-gsap-vs-popmotion-vs-velocityjs]]\n\n__tweenlite__\n\n[[https://ihatetomatoes.net/wp-content/uploads/2016/07/GreenSock-Cheatsheet-4.pdf]]\n\n```css\n#box {\n  background-color: rgb(208, 243, 254);\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  width: 100px;\n  height: 100px;\n  transform: translate(-50%, -50%);\n  cursor: pointer;\n```\n\n__tweenmax__\n\n\n[[https://greensock.com/asdocs/com/greensock/TweenMax.html]]\n\n[[https://jinn-wang.gitbook.io/tweenmax-animation]]\n\n\n__granim.js__\n\n[[https://sarcadass.github.io/granim.js/index.html]]","tags":"","title":"$:/doc/module/animation/gsap","modified":"20240919193448639","type":"text/markdown"},
2838{"created":"20240712111338110","text":"[[https://www.npmjs.com/package/jsdom]]\n","tags":"","title":"$:/doc/module/jsdom","modified":"20240712111537378"},
2839{"created":"20240802092107635","text":"\n>Ce module implémente le type de données hstore pour stocker des ensembles de paires clé/valeur au sein d’une seule valeur PostgreSQL. Cela peut être utile dans divers scénarios, tels que des lignes avec de nombreux attributs qui sont rarement examinés, ou des données semi-structurées. Les clés et les valeurs sont simplement des chaînes de texte.hstore","tags":"","title":"$:/doc/module/pg-hstore","modified":"20240802092317655"},
2840{"created":"20240823064154350","text":"Mongodb\n---\n\n>MongoDB est un [[DBMS|SGBD]] comme [[PostgreSQL|$:/doc/postgreSQL]], son rôle est donc de mémoriser les données et de permettre d'y accéder pour réaliser les opérations du [[CRUD|$:/code/postgreSQL/CRUD]].\n\nPar contre contrairement à PostgreSQL ce n'est pas un RDBMS mais un NoSQL.  \n\n* Dans RDBMS le R signifie _relational_, une relation c'est un ensemble d'attributs. Toutes les lignes d'une même table dans un RDBMS partagent les mêmes attributs.  \n\n* Pour les NoSQL on ne peut pas faire de généralité car ils ont chacun leurs spécificités. Certains seront relationnels, d'autres non. MongoDB n'est pas relationnel, il est basé sur des documents. Les documents représente l'équivalent d'une ligne de données. Un ensemble de documents est non pas appelé une table mais une collection. La particularité c'est que les documents d'une même collection ne sont pas obligés de partager les mêmes attributs.  \n\n* Finalement le point commun des NoSQL c'est qu'il n'utilise pas ou pas seulement le langage SQL pour les requêtes. MongoDB utilise le langage JavaScript pour ses requêtes\n\n* MongoDB a été conçu pour gérer des masses énormes d'infos. Il est souvent plus rapide pour certaines opérations, surtout la lecture. Il peut être plus lent pour l'édition  ou pour gérer des associations.  \nIl propose un mode aggregate assez fou pour effectuer des selections précises sur des groupes de données et des projections.\n\nOn peut parfois croiser les acronyme PERN et MERN pour la [[stack|Pile logicielle]]\n* PostgreSQL Express React Node (PERN) et\n* MongoDB Express React Node (MERN)\n\n\u003Cdetails> \u003Csummary> \u003Cb>Transformer une base mongoDB en graphes \u003C/b>\u003C/summary> \n\t\n{{$:/diagrammes/arbres/fig1}}\n\n\u003C/details>","tags":"","title":"$:/doc/MongoDB","modified":"20241014163900630","type":"text/markdown"},
2841{"created":"20240822083447567","text":"# Créer une base de donnees\n(avec des fichiers bson existant)\n```\n\n# par exemple une base nommée directors\nmongoimport --db mongoflix --collection directors --file data/directors.bson\n\n# par exemple une base nommée movies\nmongoimport --db mongoflix --collection movies --file data/movies.bson\n```\n\n# Restorer une base de donnees MongoDB\n\nDans le terminal à la racine du projet, écris: `mongorestore -d nom-base repertoire-data/` \n\n```\n\"C:\\Program Files\\MongoDB\\Server\\7.0\\bin\\mongorestore.exe\" -d pokemon data/\n```\n\nPour vérifier, connecte toi à ta BDD mongo en tapant `mongosh`  \n\n```\n\"C:\\Program Files\\MongoDB\\Server\\7.0\\bin\\mongosh.exe\"\n```\nTu devrais être c
2841onnecté sur la BDD `test`  \nPour te rendre dans la base de données fraîchement créer ecris `use pokemon`  \nPuis pour lister tes collections ecris `show collections`  \nTu devrais voir apparaitre une collection nommée `pokedex`  \nPour lister tes pokemons tu peux ecrire `db.pokedex.find()` \n\n# Installation MongoDB\n\n## Telecharger MongoDB\n[[https://www.mongodb.com/try/download/community]]\n\n## Telecharger MongoShell\n[[https://www.mongodb.com/try/download/shell]]  \nOuvrir le dossier une fois dezipé, aller dans bin et copier tous les fichiers (2 fichiers)\nSe rendre dans `C:\\Program Files\\MongoDB\\Server\\7.0\\bin` => Coller les fichiers\n\n## Telecharger MongoTools\n[[https://www.mongodb.com/try/download/database-tools ]]\n\nOuvrir le dossier deziper, aller dans bin et copier tous les fichiers (8 fichiers)\nSe rendre dans `C:\\Program Files\\MongoDB\\Server\\7.0\\bin` => Coller les fichiers\n\n Ajouter mongodb au PATH (variable d'enviremment)\nAppuyer sur la touche windows => Taper environnment => Choisir \"Modifier les variables d'environnement systeme\"  \nCliquer sur variables d'environnements (en bas)\nDans variables systemes => Selectionner Path => Modifier => Nouveau => Ecrire `C:\\Program Files\\MongoDB\\Server\\7.0\\bin` => OK  \n\n\n## Se connnecter à mondoDB depuis node\n\nPour çela, il faut disposer  d'un driver : `mongodb` (équivalent de 'pg' pour MongoDB)\n\n* Documentation du package : [[documentation du package: https://www.npmjs.com/package/mongodb]]","tags":"","title":"$:/doc/MongoDB/installation&restoration","modified":"20240823062546028","type":"text/markdown"},
2842{"created":"20240726091513626","text":"__Modèle Physique des Données__ (MPD)\n\n> Le Modèle Physique des Données, qui correspondra exactement à notre script de création de base de données par la suite. Il est donc adapté à un DBMS en particulier.\n\nIl découle finalement du MLD, car on y ajoute\n\n* Le type de chaque colonne\n* Les contraintes éventuelles de chaque colonne\n  \nLes contraintes permettent de préciser ce qu'on attend dans chaque colonnes. Ainsi notre DBMS renverra une erreur si on ne respecte pas ces contraintes.\nPar exemple\n\nune colonne marqué NOT NULL renverra une erreur si on essaye d'insérer une ligne sans cette valeur obligatoire.\nOn peut citer également les contraintes\n\nUNIQUE pour garantir l'unicité des valeurs,\nPRMARY KEY qui est la combinaison de UNIQUE et NOT NULL qu'on utilise sur les identifiants ou la contrainte\nREFERENCES pour indiquer que les valeurs d'une colonne doivent exister dans une autre table, pratique pour nos clés étrangères.\n\n[[Documentation des contraintes (postgreSQL)|https://www.postgresql.org/docs/current/ddl-constraints.html]]\n","tags":"","title":"$:/doc/MPD","modified":"20240726092016346","type":"text/markdown"},
2843{"created":"20241009074257671","text":"\nMise en production d'un projet NodeJS\n---\n\n* Installation des logiciels requis (exemple)\n\t* NodeJS\n\t* NPM, le gestionnaire de dépendances\n\t* PM2, un utilitaire permettant de gérer le lancement de notre appli NodeJS en production\n\t* PostgreSQL, notre SGBDR\n\nAjouter un nouvel utilisateur et créer une base de données PostgreSQL\n\nVoir [[$:/code/postgreSQL/administration]]\n\n\n__Comment régler un problème de version de node__\n\n```\nsudo apt purge nodejs npm\nsudo apt autoremove\n```\n\nDans Ubuntu, le correctif des paquets est :\n* [[https://github.com/nodesource/distributions]]\n\n```\ncurl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg\nNODE_MAJOR=18\n\necho \"deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main\" | sudo tee /etc/apt/sources.list.d/nodesource.list\n\nsudo apt update\nsudo apt install -y nodejs\n\n```\n\n* On verifie la version de node avec :\n```\nnode --version\n```\nPM2\n---\n\nPM2 permet de relancer le serveur ou de le rédemarrer en cas d'erreur.\n\nEn effet, en dev, on lance directement notre application NodeJS avec la commande `node app.js` (ou `index.js`, selon le nom de votre fichier JS principal), ou via `nodemon` comme on l'a fait juste avant.\n\n> Mais comment faire sur un serveur, on ne va quand-même pas devoir se connecter en SSH pour lancer à la main la commande ?\n\nPM2 va gérer automatiquement le lancement de notre application, et son redémarrage en cas d'erreur. \n\n\u003Cdetails>\n\t\u003Csummary>\nPour l'installer sur le serveur \u003C/summary>\n\n\tlancez la commande suivante :\n\n```bash\nsudo npm install pm2@latest -g\n```\n\n\u003C/details>\n\nUen fois installée, on peut ensuite démarrer notre back-end avec la commande suivante (:warning: attention, pensez à faire un `Ctrl+C` au préalable pour couper le back lancé à l'étape précédente !) :\n\n```bash\ncd /var/www/html/S09-Mise-En-Production-PSEUDOGH/back\n\npm2 start index.js\n```\n\nNotre back-end est de nouveau accessible. Pour qu'il se relance automatiquement en cas de crash ou de redémarrage du serveur, il nous reste quelques étapes supplémentaires :\n\n```bash\npm2 startup systemd\n```\n\nCopiez/collez la commande fournie à la dernière ligne de la sortie de la commande précédente. Cette c
2843ommande doit être :\n\n```bash\nsudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u student --hp /home/student\n```\n\nPuis pour finir :\n\n```bash\npm2 save\nsudo reboot\n```\n\n## Monitoring de notre application web\n\n[[https://pm2.keymetrics.io/]]\n\nAprès le reboot, notre application a du se lancer automatiquement. On peut le vérifier avec les commandes suivantes :\n\n```bash\nsudo systemctl status pm2-student\npm2 list\npm2 info index\n```\n\nD'autres commandes utiles sont aussi fournies par PM2 :\n\n```bash\npm2 monit\npm2 restart index\npm2 stop index\n...\n```\n","tags":"","title":"$:/doc/node.js","modified":"20241009105703640","type":"text/markdown"},
2844{"created":"20240617111142103","text":"\u003C!-- __Client/serveur__ -->\n\n\nL'acronyme **NPM** désigne en réalité 2 choses différentes :\n\n1.  Un programme qui fonctionne en ligne de commande dans le terminal, directement installé en même temps que Node.JS\n2.  Le [registre npmjs.com](https://www.npmjs.com/) qui est une sorte de gigantesque catalogue rempli de modules, dans lequel le programme **NPM** va piocher pour télécharger ce qu’on lui demande. Ce catalogue permet de chercher des modules, d’accéder aux informations les concernant, mais aussi de proposer nos propres modules à la communauté des développeurs JavaScript.\n\n\n* initialisation d'un projet avec Node Package Manager (npm)\n\n\n\n```sh\n\nmkdir new-express-project \ncd new-express-project \nnpm init -y\n\n// exemple \nnpm i ejs express dotenv\n\n```\n\n* __package.json__ : Gestion des Dépendances de node.js\n\nremarque : il faut utiliser \n\n\n```json\n\n  \"dependencies\": {\n\t\t// Gestion des scss\n    \"parcel\": \"^2.8.2\",\n\t\t// normalisation des balises \n    \"reset-css\": \"^5.0.1\"\n  },\n\n// pour tiddlywiki avec node.js\n\n{\n    \"name\": \"tiddlywiki\",\n    \"main\": \"./index.html\",\n\t\"window\": {\n\t\t\"toolbar\": true,\n\t\t\"width\": 1024,\n\t\t\"height\": 768\n\t}\n}\n\n// pour utiliser l'import au format ESM\n\n{\n    \"name\": \"monappli\",\n    \"main\": \"./index.html\",\n    \"dependencies\": {\n\t\t\"type\": \"module\",\n\t\t  },\n\t\t\"scripts\": {\n\t\t\t    \"start\": \"rm -rf ./app/out && node index\",\n  },\n}\n\n```\n\n\n* Commandes essentielles de __npm__ :\n\n\u003Ccode> npm audit fix \u003C/code> : aide à réparer les codes pour éviter les failles de sécurité.\n\n\u003Ccode> npm run clear \u003C/code> : pour supprimer le cache et  supprime le dist  \n\n\n```json\n  \"scripts\": {\n    \"clear\": \"rm -rf .parcel-cache dist\"\n  },\n```\n\n\u003Ccode> npm run start \u003C/code> ou \u003Ccode> npm start \u003C/code> : script à façon pour lancer les dépendances par exemples\n\n\n```json\n  \"scripts\": {\n    \"start\": \"parcel {src/*.html,src/**/*.html}\",\n    \"build\": \"parcel build {src/*.html,src/**/*.html}\",\n  },\n\n```\n\n\n* Environnement d'execution de Node.js :\n\n```js\n// Controle de l'environnement\nnode -v\n// a minima supérieur ou égale à 16\n\n// Pour lancer un script sur node.js\nnode nomdefichier.js\n\n```\n* Les modules\n\n```js\n\nconst os = require('os');\nconst currentOs = os.type();\n```\n\n* Gestion de la console \u003Ccode>\nreadline.createInterface() \u003C/code>\n\n\n```js\nconsole.log(\"Execution du script en local : Bienvenu sur NostradaBot !\");\n// On part d'un module fourni par node\nconst readline = require('node:readline');\n// on execute une méthode fournie pour récupérer un objet nommé ici \"rl\"\n// il représente notre interface\nconst rl = readline.createInterface({\n    input: process.stdin,\n    output: process.stdout,\n});\nrl.on('line', (line) => {\n    console.log(`Received: ${line}`);\n  });\n\n```\n* Quitter js\n\n```js\nfunction getOut() {\n  process.exit();\n}\n```\n\n* installation de module ou package  exemple : mode-dev, validator \n\n```js\n//installation en global du mode dev\nnpm i -g node-dev\nnpm i validtor\n// lancement en mode dev\nnode-dev fichier.js\n// import de validator (si type = module)\n\nimport validator from \"validator\";\n\n```\n\n```js\n// desinstallation\nnpm uninstall node-dev\n```\n\n* Export de valeurs\n```js\nconst lastname = \"benoit\";
2844\n\nexport default lastname;\n// ou \nexport {lastname} ;\n\n```\n\n\n* export / import de fichier\n\n```js\nimport bot from './utils/bot.js' ;\nimport { lstMeteo, horoscopes } from './utils/data.js';\n\n\n```\n\n* Pour interrompre toutes les instances nodeJs active\n\nsur linux \n```ksh\nkillall node\n```\n\n```ksh\ntaskkill /im node.exe\n```\n\n\n* modalité pour lancer un node de developpement:\n  node fichier --watch ou nodemon ou node-dev\n\n\n\n* Voir aussi pnpm :[[pnpm|https://pnpm.io/fr/installation]]","tags":"","title":"$:/doc/node.js/NPM","modified":"20241009074252506","type":"text/markdown"},
2845{"created":"20241018080152159","text":"__NVM__ (Node Version Manager) est un outil très utile pour les développeurs travaillant avec Node.js\n\nIl permet de faire :\n\n* Installation et gestion de plusieurs versions de Node.js : NVM permet d'installer et de gérer facilement plusieurs versions de Node.js sur la même machine\n. Cela est particulièrement utile si tu travailles sur plusieurs projets qui nécessitent différentes versions de Node.js\n* Changement rapide entre les versions : Tu peux passer facilement d'une version de Node.js à une autre avec une simple commande, sans avoir à désinstaller et réinstaller Node.js à chaque fois\n* Isolation des projets : Chaque projet peut utiliser sa propre version de Node.js, évitant ainsi les conflits de version entre projets différents\n\n\n\nnpm (Node Package Manager) et nvm (Node Version Manager) servent des objectifs différents mais sont tous les deux essentiels pour travailler avec Node.js\n\n\u003Cfieldset>\n\u003Cstrong>npm\u003C/strong> :\n\nGère les dépendances : npm est utilisé pour installer, mettre à jour et gérer les bibliothèques et paquets nécessaires pour les projets Node.js.\n\nInstallation de paquets : On peut utiliser npm install pour ajouter des modules à ton projet.\n\nPartage de code : npm permet aussi de publier des paquets afin que d'autres développeurs puissent les utiliser.\n\u003C/fieldset> \u003Cbr>\n\n\u003Cfieldset>\n\u003Cstrong>nvm\u003C/strong> :\n\nGère les versions de Node.js : nvm permet d'installer et de basculer entre différentes versions de Node.js sur ta machine.\n\nFacilite les tests multi-version : Cela est particulièrement utile si tu dois tester ton application avec plusieurs versions de Node.js.\n\nIsolation des environnements : Chaque projet peut utiliser une version spécifique de Node.js, évitant ainsi les conflits.\n\n\u003C/fieldset>","tags":"","title":"$:/doc/node.js/NVM","modified":"20241018093040534","type":"text/markdown","origine":"module 9 - e02.md"},
2846{"created":"20240917104252884","text":"### pnpm\n(idem yarn)\n\n[[Documentation |https://pnpm.io/pnpm-cli]]\n\nvoir également : https://x.com/pnpmjs\n\nOn retrouve des équivalents entre Yarn et Npm pour chaque commande pour accomplir les mêmes choses:\n\n- `pnpm init` : crée un fichier package.json\n- `pnpm i ou pnpm install` : télécharge les dépendances listées dans package.json dans le dossier node_modules\n- `pnpm add nom-du-package` : télécharge le package nommé \"nom-du-package\" dans le dossier node_modules et l'ajoute dans la liste du package.json\n- `pnpm remove nom-du-package ` : (remove ou rm) supprime le package nommé \"nom-du-package\"\n- `yarn add nom-du-package --dev` : télécharge le package nommé \"nom-du-package\" dans le dossier node_modules et l'ajoute dans la liste des devDependencies du package.json. Les devDependencies ne seront pas présentes dans le code de production, pratique pour des outils nécessaires uniquement lors de la phase de développement.\n- `pnpm nom-du-script` : lance un raccourci présent dans l'objet scripts du package.json\n\n\n\u003Cdetails> \u003Csummary> installation\u003C/summary>\n```\nnpm install --global pnpm\n```\nmise à jour \n\t\n```\npnpm add -g pnpm\n```\n\u003C/details>\n","tags":"","title":"$:/doc/node/pnpm","modified":"20240926053020493","type":"text/markdown"},
2847{"created":"20240911082311833","text":"### Yarn\n\n**Yarn** est un gestionnaire de paquets pour les projets JS, tout comme **npm**.\n\nC'est une solution alternative à **npm**. Enormément de documentations proposent directement les commandes **yarn** et pas toujours les commandes **npm**.\n\n\nInstaller Yarn:\n\n```\nnpm install --global yarn\n```\n\nOn retrouve des équivalents entre Yarn et Npm pour chaque commande pour accomplir les mêmes choses:\n\n- `yarn init` : crée un fichier package.json\n- `yarn` : télécharge les dépendances listées dans package.json dans le dossier node_modules\n- `yarn add nom-du-package` : télécharge le package nommé \"nom-du-package\" dans le dossier node_modules et l'ajoute dans la liste du package.json\n- `yarn remove nom-du-package` : supprime le package nommé \"nom-du-package\"\n- `yarn add nom-du-package --dev` : télécharge le package nommé \"nom-du-package\" dans le dossier node_modules et l'ajoute dans la liste des devDependencies du package.json. Les devDependencies ne seront pas présentes dans le code de production, pratique pour des outils nécessaires uniquement lors de la phase de développement.\n- `yarn nom-du-script` : lance un raccourci présent dans l'objet scripts du package.json\n- \n\n[Documentation installation](https://classic.yarnpkg.com/lang/en/docs/install/)\n\n[Documentation générale](https://parceljs.org/getting-started/webapp/)\n\n---\n\n","tags":"","title":"$:/doc/node/yarn","modified":"20240917104509385","type":"text/markdown"},
2848{"created":"20240829091727745","text":"Remarque : la touche utile de NVDA est Inser. Il est possible de configurer NVDA pour utiliser la touche MAJ à la place de la touche Inser.\n\n- Arrêt parole : Control\n- Désactiver / réactiver la synthèse vocale : Inser + S\n- Quitter NVDA : Inser + Q\n- Lire les contenus de manière linéaire : flèche bas\n- Titre suivant (précédent) : H (Shit + H)\n- Liste suivante (précédente): L (Shift + L)\n- Elément de liste suivant (précédent) : I (Shift + I)\n- Lien suivant (précédent) : K (Shift + K)\n- Région suivante (précédente) : D (Shift + D)\n- Lister les éléments dans la page : Inser + F7\n  \nPour installer NVDA: [[https://www.tanaguru.com/guide-et-raccourcis-nvda-pour-les-tests-daccessibilite/]] ","tags":"","title":"$:/doc/NVDA","modified":"20240904133222530","type":"text/markdown"},
2849{"created":"20240918155923509","text":"\n__Tesseract__ : un moteur OCR libre\n\n>Tesseract est un logiciel de reconnaissance optique de caractères sous licence Apache. \n\n* [[tesseract.js|https://tesseract.projectnaptha.com/]]","tags":"","title":"$:/doc/ocr/tesseract","modified":"20240918161653766","type":"text/markdown"},
2850{"created":"20240924173126111","text":"__La [[Loi pour une République numérique de 2016|https://www.legifrance.gouv.fr/jorf/id/JORFSCTA000033202935]]__ donne aux administrations des obligations en matière d’open data.\n\n* Portails open data\n\n\t    \n\t**Opendatasoft** est un logiciel SaaS de portails permettant de répondre à ces obligations. Les entreprises, collectivités territoriales et administrations peuvent organiser, partager aux ré-utilisateurs et visualiser les éléments provenant de leur catalogue de données, ainsi que les rendre disponibles via des API.\n\n\tLe logiciel est pour les administrations une alternative au portail public **data.gouv.fr**.\n\t* [[Opendatasoft|https://www.opendatasoft.com/fr/]] : \n\t  *  [[Documentation des données |https://documentation-resources.opendatasoft.com/explore/?sort=modified]]\n\n\n\u003Cdetails>\n\t\u003Csummary>\nPlan de l'article \n\u003C/summary>\n\t\nTitre :\nL’importance de la centralisation des données open data : Un défi pour l’avenir\n\nIntroduction :\nCommence par expliquer ce que sont les données open data et pourquoi elles sont cruciales pour la transparence, l’innovation et la recherche. Mentionne brièvement les défis actuels liés à la multiplicité des sources de données.\n\n1. La multiplicité des sources de données open data :\nDiversité des sources : Décris les différentes sources de données open data disponibles (gouvernementales, privées, internationales, locales, etc.).\nProblèmes de fragmentation : Explique comment la dispersion des données à travers de multiples portails peut entraîner des problèmes de cohérence, de redondance et de qualité des données1.\n2. Les avantages de la centralisation des données :\nAmélioration de la qualité des données : Centraliser les données permet de réduire les silos de données et d’améliorer la qualité et la fiabilité des informations2.\nFacilitation de l’accè
2850s et de l’analyse : Une plateforme centralisée rend les données plus accessibles et facilite leur analyse par les chercheurs, les entreprises et les citoyens3.\nOptimisation de la gouvernance des données : Une gestion centralisée permet une meilleure gouvernance, sécurité et conformité des données3.\n3. Exemples de plateformes centralisées réussies :\nPortail européen de données : Présente le portail européen de données comme un exemple de centralisation réussie des données open data à l’échelle continentale.\nData.gov : Mentionne le portail américain Data.gov qui centralise les données gouvernementales pour une utilisation publique.\n4. Les défis de la centralisation :\nComplexité technique : Aborde les défis techniques liés à l’intégration de données provenant de sources diverses.\nQuestions de confidentialité et de sécurité : Discute des préoccupations liées à la confidentialité et à la sécurité des données dans un environnement centralisé2.\nConclusion :\nRécapitule les points principaux et insiste sur l’importance de la centralisation pour maximiser l’impact des données open data. Invite les lecteurs à participer à la discussion sur les meilleures pratiques pour la centralisation des données.\n\nAppel à l’action :\nEncourage les lecteurs à partager leurs expériences et leurs idées sur la centralisation des données open data dans les commentaires.\n\nhttps://scient.fr/gouvernance-data-centraliser-ou-decentraliser/\n\nhttps://scient.fr/gouvernance-data-centraliser-ou-decentraliser/\n\nhttps://www.teradata.com/insights/data-platform/what-is-data-centralization\n\nhttps://www.diligent.com/resources/blog/the-benefits-of-centralized-data-a-single-source-of-information-for-your-business-entities\n\u003C/details>\n\n\nLa loi pour une République numérique, adoptée le 7 octobre 2016, vise à favoriser l’ouverture des données publiques et à encourager leur réutilisation. Voici un résumé des principaux points concernant les données ouvertes :\n\nOuverture des données publiques : La loi impose aux administrations de rendre accessibles leurs données sous forme numérique, sauf exceptions liées à la sécurité ou à la vie privée. Cela inclut les documents administratifs, les bases de données et les codes sources1.\nDonnées d’intérêt général : Certaines données produites par des entités privées, mais présentant un intérêt général, peuvent également être rendues accessibles. Cela permet de valoriser des informations utiles pour la recherche, l’innovation ou la transparence2.\nFormats ouverts et réutilisables : Les données doivent être publiées dans des formats ouverts et facilement réutilisables, afin de faciliter leur exploitation par des tiers, qu’il s’agisse de citoyens, d’entreprises ou de chercheurs2.\nGouvernance des données : La loi prévoit la mise en place d’une gouvernance des données pour assurer une gestion efficace et transparente des données ouvertes. Cela inclut la création de référentiels et de plateformes dédiées1.","tags":"","title":"$:/doc/open data","modified":"20240925145716726","type":"text/markdown"},
2851{"created":"20240826065828138","text":"__Un ORM c'est quoi ?__\n\n>Un ORM, ou **\"Object-Relational Mapping\"**, est une technique de programmation qui permet de faire le lien entre une base de données relationnelle et un langage de programmation orienté objet. L'ORM permet aux développeurs de manipuler les données de la base de données en utilisant des objets et des méthodes plutôt que de devoir écrire des requêtes SQL complexes.\n\nConcrètement, un ORM permet de créer une abstraction entre la base de données et l'application, en permettant de représenter les tables de la base de données sous forme de classes d'objets, et les lignes de ces tables sous forme d'instances de ces classes. L'ORM se charge de la correspondance entre les objets et les tables de la base de données, en créant automatiquement les requêtes SQL nécessaires pour récupérer, ajouter, modifier ou supprimer des données.\n\nL'utilisation d'un ORM peut rendre le développement d'applications plus rapide et plus facile, car il permet de se concentrer sur la logique métier plutôt que sur les détails techniques de la manipulation de la base de données.","tags":"","title":"$:/doc/ORM","modified":"20240826080936876","type":"text/markdown"},
2852{"created":"20240909120758374","text":"* Linux Zorin OS","tags":"","title":"$:/doc/OS","modified":"20240909120813713"},
2853{"created":"20241015085443386","text":"🐘 Langage (PHP)\n---\n\nPHP (PHP Hypertext Preprocessor) est un langage de script Open Source, conçu au départ pour le développement web. \nMais on peut tout aussi bien l'utiliser dans d'autres contextes. \n\nSon dépôt Github : https://github.com/php/php-src\n\n## Historique\n\nPHP a été créé par Rasmus Lerdorf pour son propre site web, en 1994, à partir d'une bibliothèque logicielle en C. Il publie son code en 1995 sous le nom de PHP/FI (personal home page/form interpreter). En 97 son coeur est redéveloppé et est nommé Zend engine.\n\nAprès être resté longtemps à sa version 5 (2006-2015), après n'avoir jamais sorti de version 6, PHP en est maintenant à sa version 8.\n\n## Ses possibilités\n\n- Programmation procédurale ou objet\n- Faible typage ou typage fort\n- Web ou ligne de commande\n- Portable sur la plupart des systèmes d'exploitation\n- Génération de HTML, mais aussi d'images, de PDF, etc...\n- Connexion possible à un grand nombre de type de Gestionnaires de BDD\n- Supporte différents protocoles\n- Permet d'utiliser les expressions régulières compatibles Perl\n\n### De nombreuses extensions\n\nBeaucoup de librairies existent pour étendre les possibilités de PHP : \n- [références des fonctions](https://www.php.net/manual/fr/funcref.php)\n\nCertaines sont intégrées au coeur, d'autres doivent être ajoutées via le dépôt PECL.\n\n### De nombreuses librairies\n\nTout comme Node.JS, PHP possède aussi un catalogue de librairies écrites en PHP : [Packagist](https://packagist.org/). Pour ajouter ces dépendances à nos projets, on utilise [Composer](https://getcomposer.org/).\nEn résumé, Packagist correspond à NPM.JS et Composer correspond à NPM.\n\n### Des Frameworks\n\nPendant une dizaine d'années, la plupart des sites web développés en PHP ne l'étaient sans aucun cadre : pas de MVC (model-vue-controller), pas de cadre, et comme PHP reste un langage permissif et à faible typage, c'était vite le bazar. On pouvait découvrir dans un même projet la patte de chaque développeur ayant travaillé dessus...\n\nIl est vite devenu impératif d'unifier la façon de coder les projets, et les frameworks PHP ont certainement sauver des vocations en se répendant dans les open-spaces.\n\nLes plus connus : \n\n- Laravel\n- Symfony (framework français, créé par Fabien Potentier)\n- Codeigniter\n\n[Codeur.com les 5 meilleurs frameworks PHP en 2023](https://www.codeur.com/blog/frameworks-php/)\n\n### Des CMS\n\nIl existe encore beaucoup de CMS développés en PHP : \n\n- [Wordpress](https://wordpress.com/fr/ecommerce/) mais aussi et surtout [Documentation de WP](https://fr.wordpress.org/support/)\n- [Joomla](https://www.joomla.fr/)\n- [Drupal](https://www.drupal.org/)\n- [Magento ou Adobe commerce](https://devdocs.magento.com/guides/v2.3/extension-dev-guide/bk-extension-dev-guide.html)\n- [Prestashop](https://prestashop.fr/)\n\nLe meilleur actuellement ? Wordpress , car il est pratique pour les utilisateurs néophytes qui ne souhaitent pas coder, mais aussi capable de se transformer en CMS headless si nécessaire, en se comportant comme une API REST.\n\n## Apprendre PHP\n\n\nPour trouver des réponses à vos questions : [O'Syntaxe](https://o-syntaxe.surge.sh/00-les-bases).\n\nMais rien ne vaut la documentation officielle [php.net - Référence du langage PHP](https://www.php.net/manual/fr/langref.php). \n\nEt pour s'entrainer, il est possible  d'aller sur [https://replit.com/](https://replit.com/) qui offre un environnement complet pour tester PHP sans devoir installer [WAMP](https://www.wampserver.com/) ou [MAMP](https://www.mamp.info/en/windows/) sur sa machine.\n⚠️ *Replit dans sa version gratuite, ne permet de cloner que des dépôts Github publics.*\n\nIl est utiliser dans [[Wordpress]|CMS]\n\n","tags":"$:/code/php","title":"$:/doc/PHP","modified":"20241015151125136","type":"text/markdown","icon":"$:/img/ico/php.svg"},
2854{"created":"20241010074430399","text":"* Port habituel HTTP  : 80\n* Port habituel HTTPS : 443\n","tags":"","title":"$:/doc/ports","modified":"20241010074522373","type":"text/markdown"},
2855{"created":"20240717122612762","text":"","tags":"","title":"$:/doc/postgreSQL","modified":"20240913105655689","type":"text/markdown","icon":"$:/img/ico/PostgreSQL.svg"},
2856{"created":"20241002093831127","text":"Pipedream est une plateforme qui permet d’automatiser des processus en connectant des APIs, des base
2856s de données, et bien plus encore. Elle offre la possibilité d’exécuter du code personnalisé en utilisant des langages comme Node.js, Python, Go, ou Bash, sans avoir à gérer des serveurs1.\n\n\nCréer un Workflow : Commence par créer un nouveau workflow sur Pipedream.\nAjouter un Code Step : Ajoute un “Code Step” où tu pourras écrire ton code en Node.js.\nÉcrire du Code Node.js : Tu peux écrire n’importe quel code Node.js dans ce step. Pipedream supporte la version 20 de Node.js et permet d’utiliser la majorité des packages npm2.\nDéployer et Exécuter : Une fois ton code écrit, tu peux le déployer et l’exécuter directement sur les serveurs de Pipedream, qui fonctionnent 24/71.","tags":"","title":"$:/doc/process/automatisation/pipedream","modified":"20241002094658140"},
2857{"created":"20241013123041216","text":"__Mock-up__\n\n> En informatique, le terme mock-up (qui vient du même mot anglais qui signifie une maquette à l'échelle 1:1) désigne un prototype d'[[interface utilisateur|UI]]. Un mock-up a ainsi pour rôle de présenter les idées sur l'utilisation d'un logiciel.\n\n* Source : {{!!source}}\n\nC'est une maquette graphique avec une plus haute-fidélité.\n\n* Exemple : \n\u003Ccenter>\n{{$:/diagram/glossaire/wireframe/accueil}}\n\u003C/center>\n\n__Maquette__\n\n> En général, une maquette est une représentation visuelle d’un design, mais le niveau de détail peut varier en fonction du stade de développement. Si le wireframe se concentre sur la structure et la fonctionnalité, la maquette se concentre sur le design visuel et l’esthétique. La maquette peut englober différents niveau de fidélité et d'interactivité.\n> La maquette peut intégrer la charte graphique, le spacing... et constituer un prototype.\n","tags":"","title":"$:/doc/prototypage/mockup","modified":"20241018133642728","type":"text/markdown","source":"[[Wikipedia|https://fr.wikipedia.org/wiki/Mock-up]]"},
2858{"created":"20240825192457608","text":"__Wireframe__ (ou maquette fonctionnelle)\n\n> {{!!definition}}.\n> \u003Cbr>Les wireframes peuvent ainsi servir à créer un storyboard et concevoir les parcours utilisateurs.\n\n* Source : {{!!source}}\n\nLe Wireframe est une maquette statique au graphisme simplifié. Contrairement au mockup (ou Mock-up), l’esthétique est secondaire, .\n\n\u003Cdetails> \u003Csummary> \u003Cstrong> Pour aller plus loin : \u003C/strong>\n\u003C/summary>\n\t\nLes outils principalement dédiés à la création de maquettes fonctionnelles :\n\n*   [Balsamiq](http://www.balsamiq.com/products/mockups) : outil en ligne ou via une application\n*   [Wireframe.cc](https://wireframe.cc/) : outil en ligne\n*   [Pencil](https://pencil.evolus.vn/) : logiciel open source\n*   [Whismical.com](https://whimsical.com/wireframes) : outil en ligne\n\u003C/details>\n","tags":"","title":"$:/doc/prototypage/wireframe","modified":"20241018181616953","type":"text/markdown","source":"[[Wikipedia|https://fr.wikipedia.org/wiki/Wireframe_%28design%29]]","definition":"Le wireframe (ou maquette fil-de-fer) est un schéma utilisé lors de la conception d'une [[interface utilisateur|UI]]. Il permet de visualiser la structure, l’architecture, le flux et les fonctionnalités d’une page web ou d’une application"},
2859{"created":"20241012182155945","text":"__Zoning web__\n> {{!!definition}}\n> C'est un terme du domaine de la conception web et de l'[[UX design|UX]]. Il s'agit de l'étape de la concetion pendant laquelle on va définr les grandes zones de l'[[interface utilisateur|Interface utilisateur (UI)]] ou de la future page web.\n\n* Exemple :\n  \n  {{$:/diagram/zoning}}\n\n\u003C!--\nhttps://blog-ux.com/quelle-est-la-difference-entre-le-zoning-wireframe-mockup-et-prototype\n-->","tags":"","title":"$:/doc/prototypage/zoning","modified":"20241023114908427","definition":"Le \u003Cb>zoning web\u003C/b> est l’organisation visuelle d’une page web.","type":"text/markdown"},
2860{"created":"20240804120256481","text":"","tags":"","title":"$:/doc/python/pip","modified":"20240804120321695"},
2861{"created":"20240805063420962","text":"\n\n* Installation\n\n```\npython -m pip install --user virtualenv\n\n// en complement, pour faciliter la gestion on installera egalement pipenv\npip install pipenv --user\n```\n\n","tags":"","title":"$:/doc/python/virtualenv","modified":"20240805063943059"},
2862{"created":"20240903162417234","text":"__React__\n\n> Un framework javascript pour le front end\n\n*Principales Caractéristiques de React.js*\n\n* **Déclaratif** : React permet de créer des vues simples pour chaque état de votre application. Lorsque les données changent, React met à jour et rend de manière optimale les composants nécessaires.\n* Basé sur des **Composants** : Vous pouvez créer des composants autonomes qui maintiennent leur propre état, pu
2862is les assembler pour créer des interfaces utilisateur complexes.\n* **JSX** : React utilise JSX, une syntaxe qui permet de mélanger HTML et JavaScript. Cela rend le code plus lisible et facile à écrire. Il permet de décrire la structure de l’interface de manière déclarative en javascript.\n* **Unidirectionnel** : Le flux de données en React est unidirectionnel, ce qui signifie que les données passent du parent aux enfants via les **props**, rendant le code plus prévisible et plus facile à déboguer.\n* **Écosystème Riche** : React dispose d’un vaste écosystème de bibliothèques et d’outils, comme Redux pour la gestion de l’état, React Router pour le routage, et bien d’autres.\n\n*Avantages de React.js*\n\n* Performance : Grâce à son DOM virtuel, React minimise les mises à jour du DOM réel, ce qui améliore les performances.\n* Réutilisabilité : Les composants peuvent être réutilisés dans différentes parties de l’application, ce qui réduit le code redondant.\n* Communauté Active : Une grande communauté de développeurs et de nombreuses ressources en ligne pour apprendre et résoudre des problèmes.\n\n* __l'ecosystème de React__ :\n  * **React-dom** : pour document html (permet d'utiliser du JSX, )\n  * **React-native** : Projet d'application mobile\n  * **React-desktop** : pour application native windows par exemple\n  * **Next.js** : c'est du react + SSR (SEO). Il est amené à remplacer Gatsby: un framework base sur react (\n\t[[https://www.gatsbyjs.com]]\n\t )\n\n\tPour utiliser react, il faut un [[transpiler|$:/doc/bundler]]. Parcel par exemple (ce dernier permet aussi de ne pas préciser l'extension des fichiers lors de l'import (on peut donc appeler les fichier js contenant du jsx : .jsx))\n\n_Comparaison de la tendance entre React et  Angluar_\n\n[[https://npmtrends.com/@angular/core-vs-react]]\n\n_MindMap react_\n\n[[https://www.mindmeister.com/fr/852466071/react-js]]\n\n{{$:/diagram/js/react}}\n\n\u003Cdetails> \n\u003Csummary>\n\u003Cstrong>\nPour aller plus loin avec React\n\t\n\u003C/strong>\n\n* [[https://github.com/facebook/create-react-app]]\n*  Design System : [[https://github.com/intuit/design-systems-cli?tab=readme-ov-file]]\n\t\n\u003C/summary>\n\n\u003C/details>","tags":"$:/doc/react","title":"$:/doc/react","modified":"20241110101915506","type":"text/markdown","icon":"$:/img/ico/react.svg"},
2863{"created":"20241028152814548","text":"* Sources :\n\t* [[https://www.ui.shadcn.com]] (lien avec Figma)\n\t* [[https://v2.chakra-ui.com/]] (Lien avec storyBook)\n\t* [[https://mui.com/material-ui/]] (Composants React)\n\t* [[https://ant.design/ ]](Composants React)\n\t* [[https://blueprintjs.com/ ]](Composants React)\n\t* [[https://react-bootstrap.github.io/]] (Composants React)\n\n\nExemple vec figma et radix dans ui.shadcn.com: https://www.figma.com/community/file/1203061493325953101/shadcn-ui-design-system\n\nPlayground \nhttps://www.figma.com/community/file/1203061493325953101/shadcn-ui-design-system\n\n\n__Composant inscription/formulaire__\n\n* [[https://ui.shadcn.com/docs/components/form]]\n* [[https://ui.shadcn.com/docs/components/input]]\n  \n__Composants calendrier__ :\n\n* [[https://ui.shadcn.com/docs/components/calendar]]\n\n* Pick a date : [[https://ui.shadcn.com/docs/components/date-picker]]\n\n__Composants carousel pour les profils__ :\n\n* [[https://ui.shadcn.com/docs/components/carousel]]\n\n__Composant hover card__\n\n* [[https://ui.shadcn.com/docs/components/hover-card]]\n\n* [[https://v2.chakra-ui.com/docs/components/card]]\n\n  \n__Composant menu bar__\n* [[https://ui.shadcn.com/docs/components/menubar]]\n\n\n__Composant navigation__\nhttps://ui.shadcn.com/docs/components/pagination\n\n__Template complet__\n\n* [[https://mui.com/material-ui/getting-started/templates/blog/]]\n\n\n* Pass key : [[https://mui.com/toolpad/core/react-sign-in-page/]]","tags":"$:/doc/react","title":"$:/doc/react/components","modified":"20241028155507187","type":"text/markdown"},
2864{"created":"20240914084844873","text":"[[https://npmtrends.com/framer-motion-vs-react-motion-vs-react-spring]]\n\n---\n\n__framer-motion__\n\n__react-spring__\n\n__react-motion__\n\nN'a pas évolué depuis 7 ans, mais cette librairie est trés lègère\n\n* [[Documentation npm|https://www.npmjs.com/package/react-motion]]\n\n\n\n","tags":"$:/doc/react","title":"$:/doc/react/framer-motion","modified":"20240914091035343"},
2865{"created":"20240909070929772","text":"__Preact__\n\n>
2865 Alternative légère et rapide à React avec le même API en seulement 3Ko\n\nSite de référence : [[https://preactjs.com/]]","tags":"$:/doc/react","title":"$:/doc/react/preact","modified":"20240914084754235","type":"text/markdown"},
2866{"created":"20240913075845118","text":"","tags":"$:/doc/react","title":"$:/doc/react/react-desktop","modified":"20240914084732672"},
2867{"created":"20240913075540617","text":"```js\nimport ReactDOM from 'react-dom/client'\n```","tags":"$:/doc/react","title":"$:/doc/react/react-dom","modified":"20240930064125674"},
2868{"created":"20240925091840161","text":"","tags":"","title":"$:/doc/react/react-helmet","modified":"20240925091853425"},
2869{"created":"20240913075836286","text":"","tags":"$:/doc/react","title":"$:/doc/react/react-native","modified":"20240914084714746"},
2870{"created":"20240929184509948","text":"\n```\nnpm install react-router-dom\n\n```\n\n\nDans le dossier `src/`, créez un dossier `pages`. Vous allez maintenant créer 3 composants qui représentent vos différentes pages.\n\n- **Home.jsx** : La page d'accueil (ou la porte d'entrée de votre app) :\n\n  ```jsx\n  export default function Home() {\n    return (\n      \u003Cdiv>\n        \u003Ch1>Bienvenue sur la page d'accueil\u003C/h1>\n        \u003Cp>C'est ici que tout commence... enfin presque.\u003C/p>\n      \u003C/div>\n    );\n  }\n  ```\n\n- **About.jsx** : La page À propos (pour parler de vous, évidemment) :\n\n  \n  ```jsx\n  export default function About() {\n    return (\n      \u003Cdiv>\n        \u003Ch1>À propos de nous\u003C/h1>\n        \u003Cp>Nous sommes juste une application React, mais nous avons de grandes ambitions.\u003C/p>\n      \u003C/div>\n    );\n  }\n  ```\n\n- **Contact.jsx** : Parce qu'il faut bien laisser un moyen de vous joindre :\n\n \n```jsx\n  export default function Contact() {\n    return (\n      \u003Cdiv>\n        \u003Ch1>Contactez-nous\u003C/h1>\n        \u003Cp>Si vous avez des questions... ou pas, on est là.\u003C/p>\n      \u003C/div>\n    );\n  }\n  ```\n  \nFichier main.jsx\n\n```js\n\timport { StrictMode } from 'react'\nimport { createRoot } from 'react-dom/client'\nimport App from './App.jsx'\nimport './index.css'\nimport '@picocss/pico';\n\nimport { BrowserRouter, Routes, Route } from 'react-router-dom';\nimport Home from './pages/Home';\nimport About from './pages/About';\nimport Contact from './pages/Contact';\n\n\u003C!-- createRoot(document.getElementById('root')).render(\n  \u003CStrictMode>\n    \u003CApp />\n  \u003C/StrictMode>,\n) -->\n```\n","tags":"$:/doc/react","title":"$:/doc/react/rooter/react-router-dom","modified":"20240930064032494","type":"text/markdown"},
2871{"created":"20240529110750778","text":"\u003Ccenter>\n\n---\n\n\u003Cu>\u003Ch3> Qu'est ce que la programmation fonctionnelle  ?\u003C/h3>\u003C/u>\n\n---\n\n\u003Cb> Scala : \u003C/b> Un exemple de langage du paradigme de la programmation fonctionnelle\n\u003C/center>\n\n\nLa __programmation fonctionnelle__ se présente comme une solution de simplification au développeur. Elle repose sur __la notion de fonction__, comme son nom l'indique. Ce paradigme fait en sorte de fractionner le programme en des portions plus simples et plus petites pour constituer par la suite l’ensemble du programme final. \n\nCes portions sont des fonctions. C'est le cœur de la programmation fonctionnelle. On peut les assigner à une variable, on peut les passer en paramètre dans une autre fonction, on peut même les utiliser comme valeur de retour d’une fonction.\n\n__Fonction pure__\n> Une __fonction est pure__ si et seulement si elle ne dépend que de ses paramètres ( aucune interaction extérieure n’est autorisée). \n\nLes fonctions pures existent aussi en Python, Javascript ...\n\n\u003C$macrocall $name=details label=\" Exemples d'implémentation de fonctions pures\" src={{$:/code/fonctions/pures}} status=closed labelClass=\"h6\" srcClass=\"alert border-info\"/>\n\n__Principe d'immutabilité__ : \n\nEn programmation fonctionnelle, les fonctions ne changent pas d’état, ce qui fait qu’on peut les utiliser comme des constantes. \n>Les fonctions restent intactes. Les variables sont fixes. _Si l’on fait appel à la fonction, on ne fera que les copier dans la fonction qui va l’utiliser_.\n\n* Les systèmes qui s’appuient sur __le principe de la mutabilité__ ont le défaut de ne pas être tolérant aux pannes. Cela signifie que lorsqu’un système est basé sur le principe de mutabilité, les changements d’état (ou de données) à un moment donné sont irréversibles ! En cas d’erreur, on ne peut plus revenir en arr
2871ière.\n\n__Composition__\n\nEn programmation fonctionnelle, on n’utilise que des fonctions, en l’occurrence, surtout des fonctions pures. Il sera donc possible d’assembler ces fonctions pour en faire de nouvelles. Les lier les unes avec les autres pour constituer une nouvelle fonction qui aura une valeur de retour plus précise. Ce dernier pourra lui aussi servir à la construction d’une autre encore plus grande. Et ainsi de suite.\n\n>La composition est, en quelque sorte, pour la programmation fonctionnelle cette construction. C’est-à-dire l’utilisation de ces fonctions pour élaborer tout le programme.\n\n\n{{Fonction Lambda}}\n\n__Séparation des données et de leur traitement__\n\nOn a vu que pour la programmation fonctionnelle, la pureté des fonctions est essentielle. Ce qui veut dire que les modifications de données et les affectations d’état peuvent rapidement se compliquer.\n\nEn programmation fonctionnelle, les manipulations de données, c’est-à-dire, l’insertion et l’extraction de celles-ci, sont séparées de leurs traitements. La manipulation de données implique un changement d’état, ce qui est hors du principe de ce paradigme. Rappelons qu’une fonction n’est pure que si ce qu’elle contient est pur.\n\nL’astuce est donc d’avoir le maximum de fonctions pures dans son programme, de laisser ces dernières traiter les données. Et de les passer dans une fonction impure juste pour les affectations (insertions et extractions).\n\nInconvénients de cette méthode : \n* On ne peut pas modifier les variables, ce qui complique un peu le traitement des données et rend l’écriture des programmes un peu plus complexe\n* Les concepts du paradigme ne sont pas suffisants pour couvrir certains cas d’usage (le développement applicatif général, qui est plus simple avec le paradigme orienté objet)\n\n\n* Les paramètres d'une fonction : représentent des valeurs inconnues qu'on peut utiliser dans la fonction et qu'on définira à l'exécution en passant des arguments (fonction paramétrées)\n\n* En JavaScript, la portée des variables à l'intérieur d'une fonction est locale et limitée à cette fonction.","tags":"[[$:/Niveau Avancée]]","title":"$:/doc/Scala","modified":"20241006202158912","type":"text/markdown"},
2872{"created":"20240830155326915","text":"\n## Le concept d' Authentification\n\nL'authentification (_authentication_ en anglais) c'est le fait de valider l'identité de l'emetteur d'une requête. On pourrait dire que c'est le fait de se connecter.\n\nLe plus souvent pour s'authentifier un utilisateur devra donner un identifiant et un mot de passe.  \nAinsi côté serveur on pourra regarder dans une liste d'utilisateurs mémorisés si on retrouve cet identifiant associé à ce mot de passe\n\nVoir egalement le conncept de session","tags":"","title":"$:/doc/serveur_web/authentification","modified":"20240830155510659","type":"text/markdown"},
2873{"created":"20240830154328203","text":"## Le concept de session utilisateur\n(condition nécessaire: utiliser un même top level domaine)\n\nLa mécanique de session est un travail main dans la main entre le serveur et le navigateur.\n.\n\n### - Cookies\n\nLes cookies sont un moyen de mémoriser des infos coté navigateur, ce sont des paires clés valeurs dans une chaine de caractère par exemple `lang=fr`\n\nLes cookies sont liés au domaine sur lequel ils ont été créé\n\nLes cookies peuvent etre crée depuis un script js executé coté navigateur via [`document.cookie`](https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie)\n\nLe serveur peut aussi déclencher la création d'un cookie en indiquant un entete [`Set-Cookie`](https://developer.mozilla.org/fr/docs/Web/HTTP/Headers/Set-Cookie) dans sa réponse, ainsi le navigateur créera et mémorisera le cookie demandé. [Doc express](https://expressjs.com/en/4x/api.html#res.cookie)\n\nPar la suite le navigateur passera les cookies mémorisés automatiquement pour toutes les futures requetes HTTP dans un entete [Cookie](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cookie)\n\nLe serveur HTTP pourra donc utiliser ces données pour préparer ses futures réponses. \n\n*Avec express on retrouve ces infos dans `req.headers.cookie`.*\n\nOn ne peut pas se fier au cookie pour garantir l'identité de celui qui fait la requete. En effet rien de plus simple pour l'utilisateur que d'éditer ses cookies pour prétendre etre quelqu'un d'autre.\n\nOn va donc uniquement utiliser les cookies pour des données non sensibles (préférences, langue, ...) ou pour des données impossible à prédire (identifiant de session)\n\n[Certains cookies nécessitent un consentement de l'utilisateur, d'autres non](https://www.cnil.fr/fr/cookies-et-traceurs-comment-mettre-mon-site-web-en-conformite). Nous, nous allons utiliser un cookie pour porter ce qu'on va a
2873ppeler un id de session nécessaire à notre mécanique d'authentification, cela fait parti des cookies qui ne nécessitent pas de consentement.\n\n### - Session\n\n**La session sera un moyen de faire le travail de mémorisation coté serveur**. Le serveur retiendra des infos sur untel et untel. Il va associer un identifiant de session à chaque lot d'infos caractérisant un utilisateur à l'origine de requetes. Cet identifiant de session sera très long pour etre impossible à prédire.\n(Il y a un token de session, contenu dans un cookies)\n\nLe serveur pourra demander au client (navigateur) de mémoriser son id de session via un cookie. Ensuite le navigateur renverra automatiquement le cookie à chaque future requête pour indiquer l'id de session.\n\nLe serveur pourra retrouver les données associées à ce numéro de session et construire une réponse sur mesure en fonction de qui lui a fait la demande.\n\nC'est comme un concert :\n\n- Le navigateur c'est moi qui vais au concert\n- Le serveur c'est le gardien du vestiaire\n- Je demande au gardien de stocker mon manteau\n- Il le range dans un casier (mémoire) numéroté (id de session) et me donne un bracelet avec mon numéro (Set-Cookie)\n- Je prends mon bracelet (je mémorise le cookie)\n- Quand je reviens demander mes affaires plus tard (nouvelle requete) je donne mon bracelet (entete cookie). Le serveur me reconnait et me donne une réponse adaptée\n\n(saison 5 - Episode 15)\n","tags":"","title":"$:/doc/serveur_web/session","modified":"20241001083040491","type":"text/markdown"},
2874{"created":"20241007075546398","text":"Différents type de serveurs \n---\n\n__Virtual Machine__ (VM) :\n\n* Définition : Une VM est une émulation logicielle complète d’un ordinateur physique. Elle peut exécuter son propre système d’exploitation et ses applications, comme si elle était un ordinateur physique.\n* Utilisation : Les VMs sont souvent utilisées pour le développement de logiciels, les tests, ou pour exécuter plusieurs systèmes d’exploitation sur une seule machine physique.\n* Flexibilité : Les VMs offrent une grande flexibilité en termes de systèmes d’exploitation et de configurations qu’elles peuvent exécuter.\n\n__VPS (Virtual Private Server)__\n* Partage des ressources : Un VPS utilise la virtualisation pour diviser un serveur physique en plusieurs serveurs virtuels. Chaque VPS fonctionne indépendamment, mais partage les ressources du serveur physique avec d’autres VPS.\n* Coût : Moins cher qu’un serveur dédié, car les coûts sont partagés entre plusieurs utilisateurs.\n* Scalabilité : Facile à mettre à niveau en ajoutant plus de ressources selon les besoins2.\n* Performance : Peut être limité par les autres VPS sur le même serveur physique.\n\nExemple d'offres de sevice type VPS: [[https://www.ionos.fr/serveurs/vps#packs]]\n\n__Serveur dédié__\n* Ressources exclusives : Un serveur dédié est un serveur physique entier réservé à un seul utilisateur. Toutes les ressources (CPU, RAM, stockage) sont exclusivement à votre disposition.\n* Coût : Plus cher, car vous payez pour l’ensemble du serveur2.\n* Performance : Offre des performances maximales et constantes, sans partage de ressources.\n* Contrôle total : Vous avez un contrôle complet sur la configuration et l’utilisation du serveur.\n\n Les 7 travaux de l’administrateur système d'un site web \n* Choisir le bon hébergement\n* Installer le serveur (sauf si mutualisé)\n* Configurer le serveur (OS…)\n* Sécuriser le serveur\n* Mettre le site en prod.\n* Maintenir et surveiller le serveur\n* Faire évoluer et migrer le serveur","tags":"","title":"$:/doc/serveurs","modified":"20241018072215570","type":"text/markdown"},
2875{"created":"20240913110859291","text":"\n## Bases de données SQL\n\nLes bases de données SQL (ou bases de données relationnelles) sont basées sur le modèle relationnel. Elles utilisent un langage structuré de requête (SQL) pour manipuler et interroger les données. Les caractéristiques principales des bases de données SQL sont les suivantes :\n\n- **Structure fixe :** Les données sont stockées dans des tables avec des lignes et des colonnes prédéfinies.\n- **Schéma rigide :** Les schémas sont définis à l'avance et les données doivent c
2875orrespondre à ce schéma.\n- **Transactions ACID :** Les transactions sont garanties pour être atomiques, cohérentes, isolées et durables.\n- **Joins :** Les opérations de jointure sont utilisées pour combiner les données provenant de différentes tables.\n- **Exemples :** MySQL, PostgreSQL, Oracle.\n\n\n### Exemple d'utilisation\n\nUn exemple courant d'utilisation d'une base de données SQL est un système de gestion de contenu (CMS) tel que WordPress. WordPress stocke les articles, les utilisateurs, les commentaires, etc., dans des tables relationnelles avec une structure fixe. Les transactions ACID sont utilisées pour garantir l'intégrité des données lors de la création, de la mise à jour ou de la suppression d'articles ou de commentaires.\n\n\n\n_mindmap_ :\n\n[[https://360digitmg.com/mindmap/sql-concepts]]","tags":"","title":"$:/doc/sql","modified":"20240913111056661","type":"text/markdown"},
2876{"created":"20240804120510853","text":"\n* Package à installer\n[[https://community.chocolatey.org/packages]]\n\n\n```powershell\nSet-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))\n```\n* Commandes : [[https://docs.chocolatey.org/en-us/choco/commands/]]\n\n```\nchoco search --by-id-only firefox \t\n\nchoco install firefox -y\n\nchoco uninstall firefox\n\nchoco outdated\n\nchoco list \n\nchoco install discord\nchoco install python\n\n```\n\n```\nchoco install pgadmin4\n```","tags":"","title":"$:/doc/system/chocaletly","modified":"20240924172135987","type":"text/markdown"},
2877{"created":"20240910121547645","text":"__curl__\n\nLes informations visibles dans cURL transitent sur le réseau, entre la machine cliente et le serveur Web. \n\nDe ce fait, nous pouvons capturer ces flux avec un logiciel tel que Wireshark et voir ce qui se passe d'un point de vue réseau. \n\nSur l'image ci-dessous, je capture les flux réseau générés par la commande \"curl -v http://192.168.100.14\". Au-delà des paquets HTTP (la requête, puis la réponse), il y a aussi des paquets TCP, car le protocole HTTP (sauf HTTP/3) s'appuie sur le protocole de transport TCP pour la gestion des connexions.","tags":"","title":"$:/doc/system/curl","modified":"20241011122247806","type":"text/markdown"},
2878{"created":"20241007091707367","text":"\n__Liste des distributions linux__\n[[https://upload.wikimedia.org/wikipedia/commons/1/1b/Linux_Distribution_Timeline.svg]]","tags":"","title":"$:/doc/system/linux","modified":"20241008091702876","type":"text/markdown"},
2879{"created":"20241007095304176","text":"__Installation coté windows du nécessaire pour la connexion à une VM linux (type ubuntu)__\n\n```\nGet-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'\n\n// Name  : OpenSSH.Client~~~~0.0.1.0\n// State : NotPresent\n```\n\n* Pour installer openSSH cotéé client (et pas coté serveur) :\n\n```\nAdd-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.\n// Path          :\n// Online        : True\n// RestartNeeded : False\n\n```\n\n* configuration de l'extension Remote - SSH coté vscode\n\n Sur l'extension Remote-SSH, on va utiliser la roue cranté, la première propostion puis on renseigne le fichier\n \n```\n# Read more about SSH config files: https://linux.die.net/man/5/ssh_config\n\nHost [email protected]\n    HostName [email protected]\n    User student\n\nHost lordbigdata-server.eddi.cloud\n    HostName lordbigdata-server.eddi.cloud\n    User student\n```\n\n* Installation de l'extension remote SSH dans VS-code puis on passe la clé à vs-code avec la commande shell :\n\n```\n ssh [email protected]\n```","tags":"","title":"$:/doc/system/powershell","modified":"20241007113358538","type":"text/markdown"},
2880{"created":"20240626085951132","text":"[[https://github.com/twigjs/twig.js/]]\n\nTwig.js is a pure JavaScript implementation of the Twig PHP templating language (https://twig.symfony.com/)\n\nThe goal is to provide a library that is compatible with both browsers and server side JavaScript environments such as node.js.","tags":"","title":"$:/doc/template/twig","modified":"20240919195305014"},
2881{"created":"20240825192258835","text":"__Pourquoi tester__ ?\n\n* Assurer la qualité et la fiabilité du code.\n* Faciliter la maintenance et les mises à jour.\n* Prévenir les régressions.\n* Aider à documenter le comportement attendu du code.\n\n## Les différents types de tests\n\nIl existe différents types de tests pour tester nos applications.\n\nChaque fois l’objectif est de faire subir à nos applications des séries de procédures pour vérifier qu’elles répondent à certains critères. Cela rend ainsi nos applications plus fiables en permettant l’anticipation de problèmes.  En identifiant rapidement les problèmes on pourra les corriger avant qu’ils ne fassent des dégâts. Nos a
2881pplications étant rendues plus stables, c’est une démarche pouvant conduire à une plus grande qualité dans nos projets.\nDe plus la plupart des ces tests pourront être automatisés, nous permettant de relancer des batteries de tests systématiquement lors d’évolutions, évitant ainsi les régressions.\n\nLes principaux types de tests sont :\n\n### Les tests unitaires\n\nIls sont souvent mis en place directement par le développeur. Il s’agit de tests rapides à mettre en place vérifiant automatiquement qu’une portion de code/un composant a le comportement attendu. La portion de code sera testée de manière isolée avec des données factices.\n\n### Les tests d’intégration\n\nL’objectif reste le même que pour les tests unitaires, on vérifiera que les composants de notre application répondent aux attentes. Contrairement aux tests unitaires, une unité de code pourra accéder à d’autres unités, par exemple pour utiliser de vraies données.\n\n### Les tests système/fonctionnels\n\nOn exécute des scénarios vérifiant que notre application assemblée fonctionne correctement dans ses cas d’utilisation identifiés.\n\n### Les tests d’acceptation\n\nC’est finalement la phase de recette de notre application. Le client et/ou les utilisateurs vérifie que l’utilisation de notre application répond au besoin initial.\n\nIl existe d’autres types de tests non-fonctionnels qui peuvent être exécutés sur une application terminée comme les tests de robustesse / de montée en charge ou de performance. Ils visent à tester les performances de nos applications notamment en la soumettant à une forte utilisation. On trouvera aussi des tests de sécurité, d’ergonomie, etc.\n\n\n---\n\n* Tests en boîte blanche (**White Box Testing**)\n>Le test en boîte blanche est une technique dans laquelle la structure interne, la conception et le codage du logiciel sont testés pour vérifier le flux d’entrée-sortie et améliorer la conception, la convivialité et la sécurité. Dans les tests en boîte blanche, le code est visible par les testeurs, c’est pourquoi on l’appelle également test en boîte transparente, test en boîte ouverte, test en boîte transparente, test basé sur le code et test en boîte en verre.\n\n* Test en boîte grise (**Gray Box Testing**)\n>Le test en boîte grise est une technique de test logiciel permettant de tester un produit logiciel ou une application avec une connaissance partielle de la structure interne de l’application. L’objectif des tests en boîte grise est de rechercher et d’identifier les défauts dus à une structure de code incorrecte ou à une utilisation inappropriée des applications.\n>\n* Test en boîte noire (**Black box testing**\n)\n>Le Black Box Testing est une méthode de test logiciel dans laquelle les fonctionnalités des applications logicielles sont testées sans avoir connaissance de la structure du code interne, des détails d’implémentation et des chemins internes. Les tests en boîte noire se concentrent principalement sur l’entrée et la sortie d’applications logicielles et sont entièrement basés sur les exigences et les spécifications logicielles. Il est également connu sous le nom de test comportemental.\n\n{{$:/doc/testing/framework}}","tags":"","title":"$:/doc/testing","modified":"20240927025948460","type":"text/markdown"},
2882{"created":"20240926095253982","text":"__Test A/B__ (ou A/B testing) \n> c'est  une technique de marketing qui consiste à proposer plusieurs variantes d'un même objet qui diffèrent selon un seul critère (par exemple, la couleur d'un emballage) afin de déterminer la version qui donne les meilleurs résultats auprès des consommateurs.\n\n\n* Source : [[https://fr.wikipedia.org/wiki/Test_A/B]]\n\n  En matière de web, \n>Le test AB est une méthode de comparaison statistique utilisée pour comparer différentes variantes d'une version de base d'une page de site Web. Le but est d'identifier les plus efficaces d'entre elles en fonction des objectifs définis. Les tests A/B permettent également d'évaluer les performances des applications mobiles et même des canaux de conversion, y compris les e-mails marketing ou les pages de destination.\n\n>L’A/B testing permet une démarche incrémentale pour détecter des modifications parfois mineures, mais souvent essentielles. Il est ainsi donc possible de chercher un rendement maximal sans mettre en péril le taux de conversion acquis.","tags":"","title":"$:/doc/testing/AB testing","modified":"20240926100306757","type":"text/markdown"},
2883{"created":"20240919191428644","text":"### Des frameworks de test javascript\n\n* **Mocha** : Un framework flexible qui permet de réaliser des tests asynchrones pour le frontend et le backend. Il est souvent utilisé avec des bibliothèques comme Chai pour les assertions.\n* **[[Jest|$:/code/js/module/jest]]** : Développé par Facebook, Jest est particulièrement populaire pour les applications React. Il offre une expérience de test sans configuration et inclut des fonctionnalités comme les tests de snapshot et la couverture de code intégrée.\n* **Jasmine** : Un framework de test comportemental (BDD) qui ne dépend d’aucun autre framework JavaScript. Il est idéal pour les tests unitaires et d’intégration.\n* **Karma** : Un outil de test qui permet d’exécuter des tests JavaScript dans différents navigateurs. Il est souvent utilisé en combinaison avec d’autres frameworks comme Jasmine ou Mocha2.\n* **Cypress** : Un framework moderne pour les tests end-to-e
2883nd, connu pour sa facilité d’utilisation et son interface interactive pour le débogage2.\n* **[[Puppeteer|https://pptr.dev/]]** : Une bibliothèque Node.js qui fournit une API de haut niveau pour contrôler Chrome ou Chromium. Elle est souvent utilisée pour les tests de rendu et les tests d’interface utilisateur2.\n* **Playwright** : Développé par Microsoft, Playwright permet d’automatiser les tests sur plusieurs navigateurs (Chromium, Firefox, WebKit) avec une grande fiabilité2.\n* **Nightwatch.js** : Un framework de test end-to-end basé sur Node.js qui utilise l’API WebDriver pour interagir avec les navigateurs2.\n* **PhantomJS** : PhantomJS est un navigateur web headless (sans interface graphique) scriptable utilisé pour automatiser des interactions avec des pages web. \nPhantomJS offre une API JavaScript permettant la navigation automatisée, la capture d'écran, les comportements utilisateurs, et l'utilisation d'assertions. \nCes possibilités en font un outil de choix pour exécuter des tests unitaires au sein d'un environnement d'intégration continue. \nPhantomJS est basé sur Webkit, ce qui en fait un environnement de navigation similaire à Safari ou à Google Chrome (bien que ce dernier utilise désormais le moteur de rendu Blink, un fork de Webkit).\n PhantomJS est un programme open source distribué sous licence BSD.\n\n* **CasperJS**: A navigation scripting and testing utility for PhantomJS and SlimerJS. It is useful for automating web interactions and testing1.\n* **Zombie.js**: A lightweight, fast, and headless browser testing library for Node.js. It’s designed for testing JavaScript-heavy applications1.\n* **SlimerJS**: Similar to PhantomJS but uses Gecko (the rendering engine of Firefox) instead of WebKit3 \n\n\n\n### Les autres frameworks de tests\n\n* **Selenium** : Un des outils les plus connus pour l’automatisation des tests web. Il supporte plusieurs langages de programmation comme Java, Python, et C#1.\n\n* **JUnit** : Principalement utilisé pour les tests unitaires en Java, mais peut également être utilisé pour les tests d’intégration1.\n* **TestNG** : Inspiré de JUnit, il offre des fonctionnalités avancées comme les tests parallèles et les configurations flexibles1.\n* **Appium** : Utilisé pour l’automatisation des tests des applications mobiles sur Android et iOS2.\n* **Robot Framework** : Un framework open-source pour les tests d’acceptation et les tests de développement pilotés par les mots-clés2.\n* **Katalon Studio** : Un outil complet pour les tests web, API, mobile et desktop. Il est facile à utiliser et ne nécessite pas de compétences en programmation2.\n","tags":"","title":"$:/doc/testing/framework","modified":"20240926113955165","type":"text/markdown"},
2884{"created":"20240926090146159","text":"**Monkey Testing**\n\nDans les tests logiciels , les tests de singe sont une technique dans laquelle l'utilisateur teste l'application ou le système en fournissant des entrées aléatoires et en vérifiant le comportement, ou en voyant si l'application ou le système va planter. Les tests de singe sont généralement mis en œuvre sous forme de tests unitaires aléatoires et automatisés .\n\n* Source : [[https://en.wikipedia.org/wiki/Monkey_testing]]","tags":"","title":"$:/doc/testing/Monkey Testing","modified":"20240926092407394","type":"text/markdown"},
2885{"created":"20240926140042634","text":"\n- Les tests logiciels ça consiste à faire subir une suite de procédures à nos applications pour vérifier qu'elles sont ce qu'on attend d'elles\n- Un test unitaire c'est un bout de code qui vérifie qu'un bout de code isolé produit le résultat attendu\n- Jest permet d'effectuer des tests unitaires via ses fonction `describe`, `test` et `expect`\n- Le 3 lois du TDD permettent de décrire une manière de produire du code pilotée par l'écriture de tests\n- Avec testing library en complément de Jest on peut tester des composants React\n\n# Tests fonctionnels\n\n## La méthode TDD\n\nLe TDD ou Test Driven Development se traduit par le développement piloté par les test en français.\n\nIl s’agira, non pas de poser de tests après avoir écrit du code. Mais construire nos tests au fur et à mesure, pour construire le code.\n\nAinsi on ne produit que du code nécessaire qui répond à nos besoins. On anticipera plus facilement les différents scénarios possible. Une fois le code écrit, on ne risquera pas de régresser en le faisant évoluer puisque les tests qui le vérifie sont déjà en place.\n\n### Les 3 lois\n\nPour s’organiser en TDD il nous suffit de suivre les 3 lois du TDD :\n\n1. Vous devez écrire un test qui échoue avant de pouvoir écrire le code de production correspondant.\n   - on n’écrit pas de code sans avoir écrit un test avant, ce test permettra de vérifier que le code fonctionne\n2. Vous devez écrire une seule assertion à la fois, qui fait échouer le test.\n   - on écrit les tests un par un, on n’écrit pas d’un coup tous les tests nécessaires\n3. Vous devez écrire le minimum de code de production pour que l’assertion du test actuellement en échec soit satisfaite.\n   - on se 
2885concentre sur « faire passer le test qu’on vient d’écrire », on ne code pas autre chose ailleurs\n\n### Le cycle du TDD\n\nCes règles se traduisent par un cycle, qu’on va répéter pour chaque étape dans notre code :\n\n{{$:/img/testing.png}}\n\nBien sûr couvrir 100% de notre code par des tests construits en allant pour piloter notre développement est une approche idéale demandant un peu de pratique des tests. Dans un premier temps ce qu’il faut se dire c’est qu’il vaut mieux un peu de tests, que pas de test du tout. Tester une fonction vitale dans notre projet, par exemple un reducer, juste après l’avoir écrit, c’est déjà une démarche qualitative pour produire un code robuste. Le vrai TDD pourra venir avec la pratique et l’expérience selon nos besoins 😉\n\n### Mise en pratique\n\n> Calcul de la médiane d’un tableau d'age. La médiante est la valeur qui sépare la moitié des valeurs d'un tableau ordonné.\n\n- Définir les tests à écrire pour la fonction `getMedian` qui prend en paramètre un tableau d'âge et retourne la médiane.\n  - Que retourner si le tableau est vide ?\n  - Que retourner si le tableau contient un seul élément ?\n  - Que retourner si le tableau contient un nombre pair d'éléments ?\n  - Que retourner si le tableau contient un nombre impair d'éléments ?\n  - ...\n- Écrire les tests\n- Écrire la fonction `getMedian` pour faire passer les tests\n- Refactoriser le code si nécessaire\n- Vérifier que les tests passent toujours\n\n## Les tests fonctionnels\n\nLes tests fonctionnels sont des tests qui vérifient le bon fonctionnement de l'application dans son ensemble. Ils permettent de vérifier que l'application répond bien aux besoins de l'utilisateur.\n\nQui dit utilisateur, dit interaction et interface (DOM). Les tests fonctionnels vont donc simuler des actions de l'utilisateur sur l'interface et vérifier que l'application réagit correctement.\n\n### Tester un composant React\n\nIl existe des outils pour tester des composants React qui complètent très bien Jest. Par exemple [Testing Libraray](https://testing-library.com/docs/react-testing-library/intro) avec [jest-dom](https://testing-library.com/docs/ecosystem-jest-dom/)\n\nOn pourra faire le rendu isolé de composants pour tester qu'ils contiennent ce qu'on attend en fonction de props qu'on leur passe\n\nUn exemple pour se donner des idées + une [cheatsheet](https://testing-library.com/docs/react-testing-library/cheatsheet)\n\n```js\n/**\n * @jest-environment jsdom\n */\n\nimport '@testing-library/jest-dom';\nimport {render, screen} from '@testing-library/react';\nimport Composant from './chemin/vers/Composant'\n\ntest('Component should have a title that match its props', () => {\n  render(\u003CComposant title=\"Hello\" />);\n  expect(screen.getByRole('heading')).toHaveTextContent('Hello');\n})\n```\n\nFinir en faisant le test sur un compteur incrémental (dans le template d'un projet Vite, il y a déjà tout ce qu'il faut) : l'appui sur le bouton doit incrémenter le compteur.\n\n## Test End-to-End\n\n> Ouverture à cypress uniquement, les apprenants n'auront pas à le mettre en oeuvre. Rester dans les concepts et non sur les détails d'implémentation.\n\nLes tests end-to-end sont des tests qui simulent le comportement de l'utilisateur sur l'application. Ils permettent de vérifier que l'application fonctionne correctement dans son ensemble.\n\nCypress est un outil qui permet de réaliser des tests end-to-end. Il permet de simuler des actions de l'utilisateur sur l'interface et de vérifier que l'application réagit correctement.\n\nSi le temps le permet, mettre en place une démo live (par exemple tester la navigation entre les pages), sinon détailler les capacités et cas d'usage en fonciton des exemples sur le site de [Cypress](https://www.cypress.io/).\n\n\n* Controle d'un composant\n  \n```js\n// src/Button.test.js\nimport React from 'react';\nimport { render, screen, fireEvent } from '@testing-library/react';\nimport '@testing-library/jest-dom/extend-expect'; // Pour des assertions DOM supplémentaires\nimport Button from './Button'; // Import du composant\n\ntest('it renders the button with the correct text', () => {\n  render(\u003CButton text=\"Click me\" onClick={() => {}} />); // Rendre le composant\n\n  // Vérifier si le bouton est rendu avec le texte \"Click me\"\n  const buttonElement = screen.getByText('Click me');\n  expect(buttonElement).toBeInTheDocument(); // Assertion que le bouton est dans le DOM\n});\n\ntest('it triggers the onClick handler when clicked', () => {\n  const handleClick = jest.fn(); // Simuler une fonction\n  render(\u003CButton text=\"Click me\" onClick={handleClick} />);\n\n  // Trouver le bouton\n  const buttonElement = screen.getByText('Click me');\n\n  // Simuler un clic\n  fireEvent.click(buttonElement);\n\n  // Vérifier si la fonction de clic a été appelée\n  expect(handleClick).toHaveBeenCalledTimes(1);\n});\n\n// On teste sir la fonction retourne le montant -230 euros pour les cahreges de décembre 2023\n       it('should return -230€ for 2023-12 Charges', () => {\n        const cible = result[\"2023-12\"][\"Charges\"].amount;
2885\n        expect(cible).toBe(-230);\n      });\n\n      it('should return 25% for 2023-12 Charges', () => {\n        const cible = result[\"2023-12\"][\"Charges\"].percent;\n        expect(cible).toBe(25);\n      });\n\n      it('should have 100% for 2023-12 negative expenses movements ', () => {\n        const cible = result[\"2023-12\"];\n        for (const categorie of CATEGORIES) {\n            // console.log(cible);\n                if (categorie !==\"Revenus\") {\n                    expect(cible[categorie].amount).toBeLessThan(0);\n                }\n            }\n      });\n      it('should have 100% for 2023-12 negative incomes movements', () => {\n        const cible = result[\"2023-12\"];\n        for (const categorie of CATEGORIES) {\n            // console.log(cible);\n            // if (categorie !==\"Revenus\") {\n                  expect(cible[\"Revenus\"].amount).toBeGreaterThan(0);\n            // }\n            }\n      });\n\t\t\t\n```\n\n\n","tags":"","title":"$:/doc/testing/TDD","modified":"20240927094129642","type":"text/markdown"},
2886{"created":"20240916071259048","text":"\nPort folio :\nhttps://bruno-simon.com/\n\nUn autre des sites de bruno-simon : https://chartogne-taillet.com/fr","tags":"","title":"$:/doc/three.js","modified":"20240927093720044"},
2887{"created":"20240911173835120","text":"__Tiddlywiki__\n\n\u003Cfieldset>\nL'application choisie pour porter le glossaire DIALIA est \u003Cb> \u003Ci> TiddlyWiki \u003C/i>\u003C/b>.\n\u003C/fieldset>\n\n* \u003Cu>Principe\u003C/u> : \u003Cb> C'est une application de bloc-notes personnelle basée sur une application wiki. \u003C/b>\n\n* Site de référence : [[https://tiddlywiki.com/]]\n\n  \n * \u003Cu>Avantages\u003C/u> :\n\n\t * En plus d'être un \u003Cb>site Web statique \u003C/b>, TiddlyWiki est implémenté comme une \u003Cstrong>application monopage ([[SPA]])\u003C/strong>. Tidlywiki permet d'intégrer  une logique d'application dans des pages Web pour les rendre dynamiques.\n\t * [[Licence libre]] \n\t * [[Ecoconception]] et sécurité : leger en taille (environ 10 Mo en tout) et executé uniquement sur le poste de l'utilisateur par le navigateur (pas de serveur, pas de tiers partie)\n   *  \u003Cstrong> Le fichier HTML\n contient tout ce qui est nécessaire pour démarrer l'application (pas de dépendances). \u003C/strong> Il est exportable pour une consultation en local en utilisant la barre d'outil en haut de la page ou en cliquant sur le bouton suivant :\n  \n\u003Ccenter>\u003C$button>\u003C$action-sendmessage\n  $message=\"tm-download-file\"\n  $param=\"$:/core/templates/tiddlywiki5\"\n  download=\"glossaire_DialIA.html\"/>\nExporter le glossaire\n\u003C/$button>\n\u003C/center>\n\n\t\n* \u003Cu>Principes techniques \u003C/u>:\n  \n   * D'un point de vue technique, TiddlyWiki est \u003Cstrong>une architecture [[MVC]] \u003C/strong> assez classique, avec une séparation stricte des tâches. Le modèle (Model) est le magasin tiddler, la vue (View) est un arbre de rendu  et le contrôleur (Controllers) est le code principal lui-même.\n   * TiddlyWiki peut être considéré comme faisant partie de la \u003Cstrong>Jamstack \u003C/strong>: En fait, il existe des projets comme [[Tddlyjam|https://tiddlyjam.com/]]  qui permettent de transformer TiddlyWiki en sites statiques et blogs, inspirés par l'approche [[JAMstack]]. Cela permet de créer des applications web modernes et performantes en utilisant TiddlyWiki comme base.\n  * Plugins variés disponibles :\n\t  * Gestion de Mardown\n\t  * Construction de graphe de connaissance avec Graphviz\n\t * Dessiner en utilisant les fonctionnalités de draw.io\n\t\n\u003Cbr>\n\n\n\u003Cdetails>\n\t\u003Csummary> \u003Cstrong> Pour aller plus loin avec Tiddlywiki: \u003C/strong>\n\t\u003C/summary>\n\t\n* Sites pour les developpeurs :\n\n\t * [[https://tiddlywiki.com/dev/]]\n  * [[https://tw5magick.tiddlyspot.com/]]\n  * [[https://kookma.github.io/TW-Scripts/]]\n\n* Sites exemples (templates):\n   * Collection de Templates [[https://tiddlyhost.com/|https://tiddlyhost.com/templates?t=1]]\n  * Une base de données de 255 « classifications des sciences » ou « cartes de la connaissance »\nde l'Antiquité à nos jours, cartographiant 18393 territoires disciplinaires :  [[https://atlas-disciplines.unige.ch/]]\n  * Sur l'economie et l'IA [[https://etniko.github.io/Knowledge/]]\n  * Tiddlyviewer[[http://tiddlyviewer.tiddlyspot.com/]]\n\n* Dépots du projet tiddlywiki sur GitHub : [[Liste des dépots GIT de tiddlywiki|https://github.com/TiddlyWiki]]\n\n  * endpoint API GitHub des dépots avec tiddlywiki5: [[https://api.github.com/search/repositories?q=TiddlyWiki]]\n \n  * endpoint du dépot principal de tiddlywiki:  [[https://api.github.com/repos/tiddlywiki/tiddlywiki5]]\n \n* [[TiddlyWiki toolmap|https://dynalist.io/d/zUP-nIWu2FFoXH-oM7L7d9DM]]\n\n{{$:/img/ico/tiddlyWiki.png}}\n\n\u003C/details>\n\n","tags":"$:/doc/tiddlywiki","title":"$:/doc/tiddlywiki","modified":"20241110115100904","type":"text/markdown","icon":"$:/img/ico/tiddlyWiki.png"},
2888{"created":"20240715091722442","text":"## Entretiens\n\n* https://www.welcometothe
2888jungle.com/fr/articles/methode-star-entretien-embauche\n* https://www.michaelpage.fr/advice/candidats/l%E2%80%99entretien-d%E2%80%99embauche/entretien-dembauche-le-top-10-des-questions\n* https://careers.societegenerale.com/conseils-candidats/pendant-entretien/15-questions-plus-courantes-entretien-embauche\n* https://www.welcometothejungle.com/fr/articles/entretien-questions-preparer\n* https://www.glassdoor.fr/index.htm, https://fr.indeed.com/cmp/Mon-Entreprise/reviews?fcountry=ALL, https://gowork.fr/capgemini-engineering-france\n\n## Offres d'emploi\n\n* https://www.welcometothejungle.com/fr\n* https://www.hellowork.com/fr-fr/\n\n* https://www.welcometothejungle.com/fr \n* https://www.aidostage.com/ \n* https://fr.indeed.com/ \n* https://www.pole-emploi.fr/accueil/ \n* https://www.alsacreations.com/ \n* https://www.talent.io/p/en-fr/home \n* https://www.hellowork.com/fr-fr/ \n* https://www.jobijoba.com/fr/ \n* https://www.lesjeudis.com/ \n* https://diversifiezvostalents.com/#/ \n* https://www.apec.fr/ \n* https://pasteque.io/\n* https://jobs.makesense.org/fr \n* https://adopte1dev.com/ \n* https://www.mozaiktalents.com/ \n* https://www.monster.fr/\n* https://jobs.makesense.org/fr\n* freelance : https://www.malt.fr/ https://www.codeur.com/developpeur/web https://fr.fiverr.com/categories/programming-tech/software-development https://www.freelancerepublik.com/\n* Liste comparative des platformes freelance : https://www.lafabriquedunet.fr/entreprise/plateformes-freelances-developpeurs-web/\nhttps://lafrenchtech.gouv.fr/fr/\n\nSite de commentaires sur les entreprises\n* https://www.glassdoor.fr/index.htm\n\n## Exemple de description d'une offre chez Canonical\n[[https://canonical.com/careers/career-explorer]]\n\n[[https://boards.greenhouse.io/canonicaljobs/jobs/6128410?gh_src=0339bcf41us]]\n\nWeb Developer\nat Canonical - Jobs (View all jobs)\nHome based - Europe, Strasbourg\n\nOur mission is great open source\nIt is our mission to make open source software available to people everywhere. We create world-renowned software, impacting the lives of millions of people every day.\n\nThe web team works in a multi-disciplinary environment with visual designers, UX designers and other developers to bring exciting new web projects to life. We help and learn from each other and constantly strive to improve both our work and our processes.\n\n**Required skills and experience**\n* Demonstrable experience of work on modern web applications\n* A strong understanding of HTML, CSS with SCSS and JavaScript\n* Experience with Javascript components libraries\n* Experience with TypeScript\n* Experience with responsive user interfaces for a wide range of devices and browsers\n* Experience with Git or other version control systems\n* Awareness of SEO best practice\n* Consideration of accessibility in all aspects of your work\n* A strong understanding of web performance in complex user interfaces\n* Ability to interact with UX, designers and server-side developers\n* Curiosity about technology and a thirst to learn\n* Based in EMEA timezones (Europe, the Middle East and Africa)\n* University degree or equivalent education\n* \n**Useful experience if you have it**\n* Familiarity with Linux desktop technologies\n* Server-side languages, such as Python or NodeJS\n* Experience working on a large scale React (with TypeScript) project\n* A history of open source contributions\n* Relevant work experience\n  \n**Who you are**\nWe want a Web Developer who loves what they do. You are passionate about web standards and keep abreast of new developments in our industry. You always look for opportunities to improve your skills. You like to show off what you’re working on and also learn from others. You have strong attention to detail and value the design of a product as much as you value the code. You have strong communication skills and maybe even blog once in a while. You’re aware of the latest CSS techniques but also know the limitations that developing for a broad audience can bring - actually, you embrace the challenge.\n\n**In this team**\n* You’ll create high fi
2888delity websites and web apps using the latest incarnations of HTML, CSS (SCSS) and Javascript (React and TypeScript)\n* You’ll help maintain existing projects including updating content and adding new pages\n* You’ll manage incoming requests for updates and liaise with or delegate to other people as necessary\n* You’ll ensure the standard of our output remains high and consistent across our whole product portfolio\n* You’ll ensure new pages are published according to specification and in compliance with our web style guide\n* You’ll participate in and contribute to our living style guide, Vanilla Framework.\n* Work closely with UX designers and visual designers to implement exemplary user experiences.\n\n**What we offer**\nAn opportunity to help shape a company and products with a strong influence in the open source community\nAn inclusive work environment within a team of friendly people with a broad range of skill sets, from UX designers to copywriters\nLearning and development\nAnnual compensation review\nRecognition rewards\nAnnual leave\nPriority Pass for travel\nWe are proud to foster a workplace free from discrimination. Diversity of experience, perspectives, and background create a better work environment and better products. Whatever your identity we will give your application fair consideration.\n\n\nDescribe your experience using or contributing to open source software *\nDescribe your experience with JavaScript, TypeScript and SCSS *\nAre you due to graduate soon, or have you graduated from university in the past two years?\nTell us if you are a recent graduate, or if you should graduate from university this year. We have certain roles which are open to recent of soon-to-be graduates.\n\nGithub\n\nWhat was your bachelor's university degree result, or expected result if you have not yet graduated? *\nPlease indicate your result, or expected result if you are close to graduation.\n\nSelect the grading system to help us understand your result *\nUniversities around the world score degrees in different ways.\nif you selected None of the above in the previous question, please describe how your university grading system works and country of graduation.\nPlease specify the university grading system you were graded with.\n\nHow did you perform in mathematics at high school? *\nHow did you perform in your native language at high school? *\n\nWe expect all c
2888olleagues to meet in person 2-4 times a year, at internal company events lasting between 1-2 weeks. We try to pick new and interesting locations that will likely require international travel and entry requirement visas and vaccinations. Are you willing and able to commit to this? *\nPlease note that if you require any accommodation for travel that relates to a physical disability please do let us know during your hiring process and we will be happy to discuss your requirements further.\n\nWebsite\nLinkedIn Profile\n\n# Vérification de CV\n* Evaluation de cv avec l'AI: [[https://www.resumemaker.online/outils-gratuits/verificateur-cv-gratuit]] (pas de compte))\n* Adéquation à une offre d'emploi : [[https://www.jobscan.co/resume-scanner]] (creation de compte obligatoire)\n* [[https://resumeworded.com/resume-scanner]] (creation de compte obligatoire et semble focntionner uniquement avec de l'anglais)\n* [[https://cvverif.com/]]\n\n\n# Simulateur de salaire :\n[[https://www.hellowork.com/fr-fr/outil/salaire-brut-net/brut_annuel-34000.html]]\n\n# Création d'un CV par IA\n\n  [[https://cvtoolspro.com/?wickedsource=google&wickedid=EAIaIQobChMIhpP6p-uQiAMVjKhoCR3aQSNkEAAYASAAEgKovfD_BwE&wickedid=688320300847&wcid=20961401500&wv=4&utm_source=google_ads&utm_account=RD&gad_source=5&gclid=EAIaIQobChMIhpP6p-uQiAMVjKhoCR3aQSNkEAAYASAAEgKovfD_BwE]]\n\n\t# Faire son CV avec inkscape\n\tDidacticiel : https://www.youtube.com/watch?v=gRpNQBg_tJE\n\t","tags":"","title":"$:/doc/TRE","modified":"20240828114037679","type":"text/markdown"},
2889{"created":"20241010071024008","text":"__Virtual Host__\n\nLes VirtualHosts Apache permettent d'héberger plusieurs sites web sur un seul et même serveur.","tags":"","title":"$:/doc/VirtualHost","modified":"20241010071235507","type":"text/markdown"},
2890{"created":"20240704073540304","text":"* [[https://devhints.io/vscode]]\n\n---\n\n* Ctrl+D : pour selectionner successivement toutes les propretes identiques à la selection\n* ctrl + f : Je recherche dans le fichier ouvert\n* ctrl + maj + f\n* ctrl + shift + f : Je recherche partout\n* ctrl +, : accès au settings\n\n---\n\nextensions vscode :\n\n* tabnine avec codestral\n* accessibilité :\n    - Headingsmap\n    - Web developer\n\n---\n\n* Modification des clés de registre :\n\n# Press the Windows key + R to open the Run dialog.\n\n# Type regedit and press Enter to open the Registry Editor.\n\n* Exemple pour créer un menu contextuel personnalisé :\n\n# Navigate to the following key: HKEY_CLASSES_ROOT\\Directory\\Background\\shell\n# Right-click on the (Default) key and choose \"New\" > \"Key\". Name the new key \"New Context Menu Item\".\n# Double-click on the \"New Context Menu Item\" key to open it.\n# Right-click on the (Default) value and choose \"Modify\". Enter the name of your context menu item (e.g., \"Custom Action\") and press Enter.\n# Create a new string value named \"Icon\". Double-click on it and enter the path to the icon file you want to use for your context menu item. For example, C:\\path\\to\\icon.ico.\n# Create a new string value named \"Command\". Double-click on it and enter the command you want to execute when the context menu item is clicked. For example, C:\\path\\to\\your\\script.bat.\n# Close the Registry Editor.\n\n\nNow, when you right-click on a folder in File Explorer, you should see your new context menu item.\n\nNote: Make sure to replace C:\\path\\to\\icon.ico and C:\\path\\to\\your\\script.bat with the actual paths to your icon file and script.\n\nIf you want to add a submenu to your context menu item, follow these steps:\n\n\n# Right-click on the \"New Context Menu Item\" key and choose \"New\" > \"Key\". Name the new key \"Submenu\".\n# Double-click on the \"Submenu\" key to open it.\n# Repeat steps 6-8 to create a new context menu item under the \"Submenu\" key.\n\n---\n\nEmmet pour les balise html dans react :\n\nCTRL + , pour arriver dans les settings.\npuis ouvrir les settings json (en haut à droite de vscode l'icone) \n\net ajouter ça dans les settings :\n\n    \"emmet.includeLanguages\": {\n        \"javascript\": \"javascriptreact\"\n    }","tags":"","title":"$:/doc/vscode","modified":"20240919151226257","type":""},
2891{"created":"20241007080551174","text":"Une attaque par déni de service (abr. DoS attack pour Denial of Service attack en anglais) est une attaque informatique ayant pour but de rendre indisponible un service, d'empêcher les utilisateurs légitimes d'un service de l'utiliser. À l’heure actuelle la grande majorité de ces attaques se font à partir de plusieurs sources, on parle alors d'attaque par déni de service distribuée (abr. DDoS attack pour Distributed Denial of Service attack).\n\nIl peut s'agir de :\n\nl’inondation d’un réseau afin d'empêcher son fonctionnement ;\nla perturbation des connexions entre deux machines, empêchant l'accès à un service particulier ;\nl'obstruction d'accès à un service pour une personne en particulier ;\négalement le fait d'envoyer des milliards d'octets à une box internet.\nL'attaque par déni de service peut ainsi bloquer un serveur de fichiers, rendre impossible l'accès à un serveur web ou empêcher la distribution de courriel dans une entreprise.\n\nL'attaquant n'a pas forcément besoin de matériel sophistiqué. Ainsi, certaines attaques DoS peuvent être exécutées avec des ressources limitées contre un réseau de taille plus importante et plus moderne. On appelle parfois ce type d'attaque « attaque asymétrique » en raison de la différence de ressources entre les protagonistes.","tags":"","title":"$:/doc/web/faille/Dd
2891os","modified":"20241007080708488"},
2892{"created":"20241001141606765","text":"Faille XSS (Cross-Site Scripting) : Permet à un attaquant d’injecter du code malveillant dans une application web1.\nFaille SQL Injection : Permet à un attaquant d’exécuter des requêtes SQL non autorisées sur une base de données2.","tags":"","title":"$:/doc/web/faille/SQL","modified":"20241007080501843"},
2893{"created":"20240712080116760","text":"__XSS (Cross-Site Scripting)__\n\nUne faille XSS peut être présentée comme la récupération d’un contenu qui permet de l’injection de code.\n\n* Pour éviter la faille XSS (Cross-Site Scripting), il faut ne jamais interpréter les saisies utilisateurs comme du HTML ou bien les nettoyer au préalable.\n\n* Pour se prémunir des failles XSS, il est possible d'utiliser [[DOMPurify|https://github.com/cure53/DOMPurify]]\n\n### Exemple d'injection Javascript\n\nExemples de code \"malveillant\" à injecter dans une page web:\n\n```html\n\u003Cscript type=\"text/javascript\">\n        window.location.href = \"https://www.exemple.com\";
2893\n\n// Redirection après 5 secondes\n// setTimeout(function() {\n//     window.location.href = \"https://www.exemple.com\";\n        // }, 5000);\n    \u003C/script>\n```\n* Dans le navigateur\n\nPour tester des injections de code javascript:\n* Pas de soucis avec la console de chrome\n* dans la console de firefox, saisir  `about:config` dans l'url puis  `dom.event.cl` dans le champs de recherche et enfin double cliquez sur l'option `dom.event.clipboardevents.enabled` afin de passer sa valeur à `False`\n\n```js\n//Pour voir le vrai nom du serveur du site que vous regardez.\n\nalert(\" L’URL réelle est :\\t\\t \" + location.protocol + \"//\"   + location.hostname + \" / \" + \" \\nL’URL de l’adresse est :\\t\\t \" + location.href + \" \\n \") ;\n```\n\n\t\n```js\n// pour changer une valeur retourner par un formulaire \n\nalert(document.forms[0].to.value=\"quelque chose »)\n```","tags":"","title":"$:/doc/web/faille/XSS","modified":"20241007080518647","type":"text/markdown"},
2894{"created":"20240913153829249","text":"__BeEF__\n\n>BeEF is short for The Browser Exploitation Framework. It is a penetration testing tool that focuses on the web browser.\n\n* [[https://github.com/beefproject|https://github.com/beefproject/beef]]\n\nProblème de persistance de l'intrusion sauf en cas d'empoisonnement par le protocole ARP (table ARP)","tags":"","title":"$:/doc/web/faille/XSS/BeEF","modified":"20241007080531073"},
2895{"created":"20241017075952796","text":"{{Wordpress}}\n\n**Création d'un thème wordpress** : \n\n1.   - création du répertoire onews dans wp-sources/wp-content/themes\n1.  - dans le répertoire onews, on crée un fichier style.css\n1.  - dans le répertoire onews, on crée un fichier style.css\n1. - on décrit notre thème dans style.css\n1. - on ajoute un fichier \u003Cmark> \u003Cstrong>index.php \u003C/strong> \u003C/mark>dans le dossier onews\n1. - on prend un screenshot de la page :  et on le met dans le dossier cible du thème\n1. - renommer le fichier en screenshot.png\n\n\u003Cmark>\n C'est le => Minimum d'un thème WP\n\u003C/mark>\n\n__Suite de la création du thème WP__ : \n\n1. - copier/coller le dossier css à intégrer dans le dossier cible du thème\n1. - copie/colle le dossier images dans le dossier cible du thème\n1. - création du fichier header.php dans le dossier cible du  thème: \n1. - coller dedans tout le html de integration/html/index.html jusqu'à la balise main\n1. - ajouter un bloc de PHP dans la balise head, et y mettre la fonction wp_head() \n1. - modifier le chemin pour les deux balises link :\n     \n\n```html\n\u003Clink rel=\"stylesheet\" href=\"./wp-content/themes/onews/css/reset.css\">\n\u003Clink rel=\"stylesheet\" href=\"./wp-content/themes/onews/css/style.css\">\n```\n\n7. - création du fichier footer.php : \n   - coller la fin du fichier integration/html/index.html à partir de la balise \u003C/main> ","tags":"$:/doc/wordpress","title":"$:/doc/wordpress","modified":"20241017120631398","type":"text/markdown","icon":"$:/img/ico/wordpress.svg"},
2896{"created":"20241011081559759","text":"WSL2 : Windows Subsystem for Linux 2\n---\n\n> Windows Subsystem for Linux (WSL) est une couche de compatibilité permettant d'exécuter des exécutables binaires Linux (au format ELF) de manière native sur Windows 10, Windows 11 et Windows Server 2019. \u003Cbr>\n> Microsoft présente WSL comme un outil pour les développeurs - en particulier les développeurs Web et ceux qui travaillent sur ou avec des projets open source19. WSL utilise moins de ressources qu'une machine virtuelle classique (avant WSL, une machine virtuelle était le moyen le plus direct pour exécuter un logiciel Linux dans un environnement Windows), tout en permettant aux utilisateurs d'utiliser des applications Windows et des outils Linux sur le même ensemble de fichiers.\n\n* Source : [[Wikipedia|https://fr.wikipedia.org/wiki/Windows_Subsystem_for_Linux
2896]]","tags":"","title":"$:/doc/WSL2","modified":"20241011083008318","type":"text/markdown"},
2897{"created":"20240327203113727","text":"\u003C?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n\u003C!-- Created with Inkscape (http://www.inkscape.org/) -->\n\n\u003Csvg\n   width=\"66.221001mm\"\n   height=\"65.432808mm\"\n   viewBox=\"0 0 66.221001 65.432808\"\n   version=\"1.1\"\n   id=\"svg1\"\n   xml:space=\"preserve\"\n   xmlns=\"http://www.w3.org/2000/svg\"\n   xmlns:svg=\"http://www.w3.org/2000/svg\">\u003Cdefs\n     id=\"defs1\" />\u003Cg\n     id=\"layer1\"\n     transform=\"translate(-63.201463,-43.147048)\">\u003Cg\n       id=\"g2\"\n       transform=\"translate(21.760396,7.9396039)\">\u003Cpath\n         style=\"fill:#fc7d00\"\n         d=\"m 75.807825,99.889063 c -1.161432,-1.992385 -1.558555,-4.360837 -1.207479,-7.201426 0.209522,-1.695259 0.735225,-2.238983 0.998138,-1.032355 0.221206,1.015216 0.400477,1.441305 1.740372,4.136502 l 1.15922,2.331769 -0.690114,1.240106 c -0.851648,1.530381 -1.339585,1.658551 -2.000137,0.525404 z m 5.600667,-2.425719 C 80.97193,97.298805 80.4789,97.075885 80.312871,96.967965 79.948012,96.730805 78.04517,92.820243 77.575987,91.343349 77.39107,90.761265 77.135939,90.011522 77.009029,89.677253 c -0.353623,-0.93141 -0.274287,-3.593554 0.136186,-4.569782 l 0.366931,-0.872672 0.492965,1.045652 c 1.14303,2.424538 3.243894,5.58449 4.699484,7.068588 l 1.560686,1.591253 -0.336143,1.347362 c -0.300656,1.205115 -1.170738,2.590115 -1.574579,2.506419 -0.08377,-0.01736 -0.509504,-0.16619 -0.946067,-0.330729 z M 67.147316,95.378245 c -0.956612,-2.272405 -1.135061,-4.262513 -0.663849,-7.403423 0.43483,-2.898408 0.728528,-3.843492 1.91321,-6.156474 0.596272,-1.164166 1.732174,-3.407407 2.524225,-4.984978 1.619856,-3.226354 2.217925,-3.753348 3.427693,-3.020341 0.590079,0.357532 0.793808,0.801468 1.207048,2.630225 0.575583,2.54719 0.597762,3.168066 0.196737,5.507386 -0.784688,4.577362 -0.925005,5.025879 -2.713648,8.674077 -2.313257,4.718223 -4.995293,6.882242 -5.891416,4.753528 z m -7.368512,-0.56675 c -0.821682,-0.623746 -0.595929,-1.972645 0.487058,-2.910218 0.522543,-0.452382 1.717907,-1.530544 2.656365,-2.395917 l 1.706287,-1.573406 -0.1651,2.234864 c -0.162467,2.199229 -0.182524,2.251006 -1.2579,3.24721 -0.832337,0.771058 -2.609518,1.837034 -2.929855,1.757365 -0.01861,-0.0046 -0.242194,-0.166582 -0.496855,-0.359898 z m 26.179863,-2.041903 c -1.452213,-0.844871 -3.367902,-3.137727 -4.966935,-5.944841 -2.243235,-3.938013 -2.933759,-5.622499 -3.191126,-7.784528 -0.296459,-2.49042 -0.651155,-4.567627 -0.862463,-5.050839 -0.270745,-0.619131 0.481748,-1.130129 1.345122,-0.913436 0.86394,0.216835 2.257515,1.621825 4.621679,4.659533 2.235506,2.872397 3.221959,4.371129 3.645113,5.538076 0.184689,0.509323 0.436848,1.164166 0.560353,1.455208 0.976499,2.301124 1.325358,5.278728 0.879593,7.507553 -0.135417,0.677086 -0.291143,0.825365 -0.859896,0.818777 -0.381992,-0.0044 -0.90914,-0.132901 -1.17144,-0.285503 z M 55.399949,91.687307 c -0.47651,-0.476511 -0.388586,-1.126171 0.47625,-3.518958 0.105193,-0.291042 0.335265,-1.005417 0.511272,-1.5875 0.176006,-0.582084 0.692154,-1.813481 1.146996,-2.73644 0.717248,-1.455431 1.002198,-1.762632 2.147418,-2.315104 0.726238,-0.350349 1.446979,-0.63825 1.601645,-0.639779 0.418386,-0.0041 3.164688,-2.123578 5.56988,-4.298517 2.385111,-2.156781 3.215334,-2.833325 3.0011,-2.445578 -0.0804,0.145521 -0.704552,1.455209 -1.387001,2.910417 -3.811515,8.127426 -6.057874,11.137402 -10.163335,13.618213 -2.417174,1.460628 -2.446583,1.470888 -2.904225,1.013246 z M 95.166826,89.076372 C 94.875785,88.961217 94.280472,88.856839 93.84391,88.84442 91.515069,88.778171 89.841036,87.429406 89.209596,85.110565 89.008699,84.372809 88.748843,83.710177 88.63214,83.63805 c -0.116704,-0.07213 -0.212189,-0.358617 -0.212189,-0.636644 0,-0.520909 -0.721669,-1.944151 -1.647342,-3.248812 -0.289879,-0.408561 -0.459705,-0.810185 -0.377391,-0.892499 0.08231,-0.08231 1.256162,0.504917 2.608552,1.304958 3.509148,2.075926 4.944465,2.84392 5.31505,2.84392 0.784474,0 2.038631,2.823207 2.038631,4.58912 0,1.525874 -0.258659,1.847025 -1.190625,1.478279 z M 47.409532,82.253228 c 0,-0.686374 1.272035,-2.623631 2.629334,-4.004368 2.408357,-2.449944 7.440865,-5.609643 10.864417,-6.821307 2.856027,-1.010806 3.369614,-1.11858 5.330477,-1.
289711858 1.787566,0 2.048993,0.06746 2.621032,0.67637 l 0.635417,0.67637 -1.184609,1.111718 c -0.651534,0.611445 -2.076548,1.884656 -3.166696,2.829359 -1.090149,0.944703 -2.249457,1.957621 -2.57624,2.25093 -0.7055,0.633231 -2.459086,1.520331 -4.437506,2.244837 -0.291042,0.10658 -0.826823,0.322779 -1.190625,0.48044 -2.314156,1.002892 -4.650524,1.549272 -7.739063,1.809847 -1.197356,0.10102 -1.785938,0.05633 -1.785938,-0.135616 z m 46.827277,-1.452871 c -0.802552,-0.31323 -2.231302,-1.032249 -3.175001,-1.597821 -1.903866,-1.141014 -2.987873,-1.767418 -4.758524,-2.749762 -1.65131,-0.916135 -3.404751,-2.223643 -4.479832,-3.340528 -1.055958,-1.09702 -0.932443,-1.526087 0.205963,-0.71547 0.431025,0.306917 0.966635,0.55803 1.190244,0.55803 0.223609,0 0.480147,0.119063 0.570083,0.264584 0.08994,0.145521 0.447125,0.264583 0.793751,0.264583 0.346625,0 0.693883,0.102996 0.771684,0.228881 0.0778,0.125884 0.590843,0.301992 1.140094,0.39135 0.549251,0.08936 1.53442,0.284325 2.189263,0.433261 1.761704,0.400677 4.248649,0.890932 8.069792,1.590809 3.345204,0.612705 3.299044,0.586561 4.338774,2.456976 0.62418,1.122855 0.71157,2.045673 0.23852,2.518723 -0.56776,0.567756 -5.391057,0.361346 -7.094811,-0.303616 z m -50.531443,-3.8768 c -0.218282,-0.141065 -0.635,-0.262091 -0.926042,-0.268947 -0.291042,-0.0069 -0.75205,-0.181254 -1.024463,-0.38755 -0.577081,-0.437018 -0.50334,-0.539499 1.472924,-2.046963 2.55786,-1.951099 7.423535,-3.807534 12.267466,-4.680493 0.881885,-0.15893 2.024977,-0.288964 2.540206,-0.288964 0.515228,0 1.304715,-0.128264 1.754414,-0.28503 0.449699,-0.156766 1.092544,-0.237245 1.428545,-0.178842 0.58158,0.101088 0.585504,0.116132 0.08174,0.313356 -4.177975,1.635685 -7.278409,3.450793 -11.19598,6.554541 l -1.935562,1.533475 -2.033188,-0.0041 c -1.118253,-0.0022 -2.211781,-0.119467 -2.430062,-0.260531 z m 54.425898,-2.547716 c -0.09156,-0.09155 -1.034134,-0.269486 -2.094618,-0.395402 -2.295673,-0.272574 -4.989489,-0.759435 -7.087528,-1.28095 -4.307705,-1.070778 -5.797955,-1.614716 -6.73062,-2.456662 -0.282101,-0.254661 -0.73709,-0.463021 -1.011086,-0.463021 -0.540696,0 -1.254128,-0.58783 -1.254128,-1.033335 0,-0.547518 1.2251,-1.024879 3.175,-1.23714 2.915954,-0.317424 8.608554,-0.25341 10.583334,0.119012 0.945885,0.178383 2.167022,0.390827 2.713638,0.472097 0.546615,0.08127 1.059657,0.254249 1.140094,0.384398 0.08044,0.130149 0.363267,0.236635 0.628512,0.236635 0.607449,0 5.674818,2.490888 6.841688,3.363064 0.64201,0.47987 0.80047,0.739699 0.5991,0.982339 -0.65289,0.786681 -6.930535,1.881816 -7.503386,1.308965 z M 73.404846,71.951028 c -1.649865,-0.06686 -1.918229,-0.145082 -1.918229,-0.559107 0,-0.264753 -0.604299,-1.04662 -1.342887,-1.737483 -1.27641,-1.193931 -1.327476,-1.293318 -1.031577,-2.007683 0.171221,-0.413363 0.596305,-0.938305 0.944632,-1.166538 0.348327,-0.228232 0.806461,-0.829349 1.018076,-1.335814 0.211615,-0.506466 0.515304,-0.920847 0.674865,-0.920847 0.159561,0 0.586166,-0.296055 0.948012,-0.657901 0.766791,-0.766791 1.787832,-0.911729 2.970835,-0.421714 0.46254,0.191591 1.139571,0.291268 1.504513,0.221504 0.544721,-0.10413 0.663531,-0.02323 0.663531,0.451806 0,0.565825 0.861448,1.562455 1.523297,1.762339 0.222973,0.06734 0.02667,0.554856 -0.595313,1.478447 -1.073708,1.594366 -1.099979,1.775002 -0.420257,2.88972 0.594942,0.975683 0.3328,1.419549 -0.838366,1.419549 -0.414685,0 -1.075482,0.148829 -1.468438,0.33073 -0.425535,0.196982 -1.490197,0.299292 -2.632694,0.252992 z M 50.716824,67.676869 c -2.098756,-0.236981 -4.477589,-1.246751 -7.276042,-3.088542 -2.392428,-1.574568 -2.441633,-2.107411 -0.261447,-2.831235 1.516762,-0.503566 1.840886,-0.504304 10.580198,-0.02409 l 3.042708,0.167192 3.183224,1.558557 c 1.750774,0.857207 3.27597,1.558557 3.389325,1.558557 0.323592,0 2.82016,1.688576 2.82016,1.907441 0,0.107871 -0.327422,0.07096 -0.727604,-0.08202 -0.750509,-0.286902 -5.781803,0.04543 -8.26823,0.546138 -1.788551,0.360173 -4.698238,0.489448 -6.482292,0.288001 z m 33.297182,-2.457074 c 0.167697,-0.106912 0.534575,-0.196209 0.815285,-0.198437 0.468362,-0.0037 1.600617,-0.313222 2.929202,-0.800703 0.864068,-0.317042 5.46643,-1.746062 6.680729,-2.074347 0.618464,-0.167201 1.630495,-0.445083 2.248959,-0.617516 0.618463,-0.172433 2.05503,-0.779859 3.19237,-1.349836 1.684959,-0.844416 2.248409,-1.007301 3.042709,-0.879604 0.53615,0.0862 1.78148,0.233583 2.76741,0.32753 0.98592,0.09395 1.86319,0.285055 1.94949,0.424686 0.2879,0.46584 -2.32532,2.790122 -4.10723,3.653096 -3.801853,1.841231 -3.839305,1.846652 -12.258241,1.774424 -4.161073,-0.0357 -7.42838,-0.152381 -7.260683,-0.259293 z M 68.891525,64.5
289752099 c -0.190373,-0.06508 -2.501979,-1.546715 -5.136902,-3.292525 -5.077502,-3.364177 -9.037954,-6.851398 -11.50797,-10.132893 -1.294785,-1.720164 -1.58083,-2.283958 -2.08002,-4.099713 -0.390543,-1.420565 -0.274974,-1.68712 0.647669,-1.493813 0.38295,0.08023 1.232054,0.253969 1.886897,0.386078 2.095551,0.422762 2.636258,0.789555 5.632298,3.820711 3.172609,3.209796 4.577133,4.859671 6.72685,7.901938 0.758416,1.073306 2.044538,2.890077 2.858049,4.037268 1.376566,1.941195 1.786333,3.150944 0.973129,2.872949 z M 79.924921,63.63787 c -0.389239,-0.265434 -0.385999,-0.397336 0.03828,-1.558103 0.55968,-1.531217 0.957773,-2.11333 4.233596,-6.190586 1.403003,-1.74625 3.034725,-3.895662 3.626047,-4.776471 1.554314,-2.315239 3.841928,-4.307054 6.441319,-5.608425 1.856569,-0.929482 2.508107,-1.12448 3.757177,-1.12448 0.831114,0 1.511116,0.117146 1.511116,0.260325 0,0.143178 -0.457435,1.321354 -1.016522,2.618168 -1.197982,2.778742 -4.709054,7.618528 -7.199939,9.924648 -1.664652,1.541174 -6.868696,5.169052 -8.904771,6.207752 -1.225293,0.625082 -1.842191,0.68641 -2.486299,0.247172 z M 69.199051,59.849236 C 65.274748,54.391198 63.876956,52.518532 62.168732,50.430494 61.19124,49.235662 60.22154,47.891478 60.013844,47.443418 58.095641,43.3053 57.577614,41.48852 57.983722,40.323557 c 0.15055,-0.431869 0.273728,-1.124636 0.273728,-1.539484 0,-1.003015 0.584737,-0.986075 2.263304,0.06557 1.967711,1.232798 2.908852,2.225349 4.878466,5.144953 1.305758,1.935555 2.019258,3.337164 2.626421,5.159375 0.458496,1.376033 0.948532,2.708621 1.088969,2.961308 0.140437,0.252687 0.25534,0.692145 0.25534,0.976573 0,0.284428 0.119063,0.590726 0.264583,0.680663 0.145521,0.08994 0.264584,0.447124 0.264584,0.79375 0,0.346626 0.119062,0.703813 0.264583,0.79375 0.145521,0.08994 0.264584,0.447125 0.264584,0.79375 0,0.346626 0.119062,0.703813 0.264583,0.79375 0.145521,0.08994 0.264583,0.447125 0.264583,0.79375 0,0.346626 0.105147,0.695213 0.233661,0.774639 0.128513,0.07943 0.312652,0.776639 0.409197,1.549363 0.173909,1.391916 0.02364,2.306207 -0.379044,2.306207 -0.114806,0 -1.024802,-1.135007 -2.022213,-2.522237 z m 19.485483,1.915147 c 0,-0.04286 0.623524,-0.548874 1.385607,-1.12448 0.762084,-0.575605 1.621003,-1.225149 1.908709,-1.44343 1.013079,-0.76862 2.403033,-2.261938 3.203739,-3.441985 0.653265,-0.962756 1.240549,-1.402929 3.042708,-2.280527 3.313043,-1.613355 3.552263,-1.685822 5.564923,-1.685822 h 1.85163 l -0.17697,0.992188 c -0.20912,1.172418 -0.75447,1.819716 -2.88582,3.42529 -2.02744,1.527293 -3.376287,2.199547 -6.486192,3.232668 -1.382448,0.459254 -2.720286,0.949911 -2.972972,1.090348 -0.252687,0.140437 -0.679328,0.25534 -0.948091,0.25534 -0.268763,0 -0.570257,0.0816 -0.669988,0.181329 -0.385585,0.385584 -2.817283,1.0753 -2.817283,0.799081 z M 75.490059,60.958066 c -0.162076,-0.19529 -0.225775,-0.423983 -0.141552,-0.508205 0.224858,-0.224858 0.967513,-3.227266 1.341404,-5.423028 0.08076,-0.474292 0.252747,-0.927803 0.382189,-1.007803 0.129443,-0.08 0.23535,-0.353415 0.23535,-0.607591 0,-0.467423 1.370791,-4.026508 2.538957,-6.592079 0.349824,-0.768297 0.636044,-1.457473 0.636044,-1.531503 0,-0.415049 3.445554,-5.219942 4.588071,-6.398156 1.309929,-1.350856 1.387842,-1.389062 2.832661,-1.389062 1.30734,0 1.527481,0.0781 1.833885,0.650621 0.41114,0.768223 0.463343,4.022217 0.08162,5.087626 -0.146621,0.409224 -0.420439,1.220294 -0.608485,1.802378 -0.385111,1.192086 -4.362823,7.228184 -6.120365,9.28753 -1.790814,2.098331 -2.285651,2.733367 -3.844572,4.933824 -1.375899,1.942118 -1.505771,2.050521 -2.456609,2.050521 -0.552152,0 -1.13652,-0.159783 -1.298598,-0.355073 z M 58.376512,60.56372 c -0.401488,-0.35181 -2.951267,-0.838081 -4.394506,-0.838081 -1.078348,0 -1.800253,-0.248959 -3.88242,-1.338909 -1.406769,-0.7364 -3.015232,-1.778197 -3.574361,-2.315104 -1.19258,-1.145181 -2.412233,-2.854507 -2.61501,-3.664898 -0.142081,-0.567822 -0.12046,-0.570957 2.934862,-0.425524 3.50318,0.16675 4.185286,0.347068 4.506273,1.191253 0.326872,0.859661 4.9173,5.39867 6.568755,6.495174 0.767623,0.509673 1.395678,0.969352 1.395678,1.02151 0,0.184193 -0.691277,0.09189 -0.939271,-0.125421 z M 73.265486,58.931889 C 71.653535,53.863224 70.293282,49.746359 70.16204,49.539181 70.06986,49.39366 69.840035,48.738816 69.651325,48.083972 69.462616,47.429128 69.203044,46.548158 69.0745,46.126261 c -0.752558,-2.469988 0.281314,-8.313744 1.787185,-10.101705 1.058551,-1.256846 1.495288,-1.116328 2.450955,0.788582 1.023135,2.039395 1.500874,4.667011 1.872028,10.29637 0.275552,4.179345 0.152801,5.640794 -0.750297,8.932891 -0.754266,2.749553 -1.011311,3.38497 -1.168885,2.88949 z\"\n         id=\"path2\" />\u003C/g>\u003C/g>\u003C/svg>\n","title":"$:/images/dahlia.svg","type":"image/svg+xml","modified":"20240530115008297"},
2898{"created":"20240105105622737","text":"iVBORw0KGgoAAAANSUhEUgAAAI0AAACjCAIAAAA4mgq0AAAgAElEQVR4nO2daVhTR9vH369prdalWmuX92kUFREXxNa6V0u1LrUBhACyyCaCAiICIiAYRUFREEFRQAQ1ICCoIKKI7LsihEVAFlEWW
2898UJYQtgy74dbzhtDziFAENPn/K/54IVzZubM75zJnHvuued/EClp0P9MdANIiSWSk3SI5CQdIjlJhz53TnHP8kLvpfiFxLlfjjzmFnzg2GVt83M79U5sUrNfvct6xVYLud9N5642/FFRd+YSzS/nqXw5T2XmEs2fVurJrDVe8seBldsPrVe23aLpqGZyxtjG2+bU9dPedy4HxzKjk+Oe5U30zY1AnzUndlsHhUobv8Rp75roWxRXJCfpEMlJOkRykg591pzaO7k79U5om3sccLjidPbmuSt3/W/Hh8ekJaS+TM8teV5YUVz2pvJNQ11jSyu7o4vLg6vaOJ0N79nVtY0lFbX5RZWZz0ufphXcfZgRGPrYwy/q+LmbBx2vaJt77NQ7gV3y+euz5kQKE8lJOkRykg5JPacuLq+hiV1eVfec9Topk/Wc9bq8qq6hiS1Fvz3i6PPlVFvX9CyjMID52Nnj1uET/sY23hqm7jt0XTao2ClstZBZazR72Z5JMioE07lJMiqzl+2RWWuksNVig4rdDl0XDVN3Yxvvwyf8nT1uBTAfP8sorK1rmugbFUufBaeqNw1PUvL9QuJsTgaqGrsu32I+ZaHauM7IBdOUhWrLt5irGrvanAz0C4l7kpJf9aZhortEWBPAKb+o0p8Zb+VybZc+Q36z2ZfziN6JiUpfzlOR32y2S59h5XItMPRJcdmbT99RgvoUnF69fnvr7jMrF/+NqnYzFmtMOIPRpVlLtHboujA8mTEJOVW1jZ+g3wQ1Lpxq3r6PfpTJ8GSqmZxZtHH/ePTaF3OVp8vR5yjozF1tuHiTqeI2y3U0mz81HNbRbBS3WS7eZDp3teEcBZ3pcvQv5iqPRwOWbzHfZ3vJK+Dek5T8usbW8ehGQUmY00GHK2N/aX5U1N2gYqdv5XnSK5QZnZyaXZRbUF70qqaypr6usZXN6ezm9Y6oVd28Xjans66xtbKmvuhVTW5BeWp2ETM6+aRXqL6V5wYVux8Vdcf4qv2hfszc0U+ynSkoCXMa6R3+vEp/s/oxYxvvMz7h4TFpz1mvJ8rmxmnves56HR6TdsYn3NjGe7P6sZ9X6Y/0dsaveZ+ak/xms322l0IiEgtLqj//T5wuLq+wpPpWVJKFk9+qnYf/zZxmL9uzWd3e8vjV8Ji0hvdsyVb3idXc2p6Q+tLdN0LFyFXkUDl+VY8LJ/nNZnRTN5gatY3/ONbb18/wZAqmvv7+8a60o7M7Nbv40vUHRkcurtx+SMo4XQmJS80u7unpk0hpPkExBoe9/trjtOQPs5nyms8yCkVm6+LyhJ5rbnePyJyJ6QUz5TWXKh3Ypn3c0NrL90asRNrZ29uXk1927dYjiZQmUhNpj3hdUx96LyU9twQvw4q/LAV7f+ycnqYVCGZT3GaJV3VqdnHY/ZRP/52EpwngFP0o8x+Dk9+v+DC+u/tG4uWcQE5nfMIhzw+KujTDU/cfZ430NiWrCeBkYucj2FmfJ6fTl8IFc5oduzzS25SsJM8pv6jy1MWw7TrOs5ZqiZx5/2s4dXJ5K7ZaHHK+FvUok83pxCtKIpIkp57evgXr9w3bX/8mToJ51qvYjtRQIr4kyYnb3SPUX//690moXpITyUlyIjmRnEhOkhPJieREcpKcSE4kJ5KT5ERyIjmRnCQnkhPJieQkOZGcSE4kJ8mJ5ERyIjlJTiQnkhPJSXIiOZGcSE6SE8mJ5ERykpxITiQnkpPkRHIiOZGcJCeSE8mJ5CQ5kZxITiQnyYnkRHIiOUlOJCfp4NTT27eOZkP9zQALX/jfs59w0cb9O/VOSAcnTHw+/11DS9aLVwMD/KH/+6/hxOP1xiTklFa8/QRhRSZgv/ur1++Y0cnnrtw95HxNfb8bMzoZL+cEcrodlUQ3dbNy8ffwiwq9l/Lq9buR3qZk9VnEHcWTT1CM0ZGLO3SclegOSnSHl8WVIrOJzym/qBKK2qHrYmzjLal4LJ9AnzUnMTUwwE/KZAkmkeOtVOvfwOm/QSQn6RDJSTpEcpIOkZykQyQn6RDJSTpEcpIOjYZTUwuntOJtRl5pXkFF5ZuGcYo4XtfYwiqtTskuSspkpWYX17x9L/Hy4VS8iup6TgdXsoUjhFrY7WWV77JevIJP76JXNWOx0orLqbmVExj6+O+9jCkLdgsZaShU2vcrdE1sLz16ltfbNyaLZHVt49nLkat3WQ+tgkKlzZTXpJu6jToEKKeDeyP8qdGRi0JmQ0izl2tv0XS0cw3Cs06Jo04u73ZUkoap+3Q5ushbWEuzOXfl7iie7OE5FZfX6lqe/0pGVWTFQunHlXpuvhGjaEdC6ssdui7iVEGh0pZvMb/zIFX8wptbOQaHvcQsnEKlraPZxCWO7LTqusYWa0bAtEXq4pT/zWINB/fgtpGEwCTixGnvopu6iX97gu24Ef5UzBZU1zauo9mMopbVu6zzi4Z/9qMfZX67bM8oytc0O9vCbhfnFo65BY+i/NnLtcU3BONyyi+qlFlrNIrqsXT4hH9//wBx9Y+e5c1aqjXqKmbKaxYUVxGU7+A+mh7E0qqdhzsJD5doeM/eqGo3liqczt4k7iKQaE4V1fV4I+yIkrPHLYK603NLxn7oz3cK2qzSapHl37z7bOy38I/BSbz2d/N65X6XwKlJBCulRJx6+/qX/2k+9uopVNpXMqp4K2wt7PafftkrkVqovxl0dHULlc9u65gprymR8vF+C/fZekukfAqV9vBp7og52ZwMHLbcqbJqa/45Is4ZXH/tcRJZsbLhKeIL/1A/hp2X8fdeBnHmY27BQuX7hcQRNN7y+NXcl+Xvm9sgc1Ima7uOM17+ZUoHh7b/XnwWcZN++mWv7anr0P5DzteIh3fqbwYj41RRXU9Q3BwFnQBmvNCnTHpuyR/qxwiuevNO+EzNrBevCPK7+UY0tXCELqmqbVQ1Po13ybfL9git4eI1adYSrcIS0ePkuSt38cpvZXcIZV6mdBAv858aIpaeu3m9FwPuE9x16L0UfExDOGmYuhM8IO8aWkSWMjDAJ3gePfyihPLv1DuBl/l6WAJBcw2tvfAuvPswQzDnz6sMRGYj/t1e+HH8dSwlphcIZouITcNrxh/qxwjKF3LQEEwEP4RIiFMLu50AeE5+GUFBza2cqbKiD1PdoeMsmLO8qg6vCr1DFwiqQAh1cnmzlogeQPbZegvmxPuUIT5VRsgXCktJmSzBbL/vPioy20x5zfrhzircf9QX7/YJrvqI092HGXhFHD0dRFw9QkjX8rzIa3/721owm3fgA5HZpi1Sb24VHu6GSsXIVeTlv2y3Esw2b43oj4pfd1gRdCXe1CDrxSssD7utA6+XxPkeuv8Y94eNwBTyEaeDjlfwihj2MUH4ABas3yeYDW/Q0zQ7O2wVCKFDztdEXv79Cl3BbFs0HfHuZaqs2iHna6M+Ejc8BnfQa+8c3k74srgS7/LYhBy8qz7itOafIyKvJx5zMd2KShJ5+bw1RoLZ8AYuJbqD0LFoItN6ZVu811GwluthCXjdgSWFrRaG1l5nfMLvP84S50EEHT7hL7K0WUu0xGk/wcsQHpMmFie8X1H7MzfEuQFmdLLIy7dpH8fy9PT2Ddt9o0tzFHSE2jPSo3sVt1nqWp4/4xOeV1BBcJs6Fh7jdAsxYr5PeHawiwH3xeHkFXBP5OWWx69ied41tIzTTQ51bk3LKZ4xWqvKoo37g+6InnkSzGzHmF6wXovFCe96MU/eS0h9KfJNz8grxfKUVrwdp5vUsfAY2qSC4qqxHIi9RdNx6Hi4QWVMBj2CRHBQ7UecsLPohNLQD6BRq7GJPU43idfILi7P6ezNUdP6QVFXaBo2rHFkdEmk1QPTR5zwvrHF/H0SU3gNVTY8Jc7vMF4qqxzGVT8lu4hu6jZ/nfFIe3DuakN22//bI/CWsuatMRpL+wkmEUiI02Z1e5Et2KLpOBYwQpq9XFtkLeJ8oklEHV3d0Y8y7VyDdukzFm8yFQcVwzMUuxzP/vntsj3j1+aPOFkevyqyBVNl1SToBIFneVu9y3r4i8dBHV3dQXcS8J5RSMu3mGP5b4Q/xctW9KpmnBr5EaeYhBy8FngHPhi2LII5wp8aDlg2oS1ggqm8qk4id5WWUwz7Z4QSwV4rhFB6bgnBqIj5utQ14k5ZHdyFzfaS0kecOrk8PD+IWUu0hv0S3HvoAt4NeAXcw7Ll5JfhZdusbj9si509buFdfun6h4fpWUahyAyHnK8RF56YXoBXuODCMcH6HPH6MiJ8mlduP4R3lbC9HM9GB+8+tmAzVJeDYwnGjdq6j5Y2CO7T0NqL4CYzn5cS1IK5M7BKq0Vm+M8qfeJ19ITUl3iFv61vxrJ5+EXhZZNZa0QwKnRxeWvxnUEIvlOFOZVU1BJ0xI8r9YY6qDS1cIhXNq0ZAUKX4FkuIK3aeVjkQB8Rm0bgDaBv5SmYGe+bXdnwFN5nSnsnl+DbSDBnJ5eHNxuiUGnfLNa4EvJwaPmlFW9/3WGFd9VMec2hq1yYRKznDmsX+Waxxi59hv2ZGxZOV1WMXPHsdZB+UNQVnNRiWqp0gLgW2Q0mqsanj7kFm9j5bNdxHtayUP3xWewEA8PPqwx8gmKw/LV1TanZxQzPUIK5H93UTaj92MHiBP3+p4bDAYcrR08HqZmckd1gQpz/pFcYHiTRnFrZHWP0NBJMT9MKhlaBECosqRbT202cNHROT/ArOIoUn/R86C0Qr2KPKM1fZ0w8IIv2N2KVSqYTXc7fJqg7Kg53uWtEabuOs0gHNIJXakRJ2fCUyPZL6oGetUSrpKKWoKNwOSGEMp+XjsWzjkKl2bkO/90aHJE4xpvcpn18qLMRiNNB9HsjZlLYaiFy3AZV1TaK+aWMl75dtkfQ/jliTgih0oq31N9EexkM+4D4344ftm7Q45T8UVu1rVz8iQvndvdom49+GcLQ2gsvxAGmFnY7wRRu2IdA6GcVT8P4l7d3ci9ci/7fX0fgaGfhdJVg3iJS9Y2tdq5BI3K3U9xmSeyvIagnKfnym81G1IPz1xk/SckXs/y+/v6QyMQROT1+s1jDwy9K/EAu4u7XuP84y/L4VYJp5c+rDAytvarEezpEit3WAfsplvyB26eLNu63ORkozkAxVE9S8tVMzvy4Uo+g++Q3m5nY+TwWm5CQnmUUOrgHb1LDNUHNkKOrmZxhRiePdCfPiPc/cbt7XrBeR8SmuftGXrr+IOx+SnIWa0RbD8QRp4ObnV/GjE4+fSkczMnegQ8kFbymld2RlMm68yDV90asq/edy8GxkQ/Ts/PLiGdcI9Wr1+/iEvMuXIuG9p+6GJaQ+nLUpZH7CaVDJCfpEMlJOkRykg6RnKRDJCfpEMlJOkRykg6RnKRDIjhx2rsYnqFaB84q0R1UjFwJNhFIUFdvxs1aqvXgSXZpRa3eoQt4G6EYnqFKdIfi8mFWAT6Z/jE4OXe1IZ7BXoIS5pRfVPmDoi6FSpu1RGu9si24tdicDOTzxzfiKvimewXcK62opeAs+dQ3tn4lo2pzMnBcWzIiweaRoRtbJa6POPX3Dyhus6RQaVYu/hAK911DC2ziINhKICmVVNQODPCJOSVlsoaNSfEpxevpfV1T/wkq+ogT7OFeuf2Q4NsDjgDHz91ECPX29Tu6h8isNZqyYPfK7YeCIxIhzxZNRx0Lj7OXIyHUADzyvJ7eI4zAX7ZbTZejb1S1uxf/IS7RC9brLZqO3y7bM1VWbbO6PexqDolMVKI7xCc9x+MUwIz/dYfV5Pmq3yloGxz2Ar/PgQG+h1/Uoo37J89XXap04GLAfWh5eyfX7NjleWuMpsqq/bLdCtz22ju5SnSHg45Xjp4O+k5B+4u5ym6+EVD407SCdTSb6XL0/6zS1zb3aGxiI4T8QuKU6A7BEYkrtx+asmD3BhU7TnvXDl2X6XL0TWr2sG60z9Zbie7A6+lFCN2KSlqmdHCqrNo27ePM6GQlukNIZGJ2fpkS3QHzftxz8BzmXBwY+lhxm+WUBbshOhTx4PkRJ9jwLeTklp5bwvBkPnqWhxA64HCFQqUtUzp40PHKdwraFCotMOwJQmiSjMqUBbvnrzM2tfcFlyCIKEWh0pZvMXc6exO8OPKLKiuq679eqPb9Cl0rF39Te18KlfafVfp9/f0nvcIoVFrQnQSRnDz978GqmoN7MGwUNDpyEQ26bM5fZ2zhdBU2Tt+OSuLz+eC58Mt2KxM7n28Wa1CotDsPUts4nRQqbfJ8VVi8mCSjMnm+ahunE3zNpsqqGdt4wzi2TOkgr6fX9tR1WIkwtPaCdWH5zWab1OzBTdHYxhshpLDVgkKldXJ5Qo5/Xy9Uo1Bppy6GPXyaC2tycCOwTo8QuhLyEF4JR/cQJboDhUoztfcVlxO4MA6NxQCCrRY/rtSDoGDpu
2898SWUwb23k2RUJsmogHefhdNVCpUWm5ADXtCb1OzjEvOSs1gMT2ZhSbWjewiFSjvjEw5lQhOTs1jEnGDshX0TEFV+qqxaX3//lAW7py1Sh3crLaeYQqWp73cD572lSgfg3YJB4q89TsBpprwm+IVpHThLodKy88v0Dl2gUGkhkYlQF0QrS8pkAScYSOIS8yiDWyp6evu+mKu85A8zhNDyLebAafe+0xQqzcT20vvmtvTcEtgdTMAJLiyteIsQ4nRwKVTadDm6uJwCQx9TPt7+hxB6W9/M8GS6et+BoA87dF3g7wMDfMrgrtgv5yljmzuBROi9lOKyN4KLchtU7FrY7SI3OxSWVBNzErksWfP2PYVKW/GXJfYYMTyZkQ/TYxNyKALufE0tHHgVYP/zqp2H4e+w7zwh9SVsXocuQwhZMwIAG3CCcAep2cUUgS1WUxbshsgcGCf4B+aOAo6YJ73CHj3LE+L05TxlJMq9UGgXMxGnqtpGcDMSjMNlduwyhUr7Q/1YdW0jdBBMMV6wXmO3/cVcZdkNJoKcmNHJrNLqp2kFj5Nf3I5K+u1vawqVxvAMhVcWG6+Ly94kZbLeN7eJ8z5h64TJWaykTFZHZzeFSpu2SB1WKWvrmhiezMvBsbkvyykC24kep+RTqLT1yrYQdWEdzQb+DiEIElJfqu93gwbD32HMjE3IgX0ZD55kI4RSsosoVJrB4Q++upPnq/68ygANOvZ2cnkQlC4560P4AtjsfdIrDMZDcPLt4vKmLNj9xVxlNHh0CLb8DXdEMEUSnpeHRCZSqLRvl+1x9rjl4B4M/UsZ3OILK8oapu7hMWmwOn7hWjQeJxj3TnqFJWWy1EzOUKg0Z49bhSXVFCpt7mrDAGZ8cETitEXq1N8M2ju5xJyOn7sJz8qDJ9nQffBoQ4SWrVpOzOhkcNwMDH3c3z+wcvshCpW2z9abGZ08d7UhhUpzOX8bjxMMTT+u1Lt59xkM2tPl6K3sDnE4wY6xTi4vMOwJPBw3wp8ecLgyeb4qjHvwNn+/Qjc8Jg3gTZJRQYOzsz81HGIScuDvQv68w3BCCOUVVPy++ygWyes7Be2bd5/Bf72tbxYMcWFiewmmOiI51dY1wacYpGVKByEajv/teCwiyK87rFKyixBCxJw6uTy9wU0Gk2RUlA1PQVGc9i6tA2expv72tzX8JpVX1Qm6cvxjcLKjqxuPE0LowrVobAPEdwraMI8dEae+/n6shTPk6ND1py6GIYTOXbkLhdNN3eat+TDucbt7sJ+ASTIq6vvdCLzPRHMCtXE6k7NYIg83qqptzHxeKo5PBLe7B6KjpmYXC55NwuvpLSiuEulcyG7rhDT0vzgd3Iy80qF7ERres5OzWOVVdYJN5fP55VV1OfllYnqMdHR1Q6zYsZyhUtfYkp1f1sXlwR4p4IQQqm9sLat8N9RWwG7ryHxeOjSY01CR9r1xUdCdBMpwLuMjEslpXBSf9By+cyVVoNRz6ub1Lt5kul7ZFi9D1otX65Vt9xL+Sn/++jdwmr/OeKOqHZ6lGD77xOQEtgmRoSgmVhPPic/nF5e9Ka+qE9MkX1vXJHI2gel9c1taTjE2fSDg1MruyHxeWlxei80dSE6i5RMUg+0Kkft9PzgkDwzwT18Kl99s9vVCNfnNZqcuhsFErpXdIRizhm7qBhYgCpU2f50xQqi5lfPXHif438nzVW9HJSEcTh1d3WA3grSOZsPp4Jo7+gkaCMCC95loIjn19vV/vVBtyoLd18MS7j7MmCSjorDVAiFk5xpEodJk1hpZOF2FDSOwRQd6VnaDiYXT1f+s0qcMxmDBOB09HUQZDCw7a4nWJBmVwpJqkZzAaLTP1vtJSj58j1szAuIS80xsL1GoNIWtFgxP5qgPHhgPfcTJ1fvOuKb03BLB6vr6+79ZrDF5vqqzx63yqrpL1x94+EUNDPCnyqpNWbAbNkW/a2j5cp7yTHnN9k4uhUqbKa8J9n+wx2gdOIsEOFVU1ydlsnJflucXVdqfuUGh0i4Hx4rkBPjvxWclZbLAHvHTL3vR4MunbS563Ou8eWNck7icxIm0PJYkxAkhFBGbBhZM+Cz3C4kDqzxYo0EQ0wHMiVgskHcNLQxPJqxpYZyu3XoEqy1YwszHQpyGtm35n+bDcmo20W/4c8M4pcYdSuJyunbr0bgmIU7stg6GJzMqLuN1Tf2zjELo4oYmNoVK+3qhGthRGt6zv5JRnbVUC4z/s5ZowcaxmrfvGZ5Mv5A4QU7fLNaYo6DzrqGF292jaXaWgBMYdiEiBp//4VhXhFB2fhkFP7ImN+beuCZxOX1i9fb1z1HQmSFHP+MTHvkwfdZSrely9G7ehwU6CG8JR28cdLyCEAKb9FYtp2NuwbDwCIY4jNPPqwy+XqgWEpl4+IQ/LFficQIj5DqajdPZm7DuB8t0EIRj1hItKxf/T+BqIL4meL4Xm5CDrVHNW2MEW/j4fP7FgPswD5yjoGPNCIB3q43TuefgOWzlBvu2xThdDo6FhdRFG/dDiArgNEdBR4hTeycXC7/wlYyqjoUHFtoVm/WJv3X1E2jiv58GBvglFbXF5bVC3089vX3PCytEWkVZpdUV1fUiV2vqGltyX5aL+SnWyu7IyCsdaqh+XVP/abxTxNfEcyIljiaAU11jC965AqTw9Kk59fT2TZVVmyqrBguM/w3KyCv9foWuAWF8rWE1Ae8TzfDU0HBBUqpTF8Mow50JkpFXSqHSJoATr6e3sKT60vUHqdnF8JfKNw1JmaymFg6nvSs9twRCtRaWVCdlsrBAmEWvapIyWey2jrScYviQAieWTi6vqrZR8Ayc/v6B0oq3zwsrsMBenA5uUiartOItTC4yn5fCTKG4vDYpk9XR1f2+uS0lu0gwetzAAP91TX3QnYSI2DQwD7ZxOpMyWWWV73g9vXkFFeAo2d8/wCqtFnI8hoXjS9cfYCvOL4srkzJZPb19b+ubk7NY4IiZk18GgdLsz9wAbxzIDIZgbAI5MZwCmPGC4VPAcwgO6DO19/1ynjKFSvtirnJ6bgm4FvkExcCFP68ymCSjAsdnzV6ujRACRx/MrcDEzgch9DStAAsr8pWMKnj6wa3+Y3ASizfp6B6CEIKPWSxc6rRF6pVvGqAHBeNzqRi5DgzwwdSkYuSKHWXj7huJxXpw9b6DEBoY4Fu5/H+4/+lydHgWISopFsp/9nLt5laOUMQcZnTy++Y2zBD8lYwqHCc3AZySs1gUKk1xm2X0o8yw+ynTFqlPlVVjt3UAp59+2et/Ox58ZnUtzxe9qqEM+vsVFFdRqLS/9zIQQhgnOKRyHc3G/3Y8hUr7QVG3rrFlhhx92iJ1hmdoYOhjcBW6+zADOy/K/swN/9vxXy9U+2axxsAAf8/BcxQqbfEm05DIRHBpcjl/m9Pe9eNKvWmL1P1vxyemF4BfVGxCTlImC54hl/O3A5jxGMK4xLw5CjpTZdW6eb1uvhEUKm33vtPxSc/dfSMpVNqvO6zQoD8ouECDQ65fSJxPUAz8W8XIleHJZJVWg+HN8vjVZxmFcCReYnrBBHACg/ROvRMQuwIeqLjEPOAEPmLvm9soVNoGFTuEkNzv+6cs2N3F5bl636EM+pwKvU/wbfv1QrUF6/fBiYL7j37w4AUvg/1HfYETFmQWjBTNrRzgFP0oEw2afPYeugAOe/KbzQTPYrNmBMD7hHmRwkHAMCzv0mdQqLSSilrwTza194VrwZuR094FnLLzy9Cggy1EkhP6fSqvqnuWUZj7sjwpkwX+TN6BDyaAE3iEL//TXDA47uuaeuAU+TAdIQSGbQh1CngePMle88+RyfNVYcgW4lT0qgZcWcPup4AfOQxBaNAbS9nwFCzfYSFJwRXybX0zrHTAcQdwDoz6fjc4ROs/q/QFGxkekwZBY7GHYIYc/QfFD0fcgB8gq7Qa/CY3qNhhF+7UO4HV2PCejRASdHEV4uQXEicU59LNN2ICOF24Fk0RiCocHJHI8GRWVH/EidPehXGCU/RgRFLf/2GOh3ECn2zB0zrhUV1Ls4FpwhFGIPQI+LJjnODXorauCX6fgFN+USUMWTDGYpb11OxihifzcUo+vE+Yu/0MOTp2FBFwKiiugibBqY4DA3w33wiGZ2g3rxd+xsBuC77m5o5+aNBdEixMAwP8GXL0OQo69Y2tXVwejOruvpETwKm5lQP2TcVtlvpWnhQqbc0/R/r7B/A4IYQwf0cs3j0BJ8yVVXGbJebQmfXi1Yg4oUG/3bmrDfWtPGcv154qq1Zb1yQOJ3jnJs9X3aLpuFXLiTK4ewWPExyltGD9vt93H80rqIAZiomdj4ap+4L1+ybsfU
2898IIFZRUbdN2nqOg/dMve60ZAbV1zQgh/9vxSnQH8K7u4vKU6A4mtpcg/43wp0p0h61aTtgp9Lv0GeDu6nL+thGljfwAAADSSURBVBLdQSjEWFMLR9fy/A+KurOX7dmkZn8rKgkhVFz2RonugJ0za+Xir0R3aGrhwDZQiG9cUV2vRHeACJot7HYDay+ZtcbTFqlrmrnDaWj5RZVKdAdP/w/LBzv1TgBUhNDxczeV6A4wV7z/OGv1LusZizWWKh1w842A4FRQI8SrE9zSxOfzj56+MXOJ5lRZ9dKK2qA7CfPXGX8jr7H/qE9+UeUWTUdmdHJGXul6ZVvp+84lNQqRnKRDJCfpEMlJOkRykg6RnKRDJCfpEMlJOvR/wxrJmBK9N1EAAAAASUVORK5CYII=","title":"$:/img/cese.png","type":"image/png","modified":"20240919202925814"},
2899{"created":"20240911064706493","text":"AAABAAEAAAAAAAEAIAASJQAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAEAAAABAAgGAAAAXHKoZgAAAAFvck5UAc+id5oAACTMSURBVHja7Z0JmBTVuYaLHWQXcEWNXmPMJWbzRhMTvSRuMN09MyzDJsg2igiKAuKKoFHccENFJWrAXUHcUYhERUVFFBADimzDMNNV1bMyPft0//c/1dUIXgdmqrrqVBff9zzfUzFPgk31+d8+9dd3zlEUyI56s/PZ5JJn4zM0+hkgCAAAACAIAAAAIAgAAAAgCAAAACAIAAAAIAgAAAAgCAAAACAIAAAAIOiQAkC5+b+3YpU91aOfAYJ8D4BbU/AZ5rKPYB9j0Z09+hkgyPMAeJ890/wlb65F8fcFAAAAKH0BMNMDnwGPABAkqfhme+AzoAkIQQAAAABBAAAAAEEAAAAAQQAAAABBAAAAAEEAAAAAQQAAAABBqSm+WQ59BtUDAFABAAgAOLDvZR9p/v+suMtPfAbx301VrMWLZ5mfqdxm8XnhM0CQ5wHgxQhsD/YuycXnhc8AQWn5/I0ZAAQdwgBADwCCDnEA4DNAEAAAAEAQAAAAQBAAAABAEAAAAEAQAAAAQBAAAABAUEoB4Ob778a2BS/wAAAKAADoUJOdBFxz3di24Eez15gFmO+wG4sje+EzQNAhqVZmAfZ2yV08+hkgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgV5WpK0p2RFGCmqIEYNhHFmNajG0xxqFGlMU3aEAR3zC9jZKht4dh3zjIY3ogj+8sAKBxBVVFCYVb8XUC+2X2CzDsA79sjOlApJUxE4AaUaBAUc54S4DgQTbBsI/8oDKoJPEjBzXWA9jKN0gXN2kmBgzsM880egED8lDnjT8C7EwQMqhOYscwaGCfOGaOaf6RK0SdH7QPEFRHsGswcGCfuJo9HNP/pgOgH3sPBg7sE5crIfVCAKDpADiDXYSBA/vEYiz/AQBoOgBOZhdi4MA+MY/l8MkAQNMBcDR7CwYO7BNvMcc06ruJAOjB/gwDB/aJeSyHewAATQoD8U0KhDvzzVqGgQP7xMuUkNqZjfo+qEJGHLgd37RnMXBgn/hZJaC3M4JAUBNmABfqLfimPYSBA/vE85TBpS2UEABwcF1QnEhLBdVbMHBgn3g2P9byuI6gvg+qfkXJRuAUDBzYB46bYxl7ATTzTcAodi0GkIMOaaQMKyFlRCl8IA/ne5SlWb3PteZYRl03EwBBdgUK1UGLQT2+gpRLo6RcAv+kxb0R9yhbt3qfxRgOAADNB8BZ7GIUqsMAGFeBIj+Yx+4hJdPyDECM4T8BAM0HwKnsMAoVAJDu0bYAEFYC4V8AAM3OAqjH8E3bhkIFAKT74vJEv8TafRZj+BgAoNkzgHBPvq5FoQIA0j2yjAFg+T5/oQS1ntgLsFkACAt34Zu3AoUKAEi3eBNg/T4vVwJaFwCgWY8AmnAHvnkvolABAOkWrwGt32cew2JbcACgGTMAcZhCkdge/FEUKgAg3UOL7dzn+Up/vSXWATRHFxYrSnaB6AXcjkIFAKQ6l51TZOc+36ZkhHEgSLM08Ynkq8BpKFQAQC4A+P4Miti5z1ONsXzOStR1k9WXkgAYy65DsQIA0ixSgAMtA0CM3THGWM4h1LWFMFA2O4piBQCkAsB6DJjHbjgTGQDrADiHXYJiBQCkedweOwuBeOyGzwYArIeBfsVXDcUKAEjzmHI7MWCV3QcAsA6A4/i6E8UKAKRpDHgHuzcAYD0N2Itv3noUKwCQpjHgdexeAIDVMFBQ68Y3798oVgBAmi+yFQNeye4KAFiOA+uH8c1bgmIFANI0BryYZw8dsB241RlASG/NN3EBihUASNMY8ONKQG2NGYDlRwBjd+C7UKwAgDQPsQWAO5UMHseZYdRzszU2kswCXCutQAI+t3i9NbYikXf3s+2sAxhsax3ADGMMh3ajnputHD0JgEvY9W4Xf4uQSp1zVOo21Kcewh6h0+FXVFD3KZW+dacrKqnFpVJiwGLM5iYAUIh6tpEGHMSudPuXvwsXyAOv6PT2ap3e/MSffmdNMX20pZ5WbWnwpT/Z2kB3vFNHHS6XEgPmMRseiOd/+2Ggv/G1TAYAXv9Yp7LSCJUU+8/F7PKyEiKKkZ/13Of11G6i1RhwhZ0YcCm7LwBgPwz0W76JutsA6DBQpafe0Y1iiUT86ZKSEorF/A2AB1fWUQvLMWBbuwFrSkj7NQBg/xHgBHa+2z2AVpkq3btEp9ISACCdNeuNWp7KW90O3NY6gF3s4wEA+2nAI/kmfiPjDcDMhQBAOiseJ7riBQbAOIsAGGUrBryRfQQAYH8G0J29ynUA9Fdp8iMaFRUBAOmqmnqikU/UWJ8B2IsBf8juBgDYigOLVyhaR76Jr8kAwEV3axRWAYB01Z5qoox51dYBMNwWAF7lWWRHNurYHgDUNnwzn3IdABkqZdysUd7uiG9nAX4HQFE0Tn+8wwYAhtlaB/CkEgy3wQzALgDOF28C1LkyAHDWNI225gEA6apwWZxOuanKehrQXgz4HmVQuaJkIARkIw5cqhhbKgfVG2U0AX95mUabtwEA6aqtepyOmV5pDQD2Y8DXGz9gf8A6AOsaunc9wER2zG0AHHuxSuu+jVAxAJCWWrMjRj2vtggAezHgBiWoTTDG7l8LUMcpeBMwlF3tNgB6Dlfp/S91IzUHAKSf3v2mgbpcYQMA1mPAVQyAIXj+Tx0AzmeXy4gDv7rKv2lAvwPg+c/rqf3lUnYDLmMAnAcApAwA2ul8jSAODAA0R4+8X0ctra4EHGsrBizG6u8BgNSlAU/im1mAODAA0Bz9/a06WTHg3ewTAYDUPQIcxf4WcWAAoDm6+iVpMeBN7CMBgNQB4HD2asSBAYCmqraBaPRT0mLAH5tjFvWbEgCE1E58fQtxYACgqYrWEGU+bCMFOMIWAN5QguFOxnJ2KCVx4LZ8U59GHBgAaKpKonH6y13SYsCLlFBhWyUEAKQAAHwTh+9owTf1AcSBAYCmSi2P03/fLC0GfL9CUxScB5AKDSpQjK2Vg+osxIEBgKZqR1Gces+QFgOeqQR4zGbvQv3a1sDCZCPwCnZcRhx4w3cR401AcbGPXOTvPQG/yotRr6lWAVBByiDLMWARWZ9kjNlMLARK4ZuA8EV8rXEbAGIL7cff1GnFGp2Wf+4vr/yymNZsr6fPt8dc92fsjbtjVNfgDADe29xAXa+0EQMeYDkGLCLrw/EGIPWvAvuz98g4H6BLjkqHD/OXu4vrRTr1vLKCelxd6brFnv39Hqimksq4IwB4eW09dZhkZzdgywDYw8/+FwIAqY8Dn8nXIpwQ5JOTgcZFqf+D1cauPU7osQ/rqNUEKTFgMUbPAABSD4BT+FqIM/18cjbg+KixX5/Yt88J3bGszvobAHsxYDFGTwYAUv8IcDT7exSuTwDAM4ArX6g1du51QtcssREDvpgBELIMgC3mWEXdphgAPdhrULj+mQGIPfudUH0D0fhFNmLAI22tA/iMH696AACpB0AX9rsoXH8AQJzWI07tcUKVzJUB86XFgJcpwXBnxIBTD4D27OdRuP4AgDiv75lPnWkAlFbGqe890mLAzyoBrZ0RBIJSBQCxMWh+S765D6NwfQCA3Ch1mhylt752JgSg7YnTabNtxICH2ooBz1OySlsoIQAghQAoMDcGUW9F4foDAIdfVUmrtzkDgLziOB1/rY0YcI6tGPAtxvqVjCLUbco0YVvyMeBqFK4/AHDU9Er6NuxMDPnr3TE6Qk4MWETVpxhjNRBB3aZOlNwXYDRfa1G86Q+Ak26opIJSZ94BfvBdA3WbYicGbBkAYmyOwhsA58JAIb5WoHjTHADjo/Q/t1VRpMIZACz9qoEOmxSVsR24GJsBAMA5APyZryUo3vQHwAX3V1N5lTMAeOKjempzmZQYcDH7TwCAUwAIqb/kq4riTX8ADF1QQ9XOxADo7uU2YsBjbAEgrATCvwAAnMsCHMvejuJNcwCMi9LEZ2vJqb1Irl8qLQa8jX0MAOAcAHqxv0Lxpj8AbnzVmRhwA0NlwjM2ADCy1E4MeK0SCvdECtA5AHRlv4fiTf8k4NwVzsz/q/iPzXmsRlYMeAXPHrogBOQYAMId+Poyije9ASAadE997EwMuKwqTufeZyMGPNxWDPhFJai3N0JrUIoVKGTvbsU3+TEUbxoDIDdKHSdH6bV1zqQA9Yo4/e7vVdYBYC8GPF8ZEGmpZAIADgAgX1FCxWImMAfFm94AENuBrdriDAB2l8TpxOulxYBvU4L8QxVCCjD1+urk5HqAa1C86Q2AI6ZV0sYCZ14B/KcwRkdOkxIDFp5qPKo+dg3qNeXK+Y+ZBdDG87UOewOm6Z6APDUXC3V2lTgTAvr4+wbqfpWNGPBAywAQY3KsMUb7EurVwTcBA9iVMnYH7jpEpZ7DfeSROh1xVdTYP98t9+DiFGv1nYoBv7G+wVhqLCEGHGVnIQPgPAD+l13q9i9/x0EqzV2s0YfrdHr/S3/4ow3FtD6vntbtirnqLWqM6h0KAS1cXU9t7cSAsyyHgEqUYPhsAMB5AJzG1twGQIeBKi18V6fyUpwM5GXdt6LOen9ijK3dgFUGQB+EgJwHwPHsPLcfAVplqnTfEt04IgxnA3pXN70mLQa8k90bMwDnAXAE+2sZDcCZCwEALysWJ5r4nJ0YsK3dgNeZUXXUqaMACKjd+Pq+6wDor9IV83Vj6gwAeFNidaFYZWg5BHSRrRjwSjOqjjp1LgwUFj6Mb/JSGQAYebdGYRUA8KrE/gLn3y8tBryYfRgA4OgMQACgsDXf5CdcB0CGSsFZGu0qiFBREQDgRYlXi6ffJi0GvIDHSGueoaJOHVN/XVEG7xKPAnfLAMCfp2u0NQ8A8KrEHoMn2YoB2wLAnUp/TVEy8RbAOZ1TkWwEXicDAH0mqrR5GwDgVW0Ox+ioaTYAMNjWOoAZiaTqbtSpYzqvJAmACewGt98C9B6t0vrvIr5pBPoNAJ9sbTDOG5AQA65n5yYAUIg6deFVYA67ym0A9Byh0qp1OgDgUb25QVoMWETTB6IB6B4AzmWXuQ0AsRbg9Y91KikGALyoRSIGPNHqNmUVdmLAIpr+VwDAPQD8jq27DYDDBqm0aDkA4FU98J6dGLCt3YB5LGq/AQDcA8DP2PluNwJbZ6n0wFL/pAH9BoCbX6+1/gpwtK11ALvYJwAA7gHgSPZ/ZMSBZz8DAHhR8TjR5OdtxIBH2YoBbzQj6qhPdwAQ7s7Xj2SkAac8qhmr6QAAb6mmnmjEP6TFgD9kdwcAXEsDhjvxzX5DBgBGz9VI1QAAr2lPdZz6P2gnBmwLAK/y7KEjG/XpPAA0BoDWlm/6QhlhoMxbNMoXcWAAwFMqqojTmXNsxICH2VoH8CT/MLXBDMCtOPCty8WjwH0yAHDODI227fJHGtBPACgsi9PPb6y0fibgEFsx4HuUfmUIAbmic6N8o8MCADfJAMBpkzT6djsA4DV9r8Xp6OnSYsA38NhQlNwi1KfjuqA0+SZgEjvm9luA48aotGGLP+LAfgLA59tj1ONqKTHgBp7+X2aMyWF4BHDzVeBwdrXbAOg1QqXVX0eorCRiBILS2X7aE/CdjQ3U+QobABhgOQYsIulD8PzvPgAuZJe7DYBOg1Wa84JOS1fp9MqH6eslH+j0+ifFtHJTHf1rU4MrXrMjRnXOHAhEz31eT+0vtxoDtrUbcJkS1M4DANwGQEj9A1+LZJwPICLBXXJ84GE6dZtcQV2vrHTcnSZXUvChauPwTif00L/rqOWlNrYDt54CjPBY/D0A4H4Y6L/4WoATgmyeDJQ8GszpE4HGRWnA/GqqrHUGALe8WScrBrybZwAnAgDuPwIczf4OZ/ylydmAXJy5i2qo3qFHgKtelBYD3mRG01GXrqYBg+EefNM/RSGnCQC4OGcsqXWk+GvriS5+SloM+GP24QCA22nAoNaZb/rbKOQ0AQA/Btz5Tp0jAKioIaO/YBkAI2wB4E0jmo7NQN0GgN6Ob/6zKOT0AEDrCVFasMoZABRH43TWndWyYsCLlGBhWxwJ5qYCDIALSlrwzZ+HQk4DAPCv/2GTorT4y3pHABAuj9OpN1fJigHfrxw3j8dkAerSNWXrijHlCqqzUcjpAQDxKnDlZmc6gNsjcTr2Gmkx4JlKiMdjvx2oS9cU0pJvAq5kx1HM3gdAr6mVxtHgTmhtXox6Wo0B5/Lff5DlGHDMjKQrSv881KWEV4Ej2TW+ywL4EAC9Z1TSziJnMgAiZdjlSikxYBFFH4E3APIAEGBXyEgDdhysUrehqbdI6LUM+Q8AfWZVkVruDABe+qKeOlxuZzdgywDYw+4HAMgDwJ/YxW4DoP2AxFHhb3+q05ufpM5vrdaNXYePHuXSTMAtAIyP0tl3V1NJpTMAePSDOmo1QUoMWETRzwAA5MWBf8HXsNsAaJut0mNv6lRemtrVeWKz0e93Rug3kzVj7wE/ASDrkWqK1jiTArx9mbQYcCH7ZABA3gzgGPZW1x8B2Lc/n/rdgcUmI9t3Reh/r/UfAMYurHFsJeD0xTZiwBczAEKWAbDFjKSjHiWlAXvyzf9Cxuag1/xDS/kBIWKfwfzCCGXd6jMAcHFOe9mZGLCAyriFNmLAI22tA/iM3QMAkAeALnzzl8sAwCUPaKTrqd+lR9MiNOZezfh3+GkGcNvbzqQAo8yV7EekxYCX8WNoZ6QAZWUBQlp7/hJekLE34ODbNSoIp353YDGruPoxfwFANOjmf+AMAERj8Zx7pMWAn+XZQztsBy4rDtxfb8lfwnwZADjvBo125Kd+c1DRV7jlGd1XbwHEK7oXv3AmBqztidOvZtuIAQ+1FQOep2TtaWEkASGXlcU3PcPYHfg2GQA4fYpKW3Y4AACeATy4VKc2WT4BABemCOms2ORMB3BncZyOm2EjBpxjKwZ8i7FDdQZ2A3Zf56xMvgmYKiMF+F+5Kn2zNfW7A4tHgKeX68a2Y47PAlwCgIjprt3pTAx4fX7MiBlLiAELTzHGYCCCenRdOZQEwBh2ndsAOGqkSmv+ozsCgDc+0anrEP8A4JhrKmlbxJkQ0L+/baButmLAlgFQyx6FNwDyw0CZfI26DYDDh6m0Yo2e8oNCBVA+Wq8b24/7BQCnzqwyluw6oSVf1htLjS0DINtyDLjCjKKjDiUD4Gy+lrgNgM45Kr38vp7yLIAAwIbvInTcaJ8AYHzU2KxDbNrhhP6xqt7YbERCDLjYjKKjDiWnAfuwVbf7AO0GqPT4W6kHgGgqbt4eoT4TVefDQC4BQGzXVeFQDPiud+usvwEYYysGHFZC6qkAgGwABLTefN3hNgDEir27XnImDrwtL0J/uUbzDQDEhp21zrwFpGtfsRMDLrMTA97GADgWAJA/A+jFXifjVeB1TzoDgF0FEQrO9gkAuDivesmZGHB9jOiSp2ttxIBL7cSA1yqhcE+kAOUDoCt7pYw48GXzdEcO7QxrERp1jwtpQJdmAOLQDidUyVwZ/GiNrBjwCp49dDEi6ZAkhYwjwjrwl7FYxgxg2B0aFToQBxaNwCvm+wMALS6NGsd2OSFxzNjf5tqIAQ+3FQN+UQno7Y1EKiRJYmPQDLU1fxkLZADgwps02rnbmTjwrKf1xCNAhoNvA5wEgHkcWLuJUXphjTMNAH1PnH57q7QY8HwlO9JSyQQA5CmLn7/66eIx4E4ZADjzas3YwCPVABAzgE826MaSY7Hm4NiLE28dUg6EVAIgNzHdFxan9J54faVxFuA9y+toV4kzrwDz+c/92XXSYsC3KcFCnoEiBShPl25J9gFmyIgDn3KpSpu2pR4ASQgI78yP
28990KcbdVrwlk6XPaTRH6dq1GO4uW9ghs2NRO0AYJ+CF+/hj5xWaWz7NW1xLb3Iv/hbtJjxjO6kvimIGf9eSTHgacbYe+wa1KE05eQnAZDLrncbAGLvvi83p349wI/fCog/X+QNxP4DYsax/HOd7nxRp6F3aHTqhEQoKTkraRYQmgOA3B+KvgX/c/cplfS7v1fRJU/X0IJV9caW32Jpbpzc06otDcbnsJwCHGgZACJ6PtYYe30JdeiBNwED2ZVuA0D8Ev97berjwAcDQnIPQdGA3Ph9hF75UKcb/6lTxs0aHT9Wow4Dm/i4cDAAJH/lzZN9TrqhknIer6F7V9QZxSeW4tbHSJpeW9dAHSdLiQFH+b5mIQPgHQD8lV3qNgDEFt6i+EpcBMCPtxBLzg4EhER+YO2mCC18V6cr52t01jTNWFPQOrMRIPwYAPtM69tOTCziOe++arphaS29ysW2IxKn6jryjJ76uJ7aXGY1n7An8fe39v2XmBF01J83AKD9hq+62wBoz7+0Ty6TB4ADPS6If96aFzFmKPct0Y1cwWmXa8YqwxZmjsFIwY2tMAq+5aWJZbtnzqmiyc/X0qLV9cYzdnlVnLyquTwTsdy0HGNrHYDKAOiDEJB3ZgDHs3e53Qhsxb+scxenPg2YUiAUJzYZEeEi0bAU5w+IHYeyb9Xo5Ak6/eKGKA1bUEPzVtbRZ9tjVFQRp5h3a34/3fiqtN2Ad7J7YwbgHQAcwd4o41XgTQu9C4AD9Q/E7sPfbCuh/OIGT03rmyoBqYnP2gDAKFu7Aa9jePRCCtA7AOjO/lBGHHjyI5ojrwHd6B+UlZYQxWOUjhLQGrpAWgx4JQOgq7ExLSRZiThwR/5SXpUBgIvu1iisph8AjN2HSkooFktPAIjexPn3S4sBi+j5YXgE8MoMIBBuw9cnZTwCBGZplFcQSctZQDoDIFIRp9Nvq7IOAHsxYBE9bw0AeEGZhYpybqkAwT0yAHDWdM3otgMA7qqgNG7kEqzHgG0B4E7z0RP1J11/UxOPAUH1BhkA+O/LNNq8DQBwW5vDMTpqmg0ADLa1DmCGUfxnAwDyFShUjPexwfBl/KU0uJ0FOHa0Suu/dTYODAD8f63e2kCHXyUlBlxvRs8V5QIAwEtvAoawq9wGQM8RKn24zt04MABA9NbXDdRJTgy4kn9sBmH677004Hl8LXMbACJZ9/rH3kkDHioAePrTeiOubC0GXGEnBlxqRs9Rdx6bAZzOjrgNgMMGqrRouU5lJQCAm3pwpbQYsG5Gz1F3HpsBnMjX3TLiwNc/pRvnBKqauTCnKD2agukIALH6UK+I08TnbISA7MWAReT8BADAezOAo9ibXX8TwO48WKVfT9Jo3H0aPfqGTqu/jhgnB+9dqVeU+n0DDyUAiNDPxoIYLVxdT5c+XWtsA2acBnSJlBjwRjN6jrrzGAAOZ38iAwDGEltzuW3b7MRGIeder9GMJzR6YaVOX29JrN1PLtv1yuzAqwAQZwjkFcfp7a8b6KbXao0lyUdPr0w885vLlW1tX3aRrRjwh2b0HHXnGSXiwJ34S3lTCgAaAwJfO/Ls4NQJmrF7jzhI5L0vdCM4pEfkPy54BQDxOFFRNG6sRnyIn+1HPlFDp9xU9UOXf3zU+safPxkDtgWAV43oeQgA8NAMICzyAG35y1nkCQD8GAYmEFpmJl4bin39Ln9Yo3++q9PaTbqxkUdylZ6bMJAJALFf4HdqzNgx+OqXaulPd1RRj6srjX0J9hZ8rkPblQ+ztQ7gSTN6jrrzDgBEHPhf4jHgfs8B4ACPC2LrrhPGJtYTzH5GN9bqi1ShaCaWujA7cBMAonmnlsdp5eYGmrOsjrIfqaYTrqs0dhDeO63PjTp7SEnSQ2zFgOcqfUsVJasQdeedR4AdirE2O6je7HkANDI7ELv0dBuaaCaOvU+jh1/T6eP1zjYTnQaAOLhjQ37M2DRUbB4qmnddr6zce2KQawWf2hjwDfx9Kcr4ItSddwCwK/kqcDJfY2kFgUZmB21+opm4IcXNxFQDQKzRF827Nzc00PVLa+nc+6rpqOmVieO7x0ss+tTFgBvMyLmiDMMjgMceA8QMQBvBX05N2gLgIM1EcQ7BkDmasSX4ijW6sUW4nWaiXQCIXXnEslzRvHvwvTpjgw7RvDN26vVKwf8UAAZYjgFXmZFz1JtHw0D9+LrHNwBorJkYSmxJnmwmio1JxW7AzW0mWgFARQ3Rt2bz7ooXaumMOS4271JyWrGt3YDLzMg56s2jWYAz2UW+BMABHhfaD/ihmSjOFHxjn2bigWYHTQGAaN4VlsXpvU0NdPvbdRR8qJqOmyGpeZcKj7UVAxZR898DAN4FwM/ZhYcEABoDgmgmDlHptEkajZ6baCZ+tF7/f83EAwFANO++2hWjx1fVU+6iGjptdhV1kd28S5VHl9sBwG6eAZwEAHgXAEeztxySADhAM/GokSr1vU40E/W9zcSCcIT2lJeIJ3mjebc9EqelXzXQdUtr6W/3Vhtn7u1t3uWmedGnLga82Yyco948CoAe7M8PeQA0oZk4dI5Gc5cU0dx3a4zm3c9vNPP1433wK38gjyy1A4BPzMg56s17rwJFHDjcmb+cd1D0TWsmthqgUYvxFf77lXduO3ARNe8EAHhyBiC2BStsx1/Ocyj0JjrTxvHg6Wp7MeBFPMba4kgwTwKgUFECeS35S3oIxe3A8eB+sb0Y8P1K7wd4nBWg3jyn7Ig4H0D0AW5BcQMAjW8HbisGPFMJ6YrSbwfqzXPK0pKNwKtQ3ADATwOA/66DLMeAY4moOY+z/nmoNw+/CbiYXYsCBwBSHAMWEfMRaAB6HwBBdgUKHADYb+ov/p4jy+yEgETEvB8A4H0AnMUuRoEf4gAQv/Zi91+x/Zd47hfnAFjfCJTMiPkZAID3AXAqO4wCP8QAkGsu9BFJP3Hwp1jym6ml8n4VmlFz1JnHAXAsexsK/BAAgPiVF9n+ESWJTT6ydDspv4N5ixk1R515HAA92WtR4D4EgOjii9V84llevM8XDb3U/sofyJ+ZUXPUmWeViAN35S/pXyhwHwAg2bwTB3mIBJ94hSc+c0jK/VqmBMKdlQAA4PUZQAf2SyjwNAWA0bwrT2T2U9O8S5WfZfC0w3bgngaAxjOAolb8ZT2KAk8TADjfvEuVH1ICFS2UoI468+4jQLGiBHaLWcDtKHAPAyDZvBuebN5Jm9Y3x7comYWKckEx6syzmvl88jFgGgrcQwCQ27xLlacYY6sftgP3rvpSEgDj2HUockkA8FbzLhUW0fJReAOQPo3AAb7aHjwdAODd5l0qXGVGzFFfaQKAE81jwr5kl7DjKPgUAyA3+sO03tvNO6uOm2NnrXEcWFA9HgBIB4n3tIYLW5nnuJ/Nns5+hb2dXYnitwiA9GzeNceVZop0CXuqEgyfzWOpl5KR3zJx8EwE9eV5ZfIXlVNqbhGmJhwwjg8X+YCTzMcDQfRVbC1x3BMAcMDmnVhQk77NuwO5nq2aY+FuLvJsY/Yoxkqmts/4KVSUJ0jsOIX6Sj8g8BeYrSVSgonTgxQlq6gFX7ubhzxcbh4r/o1vTxVqKgCSzTvxTn7f5p2//t7l7I3shexL2b9VQjwWzq9tsbfgjW5/gaJkYO8/fyknX1H+EmUYaMnThBMzhYzCtgwIsYioP3s2++3EIRA+31hEFLdYMuvf5l2yg7/L/E7F6dEXGIt6AmJzz31+FAK6ogzYmXiTBB1CDcOQuZdgcoYgwh5BTWz93IevYnehR8xGkP+aieL5PVv3Y/Ou2Fy885DxHYa0U9mdlCx9n2l9OLG5p5jeQ1CigaglHNzv+a8lF8oRRkMIzUQvN+++Z7+YaN6pf+bvrKfST22ZALv5nWYUYloPpbSZeA+aiVKbdx+w5ySad9rP2O0Tj3f7fF+PLVaU80ownqEUNxPFQDtXb2E0kA71ZqI7LjObd0+wLzGad0G1mzI0quz3LJ9RkJjeQ5Bj6rtDUUZWJX5hko8LieyBaCYeYzaaks3EfOxSbHkX3jz2W+wb+T6fy7Oxo/n+ttmvWy+m9QN385eC5h0kbXbAvziDtUaaidovzWbiw+w1SCYesHkXMZt38xiow9mnGPcwu/CHghf3dxj/ymf
2899jVx5Ki2aiOUMIFbbkx4heZjNRrFZ82UydHcrNxCj7O/YL5mq7MxPbboVbJmZX5gyrv86/9FiHD6WjBvAgHqMlmomhfX7FAmoH9kk8wEUz8a59mon1Pm/eid113zP3bMhMZOz19okZ0z5T+/O/51kUoreQ35QhftG0H9YsiME+lhSzmfg7hsMEnzUTRfPuK/YCs3n3G3YXZXj5/s2780oVpR8KHjqkmolc+IN2JsJIP24mBvY2E2elWTOxmr2T/Rr7OqN5F9CO4mvr/Zt3YTTvIKjRZuLeppfnm4mxfZp3Ygn2UH7cOYV9WAJs+wRxsvISfx8Igmw0E0PSm4ni7MVv2c+zJxtHZoXUHkpGwT4LasKJ/RkRtYUgB5uJwWQy0Wgm3mmm41LdTBTbqxWYzbu/szP433eckqm3M6by+xa9eLYXOQkIghxuJvbT9u+cDxXRZbWb0UxMLHX9p9lMLLfRvHvc3GOxDz+adFEGVfwwrRdpyJwSRclG8w6C5Ek0Ewds2b93kFjI1MZsJp7Hnmmm6vLMRt1PLajZai52upaL+6/sI5VAUev9p/WFiNpCkKcV4gLNKtx/IZPxnl3vwv/5V+zLzNOT8s0gjsjXjzVPVu6oZIV/+IUXB2EExa8+tsP2o/4PjC+/XK0vW+AAAAAASUVORK5CYII=","title":"$:/img/ico/css-3.ico","type":"image/x-icon","modified":"20240913102449306"},
2900{"created":"20241012161436785","text":"\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\u003Csvg id=\"Layer_1\" data-name=\"Layer 1\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 756.26 596.9\">\n  \u003Cdefs>\n    \u003Cstyle>\n      .cls-1 {\n        fill: #1d63ed;\n        stroke-width: 0px;\n      }\n    \u003C/style>\n  \u003C/defs>\n  \u003Cpath class=\"cls-1\" d=\"M743.96,245.25c-18.54-12.48-67.26-17.81-102.68-8.27-1.91-35.28-20.1-65.01-53.38-90.95l-12.32-8.27-8.21,12.4c-16.14,24.5-22.94,57.14-20.53,86.81,1.9,18.28,8.26,38.83,20.53,53.74-46.1,26.74-88.59,20.67-276.77,20.67H.06c-.85,42.49,5.98,124.23,57.96,190.77,5.74,7.35,12.04,14.46,18.87,21.31,42.26,42.32,106.11,73.35,201.59,73.44,145.66.13,270.46-78.6,346.37-268.97,24.98.41,90.92,4.48,123.19-57.88.79-1.05,8.21-16.54,8.21-16.54l-12.3-8.27ZM189.67,206.39h-81.7v81.7h81.7v-81.7ZM295.22,206.39h-81.7v81.7h81.7v-81.7ZM400.77,206.39h-81.7v81.7h81.7v-81.7ZM506.32,206.39h-81.7v81.7h81.7v-81.7ZM84.12,206.39H2.42v81.7h81.7v-81.7ZM189.67,103.2h-81.7v81.7h81.7v-81.7ZM295.22,103.2h-81.7v81.7h81.7v-81.7ZM400.77,103.2h-81.7v81.7h81.7v-81.7ZM400.77,0h-81.7v81.7h81.7V0Z\"/>\n\u003C/svg>","title":"$:/img/ico/docker.svg","type":"image/svg+xml","modified":"20241012161447422"},
2901{"created":"20240519222858877","text":"\u003C\u003Cfa-lbadge glyph:\"fa-font-awesome-flag\" fam:\"fab\">>","tags":"","title":"$:/img/ico/font-awesome/icone","modified":"20241006001420624"},
2902{"created":"20240913102901587","text":"            \u003Csvg class=\"gitLogo\" fill=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n              \u003Cpath fill-rule=\"evenodd\" d=\"M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z\" clip-rule=\"evenodd\">\u003C/path>\n          \u003C/svg>","tags":"","title":"$:/img/ico/git.svg","modified":"20240913102948844"},
2903{"created":"20240911064634957","text":"AAABAAEAAAAAAAEAIADqJgAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAEAAAABAAgGAAAAXHKoZgAAAAFvck5UAc+id5oAACakSURBVHja7Z0HdBRl98YXBERFFBURkt1NQgfB7vepqFgQyGZTqKGLIEVAFGwgCiooFhQFBRELNhD9LCiIqKAICqiIooL03pJND6El93/fmVlJ+BNIpr2zw3PPec6coyFl9t7fvHPnmft6PO6Mc1hfs6iMmsmqWobvW1X72rJ+36+136V4XMsKleN7mK3j/a2JrLxyfI99rBt1fC5nsz4t5+/7BqvyMd+nsvbfy/o9lrLO8yBOmQAArAWA0CxWtXJ+Ll1ZuQAAAgCIfADks3qW4zPxs37W8fsCAAgAwIEAEPqVFVuG83YaaxyrCABAAADuAYDQeK3ATxTXs3bp/P4AAAIAcDAAdp+kISj+/o8N/L4AAAIAcDAAhD5jnVvKOevLKgAAEACAewFwgNXvOOerHut3g78vAIAAABwOAKHVrAbHFOnzJvy+AAACAIgAAAi9WKxYW7HSAABEJABAmFrOZFVgVSxFFbSvmWUQANexciQC4EMLAZCuFb7oB8wz6fcFABCWA2Adawpr0kk0RftaIwDwsh5kjTmBRrMmsLLL8bMWsR45yfd9jNWBVckiAAjN137WAQAAESkAsErHA0BZoxZrezl+1iMGzpeZADjiUV2CBAAgAAD9AIguJwDGOAQAZgsAQAAAAAAAgAAAAAAAAAEAAAAAAAIAkAOA/axtBs6J8ECkAQAIACAyAbCTNdyjz+RzkPUk

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.