From f5b4556120e93542ed5a4f8f8b8bf5f0f84b7a1c Mon Sep 17 00:00:00 2001 From: Kailash Nadh Date: Sun, 30 Nov 2025 14:11:42 +0530 Subject: [PATCH] First commit. --- LICENSE | 7 + README.md | 6 + base.html | 110 ++++++ glossary-words.html | 13 + glossary.html | 22 ++ index.html | 4 + lang.json | 36 ++ message.html | 10 + pages/about.html | 73 ++++ results.html | 97 ++++++ search.html | 16 + static/alar.js | 55 +++ static/alar.svg | 130 +++++++ static/audio.svg | 1 + static/autocomp.js | 137 ++++++++ static/down.svg | 1 + static/export.svg | 2 + static/favicon.png | Bin 0 -> 852 bytes static/flexit.css | 135 ++++++++ static/idaf-logo.svg | 1 + static/logo.svg | 1 + static/main.js | 304 +++++++++++++++++ static/search.svg | 1 + static/share.js | 265 ++++++++++++++ static/style.css | 741 ++++++++++++++++++++++++++++++++++++++++ static/thumb.png | Bin 0 -> 23451 bytes static/up.svg | 1 + static/vkrishna.png | Bin 0 -> 40550 bytes static/zerodha-logo.svg | 1 + submit-new.html | 74 ++++ 30 files changed, 2244 insertions(+) create mode 100644 LICENSE create mode 100644 README.md create mode 100644 base.html create mode 100644 glossary-words.html create mode 100644 glossary.html create mode 100644 index.html create mode 100644 lang.json create mode 100644 message.html create mode 100644 pages/about.html create mode 100644 results.html create mode 100644 search.html create mode 100644 static/alar.js create mode 100644 static/alar.svg create mode 100644 static/audio.svg create mode 100644 static/autocomp.js create mode 100644 static/down.svg create mode 100644 static/export.svg create mode 100644 static/favicon.png create mode 100644 static/flexit.css create mode 100644 static/idaf-logo.svg create mode 100644 static/logo.svg create mode 100644 static/main.js create mode 100644 static/search.svg create mode 100644 static/share.js create mode 100644 static/style.css create mode 100644 static/thumb.png create mode 100644 static/up.svg create mode 100644 static/vkrishna.png create mode 100644 static/zerodha-logo.svg create mode 100644 submit-new.html diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..1f937da --- /dev/null +++ b/LICENSE @@ -0,0 +1,7 @@ +Copyright 2019, Kailash Nadh + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..572f78d --- /dev/null +++ b/README.md @@ -0,0 +1,6 @@ +# dictmaker-alar +This repository is the [dictmaker](https://dict.press) site theme for the Kannada-English dictionary site [Alar.ink](https://alar.ink) + +This can be cloned and used as a theme for building dictionary site themes for dictpress. + +Licensed under the MIT License. \ No newline at end of file diff --git a/base.html b/base.html new file mode 100644 index 0000000..b77d5fd --- /dev/null +++ b/base.html @@ -0,0 +1,110 @@ +{{- define "header" -}} + + + + + + + {{- block "meta" . -}} + + {{- if eq .Data.PageType "/" }} {{- .L.T "global.siteName" -}} + {{- else if eq .Data.PageType "glossary" }}{{- .L.T "public.glossaryTitle" -}} + {{- else if eq .Data.PageType "search" }}{{- .L.Ts "public.searchTitle" "query" .Data.Query.Query -}} + {{- else if ne .Data.Title "" }}{{ .Data.Title }} + {{- end -}} + + + {{- end -}} + + + + + + + + +
+
+
+
+ + + +
+
+{{ end}} + +{{ define "footer" }} + +
+ + +
+ +
+
+

{{ .L.T "public.submitTitle" }}

+ +

+ + +

+
+
+ + + + + +{{ end }} diff --git a/glossary-words.html b/glossary-words.html new file mode 100644 index 0000000..2a15a4f --- /dev/null +++ b/glossary-words.html @@ -0,0 +1,13 @@ +{{ define "glossary-words" }} +{{ $g := .Data.Glossary }} +{{ if not $g.Words }} +

{{ $.L.T "public.noResultsTitle" }}

+

{{ $.L.T "public.noResults" }}

+{{ else }} + +{{ end }} +{{ end }} \ No newline at end of file diff --git a/glossary.html b/glossary.html new file mode 100644 index 0000000..58d9526 --- /dev/null +++ b/glossary.html @@ -0,0 +1,22 @@ +{{ define "glossary" }} +{{ template "header" . }} + +
+ {{ if not .Data.Initials }} +

{{ .L.T "public.glossaryTitle" }}

+

{{ .L.T "public.noResults" }}

+ {{ else }} + + + + {{ template "glossary-words" . }} + + {{ end}} +
+ +{{ template "footer" . }} +{{ end }} \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..8454013 --- /dev/null +++ b/index.html @@ -0,0 +1,4 @@ +{{ define "index" }} +{{ template "header" . }} +{{ template "footer" . }} +{{ end }} \ No newline at end of file diff --git a/lang.json b/lang.json new file mode 100644 index 0000000..f477cb4 --- /dev/null +++ b/lang.json @@ -0,0 +1,36 @@ +{ + "_.code": "en", + "_.name": "English", + "global.btnClose": "Close", + "global.btnDelete": "Delete", + "global.btnSearch": "Search", + "global.siteName": "Dictionary", + "public.errorMessage": "An error occurred. Please try later.", + "public.errorTitle": "Error", + "public.about": "About", + "public.glossary": "{lang} glossary", + "public.glossaryTitle": "Glossary of words", + "public.mainTitle": "Dictionary website", + "public.noResults": "No results where found for the query.", + "public.noResultsTitle": "No results", + "public.searchTitle": "{query} English meaning - Alar", + "public.similarTitle": "Similar words", + "public.playAudio": "Play audio", + "public.subTitle": "Kannada-English dictionary", + "public.submitEntry": "Suggest new entry", + "public.submitEntryTitle": "Suggest new entry", + "public.submitTitle": "Comments and suggestions", + "public.suggestAddDefBtn": "Add another definition", + "public.suggestContent": "Content", + "public.suggestDefLang": "Definition language", + "public.suggestDefsTitle": "Definitions", + "public.suggestEdit": "Suggest edit for \"{word}\"", + "public.suggestEntryLang": "Entry language", + "public.suggestPhones": "Phonetic notations (pronunciation)", + "public.suggestPhonesPlaceholder": "eg: pɛts, pɛt (commma separated)", + "public.suggestSubmitBtn": "Submit for review", + "public.suggestSubmitted": "Submitted for review successfully", + "public.suggestTitle": "Suggest a new entry", + "public.viewMore": "View {num} more", + "public.sourceTag": "Source of the entry" +} \ No newline at end of file diff --git a/message.html b/message.html new file mode 100644 index 0000000..b570716 --- /dev/null +++ b/message.html @@ -0,0 +1,10 @@ +{{ define "message" }} +{{ template "header" . }} + +
+

{{ .Data.Title }}

+

{{ .Data.Description }}

+
+ +{{ template "footer" . }} +{{ end }} \ No newline at end of file diff --git a/pages/about.html b/pages/about.html new file mode 100644 index 0000000..737f360 --- /dev/null +++ b/pages/about.html @@ -0,0 +1,73 @@ +{{ define "meta" }} + About V. Krishna's Alar (Kannada-English dictionary) + +{{ end }} + +{{ define "page-about" }} + +{{ template "header" . }} +
+

About

+

+ Alar is an authoritative Kannada-English dictionary corpus + created by V. Krishna. It contains over 150,000 Kannada words + with over 240,000 English definitions. It is released + as an open data corpus licensed under + the Open Database License (ODC-ODbL). +

+
+

V. Krishna

+

+ Photo of V. Krishna + V. Krishna started building his Kannada-English dictionary in the 1970s + as a hobby project. This incredible endeavour spanning four decades + has now evolved into an invaluable contribution to Kannada language. + In addition to authoring the colossal dictionary, he single-handedly digitised + his original manuscripts. In 2019, he open sourced the entire dictionary. + Read the full story here. +

+

+ He is a resident of Bengaluru and spends his time working on his dictionary + and other Kannada literature projects. He has recently started laying + foundations for a new English-Kannada dictionary. He can be reached at + vkrishna1411@yahoo.co.in. +

+ +

+ +
+ +

Data

+

+ The corpus is available on the Alar repository. + It is licensed under ODC-ODbL. +

+ +

Website

+

+ This website is published using dictpress, + and uses knphone, a Kannada phonetic + indexing algorithm, for search. Search suggestions and transliterations are powered by Varnam. + The website's source is available here. +

+

+ Technical feedback can be sent to kailash@nadh.in. +

+ +
+ +

Zerodha

+

In 2019, Zerodha collaborated with + V. Krishna to open source and publish his dictionary online and + awarded him a grant to support his work. +

+ +
+ +

Indic Archive

+

Since 2023, Alar is a project under Indic Digital Archive Foundation.

+
+{{ template "footer" . }} +{{ end }} diff --git a/results.html b/results.html new file mode 100644 index 0000000..2eec57a --- /dev/null +++ b/results.html @@ -0,0 +1,97 @@ +{{ define "results" }} +{{ $maxContentItems := .Consts.SiteMaxEntryContentItems }} +{{ $numResults := (min (len .Data.Results.Entries) 10) }} +
+
+
    + {{- range $k, $r := (mustSlice .Data.Results.Entries 0 $numResults) -}} +
  1. +
    +
    +
    +

    {{ $r.Content | join ", " }}

    + + {{- if $r.Meta.audio -}} + {{ $.L.T + {{- end -}} + + {{- if $.Consts.EnableSubmissions -}} + ✏️ + {{- end -}} +
    + + {{- if $r.Phones -}} + ♪ {{ $r.Phones | join "," }} + {{- end -}} + +
    + +
    + {{- if $r.Tags -}} + + {{- range $tag := $r.Tags -}} + {{ $tag }} + {{- end -}} + + {{- end -}} + Share screenshot +
    +
    + + {{- if $r.Relations -}} + {{- $lastType := "" -}} + {{- range $k, $d := $r.Relations -}} + {{- $types := ($d.RelationTypes | join ", ") -}} + + {{- if ne $lastType $types -}} + {{- if $lastType -}}
{{- end }} +
    + {{ if $d.RelationTypes }} +
  1. + {{- range $t := $d.RelationTypes -}} + + {{- $dType := index (index $.Langs $r.Lang).Types $t }} + {{- if $dType }}{{ $dType }} {{ end -}} + {{- $rType := index (index $.Langs $d.Lang).Types $t }} + {{- if $rType }}({{ $rType }}){{ end -}} + + {{- end -}} +
  2. + {{ end }} + {{- end -}} + +
  3. + {{ $d.Content | join ", " }} + {{ if or (gt $d.ContentLength $maxContentItems) $d.Meta.synonyms -}} + + {{- end -}} + {{- if $.Consts.EnableSubmissions }} + ✏️ + {{ end -}} + + + + +
  4. + {{ $lastType = $types }} + {{- end -}} +
+ {{ end }} + + + {{- end -}} + +
+ +
+{{ end }} diff --git a/search.html b/search.html new file mode 100644 index 0000000..ebc3147 --- /dev/null +++ b/search.html @@ -0,0 +1,16 @@ +{{ define "search" }} +{{ template "header" . }} + +
+ {{ if not .Data.Results.Entries }} +

{{ .L.T "public.noResultsTitle" }}

+

+ {{ .L.T "public.noResults" }} +

+ {{ else }} + {{ template "results" . }} + {{ end }} +
+ +{{ template "footer" . }} +{{ end }} diff --git a/static/alar.js b/static/alar.js new file mode 100644 index 0000000..55f8c92 --- /dev/null +++ b/static/alar.js @@ -0,0 +1,55 @@ +function hasKannadaChar(str) { + return /[\u0C80-\u0CFF]/.test(str); +} + +(function () { + const reMatchNonKannadaBlobs = new RegExp(/[^\u0C80-\u0CFF]+/g); + // In the results (definitions), if there are Kannada words, hyperlink + // them to search. + let defs = document.querySelectorAll(".defs li"); + if (!defs || defs.length === 0) { + return; + } + + for (let i = 0; i < defs.length; i++) { + // Go through each definition. Ignore the ASCII ones. + if (!hasKannadaChar(defs[i].innerText)) { + continue; + } + + // Split the word and iterate through it, turning non-ASCII words into + // hyperlinks; + const parts = defs[i].innerText.split(" "); + const s = document.createElement("span"); + + parts.forEach((v) => { + if (!hasKannadaChar(v)) { + // ASCII word. Append the text as-is. + s.appendChild(document.createTextNode(v)); + } else { + // Non-ASCII word. Turn into a link. + const a = document.createElement("a"); + + // Some Kannada words have non-Kannada characters around them, + // the hyperlink should be formed only for Kannada words, while retaining all the characters order + const kannadaWord = v.replace(reMatchNonKannadaBlobs, ""); + const nonKannadaWords = v.split(kannadaWord); + + nonKannadaWords[0] && s.appendChild(document.createTextNode(nonKannadaWords[0])); + + a.setAttribute("href", kannadaWord); + a.appendChild(document.createTextNode(kannadaWord)); + s.appendChild(a); + + nonKannadaWords[1] && s.appendChild(document.createTextNode(nonKannadaWords[1])); + } + + // Append a space. + s.appendChild(document.createTextNode(" ")); + }); + + defs[i].innerHTML = ""; + defs[i].appendChild(s); + } + +})(); \ No newline at end of file diff --git a/static/alar.svg b/static/alar.svg new file mode 100644 index 0000000..9814e93 --- /dev/null +++ b/static/alar.svg @@ -0,0 +1,130 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + Alar - V Krishna's Kannada - English dictionary + ಶ್ರೀ . ವಿ ಕ್ರಿಷ್ಣ ರವರ ಕನ್ನಡ - ಇಂಗ್ಲಿಷ್ ನಿಘಂಟು + ಅಲರ್ + + diff --git a/static/audio.svg b/static/audio.svg new file mode 100644 index 0000000..495ee0d --- /dev/null +++ b/static/audio.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/autocomp.js b/static/autocomp.js new file mode 100644 index 0000000..a4ba4f7 --- /dev/null +++ b/static/autocomp.js @@ -0,0 +1,137 @@ +function autocomp(el, options = {}) { + const opt = { + onQuery: null, onNavigate: null, onSelect: null, onRender: null, debounce: 100, autoSelect: true,...options + }; + + let box, cur = opt.autoSelect ? 0 : -1, items = [], val, req; + + // Disable browser's default autocomplete behaviour on the input. + el.autocomplete = "off"; + + // Attach all the events required for the interactions in one go. + ["input", "keydown", "blur"].forEach(k => el.addEventListener(k, handleEvent)); + + function handleEvent(e) { + if (e.type === "keydown" && !handleKeydown(e)) { + return; + } + + if (e.type === "blur") { + return destroy(); + } + + const newVal = e.target.value; + if (!newVal) { + destroy(); + val = null; + return; + } + + if (newVal === val && box) { + return; + } + val = newVal; + + // Clear (debounce) any existing pending requests and queue + // the next search request. + clearTimeout(req); + req = setTimeout(query, opt.debounce); + } + + function handleKeydown(e) { + if (!box) { + return e.keyCode === 38 || e.keyCode === 40 + } + + switch (e.keyCode) { + case 38: return navigate(-1, e); // Up arrow. + case 40: return navigate(1, e); // Down arrow + case 9: // Tab + case 13: // Enter + e.preventDefault(); + select(cur); + destroy(); + return; + case 27: // Escape. + destroy(); + return; + } + } + + async function query() { + if (!val) { + return; + } + + items = await opt.onQuery(val); + if (!items.length) { + return destroy(); + } + + if (!box) { + createBox(); + } + + renderResults(); + } + + function createBox() { + box = document.createElement("div"); + Object.assign(box.style, { + width: window.getComputedStyle(el).width, + position: "absolute", + left: `${el.offsetLeft}px`, + top: `${el.offsetTop + el.offsetHeight}px` + }); + + box.classList.add("autocomp"); + el.parentNode.insertBefore(box, el.nextSibling); + } + + function renderResults() { + box.innerHTML = ""; + items.forEach((item, idx) => { + const div = document.createElement("div"); + div.classList.add("autocomp-item"); + + // If there's a custom renderer callback, use it, else, simply insert the value/text as-is. + opt.onRender ? div.appendChild(opt.onRender(item)) : div.innerText = item; + if (idx === cur) { + div.classList.add("autocomp-sel"); + } + + div.addEventListener("mousedown", () => select(idx)); + box.appendChild(div); + }); + } + + function navigate(direction, e) { + e.preventDefault(); + + // Remove the previous item's highlight; + const prev = box.querySelector(`:nth-child(${cur + 1})`); + prev?.classList.remove("autocomp-sel"); + + // Increment the cursor and highlight the next item, cycled between [0, n]. + cur = (cur + direction + items.length) % items.length; + box.querySelector(`:nth-child(${cur + 1})`).classList.add("autocomp-sel"); + } + + function select(idx) { + if (!opt.onSelect) { + return; + } + + val = opt.onSelect(items[idx]); + el.value = val || items[idx]; + } + + function destroy() { + items = []; + cur = opt.autoSelect ? 0 : -1; + if (box) { + box.remove(); + box = null; + } + } +} diff --git a/static/down.svg b/static/down.svg new file mode 100644 index 0000000..580bcde --- /dev/null +++ b/static/down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/export.svg b/static/export.svg new file mode 100644 index 0000000..05edf4a --- /dev/null +++ b/static/export.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/static/favicon.png b/static/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..cd5f1d7a8cfa84782ff733e3a65c77d8f0dfc5b0 GIT binary patch literal 852 zcmV-a1FQUrP);wXkcWbR=(%AJ*l3)2K!z+t-H^C#}CMX zf7o#LUhBWsI{WOk_BuSr|BPB@?FGDxw=o%)un#{}w7D4XpbH(ig5x-VzlS1s;WP%r zcz|t<;L6aAlNoMvT)|Ee}6Xd_(<$}D1U6~-> zXe!ikJqWuB2Id7>UkKo*AYUKfPRfSfptqBBs=Lt{2onm=Q_1i=QBV&zTu}@MT7?lXOsWr}Yd@WY#|jhF--V1^E#S%LGuvonUJr zd{z=bZk)pKjPZ|x-hNEY=*1$ptd21m#T`_wuD$O{xKra7k)V9|hB~H)E?0v)U0SNvV^&2M$V| zQ(0p=S}MOgrIH)@x3DOZa&7rc9LDStM}5-y=#_fJX;OuoC8b*q7qJRwOXMx+lI7$c=;hjb?T eRQTVuE~ literal 0 HcmV?d00001 diff --git a/static/flexit.css b/static/flexit.css new file mode 100644 index 0000000..54f7029 --- /dev/null +++ b/static/flexit.css @@ -0,0 +1,135 @@ +.container { + position: relative; + width: 100%; + max-width: 960px; + margin: 0 auto; + box-sizing: border-box; +} +.row { + box-sizing: border-box; + display: flex; + flex: 0 1 auto; + flex-flow: row wrap; +} +.row.nogutter { + margin-left: 0; + margin-right: 0; +} +.row.nogutter > .columns { + padding-left: 0; + padding-right: 0; +} +.columns { + box-sizing: border-box; + flex: 0 1 auto; + min-width: 0; +} +.one { + flex-basis: 8.33333333%; +} +.two { + flex-basis: 16.66666667%; +} +.three { + flex-basis: 25%; +} +.four { + flex-basis: 33.3333333333%; +} +.five { + flex-basis: 41.66666667%; +} +.six { + flex-basis: 50%; +} +.seven { + flex-basis: 58.33333333%; +} +.eight { + flex-basis: 66.66666667%; +} +.nine { + flex-basis: 75%; +} +.ten { + flex-basis: 83.33333333%; +} +.eleven { + flex-basis: 91.66666667%; +} +.twelve { + flex-basis: 100%; +} +.col-offset-0 { + margin-left: 0; +} +.col-offset-1 { + margin-left: 8.33333333%; +} +.col-offset-2 { + margin-left: 16.66666667%; +} +.col-offset-3 { + margin-left: 25%; +} +.col-offset-4 { + margin-left: 33.33333333%; +} +.col-offset-5 { + margin-left: 41.66666667%; +} +.col-offset-6 { + margin-left: 50%; +} +.col-offset-7 { + margin-left: 58.33333333%; +} +.col-offset-8 { + margin-left: 66.66666667%; +} +.col-offset-9 { + margin-left: 75%; +} +.col-offset-10 { + margin-left: 83.33333333%; +} +.col-offset-11 { + margin-left: 91.66666667%; +} +.between { + justify-content: space-between; +} +.end { + justify-content: flex-end; +} +.around { + justify-content: space-around; +} +.row-align-center { + align-items: center; +} +.space-right { + margin-right: 10px; +} +.space-left { + margin-left: 10px; +} +.space-bottom { + margin-bottom: 10px; +} +.space-top { + margin-top: 10px; +} +@media (max-width: 980px) { + .columns { + flex: 1 1 auto; + } + .offset-0, + .offset-1, + .offset-2 { + margin: unset; + } + .container { + padding: 0 15px; + } +} diff --git a/static/idaf-logo.svg b/static/idaf-logo.svg new file mode 100644 index 0000000..091e344 --- /dev/null +++ b/static/idaf-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/logo.svg b/static/logo.svg new file mode 100644 index 0000000..b24ac12 --- /dev/null +++ b/static/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/main.js b/static/main.js new file mode 100644 index 0000000..7d7076a --- /dev/null +++ b/static/main.js @@ -0,0 +1,304 @@ +async function screenshotElement(element) { + const canvas = await html2canvas(element); + canvas.toBlob(blob => { + const url = URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + a.download = 'screenshot.png'; + a.click(); + URL.revokeObjectURL(url); + }); +} + +(() => { + const elForm = document.querySelector("form.search-form"); + const elQ = document.querySelector("#q"); + const elSelDict = document.querySelector("form.search-form select"); + const defaultLang = elSelDict.value; + + + // =================================== + // Helper functions. + + function selectDict(dict) { + // dict is in the format '$fromLang/$toLang'. + const langs = dict.split("/"); + Object.assign(localStorage, { dict, from_lang: langs[0], to_lang: langs[1] }); + elSelDict.value = dict; + elForm.setAttribute("action", `${_ROOT_URL}/dictionary/${dict}`); + } + + // Capture the form submit and send it as a canonical URL instead + // of the ?q query param. + function search(q) { + let val = q.trim(); + + const uri = elForm.getAttribute("action"); + document.location.href = `${uri}/${encodeURIComponent(val).replace(/%20/g, "+")}`; + } + + // =================================== + // Events + + // On ~ press, focus search input. + document.onkeydown = (function (e) { + if (e.key !== "`" && e.key !== "~") { + return; + } + + e.preventDefault(); + q.focus(); + q.select(); + }); + + // Bind to language change. + elSelDict.addEventListener("change", function (e) { + selectDict(e.target.value); + }); + + // Bind to form submit. + elForm.addEventListener("submit", function (e) { + e.preventDefault(); + search(elQ.value); + }); + + // "More" link next to entries/defs that expands an entry. + document.querySelectorAll(".more-toggle").forEach((el) => { + el.onclick = (e) => { + e.preventDefault(); + + let state = "block"; + if (el.dataset.open) { + delete (el.dataset.open); + state = "none"; + } else { + el.dataset.open = true; + state = "block"; + } + + const container = document.getElementById(el.dataset.id); + container.style.display = state; + + // fetch() content from the dataset data.guid from /api/entry/{guid} + // and populate the div.more innerHTML with the content. + if (state === "block" && !el.dataset.fetched) { + container.innerHTML = `
`; + + fetch(`${window._ROOT_URL}/api/dictionary/entries/${el.dataset.entryGuid}`) + .then((resp) => resp.json()) + .then((data) => { + const d = data.data; + container.innerHTML = ""; + + // If there's data.data.meta.synonyms, add them to the synonyms div. + if (d.meta.synonyms) { + const syns = document.createElement("div"); + syns.classList.add("synonyms"); + syns.innerHTML = d.meta.synonyms.map((s) => `${s}`).join(""); + container.appendChild(syns); + } + + // Each data.content[] word, add to target. + const more = document.createElement("div"); + more.classList.add("words"); + more.innerHTML = d.content.slice(window._MAX_CONTENT_ITEMS).map((c) => `${c}`).join(""); + container.appendChild(more); + + el.dataset.fetched = true; + }) + .catch((err) => { + console.error("Error fetching entry content:", err); + }); + } + }; + }); + + // =================================== + + // Select a language based on the page URL. + let dict = localStorage.dict || defaultLang; + const uri = /(dictionary)\/((.+?)\/(.+?))\//i.exec(document.location.href); + if (uri && uri.length == 5) { + dict = uri[2]; + } + + selectDict(dict); + elQ.focus(); + elQ.select(); +})(); + +// Screenshot sharing. +(() => { + document.querySelectorAll("a.export").forEach((el) => { + el.onclick = async (e) => { + e.preventDefault(); + const guid = el.dataset.guid; + const entryEl = document.querySelector(`.entry[data-guid='${guid}']`); + if (!entryEl) { + alert("Could not find entry to export"); + return; + } + + const title = entryEl.dataset.head; + // Make the filename by stripping spaces from the head word(s). + const filename = title.replace(/\s+/g, "_").toLowerCase(); + + try { + await shareDOM(entryEl, `${title} meaning`, `${localStorage.from_lang} to ${localStorage.to_lang} meaning\n\n${window.location.href}`, `${filename}.png`); + } catch (err) { + console.error("Error sharing entry:", err); + alert(`Error sharing entry: ${err?.message || err}`); + } + }; + }); +})(); + +// Play audio. +(() => { + document.querySelectorAll("a[data-audio]").forEach((el) => { + el.onclick = (e) => { + e.preventDefault(); + const audio = new Audio(el.getAttribute("href")); + audio.play().catch((err) => { + console.error("error playing audio:", err); + alert("error playing audio"); + }); + }; + }); +})(); + + +// Submission form. +(() => { + function filterTypes(e) { + // Filter the types select field with elements that are supported by the language. + const types = e.target.closest("fieldset").querySelector("select[name=relation_type]"); + types.querySelectorAll("option").forEach((o) => o.style.display = "none"); + types.querySelectorAll(`option[data-lang=${e.target.value}]`).forEach((o) => o.style.display = "block"); + types.selectedIndex = 1; + } + + + if (document.querySelector(".form-submit")) { + document.querySelectorAll("select[name=relation_lang]").forEach((e) => { + e.onchange = filterTypes; + }); + + // +definition button. + document.querySelector(".btn-add-relation").onclick = (e) => { + e.preventDefault(); + + if (document.querySelectorAll(".add-relations li").length >= 20) { + return false; + } + + // Clone and add a relation fieldset. + const d = document.querySelector(".add-relations li").cloneNode(true); + d.dataset.added = true + d.querySelector("select[name=relation_lang]").onchange = filterTypes; + document.querySelector(".add-relations").appendChild(d); + + // Remove definition link. + d.querySelector(".btn-remove-relation").onclick = (e) => { + e.preventDefault(); + d.remove(); + }; + }; + } +})(); + +// Edit form. +(() => { + document.querySelectorAll(".edit").forEach((o) => { + o.onclick = ((e) => { + e.preventDefault(); + const btn = e.target; + + // Form is already open. + if (btn.close) { + btn.close(); + return; + } + + const form = document.querySelector(".form-comments").cloneNode(true); + o.parentNode.appendChild(form); + form.style.display = "block"; + + const txt = form.querySelector("textarea"); + txt.focus(); + txt.onkeydown = (e) => { + if (e.key === "Escape" && txt.value === "") { + btn.close(); + } + }; + + btn.close = () => { + btn.close = null; + form.remove(); + }; + + // Handle form submission. + form.onsubmit = () => { + fetch(`${window._ROOT_URL}/api/submissions/comments`, { + method: "POST", + headers: { + "Content-Type": "application/json" + }, + body: JSON.stringify({ + from_guid: btn.dataset.from, + to_guid: btn.dataset.to, + comments: txt.value + }) + }).catch((err) => { + alert(`Error submitting: ${err}`); + }); + + alert(form.dataset.success); + btn.close(); + }; + + form.querySelector("button.close").onclick = btn.close; + }); + }) +})(); + +// Autocomplete. +(() => { + if(!autocomp) { + return; + } + + const elForm = document.querySelector("form.search-form"); + const elQ = document.querySelector("#q"); + let debounce; + + autocomp(elQ, { + autoSelect: false, + onQuery: async (val) => { + const langCode = localStorage.from_lang; + clearTimeout(debounce); + return new Promise(resolve => { + debounce = setTimeout(async () => { + const response = await fetch(`${_ROOT_URL}/atl/${langCode}/${val.toLowerCase()}`); + const data = await response.json(); + + const a = data.greedy_tokenized.map(item => item.word).slice(0, 3).sort((a, b) => a.length - b.length); + const b = data.dictionary_suggestions.map(item => item.word).slice(0, 6).sort((a, b) => a.length - b.length); + + debounce = null; + resolve([...new Set(a.concat(b))]); + }, 50); + }); + }, + + onSelect: (val) => { + // autocomp search isn't complete. Use the user's input instead of autocomp selection. + if (val) { + elQ.value = val; + } + + elForm.dispatchEvent(new Event("submit", { cancelable: true })); + return elQ.value; + } + }); +})(); diff --git a/static/search.svg b/static/search.svg new file mode 100644 index 0000000..ca2a381 --- /dev/null +++ b/static/search.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/share.js b/static/share.js new file mode 100644 index 0000000..7591233 --- /dev/null +++ b/static/share.js @@ -0,0 +1,265 @@ +async function screenshotDOM(el, opts = {}) { + const { + scale = 2, + type = 'image/png', + quality = 0.92, + background = '#fff', + // if you want to *allow* splitting (and risk the bug), set to false + preventCapsuleSplit = true + } = opts; + + if (!(el instanceof Element)) throw new TypeError('Expected a DOM Element'); + + if (document.fonts && document.fonts.status !== 'loaded') { + try { await document.fonts.ready; } catch { } + } + + const { width, height } = (() => { + const r = el.getBoundingClientRect(); + return { width: Math.ceil(r.width), height: Math.ceil(r.height) }; + })(); + if (!width || !height) throw new Error('Element has zero width/height.'); + + const clone = el.cloneNode(true); + await inlineEverything(el, clone); + + if (background !== 'transparent') clone.style.background = background; + if (!clone.getAttribute('xmlns')) clone.setAttribute('xmlns', 'http://www.w3.org/1999/xhtml'); + + const xhtml = new XMLSerializer().serializeToString(clone); + const svg = ` + ${xhtml} + `; + + const svgBlob = new Blob([svg], { type: 'image/svg+xml;charset=utf-8' }); + const url = URL.createObjectURL(svgBlob); + + try { + const img = await loadImage(url); + const canvas = document.createElement('canvas'); + canvas.width = Math.ceil(width * scale); + canvas.height = Math.ceil(height * scale); + const ctx = canvas.getContext('2d'); + if (background !== 'transparent' || type !== 'image/png') { + ctx.fillStyle = background === 'transparent' ? '#0000' : background; + ctx.fillRect(0, 0, canvas.width, canvas.height); + } + ctx.drawImage(img, 0, 0, canvas.width, canvas.height); + const blob = await new Promise(res => canvas.toBlob(res, type, quality)); + if (!blob) throw new Error('Canvas.toBlob returned null.'); + return blob; + } finally { + URL.revokeObjectURL(url); + } + + function loadImage(src) { + return new Promise((resolve, reject) => { + const img = new Image(); + img.crossOrigin = 'anonymous'; + img.decoding = 'async'; + img.onload = () => resolve(img); + img.onerror = reject; + img.src = src; + }); + } + + async function inlineEverything(srcNode, dstNode) { + copyComputedStyle(srcNode, dstNode); + + // Remove interactive states that may be captured on touch devices + if (dstNode instanceof Element) { + // Reset outline from :focus state + dstNode.style.setProperty('outline', 'none', 'important'); + // Reset any pointer-events to ensure no hover states + const cs = window.getComputedStyle(srcNode); + // Only override cursor if it's pointer (indicating interactivity) + if (cs.cursor === 'pointer') { + dstNode.style.setProperty('cursor', 'default', 'important'); + } + } + + if (srcNode instanceof HTMLTextAreaElement) { + dstNode.textContent = srcNode.value; + } else if (srcNode instanceof HTMLInputElement) { + dstNode.setAttribute('value', srcNode.value); + if ((srcNode.type === 'checkbox' || srcNode.type === 'radio') && srcNode.checked) { + dstNode.setAttribute('checked', ''); + } + } else if (srcNode instanceof HTMLSelectElement) { + const sel = Array.from(srcNode.options).filter(o => o.selected).map(o => o.value); + Array.from(dstNode.options).forEach(o => (o.selected = sel.includes(o.value))); + } + + if (srcNode instanceof HTMLCanvasElement) { + try { + const dataURL = srcNode.toDataURL(); + const img = document.createElement('img'); + img.src = dataURL; + copyBoxSizing(dstNode, img); + dstNode.replaceWith(img); + dstNode = img; + } catch { } + } + + // Handle img elements to ensure they render properly + if (srcNode instanceof HTMLImageElement && dstNode instanceof HTMLImageElement) { + // Convert image to data URL for inlining + if (srcNode.complete && srcNode.naturalWidth > 0) { + try { + const canvas = document.createElement('canvas'); + const ctx = canvas.getContext('2d'); + canvas.width = srcNode.naturalWidth; + canvas.height = srcNode.naturalHeight; + ctx.drawImage(srcNode, 0, 0); + dstNode.src = canvas.toDataURL('image/png'); + // Also set width/height to ensure proper rendering + const cs = window.getComputedStyle(srcNode); + dstNode.style.width = cs.width; + dstNode.style.height = cs.height; + dstNode.style.objectFit = cs.objectFit; + } catch (err) { + // If cross-origin or other error, keep original src + console.log('Could not inline image:', err); + dstNode.src = srcNode.src; + } + } else { + // Image not loaded or has no dimensions, use src as-is + dstNode.src = srcNode.src || srcNode.getAttribute('src') || ''; + } + // Remove alt text from being rendered + dstNode.removeAttribute('alt'); + } + + materializePseudo(srcNode, dstNode, '::before'); + materializePseudo(srcNode, dstNode, '::after'); + + const sKids = srcNode.childNodes; + const dKids = dstNode.childNodes; + for (let i = 0; i < sKids.length; i++) { + const s = sKids[i], d = dKids[i]; + if (s && d && s.nodeType === 1 && d.nodeType === 1) await inlineEverything(s, d); + } + + function copyComputedStyle(src, dst) { + const cs = window.getComputedStyle(src); + let cssText = ''; + for (const prop of cs) cssText += `${prop}:${cs.getPropertyValue(prop)};`; + dst.setAttribute('style', (dst.getAttribute('style') || '') + cssText); + + // Always keep transform origin consistent + if (cs.transformOrigin) dst.style.transformOrigin = cs.transformOrigin; + + // Keep each line painting its own decoration (helps some engines) + dst.style.setProperty('box-decoration-break', 'clone', 'important'); + dst.style.setProperty('-webkit-box-decoration-break', 'clone', 'important'); + + // --- CAPSULE FIX: prevent decorated inline from splitting across lines --- + if (preventCapsuleSplit) { + const hasBg = (cs.backgroundImage && cs.backgroundImage !== 'none') || + (cs.backgroundColor && cs.backgroundColor !== 'rgba(0, 0, 0, 0)' && cs.backgroundColor !== 'transparent'); + const hasRadius = ['borderTopLeftRadius', 'borderTopRightRadius', 'borderBottomRightRadius', 'borderBottomLeftRadius'] + .some(k => parseFloat(cs[k]) > 0); + const hasPad = ['paddingTop', 'paddingRight', 'paddingBottom', 'paddingLeft'] + .some(k => parseFloat(cs[k]) > 0); + const isInlineLevel = cs.display.startsWith('inline'); + + if (isInlineLevel && (hasBg || hasRadius || hasPad)) { + // Make it behave like a chip for capture: no internal wrapping + dst.style.setProperty('display', 'inline-block', 'important'); + dst.style.setProperty('white-space', 'nowrap', 'important'); + // In case original allowed breaking long words, emulate by clipping + if (cs.overflowWrap === 'break-word' || cs.wordBreak === 'break-all') { + dst.style.setProperty('max-width', cs.maxWidth && cs.maxWidth !== 'none' ? cs.maxWidth : '100%', 'important'); + dst.style.setProperty('overflow', 'hidden', 'important'); + dst.style.setProperty('text-overflow', 'ellipsis', 'important'); + } + } + } + } + + function copyBoxSizing(src, dst) { + const cs = window.getComputedStyle(src); + dst.style.width = cs.width; + dst.style.height = cs.height; + dst.style.display = cs.display; + dst.style.objectFit = 'contain'; + } + + function materializePseudo(src, dst, which) { + const ps = window.getComputedStyle(src, which); + if (!ps || ps.content === '' || ps.content === 'none') return; + const span = document.createElement('span'); + let cssText = ''; + for (const prop of ps) cssText += `${prop}:${ps.getPropertyValue(prop)};`; + span.setAttribute('style', cssText); + + const content = ps.content; + const quoted = /^(['"]).*\1$/.test(content); + if (quoted) span.textContent = content.slice(1, -1).replace(/\\n/g, '\n'); + else if (content.startsWith('attr(')) { + const attrName = content.slice(5, -1).trim(); + span.textContent = src.getAttribute(attrName) || ''; + } else span.textContent = ''; + + if (which === '::before') dst.insertBefore(span, dst.firstChild); + else dst.appendChild(span); + } + } +} + +async function shareDOM(target, title, text, filename) { + try { + // Remove any active/focus states before capturing + // This is especially important on touch devices (Android) + if (document.activeElement) { + document.activeElement.blur(); + } + + // Wait a brief moment for any :active states to clear + await new Promise(resolve => setTimeout(resolve, 100)); + + // Make a crisp image (PNG keeps transparency; use JPEG for smaller files) + const blob = await screenshotDOM(target, { + scale: Math.max(2, window.devicePixelRatio || 2), + type: 'image/png', + background: 'white' + }); + + const file = new File([blob], filename || 'share.png', { + type: blob.type, + lastModified: Date.now() + }); + + // Web Share API with files (Android Chrome, iOS/iPadOS Safari 16+). + if (navigator.canShare && navigator.canShare({ files: [file] })) { + await navigator.share({ title, text, files: [file] }); + return; + } + + // Copy image to clipboard (desktop Chrome/Edge, some Android) + if (navigator.clipboard && window.ClipboardItem) { + try { + await navigator.clipboard.write([new ClipboardItem({ [blob.type]: blob })]); + alert('Screenshot copied to clipboard'); + return; + } catch (clipErr) { + // Clipboard write failed (common on Android), fall through to download + console.log('Clipboard write not allowed, downloading instead:', clipErr); + } + } + + // Fallback: prompt a download + const dlUrl = URL.createObjectURL(blob); + const a = Object.assign(document.createElement('a'), { + href: dlUrl, + download: 'share.png' + }); + document.body.appendChild(a); + a.click(); + a.remove(); + URL.revokeObjectURL(dlUrl); + } catch (err) { + console.error(err); + alert(`share failed: ${err?.message || err}`); + } finally { } +} diff --git a/static/style.css b/static/style.css new file mode 100644 index 0000000..52c65a8 --- /dev/null +++ b/static/style.css @@ -0,0 +1,741 @@ +:root { + --primary: #111; + --secondary: #333; + --light: #666; + --lighter: #aaa; + --lightest: #eee; + --lightestest: #f4f4f4; + --white: #fff; + --blue: #36c; +} + +* { + box-sizing: border-box; +} + +body { + background: #fbfbfb; + font-family: "Helvetica Neue", "Segoe UI", Helvetica, sans-serif; + margin: 0; + color: var(--primary); +} + +html, +body { + font-size: 1em; + line-height: 1.3; + height: 100%; + min-width: 320px; +} + +:focus { + outline-style: solid; + outline-width: 2px; + outline-color: var(--blue); +} + +img { + max-width: 100%; +} + +hr { + height: 2px; + border: 0; + background: #ddd; + display: block; + margin: 30px 0; + clear: both; +} + +h1, +h2, +h3, +h4, +h5 { + margin: 10px 0 10px 0; +} + +h4, +h5 { + margin: 0 0 10px 0; + font-weight: normal; +} + +a { + color: var(--primary); +} + +a:hover { + color: var(--blue); +} + +input:not([type="radio"]), +select, +button, +textarea, +.button { + padding: 10px 15px; + font-family: "Helvetica Neue", "Segoe UI", Helvetica, sans-serif; + font-size: 1.2rem; + line-height: 1; + color: var(--primary); + border-radius: 5px; + border: 1px solid #ccc; +} + +select { + background-color: var(--white); + font-size: 0.875rem; +} + +label { + display: block; + color: var(--light); +} + +button, +.button { + background: var(--primary); + border-color: var(--primary); + color: var(--white); + width: auto; + cursor: pointer; + padding: 10px 20px; +} + +.button-outline { + background: var(--white); + color: var(--primary); +} + +.button-outline:hover { + background: var(--lighter); + color: var(--primary); +} + +button:hover, +.button:hover { + border-color: #444; + background: #444; +} + +.noul { + list-style-type: none; + margin: 0; + padding: 0; +} + +.text-right { + text-align: right; +} + +.box { + box-shadow: 2px 2px 1px #f6f6f6; + border: 1px solid #e6e6e6; + padding: 15px; +} + +.loader { + width: 16px; + padding: 3px; + aspect-ratio: 1; + border-radius: 50%; + background: #aaa; + --_m: + conic-gradient(#0000 10%, #000), + linear-gradient(#000 0 0) content-box; + -webkit-mask: var(--_m); + mask: var(--_m); + -webkit-mask-composite: source-out; + mask-composite: subtract; + animation: l3 1s infinite linear; +} + +@keyframes l3 { + to { + transform: rotate(1turn) + } +} + +/* Custom */ +.main { + margin: 30px auto 15px auto; + + display: flex; + flex-direction: column; +} + +.home .container { + max-width: 700px; + margin: auto; +} + +.logo a { + display: inline-block; +} + +.logo img { + height: auto; + max-height: 40px; +} + +.home .logo img { + max-width: 80%; +} + +.intro { + display: none; + color: #444; + margin: 30px 0 30px; + font-weight: normal; +} + +.search-form { + position: relative; +} + +.search-form>div { + display: flex; + align-items: stretch; +} + +.search-form .input-group { + display: flex; + flex-grow: 1; + align-self: center; +} + +.search-form input { + flex-grow: 1; + padding: 10px 15px; + border-width: 1px 0px; + border-radius: 0; +} + +.search-form select { + background-color: var(--white); + padding: 5px 15px; + border-radius: 30px 0 0 30px; + color: var(--light) +} + +.search-form select:focus { + z-index: 100; +} + +.search-form button { + line-height: 0; + padding: 7px 15px 7px 10px; + border-radius: 0 30px 30px 0; + z-index: 100; +} + +.search-form button img { + max-height: 32px; + min-width: 13px; +} + +.page { + margin: 30px 0 30px 0; +} + +.word { + background: var(--lightest); + padding: 0 5px; + border-radius: 30px; + margin: 0 5px 5px 0; + display: inline-block; + text-decoration: none; +} + + +.entries { + padding: 0; +} + +.entries .entry { + background-color: var(--white); + margin-bottom: 30px; + padding: 15px; + border-radius: 5px; + box-shadow: 2px 2px 1px #f6f6f6; + border: 1px solid #e6e6e6; + list-style-type: none; +} + +.entries .head { + position: relative; + margin-bottom: 10px; + display: flex; + align-items: baseline; + justify-content: space-between; +} + +.entries .title { + margin: 0; +} + +.entries .title-wrap { + display: flex; + align-items: center; + gap: 10px; +} + +.entries .audio { + display: inline-block; + vertical-align: middle; + cursor: pointer; + transition: ease-in-out 0.035s; +} +.entries .audio:hover { + transform: scale(1.1); +} + +.entries .pronun { + color: var(--light); +} + +.entries .defs { + padding: 0 0 0 30px; +} + +.entries .defs:not(:last-child) { + margin-bottom: 30px; +} + +.entries li::marker { + color: var(--lighter); +} + +.entries .defs li { + margin-bottom: 5px; + position: relative; +} + +.entries .defs li::marker { + font-size: 0.8em; +} + +.entries .defs .more { + display: none; +} + +.entries .defs .synonyms { + margin: 5px 0 10px 0; +} + +.entries .defs .synonyms a { + display: inline-block; + text-decoration: none; + color: var(--light); + font-size: 0.775rem; + margin-right: 8px; +} + +.entries .defs .synonyms a:hover { + color: var(--blue); +} + +.entries .more-toggle { + display: inline-block; + text-decoration: none; + transform: translate(0, 3px); + transition: transform 0.15s ease; + position: absolute; + margin: 0 5px; +} + +.entries .more-toggle::before { + width: 1em; + line-height: 0; + content: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='rgba%280,0,0,.5%29' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"); + transform-origin: .5em 50%; +} + +.entries .more-toggle[data-open] { + transform: rotate(-180deg) translate(0, 3px); +} + +.entries .defs .types { + list-style-type: none; + display: block; + margin: 0 0 10px -15px; + color: var(--light); + text-decoration: underline; + text-decoration-style: dashed; + text-decoration-color: var(--lighter); + font-size: 0.675rem; + font-weight: bold; +} + +.entries .defs .types span { + margin-right: 10px; +} + +.entry .edit { + padding: 3px; + display: none; + text-decoration: none; + z-index: 1000; + line-height: 1; + text-shadow: 0px 3px 3px #fff; + font-size: 0.8rem; +} + +.entries .defs li:hover .edit { + display: inline-block; +} + +.entry .head:hover .edit { + display: inline-block; +} + +.entries .tags { + display: inline-block; + background-color: var(--lightestest); + border: 1px solid var(--lightest); + border-radius: 3px; + font-size: 0.75rem; + line-height: 1; + padding: 2px 5px; + color: var(--lighter); +} +.entries .meta { + display: flex; + align-items: center; + gap: 10px; +} + +.related .word { + margin: 0 5px 8px 0; + padding: 5px 10px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + display: inline-block; +} + +.form-submit fieldset { + padding: 0; + margin: 0 0 20px 0; + border: 0; +} + +.form-submit select { + margin-bottom: 5px; +} + +.form-submit select, +.form-submit textarea { + width: 100%; +} + +.form-submit li { + margin-bottom: 20px; +} + +.form-submit li:first-child .btn-remove-relation { + display: none; +} + +.form-submit input, +.form-submit textarea { + width: 100%; +} + +.form-comments { + margin: 10px 0 45px 0; + display: none; + padding: 15px; + clear: both; +} + +.form-comments textarea { + width: 100%; + min-height: 200px; +} + +.form-comments h3 { + margin: 0 0 15px 0; +} + +.form-comments button { + margin: 0 10px 10px 0; + width: 100%; +} + +.glossary .index { + background: #f7f7f7; + margin-bottom: 15px; +} + +.glossary .index a { + text-decoration: none; + display: inline-block; + padding: 5px; +} + +.glossary .index .sel, +.glossary .index a:hover { + background: var(--primary); + color: var(--white); +} + +.glossary .words { + /* column-count: auto; + column-gap: 0; */ + column-count: 3; + column-gap: 40px; +} + +.glossary .words li { + border-bottom: 1px solid #eee; + page-break-inside: avoid; + margin-bottom: 10px; +} + +.glossary .words a { + text-decoration: none; +} + +.pagination { + margin-top: 30px; +} + +.pagination a { + display: inline-block; + text-decoration: none; +} + +.pagination .pg-page { + padding: 0 6px; +} + +.pagination .pg-selected { + font-weight: bold; + border-bottom: 2px solid var(--primary); +} + +.pagination.top { + margin-bottom: 30px; +} + +.pagination.bottom { + margin-top: 30px; +} + +/* Custom pages */ +.page.type textarea { + width: 100%; + min-height: 400px; +} + +.page { + background-color: #fff; + padding: 30px; +} + +.page li { + margin-bottom: 20px; +} + +.page a { + color: var(--blue); +} + +.page a:hover { + color: var(--secondary); +} + +.nav { + border-bottom: 1px solid #ddd; + padding: 30px 0; + text-align: center; + margin-bottom: 30px; +} + +.nav a { + text-decoration: none; + color: var(--light); + margin: 0 15px; +} + +.nav a:hover { + color: var(--blue); +} + +.header { + margin-bottom: 40px; +} + +.footer { + padding-bottom: 30px; + text-align: center; + font-size: 0.75rem; + color: var(--light); +} + +.footer a { + color: var(--light); + display: inline-block; + margin: 0 10px; + text-decoration: none; +} + +.footer a:hover { + color: var(--blue); +} + +.footer img { + max-height: 9px; +} + +.footer .slash { + margin: 0 10px; +} + +.footer .credit img { + height: 11px; + width: auto; +} + +.footer .credit:hover img { + opacity: 0.6; +} + + +.center { + text-align: center; +} + +/* Homepage */ +.home { + display: flex; + justify-content: center; + min-height: 100%; + padding: 15px 0; +} + +.home .header { + text-align: center; + margin-bottom: 40px; +} + +.home .intro { + display: block; +} + +.home .logo { + width: 100%; + flex: none; + margin-bottom: 15px; +} + +.home .logo img { + max-height: 100%; +} + +.home .search { + width: 100%; + flex: none; +} + +/* Autocomplete */ +.autocomp { + background: #f8f8f8; + border-radius: 0 0 5px 5px; + border: 1px solid #ccc; + border-top: 0; + box-shadow: 2px 2px 2px #eee; + text-align: left; + z-index: 100; +} + +.autocomp-item { + padding-bottom: 5px; + padding: 10px; + cursor: pointer; +} + +.autocomp-item:hover, +.autocomp-sel { + background: #f1f1f1; + font-weight: bold; +} + +@media screen and (max-width: 500px) { + .search-form select { + min-width: 0; + flex-shrink: 1; + } + + .search-form .input-group { + min-width: 0; + flex-shrink: 1; + } + + .search-form input { + min-width: 0; + } +} + +@media screen and (max-width: 720px) { + .logo { + text-align: center; + margin-bottom: 5px; + } + .logo img { + max-height: 42px; + } + + .main { + margin-top: 15px; + } + + .header { + margin-bottom: 0; + } + + .footer a, .nav a { + display: block; + line-height: 1.4rem; + } + + .footer a.icon { + display: inline-block; + } +} + +@media screen and (max-width: 320px) { + .search-form>div { + flex-wrap: wrap; + } + + .search-form select { + flex-basis: 100%; + border-radius: 30px; + padding: 10px 15px; + margin-bottom: 10px; + } + + .search-form .input-group { + flex-basis: 100%; + width: 100%; + min-width: 0; + } + + .search-form input { + border-width: 1px 0 1px 1px; + border-radius: 30px 0 0 30px; + padding: 10px 15px; + min-width: 0; + } + + .entries .entry { + margin-bottom: 15px; + } + + .entries .defs:not(:last-child) { + margin-bottom: 15px; + } +} diff --git a/static/thumb.png b/static/thumb.png new file mode 100644 index 0000000000000000000000000000000000000000..058627b0d52d22496ab053bb2d28f33a87eb1780 GIT binary patch literal 23451 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 jBu1H|;V?)O!58~u+ur6jehYU1rc(w_S3j3^P6 \ No newline at end of file diff --git a/static/vkrishna.png b/static/vkrishna.png new file mode 100644 index 0000000000000000000000000000000000000000..2e8be5b92a29538b0edc28c763819659bc92618d GIT binary patch literal 40550 zcmXtf1yoes`}NQb(nt#kh)O7(A|c%+Eg&u3tsouJ%}95>NT(75(jX0j)X+6F1AK?y ze|@gYQfJ-aocr7-_ueN$P30W{E;TL$0wIu>lh%MhP-Gu|ura|W6f^us;4gI7xAI!p z;Ex}+ML76Bj+5MbR|tf#=ivt>`8gpC`0%ltjGmjOqoteY2bYf!Pft%y8wWdA^AAoR zIUQZBG7m(lArMB0ytJg2SJqy;Z_>v(Bl`1w*X2>4Q>6=QS?U;G>VM0=fZq?$wypvN<&oS=G#z&j4GF`H-F#C9zc_xjP zx}z8WGYye_J)z{OJA>$eTEXLX9A`W|p|0gEtz{0{XLr*ryB#A-R!~j%4#aKF0wd!J zVeO9}yjUxecKbLGwrHLUeLGcYb+<22lqRe<6mRzX>QJ}?&BH~5e#gvwf&|l43qbTB z%n)UW6r>!Y6T?&POj}KDu2We*bM-iAW+Y3fu6Y?o>(utaQtWe3cU-DTKyyuP?Xeu0 zjAPxjxJ9&gX8rjSh~JALmjE0+tfR>K^XGkO)sV|bp3P*z*iH@3)cey~7(LD2(M?b* z?Pn@9R;TTW!W-DyaceYB++*{Y)2I59q2Gm3`i_#SBSXWl}BiYw}^VtC@r7uwnvY8)zW+jutH>d)u=#P8p! ziXQizRIrhA)1aHRMLGTZ^|cYr3%5&v$~*`4i2c`n7q218(Tku_YV#a1|Laq{zBI4t zMBLfHkf>EEa~qp&<-Rnc_jVHKE14)SMtoG>(UwooFGuBVyO&DOuCcJ%qSV5E6for!tln`V?{rSc3jgw9S$?UaYr*T^67cXBX zqxgvg9ikpdLR{;z$Bm*0Af0xVw||@jk*TWUR~DYrq_|D~=w_l{yf)LVBF}to4IqB0 z_2yt4GOmz%bJ&NPSvZr^~@&^I%<$QWpiV6e@UlF^m$qrNmfr^|2N8IIM1e|zTN1Ek2p#gF4tr8fZB0u z*g@A7a8jp&G00IT&r)jjw@5-fqVgHW1!7u#DcM>NyYt+kkkO1*V>vv3# z*2MqGmi{GzTt0&oTZ(1}t$o$D+rOVaytx0VsVX*=b!HLEjLLJs!)elyb?DK`@Q$%3 z=oY38ksw+LlyKb~a+*#QQUR-kH31(KpfSJGg&by_8KNF=wBfHK&uU0o)%&O`p0pwPSlmrQ6Eke6p^1)h~{H2WNFjXV@j ztWbzJkAT3%ve-#K^X+@pO?I$t&WBhg>TyN}LcHv!U2(9R(Aw-PZ-3TVjoxK~N2>v@ zL}u9G*F3*_7Vua9W(Fc%m!tZoi=GklD5_9nyO_auuXehE%~g*$oCgCw3YDOd8JEB~ z>aT#4JgOnO1lh#gYBc9|uY%2mia30{n@!?sU}$0a?z|Ia1^!6G2{l$gc6z?^;`j4v zWOiJ@Y5p468TXS%`KBO@K?ura|mqF5{D57w-E*capFu*1VGtq`O$V{cIF zqeCpGZSV?~MRp@-DHhKnk9#RiDuAg?UiJC?@5uzwFSQ{IoePv(E#(o%tG!W&HPd&P zL7xA!T^KeO%B7-bosIuY#snp&;U&M_zBjrCKK9YEV2~pC!;pR^ZTYn|ma4Me5-iIW z!_yfvrY^$BNZ=0X1PS|8LeK6{IH##xX&Yp?s+?iVdq;@pe)dsG_x!%LOiXk6oxfGY z@&Fvc;EOzl%~*-W2mdlcK;84LRy)y;j(~?`<@R9M$EVhNtX_G*`1(vm>0A9RUOjG% z3-X7h_N^T^b^-^unFLSI=%kB$mkpwJ07NZmS9@K~pz~Moy1Hyde-CY-66vsPUld5+OncNZNO?e}ieq;smY zyY~f!g@p_#M>vaLC5vuR2NWWlMCr|Wsg=KdCrNfxNZfLx380r*2;?xw&trGl;f~D1 zA<-eXiIx3b6^^ay7$G{rPT6y>SWEMa(;96)B9oQif?1`tiRCWnB#|bKUo!& zZ8nr;O~hIEf`Hde3UVPGj2t&^DR4B3t3&TGVHohk;0ODC$r#$%rHO-45r%;)JkNUd z)|xki+cSoTogxZYkP07@Dn_>7;+4vAJe9Ul*+BMyg&I5AqMq#t5hfaMrt-Rr(9q~; zt2633-94_szzVEPV^i-I{=eYa_Xx!6ntWIWRX$#lC}F~s`%ULEl<_S`-#@3V01@gK zZd$^4@C!MTzYSZ0_ZB}2SARhP{xQDo_6Wvva@D5km#);epULW8t0&!V{Ek1<-8I){ zdEbMFmQbBDRlQUTd=Vw2oy zVFjC`@26={eLdfgg-=!!8tNJw^$VYXRpC+v&y3jZt4SnZ3ndOPLPxu)f{m-g-sT4R zv=iFB1oqs7!@*Kn^2Y3BtY5_XsFD<(7W3E5Rru1$xhy*ocZEIl8?S(CVZ`)+-kD`qgt&YAG5 z^k}@zF{J}H;aEMPRD1p?@L0!Q(YE!GhMZx>)o^4K_2R$dvFgX+&L&4yg0c52VA17= zVp=`o^UCuJ^X;CBg_23o3*O*g*v%ns0ZPBv%pWo)LAVYcc!TPUr!@8e< zRV(VP>l;!ibK~M!-N|HtM_Th|s_<$2)8-%teup0>1ww%g7el~99Qv+M!+DL$eDR`> zDofZM_v_maOdKN@)Jufu&0G)pm@7-n_Z(F9{{7YdJ6+L>MOViW%es4tt_4f6)HTfO z6a7jG;p|vum_uU}cv-tM)#mQ*Q&(4!y-Y66w5x(1cj6AqhZjaiA(jqgG9$EBK_MZ0 zz)^S4#%$|>6B=E|9)zv`CzDxryFT64 z1xaw>XFM{_3nXh*!m#c@w3YGyB_iS#U{YX+m>7bKvF~zqb3MD&odIV|@MyY!6MYk!x+Zv6_eB9^Vf;W*RgFCXSl+2)R0oBI1NU7@!wae`g6EFGZNqBu$8*gtiegu)`pV;~3t zTY9@Q+#0$)^^KC|NEV?4CY;yMQ4t0f#8dgCUbFG^xr)dEi&va8JgI}t%~*RhBNsmH zjsZKR#Tmd29Goq}oo#GNLD_fHtFU#HG+DX67OpbsJkVmAdVCwb@3BB^T&nf9ULT`I zIRV)5>)W5{)k@GO-Zt;Qr`!_jtLNhqcS+y!;v^C~V1}o)_L~wZJ8-;%luX%@UM1q; z;W<=Q^yADjP??LT4qHlG{$Jmly0jwqXl-IbgRraf4Lf4tHTQ7Ql7qRqIa+ynxt_6c zPWX$98-F)pI^9x@@+sO{@+gDhNWZ!t%ZF%P(sT3?G3fGn8WVp~KB5n3k+YGT1IHJK zdVYR_>C&=Pr5TTZUc+P=5I_&fg2q3SNms&rcpKdL(zG?6+GTU4i1e&3hqIs?ng)kcb+4YNh(Uqo-WAdUZ2TB?mnkJVG+$!UCkf|d;P8hddw@twNih6z95%u@g)Kidm zC$~YfqKf`fPN_n9GeAyX%Mls-JC<>7+t);h^-ND|VtB)a)3%EE#G!GQ>;o;VWM&t# z65eK9-CA;O%H0JnB(hDjzuEAhC<_)O_L;BG@9=|zhp#mb9Q0|+)|Iz25L^)l+HbfS zDZI(mU@K>5?x1$1=1lH;7}a6LOrxe*|AKT8V`}Gn{6gW54=dRgoS)Un97IjyF8Ajv zmGe>M8*t`Z>ArGnH3B{bnuvGv$qK!NN1%();vl#3N!;RlBFg)H*7dZae%TL9QXmSM z4#J)I*!2y6q&A8Do=W6X6Y)vJjwN zhGW@3f1Pq;W56vju~#m0CoV5Tl2I;qqCN$y^-nZ_US;%@46IOdqXvO`3kjBhEPz}pw)MP#<4;ZmOPW3Zt`PmAqC(!P%g!hYme8-deNIj8ZmVa_?k{ANkcix}p)Ah|B+%SBDIjdk{1$Xk; z!RDgW~y3CxU!f2+Um}JnlxRA zC*Z&p`g{X%HOk~R*!)uMs%B0K6wKu3x`upM<+^&L6)eT#Qp<5A@m6;_nm#`|Kh({+ z8MQQ9eC|9~)Hr$?bLsa*iK(w(nH9rgB5xhH%Ak7@G#$JB(9Ug-)-)&-wz~SzavU_n z>EC6c_(rBe{7k3I2}c%TX@eU97@x@;@w6g9wRp%+*SB{ef!}P{1J2|%CVrTFfswo! zHn1Rg1+$=M2`1Ol!SC8SDeVvvA+W)9p7)LUezRah$sq9wdsgLgx?i~U^xIq!W9kddP+3^%>l#&Fk2_FD-7^h43Bu>4H(S3kFyFDT%T72D#PS|Mp^{ zG~-vah_3^LB@~oUEza;1xAa_Kx2_u!n5I;wC=L#&&c#G$zGXX8qxEiM%b^6^mt&#C zqLwYVTWnLVBr?PxkCwl7xeaRzdTKh z%u}`h6n(a6r%vH@3D(pfIMPo1>0QXfL?wqMoq<;aRy&6n}M7Aw9`lS=Hb=Uw0d+d z!`d$#&X$gbKP2cSc$bUw8wDxchMkt5-P}fm*7^-6BNNWM{ZU#Kd*x5~NJQ${HGiGM zPUEsi%j~^5w@k92P|p|vFIUi)aDFVE*;RIXj63UUfr8utld;z|W2%gxn%Ul&55U6c zu$o8LARddx#>O6s=?x2?PJP7QC9ECKzBEv9f5+DomD00uv%_ zn!Lp_%B)d3?eu+u#%TmkDKA$9WU_;K4ka<-pOSOlXuM+gMB{H)=iBSE2;1}^|DPgQ z!9SNVj`FeUyV02YK-s+j5N?3ljR>ddH34P0zJYAF96KS;1oQ`*otM z8c-x%uvDGCH#C}n^oT4dOXQU)>`ArYyy@usQR{(7zt1_q$YFMW?sNc}SCH6Vw)MK3 z%}%_GHP@A*tC8UDL+XN1yZ_Vd3K#c$bR+Vu&6#=>930leRz~G*p_}`$qb3%fm zRPha#M9%-!^lxs)WQb!C$1_`UeEBgp!9eoPg8hUt13#AZ!N!v`O9wWYdUu8nvm)Ge zp-EoGGU+OQIVdv?@<08)>LQ$3S80IjP7rX;dD4cP?YRj{e2VtoV?1{^{9YK4tpYn! zkIt*yP`nLN;7oPhG|8=*I?al)@Rv!GX6pD)3re$Ge8u5@Q*dEZHmv*g4p~$xrX7EG z{B$^wT2NMl?-81U54|8ijarC~1y-o1XX_Faa^!j8`|jp$#!z4X+O;q3-ly}zb+HTC z1^PKKX6ck;m`7{!1pn-E4;r^6JfkTa9TiASEHmNVO3*SN+Mm!`<^8(FU_g@e{p>w6 z+@=GT{U^7Y zpbtz`txJ8NoAqhW8O&Vk#WpqjM8Y3#`j?5jxgdx{o+ROf@Rt3ISG%Og>-qL`8%xIt zKmS*qQ~sCY3KDY*0{Lf_po}p~ah$Wy>&wUg7GHUz7QS}Lu)LDu-`$Zhk;-XwEg0lD zJL*p>@J(-ipC80#O-IK8ryQ&HEM;Kb;4KQS=@5ao^A z`JWxN2Z~(nKTIoc7jF3OoMo$L9vXv=>#1r~$U|CR=Id*cDYyPR&VXYN-zY5QG|Q+~ zQ~v0Gh-K{Ndw=0qd4q^>%1~IWj8w|F;ng%UVSA<~!QPFiI7D2v+080?V&+ewV4;~0 z1>OVLA39rod=W!+b9=XpQsYP}5zF|KkD8#OqCya(e~S&``QcT<@1nXcj}9{c({bku zc~CdA)UQqm6{ZhOau_7^DV$KU5^GV*7yZ0QW)<7DgQiV!m7Ck<<9?F+8A+M3lB|I7 z_3e|iNvx<|_Q>V3IW| zDb&CLh=Nf?ubDH9jGDpbu9am%4zG(n=?(I4gn09wbeb^qhb=Xf)-zEeT{^=)GXBRY zDtryg%uQR8#H`(zsG~1fhCedz-dO_kud7)b!1X;*FQ?n-FPefWt^bDtNdb7RdPb^H z<0l%C=n6$O2SpUAA_2qzJ^n||YnZa8%H$Us`5i@xi`vAKOp0*%o4?DBBt_4Lc|Vp& zA10ba+n1R)q;`o#G9$>$Mv>=Krz-e4meR+KgKTw*7E!_RmPKxVaep`2&)m z`o)GNJ%l}ywai?PSd%09i>;_B7_R{i{iB#-Cx^tmap6`l$n#($%@YqmNBo(3Mn>+t z#nv2zw~>`PgZ1qbQJ%%Wqj*0GeiD~QZ_Q*J;N564K!|_JTDp9c7%MfJd@rZ*%?9T{ z-c&Q<{}4OddTL=`h8K5>#xUOVXetxG<6hh#=zRI{0Y8|gW`31{X)fdwN74TQHvyf8 z*UYi9`K1awI?63JMes@{`LBNu^jfn`GHi1;xuz5t5||81l%uB65<5l(V~v=^4Sr$J z(pJ<<)cyFO^|$;OtO4o)5t?AV?%I-ajYm1sk(;UsDcEplmbwMH#NUv51g{e!W5C8D zR}NR7WjJa*e$x(d5x?Ges=RFje-g7^^eJ_nQb`ySigbG%%Cb@NnTnwA=+f)O&hn?m zh43}1DOCtFsDBp5|5LF<@Vak3|I3>=A9%U89l#faZqF6d#oA@B+?Q$4 z^?5Z15Nb2$X5U3vA8Mx%t*O=08ZM?<^ql_ZSZ~);u~?Y7?w2CIkursZq0s_JAFqZI zUX~J`VF9sDhR~kwdcm+n#QJG#cG5?Z+(YTu$RFmDu2KmF??+~)=jqVQP;S0-UOj+R zhi>26F9(5p^@>r!t3v9h<4qbDvi1BTBBe+RlkvChPKUP&@C0LyJjw)*warO*PHtH0 zTr-}DDWC0IP_X%@$j;iJ=QMCFSy4Yjw8cXz>m8IG14jE8P_QCN=j_kl9k_iHVd|qa z_WD5IMW?#z5L&-*6?Lk9<|C%pI@K-$kSz_~KEcizhv69(gm*E^9*gUOz)WI4`!k|% zt_XOBwBY23`b2*^}j;NIL+Xf^4n5K@z_RTx>~nHoQo^uXWmT0rpFQ<#bw8_ z^RY3owb4J!m;YZ2z<}xm`|k{_J01T4Kz7;A5W%(lTh{9XZ|EI zoUWyTz>!jx-~X?2toAZ9o5R%4Rd+PiA@y|bhq=;CjB2R-PO7>?(cV$3pEyH8yH)U& zJ^u|FU-v24*5(el9|T0=5{ru$YG7e&;_XDHd#x;_^RY>A`B0H>*7SU|qk zhJJE*~8)ssY;;>y2->C!gu8F^E>qj^jqk$j>d`K z5(%j{_)JN{tgOh<>nDDg@*2|MLbtHrfY&rutBTNvDKo{gD7|L8T3DjT3xpMAOu*$?c0HF=G8R-||KcR}e}1P5wrn;e?Ec3+_4SbxV1@2N>dzZUyd0ybQd3gI zu~&8-;f*MX-_0z7v9CAv2(j&Nwg4xA8T?cEuKPz2{x@URRGr+srsODn#LdLCrM$*h z`5lkqi#t7qSR3~doBA1fInC0$V00x0kRWBiG^$8T{G<(w*f-je>^fl*MNX6t|7CqHNxX)X)wBP%% zxvVeVo;7|R(6N%f=6d2`SE)L--6G*&8~J=~Vgb*H0jgCSEivU3ig{%(pSwDp-{|co4%s8RE~c zN&T7RUp?_;O30Rb8pD#!H3OHum!uFAWul<;G~%soTBRCRP`Lm4=l!X6eft^idG1psj$DrEpG zB`$AQiEu_)pffH?-d);REb`BhW|ZGN{ef=7Fgav*FPJcN!mBA{lOry~`fR1(YTGY~ zY|3q9!=;MBoRd=LGL0{qXW2Kn)g#7$sn4hVE|vKA{W;m`V;v6iiyTTgAkOl~yRNTW z5U)Li>D*eEB7zhXN*fbbH3~4^AU`3!i-~cECt2M2_g@DF+IUA!Zq_7foXPWSd)?Bc z1m+-JM@LI8(=B`5yU;9SNvCYjB$|^M7AH(z#;zHp6rgOc^v>AUFJ?TMv-f!GZ|~q> z29VPnfPwomrF}=w`^_<2p`wu#X;bz(f<-Xy$9E;_&qe7qcb7IrovMa+!;+&!|1xjI zYp*u1cwJc1_1@M!&5pIz=RI4sQ(HQh()wHZoD;XOSRbbLHkWVDxqk(g!RSUlrRFwWxlx zfn}fnjT4T8nKz!}DGHzwVhnkS-rX%Zv^_U#0|E^Cu0W3kO8#IGYHi=_0m>>>G9&t?=HOpaHIn zEVYYnsolj$m-r)QCzK4K*1XG(^ImU!^7wFih~x@3h^`l&J{w{=8^{a|w9g7Yq&)3Z zWWM{sNGU;sj|qAs03*76%=u8?CG}NvdfsTm^swyr5*1>}lOGzyn?|EiC|S5m zGmd7A`vf4HH-tZb(m-L=^zh1c@lC+EHCt@Fuh3=;*uZK$4lG6}G3h(x7c^;}>IEJq zmQ6DvME;s0Z&{NSS(nI=Z(_c{V+A;4%UPRpd=t!b)v(pKr9x>8&qYK&HLjWL%ifK8 z?)4U+CP=!r=)EulJUYlD0Dc8?VQC*AOND(BR}x6tPz0CtHRKm~S)NJzPdiA+Z*z)h zS6w3h98QvDkaY5gt#r&Ciy`9|3`l@FrlrU<-FcljT@wv;QDu?2Tbw3tj zD0F)DMtrh==;H9|V>Im`TM6$}siFXPS}yF3#9uE_*-|YR`6*s2plJ#rDLR>SjVD7t zxlNcK4u}7ekl1S)VI{GbqHwZStJW!JKtD2=-j2EdZ%=VdM*Kk~pZv(HrsVBZL(?+2%YP+xyEHjk+jyU8?4kzMw zuAf#(OOh8?e5$q7x13T`UiQ9BKzs{2<$WU3xfmCM(-r^tBL7a!|J;%6nkHj(5n!rT zDCo4*esH+>Me{_Ws(5-!$Nrzr6rN3yiu$Q`s4j&2@wXMbYw9`mu%can{aY4bYI;eQ zeL2CI6!7+U)kmY=LDLFkhRocC5xh+E95^N8g9#BOgp7RRr55^HbaQ?i9KxYl$vV!6 z8>~F7-#GNb?zhdCx>_j!CP)|lPDZRF&uH!bm?$3?e1DWIKI+QYCl#ijt9Hp9v@Ew^ zx??h^f0KIQr+`AZlM3Fub>l)TQZA(J^0CEtq8Ry=u7<}M6ewrIHUwoQsFN$${%O4O zfaL<*Er)|uVh<-^t}MXpy8d{zRKP==4J&otCa^_icX{IY6!G@~-zV|~Y;Iw)kq zKCG+l$&&Xr7Xles*RIp_kEPYrPID|P3yiy2(fF}Q=_qXYSF2pZD-p;+RBR?Fc+I&Zxlxiy`C$E1_<+v^CnZlH#c*l*SrGmizp!W?{put zKvp=l0*VwAM0_+i;`O`FF^2 z6#(8Ig&wA!-a5CCFiA`%QIXU#&;ql^db#6F#>B)#6xH(fzV}HVwxm;^w&fEL7;)8i z3PlXV5wULGDvy)TZ_81_F!7QVHfV!JpZcdOL<8BS*K!fr%9~}q)+Jd$kl6mN_T7A) zJi?otM%JZ9GJYapM4G`=3HCj^1QQPUC}^VAQt;4O(w(e ztCEB{h-iP*4VA1dsIvY5)zU|WGqoG|GHaQvZYc?0Os{IM`qQG{io>RNvFHWRa&P6g zxi*KS0+8anEmxM$)?WnUG~_eoyM=;7l89pfFB4s)zZ0@*#L>Zkzz6b^eOwzxMfVn^)t3E{@SBPNS2W5D>GbT`4AQ`T$9XnVY24K zGOqJEQAzma%M3Y}lSWJ2M|PIi4Sy_A%15o8-`wJKz8K&HRH#O&U?B~R2TaSrfiiUq zHPZWs_dHrjf2)a<5nC}vLiOe zE=qxZPsJ0afsJ>x1FK>AWvLx+#gRMIBZE|H6Hw$t4`2Zwa6Wv1j8RZfsFhEt0nO0h z#@OzeAvO8%F3_zwSl$hX!c(4$9qs8r0TJg(Uxvs z&z5OS?alPJRC9P6`rrp((T*&~*_Lw@ygJnkP9rTVtDdvZTXF!@_;=%K=G4ItA3ppf zHsa5e0S;V6l<*W*#HAA~dgT{ze;1GHKqJuPU}g4WI^%({dx!O^yp?v^;iZ#yr4A57 z)iyT^eQ20aiq7k=L}^$B~ zAQ!Fh!>4MS;=O@ExBtabBm7AC;>;Lej);xA$XD399Z>}V!c{KA& zKKD{y>x}nyY#B@?&3n&fhM6rGVHZzaZUCwgE(FkRy%)lh<7}k+n1~H*ML?BFgIG<#YAi>IY2x}3<)e__$&S3d^8EP2$UN%68gli+cm}4 z=FeXh9oLXQM&sqpzttj^Si%fqHm+P;368P{f+M&=K8Zy$L&Q5}?-;Xkm$UMB*ux*S zT+WvuS*h2|x3P<56o@ONG&uq6yWLynQ$x3C#AFfC5W!T^cc1oHpptqZQRnOJAVI!| z?UX>(CR11%D#ZHyYeoIY)1S$VXoQsi&Fu-8vVr#-(EWLs9nwbyv`xCgKs{oFfzM@3 zA`Rx)r8e!e%aDF&KKFOS)_h`osqt&IF5O%V7O(13NLdT_oj9d6dJJ(Epsf-O(2%N~ zcvjIt{Lcdi5`9#Fy?{S2q~7dkDnMr*0NoJK2Z0%8tf{sZK;d73-V2Mt?-BTLaBvW$ zI0umgCP%@Fyxi(3{ivy_sW;JKWCDVR&@C(ZpQ&%6vG9%4PRDDrwE^5GT}W)eK|;cS zcW;{% zDQ$qh0VNc3ta&Pb;Q^Y54qVU=h`|6QxAqf@VX-_gJ*d4`^A3yje-fi?)T5)%%4`rw z)-%ANvbK02gkl?8q#76YBTi`&qM?L&&zPu7OmAN^uXLp(0A@lZ_v8Y(zqwgtH>G;d z>`JpHC|j>D({2m{ATD5{qL8*$j0t2lm1Vs3{X_*N5hIx>OSoDVW!OTj@E$kn^F|BQ zW|Q0QE;&%^^T*!+ZCX1wD4am&=R7KQv634`|I3>9SH0Z~kotiSvrST1`Vq1iCNC&} z1d{IYvVyX2*XOlt0PeS3oNiCfT>V7n*>q`MG08$Hq1rub8B8}f$Jt+3hC(xbAV&mr zZ{?o-B*)2T2WmbkZ~;f5^vqRz!GRJagPS#G{n}a3R`Ssno=*wLBV1(6VI>{ItD2Wxn4fqQe0Yf%Fr7Wohzv$#gIt z!2gE=XEp_@C8l>trTjooA?SU=0z{I|_qP{opRwq>KvoC~=!^p-si%3acU6ZL33I0A z*wAum^lQ^1ZXowS`?gt63XpIAldfVi2!zzGZLyz6GKpSqE@+2{m(elHl<8?@a4ijKj`6%efRkua$|M- z{oRf8Vf%&I$B(_km0BGCcBaak012$4t9#sqMq~;Ac`%fK2x$U0(*3hri8As`8|ij^ z7g%-ek48uYq?edVPx|Wq#d;ilpD;}h4H&s#A(n_wr=)9~v0?~FH=%`9Nf8E%JGLET zPESu~ahSR4nm7DD{d+y#xC(d&J&;p>{X*qP##PA@{QUJR29W9inJq6h0nqROO#)EV zNvreLW|dsidfO{>i9bmos}IO9a^}74J}povTvamKcX=%#5$Dnz4Wa~yejr`>apIA2 ze(TJa-4aMCzvCzq>1M+|BvSP6?SUr&ynS>g&&zqoMx#{=0ZEVg>l1p5I=uwl9jlK!O)4t}7%x{nP zz(kpunLtqNwXpCvRG@uZ8Jt&m1&$lwn+{goBH0T^S?|;s8obv&f0VNMeCV>gziXX>H^($A`2NHpv*}7i;@+7r$Ps1VY z3ozEyj)x&Np)7MKFqxZ2-C$c>O>Mq?gz`Z(gy?1VdG$20%m;xD3u`3_FW?& z0dvR#)FYq^s&87Vr2sw&3KtI*ehr93Agv=Q5&;@i71`cxDU60;hZG78ZL3$0!6T$v zNx%*}@yBZ$V0QDmpaydqVMGhMC=eiYC`2;>QuHjFC)>pv zIVmy&?eN24pUdC69bY_J#p27lzf+CYnXLBzr;rc`B-z$fBu*tYm#{!2jL7eHCh&H* ztH2E3*16AAnk=oN#5A2g;_LdR!22Ujce$$h%g+HlfI?=XpIx?+G9+LS$fD9U* zhcxi8Do|IIrv_~0hM89Oo}B!*J2cEl5)_e{bnd(E4K(btv$Jo=WE=ue!tlEP9XUf1 zd#GT?Ym%!B_*!#U+8n%-RFD;4J_f!po@W!K>vANy3@W5;iiHWj+^d6y5Np&;7a`H3 zF0|N+zlfZRm5!T(ZoBICP#{4i*$h*< zc6N58-D8S$Z9Jb~_LtDkOivpc)LmU&y@?GYI>bD(F@1G;axgcvaezV|f{6~oF$J`_ zAlZT}0dF<)iQ#y&FIYF(At;U`z3{1Y$AUL`in?vAZtlh3la$7X>f=HQ^weI6%;mk7 z;hM70o8Mrr`sVf?#ed5$XkEvGMMGI}!h1Zch%03ykj0yxAtE#W1X$ZDA$9O$mbm}? znR$gydCjyiDBC4l9KgpwM7ZFk_B!t=xs8+q9afg&NOpjl5y?eQ1Sx5xgz2Ue?N<0W z6{*s;Kf3%UkgtLArK&QSl@8{-msglSjtyQdskgHN`k-yTi z1u$?QRU44ByaSLoD2FH<2Y9n(dp7);z#D+SR#{mBFWS-3boM$(!&gnkuE{oU2C{ti z$eN}mDyHc$^xvP~L%gmwQt?10iyLxKfYGq@f{faBy;BZaN=~-8JDw_$U(;qUrt$;7 z*@mbkAfB84aQRB~HX`kiZ=y2h@nsH&r>pCvzieH~O@Y~|vc<6ZpWE_@$u&qrYV1@Q zMW+;z_A^)3?S(&^HCko7aIE0Z&&@3&A3>~SUGJ3M!Y>z71c+LMe#jcQK0EW;b}Ves zMl}N754f{{$)NPL@rSc>4+oJXDIom({PaA1=wUGNC$ZoF3W49gorx=7gFU(=sXiC$ zmr}O9l{{re>`KCMQCaOL`s8_otdPVj_xX>qld7}OZ#UnsSDV^qla>5mA>f73tLF4; z8h4zM=aT+aEu2yO-D4V}!&p<&PQ!r(uVzLTJIvr$T*(S55j(Xhphf=ymc z_~(ib6`Z+V8c&sbpwE!w+nm?!e&gwjHwLaau!)cSMtg?Dq$Q*>r$=oF=5oxQQ;OxW zep_8p(S&ZBp#~HwpWgkl$mBR%du(o~O9v5n>VcMs*F&lxd`hbE;pr7!z4~(r#aE4q zWF?rcyieKW=gPeIpL56bOctCC#6uJJ^qQqyim1;n2K~1ePic3QrGh{BR8UJ!?_UWZ zMs-0*2ZX*ycE}EL04?R=+(B+5qSY-WYB=942K@clgTja^J|=a zB|_b^V#FVRC-I$@G1p}D`_Ppe1^?G3!7^Etw_)>a2`M2Bs(6C5-_MlH{H#4Rg>uFM z1E&9;yqz(QQvab{JxCv@v{@vi_-d`ULXublJ5k!yrc6~kDKMAqSeuk7aeJ$6@R~QF=0wxzWzaXRY^sakF zRh7!OlLEc@M_d|T%>u+h%ylxP1rhq14|CBrXB>b!lQOv}#v$+a(hDf`jLZG5qCU6mL4U@+M3Pf^h0#wN!c&oe?A5x=R^O2NI_UUV%^! zQ-aH*!>aXRZ!B7l#l-sQoV2qSvCI|qoT~9CA;9t+j6t8mBwFWcUc@LrmWz$Ho-jQ1 zkM3wrU-v!ba>($aeK%?6ry<8=gwe=0ce7qpR3?6Dz!w47y#O`sFAA~q^rRrsu%N*#3in6SiolU&dK%G34W?h+D+5 z4J?jDI^bW2qcpgDOkI>eLdTL!OKjx`@2E%1S}qp~XeHm4TMA+}o}tN7doe|@r)&J% z?m%L{g6HGLte3zJThZN?>^s$ECYCvs`F4e-bR1ZujH)DGV$mhuO=UZXqF}|6zK2{4 z`B1*mz*LIpe^iT|j(0A!zXT%AFmq!#PJQ{dz1NOL(>vh&!n!8z zCjv@13QW>>{1H^QnX!k6sm}a_AJ?zW{Ol-Cf~0~?6%Hxoth)djinDz)Et?;2;1_8_ zXS;)%rbZ2Mu#Gvqq4|8u;>5SDt^Ta^%6440wSz?Stvbmu>}aaQgJhz>L5%YymJ(k0 z<(-m4ru4TmULkt&;(&u?#spM;g=mE&d7ORTwTPOwpSe9^AUuCnSUE3#r)({I?B1hU zE3Ljxdlvi?vhP7Ntq(>)aQ+Q2!P2i|Ei#gRbstW?K+zUaU@vPz@+1u<V8j+AR zT6r?=pA7#dC-}aF8!n!{-86|TEJIEF^Yq`1)ER5i=AhPpinz1Z*GV04f?(SOSUFr| z#i@&`E)7Es97~O5_WEZhAt5VOSx@?m12~mslTP^u(A8)wK$-?rF_bU`|JWh0RnS9?2w*oND(He(`bz6N$Q5s}oXmiXLFolaZvwKr$Ul=uk!=(j>yw-Sq5 z!#0n$V*;o9Ors?MTRrtMWV20XTt^Crvw@dBZb>7Hx07n)oVj%8&xL>J4%#0)6Rv<| zS`}u!1osU60uD<^DS&q8>|3S~O}Ic3g(pM^nF(spuLRttYSN!lVOEsuJ822#H}Fz; zA5q2S6uUyGoBtSFDO`HSS6&0USPdPcciK_|=kVjc+wuZQaO+PO4z{fY=FgpfeoDGP$>=u zXEwpN{lw$UY6Zu`Q;nPxCfwy-0fA$-iWSo{gWbF{F?dmogSXU*2k#t?iTusen6kIG z*e$H<YNI77 zVHne#(33OCOovGX26t;=>*Ugq*hT*0>GYazq{-j_Pb0%4sKJ=i~u4)wz0}Z77 zf)QJ~)ZZ(}e(5Rg5qTL$h*NlVR~mZIA_D)`{Ba{p@ly<=-d|k}3@Rh=v6ns+V1dEz z3Hu4f)a%<;-LUqCW77dHhsG4KWz<7KJE5yeY7>9L6I!N^b}Ygqq^=&v=rA#+I&clZ zWFxo_fB>Vk;C){7D;}Z4cyi+eWEKBV&6|0cHx!6W;@&?z09Z9rb_8G{?TU%{uK=q_ zuajh1f39=NqL@FXlYMf-qBso7oC(L{i}#%?U0JC3%n#}J?jV3(0dEBPLkKre$|mH% zlg~)kgiU6&3a5;uI{Dz@0Yn*^e-f=SwBQG!;wP*}at6tnYdEil!{)X&)a4m0_@)xB zS^MmtD<#_lEC_IDNIdcK(g*0D|EFXF${Y{?8!N*~uHwm0UGg>twR#VSk^_~>pcpJ@ zFSgP2@7>#16iC}4^nHG27SRAq>IR6HY0#}FS$0llrpK$o-{t)FeUi`Mj3gAQ@NI=L zMLoq)bpw($qC5=8Ix5X2G*|0<7gSxYtA*Mb`VYU#|AQjI8$zm#x-0d|!`NOi_rUGtClp?tfpg`Oi>B0+^dY5r#cAN(t`i_0Va9y@Ci9w1t4z#-8y){ zlJ5TSlm`)+`3j#Up%9@ETiT^UBsPFPrQjG_IAX<8S;6rN-N@i>6&l~X(9u4;3-7a&%+ zAbPB?ue;t}dD;weadQ`#aH9q5n%@R4wM+?_r7`vf2Axcyh={mpFi2HF@(BxvM)x@i zKSt$Vc4a8|Q{^fsv=v}*_$&6ph=pwPTL>?oq^OZbDQ-Lg{38HUJ^I$Z+da>p+VKQX z63C!GO;j~VXwD0VGv#JA6kSYBa3laNHs^HCM%*wOE`RqY;o0+O%m-I(zy9(=iwS{~ z0%%wP@DG3)DzO6wtMRwIT7+6e{=;V&SSP7s9EZQU?j~%$HAnrcox+Ajqg#> zHk72$j7u)Oj3eQf>aDYQ35H2on(7-cCiFO)_J#GwaX=&hP5s00jMS@uP? z@uV{se&4`T$^R+6!EHae4glRe@F+-428`uAKLS|BgaY#A1KUTyWAciKya!<7|K#e7 ziG89$lsvvEKN8e$aAx*jRk2X>zKAH1=53k2g{Z-Qt=%P|t3rst>NnOT&E|e;T);B4{X{jCRu~S-^q*B3NK(fq6v;%%0<`=>u zBHEv(s8M>{K%QG?7{lc(8_S(|l2KiFa2pa>1e55o4aZVdP3!{!wzyneoHmFG9&aXI zR#YAG&=ZA?&%R2yajc{vFi+{4anun;7`s|^WzRBq9MS24SQo_}GMMq*_1AAipQsZa zFfRz=EhLbM=3C$lt_Kz+&L}+FpwF00vu^A0YTk1{5YHY|2&m)WZD}vp8K=@u?%eaY zJYgKq_`O-WbJ408^yHuJ6SerRi=5Lz)w_Wrj)WrHW&~791n^xzsJoyiYEV_Q5*X~% zQ9Ic*FSj1HjTgExBGcGPF|hAliTiK3Xwr!s{h{dmhgEMO9P`(cMBg%>c{Bm#05C5| zA2zZA-a^1j!{m#r&Lf4fmvD6>m4HDf!nE3bs5?YK{N zqj&34$bW>Yj63UQpXgCA~w$kdysk*4#U2aIC z#-i(g=}ChvxzTaqN)Ig4gVlA&;%hX2-3= zFT6e@?9dQQW}>|Wl?(KNp*KPH8CSOqmr|(suF=a)88+_SKu5>;t+`-0ZxBu znf#C6mWq~>nov&+FY*}h?z#(6torSRV^=4Z&qWOnI*JJye%L8~+!xWa9LM=$$l26n z5#$$Rc>Va5T%=x5X;UZ zIV3Y`G$ote!j1AZlSu8+i`Jj3ujCqXX}4uWt7-ez#a4EPYpzx3(?)B9*N@rzHp7RC zcI>`+30lnv8QFlF!nFla!i|Xubq+COYL`kCljw3h%OLlk*qT0HqKPKy`p|f@-8miH!2( zXrck3xR~WX_3mB-ONu-WKblXLZ}6c#zr(_(lu9>=+}$#rub+vZau|}9qEIrA)!_gw z&n5HeImF}?Z=?T4(rKsI{OoJcAtPDNvZ#B%+^8$n87ZZe-lyH&AQWFB*WUf_!>%5R9>C5m<+HxiZY z;}d8U9VBZ{kU*_CC#lk+MRtuk&i+a1R&HQFkbr`U&HXFKNOY{oBuGuV?t7X zkr+sr5fg~(DvZi#KBO{RJR9G>KEuKFcWY|2iAQkSPnRPn^^k{ z!i|19D8Q!!hk*BiLFVAB2MxhX6ofONkij%kO>3)kLQ~;}EUc;t;vIdH;}Ny$%>Yzd z7vQVjnh|h+y|e^O$&4^R^X_0TXz*G)99{xua5knK6@?`;*FJ|1(r9=MMv4L6W5*g6 zWN{sWr(rTFR$Sf(sQ08fP!@y{Xx+Lov6YlD?LA3jGJ*?gxMy?kbM zr2SY?<;6o_ti~2SQ=N&?;74}#@@q0@xuanyPP-=tW-tf)}e( zQv|SY#k<2=eLe?01u^2@RQ@GqBSt&wetYT)BJ$6plrekK41%kQ@yx3Ny2+1oW;D0{ z$rCGb7yNQwuwO^qYuv&zT7eCqc9lN0kF&Eg(v`wLzVtUg>R*FFaAwLXZ{Y` zAPpQ0x3SkVnK8gvH3Ij{tE~e-zbKaDUjj@xRNK#f`GL_acI$!gS6$wcG{D?M?DYar zKQ+bjVGLLk0ciRbuk5bQrYKg8pJ_{H>xleK-vcZ4&FO$HAhCPs8cH6+XO{l=)j$1V z149s7Q*BHQ{WXM&2r|N=>-gJ|%pvlM0-pj!e0|981B4q1fFYxOBzMF+ew%yv>pPQH^=!&#AqV zfL8p7W5b}$B26T+nL+*#HJ|;OaWZ3{LG%2D%CGPu9)e(9C=(kE0SU=5hU&+5uTE?Z zKBx2IUbS~D?DhO`*)oaWB0}nx1)B3gz~f(%JEM+OIVRMoy>@>VZn5 z(CyvA7>ir$$G-k|mwB{F2{!OTeHyzUb=syNjS6ufMBhHWQh+xJ6X1(xq&<%YxHgXq zaJE1R`~Hq1grfvJnojvLu$)Xc4Ab){K=ar@^ncz#<1!SU?5; zQg<2XQQIW8E`*qsE6g_MxRRkig1m2rF%N9o@htt<5|poi&q~n4<(e0R9OgJD5?@{i z!QpCX$Bf?wACjb)UZ|f<5)(_qf9mF2J*S38gCGoyXM9_7Dpn`4Y7p$qvQESm$7l^7 za<tjc2e@bF9~Hq??}LJX$0Pk` zYJZgA)JGoPyF}zGV=4IJlh$vcZ2|B_w3Q`IM&>VOUZk;%%Tau+NR7kLJtW zaA58kLc7Qb&DCr-mD3Hb`~Do3=3KG#6nj%x6}@~;cY>coZ7CnaMDUM#d>FZ5LB%s! zcoFu_zS)w)gO9@d#Zm991%fkspomAK#8eyx(wJ0gOoXdy0%;SDkqjDA(lmc|@rput1#TOTAae_#_6kkx=J{ zZydUN7)3>@miRjjR1Tu}Z;+(7+6qCSWIF^GJ7ld)bsT}8_+f;VM}{}QsBFaOY6UW1 zH1EIZBJ?8zy?bcpp?V)o!%2e(b@}IW>>(L$8D`ck!$cJc_9t}9-gF~L(!f#A0BDpZ zA)JG+^iljUPLF|HZ6oSfqT_;KDN8@7u#GGKPP%GzWj}pLxi*QZZ;v8=MSdWFS-?rB zf?Xji6i%(-VlHw2Xj*tCU1_aCUM5+Uq+Iw2OEkq0>2UhQU*OQ7Ve(D_2uG-IvQWRl9*e4ckC$ZiBeSC2+rExex)i+>f+#OeN-DYsa z^ah1Xii}F@CEmO#8Wg3MFn3CXDCo6SzYipYJWh0Te>GfP?oa3(8;WfKKX3UXA;iGa zRR}S&*ivrUQY}#&A!Tv_JQH5|X?K+4%^PQNuhD&Y&+wk8vWB?9vE=gfici4m(w#KU zvJ2I`3F;X@!PMa>4XM=378ilaaJpb@4_`{LBTpSy#bn0w+#*gC^?15~LiK@>vf30r zcXetByVzEoXA?C+CcgM@s0gjv55xG@Yp)jX)nstmQL!4k8SyoEEM6JhI<=qVeWcCS zXUI%J|5w42o8>R?LZ&bd-l`nrk1%59mU)+xLYhRZawu~gry)^*S?pbDQB@yQM63R2 z71)>Pr=+B`qAw?)W$U-+gld@Kgv%8WXkbJ89!)bmkV$67Q)OCfo0_z~!Q-8o?if-7 zaWV2KC!m4k_W zN643QDx<>Kvp;uUj=uYJ`c(*-pax7M-uijyUY8z;9j_9a(6#`2g9ql=(f!TRrm%mN z_C6D=#6$m{E;#a%Lzd--!7n>Hild%(c=xmDUZU2Z$0~G6R{b`eGVOiwjS;RrUXIO|{uDa0r;vZ4@ z760v~0QQU9m^%~y;=WZ~1}pb(S|zPpdm=Rlu#$|;-SeLhbLc2zsjIW41FnW{2wWJH ztfC(rTx0SV2M3@f<2UzS_=E&z#O^z&Gl;>|r76lOk(M!-ZE6|09O9?69QlVreaTiA z1oz)Jzl+&0JKiag2v4P9BMzrm&YfKs(FuuaL2PQ6419CHLHs#)c=W5F&Ji|mIcMzL zkr?}M!kUCSgHmppsJ_l#{U_1num0!HboKgZ()en4T zh12^>*(Xc;TNTR8txUAVG;ej<+1Prl!bO2O;!Y6{q0}(al=$It+_@(d<@#YpHg3D? z%G;$Rb&mA8El-^}J|PFY*((-zqw)0Pzu)~6XK4-E#;le_AuO>89xGoEcW13|7WOax z+NrK8JH*7UC+5-LkUnditN|ibJzD~h#abENhoV>tBl?Y7psn~1_#{|fcb8sj!~(u% zKMV|7)3dC9UDb~@5x~5pBbgtwZDgRE?Oj2I`lixIM_Bj}-v%^S0Eo$zN$FZ=QKcbR z7{cD=-8pojdo55L916sOFYAG`67Y?aPG~D@6*j#6}w#>l#60lzI~1Jym6?iA^W2U+23RYT{{~RBFm1cW=~7=I(a-0a_~R0ZZL#oPb-S5!G3q)KEO$soDuCryzi}k_f#+_WPIr;fzoIMq zwz>oq62ihWpK%Ye-WoNJKTR_z$}|%0v#~9+pu>}H`S$G_wz;zwcumV-5F5zwe{LKD zbS;)HO`>eAh$%U#sbjy4UzMM7e#DJfb;NAxEqQO^Q(|{96j&%U{w^)U@8{(uQ(w~t zfcb&Iq5l<2JesT8v-mPlzyeq^_+(HLMH%%8$kjEoiZ!cd7YWKVTgDEdVgX@46!v{v zq(^3dWA-sty?WlL#$WoDs7AwHJ)s0rzFkIlJ9K#0R9A)xMa;7 zG7ftRo!E#5LH_6NR541LcIAIg3OiL%sP2>oyayf^xsRPY-v7lkxw}7Wl@hJqk=}2< z4qTCipqnu$8Zjvn5;8yjt!&#w`m~ftgU_l*WRaeY56v zm*<))RjJ*msAq;?ACq&>5mUMXwyYSO*;tTSho4!S7|VR=?NVb<@Y0V)%(o#AKDVQG z1qzTun$L4Q{(U?5KR=gl8cAIey`1xW2|%er1_A;CD_7S?2`XLF#9Q5;rgp4N0E+&K z5GVzf^4#_sU83gwU8y#LJl#!{yU3%uTQ{5jJ%RL02_mF@BV0wJ^*F-4C4p5$i2FCk zjyL0jDs?!&&U9avyYpA{3@T1~)Je@*$mj-iYJ>&jOIniRnNt zoL@qP61PjKr>pj6(A8`suxnj*>D-bvVSlG;;G5W7gU0{qYMyhFBAsjxE*AC$5b(e3?jW%-0o_7WdqvvXrj@ADq*oh}c$(wNu zWFg1BW4bE-*}(Mf2OYeRNl8fw=^$PoR>KMFrhFD9(8U6&Z<`@3%;m6?Q1`BMBB~R3 zvCB(?$1>%x<_)8)(ysvd378jyt^g98knnhSp_!~)@7FXf#YcGpp$!(AxI&$Bb6;Od zaCqRQosdK-sNV}80&jmsQ%`tv1m>aloZ|@Vuj&pQjL^2ptsm4xt24DWZEnCPqwPR) zzpCPi0d0$tC{@qqCR6@xJK;@HH~qVe#~0c)UUSNcN1c!zF(6M zD8v;y>N=Aznzhm@I*8&VkA6;Q68uXe-(Plv1X#`&n16oDkiZ*@ac8^yg^(Kiv7uoX zVi5l9=2w(9Tn{tOj1*@mpV-=_VYqyhTY8j5AJJL8V+q>C>K#C`Fp@@DfG1&OWMm=w zaEm}wW}Y?Y{Q$UE65$D!HZ$UjRA zJRz5nV4h=qGY^T*_~n}AFHJCX9Iwt&<1ob?9TSu8!T!R21&g`s8C|dnlVy?Ol&3}w zUTlI+;gZRxwN_4&^DQ45h6F6aNQK|uXI9iHckB|^h0ozb#1F&oYvDxt3P`^|PAv_M zTLQ?w@yO?^X<{&~iS@p7`kM!6US9le} z90i~7$`Sd?8(+M7BRp_QdK{pSrXzkxPZMX=8%s@2L*q=5=uDut6&EmUq4*B;yx@$i zrxe9~O{Nq<*4FMNaiA~s3M)TWu!ETiGpYFwsAhPjjCqBuism+ZA6oh_Z&d0f14`*; z;u+n+>ZXK61FniB5JLkk#RmljZ(#ZtKeWNe%R9`VJ#8<3$GjKSPhRkF z@D2>~y|fY-cW_jeUZ7*1OR3lvdHa4Xz`|UjGhx$vjwQ#H;FzVI#G<BmHQr!=ff|ysr+rB+?*xttNK@z@*=lFc#J0#Z zE;Km7KWm^ZK;}l5y$9(xf~~>*)A%_mOxGuqo|ScT1=TX*<6HdE3pt5&i=v~#N5<>)jZK7C{ycm$1a@Ue{!5^^Q7Z;-Vw9?V3roMeDuL8^cDTi$41|5g^nB_9Z-_Vl7 zB9qhD0xkpgO9wqd#?&eac|yOii`n}Z&k~ARi(6RMq^Tz8?FWG0B}l0#NGYUH<}p9$ zWjBQO$wNSIV)7a=OOvBEp`Sf*}N8|V6dM~FziY|Sa4K)F#JIu5izKAYEOC=~VK z`%ZFl@@Jf+!2U`Er*XtKO|K4ITHqCKzSJ6koPPk4Q6nZ{nNwA=Z`lYNqC9RY3Hb;K zG8RH?bW{`~e4vz#R(=sV(eM;ukb&T57FigNGIf)9mR(dr(vBJC8<rzH2X5^B^~NBuwQ%uaajq3)I-o?zD*+Adk-U8%^nOQX~%@% zRu^YW>*E{WGK(oPJO){x$EfZ^MTY}~HI-r=?~9f9hvT|h^uV~DGKMm)hFY|W#<0rE zslq6UX#(S?2YXCeHV=qk$ES(WNHMZ;s&5=2KXGJfU0b6eh^v;+ZCiA3KH zFlG#y10BcfI7(n1+Nx8}uLxS-;9>t%zF39u75Mga^Ig1y*#!~N>z3md;~CR!bNKF?lwXF(lJ{FC%{Im8`92^p}T7wd6bQe*b2M8@ZHfEZb0 z*#Ai4Q}3}PVDiD_lLytt43CYm2G(05J`TqX68W|Zc+rB<#2(G671(9*^HXt%(BoBV zf2#Jl{9Kl=)z2*>6&S#g_4q-bq?ar|Zb+21+M$fWC>UY$`Zpg5>K~J~Kxz=|>J$sV z6B2!Xt{qWSf=?=Q`pZkDEU6e?4mF=`6@Sj=q;quoTXaO)8#f#Ic|?l~M#|_F_7W$& z#_1Kbst0oyHWpZfu70resW80**L6Lnrl?`OEhMdcYNxGkQfYFRMy+)0#n7>I>!jC} zAuhL^xDF^Hc%`LdsU^JV9$}?*pfY{-qT|!AfI+GjEl6djo8R();Nra0y1?)PwTi|v zqD-N1MDZ|$s#aXgF?rgndV0~w*wbJujY%;%3sEI*sYmTa)jJJ_jkEd)XvxWWqtc6< z=Pc5lOOyMYdJ|0NtPccT1VstHlW{sUTJ_=!^j=vmV1fIG0~+$*RrT4)}raE!Oc^7sGtTF&wlw!Ury%?=HAB@xn?pR630=hGS!5EF2wihorAL!9mP8Cy%mC zn3(_A%7;@hqZ`}T_r6Lj$maXg_yNe)d6?wpGOL_~De=Gn&uSP2IeB|~d$8)uaXPP@ zA+isqIG-e_@Sh}`^i~d*G`|E~TL#~Si6TQn$~zkWv&k7!v1}Elz~U!(o_~cz`1rIz zeO(Km;fUJ>@oR+qCFk8Y{&-yeBPRuSf6O|S;wpH-@I{DRwQk+uZbfXI`c-6=e zAl;g7mn__%e9Gb{BNfE2D~7xfc_~u0R)4)?oqdZlE$!}jbT7T7ewaT3rL}i*A-EvB z(-y*LW9lSa&+;=JXAUExJ&K?Un%fKihBwmq>N-0+$tfxMYl^r1cifj~bJEh--V|0< zt3*RUDv+j#R9GZ1cWIoR$It8f@%|@Iz<|C3g%J@5UmY(TZE)_bi%FnX&=Mx#MiP5? z=td>!{YXpZwvL_GLP9{V;I%*Pa0X&(Fz4s-ggkDYvs2!h&3WI0(ld2v>^8kYpJ;-L zxvT3iu}|KsipyClG=b1f*Do!9vYx^woFodNadX*hmzCNbaov_>`V}mlN);5IC?Zdj zf0Z^*7*2gadIbC%A0JnS+*mfwexH+7b+WZBE2c{EjTIUTUF*cfWk&Z5o9-%W5Ij@6 zrikouqr%0<|Fh_~-wlLZ$jX4e4fo&4lkKdoe*;H(^8S zJ~1wFtFg~EHfx*tVBM*F&%NVPhS`DJR^0mH+bo|a%^T^fqUnd%#l`l*YE74RxE1YS zqfXG`-sIP2rRcW@><}5$_LesO#I1L-id2_8S??_v93(J zB_>5UUrU|d3IVlvSa~_S0>k6oxyB(CA80k@+n-J0XAwqW*&F?2&#Lt0YYYVmAAF8~ zP&lQWY`UX}cvz``K$*)TBBbuk^HMyU0aI_>sRM!B_RU4BED0)Ut0&SkUW$R%5+w~1 zC*76XUf)cFyEXJF{vCT(7Sv7aY;y1cPJI@fWE;kT@`B^rr}AWYsAZr7pN5^w*+h%7$iNajabJvl=7Dp(fm zsdTJ@?1<*6kJ@~v|GcZwOdnr`_w(6wb8s6?`1ETR9fQ&vGefmY~9_D zw3?-=tBDvP=%^vNp!?#3M2U1xv(RCGt|Y4Ebkt%EN@UY(DwzI{$U#3m2-qXBkE!u3h8!`!sm4 z^}jN)XR2R}swfLqB}Zk8y6I2EL&5`!_I#ehkD@YPosuJ5wpU7ual zYLIoqCN$tr?*cV0D7a&|o)^nYghhPD9yuocgO5V4+NUL_xA~`NO;}Pg`W3$&hk8Ym zWt{wdX`?IX9F*f|y1_8tauYYWxRGFp8kj5)Nmf}yJgK%k*)J>VY$X!P{=wUw;yw{Z z=cr-72(8;wCr>8#oI~|o8>UcDCW{(7Qr>3=0n9L24wNo)g2<=U?%X&U{C?LDq|ERa zp8}^eEYXAe`ueoYTKzBmASQ-Gfx?vj%Uc>_RVac?3NZFLJB!{H6r5Pd?3AJ71dCQf z`RBRUJ<$s?eSJgMRl;4if)9s|c?AW-K;yaMV0KN3Ok7|V5NsCgHED~LcX|fO5n%x@ z6(x>7yBikyq>Fdv4+{vX{K{usix#~(^Fy`Cj`3zFA*6d_||B9A;_G4ynI zNWbuwN;cpP{$j0!kitemKt#IhJ`peZC zLF#D*Lrzk+<8=+uSY%+NB>GsQGa5b2+ExFfnaB=oNa6^2w%iiCT3LbB`tNaBoXp)t zfAiAqzt5|pan*0lb{?GavJzs0S~(LJw}U6CD*~Prz^R%5Pvc^rWhx~sfX7oK3J{!g zB`@Rh*_kvNx{t>xh$0n`D=z+=PML{JLEk@`v$_^%NuC^Uuv7c0_gf5~knB@31s8%p zkvRRAa-Vjjc2FW6d$PdsJK2RA!^&>7s)m`B6$_9XEdi=hSXk)#k__pXZW?e3>mMA< zfG$1~K zZp*%3+)(tF##e^KXhOu@yg4;Fg6Z7-;3*7T;-84%J#*roVI9*{CoVB`EMRy z-BvMxNwH3O(hSo_l*J_83E2+H4-o%aW6`z--``*50;}QtW>oDRi$m>y`X9~~V>SHG zbV8er7}>T$i@}|H)sJ~o1()mvmOS9!4z6~P&NTJt0ZZR~hyXAGunI0h{(SrjX<4t> z{}4&6DbKcT(ZLAE;xF`yYb*d^gal%>!xJ(xA28vF!$5Uwbd-MST9Nve*=eT$?6Xix zK7QIqkf+F1*HYn|wPdJwH1?btqBL6|{`+jaP<=}PghES8RHWrHfD3@bi*&9_!tiGO zYgt_9H!fxlAo&u~UytnM-)e7sWco#Ai~&hxqX-+!bHzKfu+;#2d;VLDqYQpBpV#ce zYj1CIG&D3Ww>&133}Qo7Hh=({aIc>2&8;_^^G*{6^$iqWRC2=B3gi9)_!2BQ%K#Tl zYU@o?1qJusXL>?LNYU6Ii znc?mad=*x9R2*14jA8X&Z|pSVM#XqP6&iJun=i7PD#P?Tf_W=vE_Su<)!4yT(4;Cb zj4-^cm5HhOUi*PhP;mT6XY|>DreL%*DT5$bAVC?^!=tIGc{iYR+G5d#1p#YDN?%R| zNCbC2nQRC>28mtUny>pW*VxfNPXV+4S|DcxemY5qfU7OxHndhqh96X>UaAPNWIJK zR1Yq3&d|O>SgisQ{69e6 z05)iRq>lu>e%i~muQnee=Hnkt43^WpX(7W+A30!U7S1Nh`7Kt1Go@42u%S8D|Ld>2 znv>ccOM0zi8{+SkWep?N*F34A&gEruwK6R;on5N8Mf(`R`+mTO;NyP}%m@L?$n3$N zZF$Jus?xbrDB-(Fg}P!K36>EpC)3EHpMfwE1693Fn{h8J&W2kz$-o)fFyHKNXv_Wm z(d^>@NH?~mp~&nD$h~aV~QHH?TIw z&ir>I(W<(=RRtv@tXRfXJN@K6O`RIvIG0z|0+QfQ`PHAo7m(nZd;1IgLQHR$@d|=| zwZcle>L062`iqUyH?llHW(DAo`)A_WcXKf`oe`k+QrFZBya2ly;!wQn$Zj1zU^^){ zjLE~SrAm#5pP9GyKQd<4=c(aRL^P?hYmgxj!DC}%Up;q7A!+kA5H7e007uKKRQ%|f zWgtkq2IO8Pq&;-;Ge=1pk!0_SQTlJwB$+dfJu+Xkn39(FZDLt!0L|K zpqbCH52WaodfhU>mfE#ux%^=Ph?nE@+z9WE6<0OsS}2zn`EO{;;BQ%G+S7*F0J~hu z@AK7~)N{{|@~Am;hgQKY0YD4jRDR@0`Kc>Xv_%8Q0}QPe>18nEVAbz0|Bj-~ox z6(<$3wPgoJ=m9&#L>NiBMP^%%H+$Lh-4vRNK%Lw2ku*EEqQA7ue-R@y?xUytVb+SG z6$u`tzSvR!@(GmG0EToFp8GR1wd^^;a?;9g64^Cy=dOP;Ef`f!B74#{00Jil1_<%@60|2+p7aFT}%V z(I!R;R`?x_(K0WoVJ_U>5mWKczUJ!#%Owz&s*D?#eN3ai1rw4szUBgq&|i1(E?KPO za57G*UZIg#GsN+&K({=RIKT);taH#|t! zSJzf0261!su7*q`7t^ytG`99cIk2&BNl%UHo z6M{mmTkP4cKiO7(RV^ZY0oShU{S*Mz%cR*zw_>E{<%(M! zu9HTTpUrRLAPGc61r3sMvA?HVzkd%|_oqUJ{+gg17d3ipXi`c0PxsdoQmUpEA#@5B z)jZp6KTKHDE1A1#uXr81$doR~finlNKKM+t$KP{$#et{4CBDVWQxKm4>Ib>M)Iftc!sBYoG)~zMG+q6`!0J zoAv@|<_%&1xC4IyM*`lWwZm^v){pO4d$c0@+S?(Z$J3bn2^wiY79v4!WJD(xBcx;Y z!u!CQpnavo;|8Ec{70Ue^*EDfICCqKZrrz|^}g@7WY_&Gx&XZHda|j#J6r!dUf7J3 z(gFHq>TWt>(II&nfV0}2B2Q1!>-ORon3RW(Z4LSXOoki8^-zwi@ZMFR3;fe_2VHL>Hfjwzm7t9}2iuVmu6oie(Si=_nnAiptrW!`+MG{Y-bTc-y@h9!`T6vWVqXaH(2BOoi}e&Yx&ga!kka`5LC!|L z9tRf#7W9;fH&aFB4}cL>vZML3va^MfJH_y?y9=CVEex+Zk2kSxEU;22SEZu5Ek#|I zA%70Ne@ofO_;UHS?QN*+hvzb?Sjjh{zNvir!YnXvi#2!XehEDO?S^yoC*#d;G1`DC zI`0=4x_Mr26!1uGO;?v$jU|!GFXMo|E;KLT3gz>Kg}z@AZHi8^CvI4kv^M4Vke*z= zMGlR1a;4rx#T0U>R_E?6Cxr88o?~QISorj0wAwl@`^h7pocE5x4w94V9Fgm$5D0ax zs)DRurqx60#wJIQ5vi!U%5_VTAt==>@Ehn-VnYZ8`W9Oayedmt$?G(W&BlYJ(Xu24 zGWC;Fql|F=z@Kl$EH=6mb#c>7-a5N^P5kH48sL)js&*!NRdgvwv$Xal#VfL! ztq+eO;1)*d>gw)84({oU8GxzXQN~{P(0h|T+3W&cq1iyu6YuMg^XtKCiJw;N_3^GM z=mt>tneMLzz!MDS zNJRm!-dPjIHUrfm{4X0W$>^uy%7k{T>~IqyVwJu0hLaK=7CZvf^*$GWe=2!-`KYVs zHaP*Uw6gAlszqnNRabSU7#S?9K06iPWE$e-H&;igv*?1Milsn64_7QaaXSBe`LBx_ z*%3AQUml(N<($t!P)))r1Lbwr3JfMHi8eb72UjeKa&iTm<~uDUP`vT`BDy-pMYx5z z-$cNlTcVijT(;!g#0*drj4?n9%rVIqnHDv@huO4 zYo?FC-*;hV7s*~fTKba_GmIZ7;w(loyT4~E!=zTPH65lgT8mcq;xNO_&pxq^nyjI# z3@3GCTBqW+@YTSBe^aDVBgxR>Vmh?F7>K$p!JfybmNQD{g{Id%)jYJG+%vH(r$6Vu zb$eBd_70??<>Ca|_?5=s>W&y}1giz7C!W*3gJ<_h-%lmEax$C=p>#k|r6(TNG?1 z_t#c*NSxR!PeWjTw67V+#sK4zpjl@^#>{$6RUbK{MA+!{SyLF(Q47bu|u=qB(9a&ydoylHxe9EPudJJbnbwE6u#-`)J`hi9DaT&ln0ec5k~H1Pw{ zxv{Mrz5W;2!cu&w!KO5ABx6w5E5hp*MZysydpU~6@QoJwaXrgWo*x6K*WH6{r$JJh9qxBbAV~j? zp*{RnBW5a3z1+u|OQl|{6ZAN)m$qOvB*%!GGG@Yo_0JrEPw8ivO{QatZee<{Ea5|R zQV!VrPK(uGdhPP@e2(g~?o{+*4P%mtnjM!mhcR{BO!C{G!MDS!lA@v?3^^k}Uezgo zHSXV=&eM!koB7}Fn2D^dZhUy|2~$sX7MzY{GsTw7bK1+4BG zo!&72o3K0{Y$8Ce`uc}@U;yfu_w{rkDRnweNG*7nWQNvt4j4)27QayOZDXkK8i)G9 z#C4L#{^=G={v%6NXVG|~HsN5heO0E(ak+!`i7+ZwBm2=jnsJ4Ab9gXw530Ql`pWd$*r4_r1>Ez3^!~8DghW$!CiY#=;Eywj862&(9H3#a@77XmGXVmj9 zHwJ~9hf<-%E(_2iEJr?2Q3Ivd{e(I1g&}upv+6_=0S~Qno)B*Dkp4LPZ29kOLdMT@ zk(=*yj#h-qHsCl5L!o^R%nA0qbsF|(X}8ZT_1(wcNEo}rTocfa!&x^4Yl;=$X{L{i zXoH>d>GL)NL1#}gtNv|khU(d=e)QTBa1wchwY>Zzl>EsPhZ(KRsr-o#{!q6COGfowulr*-ad0XgU%I0JCh=>SRV736N;IxiMf zmbB9pl|{5yEk9?+dbv%-{Wo&reoLXLwmEaZ{__BsDF84Tz@gC$+4L)TP>t=abM>Mo ztbgB4$nT5dT)#^6Ki^-9J3KrjeZma0;li!V{iHND?BHZD-XZP$l#p>aW7eBB_<90> z#p|H%Ynk7vsUkH-W-Cj}Kl{MSGP8DOR|8%sH}Pvidiu9T`TH5IjxQscmX6B$4OK&n z-xsBq0RHW)b^T@Im;S(>+YCO2{-ZX}ofP^suj2;L*#Ug&SJ-`7R~dq*PebYoh>dUD z>Pfy(2k!gOAcG}nj0#^)%TD+%aO@pDsH5EU-n;e}3Bkq&{@KMk(^}TLLq)Qc##c>ep!#yB~84*t2{5q{d*)aY!>DIn{ z2=<^(Rd?^3@YZn_NPZxy0f@#c(0dRt`3ah(3D9DrBFi%;GV=c`=}a7WQoMsON*Magz#ivl4X>2Y#B+CY^jhilaMVtV{fRCEECzsmdR2KikZp&9?$C^ znESi#z2}_o`J8i{cX4$|3CpnDeEiMK67;TxxmCo;G)#0%d^K;Oj;?M40np* znuMYoU3mEKyra3dwTvr;kEiv`!)(6%r2Uq0EH9AzSy``Pq_q0+GnJRaF@`s67+22# z3Je&7341-jlquIHq1;Y!Ak*~`I=8-`{`42IR;!z*b9#d)aQgIVauPb*2W+)-aceKv z$RSt}Bv0Q1=eINsebL?x$0d0me@fU))HOf0b*03H6bqCN%J+;hnwl*w# zJ{0#A!xfujg;v@#9Q_NFwpQFj-g#=g>Tx)KyF^bWIEbL9O-bza_(tZ=lc*T6c+j+}RT^Ue+RGZbTRuP$tUq>VA|Uw*atw_f|IvX8{2ZHw)eoJi}$WHTGg`v|8qz8 zL2i<}{lAHy0y+B@wGmVURFbNyDl=mzVhvSKFQNxsn+vOZCKv@t!A%&hwoQ%D&FIeS zEKDttY%xIco?I;wwl}VHdXo0GxAMqG?`6kGj-em9v^9DYa>^i_2BOyvYj9A?faPra z7+JRZ+?5`$X=aA~E3xoS@dP$*B@^~-wx~1&tNXOug+G#8_ye>?w##Y+X9mQ6&tHo^N9eE`(9YJwVVsYJN@~Ms z=Sm~iC^c2ITW-Hj@N3)0k+xp@@WmIUl@VVTEi`^KF9szEB@^XV&dbgF#K-^3Lai|P3XC8d(-OvOy`Ui zxvL9TZXt_*1)OR-yf)$`auDamA=Umk6`BRRV6luIblR?hh)1zYOz#5*QLRO6S+o=L zB}YA?8OoBoNPPd&(zM%S`;Mb^`tVs7qGBvfN*X;>QmsvE+kw1n2GRMHy808qQ=je8 z&$E(rx>E(`2H%fUST`!day%ckz*M2}8wtfc*AbPuhFY*t541MHd+ zl>({&WTy0Q;jxZ(zbzmwRNKKR7zfOFikhgXs2;HE3H)LGF~W3hlgW9<3{Nll=-|XJ#%3c6|i&^ z9y7>VBASo%#J#*MQR2U7WAb^Bq3Lsvb8d(9li&+EB(%J2TxgciKJ^DiEYe_qw!e6# z#WJlJf|NMHs7$?h95iIZU6oG`zMN9|E?ydMmC4q9+91cQf?EUXFf=TGYgr6Rdj<*sKoQOdr_3Vz6abB1j7<} ze;LatnS7mhC?<-xm_?d9>@J}qub9o7f7{d7pNF>_7O7l%r~ec`V-IOf@Lig~qjw~_ z-!g+R17eh&Oht!EMcV#!o(9!!mx{ZVdpr8yf)`H$xq$iAtT?XR46{D)BSBp6?JiC1 z)R#n2cV!__eF?s9Y^rM^V$`^M_=+tJd3qz}VYV?o=uNV_W1g4Gk+qazZRr%(&oObp zCW5!f46~AF zo}BWosp+}zNm=OU$}3Mt7d{;7n$Br0B90^mB_^v69PiF{5TdPSd=ZXrj>*a$yS=U+ z7C6%hF(%wOMN^qW02^fjnhpT5T%8{AWYaXNiEVUMV&feRvk|?YEGHv{)*M>c}msFNV z)$QjcA~~Du*1>gK6+DP0mg#bfFH>cu=gN2_zrl?G6u=&fMc8irNiGEsZ^unSH)|4n zs)f_#>hJ!i?lR0Wi~?GrD0r)OfI1vAh%?lSL^8PzIsh5WrN|O{LA+Z zcD4C1Hu|WmkNbdBi5=Np>Xx_YRO01wbijt~`a;%&r{mjLHlDue3&(cZ+2o6bZrM!5Wi=lC@-?w7@E;TTBz7Ub}I;?f^k^IlLnD*&KGq& z3-(ymcu&!~T~^B5oV@Qz`@M*cpJM*>p!FYfS{JIzB@M-^t8Yx0`%^+;#h7;9ziy6#G!^wQIs4%; zuf+UBSW79TPwxo|J}RRiJajK+i4Z`%J@Y*L+D2 zmaQLaD;E6&6AC}9Lg;20bz$-~&F_v%s&l*}WOF_Z%H^VGXFh#hLD3x)2Jo9C{Q%m7 zc8XfiJawfmyUWD8*R%!9Vh0Q3PH>|xC!UG|jZ01pt%=o0IA;4A{-LY)wrU_zPCgFU z+1Q+yha^-=99q&;z|w#9@xVMI=II4q3pQmNGD=N*1($MCMG@;Z-m8+7KbT3P3sP9y z7B#|X)z_77=W<0~JLNJWqQMl&$VtgCu2-N$@&Ak^JC{eeRj$EgkAR6}Wb04s!|QTS z;G1?qLvNkgz%ePu(m@Km3XoP-@J=W?lhpkvsDZ-!Qn;@A88Mkd)woZyX}BcUa<+ZpKqkTt&UCnVJ4`Z%rF?34#OcAS4c3 zz{%ptFq+*DvrRB(eg>pBCJC~qat>T|qxH5;>c!yB@Es!derCC=?s)khP<+~)$_f-S zQ@PTX|I>?1Ws=)TX`RlY3wK6peNV$$=VI>SmQ#b_B0v+zC4cA)?o!3xgKc4fP1~rW zESZ$Elm0eiXWW~G?Y#DhaFN8s08EDh4nWZBh+k!ACgL2MKsG>n$e3HkmZ;$CqpQP|U8OW%^kyvS-ufFnYiKkCAJ2z(@K z#m;&24t+oUkgzg%vO?U`a+0oLCXDXLd{1GxT~DmBkevq9`L1a}AAuG*hLK(SG$;xKj-0YC5_4Rl6I)jab(%_ zZdOv!crj7XC-bCvGVx|1VeUmYQ(d%hTrwf~sN*57+8J>DxXl z!8bJUv&Hl(Z|3HzvvEN(2czFnxghtOuZ~Wzv%+gC>3QLDCoJJ7%*>ARRk!}t_Ik}F zy0cViZ7E_VunTzZF(fBzs0@@5HRN)of0_h81Iqg}l76RySVN_NaqeWHj+S z#a)3BASO2Eg*XJ;E6VcsE5ukunAx*y7Q8_unYCFqXh$T>xp%h?41o!Snk_@P!e6~5 z@;(h3WRJ<_=Z;&1nYAU$_)2AuoJcQ~7Z*m&9darDx|HQsc@xI&ghIX{w9jvp%uJWI z+yk|a52`cWNUHoCA?7Fe)e+p0;W$1!jj~-gqxDyWkg3)wNSD#A`#o>QU-ogk9wc-% z1zDHpf9Z3pgzilQIXLn^YZr3X^8fUoCkR%dc24GRc!|fL2CvH#buSdkMP2s^ac%XZ zT4SH#)x(5~GVy+P87&jW(xGsN;DrT0s+p1dtPGv7fswQ0ZxmK~2WP4n@aFOAz~$-N z3O4l?HYU`N75)a>Lm|FgVBxJ~MB+pBP{^$=_!+qjBbVN;Q>CX3Rl?J|liWNi32v^k z2+J}q#7mO2(Nwo3PRE-*2q&@2^-MQr8aRzX=Uj#PYnTx<3q)f$k{w4K}9 zn%X(d1Lf_Z{A_y{fGFeTYeE;?D_*vs4C~&Q^r#9o$id&{JCd%}ex>7P8a1w=WW+@o zp9lLoh*1fpLFlP!ey=nH!wz;LwQ;$Asa=7ThDFY#<7YO*?M?-t_&K<|m-B4+vI>9g zDQp^%D8(8GWnv`DZi-$*ISz%yL^0umyJ$^|QXQA@56hxv~?YX!3%9|?N&u7GkXiV3?A(q!lP zIc5KSIy>K8fxB?TTyNc}yfKVzzm)kMj(}BWcR;pHvCd-Pm@W94QeeZviW%8W+F+F# zrLtpCaCFW*s%^ZB-1Zw>+AReI27O;l9W5Z(YS dYALcUI`i!FbtnHs0t@_IxoB{qNZ0Pc{{XueR@MLj literal 0 HcmV?d00001 diff --git a/static/zerodha-logo.svg b/static/zerodha-logo.svg new file mode 100644 index 0000000..5f59321 --- /dev/null +++ b/static/zerodha-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/submit-new.html b/submit-new.html new file mode 100644 index 0000000..5f446a2 --- /dev/null +++ b/submit-new.html @@ -0,0 +1,74 @@ +{{ define "submit-entry" }} +{{ template "header" . }} + +

{{ .L.T "public.submitEntryTitle" }}

+
+
+
+
+
+ + +
+
+
+ + +
+
+
+ + +
+ +
+

{{ .L.T "public.suggestDefsTitle" }}

+
    +
  1. +
    + + + + + +
    + {{ .L.T "global.btnDelete" }} +
    +
    +
    + + +
    +
  2. +
+

+ + {{ .L.T "public.suggestAddDefBtn" }} +

+ +
+

+ +

+
+
+ + + +{{ template "footer" . }} +{{ end }}