diff --git a/dist/_/calendars/css/main.css b/dist/_/calendars/css/main.css deleted file mode 100644 index 30b49b9..0000000 --- a/dist/_/calendars/css/main.css +++ /dev/null @@ -1,352 +0,0 @@ -.calendar.theme-dark { - color: #ffffff; - background-color: #000000; } - .calendar.theme-dark .cal-year { - color: #b3b3b3; } - .calendar.theme-dark .cal-month ul li { - color: #ffffff; } - .calendar.theme-dark .cal-month ul li.cal-day-saturday, .calendar.theme-dark .cal-month ul li.cal-day-sunday { - color: #b3b3b3; } - .calendar.theme-dark .cal-month ul.cal-weekday-headings li { - color: #ffffff; } - .calendar.theme-dark .cal-month ul.cal-weekday-headings li.cal-heading-saturday, .calendar.theme-dark .cal-month ul.cal-weekday-headings li.cal-heading-sunday { - color: #b3b3b3; } - .calendar.theme-dark .cal-month-title { - color: #b3b3b3; } - -.calendar.theme-dark_arch { - color: #ffffff; - background-color: #000000; } - .calendar.theme-dark_arch .cal-year { - color: #0000ff; } - .calendar.theme-dark_arch .cal-month ul li { - color: #ffffff; } - .calendar.theme-dark_arch .cal-month ul li.cal-day-saturday, .calendar.theme-dark_arch .cal-month ul li.cal-day-sunday { - color: #ffa500; } - .calendar.theme-dark_arch .cal-month ul.cal-weekday-headings li { - color: #0000ff; } - .calendar.theme-dark_arch .cal-month ul.cal-weekday-headings li.cal-heading-saturday, .calendar.theme-dark_arch .cal-month ul.cal-weekday-headings li.cal-heading-sunday { - color: #ffa500; } - .calendar.theme-dark_arch .cal-month-title { - color: #0000ff; } - -.calendar.theme-light { - color: #000000; - background-color: #ffffff; } - .calendar.theme-light .cal-year { - color: #ffa500; } - .calendar.theme-light .cal-month ul li { - color: #000000; } - .calendar.theme-light .cal-month ul li.cal-day-saturday, .calendar.theme-light .cal-month ul li.cal-day-sunday { - color: #ffa500; } - .calendar.theme-light .cal-month ul.cal-weekday-headings li { - color: #000000; } - .calendar.theme-light .cal-month ul.cal-weekday-headings li.cal-heading-saturday, .calendar.theme-light .cal-month ul.cal-weekday-headings li.cal-heading-sunday { - color: #ffa500; } - .calendar.theme-light .cal-month-title { - color: #ffa500; } - -.calendar.theme-light_arch { - color: #000000; - background-color: #ffffff; } - .calendar.theme-light_arch .cal-year { - color: #0000ff; } - .calendar.theme-light_arch .cal-month ul li { - color: #000000; } - .calendar.theme-light_arch .cal-month ul li.cal-day-saturday, .calendar.theme-light_arch .cal-month ul li.cal-day-sunday { - color: #ffa500; } - .calendar.theme-light_arch .cal-month ul.cal-weekday-headings li { - color: #0000ff; } - .calendar.theme-light_arch .cal-month ul.cal-weekday-headings li.cal-heading-saturday, .calendar.theme-light_arch .cal-month ul.cal-weekday-headings li.cal-heading-sunday { - color: #ffa500; } - .calendar.theme-light_arch .cal-month-title { - color: #0000ff; } - -.calendar.theme-matrix { - color: #ccffcc; - background-color: #000000; } - .calendar.theme-matrix .cal-year { - color: #00ff00; } - .calendar.theme-matrix .cal-month ul li { - color: #ccffcc; } - .calendar.theme-matrix .cal-month ul li.cal-day-saturday, .calendar.theme-matrix .cal-month ul li.cal-day-sunday { - color: #00ff00; } - .calendar.theme-matrix .cal-month ul.cal-weekday-headings li { - color: #ccffcc; } - .calendar.theme-matrix .cal-month ul.cal-weekday-headings li.cal-heading-saturday, .calendar.theme-matrix .cal-month ul.cal-weekday-headings li.cal-heading-sunday { - color: #00ff00; } - .calendar.theme-matrix .cal-month-title { - color: #00ff00; } - -.calendar.theme-minimal { - color: #777777; - background-color: #ffffff; } - .calendar.theme-minimal .cal-year { - color: #999999; } - .calendar.theme-minimal .cal-month ul li { - color: #777777; } - .calendar.theme-minimal .cal-month ul li.cal-day-saturday, .calendar.theme-minimal .cal-month ul li.cal-day-sunday { - color: #000000; } - .calendar.theme-minimal .cal-month ul.cal-weekday-headings li { - color: #777777; } - .calendar.theme-minimal .cal-month ul.cal-weekday-headings li.cal-heading-saturday, .calendar.theme-minimal .cal-month ul.cal-weekday-headings li.cal-heading-sunday { - color: #000000; } - .calendar.theme-minimal .cal-month-title { - color: #999999; } - -/* Fix box-sizing */ -*, *:before, *:after { - box-sizing: inherit; } - -html { - box-sizing: border-box; } - -html, -body { - margin: 0; - padding: 0; - font-size: 14px; } - -body { - color: #000000; - background-color: #eeeeee; } - -.clear:before, -.clear:after { - content: " "; - display: table; } - -.clear:after { - clear: both; } - -.wrapper { - overflow: auto; - display: flex; - padding: 10vh 5vw 5vh; - flex-direction: row; - justify-content: space-between; - align-items: center; - align-content: center; } - -.calendar { - position: relative; - display: flex; - flex-shrink: 0; - flex-wrap: wrap; - flex-direction: row; - justify-content: space-between; - align-items: flex-start; - align-content: space-between; - margin: 0 0 10em 0; - margin: 0 0 10vw 0; - padding: 5mm; - box-shadow: 0 2em 4em rgba(0, 0, 77, 0.2); - overflow-y: auto; - overflow-x: hidden; - background-repeat: no-repeat; - font-family: Hack, monospace; } - .calendar.a1 { - width: 594mm; - height: 841mm; } - .calendar.a2 { - width: 420mm; - height: 594mm; } - .calendar.a3 { - width: 297mm; - height: 420mm; } - .calendar.a4 { - width: 210mm; - height: 297mm; } - .calendar-meta-title { - margin: 0; - font-family: 'Playfair Display', serif; - font-weight: 900; - flex-shrink: 1; - font-size: 6em; - padding-left: 1em; } - .calendar .cal-month { - display: flex; - flex-wrap: nowrap; - flex-direction: column; - justify-content: space-between; - align-items: flex-start; - align-content: center; - flex-basis: 33.333333%; - padding: 0 3em; - font-size: 1em; - line-height: 1em; } - .calendar .cal-month-1 { - order: 1; } - .calendar .cal-month-2 { - order: 2; } - .calendar .cal-month-3 { - order: 3; } - .calendar .cal-month-4 { - order: 4; } - .calendar .cal-month-5 { - order: 5; } - .calendar .cal-month-6 { - order: 6; } - .calendar .cal-month-7 { - order: 7; } - .calendar .cal-month-8 { - order: 8; } - .calendar .cal-month-9 { - order: 9; } - .calendar .cal-month-10 { - order: 10; } - .calendar .cal-month-11 { - order: 11; } - .calendar .cal-month-12 { - order: 12; } - .calendar .cal-month-extra { - display: none; - padding: 0; } - .calendar .cal-month ul { - display: flex; - margin: 0; - padding: 0.2em 0; - width: 100%; - flex-direction: row; - list-style-type: none; - justify-content: space-between; - align-items: flex-start; - align-content: flex-start; } - .calendar .cal-month ul li { - width: 14.28571%; - text-align: right; - font-weight: 400; } - .calendar .cal-month ul.cal-weekday-headings { - margin-bottom: 0.5em; } - .calendar .cal-month ul.cal-weekday-headings li { - font-weight: 700; } - .calendar .cal-month .cal-year { - margin: 0; - width: 100%; - text-align: center; - font-size: 1.5em; - line-height: 1em; } - .calendar .cal-month .cal-month-title { - line-height: 1em; - margin: 0 0 1em 0; - width: 100%; - text-align: center; - font-size: 1.2em; } - .calendar.layout-full { - padding: 40mm 5mm 25mm; - background-position: center center; - background-size: 75%; } - .calendar.layout-full .cal-month-extra-1 { - position: absolute; - top: 15mm; - left: 0; - right: 0; - display: block; - margin: 0 auto; } - .calendar.layout-full .cal-month-extra-1 .cal-year { - display: block; } - .calendar.layout-middle-hole { - padding: 15mm 5mm; - background-position: center 45%; - background-size: 60%; } - .calendar.layout-middle-hole .cal-month-1 { - order: 1; } - .calendar.layout-middle-hole .cal-month-2 { - order: 2; } - .calendar.layout-middle-hole .cal-month-3 { - order: 3; } - .calendar.layout-middle-hole .cal-month-4 { - order: 4; } - .calendar.layout-middle-hole .cal-month-5 { - order: 6; } - .calendar.layout-middle-hole .cal-month-6 { - order: 7; } - .calendar.layout-middle-hole .cal-month-7 { - order: 9; } - .calendar.layout-middle-hole .cal-month-8 { - order: 10; } - .calendar.layout-middle-hole .cal-month-9 { - order: 12; } - .calendar.layout-middle-hole .cal-month-10 { - order: 13; } - .calendar.layout-middle-hole .cal-month-11 { - order: 14; } - .calendar.layout-middle-hole .cal-month-12 { - order: 15; } - .calendar.layout-middle-hole .cal-month-extra { - display: flex; } - .calendar.layout-middle-hole .cal-month-extra .cal-year { - display: none; } - .calendar.layout-middle-hole .cal-month-extra-1 { - order: 5; } - .calendar.layout-middle-hole .cal-month-extra-2 { - order: 8; } - .calendar.layout-middle-hole .cal-month-extra-3 { - order: 11; - justify-content: flex-end; - align-items: center; - align-content: center; } - .calendar.layout-middle-hole .cal-month-extra-3 .cal-year { - display: block; } - .calendar.layout-top { - align-content: flex-start; - padding: 25mm 5mm 0; - background-position: center bottom; - background-size: 30%; } - .calendar.layout-top .cal-month-extra-1 { - position: absolute; - top: 10mm; - left: 0; - right: 0; - display: block; - margin: 0 auto; } - .calendar.layout-top .cal-month-extra-1 .cal-year { - display: block; } - .calendar.layout-bottom { - align-content: flex-end; - padding: 0 5mm 15mm; - background-position: center top; - background-size: 32.5%; } - .calendar.layout-bottom .cal-month-extra-1 { - position: absolute; - top: 15mm; - right: 10mm; - display: block; - margin: 0; } - .calendar.layout-bottom .cal-month-extra-1 .cal-year { - display: block; - transform: rotate(-90deg); } - -.settings { - background-color: #ffffff; - padding: 1em; } - .settings form { - display: flex; - justify-content: space-between; - flex-wrap: wrap; } - .settings form .settings-single { - width: 25%; - padding: 0.5em 1em; } - .settings button { - display: inline-block; - padding: 0.25em 1em; - border: none; - color: #ffffff; - background-color: #000000; } - -@media print { - .settings, - .calendar-meta-title { - display: none; } - .wrapper { - padding: 0; } - .calendar { - position: relative; - top: 0; - left: 0; - right: 0; - margin: 0 !important; - transform: none; - max-width: 100vw; - max-height: 100vh; - box-shadow: none; } } diff --git a/dist/_/calendars/images/blank.png b/dist/_/calendars/images/blank.png deleted file mode 100644 index 427fb75..0000000 Binary files a/dist/_/calendars/images/blank.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/black_on_white/cosmotux.png b/dist/_/calendars/images/cards/black_on_white/cosmotux.png deleted file mode 100644 index 69e6ce6..0000000 Binary files a/dist/_/calendars/images/cards/black_on_white/cosmotux.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/black_on_white/interject.png b/dist/_/calendars/images/cards/black_on_white/interject.png deleted file mode 100644 index 2da667a..0000000 Binary files a/dist/_/calendars/images/cards/black_on_white/interject.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/blue_on_white/arch.png b/dist/_/calendars/images/cards/blue_on_white/arch.png deleted file mode 100644 index aa9b754..0000000 Binary files a/dist/_/calendars/images/cards/blue_on_white/arch.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/orange_on_white/arch.png b/dist/_/calendars/images/cards/orange_on_white/arch.png deleted file mode 100644 index 9351588..0000000 Binary files a/dist/_/calendars/images/cards/orange_on_white/arch.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/orange_on_white/cron.png b/dist/_/calendars/images/cards/orange_on_white/cron.png deleted file mode 100644 index 215665d..0000000 Binary files a/dist/_/calendars/images/cards/orange_on_white/cron.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/orange_on_white/debian.png b/dist/_/calendars/images/cards/orange_on_white/debian.png deleted file mode 100644 index 3bd6c2b..0000000 Binary files a/dist/_/calendars/images/cards/orange_on_white/debian.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/orange_on_white/fedora.png b/dist/_/calendars/images/cards/orange_on_white/fedora.png deleted file mode 100644 index 85576db..0000000 Binary files a/dist/_/calendars/images/cards/orange_on_white/fedora.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/orange_on_white/freebsd.png b/dist/_/calendars/images/cards/orange_on_white/freebsd.png deleted file mode 100644 index f8a8b9b..0000000 Binary files a/dist/_/calendars/images/cards/orange_on_white/freebsd.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/orange_on_white/gcc.png b/dist/_/calendars/images/cards/orange_on_white/gcc.png deleted file mode 100644 index 1add36b..0000000 Binary files a/dist/_/calendars/images/cards/orange_on_white/gcc.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/orange_on_white/gnu-linux.png b/dist/_/calendars/images/cards/orange_on_white/gnu-linux.png deleted file mode 100644 index bf79195..0000000 Binary files a/dist/_/calendars/images/cards/orange_on_white/gnu-linux.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/orange_on_white/gnu.png b/dist/_/calendars/images/cards/orange_on_white/gnu.png deleted file mode 100644 index 1bb15d7..0000000 Binary files a/dist/_/calendars/images/cards/orange_on_white/gnu.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/orange_on_white/golang.png b/dist/_/calendars/images/cards/orange_on_white/golang.png deleted file mode 100644 index 6dabd53..0000000 Binary files a/dist/_/calendars/images/cards/orange_on_white/golang.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/orange_on_white/iptables.png b/dist/_/calendars/images/cards/orange_on_white/iptables.png deleted file mode 100644 index 81a8a59..0000000 Binary files a/dist/_/calendars/images/cards/orange_on_white/iptables.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/orange_on_white/joker-poster.png b/dist/_/calendars/images/cards/orange_on_white/joker-poster.png deleted file mode 100644 index 17be5df..0000000 Binary files a/dist/_/calendars/images/cards/orange_on_white/joker-poster.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/orange_on_white/kali.png b/dist/_/calendars/images/cards/orange_on_white/kali.png deleted file mode 100644 index 3316527..0000000 Binary files a/dist/_/calendars/images/cards/orange_on_white/kali.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/orange_on_white/kill.png b/dist/_/calendars/images/cards/orange_on_white/kill.png deleted file mode 100644 index 7b3bd66..0000000 Binary files a/dist/_/calendars/images/cards/orange_on_white/kill.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/orange_on_white/linuxmasterrace.png b/dist/_/calendars/images/cards/orange_on_white/linuxmasterrace.png deleted file mode 100644 index a4f690f..0000000 Binary files a/dist/_/calendars/images/cards/orange_on_white/linuxmasterrace.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/orange_on_white/manjaro.png b/dist/_/calendars/images/cards/orange_on_white/manjaro.png deleted file mode 100644 index 068e4da..0000000 Binary files a/dist/_/calendars/images/cards/orange_on_white/manjaro.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/orange_on_white/penguin-skull.png b/dist/_/calendars/images/cards/orange_on_white/penguin-skull.png deleted file mode 100644 index 7a0e557..0000000 Binary files a/dist/_/calendars/images/cards/orange_on_white/penguin-skull.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/orange_on_white/php.png b/dist/_/calendars/images/cards/orange_on_white/php.png deleted file mode 100644 index c6f1949..0000000 Binary files a/dist/_/calendars/images/cards/orange_on_white/php.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/orange_on_white/python.png b/dist/_/calendars/images/cards/orange_on_white/python.png deleted file mode 100644 index 8037341..0000000 Binary files a/dist/_/calendars/images/cards/orange_on_white/python.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/orange_on_white/root.png b/dist/_/calendars/images/cards/orange_on_white/root.png deleted file mode 100644 index 449b90c..0000000 Binary files a/dist/_/calendars/images/cards/orange_on_white/root.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/orange_on_white/solus.png b/dist/_/calendars/images/cards/orange_on_white/solus.png deleted file mode 100644 index 347b91c..0000000 Binary files a/dist/_/calendars/images/cards/orange_on_white/solus.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/orange_on_white/su.png b/dist/_/calendars/images/cards/orange_on_white/su.png deleted file mode 100644 index 63c1d3a..0000000 Binary files a/dist/_/calendars/images/cards/orange_on_white/su.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/orange_on_white/sudo.png b/dist/_/calendars/images/cards/orange_on_white/sudo.png deleted file mode 100644 index ca21c9b..0000000 Binary files a/dist/_/calendars/images/cards/orange_on_white/sudo.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/orange_on_white/swift.png b/dist/_/calendars/images/cards/orange_on_white/swift.png deleted file mode 100644 index 4394a55..0000000 Binary files a/dist/_/calendars/images/cards/orange_on_white/swift.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/orange_on_white/tor.png b/dist/_/calendars/images/cards/orange_on_white/tor.png deleted file mode 100644 index 8d3bb56..0000000 Binary files a/dist/_/calendars/images/cards/orange_on_white/tor.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/orange_on_white/ubuntu.png b/dist/_/calendars/images/cards/orange_on_white/ubuntu.png deleted file mode 100644 index 403ced3..0000000 Binary files a/dist/_/calendars/images/cards/orange_on_white/ubuntu.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/orange_on_white/userdel.png b/dist/_/calendars/images/cards/orange_on_white/userdel.png deleted file mode 100644 index 9db0161..0000000 Binary files a/dist/_/calendars/images/cards/orange_on_white/userdel.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/white_on_black/arch.png b/dist/_/calendars/images/cards/white_on_black/arch.png deleted file mode 100644 index 504cf83..0000000 Binary files a/dist/_/calendars/images/cards/white_on_black/arch.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/white_on_black/cron.png b/dist/_/calendars/images/cards/white_on_black/cron.png deleted file mode 100644 index ccccd9e..0000000 Binary files a/dist/_/calendars/images/cards/white_on_black/cron.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/white_on_black/debian.png b/dist/_/calendars/images/cards/white_on_black/debian.png deleted file mode 100644 index 29c2da6..0000000 Binary files a/dist/_/calendars/images/cards/white_on_black/debian.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/white_on_black/fedora.png b/dist/_/calendars/images/cards/white_on_black/fedora.png deleted file mode 100644 index 9b07eb4..0000000 Binary files a/dist/_/calendars/images/cards/white_on_black/fedora.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/white_on_black/freebsd.png b/dist/_/calendars/images/cards/white_on_black/freebsd.png deleted file mode 100644 index fb961a3..0000000 Binary files a/dist/_/calendars/images/cards/white_on_black/freebsd.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/white_on_black/gcc.png b/dist/_/calendars/images/cards/white_on_black/gcc.png deleted file mode 100644 index 038d0b4..0000000 Binary files a/dist/_/calendars/images/cards/white_on_black/gcc.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/white_on_black/gnu-linux.png b/dist/_/calendars/images/cards/white_on_black/gnu-linux.png deleted file mode 100644 index 1ad6c94..0000000 Binary files a/dist/_/calendars/images/cards/white_on_black/gnu-linux.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/white_on_black/gnu.png b/dist/_/calendars/images/cards/white_on_black/gnu.png deleted file mode 100644 index 3b7e261..0000000 Binary files a/dist/_/calendars/images/cards/white_on_black/gnu.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/white_on_black/golang.png b/dist/_/calendars/images/cards/white_on_black/golang.png deleted file mode 100644 index 98d070c..0000000 Binary files a/dist/_/calendars/images/cards/white_on_black/golang.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/white_on_black/iptables.png b/dist/_/calendars/images/cards/white_on_black/iptables.png deleted file mode 100644 index d0d880f..0000000 Binary files a/dist/_/calendars/images/cards/white_on_black/iptables.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/white_on_black/kali.png b/dist/_/calendars/images/cards/white_on_black/kali.png deleted file mode 100644 index a4d4b09..0000000 Binary files a/dist/_/calendars/images/cards/white_on_black/kali.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/white_on_black/kill.png b/dist/_/calendars/images/cards/white_on_black/kill.png deleted file mode 100644 index 8dbc2d4..0000000 Binary files a/dist/_/calendars/images/cards/white_on_black/kill.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/white_on_black/linuxmasterrace.png b/dist/_/calendars/images/cards/white_on_black/linuxmasterrace.png deleted file mode 100644 index b3de2ff..0000000 Binary files a/dist/_/calendars/images/cards/white_on_black/linuxmasterrace.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/white_on_black/manjaro.png b/dist/_/calendars/images/cards/white_on_black/manjaro.png deleted file mode 100644 index 17421fc..0000000 Binary files a/dist/_/calendars/images/cards/white_on_black/manjaro.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/white_on_black/php.png b/dist/_/calendars/images/cards/white_on_black/php.png deleted file mode 100644 index dd40e0b..0000000 Binary files a/dist/_/calendars/images/cards/white_on_black/php.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/white_on_black/python.png b/dist/_/calendars/images/cards/white_on_black/python.png deleted file mode 100644 index 54709b9..0000000 Binary files a/dist/_/calendars/images/cards/white_on_black/python.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/white_on_black/root.png b/dist/_/calendars/images/cards/white_on_black/root.png deleted file mode 100644 index 2c01200..0000000 Binary files a/dist/_/calendars/images/cards/white_on_black/root.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/white_on_black/solus.png b/dist/_/calendars/images/cards/white_on_black/solus.png deleted file mode 100644 index fea2c44..0000000 Binary files a/dist/_/calendars/images/cards/white_on_black/solus.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/white_on_black/su.png b/dist/_/calendars/images/cards/white_on_black/su.png deleted file mode 100644 index 5f5f7ea..0000000 Binary files a/dist/_/calendars/images/cards/white_on_black/su.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/white_on_black/sudo.png b/dist/_/calendars/images/cards/white_on_black/sudo.png deleted file mode 100644 index b145c9d..0000000 Binary files a/dist/_/calendars/images/cards/white_on_black/sudo.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/white_on_black/swift.png b/dist/_/calendars/images/cards/white_on_black/swift.png deleted file mode 100644 index d8350ab..0000000 Binary files a/dist/_/calendars/images/cards/white_on_black/swift.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/white_on_black/tor.png b/dist/_/calendars/images/cards/white_on_black/tor.png deleted file mode 100644 index 7d83483..0000000 Binary files a/dist/_/calendars/images/cards/white_on_black/tor.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/white_on_black/ubuntu.png b/dist/_/calendars/images/cards/white_on_black/ubuntu.png deleted file mode 100644 index 55b06e3..0000000 Binary files a/dist/_/calendars/images/cards/white_on_black/ubuntu.png and /dev/null differ diff --git a/dist/_/calendars/images/cards/white_on_black/userdel.png b/dist/_/calendars/images/cards/white_on_black/userdel.png deleted file mode 100644 index c0bfdba..0000000 Binary files a/dist/_/calendars/images/cards/white_on_black/userdel.png and /dev/null differ diff --git a/dist/_/calendars/images/distros/android/android-trust.png b/dist/_/calendars/images/distros/android/android-trust.png deleted file mode 100644 index 395f8d6..0000000 Binary files a/dist/_/calendars/images/distros/android/android-trust.png and /dev/null differ diff --git a/dist/_/calendars/images/distros/arch/arch-anatomy.png b/dist/_/calendars/images/distros/arch/arch-anatomy.png deleted file mode 100644 index 9898893..0000000 Binary files a/dist/_/calendars/images/distros/arch/arch-anatomy.png and /dev/null differ diff --git a/dist/_/calendars/images/distros/arch/arch-badge.png b/dist/_/calendars/images/distros/arch/arch-badge.png deleted file mode 100644 index 737cd94..0000000 Binary files a/dist/_/calendars/images/distros/arch/arch-badge.png and /dev/null differ diff --git a/dist/_/calendars/images/distros/arch/arch-bang.png b/dist/_/calendars/images/distros/arch/arch-bang.png deleted file mode 100644 index 86371b4..0000000 Binary files a/dist/_/calendars/images/distros/arch/arch-bang.png and /dev/null differ diff --git a/dist/_/calendars/images/distros/arch/arch-bite.png b/dist/_/calendars/images/distros/arch/arch-bite.png deleted file mode 100644 index 01c57f8..0000000 Binary files a/dist/_/calendars/images/distros/arch/arch-bite.png and /dev/null differ diff --git a/dist/_/calendars/images/distros/arch/arch-formula.png b/dist/_/calendars/images/distros/arch/arch-formula.png deleted file mode 100644 index fad001c..0000000 Binary files a/dist/_/calendars/images/distros/arch/arch-formula.png and /dev/null differ diff --git a/dist/_/calendars/images/distros/arch/arch-lines.png b/dist/_/calendars/images/distros/arch/arch-lines.png deleted file mode 100644 index 8142145..0000000 Binary files a/dist/_/calendars/images/distros/arch/arch-lines.png and /dev/null differ diff --git a/dist/_/calendars/images/distros/arch/arch-linux-n1.png b/dist/_/calendars/images/distros/arch/arch-linux-n1.png deleted file mode 100644 index 3a870ed..0000000 Binary files a/dist/_/calendars/images/distros/arch/arch-linux-n1.png and /dev/null differ diff --git a/dist/_/calendars/images/distros/arch/arch-obey.png b/dist/_/calendars/images/distros/arch/arch-obey.png deleted file mode 100644 index 0feaa10..0000000 Binary files a/dist/_/calendars/images/distros/arch/arch-obey.png and /dev/null differ diff --git a/dist/_/calendars/images/distros/arch/arch-patrick.png b/dist/_/calendars/images/distros/arch/arch-patrick.png deleted file mode 100644 index c88ba87..0000000 Binary files a/dist/_/calendars/images/distros/arch/arch-patrick.png and /dev/null differ diff --git a/dist/_/calendars/images/distros/arch/arch-tux.png b/dist/_/calendars/images/distros/arch/arch-tux.png deleted file mode 100644 index cca8e31..0000000 Binary files a/dist/_/calendars/images/distros/arch/arch-tux.png and /dev/null differ diff --git a/dist/_/calendars/images/distros/arch/arch-vintage.png b/dist/_/calendars/images/distros/arch/arch-vintage.png deleted file mode 100644 index 381259c..0000000 Binary files a/dist/_/calendars/images/distros/arch/arch-vintage.png and /dev/null differ diff --git a/dist/_/calendars/images/distros/arch/arch-wanted.png b/dist/_/calendars/images/distros/arch/arch-wanted.png deleted file mode 100644 index 39206df..0000000 Binary files a/dist/_/calendars/images/distros/arch/arch-wanted.png and /dev/null differ diff --git a/dist/_/calendars/images/distros/arch/archlinux-fucking-awesome.png b/dist/_/calendars/images/distros/arch/archlinux-fucking-awesome.png deleted file mode 100644 index 03a3d74..0000000 Binary files a/dist/_/calendars/images/distros/arch/archlinux-fucking-awesome.png and /dev/null differ diff --git a/dist/_/calendars/images/distros/arch/clap-your-hands.png b/dist/_/calendars/images/distros/arch/clap-your-hands.png deleted file mode 100644 index af3ecf5..0000000 Binary files a/dist/_/calendars/images/distros/arch/clap-your-hands.png and /dev/null differ diff --git a/dist/_/calendars/images/distros/arch/dakr-side-of-arch.png b/dist/_/calendars/images/distros/arch/dakr-side-of-arch.png deleted file mode 100644 index 0d854d6..0000000 Binary files a/dist/_/calendars/images/distros/arch/dakr-side-of-arch.png and /dev/null differ diff --git a/dist/_/calendars/images/distros/arch/fearless.png b/dist/_/calendars/images/distros/arch/fearless.png deleted file mode 100644 index 31a08f1..0000000 Binary files a/dist/_/calendars/images/distros/arch/fearless.png and /dev/null differ diff --git a/dist/_/calendars/images/distros/arch/identify-arch.png b/dist/_/calendars/images/distros/arch/identify-arch.png deleted file mode 100644 index f9d2168..0000000 Binary files a/dist/_/calendars/images/distros/arch/identify-arch.png and /dev/null differ diff --git a/dist/_/calendars/images/distros/arch/in-arch-we-trust.png b/dist/_/calendars/images/distros/arch/in-arch-we-trust.png deleted file mode 100644 index d8c695a..0000000 Binary files a/dist/_/calendars/images/distros/arch/in-arch-we-trust.png and /dev/null differ diff --git a/dist/_/calendars/images/distros/arch/joan-of-arch.png b/dist/_/calendars/images/distros/arch/joan-of-arch.png deleted file mode 100644 index 82d608f..0000000 Binary files a/dist/_/calendars/images/distros/arch/joan-of-arch.png and /dev/null differ diff --git a/dist/_/calendars/images/distros/arch/kali-play.png b/dist/_/calendars/images/distros/arch/kali-play.png deleted file mode 100644 index b2c957f..0000000 Binary files a/dist/_/calendars/images/distros/arch/kali-play.png and /dev/null differ diff --git a/dist/_/calendars/images/distros/centos/centos-before-hoes.png b/dist/_/calendars/images/distros/centos/centos-before-hoes.png deleted file mode 100644 index d79a683..0000000 Binary files a/dist/_/calendars/images/distros/centos/centos-before-hoes.png and /dev/null differ diff --git a/dist/_/calendars/images/distros/debian/debian-stable.png b/dist/_/calendars/images/distros/debian/debian-stable.png deleted file mode 100644 index 763e26a..0000000 Binary files a/dist/_/calendars/images/distros/debian/debian-stable.png and /dev/null differ diff --git a/dist/_/calendars/images/distros/debian/debian-tribal.png b/dist/_/calendars/images/distros/debian/debian-tribal.png deleted file mode 100644 index 09ce4e2..0000000 Binary files a/dist/_/calendars/images/distros/debian/debian-tribal.png and /dev/null differ diff --git a/dist/_/calendars/images/distros/debian/starry.png b/dist/_/calendars/images/distros/debian/starry.png deleted file mode 100644 index 9dc87b2..0000000 Binary files a/dist/_/calendars/images/distros/debian/starry.png and /dev/null differ diff --git a/dist/_/calendars/images/distros/fedora/fedora-f-word.png b/dist/_/calendars/images/distros/fedora/fedora-f-word.png deleted file mode 100644 index e8b4c1c..0000000 Binary files a/dist/_/calendars/images/distros/fedora/fedora-f-word.png and /dev/null differ diff --git a/dist/_/calendars/images/distros/fedora/fedora-vintage.png b/dist/_/calendars/images/distros/fedora/fedora-vintage.png deleted file mode 100644 index f987976..0000000 Binary files a/dist/_/calendars/images/distros/fedora/fedora-vintage.png and /dev/null differ diff --git a/dist/_/calendars/images/distros/gentoo/install-gentoo.png b/dist/_/calendars/images/distros/gentoo/install-gentoo.png deleted file mode 100644 index 015d0d8..0000000 Binary files a/dist/_/calendars/images/distros/gentoo/install-gentoo.png and /dev/null differ diff --git a/dist/_/calendars/images/distros/kali/house-kali.png b/dist/_/calendars/images/distros/kali/house-kali.png deleted file mode 100644 index 7927cd7..0000000 Binary files a/dist/_/calendars/images/distros/kali/house-kali.png and /dev/null differ diff --git a/dist/_/calendars/images/distros/kali/kali-dragon.png b/dist/_/calendars/images/distros/kali/kali-dragon.png deleted file mode 100644 index 468a889..0000000 Binary files a/dist/_/calendars/images/distros/kali/kali-dragon.png and /dev/null differ diff --git a/dist/_/calendars/images/distros/kali/kali-myth.png b/dist/_/calendars/images/distros/kali/kali-myth.png deleted file mode 100644 index dc41d77..0000000 Binary files a/dist/_/calendars/images/distros/kali/kali-myth.png and /dev/null differ diff --git a/dist/_/calendars/images/distros/kali/kali-obey.png b/dist/_/calendars/images/distros/kali/kali-obey.png deleted file mode 100644 index 325ceb1..0000000 Binary files a/dist/_/calendars/images/distros/kali/kali-obey.png and /dev/null differ diff --git a/dist/_/calendars/images/distros/kali/kali-play.png b/dist/_/calendars/images/distros/kali/kali-play.png deleted file mode 100644 index b2c957f..0000000 Binary files a/dist/_/calendars/images/distros/kali/kali-play.png and /dev/null differ diff --git a/dist/_/calendars/images/distros/manjaro/manjaro-sun.png b/dist/_/calendars/images/distros/manjaro/manjaro-sun.png deleted file mode 100644 index 709e5b4..0000000 Binary files a/dist/_/calendars/images/distros/manjaro/manjaro-sun.png and /dev/null differ diff --git a/dist/_/calendars/images/distros/opensuse/opensuse.png b/dist/_/calendars/images/distros/opensuse/opensuse.png deleted file mode 100644 index 6ed9083..0000000 Binary files a/dist/_/calendars/images/distros/opensuse/opensuse.png and /dev/null differ diff --git a/dist/_/calendars/images/distros/ubuntu/i-want-to-ubuntu.png b/dist/_/calendars/images/distros/ubuntu/i-want-to-ubuntu.png deleted file mode 100644 index 9f32f36..0000000 Binary files a/dist/_/calendars/images/distros/ubuntu/i-want-to-ubuntu.png and /dev/null differ diff --git a/dist/_/calendars/images/distros/ubuntu/ubuntu-great.png b/dist/_/calendars/images/distros/ubuntu/ubuntu-great.png deleted file mode 100644 index b2f6998..0000000 Binary files a/dist/_/calendars/images/distros/ubuntu/ubuntu-great.png and /dev/null differ diff --git a/dist/_/calendars/images/distros/ubuntu/ubuntu-user.png b/dist/_/calendars/images/distros/ubuntu/ubuntu-user.png deleted file mode 100644 index 024b4ba..0000000 Binary files a/dist/_/calendars/images/distros/ubuntu/ubuntu-user.png and /dev/null differ diff --git a/dist/_/calendars/index.html b/dist/_/calendars/index.html deleted file mode 100644 index b563666..0000000 --- a/dist/_/calendars/index.html +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - - Calendars - - - - - -
-
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
- -
- -

CTRL+P to print. Remember to turn of margins!

-
-
-
-

Calendar, 2018

-
- - - \ No newline at end of file diff --git a/dist/_/calendars/js/app.js b/dist/_/calendars/js/app.js deleted file mode 100644 index 35f8543..0000000 --- a/dist/_/calendars/js/app.js +++ /dev/null @@ -1,380 +0,0 @@ -/******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { -/******/ configurable: false, -/******/ enumerable: true, -/******/ get: getter -/******/ }); -/******/ } -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 0); -/******/ }) -/************************************************************************/ -/******/ ([ -/* 0 */ -/***/ (function(module, exports, __webpack_require__) { - -__webpack_require__(1); -module.exports = __webpack_require__(2); - - -/***/ }), -/* 1 */ -/***/ (function(module, exports) { - -document.addEventListener("DOMContentLoaded", function() { - function getURLParameter(name) { - return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.search) || [null, ''])[1].replace(/\+/g, '%20')) || null; - } - - var cals = document.querySelectorAll('.calendar'); - var dateYear = getURLParameter('year') || (new Date()).getFullYear(); - var calInfo = []; - var calWeekdaysLong = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', - 'Friday', 'Saturday', 'Sunday']; - var calWeekdaysShort = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']; - var calWeekdaysNarrow = ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su']; - - // Turn digit into hex or binary - function toHex(d) { return ("0"+(Number(d).toString(16))).slice(-2) } - function toBinary(d) { return String("00000" + (+d).toString(2)).slice(-5); } - - document.querySelector('.year').innerHTML = dateYear; - - // Fill the calInfo variable with info about this year - for (var mm = 1; mm <= 12; mm++) { - var month = (new Date(dateYear, mm-1, 1)); - var days = 32 - (new Date(dateYear, mm-1, 32)).getDate(); - calInfo[mm] = {}; - calInfo[mm]['days'] = []; - calInfo[mm]['daysByName'] = {}; - - calInfo[mm]['2-digit'] = month.toLocaleDateString('en', { month: '2-digit' }); - calInfo[mm]['numeric'] = month.toLocaleDateString('en', { month: 'numeric' }); - calInfo[mm]['name_long'] = month.toLocaleDateString('en', { month: 'long' }); - calInfo[mm]['name_short'] = month.toLocaleDateString('en', { month: 'short' }); - calInfo[mm]['name_narrow'] = month.toLocaleDateString('en', { month: 'narrow' }); - - calInfo[mm]['hex'] = toHex(calInfo[mm]['numeric']); - calInfo[mm]['binary'] = toBinary(calInfo[mm]['numeric']); - - for (var i = 0; i < calWeekdaysLong.length; i++) { - calInfo[mm]['daysByName'][calWeekdaysLong[i]] = []; - } - - for (var dd = 1; dd <= days; dd++) { - var date = new Date(dateYear, mm-1, dd); - calInfo[mm]['days'][dd] = {}; - - calInfo[mm]['days'][dd]['2-digit'] = date.toLocaleDateString('en', { day: '2-digit' }); - calInfo[mm]['days'][dd]['numeric'] = date.toLocaleDateString('en', { day: 'numeric' }); - calInfo[mm]['days'][dd]['name_long'] = date.toLocaleDateString('en', { weekday: 'long' }); - calInfo[mm]['days'][dd]['name_short'] = date.toLocaleDateString('en', { weekday: 'short' }); - calInfo[mm]['days'][dd]['name_narrow'] = date.toLocaleDateString('en', { weekday: 'narrow' }); - - calInfo[mm]['days'][dd]['hex'] = toHex(calInfo[mm]['days'][dd]['numeric']); - calInfo[mm]['days'][dd]['binary'] = toBinary(calInfo[mm]['days'][dd]['numeric']); - - calInfo[mm]['daysByName'][ calInfo[mm]['days'][dd]['name_long'] ].push(dd); - } - } - - // Put info into calendars - for (var i = 0; i < cals.length; i++) { - - cals[i].classList += ' ' + (getURLParameter('theme') || 'theme-dark'); - cals[i].classList += ' ' + (getURLParameter('paper_size') || 'a4'); - cals[i].classList += ' ' + (getURLParameter('layout') || 'layout-middle-hole'); - cals[i].style.backgroundImage = 'URL(\"images/' + (getURLParameter('bg_image') || 'cards/white_on_black/cron') + '.png\")'; - - // Create 3 extra months. This allows us to change layout easier - for (var extraMonth = 1; extraMonth <= 3; extraMonth++) { - var container = document.createElement("div"); - container.classList += 'cal-month cal-month-extra cal-month-extra-' + extraMonth; - - var calYear = document.createElement("h1"); - calYear.classList += 'cal-year'; - var yearText = String(dateYear); - - switch (getURLParameter('year_rep') || 'hex') { - case 'hex': - yearText = '0x' + dateYear.toString(16).toUpperCase(); - break; - case 'binary': - yearText = toBinary(yearText); - break; - case 'short': - yearText = yearText.substring(2); - break; - } - - var calYearName = document.createTextNode(yearText); - - - calYear.appendChild(calYearName); - container.appendChild(calYear); - cals[i].appendChild(container); - } - - for (var mm = 1; mm <= 12; mm++) { - var container = document.createElement("div"); - container.classList += 'cal-month cal-month-' + mm; - - firstHasBeen = false; - - // Create month heading and weekday names - (function() { - var calMonth = document.createElement("h2"); - calMonth.classList += 'cal-month-title'; - var calMonthName = document.createTextNode(calInfo[mm][ (getURLParameter('month_rep') || 'hex') ].toUpperCase()); - - calMonth.appendChild(calMonthName); - container.appendChild(calMonth); - - var column = document.createElement("ul"); - column.classList += 'cal-weekday-headings'; - - for (var c = 0; c < calWeekdaysShort.length; c++) { - var heading = document.createElement("li"); - - switch (getURLParameter('weekday_rep') || 'narrow') { - case 'long': - weekdayName = calWeekdaysLong[c]; - break; - case 'short': - weekdayName = calWeekdaysShort[c]; - break; - case 'narrow': - weekdayName = calWeekdaysNarrow[c]; - break; - default: - weekdayName = calWeekdaysNarrow[c]; - } - - var dayName = document.createTextNode(weekdayName); - heading.classList += 'cal-heading-' + calWeekdaysLong[c].toLowerCase(); - heading.appendChild(dayName); - column.appendChild(heading); - } - container.appendChild(column); - })(); - - // 6 Calendar rows - for (var r = 0; r < 6; r++) { - var column = document.createElement("ul"); - - // 7 Calendar columns - for (var c = 0; c < calWeekdaysShort.length; c++) { - // Get array with days (in digits) on this day (by name) - // For example, get the digits of all Mondays in this month... - var daysOnThisWeekday = calInfo[mm]['daysByName'][calWeekdaysLong[c]]; - var dayToShow = daysOnThisWeekday[r]; - var row = document.createElement("li"); - row.classList += 'cal-day-' + calWeekdaysLong[c].toLowerCase(); - - // First day of the month - if (daysOnThisWeekday[r] == 1) { - firstHasBeen = true; - } - - // The first day of the month have not been yet - // lets move this day down to the next row then. - if (!firstHasBeen && r == 0 && i == 0) { - daysOnThisWeekday.unshift(0); - } - - // If this day doesn't exsist (i.e. the 5th sunday in a month with only 4 sundays) - // make an empty day, so things align properly - if (!daysOnThisWeekday[r]) { - dayToShow = ''; - row.classList += ' cal-day-empty'; - } else { - row.classList += ' cal-day-' + daysOnThisWeekday[r]; - - dayToShow = calInfo[mm]['days'][daysOnThisWeekday[r]][ (getURLParameter('day_rep') || 'hex') ]; - } - - var dayOnThisDay = document.createTextNode(dayToShow); - row.appendChild(dayOnThisDay); - column.appendChild(row); - } - - container.appendChild(column); - } - firstHasBeen = false; - - cals[i].appendChild(container); - } - - } - - (function() { - // Give height to extra months, so we can position the year within them - var calMonths = document.querySelectorAll('.cal-month'); - var calMonthHeightTotal = 0; - for (var i = 0; i < calMonths.length; i++) { - calMonthHeightTotal += calMonths[i].clientHeight; - } - - var extraMonths = document.querySelectorAll('.cal-month-extra'); - for (var i = 0; i < extraMonths.length; i++) { - // Divide by 12.5 because then we get rid of some extra high months with 6 rows... - // Just seems to be giving a better height - extraMonths[i].style.height = (calMonthHeightTotal/12.5)+'px'; - } - })(); - - (function() { - var images = { - white_on_black: [ - 'White on black', - 'arch', - 'cron', - 'debian', - 'fedora', - 'freebsd', - 'gcc', - 'gnu-linux', - 'gnu', - 'golang', - 'iptables', - 'kali', - 'kill', - 'linuxmasterrace', - 'manjaro', - 'php', - 'python', - 'root', - 'solus', - 'sudo', - 'su', - 'swift', - 'tor', - 'ubuntu', - 'userdel', - ], - orange_on_white: [ - 'Orange on white', - 'arch', - 'cron', - 'debian', - 'fedora', - 'freebsd', - 'gcc', - 'gnu-linux', - 'gnu', - 'golang', - 'iptables', - 'joker-poster', - 'kali', - 'kill', - 'linuxmasterrace', - 'manjaro', - 'penguin-skull', - 'php', - 'python', - 'root', - 'solus', - 'sudo', - 'su', - 'swift', - 'tor', - 'ubuntu', - 'userdel', - ], - blue_on_white: [ - 'Blue on white', - 'arch', - ], - black_on_white: [ - 'Black on white', - 'interject', - 'cosmotux', - ] - } - - var settingBgImage = document.querySelector('#setting-bg_image'); - - for (var i in images) { - if (images.hasOwnProperty(i)) { - var optgroup = document.createElement('optgroup'); - optgroup.setAttribute('label', images[i][0]); - - - for (var j = 1; j < images[i].length; j++) { - var option = document.createElement('option'); - var optionText = document.createTextNode( images[i][j] ); - - option.setAttribute('value', 'cards/' + i +'/'+ images[i][j]) - - option.appendChild(optionText); - optgroup.appendChild(option); - } - - settingBgImage.appendChild(optgroup); - } - } - })(); -}); - -/***/ }), -/* 2 */ -/***/ (function(module, exports) { - -// removed by extract-text-webpack-plugin - -/***/ }) -/******/ ]); \ No newline at end of file diff --git a/dist/_/editor/editor.css b/dist/_/editor/editor.css deleted file mode 100644 index 3f1ede0..0000000 --- a/dist/_/editor/editor.css +++ /dev/null @@ -1,126 +0,0 @@ -body { - background-color: var(--color-dark-contrast); -} - -#editor { - padding: 0 1em; -} - -@media (min-width: 600px) { - #editor { - padding: 0 2em; - } -} - -@media (min-width: 1200px) { - #editor { - padding: 0 4em; - } -} - -#editor form { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; -} - -#editor .editor-area { - display: grid; - grid-template-columns: 1fr 1fr; - grid-gap: 4vw; - gap: 4vw; - width: 100%; - max-width: 100%; - margin-top: 2em; -} - -@media (min-width: 600px) { - #editor .editor-area { - grid-template-columns: 1fr 1fr 1fr; - } -} - -@media (min-width: 1200px) { - #editor .editor-area { - grid-template-columns: 1fr 1fr 1fr 1fr; - } -} - -#editor .editor-area .input { - display: flex; - flex-direction: column; - width: 100%; - overflow: hidden; -} - -#editor .editor-area .input input { - padding: 1vw; - border-radius: 0; - width: 100%; - max-width: 100%; - outline: none; - border: 1px solid var(--color-border); - color: var(--color-light-contrast); - background-color: var(--color-dark-contrast); - font-size: inherit; - font-family: inherit; -} - -#editor .editor-area .input label { - padding: 0 0 1vw 0; - text-transform: capitalize; -} - -#editor .editor-area { - padding-bottom: 4vw; -} - -#editor .editor-input-wrapper { - display: grid; - grid-template-columns: 1fr 1fr; - grid-template-rows: 80vh; - width: 100%; - min-height: 512px; - border: 1px solid var(--color-border); -} - -@media (min-width: 600px) { - #editor .editor-input-wrapper { - grid-template-rows: 50vh; - } -} - -#editor .editor-input, -#editor .editor-output { - width: 100%; - height: 99.5%; - padding: 4vw; - resize: vertical; - outline: none; - font-size: inherit; - font-family: inherit; - color: var(--color-light-contrast); - border: none; - background-color: var(--color-dark-contrast); -} - -#editor .editor-input-preview { - border-left: 1px solid var(--color-border); - width: 100%; - height: 100%; - padding: 4vw; - overflow: auto; -} - -#editor button { - margin: 1em 0; -} - -#editor button + button { - margin: 0 0 1em; -} - -#editor .editor-message-area { - margin: 2em 0; -} diff --git a/dist/_/editor/editor.js b/dist/_/editor/editor.js deleted file mode 100644 index 11b2e61..0000000 --- a/dist/_/editor/editor.js +++ /dev/null @@ -1,224 +0,0 @@ -;(function () { - findEditorWrapper() - .then((editorWrapper) => { - console.log('editorWrapper', editorWrapper) - setupEditorWrapper(editorWrapper) - }) - .catch((error) => { - console.error(error) - }) -})() - -function findEditorWrapper() { - return new Promise((resolve, reject) => { - const editorWrapper = document.querySelector('#editor') - - if (!editorWrapper) { - reject('You need to create an element with an id of "editor"') - } - - resolve(editorWrapper) - }) -} - -function getTemplatePath(editorWrapper) { - return new Promise((resolve, reject) => { - try { - const templatePath = editorWrapper.dataset.editorTemplate - resolve(templatePath) - } catch (error) { - reject(error) - } - }) -} - -function setupEditorWrapper(editorWrapper) { - let jsonOutput = { - content: [], - } - let jsonTemplate = {} - - const editorInput = document.createElement('textarea') - editorInput.name = 'editor-input' - editorInput.classList.add('editor-input') - - const editorInputPreview = document.createElement('div') - editorInputPreview.classList.add('editor-input-preview') - editorInputPreview.classList.add('text-content') - - const editorInputWrapper = document.createElement('div') - editorInputWrapper.classList.add('editor-input-wrapper') - editorInputWrapper.appendChild(editorInput) - editorInputWrapper.appendChild(editorInputPreview) - - const editorArea = document.createElement('div') - editorArea.classList.add('editor-area') - - const editorOutput = document.createElement('textarea') - editorOutput.name = 'editor-output' - editorOutput.classList.add('editor-output') - editorOutput.style.display = 'none' - - const editorMessageArea = document.createElement('p') - editorMessageArea.classList.add('editor-message-area') - editorMessageArea.style.display = 'none' - - const editorSaveButton = document.createElement('button') - editorSaveButton.type = 'submit' - editorSaveButton.appendChild(document.createTextNode('Save')) - - const editorInputButton = document.createElement('button') - editorInputButton.type = 'button' - editorInputButton.appendChild(document.createTextNode('Input JSON')) - editorInputButton.classList.add('secondary') - - const editorForm = document.createElement('form') - editorForm.appendChild(editorArea) - editorForm.appendChild(editorInputWrapper) - editorForm.appendChild(editorMessageArea) - editorForm.appendChild(editorSaveButton) - editorForm.appendChild(editorInputButton) - editorForm.appendChild(editorOutput) - editorWrapper.appendChild(editorForm) - - let oldInputLength = editorInput.value.length - if (!!marked) { - setInterval(() => { - if (!!editorInput.value && editorInput.value.length !== oldInputLength) { - editorInputPreview.innerHTML = marked(editorInput.value) - oldInputLength = editorInput.value.length - } - }, 500) - } - - getTemplatePath(editorWrapper).then((templatePath) => { - console.log(templatePath) - - fetch(templatePath) - .then((r) => r.json()) - .then((r) => { - jsonTemplate = r - setupEditorInputs(editorInput, editorOutput, editorArea, jsonTemplate) - formInputEventCallback({ target: editorInput }) - }) - .catch((e) => console.error(e)) - }) - - editorForm.addEventListener('input', formInputEventCallback) - editorForm.addEventListener('submit', function (submitEvent) { - submitEvent.preventDefault() - jsonOutput['meta'] = jsonTemplate - formInputEventCallback({ target: editorInput }) - copyToClipboard(editorOutput.value) - displayEditorMessage(editorMessageArea, editorSaveButton, 'JSON copied to clipboard!') - jsonOutput['meta'] = null - formInputEventCallback({ target: editorInput }) - }) - - function formInputEventCallback(formInputEvent) { - const input = formInputEvent.target - - if (input.name === 'editor-input') { - jsonOutput['content'][0] = { text: input.value } - } else if (input.name === 'editor-output') { - jsonOutput = JSON.parse(input.value) - console.log(jsonOutput) - - for (const key in jsonOutput) { - if (Object.hasOwnProperty.call(jsonOutput, key)) { - let updateValue = jsonOutput[key] - let inputToUpdate = input.form.querySelector('input[name="' + key + '"]') - - if (inputToUpdate) { - inputToUpdate.value = updateValue - } - } - } - - editorInput.value = jsonOutput['content'][0].text - editorArea.style.display = '' - editorInputWrapper.style.display = '' - editorSaveButton.style.display = '' - editorOutput.style.display = 'none' - } else if (input.name) { - jsonOutput[input.name] = input.value - } - - editorOutput.value = JSON.stringify(jsonOutput, null, ' ') - } - - // Show JSON input - editorInputButton.addEventListener('click', function () { - const originalEditorInputButtonText = editorInputButton.innerText - editorInputButton.innerText = 'Paste JSON in the textarea' - editorInputButton.disabled = true - - editorArea.style.display = 'none' - editorInputWrapper.style.display = 'none' - editorSaveButton.style.display = 'none' - editorOutput.style.display = '' - - setTimeout(() => { - editorInputButton.innerText = originalEditorInputButtonText - editorInput.style.display = '' - editorArea.style.display = '' - editorSaveButton.style.display = '' - editorOutput.style.display = 'none' - editorInputButton.disabled = false - }, 10000) - }) -} - -function setupEditorInputs(editorInput, editorOutput, editorArea, jsonTemplate) { - jsonTemplate.fields.forEach((field) => { - const label = document.createElement('label') - label.appendChild(document.createTextNode(field.name)) - - const input = document.createElement('input') - input.name = field.name - input.type = field.type - input.required = field.required - input.value = field.default - - const wrapper = document.createElement('div') - wrapper.classList.add('input') - wrapper.appendChild(label) - wrapper.appendChild(input) - editorArea.appendChild(wrapper) - }) -} - -function copyToClipboard(text) { - if (window.clipboardData && window.clipboardData.setData) { - // Internet Explorer-specific code path to prevent textarea being shown while dialog is visible. - return window.clipboardData.setData('Text', text) - } else if (document.queryCommandSupported && document.queryCommandSupported('copy')) { - var textarea = document.createElement('textarea') - textarea.textContent = text - textarea.style.position = 'fixed' // Prevent scrolling to bottom of page in Microsoft Edge. - document.body.appendChild(textarea) - textarea.select() - try { - return document.execCommand('copy') // Security exception may be thrown by some browsers. - } catch (ex) { - console.warn('Copy to clipboard failed.', ex) - return false - } finally { - document.body.removeChild(textarea) - } - } -} - -function displayEditorMessage(editorMessageArea, editorSaveButton, message) { - editorMessageArea.innerText = message - editorMessageArea.style.display = '' - - editorSaveButton.style.display = 'none' - - setTimeout(() => { - editorMessageArea.style.display = 'none' - editorMessageArea.innerText = '' - - editorSaveButton.style.display = '' - }, 3000) -} diff --git a/dist/_/editor/index.nunjucks b/dist/_/editor/index.nunjucks deleted file mode 100644 index e9cff01..0000000 --- a/dist/_/editor/index.nunjucks +++ /dev/null @@ -1,12 +0,0 @@ -{% set title = "Editor" %} -{% set body_id = "editor-page" %} -{% set body_classes = "nav-small" %} -{% extends "default.nunjucks" %} -{% block content %} -
-{% endblock %} -{% block scripts_after %} - - - -{% endblock %} \ No newline at end of file diff --git a/dist/_/editor/marked.js b/dist/_/editor/marked.js deleted file mode 100644 index 3c28a18..0000000 --- a/dist/_/editor/marked.js +++ /dev/null @@ -1,1431 +0,0 @@ -/** - * marked - a markdown parser - * Copyright (c) 2011-2021, Christopher Jeffrey. (MIT Licensed) - * https://github.com/markedjs/marked - */ -!(function (e, u) { - 'object' == typeof exports && 'undefined' != typeof module - ? (module.exports = u()) - : 'function' == typeof define && define.amd - ? define(u) - : ((e = 'undefined' != typeof globalThis ? globalThis : e || self).marked = u()) -})(this, function () { - 'use strict' - function r(e, u) { - for (var t = 0; t < u.length; t++) { - var n = u[t] - ;(n.enumerable = n.enumerable || !1), - (n.configurable = !0), - 'value' in n && (n.writable = !0), - Object.defineProperty(e, n.key, n) - } - } - function i(e, u) { - ;(null == u || u > e.length) && (u = e.length) - for (var t = 0, n = new Array(u); t < u; t++) n[t] = e[t] - return n - } - function c(e, u) { - var t - if ('undefined' != typeof Symbol && null != e[Symbol.iterator]) return (t = e[Symbol.iterator]()).next.bind(t) - if ( - Array.isArray(e) || - (t = (function (e, u) { - if (e) { - if ('string' == typeof e) return i(e, u) - var t = Object.prototype.toString.call(e).slice(8, -1) - return 'Map' === (t = 'Object' === t && e.constructor ? e.constructor.name : t) || 'Set' === t - ? Array.from(e) - : 'Arguments' === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) - ? i(e, u) - : void 0 - } - })(e)) || - (u && e && 'number' == typeof e.length) - ) { - t && (e = t) - var n = 0 - return function () { - return n >= e.length ? { done: !0 } : { done: !1, value: e[n++] } - } - } - throw new TypeError( - 'Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.' - ) - } - function t(e) { - return D[e] - } - var e, - u = - ((function (u) { - function e() { - return { - baseUrl: null, - breaks: !1, - gfm: !0, - headerIds: !0, - headerPrefix: '', - highlight: null, - langPrefix: 'language-', - mangle: !0, - pedantic: !1, - renderer: null, - sanitize: !1, - sanitizer: null, - silent: !1, - smartLists: !1, - smartypants: !1, - tokenizer: null, - walkTokens: null, - xhtml: !1, - } - } - u.exports = { - defaults: e(), - getDefaults: e, - changeDefaults: function (e) { - u.exports.defaults = e - }, - } - })((e = { exports: {} })), - e.exports), - n = /[&<>"']/, - s = /[&<>"']/g, - l = /[<>"']|&(?!#?\w+;)/, - a = /[<>"']|&(?!#?\w+;)/g, - D = { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' } - var o = /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi - function h(e) { - return e.replace(o, function (e, u) { - return 'colon' === (u = u.toLowerCase()) - ? ':' - : '#' === u.charAt(0) - ? 'x' === u.charAt(1) - ? String.fromCharCode(parseInt(u.substring(2), 16)) - : String.fromCharCode(+u.substring(1)) - : '' - }) - } - var p = /(^|[^\[])\^/g - var g = /[^\w:]/g, - f = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i - var F = {}, - A = /^[^:]+:\/*[^/]*$/, - C = /^([^:]+:)[\s\S]*$/, - d = /^([^:]+:\/*[^/]*)[\s\S]*$/ - function E(e, u) { - F[' ' + e] || (A.test(e) ? (F[' ' + e] = e + '/') : (F[' ' + e] = k(e, '/', !0))) - var t = -1 === (e = F[' ' + e]).indexOf(':') - return '//' === u.substring(0, 2) - ? t - ? u - : e.replace(C, '$1') + u - : '/' === u.charAt(0) - ? t - ? u - : e.replace(d, '$1') + u - : e + u - } - function k(e, u, t) { - var n = e.length - if (0 === n) return '' - for (var r = 0; r < n; ) { - var i = e.charAt(n - r - 1) - if (i !== u || t) { - if (i === u || !t) break - r++ - } else r++ - } - return e.substr(0, n - r) - } - var m = function (e, u) { - if (u) { - if (n.test(e)) return e.replace(s, t) - } else if (l.test(e)) return e.replace(a, t) - return e - }, - b = h, - x = function (t, e) { - ;(t = t.source || t), (e = e || '') - var n = { - replace: function (e, u) { - return (u = (u = u.source || u).replace(p, '$1')), (t = t.replace(e, u)), n - }, - getRegex: function () { - return new RegExp(t, e) - }, - } - return n - }, - B = function (e, u, t) { - if (e) { - var n - try { - n = decodeURIComponent(h(t)).replace(g, '').toLowerCase() - } catch (e) { - return null - } - if (0 === n.indexOf('javascript:') || 0 === n.indexOf('vbscript:') || 0 === n.indexOf('data:')) return null - } - u && !f.test(t) && (t = E(u, t)) - try { - t = encodeURI(t).replace(/%25/g, '%') - } catch (e) { - return null - } - return t - }, - w = { exec: function () {} }, - v = function (e) { - for (var u, t, n = 1; n < arguments.length; n++) - for (t in (u = arguments[n])) Object.prototype.hasOwnProperty.call(u, t) && (e[t] = u[t]) - return e - }, - y = function (e) { - e && - e.sanitize && - !e.silent && - console.warn( - 'marked(): sanitize and sanitizer parameters are deprecated since version 0.7.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/#/USING_ADVANCED.md#options' - ) - }, - _ = function (e, u) { - if (u < 1) return '' - for (var t = ''; 1 < u; ) 1 & u && (t += e), (u >>= 1), (e += e) - return t + e - }, - z = u.defaults, - $ = k, - S = function (e, u) { - var t = e - .replace(/\|/g, function (e, u, t) { - for (var n = !1, r = u; 0 <= --r && '\\' === t[r]; ) n = !n - return n ? '|' : ' |' - }) - .split(/ \|/), - n = 0 - if (t.length > u) t.splice(u) - else for (; t.length < u; ) t.push('') - for (; n < t.length; n++) t[n] = t[n].trim().replace(/\\\|/g, '|') - return t - }, - T = m, - I = function (e, u) { - if (-1 === e.indexOf(u[1])) return -1 - for (var t = e.length, n = 0, r = 0; r < t; r++) - if ('\\' === e[r]) r++ - else if (e[r] === u[0]) n++ - else if (e[r] === u[1] && --n < 0) return r - return -1 - } - function R(e, u, t) { - var n = u.href, - r = u.title ? T(u.title) : null, - u = e[1].replace(/\\([\[\]])/g, '$1') - return '!' !== e[0].charAt(0) - ? { type: 'link', raw: t, href: n, title: r, text: u } - : { type: 'image', raw: t, href: n, title: r, text: T(u) } - } - var Z = (function () { - function e(e) { - this.options = e || z - } - var u = e.prototype - return ( - (u.space = function (e) { - e = this.rules.block.newline.exec(e) - if (e) return 1 < e[0].length ? { type: 'space', raw: e[0] } : { raw: '\n' } - }), - (u.code = function (e) { - var u = this.rules.block.code.exec(e) - if (u) { - e = u[0].replace(/^ {1,4}/gm, '') - return { type: 'code', raw: u[0], codeBlockStyle: 'indented', text: this.options.pedantic ? e : $(e, '\n') } - } - }), - (u.fences = function (e) { - var u = this.rules.block.fences.exec(e) - if (u) { - var t = u[0], - e = (function (e, u) { - if (null === (e = e.match(/^(\s+)(?:```)/))) return u - var t = e[1] - return u - .split('\n') - .map(function (e) { - var u = e.match(/^\s+/) - return null !== u && u[0].length >= t.length ? e.slice(t.length) : e - }) - .join('\n') - })(t, u[3] || '') - return { type: 'code', raw: t, lang: u[2] && u[2].trim(), text: e } - } - }), - (u.heading = function (e) { - var u = this.rules.block.heading.exec(e) - if (u) { - var t = u[2].trim() - return ( - /#$/.test(t) && ((e = $(t, '#')), (!this.options.pedantic && e && !/ $/.test(e)) || (t = e.trim())), - { type: 'heading', raw: u[0], depth: u[1].length, text: t } - ) - } - }), - (u.nptable = function (e) { - e = this.rules.block.nptable.exec(e) - if (e) { - var u = { - type: 'table', - header: S(e[1].replace(/^ *| *\| *$/g, '')), - align: e[2].replace(/^ *|\| *$/g, '').split(/ *\| */), - cells: e[3] ? e[3].replace(/\n$/, '').split('\n') : [], - raw: e[0], - } - if (u.header.length === u.align.length) { - for (var t = u.align.length, n = 0; n < t; n++) - /^ *-+: *$/.test(u.align[n]) - ? (u.align[n] = 'right') - : /^ *:-+: *$/.test(u.align[n]) - ? (u.align[n] = 'center') - : /^ *:-+ *$/.test(u.align[n]) - ? (u.align[n] = 'left') - : (u.align[n] = null) - for (t = u.cells.length, n = 0; n < t; n++) u.cells[n] = S(u.cells[n], u.header.length) - return u - } - } - }), - (u.hr = function (e) { - e = this.rules.block.hr.exec(e) - if (e) return { type: 'hr', raw: e[0] } - }), - (u.blockquote = function (e) { - var u = this.rules.block.blockquote.exec(e) - if (u) { - e = u[0].replace(/^ *> ?/gm, '') - return { type: 'blockquote', raw: u[0], text: e } - } - }), - (u.list = function (e) { - e = this.rules.block.list.exec(e) - if (e) { - for ( - var u, - t, - n, - r, - i, - s, - l = e[0], - a = e[2], - D = 1 < a.length, - o = { type: 'list', raw: l, ordered: D, start: D ? +a.slice(0, -1) : '', loose: !1, items: [] }, - c = e[0].match(this.rules.block.item), - h = !1, - p = c.length, - g = this.rules.block.listItemStart.exec(c[0]), - f = 0; - f < p; - f++ - ) { - if ( - ((l = u = c[f]), - this.options.pedantic || - ((s = u.match(new RegExp('\\n\\s*\\n {0,' + (g[0].length - 1) + '}\\S'))) && - ((t = u.length - s.index + c.slice(f + 1).join('\n').length), - (o.raw = o.raw.substring(0, o.raw.length - t)), - (l = u = u.substring(0, s.index)), - (p = f + 1))), - f !== p - 1) - ) { - if ( - ((n = this.rules.block.listItemStart.exec(c[f + 1])), - this.options.pedantic ? n[1].length > g[1].length : n[1].length >= g[0].length || 3 < n[1].length) - ) { - c.splice( - f, - 2, - c[f] + - (!this.options.pedantic && n[1].length < g[0].length && !c[f].match(/\n$/) ? '' : '\n') + - c[f + 1] - ), - f--, - p-- - continue - } - ;(!this.options.pedantic || this.options.smartLists - ? n[2][n[2].length - 1] !== a[a.length - 1] - : D == (1 === n[2].length)) && - ((t = c.slice(f + 1).join('\n').length), (o.raw = o.raw.substring(0, o.raw.length - t)), (f = p - 1)), - (g = n) - } - ;(n = u.length), - ~(u = u.replace(/^ *([*+-]|\d+[.)]) ?/, '')).indexOf('\n ') && - ((n -= u.length), - (u = this.options.pedantic - ? u.replace(/^ {1,4}/gm, '') - : u.replace(new RegExp('^ {1,' + n + '}', 'gm'), ''))), - (u = $(u, '\n')), - f !== p - 1 && (l += '\n'), - (n = h || /\n\n(?!\s*$)/.test(l)), - f !== p - 1 && ((h = '\n\n' === l.slice(-2)), (n = n || h)), - n && (o.loose = !0), - this.options.gfm && - ((i = void 0), - (r = /^\[[ xX]\] /.test(u)) && ((i = ' ' !== u[1]), (u = u.replace(/^\[[ xX]\] +/, '')))), - o.items.push({ type: 'list_item', raw: l, task: r, checked: i, loose: n, text: u }) - } - return o - } - }), - (u.html = function (e) { - e = this.rules.block.html.exec(e) - if (e) - return { - type: this.options.sanitize ? 'paragraph' : 'html', - raw: e[0], - pre: !this.options.sanitizer && ('pre' === e[1] || 'script' === e[1] || 'style' === e[1]), - text: this.options.sanitize ? (this.options.sanitizer ? this.options.sanitizer(e[0]) : T(e[0])) : e[0], - } - }), - (u.def = function (e) { - e = this.rules.block.def.exec(e) - if (e) - return ( - e[3] && (e[3] = e[3].substring(1, e[3].length - 1)), - { type: 'def', tag: e[1].toLowerCase().replace(/\s+/g, ' '), raw: e[0], href: e[2], title: e[3] } - ) - }), - (u.table = function (e) { - e = this.rules.block.table.exec(e) - if (e) { - var u = { - type: 'table', - header: S(e[1].replace(/^ *| *\| *$/g, '')), - align: e[2].replace(/^ *|\| *$/g, '').split(/ *\| */), - cells: e[3] ? e[3].replace(/\n$/, '').split('\n') : [], - } - if (u.header.length === u.align.length) { - u.raw = e[0] - for (var t = u.align.length, n = 0; n < t; n++) - /^ *-+: *$/.test(u.align[n]) - ? (u.align[n] = 'right') - : /^ *:-+: *$/.test(u.align[n]) - ? (u.align[n] = 'center') - : /^ *:-+ *$/.test(u.align[n]) - ? (u.align[n] = 'left') - : (u.align[n] = null) - for (t = u.cells.length, n = 0; n < t; n++) - u.cells[n] = S(u.cells[n].replace(/^ *\| *| *\| *$/g, ''), u.header.length) - return u - } - } - }), - (u.lheading = function (e) { - e = this.rules.block.lheading.exec(e) - if (e) return { type: 'heading', raw: e[0], depth: '=' === e[2].charAt(0) ? 1 : 2, text: e[1] } - }), - (u.paragraph = function (e) { - e = this.rules.block.paragraph.exec(e) - if (e) - return { - type: 'paragraph', - raw: e[0], - text: '\n' === e[1].charAt(e[1].length - 1) ? e[1].slice(0, -1) : e[1], - } - }), - (u.text = function (e) { - e = this.rules.block.text.exec(e) - if (e) return { type: 'text', raw: e[0], text: e[0] } - }), - (u.escape = function (e) { - e = this.rules.inline.escape.exec(e) - if (e) return { type: 'escape', raw: e[0], text: T(e[1]) } - }), - (u.tag = function (e, u, t) { - e = this.rules.inline.tag.exec(e) - if (e) - return ( - !u && /^/i.test(e[0]) && (u = !1), - !t && /^<(pre|code|kbd|script)(\s|>)/i.test(e[0]) - ? (t = !0) - : t && /^<\/(pre|code|kbd|script)(\s|>)/i.test(e[0]) && (t = !1), - { - type: this.options.sanitize ? 'text' : 'html', - raw: e[0], - inLink: u, - inRawBlock: t, - text: this.options.sanitize ? (this.options.sanitizer ? this.options.sanitizer(e[0]) : T(e[0])) : e[0], - } - ) - }), - (u.link = function (e) { - var u = this.rules.inline.link.exec(e) - if (u) { - var t = u[2].trim() - if (!this.options.pedantic && /^$/.test(t)) return - e = $(t.slice(0, -1), '\\') - if ((t.length - e.length) % 2 == 0) return - } else { - var n = I(u[2], '()') - ;-1 < n && - ((i = (0 === u[0].indexOf('!') ? 5 : 4) + u[1].length + n), - (u[2] = u[2].substring(0, n)), - (u[0] = u[0].substring(0, i).trim()), - (u[3] = '')) - } - var r, - n = u[2], - i = '' - return ( - this.options.pedantic - ? (r = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(n)) && ((n = r[1]), (i = r[3])) - : (i = u[3] ? u[3].slice(1, -1) : ''), - (n = n.trim()), - R( - u, - { - href: - (n = /^$/.test(t) ? n.slice(1) : n.slice(1, -1)) : n) && - n.replace(this.rules.inline._escapes, '$1'), - title: i && i.replace(this.rules.inline._escapes, '$1'), - }, - u[0] - ) - ) - } - }), - (u.reflink = function (e, u) { - if ((t = this.rules.inline.reflink.exec(e)) || (t = this.rules.inline.nolink.exec(e))) { - e = (t[2] || t[1]).replace(/\s+/g, ' ') - if ((e = u[e.toLowerCase()]) && e.href) return R(t, e, t[0]) - var t = t[0].charAt(0) - return { type: 'text', raw: t, text: t } - } - }), - (u.emStrong = function (e, u, t) { - void 0 === t && (t = '') - var n = this.rules.inline.emStrong.lDelim.exec(e) - if ( - n && - (!n[3] || - !t.match( - /(?:[0-9A-Za-z\xAA\xB2\xB3\xB5\xB9\xBA\xBC-\xBE\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u0660-\u0669\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07C0-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08C7\u0904-\u0939\u093D\u0950\u0958-\u0961\u0966-\u096F\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09E6-\u09F1\u09F4-\u09F9\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A66-\u0A6F\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AE6-\u0AEF\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B66-\u0B6F\u0B71-\u0B77\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0BE6-\u0BF2\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C66-\u0C6F\u0C78-\u0C7E\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CE6-\u0CEF\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D58-\u0D61\u0D66-\u0D78\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DE6-\u0DEF\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F20-\u0F33\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F-\u1049\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u1090-\u1099\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1369-\u137C\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u17E0-\u17E9\u17F0-\u17F9\u1810-\u1819\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A16\u1A20-\u1A54\u1A80-\u1A89\u1A90-\u1A99\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B50-\u1B59\u1B83-\u1BA0\u1BAE-\u1BE5\u1C00-\u1C23\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2070\u2071\u2074-\u2079\u207F-\u2089\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2150-\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2CFD\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u3192-\u3195\u31A0-\u31BF\u31F0-\u31FF\u3220-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\u3400-\u4DBF\u4E00-\u9FFC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7BF\uA7C2-\uA7CA\uA7F5-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA830-\uA835\uA840-\uA873\uA882-\uA8B3\uA8D0-\uA8D9\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA900-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF-\uA9D9\uA9E0-\uA9E4\uA9E6-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA50-\uAA59\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD07-\uDD33\uDD40-\uDD78\uDD8A\uDD8B\uDE80-\uDE9C\uDEA0-\uDED0\uDEE1-\uDEFB\uDF00-\uDF23\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC58-\uDC76\uDC79-\uDC9E\uDCA7-\uDCAF\uDCE0-\uDCF2\uDCF4\uDCF5\uDCFB-\uDD1B\uDD20-\uDD39\uDD80-\uDDB7\uDDBC-\uDDCF\uDDD2-\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE40-\uDE48\uDE60-\uDE7E\uDE80-\uDE9F\uDEC0-\uDEC7\uDEC9-\uDEE4\uDEEB-\uDEEF\uDF00-\uDF35\uDF40-\uDF55\uDF58-\uDF72\uDF78-\uDF91\uDFA9-\uDFAF]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDCFA-\uDD23\uDD30-\uDD39\uDE60-\uDE7E\uDE80-\uDEA9\uDEB0\uDEB1\uDF00-\uDF27\uDF30-\uDF45\uDF51-\uDF54\uDFB0-\uDFCB\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC52-\uDC6F\uDC83-\uDCAF\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD03-\uDD26\uDD36-\uDD3F\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDD0-\uDDDA\uDDDC\uDDE1-\uDDF4\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDEF0-\uDEF9\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC50-\uDC59\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE50-\uDE59\uDE80-\uDEAA\uDEB8\uDEC0-\uDEC9\uDF00-\uDF1A\uDF30-\uDF3B]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCF2\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDD50-\uDD59\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC50-\uDC6C\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD50-\uDD59\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDDA0-\uDDA9\uDEE0-\uDEF2\uDFB0\uDFC0-\uDFD4]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF50-\uDF59\uDF5B-\uDF61\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE96\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82C[\uDC00-\uDD1E\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD834[\uDEE0-\uDEF3\uDF60-\uDF78]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD838[\uDD00-\uDD2C\uDD37-\uDD3D\uDD40-\uDD49\uDD4E\uDEC0-\uDEEB\uDEF0-\uDEF9]|\uD83A[\uDC00-\uDCC4\uDCC7-\uDCCF\uDD00-\uDD43\uDD4B\uDD50-\uDD59]|\uD83B[\uDC71-\uDCAB\uDCAD-\uDCAF\uDCB1-\uDCB4\uDD01-\uDD2D\uDD2F-\uDD3D\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD83C[\uDD00-\uDD0C]|\uD83E[\uDFF0-\uDFF9]|\uD869[\uDC00-\uDEDD\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A])/ - )) - ) { - var r = n[1] || n[2] || '' - if (!r || (r && ('' === t || this.rules.inline.punctuation.exec(t)))) { - var i, - s = n[0].length - 1, - l = s, - a = 0, - D = '*' === n[0][0] ? this.rules.inline.emStrong.rDelimAst : this.rules.inline.emStrong.rDelimUnd - for (D.lastIndex = 0, u = u.slice(-1 * e.length + s); null != (n = D.exec(u)); ) - if ((i = n[1] || n[2] || n[3] || n[4] || n[5] || n[6])) - if (((i = i.length), n[3] || n[4])) l += i - else if (!((n[5] || n[6]) && s % 3) || (s + i) % 3) { - if (!(0 < (l -= i))) { - if ( - (l + a - i <= 0 && !u.slice(D.lastIndex).match(D) && (i = Math.min(i, i + l + a)), - Math.min(s, i) % 2) - ) - return { type: 'em', raw: e.slice(0, s + n.index + i + 1), text: e.slice(1, s + n.index + i) } - if (Math.min(s, i) % 2 == 0) - return { - type: 'strong', - raw: e.slice(0, s + n.index + i + 1), - text: e.slice(2, s + n.index + i - 1), - } - } - } else a += i - } - } - }), - (u.codespan = function (e) { - var u = this.rules.inline.code.exec(e) - if (u) { - var t = u[2].replace(/\n/g, ' '), - n = /[^ ]/.test(t), - e = /^ /.test(t) && / $/.test(t) - return ( - n && e && (t = t.substring(1, t.length - 1)), (t = T(t, !0)), { type: 'codespan', raw: u[0], text: t } - ) - } - }), - (u.br = function (e) { - e = this.rules.inline.br.exec(e) - if (e) return { type: 'br', raw: e[0] } - }), - (u.del = function (e) { - e = this.rules.inline.del.exec(e) - if (e) return { type: 'del', raw: e[0], text: e[2] } - }), - (u.autolink = function (e, u) { - e = this.rules.inline.autolink.exec(e) - if (e) { - var t, - u = '@' === e[2] ? 'mailto:' + (t = T(this.options.mangle ? u(e[1]) : e[1])) : (t = T(e[1])) - return { type: 'link', raw: e[0], text: t, href: u, tokens: [{ type: 'text', raw: t, text: t }] } - } - }), - (u.url = function (e, u) { - var t, n, r, i - if ((t = this.rules.inline.url.exec(e))) { - if ('@' === t[2]) r = 'mailto:' + (n = T(this.options.mangle ? u(t[0]) : t[0])) - else { - for (; (i = t[0]), (t[0] = this.rules.inline._backpedal.exec(t[0])[0]), i !== t[0]; ); - ;(n = T(t[0])), (r = 'www.' === t[1] ? 'http://' + n : n) - } - return { type: 'link', raw: t[0], text: n, href: r, tokens: [{ type: 'text', raw: n, text: n }] } - } - }), - (u.inlineText = function (e, u, t) { - e = this.rules.inline.text.exec(e) - if (e) { - t = u - ? this.options.sanitize - ? this.options.sanitizer - ? this.options.sanitizer(e[0]) - : T(e[0]) - : e[0] - : T(this.options.smartypants ? t(e[0]) : e[0]) - return { type: 'text', raw: e[0], text: t } - } - }), - e - ) - })(), - q = w, - O = x, - w = v, - x = { - newline: /^(?: *(?:\n|$))+/, - code: /^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/, - fences: /^ {0,3}(`{3,}(?=[^`\n]*\n)|~{3,})([^\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?:\n+|$)|$)/, - hr: /^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/, - heading: /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/, - blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/, - list: /^( {0,3})(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?! {0,3}bull )\n*|\s*$)/, - html: - '^ {0,3}(?:<(script|pre|style)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:\\n{2,}|$)|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$))', - def: /^ {0,3}\[(label)\]: *\n? *]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/, - nptable: q, - table: q, - lheading: /^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/, - _paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html| +\n)[^\n]+)*)/, - text: /^[^\n]+/, - _label: /(?!\s*\])(?:\\[\[\]]|[^\[\]])+/, - _title: /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/, - } - ;(x.def = O(x.def).replace('label', x._label).replace('title', x._title).getRegex()), - (x.bullet = /(?:[*+-]|\d{1,9}[.)])/), - (x.item = /^( *)(bull) ?[^\n]*(?:\n(?! *bull ?)[^\n]*)*/), - (x.item = O(x.item, 'gm').replace(/bull/g, x.bullet).getRegex()), - (x.listItemStart = O(/^( *)(bull) */) - .replace('bull', x.bullet) - .getRegex()), - (x.list = O(x.list) - .replace(/bull/g, x.bullet) - .replace('hr', '\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))') - .replace('def', '\\n+(?=' + x.def.source + ')') - .getRegex()), - (x._tag = - 'address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul'), - (x._comment = /|$)/), - (x.html = O(x.html, 'i') - .replace('comment', x._comment) - .replace('tag', x._tag) - .replace('attribute', / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/) - .getRegex()), - (x.paragraph = O(x._paragraph) - .replace('hr', x.hr) - .replace('heading', ' {0,3}#{1,6} ') - .replace('|lheading', '') - .replace('blockquote', ' {0,3}>') - .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n') - .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') - .replace('html', ')|<(?:script|pre|style|!--)') - .replace('tag', x._tag) - .getRegex()), - (x.blockquote = O(x.blockquote).replace('paragraph', x.paragraph).getRegex()), - (x.normal = w({}, x)), - (x.gfm = w({}, x.normal, { - nptable: - '^ *([^|\\n ].*\\|.*)\\n {0,3}([-:]+ *\\|[-| :]*)(?:\\n((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)', - table: - '^ *\\|(.+)\\n {0,3}\\|?( *[-:]+[-| :]*)(?:\\n *((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)', - })), - (x.gfm.nptable = O(x.gfm.nptable) - .replace('hr', x.hr) - .replace('heading', ' {0,3}#{1,6} ') - .replace('blockquote', ' {0,3}>') - .replace('code', ' {4}[^\\n]') - .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n') - .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') - .replace('html', ')|<(?:script|pre|style|!--)') - .replace('tag', x._tag) - .getRegex()), - (x.gfm.table = O(x.gfm.table) - .replace('hr', x.hr) - .replace('heading', ' {0,3}#{1,6} ') - .replace('blockquote', ' {0,3}>') - .replace('code', ' {4}[^\\n]') - .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n') - .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') - .replace('html', ')|<(?:script|pre|style|!--)') - .replace('tag', x._tag) - .getRegex()), - (x.pedantic = w({}, x.normal, { - html: O( - '^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))' - ) - .replace('comment', x._comment) - .replace( - /tag/g, - '(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b' - ) - .getRegex(), - def: /^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/, - heading: /^(#{1,6})(.*)(?:\n+|$)/, - fences: q, - paragraph: O(x.normal._paragraph) - .replace('hr', x.hr) - .replace('heading', ' *#{1,6} *[^\n]') - .replace('lheading', x.lheading) - .replace('blockquote', ' {0,3}>') - .replace('|fences', '') - .replace('|list', '') - .replace('|html', '') - .getRegex(), - })) - q = { - escape: /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/, - autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/, - url: q, - tag: - '^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^', - link: /^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/, - reflink: /^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/, - nolink: /^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/, - reflinkSearch: 'reflink|nolink(?!\\()', - emStrong: { - lDelim: /^(?:\*+(?:([punct_])|[^\s*]))|^_+(?:([punct*])|([^\s_]))/, - rDelimAst: /\_\_[^_]*?\*[^_]*?\_\_|[punct_](\*+)(?=[\s]|$)|[^punct*_\s](\*+)(?=[punct_\s]|$)|[punct_\s](\*+)(?=[^punct*_\s])|[\s](\*+)(?=[punct_])|[punct_](\*+)(?=[punct_])|[^punct*_\s](\*+)(?=[^punct*_\s])/, - rDelimUnd: /\*\*[^*]*?\_[^*]*?\*\*|[punct*](\_+)(?=[\s]|$)|[^punct*_\s](\_+)(?=[punct*\s]|$)|[punct*\s](\_+)(?=[^punct*_\s])|[\s](\_+)(?=[punct*])|[punct*](\_+)(?=[punct*])/, - }, - code: /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/, - br: /^( {2,}|\\)\n(?!\s*$)/, - del: q, - text: /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\?@\\[\\]`^{|}~', - } - ;(q.punctuation = O(q.punctuation) - .replace(/punctuation/g, q._punctuation) - .getRegex()), - (q.blockSkip = /\[[^\]]*?\]\([^\)]*?\)|`[^`]*?`|<[^>]*?>/g), - (q.escapedEmSt = /\\\*|\\_/g), - (q._comment = O(x._comment).replace('(?:--\x3e|$)', '--\x3e').getRegex()), - (q.emStrong.lDelim = O(q.emStrong.lDelim).replace(/punct/g, q._punctuation).getRegex()), - (q.emStrong.rDelimAst = O(q.emStrong.rDelimAst, 'g').replace(/punct/g, q._punctuation).getRegex()), - (q.emStrong.rDelimUnd = O(q.emStrong.rDelimUnd, 'g').replace(/punct/g, q._punctuation).getRegex()), - (q._escapes = /\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g), - (q._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/), - (q._email = /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/), - (q.autolink = O(q.autolink).replace('scheme', q._scheme).replace('email', q._email).getRegex()), - (q._attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/), - (q.tag = O(q.tag).replace('comment', q._comment).replace('attribute', q._attribute).getRegex()), - (q._label = /(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/), - (q._href = /<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/), - (q._title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/), - (q.link = O(q.link).replace('label', q._label).replace('href', q._href).replace('title', q._title).getRegex()), - (q.reflink = O(q.reflink).replace('label', q._label).getRegex()), - (q.reflinkSearch = O(q.reflinkSearch, 'g').replace('reflink', q.reflink).replace('nolink', q.nolink).getRegex()), - (q.normal = w({}, q)), - (q.pedantic = w({}, q.normal, { - strong: { - start: /^__|\*\*/, - middle: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/, - endAst: /\*\*(?!\*)/g, - endUnd: /__(?!_)/g, - }, - em: { - start: /^_|\*/, - middle: /^()\*(?=\S)([\s\S]*?\S)\*(?!\*)|^_(?=\S)([\s\S]*?\S)_(?!_)/, - endAst: /\*(?!\*)/g, - endUnd: /_(?!_)/g, - }, - link: O(/^!?\[(label)\]\((.*?)\)/) - .replace('label', q._label) - .getRegex(), - reflink: O(/^!?\[(label)\]\s*\[([^\]]*)\]/) - .replace('label', q._label) - .getRegex(), - })), - (q.gfm = w({}, q.normal, { - escape: O(q.escape).replace('])', '~|])').getRegex(), - _extended_email: /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/, - url: /^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/, - _backpedal: /(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/, - del: /^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/, - text: /^([`~]+|[^`~])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\' + - (t ? e : H(e, !0)) + - '\n' - : '
' + (t ? e : H(e, !0)) + '
\n' - ) - }), - (u.blockquote = function (e) { - return '
\n' + e + '
\n' - }), - (u.html = function (e) { - return e - }), - (u.heading = function (e, u, t, n) { - return this.options.headerIds - ? '' + e + '\n' - : '' + e + '\n' - }), - (u.hr = function () { - return this.options.xhtml ? '
\n' : '
\n' - }), - (u.list = function (e, u, t) { - var n = u ? 'ol' : 'ul' - return '<' + n + (u && 1 !== t ? ' start="' + t + '"' : '') + '>\n' + e + '\n' - }), - (u.listitem = function (e) { - return '
  • ' + e + '
  • \n' - }), - (u.checkbox = function (e) { - return ( - ' ' - ) - }), - (u.paragraph = function (e) { - return '

    ' + e + '

    \n' - }), - (u.table = function (e, u) { - return '\n\n' + e + '\n' + (u = u && '' + u + '') + '
    \n' - }), - (u.tablerow = function (e) { - return '\n' + e + '\n' - }), - (u.tablecell = function (e, u) { - var t = u.header ? 'th' : 'td' - return (u.align ? '<' + t + ' align="' + u.align + '">' : '<' + t + '>') + e + '\n' - }), - (u.strong = function (e) { - return '' + e + '' - }), - (u.em = function (e) { - return '' + e + '' - }), - (u.codespan = function (e) { - return '' + e + '' - }), - (u.br = function () { - return this.options.xhtml ? '
    ' : '
    ' - }), - (u.del = function (e) { - return '' + e + '' - }), - (u.link = function (e, u, t) { - if (null === (e = V(this.options.sanitize, this.options.baseUrl, e))) return t - e = '
    ') - }), - (u.image = function (e, u, t) { - if (null === (e = V(this.options.sanitize, this.options.baseUrl, e))) return t - t = '' + t + '' : '>') - }), - (u.text = function (e) { - return e - }), - e - ) - })(), - K = (function () { - function e() {} - var u = e.prototype - return ( - (u.strong = function (e) { - return e - }), - (u.em = function (e) { - return e - }), - (u.codespan = function (e) { - return e - }), - (u.del = function (e) { - return e - }), - (u.html = function (e) { - return e - }), - (u.text = function (e) { - return e - }), - (u.link = function (e, u, t) { - return '' + t - }), - (u.image = function (e, u, t) { - return '' + t - }), - (u.br = function () { - return '' - }), - e - ) - })(), - Q = (function () { - function e() { - this.seen = {} - } - var u = e.prototype - return ( - (u.serialize = function (e) { - return e - .toLowerCase() - .trim() - .replace(/<[!\/a-z].*?>/gi, '') - .replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g, '') - .replace(/\s/g, '-') - }), - (u.getNextSafeSlug = function (e, u) { - var t = e, - n = 0 - if (this.seen.hasOwnProperty(t)) for (n = this.seen[e]; (t = e + '-' + ++n), this.seen.hasOwnProperty(t); ); - return u || ((this.seen[e] = n), (this.seen[t] = 0)), t - }), - (u.slug = function (e, u) { - void 0 === u && (u = {}) - var t = this.serialize(e) - return this.getNextSafeSlug(t, u.dryrun) - }), - e - ) - })(), - W = u.defaults, - Y = b, - ee = (function () { - function t(e) { - ;(this.options = e || W), - (this.options.renderer = this.options.renderer || new J()), - (this.renderer = this.options.renderer), - (this.renderer.options = this.options), - (this.textRenderer = new K()), - (this.slugger = new Q()) - } - ;(t.parse = function (e, u) { - return new t(u).parse(e) - }), - (t.parseInline = function (e, u) { - return new t(u).parseInline(e) - }) - var e = t.prototype - return ( - (e.parse = function (e, u) { - void 0 === u && (u = !0) - for (var t, n, r, i, s, l, a, D, o, c, h, p, g, f, F, A = '', C = e.length, d = 0; d < C; d++) - switch ((D = e[d]).type) { - case 'space': - continue - case 'hr': - A += this.renderer.hr() - continue - case 'heading': - A += this.renderer.heading( - this.parseInline(D.tokens), - D.depth, - Y(this.parseInline(D.tokens, this.textRenderer)), - this.slugger - ) - continue - case 'code': - A += this.renderer.code(D.text, D.lang, D.escaped) - continue - case 'table': - for (l = o = '', r = D.header.length, t = 0; t < r; t++) - l += this.renderer.tablecell(this.parseInline(D.tokens.header[t]), { header: !0, align: D.align[t] }) - for (o += this.renderer.tablerow(l), a = '', r = D.cells.length, t = 0; t < r; t++) { - for (l = '', i = (s = D.tokens.cells[t]).length, n = 0; n < i; n++) - l += this.renderer.tablecell(this.parseInline(s[n]), { header: !1, align: D.align[n] }) - a += this.renderer.tablerow(l) - } - A += this.renderer.table(o, a) - continue - case 'blockquote': - ;(a = this.parse(D.tokens)), (A += this.renderer.blockquote(a)) - continue - case 'list': - for (o = D.ordered, E = D.start, c = D.loose, r = D.items.length, a = '', t = 0; t < r; t++) - (g = (p = D.items[t]).checked), - (f = p.task), - (h = ''), - p.task && - ((F = this.renderer.checkbox(g)), - c - ? 0 < p.tokens.length && 'text' === p.tokens[0].type - ? ((p.tokens[0].text = F + ' ' + p.tokens[0].text), - p.tokens[0].tokens && - 0 < p.tokens[0].tokens.length && - 'text' === p.tokens[0].tokens[0].type && - (p.tokens[0].tokens[0].text = F + ' ' + p.tokens[0].tokens[0].text)) - : p.tokens.unshift({ type: 'text', text: F }) - : (h += F)), - (h += this.parse(p.tokens, c)), - (a += this.renderer.listitem(h, f, g)) - A += this.renderer.list(a, o, E) - continue - case 'html': - A += this.renderer.html(D.text) - continue - case 'paragraph': - A += this.renderer.paragraph(this.parseInline(D.tokens)) - continue - case 'text': - for (a = D.tokens ? this.parseInline(D.tokens) : D.text; d + 1 < C && 'text' === e[d + 1].type; ) - a += '\n' + ((D = e[++d]).tokens ? this.parseInline(D.tokens) : D.text) - A += u ? this.renderer.paragraph(a) : a - continue - default: - var E = 'Token with "' + D.type + '" type was not found.' - if (this.options.silent) return void console.error(E) - throw new Error(E) - } - return A - }), - (e.parseInline = function (e, u) { - u = u || this.renderer - for (var t, n = '', r = e.length, i = 0; i < r; i++) - switch ((t = e[i]).type) { - case 'escape': - n += u.text(t.text) - break - case 'html': - n += u.html(t.text) - break - case 'link': - n += u.link(t.href, t.title, this.parseInline(t.tokens, u)) - break - case 'image': - n += u.image(t.href, t.title, t.text) - break - case 'strong': - n += u.strong(this.parseInline(t.tokens, u)) - break - case 'em': - n += u.em(this.parseInline(t.tokens, u)) - break - case 'codespan': - n += u.codespan(t.text) - break - case 'br': - n += u.br() - break - case 'del': - n += u.del(this.parseInline(t.tokens, u)) - break - case 'text': - n += u.text(t.text) - break - default: - var s = 'Token with "' + t.type + '" type was not found.' - if (this.options.silent) return void console.error(s) - throw new Error(s) - } - return n - }), - t - ) - })(), - ue = v, - te = y, - ne = m, - m = u.getDefaults, - re = u.changeDefaults, - u = u.defaults - function ie(e, t, n) { - if (null == e) throw new Error('marked(): input parameter is undefined or null') - if ('string' != typeof e) - throw new Error('marked(): input parameter is of type ' + Object.prototype.toString.call(e) + ', string expected') - if (('function' == typeof t && ((n = t), (t = null)), (t = ue({}, ie.defaults, t || {})), te(t), n)) { - var r, - i = t.highlight - try { - r = X.lex(e, t) - } catch (e) { - return n(e) - } - var s = function (u) { - var e - if (!u) - try { - e = ee.parse(r, t) - } catch (e) { - u = e - } - return (t.highlight = i), u ? n(u) : n(null, e) - } - if (!i || i.length < 3) return s() - if ((delete t.highlight, !r.length)) return s() - var l = 0 - return ( - ie.walkTokens(r, function (t) { - 'code' === t.type && - (l++, - setTimeout(function () { - i(t.text, t.lang, function (e, u) { - return e - ? s(e) - : (null != u && u !== t.text && ((t.text = u), (t.escaped = !0)), void (0 === --l && s())) - }) - }, 0)) - }), - void (0 === l && s()) - ) - } - try { - var u = X.lex(e, t) - return t.walkTokens && ie.walkTokens(u, t.walkTokens), ee.parse(u, t) - } catch (e) { - if (((e.message += '\nPlease report this to https://github.com/markedjs/marked.'), t.silent)) - return '

    An error occurred:

    ' + ne(e.message + '', !0) + '
    ' - throw e - } - } - return ( - (ie.options = ie.setOptions = function (e) { - return ue(ie.defaults, e), re(ie.defaults), ie - }), - (ie.getDefaults = m), - (ie.defaults = u), - (ie.use = function (l) { - var u, - t = ue({}, l) - l.renderer && - (function () { - var e, - s = ie.defaults.renderer || new J() - for (e in l.renderer) - !(function (r) { - var i = s[r] - s[r] = function () { - for (var e = arguments.length, u = new Array(e), t = 0; t < e; t++) u[t] = arguments[t] - var n = l.renderer[r].apply(s, u) - return (n = !1 === n ? i.apply(s, u) : n) - } - })(e) - t.renderer = s - })(), - l.tokenizer && - (function () { - var e, - s = ie.defaults.tokenizer || new Z() - for (e in l.tokenizer) - !(function (r) { - var i = s[r] - s[r] = function () { - for (var e = arguments.length, u = new Array(e), t = 0; t < e; t++) u[t] = arguments[t] - var n = l.tokenizer[r].apply(s, u) - return (n = !1 === n ? i.apply(s, u) : n) - } - })(e) - t.tokenizer = s - })(), - l.walkTokens && - ((u = ie.defaults.walkTokens), - (t.walkTokens = function (e) { - l.walkTokens(e), u && u(e) - })), - ie.setOptions(t) - }), - (ie.walkTokens = function (e, u) { - for (var t, n = c(e); !(t = n()).done; ) { - var r = t.value - switch ((u(r), r.type)) { - case 'table': - for (var i = c(r.tokens.header); !(s = i()).done; ) { - var s = s.value - ie.walkTokens(s, u) - } - for (var l, a = c(r.tokens.cells); !(l = a()).done; ) - for (var D = c(l.value); !(o = D()).done; ) { - var o = o.value - ie.walkTokens(o, u) - } - break - case 'list': - ie.walkTokens(r.items, u) - break - default: - r.tokens && ie.walkTokens(r.tokens, u) - } - } - }), - (ie.parseInline = function (e, u) { - if (null == e) throw new Error('marked.parseInline(): input parameter is undefined or null') - if ('string' != typeof e) - throw new Error( - 'marked.parseInline(): input parameter is of type ' + Object.prototype.toString.call(e) + ', string expected' - ) - ;(u = ue({}, ie.defaults, u || {})), te(u) - try { - var t = X.lexInline(e, u) - return u.walkTokens && ie.walkTokens(t, u.walkTokens), ee.parseInline(t, u) - } catch (e) { - if (((e.message += '\nPlease report this to https://github.com/markedjs/marked.'), u.silent)) - return '

    An error occurred:

    ' + ne(e.message + '', !0) + '
    ' - throw e - } - }), - (ie.Parser = ee), - (ie.parser = ee.parse), - (ie.Renderer = J), - (ie.TextRenderer = K), - (ie.Lexer = X), - (ie.lexer = X.lex), - (ie.Tokenizer = Z), - (ie.Slugger = Q), - (ie.parse = ie) - ) -}) diff --git a/dist/_/editor/template.json b/dist/_/editor/template.json deleted file mode 100644 index a179942..0000000 --- a/dist/_/editor/template.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "fields": [ - { - "name": "title", - "type": "text", - "required": true, - "default": "" - }, - { - "name": "author", - "type": "text", - "required": true, - "default": "" - }, - { - "name": "dateCreated", - "type": "datetime-local", - "required": false, - "default": "" - }, - { - "name": "datePublish", - "type": "datetime-local", - "required": false, - "default": "" - }, - { - "name": "dateUpdate", - "type": "datetime-local", - "required": false, - "default": "" - }, - { - "name": "dateArchive", - "type": "datetime-local", - "required": false, - "default": "" - }, - { - "name": "link", - "type": "text", - "required": false, - "default": "" - }, - { - "name": "linkText", - "type": "text", - "required": false, - "default": "" - }, - { - "name": "posterImage", - "type": "text", - "required": false, - "default": "" - }, - { - "name": "posterImageSize", - "type": "text", - "required": false, - "default": "" - }, - { - "name": "posterImageCredits", - "type": "text", - "required": false, - "default": "" - }, - { - "name": "summary", - "type": "text", - "required": false, - "default": "" - }, - { - "name": "categories", - "type": "text", - "required": false, - "default": "" - } - ] -} diff --git a/dist/_/skole/hio/2017/eksamensark/css/exam-paper-linux.css b/dist/_/skole/hio/2017/eksamensark/css/exam-paper-linux.css deleted file mode 100644 index 83f3e24..0000000 --- a/dist/_/skole/hio/2017/eksamensark/css/exam-paper-linux.css +++ /dev/null @@ -1,80 +0,0 @@ -html, -body { - font-size: 10px; -} - -/* Split the page into 2 sections */ -.wrapper section { - padding: 0 2.5mm 0; - width: 50%; -} - -.row h1, -.row h2, -.row h3, -.row h4, -.row h5, -.row h6, -.row p, -.row dl { - margin: 0; - line-height: 1.2; -} - -.row p { - font-size: 1em; -} - -.row ul, -.row ol { - margin: 0; -} - -.row li { - line-height: 1; -} - -.row code { - background-color: #eee; - padding: 0.1em; - line-height: 1.4; - font-size: 0.9em; - font-family: monospace; -} - -.row dl dt:before { - content: " "; - display: table -} - -.row dl dt { - margin: 0; - font-weight: 700; - display: block; -} - -.row dl dd { - display: block; - margin: 0 0 0.3em 0; -} - -.row dl dd dl { - padding: 0 0 0 1em; -} - -.table-code td:first-child { - font-family: monospace; - font-size: 1rem; - white-space: nowrap; -} - -.table-code td.wrap { - white-space: normal; - text-align: left; - word-break: break-all; -} - -.table-code td:last-child { - font-family: serif; - font-size: 1rem; -} \ No newline at end of file diff --git a/dist/_/skole/hio/2017/eksamensark/css/exam-paper.css b/dist/_/skole/hio/2017/eksamensark/css/exam-paper.css deleted file mode 100644 index 3bdb836..0000000 --- a/dist/_/skole/hio/2017/eksamensark/css/exam-paper.css +++ /dev/null @@ -1,450 +0,0 @@ -/* Fix box-sizing */ -*, *:before, *:after { box-sizing: inherit; } -html { box-sizing: border-box; } - -html, -body { - margin: 0; - padding: 0; - font-size: 8px; -} - -body { - background-color: #eee; - font-family: 'PT Serif', 'Times New Roman', Times, serif; - font-size: 1em; -} - -hr { - width: 100%; - height: 1px; - margin: 0.1em auto; - padding: 0; - border: none; - background-color: gray; -} - -/* Question */ -.q { - font-style: italic; -} - -/* Answer */ -.a { - font-style: normal; -} - -/* Clearfix */ -.clear:before, -.clear:after { - content: " "; - display: table -} -.clear:after{ - clear: both -} - -/* Floats */ -.fl { float: left; } -.fr { float: right; } - -/* Widths */ -.w1 { width: 10% !important; } -.w15 { width: 15% !important; } -.w2 { width: 20% !important; } -.w25 { width: 25% !important; } -.w25 { width: 25% !important; } -.w3 { width: 30% !important; } -.w33 { width: 33.3333% !important; } -.w35 { width: 35% !important; } -.w4 { width: 40% !important; } -.w45 { width: 45% !important; } -.w5 { width: 50% !important; } -.w55 { width: 55% !important; } -.w6 { width: 60% !important; } -.w65 { width: 65% !important; } -.w66 { width: 66.6667% !important; } -.w7 { width: 70% !important; } -.w75 { width: 75% !important; } -.w8 { width: 80% !important; } -.w85 { width: 85% !important; } -.w9 { width: 90% !important; } -.w95 { width: 95% !important; } -.w10 { width: 100% !important; } - -/* Columns */ -.cols { - column-gap: 0.5em; - column-rule: 1px dotted #ddd; -} - -.cols-2 { - column-count: 2; -} - -.cols-3 { - column-count: 3; -} - -/* Colors */ -.black { color: black; } -.white { color: white; } -.red { color: red; } -.blue { color: blue; } -.green { color: green; } -.yellow { color: yellow; } -.orange { color: orange; } -.purple { color: purple; } -.pink { color: pink; } -.brown { color: brown; } - -/* Indentations */ -.i0 { padding-left: 0em !important; } -.i1 { padding-left: 1em !important; } -.i2 { padding-left: 2em !important; } -.i3 { padding-left: 3em !important; } -.i4 { padding-left: 4em !important; } -.i5 { padding-left: 5em !important; } - -/* Center an element */ -.centered { display: block; margin-left: auto !important; margin-right: auto !important; } - -/* Seperators */ -.sl { padding-left: 0.5em; border-left: 0.05em solid gray; } -.sr { padding-right: 0.5em; border-right: 0.05em solid gray; } - -/* Alignments */ -.tl { text-align: left !important; } -.tr { text-align: right !important; } -.tj { text-align: justify !important; } -.tc { text-align: center !important; } - -/* Font sizes */ -.fss { font-size: 0.8em !important; } -.fsm { font-size: 1.2em !important; } -.fsl { font-size: 1.5em !important; } - -/* Borders */ -.bt { border-top: 1px solid gray; padding-top: 1px; } -.br { border-right: 1px solid gray; padding-right: 1px; } -.bb { border-bottom: 1px solid gray; padding-bottom: 1px; } -.bl { border-left: 1px solid gray; padding-left: 1px; } - -/* Display styles */ -.inline { display: inline; } - -/* Ensure latex is rendering on print */ -.katex { font-size: 1.1em !important; } -.katex .frac-line { - min-height: 1px !important; - min-width: 1px !important; - border-bottom-width: 1px !important; -} -.katex .underline-line { - min-height: 1px !important; - border-bottom-width: 1px !important; -} -.katex-display { - display: inline-block !important; - margin: 0.3em 0 0 !important; - text-align: left !important; -} - -.katex.bigline { - margin-top: 1px; - display: inline-block; -} - -/* One A4 paper page (landscape) */ -.wrapper { - display: flex; - margin: 10em auto; - padding: 6.35mm; - flex-direction: row; - justify-content: space-between; - color: #222; - background-color: #fff; - width: 297mm; - height: 210mm; - max-width: 100%; - max-height: 100%; - box-shadow: 0 2em 5em -1em rgba(0, 0, 64, 0.1); - overflow-y: auto; - overflow-x: hidden; - /*padding: 0;*/ - /*border: 5mm solid red;*/ - position: relative; -} - -.wrapper:after { - position: absolute; - bottom: 2.5mm; - right: 2.5mm; - content: attr(page); -} - -/* Make sure print behaves correctly */ -@media print { - .wrapper { - position: relative; - top: 0; - left: 0; - right: 0; - padding: 6.35mm; - /*padding: 0;*/ - /*border: 6.35mm solid red;*/ - margin: 0; - transform: none; - max-width: 100vw; - max-height: 100vh; - box-shadow: none; - } -} - -/* Split the page into 3 sections */ -.wrapper section { - display: flex; - flex-direction: column; - padding: 0 0.75mm 0; - width: 33.33333333333333%; - max-width: 100%; -} - -.wrapper section:first-child { - padding-left: 0; -} - -.wrapper section:last-child { - padding-right: 0; -} - -/* Styling for all page elements */ -.row h1, -.row h2, -.row h3, -.row h4, -.row h5, -.row h6, -.row p, -.row img, -.row figure, -.row ul, -.row ol { - width: 100%; - max-width: 100%; -} - -.row h1, -.row h2, -.row h3, -.row h4, -.row h5, -.row h6, -.row p, -.row dl { - margin: 0; - line-height: 1; - text-align: justify; -} - -.row h1, -.row h2, -.row h3, -.row h4, -.row h5, -.row h6 { - color: #111; -} - -.row p { - font-size: 1em; -} - -.row ul, -.row ol { - margin: 0; - padding: 0 0 0 1.5em; -} - -.row ul.nostyle, -.row ol.nostyle { - list-style-type: none; -} - -.row ul.inside, -.row ol.inside { - list-style-position: inside; - padding-left: 0; -} - -.row li { - line-height: 1; -} - -.row ul.inline, -.row ol.inline { - display: flex; - flex-direction: row; - justify-content: space-between; - flex-wrap: wrap; -} - -.row ul.inline li, -.row ol.inline li { - margin: 0 1em 0 0; - padding: 0 1em 0 0; - white-space: nowrap; -} -.row ul.inline li p, -.row ol.inline li p { - word-break: break-word; - white-space: normal; -} - -.row ul.inline.nostyle, -.row ol.inline.nostyle { - padding: 0; -} - -.row ul.inline2 { - padding: 0; - list-style: none; -} - -.row ul.inline2 li { - position: relative; - display: inline; - padding: 0 0.75em; -} - -.row ul.inline2 li::before { - position: absolute; - left: 0; - top: 0; - width: 1em; - height: 1em; - line-height: 1em; - content: '\25CF'; -} - - -.row ul.qna, -.row ol.qna { - margin: 0; - padding: 0; - list-style-type: none; -} - -.row ul.qna > li > ul, -.row ul.qna > li > ol, -.row ol.qna > li > ul, -.row ol.qna > li > ol { - margin: 0.75em 0; - padding: 0; - list-style-type: none; -} - -.row ul.qna ul, -.row ol.qna ol { - margin: 0; - padding: 0 0 0 0.5em; -} - -.row ul.qna > li > ul > li:first-child, -.row ol.qna > li > ul > li:first-child { - font-weight: 700; -} - -.row ul.qna > li > ul > li:first-child pre, -.row ol.qna > li > ul > li:first-child pre { - font-weight: normal; -} - -.row ul.qna > li > ul > li:last-child, -.row ol.qna > li > ul > li:last-child { - padding: 0 0 0 2em; - line-height: 1em; -} - - -.row code, -.row pre { - margin: 0; - padding: 0.5em; - background-color: #eee; -} - -.row pre { - display: inline-block; -} - -.row code { - padding: 0em; - line-height: 1; - font-size: 0.9em; - font-family: 'PT Mono', monospace; -} - -.row dl dt:before { - content: " "; - display: table -} - -.row dl dt { - font-weight: 700; - display: inline; -} - -.row dl dd { - margin: 0 0 0 1em; - display: inline; -} - -.row table { - border-collapse: collapse; -} - -.row table td, -.row table th { - padding: 0; - margin: 0; -} - -.row table th { - font-size: 0.8em; -} - -.row table tbody th { - text-align: left; -} - -.row table tbody tr:nth-child(odd) { - background-color: #eee; -} - -.row table tbody td { - font-family: 'PT Mono', monospace; - font-size: 0.8em; - line-height: 1em; - padding: 0.1em 0.2em 0; -} - -.row figure { - margin: 0; - padding: 0; -} - -.row figure img { - margin: 0; - padding: 0; -} - -.row figure figcaption { - margin: 0; - padding: 0; - line-height: 1; - font-size: 0.8em; - text-align: left; - color: #444; - font-family: 'PT Serif Caption', serif; -} \ No newline at end of file diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_AMS-Regular.ttf b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_AMS-Regular.ttf deleted file mode 100644 index 2c998f9..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_AMS-Regular.ttf and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_AMS-Regular.woff b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_AMS-Regular.woff deleted file mode 100644 index 29ef535..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_AMS-Regular.woff and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_AMS-Regular.woff2 b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_AMS-Regular.woff2 deleted file mode 100644 index c01a71b..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_AMS-Regular.woff2 and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Caligraphic-Bold.ttf b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Caligraphic-Bold.ttf deleted file mode 100644 index 35e420d..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Caligraphic-Bold.ttf and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Caligraphic-Bold.woff b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Caligraphic-Bold.woff deleted file mode 100644 index 2a33324..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Caligraphic-Bold.woff and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Caligraphic-Bold.woff2 b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Caligraphic-Bold.woff2 deleted file mode 100644 index e914468..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Caligraphic-Bold.woff2 and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Caligraphic-Regular.ttf b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Caligraphic-Regular.ttf deleted file mode 100644 index d62f65c..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Caligraphic-Regular.ttf and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Caligraphic-Regular.woff b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Caligraphic-Regular.woff deleted file mode 100644 index e818948..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Caligraphic-Regular.woff and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Caligraphic-Regular.woff2 b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Caligraphic-Regular.woff2 deleted file mode 100644 index c26e0dd..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Caligraphic-Regular.woff2 and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Fraktur-Bold.ttf b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Fraktur-Bold.ttf deleted file mode 100644 index 512b32d..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Fraktur-Bold.ttf and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Fraktur-Bold.woff b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Fraktur-Bold.woff deleted file mode 100644 index d845037..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Fraktur-Bold.woff and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Fraktur-Bold.woff2 b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Fraktur-Bold.woff2 deleted file mode 100644 index 7d45f74..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Fraktur-Bold.woff2 and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Fraktur-Regular.ttf b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Fraktur-Regular.ttf deleted file mode 100644 index f5c9a82..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Fraktur-Regular.ttf and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Fraktur-Regular.woff b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Fraktur-Regular.woff deleted file mode 100644 index 0b2eb42..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Fraktur-Regular.woff and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Fraktur-Regular.woff2 b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Fraktur-Regular.woff2 deleted file mode 100644 index 5b9bec4..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Fraktur-Regular.woff2 and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Main-Bold.ttf b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Main-Bold.ttf deleted file mode 100644 index 875806e..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Main-Bold.ttf and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Main-Bold.woff b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Main-Bold.woff deleted file mode 100644 index fcdf3c8..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Main-Bold.woff and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Main-Bold.woff2 b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Main-Bold.woff2 deleted file mode 100644 index bfa2801..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Main-Bold.woff2 and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Main-BoldItalic.ttf b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Main-BoldItalic.ttf deleted file mode 100644 index 25cceac..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Main-BoldItalic.ttf and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Main-BoldItalic.woff b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Main-BoldItalic.woff deleted file mode 100644 index 13de70d..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Main-BoldItalic.woff and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Main-BoldItalic.woff2 b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Main-BoldItalic.woff2 deleted file mode 100644 index 0046141..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Main-BoldItalic.woff2 and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Main-Italic.ttf b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Main-Italic.ttf deleted file mode 100644 index b235ba8..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Main-Italic.ttf and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Main-Italic.woff b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Main-Italic.woff deleted file mode 100644 index c70b25f..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Main-Italic.woff and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Main-Italic.woff2 b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Main-Italic.woff2 deleted file mode 100644 index 68e2e94..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Main-Italic.woff2 and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Main-Regular.ttf b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Main-Regular.ttf deleted file mode 100644 index 7c5300f..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Main-Regular.ttf and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Main-Regular.woff b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Main-Regular.woff deleted file mode 100644 index 1354862..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Main-Regular.woff and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Main-Regular.woff2 b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Main-Regular.woff2 deleted file mode 100644 index aa6f9a0..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Main-Regular.woff2 and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Math-Italic.ttf b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Math-Italic.ttf deleted file mode 100644 index 7add130..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Math-Italic.ttf and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Math-Italic.woff b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Math-Italic.woff deleted file mode 100644 index b41b9a1..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Math-Italic.woff and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Math-Italic.woff2 b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Math-Italic.woff2 deleted file mode 100644 index ab66ee6..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Math-Italic.woff2 and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_SansSerif-Bold.ttf b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_SansSerif-Bold.ttf deleted file mode 100644 index 48c947e..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_SansSerif-Bold.ttf and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_SansSerif-Bold.woff b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_SansSerif-Bold.woff deleted file mode 100644 index 829d446..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_SansSerif-Bold.woff and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_SansSerif-Bold.woff2 b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_SansSerif-Bold.woff2 deleted file mode 100644 index c7a2d6e..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_SansSerif-Bold.woff2 and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_SansSerif-Italic.ttf b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_SansSerif-Italic.ttf deleted file mode 100644 index cd3700c..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_SansSerif-Italic.ttf and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_SansSerif-Italic.woff b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_SansSerif-Italic.woff deleted file mode 100644 index d572d1c..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_SansSerif-Italic.woff and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_SansSerif-Italic.woff2 b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_SansSerif-Italic.woff2 deleted file mode 100644 index 5424402..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_SansSerif-Italic.woff2 and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_SansSerif-Regular.ttf b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_SansSerif-Regular.ttf deleted file mode 100644 index 6cc265a..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_SansSerif-Regular.ttf and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_SansSerif-Regular.woff b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_SansSerif-Regular.woff deleted file mode 100644 index 7973f19..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_SansSerif-Regular.woff and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_SansSerif-Regular.woff2 b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_SansSerif-Regular.woff2 deleted file mode 100644 index 891ca8c..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_SansSerif-Regular.woff2 and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Script-Regular.ttf b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Script-Regular.ttf deleted file mode 100644 index 485ccdd..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Script-Regular.ttf and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Script-Regular.woff b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Script-Regular.woff deleted file mode 100644 index 99f8ee4..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Script-Regular.woff and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Script-Regular.woff2 b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Script-Regular.woff2 deleted file mode 100644 index 629d9c8..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Script-Regular.woff2 and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Size1-Regular.ttf b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Size1-Regular.ttf deleted file mode 100644 index 7080aae..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Size1-Regular.ttf and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Size1-Regular.woff b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Size1-Regular.woff deleted file mode 100644 index 1517ce9..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Size1-Regular.woff and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Size1-Regular.woff2 b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Size1-Regular.woff2 deleted file mode 100644 index db8b77f..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Size1-Regular.woff2 and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Size2-Regular.ttf b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Size2-Regular.ttf deleted file mode 100644 index 7becda4..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Size2-Regular.ttf and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Size2-Regular.woff b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Size2-Regular.woff deleted file mode 100644 index c12a237..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Size2-Regular.woff and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Size2-Regular.woff2 b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Size2-Regular.woff2 deleted file mode 100644 index 2558a34..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Size2-Regular.woff2 and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Size3-Regular.ttf b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Size3-Regular.ttf deleted file mode 100644 index 2c28b7d..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Size3-Regular.ttf and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Size3-Regular.woff b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Size3-Regular.woff deleted file mode 100644 index f9c2a7d..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Size3-Regular.woff and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Size3-Regular.woff2 b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Size3-Regular.woff2 deleted file mode 100644 index 329c24e..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Size3-Regular.woff2 and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Size4-Regular.ttf b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Size4-Regular.ttf deleted file mode 100644 index f4720c2..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Size4-Regular.ttf and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Size4-Regular.woff b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Size4-Regular.woff deleted file mode 100644 index aca79b3..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Size4-Regular.woff and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Size4-Regular.woff2 b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Size4-Regular.woff2 deleted file mode 100644 index d0f337f..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Size4-Regular.woff2 and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Typewriter-Regular.ttf b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Typewriter-Regular.ttf deleted file mode 100644 index 13369a8..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Typewriter-Regular.ttf and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Typewriter-Regular.woff b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Typewriter-Regular.woff deleted file mode 100644 index 410e3f3..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Typewriter-Regular.woff and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Typewriter-Regular.woff2 b/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Typewriter-Regular.woff2 deleted file mode 100644 index d57f54b..0000000 Binary files a/dist/_/skole/hio/2017/eksamensark/css/fonts/KaTeX_Typewriter-Regular.woff2 and /dev/null differ diff --git a/dist/_/skole/hio/2017/eksamensark/css/katex.min.css b/dist/_/skole/hio/2017/eksamensark/css/katex.min.css deleted file mode 100644 index 631f6c1..0000000 --- a/dist/_/skole/hio/2017/eksamensark/css/katex.min.css +++ /dev/null @@ -1 +0,0 @@ -@font-face{font-family:KaTeX_AMS;src:url(fonts/KaTeX_AMS-Regular.woff2) format("woff2"),url(fonts/KaTeX_AMS-Regular.woff) format("woff"),url(fonts/KaTeX_AMS-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Caligraphic;src:url(fonts/KaTeX_Caligraphic-Bold.woff2) format("woff2"),url(fonts/KaTeX_Caligraphic-Bold.woff) format("woff"),url(fonts/KaTeX_Caligraphic-Bold.ttf) format("truetype");font-weight:700;font-style:normal}@font-face{font-family:KaTeX_Caligraphic;src:url(fonts/KaTeX_Caligraphic-Regular.woff2) format("woff2"),url(fonts/KaTeX_Caligraphic-Regular.woff) format("woff"),url(fonts/KaTeX_Caligraphic-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Fraktur;src:url(fonts/KaTeX_Fraktur-Bold.woff2) format("woff2"),url(fonts/KaTeX_Fraktur-Bold.woff) format("woff"),url(fonts/KaTeX_Fraktur-Bold.ttf) format("truetype");font-weight:700;font-style:normal}@font-face{font-family:KaTeX_Fraktur;src:url(fonts/KaTeX_Fraktur-Regular.woff2) format("woff2"),url(fonts/KaTeX_Fraktur-Regular.woff) format("woff"),url(fonts/KaTeX_Fraktur-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Main;src:url(fonts/KaTeX_Main-Bold.woff2) format("woff2"),url(fonts/KaTeX_Main-Bold.woff) format("woff"),url(fonts/KaTeX_Main-Bold.ttf) format("truetype");font-weight:700;font-style:normal}@font-face{font-family:KaTeX_Main;src:url(fonts/KaTeX_Main-BoldItalic.woff2) format("woff2"),url(fonts/KaTeX_Main-BoldItalic.woff) format("woff"),url(fonts/KaTeX_Main-BoldItalic.ttf) format("truetype");font-weight:700;font-style:italic}@font-face{font-family:KaTeX_Main;src:url(fonts/KaTeX_Main-Italic.woff2) format("woff2"),url(fonts/KaTeX_Main-Italic.woff) format("woff"),url(fonts/KaTeX_Main-Italic.ttf) format("truetype");font-weight:400;font-style:italic}@font-face{font-family:KaTeX_Main;src:url(fonts/KaTeX_Main-Regular.woff2) format("woff2"),url(fonts/KaTeX_Main-Regular.woff) format("woff"),url(fonts/KaTeX_Main-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Math;src:url(fonts/KaTeX_Math-Italic.woff2) format("woff2"),url(fonts/KaTeX_Math-Italic.woff) format("woff"),url(fonts/KaTeX_Math-Italic.ttf) format("truetype");font-weight:400;font-style:italic}@font-face{font-family:KaTeX_SansSerif;src:url(fonts/KaTeX_SansSerif-Bold.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Bold.woff) format("woff"),url(fonts/KaTeX_SansSerif-Bold.ttf) format("truetype");font-weight:700;font-style:normal}@font-face{font-family:KaTeX_SansSerif;src:url(fonts/KaTeX_SansSerif-Italic.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Italic.woff) format("woff"),url(fonts/KaTeX_SansSerif-Italic.ttf) format("truetype");font-weight:400;font-style:italic}@font-face{font-family:KaTeX_SansSerif;src:url(fonts/KaTeX_SansSerif-Regular.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Regular.woff) format("woff"),url(fonts/KaTeX_SansSerif-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Script;src:url(fonts/KaTeX_Script-Regular.woff2) format("woff2"),url(fonts/KaTeX_Script-Regular.woff) format("woff"),url(fonts/KaTeX_Script-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size1;src:url(fonts/KaTeX_Size1-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size1-Regular.woff) format("woff"),url(fonts/KaTeX_Size1-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size2;src:url(fonts/KaTeX_Size2-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size2-Regular.woff) format("woff"),url(fonts/KaTeX_Size2-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size3;src:url(fonts/KaTeX_Size3-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size3-Regular.woff) format("woff"),url(fonts/KaTeX_Size3-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size4;src:url(fonts/KaTeX_Size4-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size4-Regular.woff) format("woff"),url(fonts/KaTeX_Size4-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Typewriter;src:url(fonts/KaTeX_Typewriter-Regular.woff2) format("woff2"),url(fonts/KaTeX_Typewriter-Regular.woff) format("woff"),url(fonts/KaTeX_Typewriter-Regular.ttf) format("truetype");font-weight:400;font-style:normal}.katex-display{display:block;margin:1em 0;text-align:center}.katex-display>.katex{display:inline-block;text-align:initial}.katex{font:normal 1.21em KaTeX_Main,Times New Roman,serif;line-height:1.2;white-space:nowrap;text-indent:0;text-rendering:auto}.katex *{-ms-high-contrast-adjust:none!important}.katex .katex-html{display:inline-block}.katex .katex-mathml{position:absolute;clip:rect(1px,1px,1px,1px);padding:0;border:0;height:1px;width:1px;overflow:hidden}.katex .base{position:relative}.katex .base,.katex .strut{display:inline-block}.katex .textbf{font-weight:700}.katex .textit{font-style:italic}.katex .textrm{font-family:KaTeX_Main}.katex .textsf{font-family:KaTeX_SansSerif}.katex .texttt{font-family:KaTeX_Typewriter}.katex .mathit{font-family:KaTeX_Math;font-style:italic}.katex .mathrm{font-style:normal}.katex .mathbf{font-family:KaTeX_Main;font-weight:700}.katex .boldsymbol{font-family:KaTeX_Math;font-weight:700;font-style:italic}.katex .amsrm,.katex .mathbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak{font-family:KaTeX_Fraktur}.katex .mathtt{font-family:KaTeX_Typewriter}.katex .mathscr{font-family:KaTeX_Script}.katex .mathsf{font-family:KaTeX_SansSerif}.katex .mainit{font-family:KaTeX_Main;font-style:italic}.katex .mainrm{font-family:KaTeX_Main;font-style:normal}.katex .vlist-t{display:inline-table;table-layout:fixed}.katex .vlist-r{display:table-row}.katex .vlist{display:table-cell;vertical-align:bottom;position:relative}.katex .vlist>span{display:block;height:0;position:relative}.katex .vlist>span>span{display:inline-block}.katex .vlist>span>.pstrut{overflow:hidden;width:0}.katex .vlist-t2{margin-right:-2px}.katex .vlist-s{display:table-cell;vertical-align:bottom;font-size:1px;width:2px}.katex .msupsub{text-align:left}.katex .mfrac>span>span{text-align:center}.katex .mfrac .frac-line{display:inline-block;width:100%}.katex .mspace{display:inline-block}.katex .mspace.negativethinspace{margin-left:-.16667em}.katex .mspace.muspace{width:.055556em}.katex .mspace.thinspace{width:.16667em}.katex .mspace.negativemediumspace{margin-left:-.22222em}.katex .mspace.mediumspace{width:.22222em}.katex .mspace.thickspace{width:.27778em}.katex .mspace.sixmuspace{width:.333333em}.katex .mspace.eightmuspace{width:.444444em}.katex .mspace.enspace{width:.5em}.katex .mspace.twelvemuspace{width:.666667em}.katex .mspace.quad{width:1em}.katex .mspace.qquad{width:2em}.katex .clap,.katex .llap,.katex .rlap{width:0;position:relative}.katex .clap>.inner,.katex .llap>.inner,.katex .rlap>.inner{position:absolute}.katex .clap>.fix,.katex .llap>.fix,.katex .rlap>.fix{display:inline-block}.katex .llap>.inner{right:0}.katex .clap>.inner,.katex .rlap>.inner{left:0}.katex .clap>.inner>span{margin-left:-50%;margin-right:50%}.katex .rule{display:inline-block;border:0 solid;position:relative}.katex .overline .overline-line,.katex .underline .underline-line{display:inline-block;width:100%}.katex .sqrt>.root{margin-left:.27777778em;margin-right:-.55555556em}.katex .fontsize-ensurer,.katex .sizing{display:inline-block}.katex .fontsize-ensurer.reset-size1.size1,.katex .sizing.reset-size1.size1{font-size:1em}.katex .fontsize-ensurer.reset-size1.size2,.katex .sizing.reset-size1.size2{font-size:1.2em}.katex .fontsize-ensurer.reset-size1.size3,.katex .sizing.reset-size1.size3{font-size:1.4em}.katex .fontsize-ensurer.reset-size1.size4,.katex .sizing.reset-size1.size4{font-size:1.6em}.katex .fontsize-ensurer.reset-size1.size5,.katex .sizing.reset-size1.size5{font-size:1.8em}.katex .fontsize-ensurer.reset-size1.size6,.katex .sizing.reset-size1.size6{font-size:2em}.katex .fontsize-ensurer.reset-size1.size7,.katex .sizing.reset-size1.size7{font-size:2.4em}.katex .fontsize-ensurer.reset-size1.size8,.katex .sizing.reset-size1.size8{font-size:2.88em}.katex .fontsize-ensurer.reset-size1.size9,.katex .sizing.reset-size1.size9{font-size:3.456em}.katex .fontsize-ensurer.reset-size1.size10,.katex .sizing.reset-size1.size10{font-size:4.148em}.katex .fontsize-ensurer.reset-size1.size11,.katex .sizing.reset-size1.size11{font-size:4.976em}.katex .fontsize-ensurer.reset-size2.size1,.katex .sizing.reset-size2.size1{font-size:.83333333em}.katex .fontsize-ensurer.reset-size2.size2,.katex .sizing.reset-size2.size2{font-size:1em}.katex .fontsize-ensurer.reset-size2.size3,.katex .sizing.reset-size2.size3{font-size:1.16666667em}.katex .fontsize-ensurer.reset-size2.size4,.katex .sizing.reset-size2.size4{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size2.size5,.katex .sizing.reset-size2.size5{font-size:1.5em}.katex .fontsize-ensurer.reset-size2.size6,.katex .sizing.reset-size2.size6{font-size:1.66666667em}.katex .fontsize-ensurer.reset-size2.size7,.katex .sizing.reset-size2.size7{font-size:2em}.katex .fontsize-ensurer.reset-size2.size8,.katex .sizing.reset-size2.size8{font-size:2.4em}.katex .fontsize-ensurer.reset-size2.size9,.katex .sizing.reset-size2.size9{font-size:2.88em}.katex .fontsize-ensurer.reset-size2.size10,.katex .sizing.reset-size2.size10{font-size:3.45666667em}.katex .fontsize-ensurer.reset-size2.size11,.katex .sizing.reset-size2.size11{font-size:4.14666667em}.katex .fontsize-ensurer.reset-size3.size1,.katex .sizing.reset-size3.size1{font-size:.71428571em}.katex .fontsize-ensurer.reset-size3.size2,.katex .sizing.reset-size3.size2{font-size:.85714286em}.katex .fontsize-ensurer.reset-size3.size3,.katex .sizing.reset-size3.size3{font-size:1em}.katex .fontsize-ensurer.reset-size3.size4,.katex .sizing.reset-size3.size4{font-size:1.14285714em}.katex .fontsize-ensurer.reset-size3.size5,.katex .sizing.reset-size3.size5{font-size:1.28571429em}.katex .fontsize-ensurer.reset-size3.size6,.katex .sizing.reset-size3.size6{font-size:1.42857143em}.katex .fontsize-ensurer.reset-size3.size7,.katex .sizing.reset-size3.size7{font-size:1.71428571em}.katex .fontsize-ensurer.reset-size3.size8,.katex .sizing.reset-size3.size8{font-size:2.05714286em}.katex .fontsize-ensurer.reset-size3.size9,.katex .sizing.reset-size3.size9{font-size:2.46857143em}.katex .fontsize-ensurer.reset-size3.size10,.katex .sizing.reset-size3.size10{font-size:2.96285714em}.katex .fontsize-ensurer.reset-size3.size11,.katex .sizing.reset-size3.size11{font-size:3.55428571em}.katex .fontsize-ensurer.reset-size4.size1,.katex .sizing.reset-size4.size1{font-size:.625em}.katex .fontsize-ensurer.reset-size4.size2,.katex .sizing.reset-size4.size2{font-size:.75em}.katex .fontsize-ensurer.reset-size4.size3,.katex .sizing.reset-size4.size3{font-size:.875em}.katex .fontsize-ensurer.reset-size4.size4,.katex .sizing.reset-size4.size4{font-size:1em}.katex .fontsize-ensurer.reset-size4.size5,.katex .sizing.reset-size4.size5{font-size:1.125em}.katex .fontsize-ensurer.reset-size4.size6,.katex .sizing.reset-size4.size6{font-size:1.25em}.katex .fontsize-ensurer.reset-size4.size7,.katex .sizing.reset-size4.size7{font-size:1.5em}.katex .fontsize-ensurer.reset-size4.size8,.katex .sizing.reset-size4.size8{font-size:1.8em}.katex .fontsize-ensurer.reset-size4.size9,.katex .sizing.reset-size4.size9{font-size:2.16em}.katex .fontsize-ensurer.reset-size4.size10,.katex .sizing.reset-size4.size10{font-size:2.5925em}.katex .fontsize-ensurer.reset-size4.size11,.katex .sizing.reset-size4.size11{font-size:3.11em}.katex .fontsize-ensurer.reset-size5.size1,.katex .sizing.reset-size5.size1{font-size:.55555556em}.katex .fontsize-ensurer.reset-size5.size2,.katex .sizing.reset-size5.size2{font-size:.66666667em}.katex .fontsize-ensurer.reset-size5.size3,.katex .sizing.reset-size5.size3{font-size:.77777778em}.katex .fontsize-ensurer.reset-size5.size4,.katex .sizing.reset-size5.size4{font-size:.88888889em}.katex .fontsize-ensurer.reset-size5.size5,.katex .sizing.reset-size5.size5{font-size:1em}.katex .fontsize-ensurer.reset-size5.size6,.katex .sizing.reset-size5.size6{font-size:1.11111111em}.katex .fontsize-ensurer.reset-size5.size7,.katex .sizing.reset-size5.size7{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size5.size8,.katex .sizing.reset-size5.size8{font-size:1.6em}.katex .fontsize-ensurer.reset-size5.size9,.katex .sizing.reset-size5.size9{font-size:1.92em}.katex .fontsize-ensurer.reset-size5.size10,.katex .sizing.reset-size5.size10{font-size:2.30444444em}.katex .fontsize-ensurer.reset-size5.size11,.katex .sizing.reset-size5.size11{font-size:2.76444444em}.katex .fontsize-ensurer.reset-size6.size1,.katex .sizing.reset-size6.size1{font-size:.5em}.katex .fontsize-ensurer.reset-size6.size2,.katex .sizing.reset-size6.size2{font-size:.6em}.katex .fontsize-ensurer.reset-size6.size3,.katex .sizing.reset-size6.size3{font-size:.7em}.katex .fontsize-ensurer.reset-size6.size4,.katex .sizing.reset-size6.size4{font-size:.8em}.katex .fontsize-ensurer.reset-size6.size5,.katex .sizing.reset-size6.size5{font-size:.9em}.katex .fontsize-ensurer.reset-size6.size6,.katex .sizing.reset-size6.size6{font-size:1em}.katex .fontsize-ensurer.reset-size6.size7,.katex .sizing.reset-size6.size7{font-size:1.2em}.katex .fontsize-ensurer.reset-size6.size8,.katex .sizing.reset-size6.size8{font-size:1.44em}.katex .fontsize-ensurer.reset-size6.size9,.katex .sizing.reset-size6.size9{font-size:1.728em}.katex .fontsize-ensurer.reset-size6.size10,.katex .sizing.reset-size6.size10{font-size:2.074em}.katex .fontsize-ensurer.reset-size6.size11,.katex .sizing.reset-size6.size11{font-size:2.488em}.katex .fontsize-ensurer.reset-size7.size1,.katex .sizing.reset-size7.size1{font-size:.41666667em}.katex .fontsize-ensurer.reset-size7.size2,.katex .sizing.reset-size7.size2{font-size:.5em}.katex .fontsize-ensurer.reset-size7.size3,.katex .sizing.reset-size7.size3{font-size:.58333333em}.katex .fontsize-ensurer.reset-size7.size4,.katex .sizing.reset-size7.size4{font-size:.66666667em}.katex .fontsize-ensurer.reset-size7.size5,.katex .sizing.reset-size7.size5{font-size:.75em}.katex .fontsize-ensurer.reset-size7.size6,.katex .sizing.reset-size7.size6{font-size:.83333333em}.katex .fontsize-ensurer.reset-size7.size7,.katex .sizing.reset-size7.size7{font-size:1em}.katex .fontsize-ensurer.reset-size7.size8,.katex .sizing.reset-size7.size8{font-size:1.2em}.katex .fontsize-ensurer.reset-size7.size9,.katex .sizing.reset-size7.size9{font-size:1.44em}.katex .fontsize-ensurer.reset-size7.size10,.katex .sizing.reset-size7.size10{font-size:1.72833333em}.katex .fontsize-ensurer.reset-size7.size11,.katex .sizing.reset-size7.size11{font-size:2.07333333em}.katex .fontsize-ensurer.reset-size8.size1,.katex .sizing.reset-size8.size1{font-size:.34722222em}.katex .fontsize-ensurer.reset-size8.size2,.katex .sizing.reset-size8.size2{font-size:.41666667em}.katex .fontsize-ensurer.reset-size8.size3,.katex .sizing.reset-size8.size3{font-size:.48611111em}.katex .fontsize-ensurer.reset-size8.size4,.katex .sizing.reset-size8.size4{font-size:.55555556em}.katex .fontsize-ensurer.reset-size8.size5,.katex .sizing.reset-size8.size5{font-size:.625em}.katex .fontsize-ensurer.reset-size8.size6,.katex .sizing.reset-size8.size6{font-size:.69444444em}.katex .fontsize-ensurer.reset-size8.size7,.katex .sizing.reset-size8.size7{font-size:.83333333em}.katex .fontsize-ensurer.reset-size8.size8,.katex .sizing.reset-size8.size8{font-size:1em}.katex .fontsize-ensurer.reset-size8.size9,.katex .sizing.reset-size8.size9{font-size:1.2em}.katex .fontsize-ensurer.reset-size8.size10,.katex .sizing.reset-size8.size10{font-size:1.44027778em}.katex .fontsize-ensurer.reset-size8.size11,.katex .sizing.reset-size8.size11{font-size:1.72777778em}.katex .fontsize-ensurer.reset-size9.size1,.katex .sizing.reset-size9.size1{font-size:.28935185em}.katex .fontsize-ensurer.reset-size9.size2,.katex .sizing.reset-size9.size2{font-size:.34722222em}.katex .fontsize-ensurer.reset-size9.size3,.katex .sizing.reset-size9.size3{font-size:.40509259em}.katex .fontsize-ensurer.reset-size9.size4,.katex .sizing.reset-size9.size4{font-size:.46296296em}.katex .fontsize-ensurer.reset-size9.size5,.katex .sizing.reset-size9.size5{font-size:.52083333em}.katex .fontsize-ensurer.reset-size9.size6,.katex .sizing.reset-size9.size6{font-size:.5787037em}.katex .fontsize-ensurer.reset-size9.size7,.katex .sizing.reset-size9.size7{font-size:.69444444em}.katex .fontsize-ensurer.reset-size9.size8,.katex .sizing.reset-size9.size8{font-size:.83333333em}.katex .fontsize-ensurer.reset-size9.size9,.katex .sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-size9.size10,.katex .sizing.reset-size9.size10{font-size:1.20023148em}.katex .fontsize-ensurer.reset-size9.size11,.katex .sizing.reset-size9.size11{font-size:1.43981481em}.katex .fontsize-ensurer.reset-size10.size1,.katex .sizing.reset-size10.size1{font-size:.24108004em}.katex .fontsize-ensurer.reset-size10.size2,.katex .sizing.reset-size10.size2{font-size:.28929605em}.katex .fontsize-ensurer.reset-size10.size3,.katex .sizing.reset-size10.size3{font-size:.33751205em}.katex .fontsize-ensurer.reset-size10.size4,.katex .sizing.reset-size10.size4{font-size:.38572806em}.katex .fontsize-ensurer.reset-size10.size5,.katex .sizing.reset-size10.size5{font-size:.43394407em}.katex .fontsize-ensurer.reset-size10.size6,.katex .sizing.reset-size10.size6{font-size:.48216008em}.katex .fontsize-ensurer.reset-size10.size7,.katex .sizing.reset-size10.size7{font-size:.57859209em}.katex .fontsize-ensurer.reset-size10.size8,.katex .sizing.reset-size10.size8{font-size:.69431051em}.katex .fontsize-ensurer.reset-size10.size9,.katex .sizing.reset-size10.size9{font-size:.83317261em}.katex .fontsize-ensurer.reset-size10.size10,.katex .sizing.reset-size10.size10{font-size:1em}.katex .fontsize-ensurer.reset-size10.size11,.katex .sizing.reset-size10.size11{font-size:1.19961427em}.katex .fontsize-ensurer.reset-size11.size1,.katex .sizing.reset-size11.size1{font-size:.20096463em}.katex .fontsize-ensurer.reset-size11.size2,.katex .sizing.reset-size11.size2{font-size:.24115756em}.katex .fontsize-ensurer.reset-size11.size3,.katex .sizing.reset-size11.size3{font-size:.28135048em}.katex .fontsize-ensurer.reset-size11.size4,.katex .sizing.reset-size11.size4{font-size:.32154341em}.katex .fontsize-ensurer.reset-size11.size5,.katex .sizing.reset-size11.size5{font-size:.36173633em}.katex .fontsize-ensurer.reset-size11.size6,.katex .sizing.reset-size11.size6{font-size:.40192926em}.katex .fontsize-ensurer.reset-size11.size7,.katex .sizing.reset-size11.size7{font-size:.48231511em}.katex .fontsize-ensurer.reset-size11.size8,.katex .sizing.reset-size11.size8{font-size:.57877814em}.katex .fontsize-ensurer.reset-size11.size9,.katex .sizing.reset-size11.size9{font-size:.69453376em}.katex .fontsize-ensurer.reset-size11.size10,.katex .sizing.reset-size11.size10{font-size:.83360129em}.katex .fontsize-ensurer.reset-size11.size11,.katex .sizing.reset-size11.size11{font-size:1em}.katex .delimsizing.size1{font-family:KaTeX_Size1}.katex .delimsizing.size2{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .delimsizing.mult .delim-size1>span{font-family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4>span{font-family:KaTeX_Size4}.katex .nulldelimiter{display:inline-block;width:.12em}.katex .delimcenter,.katex .op-symbol{position:relative}.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .accent>.vlist-t,.katex .op-limits>.vlist-t{text-align:center}.katex .accent .accent-body{width:0;position:relative}.katex .overlay{display:block}.katex .mtable .vertical-separator{display:inline-block;margin:0 -.125em;width:.25em;overflow:hidden;position:relative}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-align-c>.vlist-t{text-align:center}.katex .mtable .col-align-l>.vlist-t{text-align:left}.katex .mtable .col-align-r>.vlist-t{text-align:right}.katex .svg-align{text-align:left}.katex svg{display:block;position:absolute;width:100%;fill:currentColor;stroke:currentColor;fill-rule:nonzero;fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1}.katex svg path{stroke:none}.katex .vertical-separator svg{width:.25em}.katex .stretchy{width:100%;display:block;position:relative;overflow:hidden}.katex .stretchy:after,.katex .stretchy:before{content:""}.katex .hide-tail{width:100%;position:relative;overflow:hidden}.katex .halfarrow-left{position:absolute;left:0;width:50.2%;overflow:hidden}.katex .halfarrow-right{position:absolute;right:0;width:50.2%;overflow:hidden}.katex .brace-left{position:absolute;left:0;width:25.1%;overflow:hidden}.katex .brace-center{position:absolute;left:25%;width:50%;overflow:hidden}.katex .brace-right{position:absolute;right:0;width:25.1%;overflow:hidden}.katex .x-arrow-pad{padding:0 .5em}.katex .mover,.katex .munder,.katex .x-arrow{text-align:center}.katex .boxpad{padding:0 .3em}.katex .fbox{box-sizing:border-box;border:.04em solid #000}.katex .fcolorbox{box-sizing:border-box;border:.04em solid}.katex .cancel-pad{padding:0 .2em}.katex .cancel-lap+.mbin,.katex .cancel-lap+.mord,.katex .cancel-lap+.msupsub,.katex .mbin+.cancel-lap,.katex .mord+.cancel-lap{margin-left:-.2em}.katex .sout{border-bottom-style:solid;border-bottom-width:.08em} \ No newline at end of file diff --git a/dist/_/skole/hio/2017/eksamensark/datakom.html b/dist/_/skole/hio/2017/eksamensark/datakom.html deleted file mode 100644 index 66597ca..0000000 --- a/dist/_/skole/hio/2017/eksamensark/datakom.html +++ /dev/null @@ -1,1862 +0,0 @@ - - - - - - - Datakom - eksamensark - - - - - -
    -
    -
    -

    s1. Hva heter de forskjellige lagene i ”Internet Protocol Stack”?

    -
      -
    1. Det fysiske laget
    2. -
    3. Datalink laget
    4. -
    5. Nettverkslaget
    6. -
    7. Transport laget
    8. -
    9. Applikasjonslaget
    10. -
    - - -

    Gi en beskrivelse av hva hvert lag sier om arbeidsoppgavene til en protokoll i det laget.

    -

    Lag 1 kalles det fysiske laget og forteller hva som skal beskrives i det fysiske laget. Det fysiske laget har som oppgave å få overført en bit feilfri mellom to punkter. Det er på dette laget at en beskrivelse av en bit finnes.

    -

    Lag 2 kalles datalink laget og forteller hva som skal beskrives for å få datapakker over til neste node i et nettverk. Protokoller på dette laget har som hovedoppgave å overføre datapakker mellom to punkter/noder. Protokoller på dette laget inneholder beskrivelser av hvordan den delen av en datapakke er bygd opp for å kunne overføre datapakken til neste punkt/node. Lag 2 protokoll inneholder info adressen (f.eks. MAC) til neste punkt/node, slik at riktig node tar imot datapakken. Info om flytkontroll og feilkontroll er også i protokollen for lag 2, slik at en datablokk kan bli feilfri overført mellom to noder/punkt. Protokollen inneholder også info om hvilken protokoll på laget over som skal ha dataene.

    -

    Lag 3 kalles nettverkslaget og forteller hva som skal beskrives for at datapakker skal finne veien gjennom et nettverk. En protokoll på dette laget inneholder info om adressen (f.eks.IP), og kan inneholde info som gjør at alle datapakkene i en overføring blir overført under like forhold, f.eks at pakkene bruker tilnærmet samme tid på å komme seg gjennom nettverket. Protokollen inneholder også info om hvilken protokoll på laget over som skal ha dataene

    -

    Lag 4 kalles transportlaget og forteller hva som skal beskrives for at datapakker skal komme over til endepunktet i forbindelsen. Det kan være et program på endestasjonen (f.eks. PC). En protokoll på dette laget har som hovedoppgave å overføre datablokker mellom to endepunkter, f.eks. fra en applikasjon (program) på en datamaskin til en applikasjon på den andre datamaskinen. En protokoll på transportlaget skal også skjule funksjonene i de underliggende nettverksavhengige lagene fra lagene over.

    -

    Lag 5 kalles applikasjonslaget, og sørger for at data fra applikasjonene på hver side får de data som er nødvendig.

    - - -

    En protokoll dekker et, eller flere lag i denne modellen (Internet Protokoll Stack).. Grensesnittet mellom lagene er veldefinert. En protokoll kan bruke «tjenester» levert av laget under, og den tilbyr tjenester til laget over. Den samme protokollen kan da brukes på forskjellige protokoller på lagene under. F.eks vil den samme webbrowseren brukes uavhengig av hva slags linje som går ut.

    -

    Hvorfor er denne lagdelingen laget, som du finner i Internet Protokoll Stack?

    - - -

    Hva er hovedforskjellen mellom OSI referanse modellen og Internet Protokoll Stack.

    -

    Hovedforskjellen er at i Internet Protokoll Stack mangler lag 5 og 6 (session og presentation), som finnes i OSImodellen. OSI modellen har 7 lag. De grunnleggende protokollene brukt i Internet eksisterte før OSI referanse modellen var laget. Protokollene brukt i Internet hadde i utgangspunktet ikke et så omfattende og klart definerte beskrivelser av arbeidsoppgavene for de forskjellige lagene.

    -

    Etter at OSI modellen kom, startet man også arbeidet med lagdeling av protokollene brukt i Internet. Dette kalles Internet Protocol Stack, eller TCP/IP protocol stack eller TCP/IP modellen. Den inneholder kun 5 lag.

    - - -

    Hva er en protokoll, og hva slags type informasjon finner du i en protokoll?

    -

    En protokoll inneholder info om hvordan en arbeidsoppgave i TCP/IP modellen skal - løses.

    -

    For at to personer skal kunne snakke sammen, må de bruke samme språk, Da vil de forstå - hverandre. Når datamaskiner skal overføre data til hverandre, må de bruke samme - protokoll. Datamaskiner som «snakker sammen», må bruke samme protokoll.

    -

    En protokoll er et sett med regler som beskriver hvordan kommunikasjonen skal foregå. - En protokoll beskriver oppbyggingen av de forskjellige datapakkene som brukes i - protokollen. Protokollen beskriver også dataflyten i overføringen, dvs hvilke typer - datapakker som brukes når, og hvordan de forskjellige sekvensene er, slik som - oppstartsekvens, dataoverføringssekvens og nedkoblingssekvens.

    -

    En protokoll dekker ett eller flere lag i Internet Protocol Stack. I beskrivelsen av - protokollen tas det da med bare de detaljene som har med dette eller disse laget å gjøre. - For eksempel i beskrivelsen av oppbyggingen av datapakker, vil bare de delene, som har - med de lagene som protokollen dekker, tas med. De andre delene vil ofte bare kalles - ”datadel”.

    - - -

    Beskriv en typisk datapakke.

    -

    En datapakke består av mange byte som kommer rett etter hverandre. I den første delen av - pakka er hodet (for det laget pakka er i). Hodet inneholder info som er nødvendig for at - protokollen skal kunne utføre oppgavene den skal gjøre. - Noen pakker har også en hale, som også er der for at protokollen skal kunne utføre oppgaven - den skal gjøre

    -
    -
    -

    Anta at du har fått tildelt et nett med nett-adresse 158.29.16.00 og maske 255.255.248.0, av din internettleverandør

    - -

    a) Istedet for å angi ditt nett med nett-adresse og maske slik som over, kan det skrives på en annen måte. Hvordan skrives det?

    -

    255.255.248.0 sier at det er 21 stk 1’ere i masken. I den første byten står det 255, som - vil si 8 stk 1’ere. Tilsvarende er det i byte nr.2. I byte nr.3 står det 248, som er - 11111000 på binær form. Her er det altså 5 stk 1’ere. Det blir til sammen 8+8+5=21 stk - 1’ere.

    -

    Denne info kan skrives som /21 bak nettadressen: 158.29.16.00 / 21 - Man angir på denne måten: Nettadressen / antall 1’ere i masken. Antall 1’ere i masken, - angir antall bit i nettdelen av IP adressen. Dette ses på som en del av nettadressen

    - -

    b) Hvor mange host kan du tilknytte ditt nett?

    -

    Antall host bestemmes av antall 0’ere i masken, som angir antall bit i hostdelen. Her er - det 32-21=11 stk 0’ere, det vil si 11 bit til host. Det gir: 211 – 2 = 2046 host. - -2 er de to adressene som går bort; nettadressen og broadcastadressen. En host kan ikke - ha den samme adressen som nettet den er på. En host kan heller ikke ha den samme - adressen som broadcastadressen, som er den adressen som går til alle.

    - -

    c) Hva blir broadcast-adressen?

    -

    Broadcast-adressen er den adressen med bare 1’ere i host. Nå går grensen mellom nett - og host i den 3.byten. Nettadressen er oppgitt til 158.29.16.00/21. Dette skrevet på - binær form, hvor fet skrift angir nettdelen, og blå skrift angir hostdelen: - 10011110.00011101.00010000.00000000

    -

    Hvis vi setter alle bitene i hostdelen til 1, blir det:

    -

    10011110.00011101.00010111.11111111 Skrevet på desimal form gir: 158.29.23.255

    -
      -
    • Fordi
    • -
    • 10011110 = 158
    • -
    • 00011101 = 29
    • -
    • 00010111 = 23
    • -
    • 11111111 = 255
    • -
    - -

    d) Hva blir høyeste og laveste IP-adresse på en host på dette nett?

    -

    Høyeste IP-adresse er en under broadcast-adressen: 158.29.23.254

    -

    Laveste IP-adresse er en over nettadressen: 158.29.16.01

    - - -

    Nå skal du dele ditt nett opp i to like store subnett.

    - -

    a) Hva blir nett-adressene på disse to nett?

    -

    Hvis vi tillater bruk av «subnet zero» og «all 1 subnet», kan vi bruke en bit av - hostadressen for å lage to nett. De nye subnett-bitene får verdiene henholdsvis 0 og 1. - De er angitt med rød farge. Fet skrift angir nettdelen, og blå angir hostdelen (Vi ser på de to siste bytene):

    -
    -
    -

    Nett 1: 00010000.00000000 -> 16.00

    -

    => Nettadressen: 158.29.16.00 / 22

    -
    -
    -

    Nett 2: 00010100.00000000 -> 20.00

    -

    => Nettadressen: 158.29.20.00 / 22

    -
    -
    - -

    b) Hva blir masken på disse to nett?

    -

    Vi har tatt en bit av hostdelen for å lage disse to subnett. Den nye masken blir da: - 255.255.252.00. (252 = 11111100), eller skrevet slik: /22

    -
    -
    -
    -
    -

    c) Hva blir broadcast-adressene?

    -

    Broadcastadressene har bare 1’ere i hostdelen:

    -

    Vi ser på de to siste bytene, og setter 1’er i hostdelen:

    -

    Nett 1: 00010011.11111111 -> 19.255

    -

    => Broadcastadressen for nett 1 blir da:158.29.19.255

    -

    Nett 2: 00010111.11111111 -> 23.255

    -

    => Broadcastadressen for nett 2 blir da:158.29.23.255

    - -

    d) Hva blir høyeste og laveste IP-adresse på en host på hvert av disse nett?

    -

    Høyeste IP-adresse er en under broadcastadressen: - Nett1: 158.29.19.254 Nett2: 158.29.23.254

    -

    Laveste IP-adresse er en over nettnummeret: - Nett1: 158.29.16.01 Nett2: 158.29.20.01

    - - -

    Nå skal du dele ditt nett opp i seks like store subnett.

    - -

    a) Hva blir nett-adressene på disse nett?

    -

    For å kunne få 6 subnett må vi bruke 3 bit til subnett. Hvis vi tillater bruk av «subnet zero» - og «all 1 subnet», ville vi da kunne fått 23= 8 like store subnett. Det er 2 flere subnett enn - det vi trenger. Hvis vi bare hadde brukt 2 bit til subnett, vill vi bare ha fått 22=4 subnett, - som er 2 for lite. Derfor må vi bruke 3 bit.

    -

    Hvis det ikke hadde vært tillatt bruk av «subnet zero» og «all 1 subnet», så ville det kunne - blitt 23-2= 6 subnett. Vi måtte da trekke ifra 2 i antall subnett, fordi da hadde kun nettadressen - uten maskeinfo, blitt brukt for å indentifisere nette. To nett kan jo ikke ha samme - nettadresse, eller samme broadcastadresse. De 2 som må trekkes fra er de hvor - subnettbitene bare er 0’ere, eller bare 1’ere. For å finne nett-adressene til disse 6 nett, ser vi nærmere på de - to siste byte’ene i nettadressen til hovednettet. Det er fordi delet mellom nettdel og hostdel går i den 3.byten. - Ved subnetting vil delet gå i den 4. byten.:

    -

    158.29.16.00 / 21 Fet skrift er bit som er i nettdelen, og blå er de som er i hostdelen

    -

    Før subnetting: 00010000.00000000

    -

    Biter med rød skrift er nå brukt til subnetting, og går da over fra å være bit i hostdelen til biter i nettdelen.

    -

    Etter subnetting:

    -
    -
    -
      -
    • 00010000.00000000 -> 158.29.16.00 / 24
    • -
    • 00010001.00000000 -> 158.29.17.00 / 24
    • -
    • 00010010.00000000 -> 158.29.18.00 / 24
    • -
    • 00010011.00000000 -> 158.29.19.00 / 24
    • -
    • 00010100.00000000 -> 158.29.20.00 / 24
    • -
    • 00010101.00000000 -> 158.29.21.00 / 24
    • -
    • 00010110.00000000 -> 158.29.22.00 / 24
    • -
    • 00010111.00000000 -> 158.29.23.00 / 24
    • -
    -
    -
    -

    De 6 subnett kunne i utgangspunktet få hvilken som helst av disse 8 adresser. Det hadde da - blitt 2 adresser til overs. - MEN, det er mer oversiktilig å ta de store nettene i mitten av nummer-området, og bruke - ytterkanten til mindre nett. Slik sett bruker vi ikke - 158.29.16.00 / 24 eller 158.29.23.00 / 24 til de store subnettene.

    -
    -
    - -

    b) Hva blir masken på disse nett?

    -

    Slik som diskutert fram i forrige oppgave, blir masken /24. Skrevet på den andre måten blir det: 255.255.255.00

    -
    -
    -

    c) Hvis nettene ikke trengte å være like store, hvordan kunne nettadressene, med maske blitt da?

    -

    Da kunne vi laget 2 av nettene litt større. Ved å velge de to nettene mitt i nummerområdet, ville det blitt:

    -
    -
    -
      -
    • 00010000.00000000 -> 158.29.16.00 / 24
    • -
    • 00010001.00000000 -> 158.29.17.00 / 24
    • -
    • 00010010.00000000 -> 158.29.18.00 / 23
    • -
    • 00010100.00000000 -> 158.29.20.00 / 23
    • -
    • 00010110.00000000 -> 158.29.22.00 / 24
    • -
    • 00010111.00000000 -> 158.29.23.00 / 24
    • -
    -
    -
    -
    -
    -

    En bedrift har sitt hovedkontor i Halden. Bedriften skal opprette et nytt - kontor i Fredrikstad. Hovedkontoret i Halden har et lokalnett som er delt i to - subnett, Ethernet 1 og Ethernet 2, koblet sammen med en ruter (Ruter 1). - Bedriften er koblet til Internet via den samme ruteren. Kontoret i Fredrikstad - skal tilknyttes hovedkontoret via en punkt-til-punkt forbindelse. Da dette - skjer, vil punkt A, på Ruter 1, kobles til punkt B. Se på figuren under.

    -

    La oss først se på kontoret i Halden. IP-nummeret de fikk på sitt nett var - 139.26.154.00/24. Dette har bedriften delt opp i subnett. Adressemasken på - subnettene (Ethernet 1 og Ethernet 2) er 255.255.255.224. Nettadressen på - Ethernet 1 er 139.26.154.64. og på Ethernet 2 er 139.26.154.32.

    -
    - -
    -

    a) Hvor mange PC’er kan tilknyttes Ethernet 1 ?

    -

    Masken på Ethernet1 er: 255.255.255.224 (siste byte: -> .11100000 = .224) - Det er da 5 bit i hostdelen på nettene. Når 00000 og 11111 ikke kan brukes til en host, - blir det 25-2=30 host. Et hostnummer går til ruteren. Da blir det 29 PC'er igjen på - Ethernet1.

    -
    -
    - -

    b) PC1 og PC2 må få hver sin IP-adresse. Hvilke IP-adresser kan de få?

    -
    -
    -

    PC1 ligger på Ethernet1, som har nettnummer 139.26.154.64 / 27, - 64=01000000 og masken /27 = 255.255.255.224 -> 224=.11100000 - Første nummer: 139.26.154.65, blir ruterens nummer. PC1 kan da få et nummer - imellom 139.26.154.66 og 139.26.154.94 (66= 01000010, - 94= 01011110)

    -
    -
    -

    PC2 ligger på Ethernet2, som har nettnummer 139.26.154.32 / 27, - 32=00100000 og masken /27 = 255.255.255.224. -> 224=.11100000 - Første nummer: 139.26.154.33, blir ruterens nummer. PC1 kan da få et nummer - imellom 139.26.154.34 og 139.26.154.62 (34= 00100010, - 62= 00111110)

    -
    -
    - -

    Hva er høyeste og laveste IP-adresse på Ethernet2? – Forklar hvordan du kommer frem til svaret.

    -
    -
    -

    Laveste IP-adresse på Ethernet2 er en over nettadressen: Nettadresse er - 139.26.154.32 (32= 00100000) Dvs laveste IP-adresse på en host på Ethernet2 blir: - 139.26.154.33 (33= 00100001)

    -
    -
    -

    Høyeste IP- adresse på Ethernet2 er en under broadcastadressen, som er : - 139.26.154.63 (63= 00111111) Dvs høyeste IP-adresse på en host på Ethernet2 blir: - 139.26.154.62 (62= 00111110)

    -
    -
    - -

    d) Hva er broadcastadressen til Ethernet1?

    -

    Ethernet1, har nettnummer 139.26.154.64 /27, 64=01000000 - med maske 255.255.255.124. 224=.11100000 - Broadcastadressen har bare 1’ere i host-delen av adressen. Masken viser at det er 5 bit i - hostdelen av adressen. Broadcastadressen blir da: - 139.26.154.95 => 01011111 =95

    - - -

    Nå skal kontoret i Fredrikstad tilknyttes kontoret i Halden. Bedriften setter opp en punkt-til—punkt forbindelse mellom de to kontorene. (Punkt A og B knyttes sammen).

    - -

    a) Hvilke IP-adresser får hvert endepunkt i forbindelsen mellom de to kontorene, og hva blir nettmasken? Ta hensyn til at bedriften ønsker å utnytte IP-numrene best mulig

    -

    Punkt-til-punkt forbindelsen har bare to tilknytninger, en i hver ende. Vi trenger da et - nett som bare har mulighet til to tilkoblinger. Antall bit i host-delen er da to. - Nettnummeret kan tas ifra en av "ytterkantene" av adresseområdet, da de ikke er - brukt fra før. Det blir altså der hvor det er 0.00 eller 1.11 fra de andre subnettene. Vi - velger f.eks. 0.00-delen. Det gir

    -
      -
    • Nettnummeret: 139.26.154.04 (154.04 = 10011010 . 000 001 00)
    • -
    • Nettmasken: /30 = 255.255.255.252 (252 = 11111100)
    • -
    • IP-nummer for hvert endepunkt:
    • -
    • 139.26.154.05 ( 05 = 000 001 01) og 139.26.154.06 ( 06 = 000 001 10)
    • -
    - - -

    Hva er VPN? Forklar litt om det.

    -

    VPN står for Virtual Private Network. VPN lager en sikker(kryptert) kanal gjennom et usikret - internet. Du tilknytter deg til en VPN server, som er lokalisert i ditt private nettverk, eller på - intranettet på f.eks jobben/skolen. Du har også nødvendig programvare på din «host». All din - kommunikasjon på internet går via denne VPN serveren, slik at det ser ut som om du er innenfor - dette private nettverket, eller intranett. Du får da også tilgang til tjenester/dokumenter som bare - tilbys på dette intranettet.

    -
    -
    -
    -
    -

    b) Hva blir nettadressen til Ethernet3?

    -

    Vi kan fritt velge hvilke nettadresser vi gir Ethernet3 av de adressene vi har igjen. - 139.26.154.00/24 er den originale nettadressen, som kan kalles hovednettet. Ethernet 1 - og Ethernet2 er subnett av det hovednettet, hvor det er brukt 3 bit til subnett. - Hvis Løsning 1: - alle subnett skal være like store, har vi disse valg:

    -
      -
    • 139.26.154.00 / 27 (siste to byte: 10011010 . 00000000 = 154.00) (subnet zero)
    • -
    • 139.26.154.32 / 27 (siste to byte: 10011010 . 00100000 = 154.32) (Ethernet 2)
    • -
    • 139.26.154.64 / 27 (siste to byte: 10011010 . 01000000 = 154.64) (Ethernet 1)
    • -
    • 139.26.154.96 / 27 (siste to byte: 10011010 . 01100000 = 154.96)
    • -
    • 139.26.154.128 / 27 (siste to byte: 10011010 . 10000000 = 154.128)
    • -
    • 139.26.154.160 / 27 (siste to byte: 10011010 . 10100000 = 154.160)
    • -
    • 139.26.154.192 / 27 (siste to byte: 10011010 . 11000000 = 154.192)
    • -
    • 139.26.154.224 / 27 (siste to byte: 10011010 . 11100000 = 154.224) (all 1 subnet)
    • -
    • Ethernet1 nettnummer: 139.26.154.64 / 27 Ethernet2 nettnummer: 139.26.154.32 / 27
    • -
    -

    Her kan vi velge en av 6 nettadresser til Ethernet 3. - 139.26.154.00 / 27, eller 139.26.154.96 / 27 eller 139.26.154.128 / 27 ... - 139.26.154.224 / 27

    -

    Med denne løsningen vil firmaet meget enkelt kunne utvide med flere kontorer, og alle - kontorer får samme størrelse på sitt nett. Hvis firmaet ikke ser for seg flere kontorer, - og ønsker å bruke mest mulig av de tildelte IP-numrene, kan man vurdere et større nett - for kontoret i Fredrikstad:

    -

    Løsning 2:

    -
      -
    • 139.26.154.128 / 25 (Masken er da 255.255.255.128, som er et større nett)
    • -
    • 139.26.154.128 / 25 (siste to byte: 10011010 . 10000000 = 154.128)
    • -
    - -

    c) Hva blir nettmasken til de Ethernet3?

    -

    Som angitt i oppgaven over: - Løsning 1 gir: - Nettmasken til Ethernet3 er den samme som på Ethernet1 og Ethernet2: - 255.255.255.224. (224=.11100000)

    -

    Løsning 2 gir 255.255.255.128 (128=.10000000)

    - -

    Hva er DHCP, og hvordan virker den?

    -

    Hvis du har et stort nettverk vil det ta enormt mye tid å skrive inn IP adressen på hver host som er - på nettverket. Heldigvis kan man bruke DHCP i stedet. En maskin på nettverket kan settes opp som en DHCP - server. En DHCP server gir hver host på nettverket, som spør om det, IP adresse, subnett maske og default - gateway adresse. DHCP står for Dynamic Host Configuration Protocol, og den brukes for å dele ut IPadresse til en maskin som forespør om en IP-adresse. - Det finnes en DHCP server som dekker et eller flere subnett. Denne har et sett med IPadresser som den kan dele ut fra, til maskiner som forespør om en IP-adresse. - DHCP bruker UDP (User Datagram Protocol) protokollen. DHCP serveren bruker port nummer 68.DHCP klienten bruker port nummer 67. - Et eksempel på DHCP:

    -

    - En maskin som blir slått på, og som er satt til å forespørre en DHCP-server om sin - IP-adresse, sender en DHCP DISCOVER pakke til DHCP-serveren. Når denne - kommer fram til DHCP-serveren, retunerer den IP-adresse i en DHCP-OFFER - pakke. Hvis maskinen som mottar denne, godtar dette nummer, sender den en - DHCPREQUEST pakke tilbake til DHCP serveren. DHCP-serveren sender tilbake - en DHCPACK pakke. Samtidig settes en timer i gang. Enhver maskin må - ”oppdatere” sin IP-adresse jevnlig, ved å sende en melding til DHCP-serveren. Hvis - DHCP-serveren ikke mottar en slik oppdatering innen timeren er gått ut, vil den - frigjøre IP-adressen, som da kan deles ut til en annen maskin som forespør om en - IP-adresse. -

    - - -

    Hvordan er en MAC adresse bygd opp?

    -

    MAC adressen kalles også ”den fysiske adressen” eller ”hardware adressen”. Det er - MAC adressen som en PC bruker for å bestemme om en datapakke skal tas imot. - MAC adressen består av 48 bit, dvs 6 byte. De 3 første byte sier hvilken produsent av - nettkortet det er. De 3 siste byte bestemmer produsenten selv. Det finnes ikke to - nettkort som har den samme fysiske adressen.

    -
    -
    -

    Det finnes flere typer MAC adresser.

    -
      -
    1. -

      Den individuelle, som er individuell for alle nettverkskort. Det finnes ingen - nettverkskort som har samme MAC adresse. De første 24 bit bestemmer - hvilken produsent det er. De neste 24 bit bestemmer produsenten selv. Denne - type MAC adresse kalles også unicast (kun for dette nettkort) og er «globally - unique»

      -
    2. -
    3. -

      En annen type MAC adresse kan programmeres på kortet. Den er «locally administered».

      -
    4. -
    5. -

      Det finnes også en multicast MAC adresse, som også kan programmeres. Det - er en MAC adresse som brukes når mange host i et nett skal ta imot - datapakken

      -
    6. -
    -

    Det er to bit i første byte som bestemmer hvilken type MAC adressen det er. En bit - indikerer om det er en «globally unique» adresse eller «locally administrert» adresse. - En annen bit indikerer om det er en unicast adresse

    -
    - -
    - - -

    Hva er forskjellene på en MAC adresse og IPv4 adresse?

    -

    En MAC adresse virker på lag 2 i TCP/IP modellen. Det er ikke mulig å finne ut hvor en host - med en bestem MAC adresse befinner seg på internet, før datapakken er på dette samme - lokalnettet hvor denne MAC adressen befinner seg. En IPv4 adresse virker på lag 3 i TCP/IP modellen. Det er et system på disse - adressene slik at det er mulig å finne ut hvor en IPv4 adressen befinner seg på - internet. En MAC adresse består av 6 byte, slik som forklart i oppgave nr.1. En IPv4 - adresse består av totalt 4 byte. Adressen består av en nettdel og en hostdel. En host - vil få en ny IPv4 adresse når den blir koblet til et annet nett (LAN). Alle host på et - LAN har samme nettdel av adressen.

    - - -

    Hva er hovedforskjellene mellom IPv4 og IPv6?

    -
      -
    1. -

      Adressefeltet er mye større i IPv6. Det er det 128 bit, mens i IPv4 er det 32 bit. Det er - også flere adressetyper i IPv6. I tillegg til unicast adresse (en enkelt enhet), slik som også - IPv4 har, har IPv6 anycast og multicast adresse. Anycast tas imot av den første, den - nærmeste, av et sett host’s som utgjør anycast adressen. En multicast adresse blir sendt til - alle som er en del av multicast adressen. Det kan sammenlignes med broadcast adressen i - IPv4.

      -
    2. -
    3. -

      IPv6 hodet har sløyfet en del felt, som gjør at prosesseringen på info i IPv6 hodet går - raskere. Header Checksum er fjernet, som gjør at lag3-utstyr slipper å foreta beregningen - på header checksum. IPv6 har sløyfet info om lengden på hodet, og muligheten av - ”option” i hodet. I stedet legger IPv6 opp til å bruke flere etterfølgende hoder. Denne - metode gjør prosesseringen på et standardhode raskere.

      -
    4. -
    5. Se tabell på side 4 (spalte 1)
    6. -
    - - -

    Hvordan kan en IPv6 pakke bli sendt i et IPv4 nett?

    -

    Hvis det er et gammelt IPv4 nett, hvor routerne ikke har mulighet for å håndtere både IPv6 - og IPv4, kan det brukes ”tunneling” for å sende en IPv6 pakke igjennom et IPv4 nettverk. - Hele IPv6 pakka pakkes inn i datadelen av IPv4 pakka. - Hvis det brukes routere som både kan ta IPv4 og IPv6, kan det brukes «dual-stack». Da blir - IPv6 pakka sent igjennom nettet som en IPv6 pakke.

    - - -

    Hva er forskjellene på en bit, en byte og en datapakke?

    -

    En bit har en, av to mulige tilstander: 0 eller 1. - En byte består av 8 bit. En byte kan da ha en av 28=256 mulige «verdier», eller forskjellige kombinasjoner av 0 og 1. - En datapakke består av mange byte som kommer rett etter hverandre.

    -
    -
    -
    -
    -
    -
    -

    s2. Forklar alle delene i et IPv4 hode.

    -
    - -
    -
    -
    Verson
    -
    De 4 første bit er versjon nummer på IP. Her er det tallet 4.
    - -
    TOS
    -
    Type of service. Vanligvis ikke i bruk, men kan brukes til angi spesielle tjenester IP pakka skal ha, eller krav pakka setter til nettverket.
    - -
    Source address
    -
    En 4 byte lang adresse som sier fra hvilken IP adresse denne pakken kommer fra.
    - -
    Destination address
    -
    En 4 byte lang adresse som sier hvilken IP adresse denne pakken skal til.
    - -
    IHL
    -
    De neste 4 bit er IHL (IP Header Length). Det er antall 32 bit «deler» i hodet. - Vanligvis er dette tallet 5, da en normal IPv4 hode består av 5 stk 32 bit «deler», - totalt 5*32 bit = 160 bit, eller 20 byte.
    -
    -
    -
    -
    -
    Total length
    -
    Dette er et tall som angir totalt antall byte i denne IP pakka, både hode og data. - Identification: Et nummer som spesifikt identifiserer denne IP pakka. Brukes sammen med - Fragmentering.
    - -
    Flags
    -
    3 bit som har med fragmentering å gjøre. To av bitene brukes. En bit (M) sier at det - er flere fragmenter eller ikke. En bit (D) sier om det er lov å fragmentere eller ikke.
    - -
    Fragment offset
    -
    Når en større pakke er fragmentert (delt opp i flere deler), forteller dette - feltet hvor datadelen i denne IP pakka skal være. Det første fragmentet har offset 0. - Neste fragment sier hvor langt ut i den originale ufragmenterte pakka, denne - datadelen hører til
    - -
    Time to live
    -
    Time To Live. Et 8 bit tall som minker med en for hver router. Hvis pakken har gått - igjennom så mange routere at den blir 0, vil pakken stoppe. Den routeren som - stoppet pakken, vil gi beskjed tilbake til senderen om at pakken ble stoppet.
    - -
    Protocol
    -
    Et nummer som angir hvilken protokoll på transportlaget, som skal ha denne pakka. - For eksempel TCP har verdien 6, UDP har verdien 17.
    - -
    Header checksum
    -
    Dette er et tall som er beregnet på bakgrunn av verdiene i bytene i hodet. - Dette brukes for å finne ut om det er blitt bitfeil i hodet
    -
    - - -

    Forklar alle delene i et IPv6 hode.

    -
    -
    -
    -
    Traffic class
    -
    8 bit, som tilsvarer TOS i IPv4 hodet
    - -
    Flow label
    -
    20 bit som identifiserer at en pakke tilhører en bestem «flow» av data. Alle som - er i samme «flow» krever samme «behandling» i nettet. Eksempel på pakker som - er en del av en flow, kan være audio eller video pakker
    - -
    Payload length
    -
    Antall byte i datadelen av IPv6 pakka
    - -
    Next header
    -
    Sier hva som er i neste hodet. IPv6 kan ha flere forskjellige tilleggshoder, som - kan oppfylle spesielle funksjoner. Hvis det ikke er et tillegshodet, vil next header - innholde info om hodet på transportlaget, f.eks om det er et TCP hode eller UDP - hode.
    -
    -
    - -
    -
    -
    Hop limit
    -
    Tilsvarende som TTL i IPv4. Dette er et tall som minker med en for hvert hopp - (hver router). Hvis den kommer til 0, vil routeren stoppe pakka, og sende info - tilbake til sender med info om at pakka er stoppet
    -
    - -

    Hva er et AS? Hvorfor har vi det?

    -

    Autonomous System er en del av internet, som består av flere routere. Internet er delt - opp i mange AS. Hver av disse AS indentifiseres med et nummer; AS <nr>. Routerne innen et - AS utveksler info, bla. routinginfo seg i mellom via bestemte protokoller. En stor bedrift, - eller institusjon, kan ha sitt eget AS <nr>.

    -

    Internet er delt inn i flere AS bla. fordi det er for mange routere i hele internet, til at alle kan - utveksle info seg i mellom. Det er derfor hensiktsmessig å la et begrenset antall routere, som - i et AS, utveksle info seg i mellom. Routerne som er ”i kanten” på et slik AS, kalles en - gateway router. Gateway routere kommuniserer med en tilsvarende gateway router i et annet - AS. Den vanlige routing protokollen mellom AS er BGP.

    -

    Et AS kan i prinsippet velge hvilken routing algoritme, og dermed routing protokoll som skal - brukes i sitt AS. Vanlige routing protokoller innen et AS er RIP eller OSPF.

    -
    - -
    -

    Hva er hovedoppgaven til en rutings algoritme, og hva heter de to (mest kjente) - prinsippene for rutings algoritmer, og hva er forskjellene på de? Gi en kort - forklaring på de to.

    -

    En ruting algoritme’s (eng: routing algorithm) hovedoppgave er å finne den beste veien - mellom to host i nettverket. Den ”beste” veien kan også kalles den ”billigste” veien, eller - veien med ”minst kostnad” (least cost). Det er flere faktorer som avgjør en ”kostnad”, ikke - bare penger.

    -

    Det er to hovedprinsipper for rutings algoritmer:

    -
      -
    1. - En global rutings algoritme: -

      Her vet rutings algoritmen alle kostnader på alle forbindelser i nettet, før den starter - på beregningen. En slik algoritme kalles også en Link-State (LS) algoritme. En mye - brukt LS algoritme er Dijkstra’s algoritme. – En slik algoritme må altså innhente alle - kostnader i nettet, på forhånd. Blir det forandring på kostnaden på en forbindelse, må - info om hele nettet ut på nytt til alle som skal foreta denne algoritmen.

      -
    2. -
    3. - En desentralisert rutings algoritme: -

      Her vet rutings algoritmen kun kostnadene på sine egne forbindelser, når den starter. - En slik algoritme kalles også en Distance-Vector (DV) algoritme. Info sendes - etterhvert ut til de nærliggende routerne, som bruker denne info for den videre - beregning. Slik sprer routings info seg gradvis utover i nettverket, helt til alle har fått - all info som er nødvendig for å vite kostnadene i hele nettet.

      -
    4. -
    - - -

    Nevn de tre mest vanlige rutingsprotokollene.

    -
      -
    • -

      Routing Information Protocol (RIP) bruker en DVrutings algoritme, og er mest utbredt, da - den brukes i de nederste lag i internet hierakiet. Her er det flest routere

      -
    • -
    • -

      Open Shortest Path First (OSPF) bruker en LS rutings algoritme. De brukes oftest i routere i - ”backbone” nettverk, som forbinder forskjellige områder innen internet (ikke AS, men - mindre hoveddeler)

      -
    • -
    • -

      Border Gateway Protocol (BGP) er den mest komplekse, og brukes mellom AS.

      -
    • -
    - - -

    Hva er forskjellene på intra-AS rutings protokoll og inter-AS rutings protokoll?

    -

    Intra-AS routing protokoll er routing protokoll som brukes innen et AS. Routings - protokollene RIP eller OSPF er vanlige intra-AS routings protokoller. Inter-AS routing protokoll er routing - protokoll som brukes mellom forskjellige AS. Routing protokollen BGP er en vanlig inter-AS routing protokoll.

    -
    -
    -
    -
    -
    -
    - -
    -
    -

    Forklar litt om hvordan kryptering foregår og nøkler. Nevn også eksempler på - typer av nøkler og hvordan de brukes i en "sikker" datakommunikasjon.

    -

    Kryptering foregår ved at ved sendersiden sendes «klartekst» inn i en krypterings algoritme, - som bruker info fra en «nøkkel» til å lage den krypterte datastrømmen (ciphertext)

    -
    -
    -

    Denne krypterte datastrømmen er umulig å dekode tilbake til klartekst uten bruk av riktig - nøkkel og dekodings algoritme. Det brukes to nøkler, en offentlig nøkkel og en privat nøkkel. Den offentlige brukes til - krypteringen og den private brukes til å dekryptere. Den offentlige nøkkelen kan være kjent - av alle, men den private nøkkelen må være hemmelig. Disse to nøklene hører sammen.

    - - -

    Hva menes med "effektivitet" på en dataoverføring?

    -

    Effektiviteten er gitt av forholdet mellom tiden som brukes til å sende data, og tiden til neste - pakke (eller serie med pakker) kan sendes. Hvis vi setter tiden for å sende en pakke til ttrans og - tiden signalet bruker for å komme fra sender (S) til mottager (M) og tilbake igjen; RTT. - RTT=Round Trip Time. L=pakkestørrelsen og R=bithastigheten, blir U ved stopp-og-vent - overføring (idle RQ):

    -
    - U = \dfrac{t_{trans}}{RTT+t_{trans}} - = \dfrac{^L/_R}{RTT+^L/_R} -
    -

    Ved kontinuerlig dataoverføring, med et sendevindu på K, må uttrykket multipliseres med K. - Effektiviteten U kan ikke være større enn 1,0, så hvis multiplikasjonen med K gir en U større - enn 1,0, blir U=1,0

    - -

    Hva er effektiviteten på en forbindelse til universitetet i Sofia? Anta at du har en - kontinuerlig overføring, med et sendevindu på 16 pakker. Pakkestørrelsen er på - 1024 byte, og datahastigheten ut av din PC er 50 Mbit/s. Forsinkelsen til - universitetet i Sofia kan du lese ut av en ping til maskinen:

    -
      -
    • Pinging www.uni-sofia.bg [62.44.96.22] with 32 bytes of data:
    • -
    • Reply from 62.44.96.22: bytes=32 time=52ms TTL=51
    • -
    • Reply from 62.44.96.22: bytes=32 time=52ms TTL=51
    • -
    • Reply from 62.44.96.22: bytes=32 time=52ms TTL=51
    • -
    • Reply from 62.44.96.22: bytes=32 time=52ms TTL=51
    • -
    • Ping statistics for 62.44.96.22:
    • -
    • Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
    • -
    • Approximate round trip times in milli-seconds:
    • -
    • Minimum = 52ms, Maximum = 52ms, Average = 52ms
    • -
    -

    Vi setter inn i formelen:

    -
    - U = K \cdot \dfrac{ L/R }{ RTT+L/R } - = 16 \cdot \dfrac{ ^{(1024 \cdot 8)}/_{(50 \cdot 10^6)} }{ ^{(52 \cdot 10^{-3})+(1024 \cdot 8)}/_{(50 \cdot 10^6)} } - = \dfrac{ 2,6 }{ 52 } - = \underline{\underline{0,05}} -
    - - -

    Hva blir den effektive datahastigheten på forbindelsen til universitetet i Sofia? - Gi svaret i bit/s (evt kbit/s eller Mbit/s).

    -

    Den effektive datahastigheten er effektiviteten multiplisert med (den fysiske) - datahastigheten. Det bli:

    -

    Datahastigheten blir Uˑ50 Mbit/s = 0,05ˑ50 Mbit/s = \underline{\underline{2,5 Mbit/s}}

    -
    -
    -

    Du skal finne ut hvor mye en BER (Bit Error Rate) påvirker effektiviteten. - Pakkestørrelsen er på 2048 byte og datahastigheten er på 100 Mbit/s (100*106 - bit/s)

    -

    Forsinkelsen til NTNU kan du lese ut av en ping:

    -
      -
    • Pinging lvs56vip12.it.ntnu.no [129.241.56.202] with 32 bytes of data:
    • -
    • Reply from 129.241.56.202: bytes=32 time=9ms TTL=56
    • -
    • Reply from 129.241.56.202: bytes=32 time=9ms TTL=56
    • -
    • Reply from 129.241.56.202: bytes=32 time=10ms TTL=56
    • -
    • Reply from 129.241.56.202: bytes=32 time=9ms TTL=56
    • -
    • Ping statistics for 129.241.56.202:
    • -
    • Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
    • -
    • Approximate round trip times in milli-seconds:
    • -
    • Minimum = 9ms, Maximum = 10ms, Average = 9ms
    • -
    - -

    a) Regn ut effektiviteten til NTNU med bruk av idle-RQ protokoll, og feilfri - overføring. (BER=0)

    - -

    Vi setter inn i formelen:

    -
    - U = K \cdot \dfrac{ L/R }{ RTT+L/R } - = 16 \cdot \dfrac{ ^{(2048 \cdot 8)}/_{(100 \cdot 10^6)} }{ ^{(9 \cdot 10^{-3})+(2048 \cdot 8)}/_{(100 \cdot 10^6)} } - = \dfrac{ 164 \cdot 10^{-6} }{ 9 \cdot 10^{-3} } - = \underline{\underline{0,018}} -
    - -

    Regn ut effektiviteten til NTNU med bruk av idle-RQ protokoll, hvor BER=2ˑ10-5

    -

    Vi må første regne ut sannsynligheten for feil i en pakke, Pf:

    -

    P_f = BER \cdot (antall\ bit\ i\ pakke) = BER \cdot L = 2 \cdot 10^{-5} \cdot (2048 \cdot 8) = 0,328

    -

    Dette brukes i den nye formelen for effektiviteten U, hvor Pf inngår:

    -
    - U = \dfrac{ 1-P_f }{ 1+RTT/\frac{L}{R} } - = \dfrac{ 1-0,328 }{ \dfrac{ 1+(9 \cdot 10^{-3}) }{ (2048 \cdot 8)/(100 \cdot 10^6) } } - = \dfrac{ 0,672 }{ 56 } = 0,012 -
    - - -

    Hvordan virker flytkontrollen mellom to host på transportlaget? Anta at det - brukes TCP protokollen.

    -

    Flytkontroll er en metode for å kontrollere og styre flyten av data mellom sender - og mottager. Uten denne flytkontrollen ville mottageren kunne kommet i den - situasjonen at den ikke klarte å ta unna all data som kom fra senderen. Senderen - kunne da ha sent data for fort for mottageren, og data kunne blitt tapt. - Mottageren har et mottagerbuffer, der data legger seg før de sendes opp til applikasjonen. - Det bufferet må være der fordi vi kan ikke anta at applikasjonen er klar til ta imot data da - data faktisk kommer. Applikasjonen kan være opptatt med andre oppgaver da data kommer. Så - lenge dette mottagerbufferet har plass nok, kan sender bare sende data til mottager. - Flytkontroll oppnås ved at mottageren sender info om hvor mye ledig plass den - har i mottagerbufferet, tilbake til senderen. Denne info legger seg i TCP hodet, i - ”Receive window”, og sendes tilbake i en ACK pakke. Det kan også legges i en - datapakke som sendes fra mottager til sender, altså hvis det sendes data begge - veier samtidig.

    -
    -
    -
    -
    -

    Hvordan løser TCP køkontroll? Hvordan virker køkontroll i TCP?

    -

    Køkontroll er en metode for styre kø. Kø kan oppstå i et nettverk ved at flere - forbindelser går igjennom en nettverksenhet, f.eks en ruter. Summen av - trafikken for hver forbindelse kan bli for stor for den ruteren, og da vil pakker bli - tapt. TCP må ha mekanismer som vil kunne justere trafikken på sin forbindelse, - slik at alle pakker slipper igjennom.

    -

    Nå har ikke nettverksenhetene i ”vanlig” Internet, f.eks ruterne, mulighet til å gi - beskjed om kø hos seg. Hadde den hatt den muligheten, kunne den ha gitt - beskjed om køtilstanden tilbake til TCP forbindelsene. TCP må bruke andre - midler for å finne ut av køtilstanden, og justere trafikken i henhold til den

    -

    TCP starter forsiktig ved å bruke ”slow-start”. Den begynner ved å sende kun en - pakke. Neste pakke sendes først etter at ACK har kommet. Da vil den øke - vindustørrelsen til 2. For hver ACK legger den på en pakke i vinduet. Det vil - medføre at vindusstørrelsen dobbles for hver gang (hver RTT). Slik fortsetter - den inntil den oppdager at pakker blir borte (ved at timeout slår til). Da justerer - den vindusstørrelsen tilbake til 1 pakke. (En pakke er MSS stor). Samtidig har - den notert hva vindusstørrelsen var da timeout slo til. ”Threshold” settes til - halvparten av den verdien.

    -

    Nå vil den kjøre slow-start igjen, men den vil doble vindusstørrelsen kun inntil den har kommet til - ”Threshold”. Det var jo den vindusstørrelsen hvor det gikk bra forrige gang. Ved neste dobling ble det - jo pakketap.

    -

    Når vindusstørrelsen har nådd ”Threshold” verdien, går den inn i ”congestion avoidance” tilstand, - hvor økning av vindusstørrelsen skjer mye mer forsiktig. I stedet for dobling, øker den med kun 1 for - hver RTT. Slik øker den inntil det blir tap av pakker igjen.

    -

    Tap av pakker oppdages enten ved at timeout slår til, eller at det har kommet 3 duplikate ACK. Dvs at - 2 like ACK har kommet 3 ganger. En duplikat ACK betyr at pakken kom riktig fram på andre forsøk. Køen er - da ikke så stor.Hvis timeout slår til, betyr det at ingen pakker har kommet fram. Da er køen stor.

    -

    Hvis tap oppdages ved at 3 duplikate ACK har kommer, går den inn i ”Fast recovery” tilstand. Det vil - si at vindusstørrelsen går tilbake til halvparten av hva den var da tap skjedde, og den går inn i - ”congestion avoidance” tilstand. Dvs. pakkestørrelsen øker kun med 1 for hver RTT. Denne økningen fortsetter - inntil det blir tap igjen.

    -

    Hvis tap oppdages ved at timeout slår til, går vindusstørrelsen tilbake til slow start tilstand. - Vindusstørrelsen går da tilbake til 1.

    -

    For hver gang det blir duplikat ACK (to like ACK etter hverandre), øker duplikat ACK telleren.

    - - -

    Hva er forskjellene mellom UDP og TCP?

    -

    UDP står for User Datagram Protocol og er en ”connectionless” protokoll. Det vil si at - forbindelsen ikke blir satt opp først. Det er data i første pakke. UDP er en usikker protokoll - da den ikke gir noen respons tilbake om pakka har kommet fram, og veien som den tar kan - være forskjellig for hver pakke som går. UDP inneholder lite ”overhead”, og det går da - raskere å sende data med UDP enn TCP.

    -

    TCP står for Transmission Control Protocol og er en ”connected oriented” protokoll. Det vil - si at forbindelsen blir satt opp før data sendes. Alle pakkene som sendes i en melding følger - samme veien. Pakkene kommer også fram i riktig rekkefølge og det er mulighet for - retransmisjon ved feil. TCP-hodet inneholder nok info til å styre alt dette. Det blir da - forholdsvis mye ”overhead”, som gjør at det går tregere med TCP enn UDP.

    -

    TCP er egnet der hvor det er viktig at alle pakker kommer riktig fram, selv om det ikke går så - hurtig. F.eks. hvis en webside blir overført, eller i en forbindelse med banken. UDP er egnet - der hvor det ikke er så kritisk hvis en pakke skulle bli borte, men det er viktig at forbindelsen - er rask. F.eks. der hvor lyd og/eller film blir overført.

    - -
    -
    -

    Hva slags info finnes i hodet på en UDP pakke?

    -

    Et UDP hode inneholder kun fra og til- portnummer, lengden på datapakka og sjekksummen for datapakka

    - - -

    Hva slags info finnes i hodet på en TCP pakke?

    - TCP -
    -
    - UDP -

    Et TCP hode inneholder fra- og tilportnummer. Til-portnummeret er nummeret til den socket som - applikasjonen skal ha data inn på. Fra-portnummeret er nummeret til den socket som applikasjonen - forventer et svar på.

    - -
      -
    • - Sequence number -

      Nummeret på pakka. Dette nummer øker for hver pakke, slik at mottageren kan finne ut av rekkefølgen på pakkene. (Egentlig er det bytenummer, slik at tallet øker ikke med en, men med hvor mange byte det var i pakka)

      -
    • -
    -
    -
    - -
    -
    -
    Acknowldgement number
    -
    nummeret på pakka som kom fra den andre siden. Dette blir - en OK melding (ACK) på data som kom fra den andre siden. - (Bytenummer her også)
    - -
    Header length
    -
    forteller hvor mange 32 bits ord som er i hodet. Denne info brukes for å finne - ut om det sendes options i hodet, og da hvor stort det er.
    - -
    Kontroll bits
    -
    URG: Urgent Pointer: Hvis denne bit er satt, er det data i Urgent data pointer
    - -
    ACK
    -
    Hvis denne bit er satt, er acknowledgement number gyldig.
    - -
    PSH
    -
    Push Function: Hvis denne bit er satt må mottageren levere dataene til - applikasjonen så raskt som mulig.
    -
    -
    -
    RST
    -
    Reset the Connection: Hvis denne bit er satt, betyr det at sender avbryter sendingen - og all data mottatt i denne TCP forbindelsen kan slettes.
    - -
    SYN
    -
    Synchronize: Hvis denne bit er satt betyr det at sender forsøker å synkronisere - sekvens nummer. Dette signal kommer gjerne under initiering av en sending.
    - -
    FIN
    -
    Det betyr at det ikke er noe mer data i denne TCP forbindelsen hos sender.
    - -
    Receive windows
    -
    brukes som flyt kontroll. Her forteller mottageren hvor mange byte den har - plass til i mottagerbufferet sitt.
    - -
    Internet checksum
    -
    brukes for å finne ut om det er bitfeil i pakka
    - -
    Urgent pointer
    -
    En peker til data som mottageren må bearbeide så snart som mulig
    -
    -
    -
    -
    -
    -
    -
    -
    -

    s3. Hva er DNS? Forklar litt om virkemåten.

    -

    Hovedhensikten med DNS er å oversette et hostnavn til en IP adresse og vise versa. Den motsatte veien, å oversette en IP adresse til et domain navn, kalles "Reverse DNS".

    - - -
    -
    -

    Datamaskinene må bruke IP adresse for å finne fram til en annen maskin, for - eksempel en web-server eller mail-server. For oss mennesker er det mer naturlig å bruke et navn enn et - nummer. DNS gjør at du kan skrive inn adressen som et ”domain name”, f.eks www.hiof.no, og DNS - finner da IP adressen til denne, som kan være 158.39.162.29.

    -

    DNS står for Domain Name System. DNS består av et hierarkisk system av navnetjenere. En - navnetjener inneholder noen opplysninger som er tilknyttet et maskinnavn på Internet. Primært er det - IP-nummeret som PC’en (brukeren) forespør etter. Hvis den ikke kjenner IP-adressen, videresender - den forespørselen til en root-navnetjener.

    -

    Hvis det brukes «interaktion» metode, vil root-navnetjeneren sende svar tilbake om hvem som er «toplevel-domain» - navnetjener, som da blir spurt.

    -
    -
    -

    Denne gir info tilbake om hvem som er domenets - autoritative navnetjener, som da blir spurt og som svarer med informasjon om den aktuelle IP-adressen. - Den lokale navnetjeneren svarer deretter den spørrende maskinen.

    -

    Hvis det brukes «rekursiv» metode, vil root-navnetjeneren sende forespørselen videre til TLD - navnetjener, som igjen sender forespørselen videre til den autorative navnetjeneren. Svarene går - samme vei tilbake til den første (spørrende) navnetjeneren. Se figur.

    -

    Den første navnetjeneren, som originalt sendte forespørselen, vil kopiere opplysningen om det - maskinnavnet, og la den være hos seg i en viss tid (TTL), i tilfelle det blir en ny forespørsel.

    -

    Etter at den tiden er gått ut, vil opplysningene om den maskinen bli slettet. - DNS kan også benyttes til host aliasing, mail server aliasing og lastdeling mellom flere web-servere.

    -
    - - -

    Hva slags info ligger i en record i DNS?

    -

    En DNS record inneholder fire felt: NAME, VALUE, TYPE, TTL.

    -

    TTL angir hvor lenge navneopplysningene skal leve før den blir fjernet ifra cache.

    -

    NAME og VALUE avhenger av TYPE: (Her er en oversikt over de mest brukte TYPE):

    -
      -
    • -

      Dersom TYPE=A (Address) så er NAME=hostnavn og VALUE=ip-adressen (IPv4) for - hostnavnet. Dersom TYPE=AAAA (Address) så er NAME=hostnavn og VALUE=ipadressen - (IPv6) for hostnavnet.

      -
    • -
    • -

      Dersom TYPE=NS (Name Server) så er NAME=domain, for eksempel hiof.no, mens VALUE er - hostnavnet til en autoritativ DNS server som kan å få tak i ipadressene til hosts i det domainet.

      -
    • -
    • -

      Dersom TYPE=CNAME (Canonical Name) så vil NAME være et alias navn mens VALUE er det - virkelige hostnavnet.

      -
    • -
    • -

      Dersom TYPE=MX (Mail eXchange) så vil NAME være et alias navn for mailserver mens - VALUE er det virkelige hostnavnet til mailserveren.

      -
    • -
    - - -

    SMTP har endel svakheter. Gi en kort beskrivelse av (en del av) disse.

    -

    SMTP (Simple Mail Transfer Protocol) er en gammel protokoll for e-post. Den fungerer mellom mailservere. - RFC 733 for SMTP er fra 1977, men SMTP eksisterte også før det. Den gang ble e-post kun - brukt til å sende tekst, som benyttet ASCII-tegnene for bokstaver og tegn. I ASCII-tabellen ligger - bokstaver, talltegn og andre tegn i den første del av ASCII-tabellen. Dvs at det kun var nødvendig å - sende 7 bit per tegn. I den første del av ASCII-tabellen er den 8.ende bit’en, DB7 = ’0’. Den biten - trengte da ikke å bli sendt. SMTP er basert på 7 bit dataoverføring. Nå er det jo stort sett bare 8 bit - dataoverføring som brukes. Disse må nå først gjøres om til 7 bit, før de kan sendes via SMTP. Dette får man til - ved å bruke MIME. Hadde SMTP vært laget for 8 bit overføring, kunne man i prinsippet sluppet MIME. Det kan man - da si er en svakhet for SMTP. En annen svakhet ved SMTP er at det er relativt enkelt å lage en ”falsk” avsender - for e-post. All info ligger i klartekst.

    - - -

    Nevn de tre mest kjente protokollene som brukes mellom en epost server og en klient. - Forklar kort om forskjellene på de (IMAP, POP, HTTP)

    -

    POP3: Denne protokollen var en av de første som ble brukt. Her ble eposten lastet ned på din PC, - fra epost serveren. Vanligvis ble eposten slettet fra epost-serveren rett etter at den ble lastet - ned til din PC. Når du svarte på en epost (reply) så gjorde du det på din PC, som så lastet - opp denne epost til epost serveren, som så sendte den. – POP3 hadde ikke mulighet til å - organisere epost på epost-serveren, i f.eks mapper. Det ble også et problem hvis du brukte - flere forskjellige PC’er til til epost. POP3 var laget for at du kun brukte en PC til din epost - behandling. For å bruke denne må du ha et program som har mulighet til å bruke POP3, - som må settes opp med en del parametere, som f.eks epost-serverens adresse.

    -

    IMAP: Denne protokollen tok var laget for at du kunne bruke flere forskjellige PC’er til din epostbehandling. - Her kunne all epost organiseres på selve epost-serveren, i f.eks mapper. Det lå - også flere funksjoner inne i denne protokollen. For å bruke denne må du ha et program - som har mulighet til å bruke IMAP, som må settes opp, tilsvarende POP3. (Mer på neste spalte)

    -
    -
    -
    -
    -

    HTTP: Hvis du bare har en web-browser tilgjengelig på din PC, kan du allikevel behandle din - epost på epost-serveren. Du trenger ikke sette opp denne først, det er nok å vite - webadressen. Denne er meget praktisk å bruke hvis du f.eks skal lese og behandle din - epost på en fremmeds PC, f.eks på en internet kafe ol.

    - -

    Forklar hvordan checksum på transportlaget virker. Angi hva bitverdien i checksum - feltet blir, hvis du sender 3 stk 16 bit data. Det som sendes er de 8 bit ASCII-verdiene: - 'A8' , '3F' og 'fa'. Ta med hvordan du kom fram til checksummen.

    - -
    -
    -

    Dataene blir summer på 16 bits nivå. Overskytende mente blir lagt til, og tilslutt blir svaret - invertert, og lagt i checksumfeltet. Mottageren gjør samme beregning, unntatt den siste - inverteringen. Når så mottagerens svar blir summer med det som er i checksumfeltet, blir - svaret 1

    -

    Vi slår opp i ASCII-tabellen og finner ut bitmønstrene for de tre 16 bits ASCII verdiene - 'A8' , '3F' og 'fa'. Vi summer de to første først, og legger til den siste:

    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    A8=>01000001 00111000
    +3F=>00110011 01000110




    01110100 01111110
    +FA=>01100110 01100001




    11011010 11011111
    -

    Invertert => 00100101 00100000 som legges i checksumfeltet

    -
    -
    -
    -
    -

    Gitt følgende datasignal, som er en jevn strøm av skiftevis 0 og 1:

    - -

    Dette datasignalet skal overføres på en kabel. Hva må vi sette som krav til - båndbredde for denne kabelen, når:

    - -

    a. Tiden t er 1 µs?

    -

    Vi vet at et slikt datasignal består av en sum av mange sinus-signaler, med forskjellig - frekvens. Hvis vi tar bort alle sinus-signalene med høye frekvenser, og bare sitter igjen - med ett sinus-signal, som er grunnfrekvensen i datasignalet. I figuren under ser du den - grunnfrekvensen tegnet inn i datasignalet:

    - -

    Ut fra dette sinussignalet er det mulig å gjenskape bitmønsteret som sendes. Vi må sette - som krav til båndbredden for kabelen at det sinus-signalet kan overføres. Frekvensen på - dette sinus-signalet er gitt av ”en delt på perioden av signalet”. Perioden er gitt av - avstanden i tid mellom to punkter på kurven som er like. I figuren over er den tiden 2*t. - Det gir en frekvens på:

    -
    - 1/2 \cdot t - = 1/2 \cdot 1 \mu s - = 1/2 \cdot 10^{-6}s - = 0.5 \cdot 10^6 Hz - = 500 \cdot 10^3 Hz - = 500 KHz. -
    -

    Kravet til båndbredde er altså 500 KHz

    - -

    b. Tiden t er 20 ns ?

    -

    Kravet til båndbredde her er:

    -
    - 1/2 \cdot t - = 1/2 \cdot 20ns - = 1/40 \cdot 10^{-9}s - = 0.025 \cdot 10^9 Hz - = 25 \cdot 10^6 Hz - = 25 MHz. -
    - - -

    Lag en tegning av det mottatte signalet, fra oppgave 1a), når det har gått - igjennom en kabel som akkurat oppfyller kravet til båndbredde

    - - - -

    Anta at du bruker wireless til dataoverføring. I spesifikasjonen for wirelessnettet - du skal bruke, står ord som: Center frequency, channel width og - channel. Forklar hva de ordene betyr.

    -

    Center frequency er frekvensen (bærebølgen) som brukes til å modulere - datasignalet. Et modulert datasignal har en viss båndbredde. Den bruker en del - av frekvensen rundt bærebølgen. Denne delen kalles channel width. En kanal er - en del av frekvensområdet som brukes til datakommunikasjon. Det - frekvensområdet er rundt bærebølgen som brukes i den kanalen

    - - -

    Anta at du har et WiFi nett. Forklar forskjellene mellom et ad-hoc nett, og et - nett med infrastruktur.

    -

    I et ad-hoc nett vil alle host kunne ta initiativ til å sende til en annen host på adhoc - nettet. I et nett med infrastruktur er det et aksesspunkt (AP) som styrer all - kommunikasjon. En host kan ikke sende før et AP spør den om den har noe å - sende. Både ad-hoc og infrastruktur kan fungere samtidig. Det er akessmetoden som styrer dette.

    - - -

    Anta at du har et WiFi nett. Forklar hvordan aksessmetodene virker.

    -

    I WiFi brukes to forskjellige system når det gjelder aksess. Det er PCF (Point - Coordination Function) og DCP (Distributed Coordination Function), I PCF er det - en basestasjon (aksesspunkt=AP) som spør hver enkel host om den har noe å - sende, altså nett med infrastruktur. Ingen host kan aksessere mediet uten å ha blitt - spurt av basestasjnen (AP). - I DCF kan hvilken som helst host i nettet ta initiativ til å sende, altså et ad-hoc - nett. Da brukes CSMA/CA aksess

    -
    -

    Carrier Sense Multiple Access med Collision Avoidance virker slik: En - stasjon som ønsker å sende, må først lytte, for å høre om det er noen - aktivitet på kanalen. Hvis det er aktivitet, må den vente. Så fort aktiviteten - er over, må den vente ytterligere DIFS tid før den starter sending. Hvis noen - andre da har begynt å sende, må den fortsette å vente.

    -

    Når pakken er sent, venter den på ACK pakke fra mottager. Hvis den ikke - kommer innen en viss tid, sender den pakken på nytt. Dette kan gjentas et - visst antall ganger.

    -

    CSMA/CA kan også bruke RTS og CTS. Stasjonen som skal sende, sender - da først en RTS pakke, hvor det er info om hvor lang tid sendingen vil pågå. - Det er for at andre stasjoner ikke skal sende i denne perioden. Den - mottagende stasjon svarer på RTS med en CTS pakke, med samme info om - tid på sendingen. De stasjonene som kun hører mottager, vil dermed også - ikke sende i den perioden. Når sende stasjonen har mottatt CTS, sende den - datapakka

    -
    -

    Nå skal DCF og PCF kunne virke samtidig i et nett. Det løses ved å innføre - bestemte tidsintervall, med forskjellig lengde.. En pågående kommunikasjon gjør - seg ferdig. Neste pakke i kommunikasjonen venter den korteste intervalltiden; - SIFS, før neste pakke sendes. Når kommunikasjonen er ferdig, kan neste begynne - å kommunisere. Da har PCF fortrinn. PCF kan starte sending etter tiden PIFS, - som er litt lenger enn SIFS. Når den kommunikasjonen er ferdig, kan neste DCF - kommunikasjon starte. De må vente DIFS tid, som er litt lenger enn PIFS tiden.

    - - -

    Beskriv virkemåten til CRC, og hvilke styrker / svakheter den har?

    -

    Cyclic Redundancy Check (CRC) er en feilkontroll som brukes for å oppdage - bitfeil i datapakker. CRC utfører en beregning av det som er i datapakka. Resultatet - av denne beregningen legges i gjerne i slutten av datapakka som sendes over, i - CRC feltet (eller FCS feltet). Mottageren utfører tilsvarende beregning, og vil da - kunne oppdage bitfeil i datapakka. CRC bruker et polynom (G) i sin beregning. - Hvis polynomet G består av r+1 bit, legges det til r stk 0’ere i slutten av datapakka. - Denne utvidede datapakka blir «modula 2 dividert» på G. Resten etter denne «divisjonen» - blir lagt inn i CRC feltet. Når så mottager utfører samme «divisjon», på datapakka som - tas imot, vil resten bli null, hvis det ikke er bitfeil... (fortsetter på neste spalte)

    -
    -
    -
    -
    -

    Styrken er at denne type feilkontroll vil oppdage alle typer feil, unntatt der hvor - feilmønsteret (E) i den mottatte pakka er lik polynomet. Hvis f.eks G = 1011, så vil - ikke en pakke som har E=1011 oppdages. Dvs feil i en bit, og neste bit er feilfri og - to neste bit er feil.

    -

    CRC har få svakheter. CRC er ofte implementert i hardware, og det er da ikke - mulig å forandre polynomet. Hvis den implementeres i software, vil den kreve en - del prosessorkraft.

    - - -

    Ord og utrykk

    -
    -
    Frame
    -
    Referer til en datapakke på lag 2 i TCP/IP stack'en. En "frame" er en datapakke som er klar til å sendes til neste punkt i et nettverk.
    - -
    FCS
    -
    Frame Check Sequence: felt som brukes til error-detection.
    - -
    Ethertype
    -
    Brukes til å indikere hvilken protokoll som er innkapslet i payload til framen. Feltet brukes - også til å angi størrelsen på noen Ethernet-frame
    - -
    IEEE 802.1Q tag
    -
    Et felt som hvis tilstede, indikerer det VLAN medlemskap og IEEE 802.1p prioritet.
    - -
    LAN
    -
    Local Area Network.
    - -
    VLAN
    -
    Virtual LAN (VLAN) er et LAN i et LAN. De som er med i dette VLAN kommer ikke inn på andre VLAN, uten at - de blir gitt tillatelse til det. For dem vil det virke som det andre VLAN’et er et annet LAN. VLAN defineres - på lag 2. Ved å bruke VLAN vil man derfor få økt kontroll over sikkerhet. VLAN vil også redusere overbelastning - av nettverket (network congestion).
    - -
    Gateway
    -
    Gateway adressen er adressen ut til Internet. Det er den adressen en host skal sende pakken til, hvis den - ikke finner adressen på LAN.
    - -
    Nettmaske
    -
    En nettmaske er en 32-bit maske som brukes til å dele en IP-adresse opp i subnet og angi subnettverkets - tilgjengelige hosts. Forteller hvor grensen mellom nettdelen og hostdelen går
    - -
    Switch
    -
    En switch sender data videre til neste node basert på MAC. En switch virker på lag 2. Dvs. at den leser - MAC adressen på en pakke som kommer inn, og sender den ut på kun den porten hvor den MAC adressen befinner seg.
    - -
    Ruter
    -
    En router sender data videre basert på IP adressen. En router virker på lag 3 (i tillegg). Dvs. at den også - leser IP adressen, og ruter pakken ut på riktig port. Når pakken sendes ut på porten, setter den også på riktig - MAC adresse til nærmeste mottager.
    -
    - -

    Ting & tang

    -
    -
    Ethernet frame & header
    -
    Frame
    - -
    En datapakke på en Ethernet-link kalles en Ethernet-pakke, som transporterer en Ethernet-frame - som payload. Hver frame starter med en Ethernet-header, midt delen inneholder payload data og inkluderer - eventuelle header for protokoller (eks: IP header). Framen slutter med en (FCS)
    -
    Header
    -
    Inneholder to MAC adresser (src, dest), EtherType feltet og et IEEE 802.1Q tag (valgfritt)
    - -
    ARP
    -
    ARP kartlegger (dynamisk) hvilken IP adresse (Lag 3 adressen) hver MAC adresse (Lag 2 adressen) - har, på et nett. En host, som skal sende data, trenger MAC adressen til (første/neste) mottager på - veien til slutt mottager. En host lagrer oversikten over MAC-IP som fås via ARP, i sitt cache minne, for - en kort stund. ARP er en request og reply protokoll. ARP kan bare brukes til å finne MAC adressen til en IP - adresse innenfor et nett. ARP virker på lag 2. ARP brukes også bare på IPv4, for di IPv6 bruker Neighbor - Discovery Protocol, som er en del av ICMPv6.
    - -
    HTTP
    -
    HTTP er laget for kommunikasjon mellom en webserver og webklient (web browser), hvor mange forskjellige - filtyper kan overføres. HTTP virker som en request-response protokoll mellom webklienten og webserveren. - Webklienten sender en request pakke og webserveren svarer med en response pakke. Respons pakken inneholder status - informasjon og kan også inneholde informasjonen request pakken spurte etter. -
    -
    - I HTTP requestet kan vi se at metoden GET brukes. HTTP versjonen er 1.1. - Andre ting i request headeren er User-Agent (info om client), - hva man skal akseptere som respons, samt info om respons kan være komprimert eller ikke. -
    -
    - I HTTP responsen vil man få status kode og tekst, her ser vi at status kode er 200 og tekst er OK. - Responsen inneholder også hvilken web-server som er i bruk (Apache), serveren sin dato, når siden ble sist endret, samt hvor langt innholdet er. - I Line-based text data: text/html ser vi selve innholdet som blir sendt. -
    - -
    IPv6 shorthand notation
    -
    Flere seksjoner med bare 0-ere kan gjøres om til :: (brukes kun en gang, der hvor - den fjerner mest 0-ere)
    -
    Ledene 0-ere før andre tall kan også fjernes.
    -
    Hvis det er flere 0-er seksjoner indikeres det med :0: (en per seksjon)
    -
    Eks: 2607:F6D0:0000:005A:0000:0000:0000:07C0 blir 2607:F6D0:0:5A::7C0
    - -
    Unicast
    -
    er kommunikasjon mellom en enkelt avsender og en enkelt mottaker over et nettverk (en-til-en forbindelse). - Hvis noen enheter må sende en melding til flere enheter, må den sende flere unicast-meldinger, - hver melding adressert til en bestemt enhet. Så må avsenderen sende en egen melding til hver destinasjonsenhet, - og for å gjøre det må den eksakte IP-adressen til hver destinasjonsenhet vite. -
    - -
    Anycast
    -
    Er støttet kun i IPv6 og ikke IPv4 (men IPv4 har en workaround)
    -
    Anycast er en nettverksadressering og rutemetode. En pakke med en anycast adresse blir sendt til en - destinasjon. Destinasjons velges ut fra om den er nærmest, lavest kostnad, sunnest, minst overbelastet - eller en annen type avstands måling. Anycast adresse kan brukes der det er (for) mye trafikk til et - nettsted, slik at datatrafikken må deles over flere maskiner. Der hvor en maskin ikke vil klare å - behandle all trafikk.
    -
    -
    -
    IPv4 anycast workaround
    -
    Kan i mange tilfeller gjøres vha. BGP. Flere verter (vanligvis i forskjellige - geografiske områder) får samme unicast IP-adresse, og forskjellige ruter til adressen blir annonsert - gjennom BGP. Rutere anser disse for å være alternative ruter til samme destinasjon, selv om de - faktisk er ruter til forskjellige destinasjoner med samme adresse. Som vanlig velger rutere en rute - basert på hvilken avstandsmål som er i bruk (minst kostnad, minst overbelastet, kortest). Å velge en - rute i dette oppsettet, vil være det samme som å velge en destinasjon.
    - -
    Multicast
    -
    Ved multicast gir man jobben med å sende til flere mottagere, til routerne. Selve kilden sender - bare en datastrøm, til en multicast en gruppe IP-adresse. Alle som vil motta denne datastrømmen, - melder seg på denne multicast gruppen. Alle routere som er med, som har en host i enden, som skal ha - denne datastrømmen, vil dele pakkene, og sende like pakker ut i alle retninger hvor det er en host som - skal ha datastrømmen.
    - -
    Broadcast
    -
    går ut på at en pakke sendes til alle enheter på et bestemt nettverk. - Destinasjonsadressen i pakken er den spesielle sendingsadressen. Hvis pakken har en broadcastadresse, - vil alle enheter som mottar denne meldingen behandle den. Så alle enhetene i samme nettverkssegment - vil se samme melding. En annen ting å huske er at ruterne ikke videresender broadcastmeldinger. - Ruteren vil motta sendetrafikken, men den vil ikke videresende den via ruteren.
    - -
    Netmask kalkulasjon
    -
    Man teller antall 1-ere i binærformen...
    -
    255.255.255.255 = 11111111.11111111.11111111.11111111 = /32
    -
    255.255.255.128 = 11111111.11111111.11111111.10000000 = /25
    - -
    NAT
    -
    Network Address Translator (NAT) brukes for å oversette IP-adresser mellom forskjellige - nettverk. Den kan være implementert i en ruter eller firewall maskin, som gjør det mulig å - ha mange PC’er med hver sin «private» IP-adresse på den ene siden, og kun en IPadresse - på den siden som er ut mot Internet. På den måten kan man ha mange host på - et LAN, med hver sin «private» IP adresse. Alle PC’ene på dette LAN kan være på - Internet samtidig, mens Internet ser bare en IP adresse fra alle sammen. Det er NAT som - oversetter adressene fra hjemme nettverket (LAN) til Internet.
    -
    Virkemåten: Hvis for eksempel en PC som er på hjemme nettverket sender en forespørsel om en webside - ut på nettet, vil forespørselen gå først til enheten som har NAT, som sitter imellom - hjemmenettet og Internet. NAT-enheten bytter ut PC’ens «private» IP adresse med - adressen som er på Internetsiden. Pakka får også et nytt fra-portnummer. NAT-enheten - lagrer alt i en NAT tabell, IP-adressen og portnummeret fra PC’en, og portnummeret på - sendingen ut. Når websiden kommer inn fra Internet, ser NAT hvor den skal sendes på - hjemmenettet ved å se i NAT-tabellen. Bla. ser den på postnummeret som kommer inn, - og hvilken portnummer den pakka skal ha når den går inn på hjemmenettet, og hvilken IPnummer - den skal til.. - Den bytter altså også ut IP-adressen på den innkomne pakka til IP adressen til PC’en på hjemmenettet. - «Private» IP adresser er adresser som ikke synes ut på internett. De er kun bakenfor en NAT. -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    s4. IdleRQ
    -
    Stopp-og-vent overføring. Sender en pakke ad gangen. Venter på svar (ACK/NACK), før neste pakke sendes. - Om den får ACK sender den neste pakke, om den får NACK eller intet svar sender den pakken på nytt. -
    - -
    Continuous/Pipline RQ
    -
    Kontinuerlig overføring. Flere pakker sendes av gangen. Sendevindu må kunne inneholde alle pakker som er send, uten at svar er kommet. - Ved feil i en pakke vil den sendes på nytt. To måter denne retransmisjonen kan foregå på: -
    - -
    -
    1 SR:
    -
    Selektiv Retransmisjon: Bare den pakken det er feil i sendes på nytt. Medfører at - pakkene ikke kommer i riktig nummerrekkefølge. Da må mottaker ordne pakkene i riktig rekkefølge - før de sendes til laget over. -
    - -
    2 Go-back-N (GBN):
    -
    Alle pakker kommer alltid i riktig nummerrekkefølge. Ved feil i en pakke vil den sendes på nytt, - samt alle etterfølgende pakker, selv om de var overført riktig forrige gang. Mottaker trenger - dermed ikke å ordne pakkene i riktig rekkefølge. Effektiviteten blir dårligere med bruk av GBN ift SR. -
    - -
    Om GBN eller SR skal brukes avtales det mellom sender og mottaker i oppkoblingssekvensen før dataene sendes. -
    -
    - -
    IPv4 adresse klasser
    -
    Andressene i IPv4 ble fra starten av (Internet) delt inn i klasser. Klasse A, B og C ble brukt til å kunne - gi en adresse til en host. Klasse D ble avsatt til multicast adresser.
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Class1st Ocet Decimal Range1st Ocet High order bitsNetwork / Host IDDefault subnet maskNumber of networksHosts per network
    A1-126*0N.H.H.H255.0.0.0126 (27-2)16,777,214 (224-2)
    B128-19110N.N.H.H255.255.0.016,382 (214-2)65,534 (216-2)
    C192-223110N.N.N.H255.255.255.02,097,150(221-2)254 (28-2)
    D224-2391110ReservedforMulticasting
    E240-2541111Usedforresearch
    -

    Hovedforskjellen mellom klasse A, B og C er hvor grensen mellom nattdel og hostdel er. Nå ble det - vanlig å dele et LAN (nett) opp i flere subnett. Da kunne men ikke vite hvor grensen mellom nettdel - og hostdel gikk, basert på klassen. Det var nettmasken som fortalte hvor grensen mellom nett og - host gikk. Derfor gikk man mer bort fra klasse-begrepet, og gikk over til CIDR (Classless Inter-Domain - Routing). Her ble det også innført den andre måten å angi masken på. Rett og slett skrive antall 1’ere - i masken som et tall. F.eks /24, i stedet for 255.255.255.00

    -

    Loopback adresse: 127.0.0.1 vil peke tilbake på «deg selv». Hvis du f.eks har - både en webbrowser og webserver på samme PC, og ønsker å teste webserveren vha browseren, uten at du har fått - tildelt en eget IP adresse, kan du bruke loopback adressen.

    -

    Private IP adresser er ikke synlige på internet, de er bare synlig på det LAN hvor de brukes. - Du kan fritt bruke disse på ditt private LAN. Du kan da ha veldig mange host på ditt LAN. For å komme ut på - internet, fra en slik privat IP adresse, må det brukes en router med NAT (Network Address - Translation). NAT oversetter fra en privat IP adresse til en IP adresse som er på internet. - Private IP Adresser: Klasse A: 10.0.0.0 - 10.255.255.255, - B: 172.16.0.0 - 172.31.255.255, C: 192.168.0.0 - 192.168.255.255

    - -
    -
    IPv4
    -
    IP adressene er herakisk oppbyggd, slik at det er mulig å finne veien til en PC/host som er tilkoblet - Internet. Det er kun en host på Internet som til enhver tid har denne IPv4 adressen. IPv4 adressen er totalt - 32 bit lang, dvs 4 byte. Den er delt i en nettdel og hostdel. Hvert LAN har en egen IPv4 nettadresse. IP-adressen til et LAN har bare 0'ere i - host. Broadcastadressen til et LAN har bare 1'ere i host og går ut til alle på LANet. To LAN kan ikke ha - samme IP eller broadcast.
    - -
    IPv6
    -
    Form: 128 bits, 32 hex, 16 bytes. Full størrelse er 8 blokker (på 2 byte / 4 hex hver). - Tabell under. Ops: utilstrekkelig definisjon av site-local adresser førte til forvirring og rot. - Denne blokken med adresser ble derfor foreldet og erstattet av ULA.
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    IPv4IPv6
    Adresse lengde32 bits128 bits
    Header lengde20 bytes40 bytes
    Bytes for hver adresse i header4 bytes16 bytes
    Adresse presentasjonDesimalHexadesimal
    Internet adresse klasserA, B, C, D, EIngen ekvivalent, men har tre typer. (uni, multi, anycast)
    Multicast adresse224.0.0.0/4FF00::/8
    Broadcast adresserSe IPv4 infoBrukes ikke
    Uspesifisert adresse0.0.0.0::
    Loopback adresse127.0.0.1::1
    Public IPerSe IPv4 infoGlobal unicast adresser
    Private IP adresserSe IPv4 infoSite-local: FEC0::/10, - unique local FC00::/7
    Autoconfigurasjons adresser169.254.0.0/16Link-local FE80::/64
    - -
    -
    Portnummer (destination og source)
    -
    Portnummer er veien inn til en applikasjon på laget over. Hver applikasjon har sitt eget portnummer. Man kan - sammenligne det med nummeret som står på døra inn til applikasjonen. Når en host (klient) f.eks. skal hente en - webside fra en webserver, vil den sette Dest Port 80 på pakken som forespør om websiden. Da vil webserver - applikasjonen ta i mot datapakka. Dest port # betyr altså at det er portnummeret på applikasjonen som pakken - skal til. Klienten vil også si ifra hvilken port nummer den vil ha svaret på. Det blir Source Port nummer. - Klienten velger blant de ledige portnumrene. Når webserveren sender websiden tilbake til klienten, vil den sette - Dest Port nummer på den pakka, til det Source Port nummeret som klienten ville ha svaret på.
    - -
    Forskjellen på asynkron og synkron dataoverføring
    -
    Synkronisering betyr at sender og mottager synkroniserer seg slik at databitene tas imot riktig, dvs at - for eksempel databit 0 blir tatt imot som databit 0, og databit 1 som databit 1 osv..
    - -
    Asynkron
    -
    Her foregår synkroniseringen for hver byte. Det sendes en startbit før databitene sendes. En forbindelse - hvor det ikke går data, er på logisk 1. Startbiten er logisk 0, og det er den som mottageren synkroniserer seg - på. Det gjøres ved at mottageren punktprøver det mottatte signal med en høyere (16x eller 64x) frekvens enn - dataene. Med en gang det oppdages en logisk 0, starter mottageren. En ny punktprøve blir tatt en halv bitlengde - senere, slik at midten i av 13 startbiten blir prøvet. Hvis det (fortsatt) er logisk 0, er mottageren sikker - på at det er startbiten. De kommende 7 eller 8 bit blir punktprøvet mitt i biten, og plassert i riktig - bitposisjon i mottageren (USART). Når siste bit er lest, forventer mottageren en (eller 2) stoppbit, som er - logisk 1. Når stoppbiten er mottatt, begynner mottageren å lete etter neste startbit, slik at den kan - synkronisere seg på den neste byten. En ulempe er at man må sende 2 bit ekstra per byte, som påvirker - hastigheten
    - -
    Synkron
    -
    Ved synkron dataoverføring foregår synkroniseringen i starten av hver blokk. Når synkronisering først er - oppnådd, er det ingen synkronisering igjen før neste blokk. Det er da viktig at senderklokka og mottagerklokka - er eksakt like, derfor overføres senderklokka i sammen med dataene. Det gjøres ved å kode inn klokkesignalet i - datastrømmen. På mottagersiden blir dette klokkesignalet dekodet ut av datastrømmen, og brukes til å klokke - inn dataene. På den måten blir mottagerklokka og senderklokka eksakt like. Synkroniseringen kan foregå på to - måter: bytesynkronisering og bitsynkronisering.
    -
    -
    -
    -
    -
    -

    Utregnings greier

    -
    -
    P_i\ (innkoblet\ effekt)
    -
    Benevning [dBm]
    - -
    P_{f}\ (fiber)
    -
    \dfrac{demping\ [dB]\ per\ [km]}{lengde\ [km]} \cdot lengde\ [km] - Benevning [dB]. Se attenuation i datablad
    - -
    P_{s}\ (skjøt)
    -
    = antall\ skjøt \cdot \dfrac{[dB]}{skjøt} \qquad Benevning [dB]
    - -
    P_{k}\ (kontakt)
    -
    = antall\ kontakter \cdot \dfrac{[dB]}{kontakt} \qquad Benevning [dB]
    - -
    P_{sy}\ (system)
    -
    Systemmargin. Benevning [dB] Om ikke oppgitt: er det mellom 3-7. Regn ut med begge.
    - -
    P_{m}
    -
    Demping (eller følsomhet) til mottaker. Benevning [dBm]
    - -
    P_{n} (nnk.m)
    -
    Innkoblingstap ved mottaker. Benevning [dB]
    - -
    Maksimal datahastighet:
    -
    Om det ikke står noe ang. koding, ganger man med 2 (ukodet). Når man har Manchester kode ganger man med 1. - Regner først ut båndbredde, får et svar i Hz og deretter finner man bithastighet ved å gange. -
    -
    Eks: 19 MHz
    -
    Manchester kode: 19 MHz x 1 = 19 Mbit/s
    -
    Ukodet: 19 MHz x 2 = 38 Mbit/s
    -
    Andre koder ligger mellom 1 og 2. (har man Mbit deler man i steden)
    - -
    Effekt og båndbreddeberegning
    -
    Maksimal avstand er gitt av; enten effektbegrensning eller båndbreddebegrensning. Hvis - det er utstrålt effekt som er oppgitt for sender, og ikke innkoblet effekt, må man ha med innkoblingstapet for - senderen
    - -
    Båndbreddeberegning (dimensjonering av fiber)
    -
    Fra [Gbit/s] til [GHz] -> 10 (Gbit/s) / 2 = 5GHz
    -

    \tau = \dfrac{0,44}{5 \cdot 10^9[s]} = spektralbåndbredde \cdot dispersjon \cdot kabellengde

    -
    -

    \tau = 1,5 [nm] \cdot 2,7[\dfrac{ps}{nm \cdot km}] \cdot x [km]

    -

    \tau = 4,05 [nm] \cdot 10^{-12} \cdot x [km]

    -
    -
    -

    \dfrac{\tau}{4,05 [nm] \cdot 10^{-12}} = \dfrac{4,05 [nm] \cdot 10^{-12}}{4,05 [nm] \cdot 10^{-12}} \cdot x

    -

    x = \dfrac{\tau}{4,05 [nm] \cdot 10^{-12}}

    -

    \underline{\underline{x = 21,7 [km]}}

    -
    -
    -

    Man finner dispersjonen i dataark

    -
    - -

    Hvor mange bit er det i FCS, når polynomet G(x)= x^8+x^5+x^4+1?

    -

    Dette polynomet brukes til å regne ut hva som skal være i FCS i datapakka. Se - ellers beskrivelsen i oppgave 1.

    - - -

    Hva vil det si at en protokoll bruker polynomet G(x)= x^8+x^5+x^4+1?

    -

    Antall bit i FCS bestemmes av den høyeste potensen i polynoment. Her er det 8, dvs det er 8 bit FCS

    - - -

    Beskriv kort de forskjellige typer fiber. Ta med oppbyggingen, lysgangen og - (de mest sentrale) spesifikasjonene.

    -

    Det finnes to hovedtyper fiber kabel: Multimodus (MM) og Singlemodus (SM). MM - fiber finnes også i to typer, det er Gradert indeks (GI) og Step indeks (SI) fiber. Du finner - ofte ikke info i databladet om MM-fiberen er SI eller GI. Det er fordi det (nesten) bare - produseres GI fiber, av disse MM fibrene. GI fiber har nemlig mye større båndbredde enn - en SI fiber. Det er fordi dispersjonen er litt mindre i en GI fiber i forhold til en SI fiber

    -

    Størrelsen på kjernediameteren, altså kjernen i fiberkabelen, der lyset går, bestemmer om - det er en SM fiber eller MM fiber. Kjernediameteren må være liten, i størrelsesorden - 9 µm, for at den skal kunne være SM. I en SM fiber er det bare plass til en lysstråle, noe - som medfører at det ikke er modedispersjon i en SM fiber. Det er kun kromatisk - dispersjon, som i hovedsak skyldes at brytningsindeksen er litt forskjellig for de - forskjellige bølgelengdene på lyset. Lyshastigheten er gitt av brytningsindeksen, og da vil - lyshastigheten være litt forskjellig for de forskjellige bølgelengdene.

    -

    I en MM fiber er det dispersjon pga de forskjellige lysstrålene går forskjellig - veistrekning. Det kalles modedispersjon. De som går lengst vei, kommer senest fram. I en - GI fiber er lyshastigheten på de lysstrålene som går lengst vei litt større, som medfører at - dispersjonen er litt mindre enn i en SI fiber, hvor lyshastigheten er lik for alle lysstrålene. - En fiberkabel har også en Numerisk Aperture (NA), som er sinus til den største vinkelen - lyset inn på kjernen kan ha, for at lyset skal kunne sendes videre i kjernen. Dvs at det blir - totalrefleksjon mellom kjerne og kappe.

    - - -

    Hva er båndbredden på en fiberoptisk forbindelse på 5 km, når - båndbredden på fiberen er 10 [MHz*km] ?

    -

    Båndbredden B på en 5 km fiberforbindelsen, ved bruk av en fiber med 10 - MHz*km, er: B = 10/5 MHz = 2 MHz

    -
    -
    -

    Bør du velge en fiber med høy eller lav NA, hvis du ønsker å få mest mulig lys - inn i fiberen, altså ha minst mulig innkoblingstap. Forklar hvorfor.

    -

    Man bør velge en fiber med høyest mulig NA hvis man ønsker minst mulig innkoblingstap - i fiberen. NA er definert som sinus til den største vinkelen en lysstråle kan ha inn på - fiberen, for å bli ført videre i kjernen. Jo større NA, jo større vinkel.

    -

    Hvis man bruker en LED som lyskilde, stråler den ut lys i alle retninger. Hvor mye av dette - som faktisk blir koblet inn i fiberen, er avhengig av (bl.a.) NA. Ved bruk av fiber med høy - NA vil også de lysstålene med stor vinkel bli koblet inn i fiberen. Med bruk av lav NA ville - disse lysstrålene bli tapt. Dette regnes da med i innkoblingstapet, slik at innkoblingstapet - blir da større.

    - - -

    Bør du velge en fiber med høy eller lav NA, hvis du ønsker å ha høyest - båndbredde på fiberen. Forklar hvorfor.

    -

    Man bør velge en fiber med lavest mulig NA, hvis man ønsker fiber med høyest mulig - båndbredde. - Båndbredden på en multimodus fiber er gitt av modedispersjonen. Modedispersjonen - skyldes at de forskjellige lysstrålene (modene) går forskjellig vei (og lengde) i fiberen, og - kommer dermed fram til forskjellige tidspunkt. Maksimal forskjell i lengde er det mellom - den strålen som går rett fram, og den som har maksimal vinkel i forhold til retningen fram i - fiberen. Den prosentvise forskjellen i lengde er større i en fiber med høy NA, enn en med - lav NA. Jo større prosentvis forskjell det er i lengde, desto større tidsforskjell, dvs større - modedispersjon, som igjen gir mindre båndbredde.

    - - -

    Hva er båndbredden på en fiberoptisk forbindelse på 5 km, når båndbredden - på fiberen er 10 [MHz*km] ?

    -

    Båndbredden B på en 5 km fiberforbindelsen, ved bruk av en fiber med 10 MHz*km, er: - B = 10/5 MHz

    - - -

    Hva blir båndbredden på en fiberoptisk forbindelse, når den totale - dispersjonen er på 10 [ns] ?

    -

    Forholdet mellom dispersjon \tau, og båndbredde B er gitt av formelen: B = 0,44/\tau

    -

    Ved en dispersjon på 10[ns] (= 10 \cdot 10^{-9}[s] = 10^{-8}[s], får vi en båndbredde på:

    -

    B=0,44/10^{-8} = 0,44 \cdot 10^8 Hz = 44 MHz

    -
    -
    -
    -
    -

    Du har en fiberoptisk forbindelse som er 35 km lang. Der brukes det en - singlemode fiber (SM) med en dispersjon på 5 [ps/(nm·km)], og en laser med - en spektral båndbredde på 2 [nm]. Hva blir båndbredden på den - forbindelsen?

    -

    Båndbredden er gitt av den kromatiske dispersjonen i SM-fiberen, lengden på fiberen og - den spektrale båndbredde på lyskilden:

    -

    B = 0,44/\tau = 0,44/ (35 \cdot 2 \cdot 5)ps = 0,44/0,35 ns = 1,26 GHz

    - - -

    Du har et fiberoptisk anlegg der senderen har en innkoblet effekt på -10,0 dBm, - mottageren har en følsomhet på -37,0 dBm, fiberen har en dempning på 2,5 - dB/km, lengden er på 2,0 km hvor det er to skjøter med en dempning på 0,1 dB - (hver), og det er to kontakter med en dempning på 1,0 dB (hver). Kontaktene - er montert på selve fiberkabelen. Hva blir systemmarginen?

    -

    Systemmarginen kan man finne ved å sette opp effektbudsjettet.

    -
    - P_i - P_{f} - P_{s} - P_{k} - P_{sy} - = P_m - 10 - 5 - 0,2 - 2 - P_{sy} - = -37 -
    -
    - P_{sy} = 37 - 17,2 = 19,8 [dB] -
    - - -

    Du skal dimensjonere et fiberoptisk anlegg. Fiberkabel: 50/125 µm, med 50MHz*km båndbredde. - Dempningen i 1.vindu 3,0 dB/km. Fiberkabelen kabelen skjøtes per 1 km (fordi den levers i lengder på 1 km). - Skjøtetapet: 0,2 dB. Fra senderen og mottageren går det en fiberstump til en kontakt. En kontakt i hver ende. - Kontaktapet på 1,0 dB. Kontaktene kan bli "møkkete". - Krav: anlegget skal kunne akseptere et tap på opp til - 3,0 dB per kontakt. Systemarginen bør være 5 dB.

    - -

    a) Hvilken følsomhet må mottageren ha, når senderen har en innkoblet effekt på -18 dBm, og fiberkabelen er 10 km lang ?

    -

    Dette kan finnes ved å sette opp effektbudsjet. - I oppsettet er det ikke gitt noe data for innkoblingstapet ved mottageren. Den kan - settes til 1,0 dB. - Vi får da:

    -
    - P_i - P_{f} - P_{s} - P_{n} - P_{sy} - = P_m - 18 - 30 - 1,8 - 6 - 1 - 5 - = P_m -
    -
    - P_m = - 61,8 [dBm] -
    -

    Mottageren må ha en følsomhet på bedre enn –61,8 dBm.

    - -

    b) Hvis du har en sender på -18 dBm og en mottager med følsomhet på -50,0 - dBm, - hvor lang fiberkabel kan du da ha ?

    -

    Hvis følsomheten til mottageren hadde vært på –50,0 dBm kunne vi hatt en fiberkabel - på maks X km:

    -
    - P_i - P_{f} - P_{s} - P_{k} - P_{n} - P_{sy} - = P_m - 18 - 30 X - 0,2 X - 6 - 1 - 5 - = -50 -
    -
    - X \cdot 3,2 = 50 - 18 -12 = 20 -
    -
    - X = 20 / 3,2 = 6,25 -
    -

    Ved en lengde på 6,25 km får vi

    -
    - P_i - P_{f} - P_{s} - P_{k} - P_{n} - P_{sy} - = P_m - 18 - 6,25 \cdot 30 - 6 \cdot 0,2 - 6 - 1 - P_{sy} -
    -
    - = -50 -
    -
    - P_{sy} = 50 - 18 - 18,75 - 1,2 - 7 - = 5,05 [dB] -
    - i systemmargin -

    Lengden på fiberkabelen kan være 6,25 km

    - -

    c) Hva er maksimal datahastighet på datasignalet i de to tilfellene ?

    -

    Da ikke annet er oppgitt er maksimal datahastighet lik det dobbelte av båndbredden. - Vi tar utgangspunkt i fiberkabelens data på 50 MHz*km :

    -

    Da fiberkabelen er 10Km blir maks datahastighet D, lik: - D = 2*B = (2*50 / 10) Mbit/s = 10 Mbit/s

    -

    Da fiberkabelen er 6,25Km blir maks datahastighet D, lik: - D = 2*B = (2*50 / 6,25) Mbit/s = 16 Mbit/s

    - -
    -
    Multipleksing/demultipleksing
    -
    Multipleksing betyr at flere blir mikset sammen til en. I demultipleksing blir disse flere skilt ut fra - denne ene. Det finnes mange type multipleksing. På lag 4 brukes det i forbindelse med at data fra forskjellige - applikasjoner blandes sammen til en datastrøm ned til IP laget, altså lag 3. Dette gjøres ved hjelp av - portnummer. Hver applikasjon har sine portnummer. Dette portnummeret følger med dataene fra applikasjonen. - Portnummer legges i lag 4 hodet på datapakka. -
    - -
    Baud
    -
    Er bestemt av tiden mellom hver skifting, eller transisjon på linjesignalet. F.eks tiden mellom hvert - faseskift, ved PSK. Hvis vi sier denne tiden er tb, er Baud = 1/tb Hvis det er flere forskjellige faser som - det skiftes mellom, kan hver skift overføre flere bit. Hvis f.eks det er 8 faser, vil det gi 3 bit per - faseskift. Da blir datahastigheten 3 ganger større enn Baud.
    - -
    FSM (Finite-state machine)
    -
    er en standardisert metode som brukes for å forklare "virkemåten" til en protokoll. "Virkemåten": selve - oveføringen; retransmisjon, timeout, NACK, ACK, data som skal sendes.
    - -
    RDT X (X er et nummer)
    -
    Reliable Data Transfer: Inneholder en beskrivelse av "hvor dårlig kanalen er", hvilke feilsituasjoner kan - oppstå som protokollen kan løse. F.eks. feilfri(overføring), bitfeil i enkelte pakker, bitfeil der hele pakker - blir borte.
    - -
    QAM
    -
    Fase og amplitude forandres. Hvis man f.eks. har 16 punkter, kan man overføre 4 bit per faseskift. - Bithastigheten blir større jo flere x antall QAM punkter det er u polardiagrammet ift. Baud. Støy begrenser - antall punkt. Mye støy medfører lavere bithastighet.
    - -
    Tracert
    -
    Sender ut en serie med ICMP pakker, hvor TTL feltet i IP hodet blir satt til en bestemt verdi. I hvert - hopp, altså i hver ruter på veien, blir TTL minsket med 1. Den ruteren som gjør at TTL=0, vil ikke sende ICMP - pakken videre, men i stedet sende en ICMP pakke tilbake til avsender, med info om hvor TTL=0, dvs hvor pakken - stoppet. Denne info er altså IP adressen til ruteren. Tracert setter først TTL = 1. Da vil den første ruteren - gjøre at TTL=0, og den vil sende ICMP-pakke med IP nummeret til der hvor pakken stoppet, som nå er i den - første ruteren. Neste gang sendes en ICMP pakke med TTL=2, Da vil den andre ruteren på veien stoppe pakken, - og sende info tilbake til senderen. Slik fortsetter det helt til siste hopp er til mottageren. – Så tracert - får tak i denne info ved å sende pakker hvor TTL starter på 1 og øker med 1 for hver gang.
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    10^nPrefiksSymbolNavn
    10^{15}petaPbilliard1 000 000 000 000 000
    10^{12}teraTbillion1 000 000 000 000
    10^{9}gigaGmilliard1 000 000 000
    10^{6}megaMmillion1 000 000
    10^{3}kiloktusen1 000
    10^{2}hektohhundre100
    10^{1}dekadati10
    10^{-1}desidtidel0,1
    10^{-2}centichundredel0,01
    10^{-3}millimtusendel0,001
    10^{-6}mikro\mumilliondel0,000 001
    10^{-9}nanonmilliarddel0,000 000 001
    10^{-12}picopbillionddel0,000 000 000 001
    -
    -
    -
    - - \ No newline at end of file diff --git a/dist/_/skole/hio/2017/eksamensark/explanation.html b/dist/_/skole/hio/2017/eksamensark/explanation.html deleted file mode 100644 index 29dd4df..0000000 --- a/dist/_/skole/hio/2017/eksamensark/explanation.html +++ /dev/null @@ -1,300 +0,0 @@ - - - - - - - Explanation - - - -
    -
    -
    -

    Overskrift 1

    -

    Overskrift 2

    -

    Overskrift 3

    -

    Overskrift 4

    -
    Overskrift 5
    -
    Overskrift 6
    - -
    -

    Lists

    - -
    ul
    -
      -
    • ul li 1
    • -
    • ul li 2
    • -
    • ul li 3
    • -
    - -
    ol
    -
      -
    1. ol li 1
    2. -
    3. ol li 2
    4. -
    5. ol li 3
    6. -
    - -
    ol/ul.inline
    -
      -
    • ul.inline li 1
    • -
    • ul.inline li 2
    • -
    • ul.inline li 3
    • -
    - -
    ol/ul.nostyle
    -
      -
    1. ol.nostyle li 1
    2. -
    3. ol.nostyle li 2
    4. -
    5. ol.nostyle li 3
    6. -
    - -
    QnA
    -
      -
    • -
        -
      • Lorem ipsum?
      • -
      • Lorem ipsum
      • -
      -
    • -
    • -
        -
      • Lorem ipsum?
      • -
      • Lorem ipsum
      • -
      -
    • -
    • -
        -
      • Lorem ipsum?
      • -
      • Lorem ipsum
      • -
      -
    • -
    • -
        -
      • Lorem ipsum?
      • -
      • Lorem ipsum
      • -
      -
    • -
    - -
    -

    Indentation

    - -
    i1
    -

    - Lorem ipsum dolor sit amet consectetur adipisicing elit. Asperiores - dolore, dicta iste dolorum nihil ullam dolor, fugit optio - reprehenderit, ab nisi odio expedita libero sequi illo officia vero! - Earum, omnis. -

    - -
    i2
    -

    - Lorem ipsum dolor sit amet consectetur adipisicing elit. Asperiores - dolore, dicta iste dolorum nihil ullam dolor, fugit optio - reprehenderit, ab nisi odio expedita libero sequi illo officia vero! - Earum, omnis. -

    - -
    i3
    -

    - Lorem ipsum dolor sit amet consectetur adipisicing elit. Asperiores - dolore, dicta iste dolorum nihil ullam dolor, fugit optio - reprehenderit, ab nisi odio expedita libero sequi illo officia vero! - Earum, omnis. -

    - -
    i4
    -

    - Lorem ipsum dolor sit amet consectetur adipisicing elit. Asperiores - dolore, dicta iste dolorum nihil ullam dolor, fugit optio - reprehenderit, ab nisi odio expedita libero sequi illo officia vero! - Earum, omnis. -

    - -
    i5
    -

    - Lorem ipsum dolor sit amet consectetur adipisicing elit. Asperiores - dolore, dicta iste dolorum nihil ullam dolor, fugit optio - reprehenderit, ab nisi odio expedita libero sequi illo officia vero! - Earum, omnis. -

    - -
    -

    Widths

    -

    Goes up to 10

    - -
    w1
    -

    Lorem ipsum dolor sit amet

    - -
    w2
    -

    Lorem ipsum dolor sit amet

    - -
    w3
    -

    Lorem ipsum dolor sit amet

    - -
    -

    Font sizes

    - -
    fss
    -

    Lorem ipsum dolor sit amet

    - -
    fsm
    -

    Lorem ipsum dolor sit amet

    - -
    fsl
    -

    Lorem ipsum dolor sit amet

    - -
    -
    -
    - -

    Borders

    -
    -
    bt
    -

    Lorem ipsum dolor sit amet

    -
    -
    br
    -

    Lorem ipsum dolor sit amet

    -
    -
    bb
    -

    Lorem ipsum dolor sit amet

    -
    -
    bl
    -

    Lorem ipsum dolor sit amet

    - -
    -
    -
    -
    -
    -
    -
    Pre
    -
    -Usage: tr [OPTION]... SET1 [SET2]
    -Translate, squeeze, and/or delete characters from standard input,
    -writing to standard output.
    -
    -  -c, -C, --complement    use the complement of SET1
    -  -d, --delete            delete characters in SET1, do not translate
    -  -s, --squeeze-repeats   replace each sequence of a repeated character
    -                            that is listed in the last specified SET,
    -                            with a single occurrence of that character
    -  -t, --truncate-set1     first truncate SET1 to length of SET2
    -      --help     display this help and exit
    -      --version  output version information and exit
    -
    -SETs are specified as strings of characters.  Most represent themselves.
    -Interpreted sequences are:
    -
    -  \NNN            character with octal value NNN (1 to 3 octal digits)
    -  \\              backslash
    -...
    -
    - -
    -
    -
    Code
    -

    Lorem Hello World ipsum

    - -
    -
    -
    Table:
    - - - - - - - - - - - - - - - - - - -
    Ordnet utvalgUordnet utvalg
    Med tilbakelegging -

    n^t

    -
    -

    - \dfrac{(n+k-1)!}{(n-1)!k!} -

    -
    Uten tilbakeleggning -

    - \underbrace{P(n,k) = \dfrac{n!}{(n-k)!}}_\text{utvalg til - styre} -

    -
    -

    - \underbrace{\binom{n}{t} = C(n,k) = - \dfrac{n!}{(n-k)!k!}}_\text{lotto, komite} -

    -
    -
    -
    -
    -

    Section 3

    -
    -
    -
    -
    -

    Page 2 - Section 1

    -
    -
    -

    Page 2 - Section 2

    -
    -
    -

    Page 2 - Section 3

    -
    -
    -
    -
    -

    Page 3 - Section 1

    -
    -
    -

    Page 3 - Section 2

    -
    -
    -

    Page 3 - Section 3

    -
    -
    -
    -
    -

    Page 4 - Section 1

    -
    -
    -

    Page 4 - Section 2

    -
    -
    -

    Page 4 - Section 3

    -
    -
    - - - - - - - diff --git a/dist/_/skole/hio/2017/eksamensark/index.html b/dist/_/skole/hio/2017/eksamensark/index.html deleted file mode 100644 index 0c4299c..0000000 --- a/dist/_/skole/hio/2017/eksamensark/index.html +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - Template - - - - - -
    -
    -




    -

    Eksamensark

    -


    -
    -


    - -

    2017

    -
    - - -


    -

    2018

    -
    - -
    -
    - - diff --git a/dist/_/skole/hio/2017/eksamensark/industriell-it.html b/dist/_/skole/hio/2017/eksamensark/industriell-it.html deleted file mode 100644 index 3db8c89..0000000 --- a/dist/_/skole/hio/2017/eksamensark/industriell-it.html +++ /dev/null @@ -1,2278 +0,0 @@ - - - - - - - Industriell IT - eksamensark - - - -
    -
    -
    -
    -
    -

    Obliger

    -

    Oblig 1 - Del A

    -

    Oppgave 1

    -

    - Lag en «egen»XOR port med AND og OR porter. Bruk Ladder (LD) - eller funksjonsblokker (FBD) for å løse oppgaven. Programmer - løsningen i Codesys med et egnet HMI. -

    - -

    Oppgave 2

    -

    - Lag et FBD-program i Codesys med et HMI for et enkelt lyskryss - som følger tidspunkter gitt nedenfor. Løs først nord-syd - NS-retningen. Bruk en bryter (start/stopp) for å starte stoppe - lyskrysset. -

    -
    -
    -

    opg1: Med ladder

    - -

    opg1: Med FBD

    - -
    -
    -

    opg1: HMI for alle

    - -

    opg1: Med strukturert tekst

    - -
    -
    - -
    -
    -

    - Test at det NS-retningen virker. Legg nå til øst-vest - ØV-retningen. - Trafikklyset skal skifte på følgende vis: -

    - -

    Tidsangivelse

    -

    NS-retningen

    -
      -
    • Rødt : 8 sek
    • -
    • Rød + Gul: 4 sek
    • -
    • Grønn: 8 sek
    • -
    • Gul: 4 sek
    • -
    -

    ØV-retningen

    -
      -
    • Grønn: 8 sek
    • -
    • Gul: 4 sek
    • -
    • Rød: 8 sek
    • -
    • Rød + Gul: 4 sek
    • -
    -

    HMI

    - - - -
    -
    - abc formel - x = \dfrac{-b \pm \sqrt{b^2-4 \cdot a \cdot c}}{2 \cdot - a} -
    -
    -
    - -
    - -
    -
    -

    Oppgave 3. (Fra eksamen 2011)

    -

    - En hermetikkfabrikk har en produksjonslinje for fiskeboller. Et - transportbånd frakter boksene som produseres til et pakkeanlegg. - En fotocelle som er montert ved transportbåndet registrerer hver - boks som passerer. Systemet er konstruert slik at når en boks - passerer fotocellen (bryter lyset), så gir den logisk 1 (sann). - Når lyset ikke er brutt gir den logisk 0 (falsk). Produserte - bokser samles opp i enden av transportbåndet, og når 5 bokser er - produsert skal de skyves ved hjelp av et stempel inn i esker. - Stempelet skyver boksene når det får logisk 1 (sann) som en kort - puls fra logisk 0 til 1 og tilbake til 0 igjen. -

    -

    - I tillegg benyttes en startbryter som gir logisk 1 (sann) når - den er trykket. Den returnerer til logisk 0 (falsk) når den - slippes, samt en tilsvarende stoppbryter som gir logisk 1 når - den er trykket, og logisk 0 (falsk) når den er urørt. - Transportbåndet vil gå når trans_b legges til - logisk 1 (sann), og vil stoppe når trans_b leggs - til logisk 0. Figur 4.1 viser en oversikt over inn – og utganger - som benyttes på PLS’en. -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    InngangUtgang
    Startbryterstart_br
    Stoppbryterstopp_br
    Fotocellefoto_c
    Stempelstempel
    Transportbåndtrans_b
    -
    - Figur 4.1 som viser hvordan inn- og utganger er navngitt i - PLS’en -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - Oppgave 3. Fortsetter Når startbryteren trykkes - (startsignal) skal transportbåndet starte. Når en fiskebolleboks - passeres fotocellen skal de telles med to tellere. Teller_1 skal - når den kommer til 5 starte stempelet som skyver boksene ut. - Samtidig skal telleren resettes, slik at den kan telle opp 5 nye - bokser. Teller_2 skal være en akkumulerende teller som teller - alle bokser som er produsert etter at startbryteren ble trykket. - Den skal ha en Preset Value på 10000. Når det er produsert 10000 - bokser skal teller_2 resettes. Når stoppbryteren blir trykket - skal transportbåndet stoppe, og teller_2 skal resettes -

    -
    - Løsning for oblig 1a oppgave 3 - Codesys logikk -
    - -
    -

    - Løsning Ettersom start- og stoppbryterne er - touch-brytere må vi sikre at verdiene holdes med en RS-vippe. - Benytter 2 timere. Resetter timere etter gitt krav. Ettersom både - stopp-knappen og når teller_2 har kommet til 10000 bokser kan - restte teller_2 så benytter vi en eller-blokk for disse. -

    - Løsning for oblig 1a oppgave 3 - HMS -
    -

    Oblig 1 - Del B

    -

    Oppgave 1A

    -

    - Tegn et blokkskjema for et generelt reguleringssystem. Forklar - kort hvilke blokker som inngår. Redegjør kort for hva som er - hovedoppgavene til et reguleringssystem. -

    -
    -
    - Figur. Blokker i et generelt reguleringssystem -
    - Figur. Blokker i et generelt reguleringssystem. -
    -
    -

    - Blokkene er forklart i kompendiet «Intro til reg_tek». Et - reguleringssystem kan ha flere hovedoppgaver - som; -

    -
      -
    • Holde utgangen mest mulig lik referansen.
    • -
    • Eliminerer innvirkning av forstyrelser
    • -
    • Holde reg.syetmet stabilt under ulike driftsforhold
    • -
    • Minst mulig påvirket av endringer i prosessparametre
    • -
    -
    -
    -
    -
    -

    - Oppgave 1B Du skal lage et system for - regulering av hastigheten på en bil. (Cruisekontroll). Forklar - hvilke komponenter/moduler du vil trenge for å lage et slikt - system. Tegn et blokkskjema som viser hvordan komponentene - inngår. Forklar kort begrepene: -

    -
      -
    • Avvik
    • -
    • Pådrag
    • -
    • Tilstand
    • -
    • Forstyrrelse
    • -
    -
    -
    -

    - Vi må lage et tilbakekoblet system med en - regulator som påvirker/regulerer hastigheten til bilen. Vil - trenge: Regulator, pådragsorgan som styrer bensin/diesel - innsprøytning, prosessen (bilen), måleelement som måler - hastigheten. Er det en elektrisk bil kan vi styre elmotorene - med kraftforsterkere -

    -
    -
    - -
    - Figur. Et typisk tilbakekoblet system. -
    -
    -
      -
    • - Avvik: Differensen mellom ønsket verdi og - målt verdi. Angis med: e(t) -
    • -
    • - Pådrag: utgangen fra regulatoren som skal - drive prosessen i riktig retning. Angis med: u(t) -
    • -
    • - Tilstand: En karakteristisk størrelse som - beskriver prosessen. F.eks temperaturen i et rom. Kalles - også prosessvariabel. x(t) -
    • -
    • - Forstyrrelse: utilsiktet påvirkning som - vi ikke har ”styring” på. F.eks en motbakke når vi kjører - bil. -
    • -
    -
    -
    -
    -
    - -
    -

    - - Oppgave 1C Hvorfor benyttes pådragsorganer i en - reguleringssløyfe? Nevn noen typiske pådragsorganer? - - - - Pådragsorgan benyttes for å forsterke opp pådragssignalet fra - regulatoren. En regulator gir kun ut svake signaler som f.eks 4 - -> 20mA. Et slikt signal må forsterkes for å kunne gi noe effekt - på en prosess. Typiske pådragsorgan; ventiler, - elektriske forsterkere, motorer, pumper. - - Typisk signalverdier i reguleringssløyfe: - 4-20mA, 0–10Volt, 1-5Volt, 3-15PSI - -

    -
    - -
    -
    -

    - Oppgave 1E Du skal lage et system som overvåker - en pasient på et sykehus (eller hjemme for den saks skyld). Hva - slags type «informasjon» kan det være interessant å - måle/overvåke? -

    -

    - Her er det mange «tilstander» som kan være interessant å - måle/overvåke: På selve pasienten: Puls, blodtrykk, hjerterytme, - oksygen i blodet, blodsukker, kroppstemperatur, fuktighet... - (Andre parametere kan være kolesterol, blodprosent, samt - x-antall andre parametere som kan måles via blodprøver). Andre - tilstander kan være bevegelse, fall, i hvilket rom man er, - lysforhold, lyd, temperatur, ... -

    - -

    - Oppgave 4 Gitt følgende integral: - y = \int_{a}^{b} f(x) dx - f(x) = 30x^3 - 8x^2 + 4x + 10 - Beregn selv hva det korrekte svaret er når: - a=0 \quad b=3 -

    -
    - -
    -
    -
    -
    -
    -
    -

    Oppgave 6

    -

    - Et system kan beskrives med følgende differensialligning; - 20\dot{x} + 10x = f(t) -

    -

    - f(t) = inngang - x(t) = utgang Finn transferfunksjonen - som beskriver systemet gitt i ligning 1. Forklar kort hva en - transferfunksjon uttrykker/beskriver (på generell basis). Anta at - f(t) er et enhetssprang ved t=0. -

    -

    - Finner transferfunksjonen ved å benytte Laplace på hvert ledd. - 20s \cdot X(s) + 10X(s) = F(s) - (20 + 10s)X(s) = F(s) - \dfrac{X(s)}{F(s)} = H(s) = \dfrac{1}{20s + 10} = - \dfrac{0.1}{2s + 1} -

    -

    - Vi har nå funnet transferfunksjonen som beskriver systemet. En - transferfunksjon er en beskrivelse av et system - (modell) i s-plan. Beskriver sammenhengen mellom inngang og utgang - i systemet. - f(t) - enhetssprang \rightarrow F(s) = 1/s - X(s) = H(s) \cdot F(s) = \dfrac{0.1}{s(2s + 1)} -

    -

    - Invers Laplace gir; - x(t) = 0.1(1-e^{-0.5t}) -

    - -

    Oppgave 7

    -

    - Gitt at du har en differensialligning som - beskrevet nedenfor der y(t) er utgangen og x(t) er inngangen. Hva - blir transferfunksjonen til dette systemet? - \ddot{y}(t) + 4\dot{y}(t) + 3y(t) = x(t) - Hva blir Y(s) gitt at x(t) er et enhets-sprang? -

    -

    - Må Laplacetransformere ledd for ledd. - Initialtilstander settes lik 0. Vi får da: - - s^2 \cdot Y(s) + 4s \cdot Y(s) + 3Y(s) = X(s) - - Y(s) \cdot (s^2 + 4s + 3) = X(s) - - \dfrac{Y(s)}{X(s)} = H(s) = \dfrac{1}{s^2 + 4s + 3} - -

    -

    - X(s) skal være et enhetssprang - \rightarrow X(s) = 1/s -

    -

    - Finner da: - - Y(s) = H(s) \cdot X(s) = \dfrac{1}{s(s+3)(s+1)} - -

    -

    - Vi finner y(t) ved å ta invers Laplace - av uttrykket Y(s). -

    -

    Oppgave 9

    -

    - Et fjæringssystem på en bil har følgende transferfunksjon; - H(s) = \dfrac{10}{s^2 + 0.8s + 4} -

    -

    - A. Beregn hva systemets poler er. Hvordan vil du - klassifisere polene til systemet? Skisser hvordan du vil forvente - at sprangresponsen blir? -

    -

    Setter nevneren = 0.

    -

    - s^2 + 0.8s + 4 = 0 - s = \dfrac{-0.8 \pm \sqrt{0.8^2 - 4 \cdot 1 \cdot 4}}{2 \cdot - 1} - = \dfrac{-0.8 \pm \sqrt{0.64 - 16}}{2} - = \dfrac{-0.8 \pm \sqrt{15.36}}{2} - s_1 = -0.4 + 1.96i - \underline{\underline{s_2 = -0.4 - 1.96i}} -

    -

    - Vi klassifiserer polene til systemet som kompleks konjugerte. - Polene har negativ realdel dermed er systemet stabilt. Et system - med kompleks konjugerte poler vil ha en sprangrespons med - oversving. Systemer er stabilt og svinger seg inn mot en stabil - verdi. -

    - Sprangrespons -

    - B. Hva vil det si at et system har en - resonansfrekvens? -

    -

    - Robert sin forklaring: Hvis frekvensresponsen viser - en forstrekningstopp ved en gitt frekvens så har - systemet en resonansfrekvens. -

    -

    - Vår forklaring: Resonansfrekvens er en frekvens hvor - det fortsetter å svinge av seg selv når svingningene først er satt - i gang og svingebevegelsene ikke blir dempet. -

    -
    - -

    Oblig 2

    -

    - Hvorfor må et reguleringssystem ha stabilitetsmarginer? - Forklar kort hvilke marginer man normalt benytter i et - reguleringssystem og hvilken praktisk betydning de har. -

    -

    - Stabilitetsmarginer er nødvendig for at reguleringssystemet skal - være stabilt. Desto større marginer jo mer stabilt er systemet. - Ettersom et reg.ssytem skal fungere under ulike driftsforhold og - over lang tid er det nødvendig med akseptable marginer.Vi setter - krav til fasemargin. Den bør normalt være på minst - 45 grader. Velges 60 grader fårman et godt stabilt system. Pidtune() - i Matlab benytter 60 grader fasemargin for tuning av parametere. - Forsterkningsmarginen bør være på minst 6dB. Det - betyr at vi skal kunne doble regulatorforsterkningen uten at - reg.systemet blir ustabilt. -

    - -

    - For å undersøke stabilitet til et - reguleringssystem kan man benytte frekvensrespons. Forklar kort - hva det er man undersøker frekvensresponsen til? Anta at du har - bestemt en fornuftig regulator i reguleringssystemet og ønsker å - simulere hvordan utgangen (prosessverdien) følger setpunktet i - Matlab med step-funksjonen.Hvilken funksjon (matematisk uttrykk) - må man beregne før man kan benytte step-funksjonen? -

    -

    - Man må finne systemets - åpne sløyfetransferfunksjon A(s). Frekvensresponsen - til A(s) vil være utgangspunktet for å finne en «optimal» regulator. - For å simulere responsen til hele reguleringssystemet må vi beregne - følgeforholdet M(s). Hvis systemet har enhets tilbakekobling blir - M(s) = \frac{A(s)}{1+A(s)}. Matlab - beregner dette enkelt, og så kan vi benytte step-funksjonen på M(s). -

    - -

    - Nevn noen prosesser som blir regulert med av/på-regulering. Hvordan varierer pådraget og utgangen (prosessverdien) når - av/på-regulering benyttes? Tegn en skisse. -

    -

    - Av/på-regulering kan benyttes i trege prosesser, og der kravet til - nøyaktighet ikke er store. Eksempler: Temperaturregulering i hus og - kjøleskap. Nivåregulering i en tank hvor kravet til nivået ikke er - stort. -

    -

    - Ulempene ved av/på-regulering er at den regulerte prosessverdien - ikke stabiliserer seg på settpunktet. Utgangen vil svinge rundt - setpunktet, (unøyaktig regulering). I tillegg vil pådragsorganet - kjøres hardt fra 0 pådrag til 100% pådrag i en evig syklus. Vil - kunne gi stor «slitasje». Skisse av utgang (prosessverdien) og - pådraget i en av/på-regulering: -

    - Skisse av utgang (prosessverdien) og pådraget i en av/på-regulering -
    -
    -
    -
    -
    -
    -
    -

    - Hvilke forbedringer kan vi oppnå med en PID-regulator? - Forklar hvorfor en PI-regulator kan gi null stasjonær feil? - Hvilken effekt har derivatvirkningen Td i et reguleringssystem? -

    -

    - PID-regulatoren lager 3 bidrag til pådraget basert på avviket - e(t). De tre bidragene er: Proporsjonalt med avviket – P, - Integralet av avviket – I, Deriverte av avviket – D. Summen av - bidragene gir et pådrag som kan innta enhver verdi mellom 0 og - 100%. Det betyr at vi kan finne det helt riktige pådraget som gjør - at utgangen prosessverdien blir lik setpunktet (ønsket verdi). - PI-regulatoren integrerer avviket, og da vet vi at så lenge - avviket ikke er null (perfekt) så vil det genereres et bidrag til - pådraget som driver avviket mot null. Når avviket er null vil det - ikke genereres mer bidrag pga av I-delen og vi får null stasjonær - feil. Derivatvirkningen gjør at regulatoren følger hvor hurtig - avviket endrer seg. Ved raske endringer i avviket vil regulatoren - reagerer raskt for å motvirke at det blir et avvik. Fører dermed - til raskere regulering. -

    -

    - Tegn en skisse som viser hvordan pådraget og utgangen - (prosessverdien) nå varierer. -

    - PID - PID -
    - -

    - Anta at du benytter en PID-regulator i et - reguleringssystem, og at regulatoren er fornuftig innstilt. Hva vil - normalt skje hvis man øker forsterkningen på regulatoren? Hva vil - skje hvis man øker integrasjonstiden Ti? -

    -

    - Hvis man øker forsterkningen vil reguleringssystemet bli mer - oscillatorisk. Utgangen vil svinge mer. Når forsterkningen blir stor - nok blir det fleste reguleringssystemer ustabile. Regulatoren vil da - slå seg av og på (vandre mellom yttergrensene 0 og 100%). Utgangen - vil bli en stående svingning. Økes integrasjonstiden Ti vil det bety - at I-delen vektlegges mindre. Integrasjonseffekten avtar, og - regulatoren blir en P/PD-regulator, og da vil man normalt få - stasjonær feil. -

    - -

    - Anta at vi har konstruert et system som skal regulere nivåeti en - tank til ønsket nivå. - Vi har lageten matematisk beskrivelse av systemet som vist i - blokkdiagrammetfor reguleringssystemet, se figur2.2. -

    -
    - et system som skal regulere nivåeti en tank til ønsket nivå -
    - figur 2.2 - Blokkdiagram for reguleringssystemet -
    -
    -

    - P-reg: Anta at regulatoren vi først benytter er en - P-regulator med forsterkning K. Hva blir systemets åpne - sløyfetransferfunksjon A(s) når K= 1 ? Bestem forsterkningen K slik - at systemet oppfyller en fasemargin på minst 60 grader og en - forsterkningsmargin på minst 6dB. Bruk margin()funksjonen i Matlab, - og løs oppgaven. Du skal nå kunne oppgi følgende verdier som - beskriver systemet: Hvilken forsterkning K som bør benyttes. Hvilke - marginer \psiog - \Delta Ksom er oppnådd? Hva - \omega_c og - \omega_{180}? Og hva forsterkning - K_{krit} som vil gi et ustabilt system - er? -

    - -
    -
    -

    - Sløyfetransferfunksjonen A(s) benyttes for å bestemme - PID-parametere og stabilitetesmarginer. Når K=1 blir A(s). - A(s) = \dfrac{1}{(1+4s)(1+50s)(1+s)} - Legger A(s) inn i Matlab. Plotter bode(a) når K=1 og får - \rightarrow -

    -

    - Margin() sier -180 grader fasemargin. Det kommer av at A-kurven - aldri skjærer odB-linja, og dermed har systemet 180 grader - fasemargin. (ikke -180) Økes K til f.eks 2 eller 10 så vil vi se - riktig fasemargin og forsterkningsmargin. Prøver litt - forskjellige verdier i Matlab og finner fort ut at K=8.4 - oppfyller kravene. Lar margin() vise verdiene med K=8.4. Se - figuren til høyre. -

    -

    - Kan nå lese av følgende sentrale verdier: K= 8.4 gir Fasemargin - = 60.1. Forsterkningsmargin = 18.3dB. - \omega_c = 0.143 rad/s - \omega_{180} = 0.524 rad/s -

    -

    - Opg ? Test systemet i Matlab ved å påtrykke et - sprang i referansen r(t). Vis responsen y(t).Kommenterhvordan - systemet fungerer? (Hurtighet, nøyaktighet, stabilitet). Test en - sprangrespons når du benytter en forsterkning lik Kkrit. Vis - responsen y(t), og kommenter hvordan systemer fungerer nå. Prøv - også funksjonen pidtune(), og finn ut hva slags P-regulator den - anbefaler. Oppgi verdien som pidtune() kommer fram til, og - kommenter om den er i nærheten av det dere fant med - margin()-funksjonen. -

    -
    -
    - Bode diagram - Sløyfetransferfunksjonen A(s) -
    -
    - Bode diagram -
    -
    -
    -
    -
    -
    -

    - Svar Opg ? Finner Kkrit ved å ta forsterkningen som - er benyttet (8.4), og legge til forsterkningsmarginen 18.3dB. Kkrit - = 8.4 + 18.3 dB. (Må gjøre om til dB hele veien, og så legge - sammen.) Regner om 8.4 til dB - \rightarrow18.5dB. Kkrit = 18.48+ 18.3 dB - = 36.78dB som igjen er: 69.0 i ren forsterking. Lar Matlab beregne - overføringsfunksjonen; M= a/(1+a)når K=8.4. Plotter så - sprangresponsen med step(M). -

    - -
    -
    - Sprangrespons. P-reg med K=8.4 -
    -

    - Sprangrespons. P-reg med K=8.4 Systemet - bruker ca 50 sek på å svinge seg inn. Det er litt tregt system - pga prosessen som reguleres er en treg prosess. Ser at - stasjoner feil er ca 0.12 (12%). Det er pga at vi ikke - benytter en I-virkning. Prøver så en sprangrespons med K= - 69.0(Kkritisk). -

    -
    -
    -
    - Sprangrespons med Kkritisk -
    -

    - Sprangrespons. P-reg med K= 69.0 - \rightarrow Gir et ustabiltsystem - som forventet. Ved å kjøre pidtune på systemet anbefaler den - K= 8.41, og det er helt itråd med det vi fant via margin() - testen. -

    -
    -
    -
    - -

    - PI-reg:Det viser seg at P-regulatoren gir for stor - stasjonær feil, og en PI-regulatorskal benyttes isteden. Benytt - igjen margin(), og bestem en PI-regulator som oppfyller kravene i - 2A. Test også ut pidtune(),og finn ut hva slags PI-regulator den - anbefaler. Oppgi hvilken K og Ti som bør benyttes gitt data fra - margin() funksjonen. Hva blir \psi og - \Delta K med valgte PI-regulator. -

    -

    - Må nå finne Ti. Benytter Wc fra P-reg med K=8.4. (Wc= 0.143 rad/s). - Benytter: - \dfrac{1}{T_i} = \dfrac{\omega_c}{5} \rightarrow T_i = - \dfrac{5}{\omega_c} = \dfrac{5}{0.143} = 35. , K = 8.4 -

    -

    - PI-reg som nå benyttes blir: - H_{pi}(s) = K \dfrac{(1+T_is)}{T_is} = 8.4 \dfrac{(1+35s)}{35s} = - 0.24 \dfrac{(1+35s)}{s} - A(s) med PI-reg blir: - A(s) = \dfrac{0.24(1+35s)}{s(1+4s)(1+50s)(1+s)} -

    -

    - Oppgave 3: Hva er det som gjør PLS’er godt egnet i - automatiserte systemer? Forklar kort hvilke standardiserte - programmeringsspråk som kan benyttes for å programmere PLS’er. - Forklar kort hva programmet Codesys er, og hva vi kan benytte det - til. Begrepet «POU» dukker opp i forbindelse med programmering av - PLS’er. Hva er en POU? -

    -

    - PLS’er er dedikerte datamaskiner med IO for styring - og regulering. Robuste enheter med stor fleksibilitet for å løse - styringsoppgaver. Har stor driftsstabilitet, lite feil. Vil kunne - fungere 24/7. Finnes i alle formater fra små rimelige enheter til - enheter som kan håndtere tusenvis av I/O. Et programmeringsverktøy - følger normalt med, slik at en kan utvikle programmene på en PC, og - overføre kompilert kode til selve PLS’en. Kan programmeres etter IEC - 61131-3 på 5 alternative måter: Instruksjonsliste, Relé/ladder - diagram, Funksjonsblokker, Strukturert tekst, Sekvensielle - funksjonskart (SFC) -

    -

    - Codesys er CODESYS(an acronym for controller - development system, previously stylised CoDeSys) is a development - environmentfor programming controller applications according to the - international industrial standard IEC 61131-3. Codesys benyttes for - å utvikle kode til PLS’er. Vi kan også lage HMI’er for å simulere - løsninger. -

    -

    - En POUer en Program Organiseringsenhet. Det kan ses - på som et sted hvor man legger; funksjonsblokker, funksjoner, kode, - program. Vi kan lage benytte POU’er når vi lager PLS-kode. En måte å - organisere kode på. -

    -

    - Du skal utvikle en matematisk modell for et system. Beskriv kort to - metoder som kan benyttes. Hva kan matematiske modeller benyttes til? -

    -

    - En matematisk modell er en beskrivelse av sammenhenger i - systemer/prosesser. Beskriver et system/prosess med matematiske - ligninger som gir oss muligheter for analyse og design. Beskriver - f.eks sammenhengen mellom påvirkninger og responser med matematiske - uttrykk. Metoder som kan benyttes er: 1.Basert på fysiske lover og - balanser (fysisk modellering), 2. Eksperimentell analyse ved bruk av - eksperimenter og databehandling. (System identifikasjon). Modeller - kan benyttes til: 1. For å simulere systemer, 2. For analyse/design - av styringssystemer, 3. For å trene operatører i simulatorer, 4. For - optimal design av systemer, 5. For å lage realistisk dynamikk i - spill -

    - -
    -

    - Forklar hva et prosess-instrumenteringsdiagram er. - Hvordan angis Tag’er i slike diagram? Hvordan kan man se av - symbolet om instrumentet står i et kontrollrom eller ute i - prosessen? Hva angir følgende tag’er? TIC, TT, TAH, FIC, FT. Sjekk - på nettet og finn instrumenteringssymboler for: Varmeveksler, - Reguleringsventil, Pumpe -

    -

    - Et P&ID-diagram er et skjema/tegning som viser - koblingen av prosessutstyr og instrumenter som benyttes for å - styre prosessen. Fokuserer på rør, prosessutstyr, instrumentering - og regulering. -

    -

    - Tag’er angir prosessinstrumenter, men kan også - benyttes for å angi parameterei prosessutstyr, og - variabler/symboler i et industrielt IT-system. En måte å angi en - Tag på er: Ex. 234.67 FIC 172 ( Fabrikk–Avsnitt-Instrumentsymbol - -Loopnummer). TIC - Temperatur indikerende regulator(control). TT - - Temperatur Transmitter (måle-elementog overføring av verdi). TAH - - Temperatur Alarm Høy. FIC - Flow indicating Control. Mengde/flow - regulator. FT - Flow (mengde) transmitter (måle-elementog - overføring av verdi) -

    -

    Symboler:

    -
    -
    - Varmeveksler -
    Varmeveksler
    -
    -
    - Regulseringsventil -
    Reguleringsventil
    -
    -
    - Pumpe -
    Pumpe
    -
    -
    -
    - -
    -
    -

    noen instrumenter

    -
      -
    • PC - Presure Control. Trykk regulator
    • -
    • PT - PresureTransmitter. (trykkmåle-element/sensor)
    • -
    • PV - Presure control valve. (trykk reguleringsventil)
    • -
    • LC - Level Control. Nivå regulator
    • -
    • LT - Level transmitter. (nivå måle-element/sensor)
    • -
    • LV - Level control valve. Nivå reguleringsventi
    • -
    -
    - -
    -

    eksempel på sløyfer

    -
      -
    • Nivåregulerings-sløyfe: LC, LT, LV inngår
    • -
    • Trykkreguleringssløyfe: PC, PT, PV inngår.
    • -
    -
    -
    -
    -
    -
    -
    -

    Oblig 3

    -

    - Gitt følgende differensialligning. (Beskrivelse - av et fysisk system). - \ddot{X} + 0.8\dot{X}+4X(t) = 0.1f(t) - Anta at alle startbetingelser ved t = 0 er 0. Diskretiser ligning - 1 vha Eulers 1-skritts metode. Vis utledningen og - svaret. TIPS!! Erstatt den 2 -deriverte med sin numeriske - ekvivalent osv. Anta at f(t) er et enhetssprang ved t=0.\rightarrowf(t) = 1. Lag et program som beregner (simulerer) systemet for - verdier av t mellom 0 og 10 sekunder. Test følgende tidskritt T. - T= 0.01, T = 0.1, T =1.0 sek Skisser (plot) løsningen x(t) som - programmet beregner. Kommenter hva som skjer når T øker. -

    -

    - Benytter Eulers bakovermetode og setter inn for den - første og andre deriverte. -

    -

    - \dot{X} = \frac{X_k - X_{k-1}}{T} - \ddot{X} = \frac{X_k - 2X_{k-1} + X_{k-2}}{T} -

    -

    - Setter inn i 1 og løser mhp Xk. - \frac{X_k - 2X_{k-1} + X_{k-2}}{T^2} + 0.8 \frac{X_k-X_{k-1}}{T} - + 4X_k = 0.1F_k -

    - -

    - Løser med hensyn på Xk. Får nå den numeriske ligningen; - X_k = \frac{0.1T^2F_k + (0.8T+2)X_{k-1} - - X_{k-2}}{(1+0.8T+4T^2)} -

    - -

    Fk - Påtrykt signal.

    -

    - Fk = 1 når f(t) er et enhetssprang, Fk = sin(2*T*k) når f(t) er et - sinussignal på 2 rad/s. Benytter at tiden t = k*T -

    -

    Gitt følgende integral

    -

    Beregn hva det korrekte svaret er når : a= 0 b= 4

    -

    - y = \int_{a}^{b} f(t) dt - f(t) = 50t^4+20t^3-3t^2+4t-10 - =\Big[ \frac{50}{4+1}t^{4+1} + \frac{20}{3+1}t^{3+1} - - \frac{3}{2+1}t^{2+1}+\frac{4}{1+1}t^{1+1}-\frac{10}{0+1}t^{0+1} - \Big]_{0}^{4} = 11448 -

    - -

    - Tustins metode tar utgangspunkt i følgende - sammenheng: - y_k = y_{k-1} + \frac{T}{2}(f_k + f_{k-1}) - Når vi kjenner T og beregner funksjonsverdien ved k og k-1 får vi - arealet av en skive. Summerer alle ”skivene” fra start til stopp - punktet. Får da totalt areal. Ser at Tustins metode blir mer - nøyaktig med økende antall skiver (n). Høyere n -> lavere T -> bedre - nøyaktighet. -

    - -

    - Simpsons metode - y_k = y_{k-1} + \frac{T}{3}(f_{2k} + 4f_{2k+1} + f_{2k+2}) - 0 \leq k \lt \dfrac{n}{2} , n = antall - skiver, må være et like tall. Simpsons metode er mer nøyaktig enn - Tustin. -

    - -

    - Shannon-Nyquist Forklar kort hva Shannon-Nyquist - samplingsteorem beskriver.Anta at man sampler musikk med 20kHz. - Hva er den høyeste frekvensen man vil sitte igjen med? Anta at det - ligger en tone ved 16kHz når samplingen gjennomføres. Hva skjer - med den? Hvilken frekvens «dukker» den opp som? Hvordan unngår man - aliasfrekvenser ved sampling? -

    -

    - Samplingsteoremet sier at vi må sample minst dobbelt så hurtig som - den høyeste frekvensen i signalet vi ønsker å gjenskape etter - sampling. F_s \geq 2F_{max} Det betyr at - vi aldri vil sitte igjen med høyere frekvenser enn Fs/2 (Nyquist - frekvensen) i det samplede signalet. Hvis Fmax= 20kHz vil vi ikke - sitte igjen med høyere frekvenser enn 10kHz.Et 16kHz signal vil - dukke opp som en aliasfrekvens på: 20kHz – 16kHz = 4kHz. Dukker opp - som en 4kHz frekvens som aldri var der originalt. (Falsk frekvens). - Man unngår problemet med aliasfrekvenser ved å filtrere bor alle - frekvenser over Fs/2 før sampling. Benytter da et lavpassfilter som - demper alle frekvenser over Fs/2. Anti-alias filteret bør ha en - cut-off frekvens som er noe lavere enn Fs/2. -

    -

    Eksamen 2016

    -

    - Beskriv (gjerne med en skisse) hvordan et distribuert - styringssystem er oppbygd. - Forklar kort prinsippene slike systemer er bygd etter. Hva vil det - si at man har redundans i slike systemer? Industri - 4.0 er ofte benyttet som et begrep. Forklar kort hva dette dreier - seg om. -

    -

    - Bør få med at det består av operatørstasjoner, brukerstasjoner hvor - visualisering, brukergrensesnitt kjøres. Nettverk som forbinder - opartørstasjoner med distribuerte prosessenheter. Distribuerte - prosess-enheter som kan være alt fra PLS’er, intelligente - IO-moduler; RTU’er osv. Det er her styringsalgoritmer og IO utføres. -

    -

    - Redundans betyr at man bruker ekstra enheter for å øke sikkerheten, - påliteligheten i systemene. Kan for eksempel bruker flere IO-enheter - og sensorer som overvåker samme prosessverdi. -

    -

    - ndustri 4.0 dreier seg om at informasjonsteknologi tas i bruk i alle - ledd i et produksjonssystem/bedrift. Fra wiki: Industry 4.0is the - current trend of automationand data exchange in manufacturing - technologies. It includes cyber-physical systems, the Internet of - thingsalso cloud computing. -

    - -

    - Forklar kort hva en feltbuss er, og hvorfor dette - er en viktig del av industriell IT. Beskriv noen fordeler man kan - oppnå med feltbusser. Hva er forklaringen på at det finnes så mange - feltbusser? -

    -

    - Feltbuss er en digital kommunikasjonslinje som - forbinder feltinstrumenter med overordnet overvåking/styring-system. - Feltbusser gjør oppkobling av distribuerte enheter, sensorer m.m i - et styringssystem enklere. -

    -

    - Fordeler som ofte nevnes er: Mindre kabling, mindre - maskinvare. Mer intelligens ligger i instrumentene. En digital - kommunikasjon fra sensor til bruker. Kan også gi enklere - konfigurasjon og mye mer informasjon om instrumenter fungerer som de - skal. Kan gi en masse tilleggsinformasjon som tradisjonelle - instrumenter (analoge) ikke kan gi. -

    -

    - Feltbusser har blitt utviklet av mange selskap over tid. Mange - selskap holder på sin teknologi og mener den ofte er best. Samtidig - vil de ikke gi fra seg fordeler de har med etablerte systemer. I - tillegg skal feltbusser dekke mange ulike oppgraver. Alt fra - overordnet kommunikasjon som kan være industrielt Ethernet. Ned til - busser som håndterer distribuerte IO, og helt ned på sensor nivå. - Ulike busser kan dermed ha fordeler avhengig av bruksområdet. -

    - -

    - Forklar hvordan kan vi finne x(t) med Matlab? -

    -

    - Vi finner x(t) ved å ta invers Laplace av uttrykket X(s). I Matlab - oppgi X(s) og så utføre inversLaplace (ilaplace) på X(s): Får da - x(t) utrykt i tidsplanet. Kan også utføre step()-funksjonen på X(s). - Får da plottet x(t). -

    - -
    -

    - Forklar og skisser hvordan sprangresponser på 1. - og 2.ordens stabile systemernormalt vil være. -

    -

    - Sprangrespons på et 1.ordens system vil gi en pen innsvingning - uten oversving. Et 2.ordens system kan gi ulik respons avhengig av - om systemet har reelle eller komplekse poler. Reelle poler gir en - pen innsvinging uten oversving,Komplekse poler vil gi - oversving.(Se figur.) -

    - Sprangrespons på 2.ordens system -
    -
    -
    -
    -
    -
    -
    -
    -

    - Oppgave A - Du skal finne gode reguleringsparametere for et tilbakekoblet - system. - - Reguleringssystemet skal regulere nivået i en tank med væske. Anta - at du har funnet en modell som beskriver blokkene som inngår, og - at du lar Matlab med margin()-funksjonen tegne opp - frekvensresponsen til den åpne sløyfetransferfunksjonen A(s) som - vist på figur 2.1. Du har her benyttet en P-regulator med - forsterkning K= 6. -

    - reguleringssystem, margin -

    - Det er greiest å avlese hva margin()-funksjonen viser på toppen av - figuren: Der ser vi at fasemargin er 84.1 graderog - forsterkningsmargin er uendelig. Kryssfrekvensen ser vi er: 0.0568 - rad/s -

    -

    - Med disse marginene vil systemet være godt stabilt. Antagelig litt - for mye stabilt, noe som går ut over hurtigheten og nøyaktigheten - til systemet. Vi kan øke forsterkningen. F.eks kan vi prøve K lik - 8 eller 10.Får da et litt raskere og mer statisk nøyaktig - regulering.Hvis K økes for mye blir stabilitetsmarginene «spist» - opp. Dette system tåler egentlig at forsterkning kan økes mot - uendelig, men da blir fasemargin tilnærmet 0. Nærmer seg - ustabilitet, og et system som vil pendle svært mye. -

    -

    - Oppgave B P-regulatoren benyttet i oppgave A - ønskes forbedret med en PI-regulering. Forslå verdier som bør - testes på K og Ti. Begrunn valget. Hva blir transferfunksjonen til - PI-regulatoren du foreslår? -

    -

    - Kan beregne Ti ut fra kryssfrekvensen: 1/Ti = Wc/5 -> Ti= 88. Et - alternativ som er OK er å benytte: 1/Ti = Wc/10 -> Ti = 176. - Forsterkningen K kan holdes på 6 ettersom fasemargin var 84 - grader. Det burde gi et brukbart stabilt system. Kan også ta dette - ut av figuren av frekvensresponsen. -

    -
    - -
    -

    - Oppgave C Figur 2.2 viser sprangrespons på - reguleringssystemet med en PI-regulator. Hvordan vil du vurdere - systemets reguleringssegenskaper? Hva bør vi gjøre for å redusere - oversvinget? -

    - sprangrespons på reg. system -

    - Er en typisk innsvinging. Ser at stasjonær feil er null. (Bra). - Systemets hurtighet ser vi på tidsaksen. Tar ca 40 sekunder før - systemet roer seg ned. Oversvinget er på ca 30%, og det er i meste - laget. Kan redusere oversvinget ved å redusereforsterkningen K. - F.eks kan vi prøve å halvere K. Et annet tiltak kan være å øke - integrasjonstiden Ti. Det beste er å gjøre små justeringer og så - teste sprangresponsen for å se hva en oppnår. -

    -
    - -

    - Oppgave D Prosessen gitt i oppgave 2A blir koblet - opp, og testes med Ziegler-Nichols metode. Følgende - verdier ble funnet: Kritisk forsterkning Kkrit= 14 og svingeperioden - Tk= 105 sekunder. Hvilke verdier vil du anbefale å benytte for - innstilling av en PID-regulator? Hvilke svakheter har - Ziegler-Nichols metode.? Beskriv noen andre metoder som vi kan - anvende for praktisk tuning som kan være bedre enn Ziegler-Nichols - metode. -

    -

    - Dette kan vi beregne rett fra vedlagte tabell: K = 0.65. Kkrit = - 0.65 * 14 = 9.1. Ti =0.5*Tk = 0.5 *105 = 52.5. Td = 0.12. Tk = 0.12* - 105 = 12.6. Ziegler-Nichols metode tester hvor mye systemet tåler. - Metoden krever at prosessen er oppkoblet og utsettes for store - pådragsendringer. Systemet kjøres slik at et blir tilnærmet - ustabilt. Stående svingninger. Det er ikke akseptabelt formange - prosesser, og dermed kan ikke metoden benyttes. Tabellen forslår - verdier som skal passe for alle prosesser.Etter en beregning/testing - bør man finjustere reguleringsparameterne. Andre metoder som kan - benyttes er: 1. Relè-metoden som setter prosessen i en kontrollert - svingning. Meget god metode. 2. Teste sprangrespons på systemet, og - ut fra responsen beregne parametere. Mye benyttet i enkle - auto-tunings-algoritmer. 3. Andre forslag som er presentert er: Good - Gain metoden til Finn Haugen.baserer seg på sprangrespons. 4. I - tillegg har en rekke personer kommet med sine «egne» metoders om - baserer seg på vurdering av sprangresponsen. -

    - -

    - Oppgave E - Anta at du har en 12 bit A/D-omformer som dekker - området 0 til 5 Volt. Hvilken oppløsning har denne A/D-omformeren i - mV. Hvilken nøyaktighet i mV kan vi forvente å ha? Begrunn svaret. - Det påsettes en spenning på 2.75 Volt på A/D-omformeren. Hvilken - bit-verdi bør A/D-omformeren gi ut? Hvorfor vil 12 bit A/D og - D/A-omformere ofte være godt nok å benytte i industrielle styringer? -

    -

    - Oppløsningen er gitt av antall bit og er gitt av antall nivåer vi - kan dele området i: Kan regnes ut på følgende vis: - - Res_{mv} = \frac{Vref}{2^N} = \frac{5}{2^{12}}= \frac{5}{4096} = - 1.2mV -

    -

    - Nøyaktighet er aldri bedre enn antall bit som - benyttes for å holde den digitale verdien. Aldri bedre enn : - \pm0.5 LSB. Vanligvis oppnår en ikke - bedre enn \pm1 til 2 LSB. (LSB-minste - signifikante bit) -

    -

    - Ex Vi beregner hva LSB utgjør. Med spenning fra 0-5 - volt blir max nøyaktighet: - \frac{5V}{4096}=1.2mV (1 LSB) Kan angis - som +/- 0.6mV. (Tilsvarer +/- 0.5 LSB) -

    -

    - 2.75 Volt tilsvarer: - \frac{2.75}{5} \cdot 4096 = 2252 (Får - 2252.8. Må være et heltall. Runder mot null) -

    -

    - Nøyaktigheten til en 12 bit A/D, D/A omformer er såpass god at - feilen som ligger rundt 0.02% er vesentlig lavere enn feil i - sensor/målesystemet (som kan ligge på 0.5% eller høyere). et - svakeste leddet er normalt måle-element/sensor, og da hjelper det - ikke stort om en bruker A/D, D/A med flere bit. I systemer med store - krav til nøyaktighet (som f.eks lyd) vil man måtte bruke 16 bit - eller høyere. -

    -

    - Oppgave F - Forklar hva det vil si å sample et analogt signal. - Hvordan vil du bestemme hvor ofte et analogt signalet må samples? -

    -

    - Sampling betyr å kvantisere et signal i tid og verdi. Et analogt - signal avleses med en fast takt (samplingsfrekvensen), og verdien - omformes fra analog til digital i en A/D-omformer. Nøyaktig og - oppløsning er avhengig av antall bit som benyttes for å holde den - digitale verdien. Samplingsfrekvensen er avhengig av hvor hurtig - signalet vi skal sample er. Shannon-Nyquist har utledet - samplingsteoremet som sier at vi må sample minst dobbeltså hurtig - som den høyeste frekvensen vi ønsker å gjenskape. -

    - -
    - diskret PI-regulator - U_k = U_{k1} + k_p \cdot \dfrac{1+T_S}{T_I} \cdot avvik -k_p - \cdot avvik_1 - -
      -
    • - U_k - nåværende beregnet pådrag -
    • -
    • - U_{k1} - pådraget ved forrige - sampling -
    • -
    • - avvik - Feilen. Setpunkt minus målt - verdi akkurat nå -
    • -
    • - avvik_1 - avviket en sampling tilbake - i tid -
    • -
    • K_i - regulator forsterkning
    • -
    • T_i - integrasjonstien
    • -
    • - T_s - samplingstiden (hvor hurtig - algoritmen kjøres) -
    • -
    -
    -
    -
    -
    -
    -

    - Differensialligning under beskriver dynamikken for - et generelt 1.ordens lavpassfilter. - \dot{X}(t) + \alpha X(t) =\beta U(t) - X(t)-er filtrert signal. U(t)-er signal som skal filtreres. alpha og - beta er en faktor som avgjør hvor kraftig filteret skal filtrere. - Bruk Eulers bakovermetode for diskretisering og finn den - programmerbare differensligningen for lavpassfilteret. Forklar hva - løsningen praktisk innebærer. Anta at β=1. Hva bør α være hvis en - ønsker en kraftig filtrering av innkommende signal? -

    -

    - Ved å sette inn EBM som vi finner i vedlegget, og får når vi samler - like ledd og Xk på venstre side i ligningen: -

    -

    - \dot{X} + \alpha X = \beta U \rightarrow \dot{X} = \frac{X_k - - X_{k-1}}{T} \rightarrow \frac{X_k - X_{k-1}}{T} + \alpha X_k = - \beta U_k - -

    -

    - X_k - X_{k-1} + \alpha T X_k = \beta T U_k \rightarrow X_k (1 + - \alpha T ) = X_{k-1} + \beta T U_k - -

    -

    - X_k = \dfrac{1}{1 + \alpha T} \cdot X_{k-1} + \dfrac{\beta T}{1 + - \alpha T} \cdot U_k -

    -

    - \beta = 1 \rightarrow X_k = \dfrac{1}{1 + \alpha T} \cdot X_{k-1} - + \dfrac{T}{1 + \alpha T} \cdot U_k -

    - -

    - Ser at: (Antar også T er mye mindre enn 1)Når α er tilnærmet null - betyr det kraftig filtrering av inngangssignalet Uk. Det betyr at Uk - påvirker Xk lite (kraftig filtrering). Xk tilnærmet Xk-1 -

    - -

    - Uttrykket gitt under kan benyttes for numerisk integrasjon. - - Forklar leddene i uttrykket, og hvordan vi kan benytte dette for å - integrere en gitt funksjon fra et startpunkt a til et sluttpunkt b. -

    -

    - y_k = y_{k-1} + \frac{T}{2}(f_k + f_{k-1}) - Forklar en annen metode som vil kunne være mer nøyaktig enn denne. - Beskriv kort forskjellen på dem. -

    -

    - Formelen er differensligningen som beskriver - trapes integrasjon. yk er nytt areal som beregnes. - yk-1 er arealet før neste «skive» som beregnes. T–samplingstiden - (Tiden mellom 2 målinger). fk – funksjonsverdien i punktet k. fk-1 – - funksjonsverdien i punktet k-1. -

    -

    - Lager en løkke som beregner og summerer hver skive som funksjonen - blir delt opp i. Vi må oppgi start og sluttpunktet a og b. Og hvor - mange skiver/intervaller kurven skal deles i. -

    -

    - Trapesmetoden har god nøyaktighet, men Simpsons metode som benytter - parabelbuer og 3 funksjonerverdier ved hver beregning er mer - nøyaktig. Litt mer krevende algoritme, men gir større nøyaktighet. -

    - -
    -

    Codesys

    - -

    SR

    -

    Hvordan funker blokken?

    -
      -
    • Når SET1 er høy, er Q1 høy.
    • -
    • Når SET1 går fra høy til lav, forblir Q1 høy.
    • -
    • Når RESET er høy, og SET1 er lav, blir Q1 lav.
    • -
    • Når RESET går fra høy til lav, skjer ingenting.
    • -
    -

    - Man har også RS, som er helt lik som SR, men i stedet for at SET1 - er dominant (som i SR), er det RESET som er dominant -

    -

    Eksempel (se figur CS1.1 og CS1.2)

    -

    START, STOPP og UTGANG er BOOL.

    -
      -
    • - Når man trykker på knappen til START, blir den TRUE. Dette fører - til at UTGANG blir TRUE. -
    • -
    • - Når man trykker på knappen til STOPP, blir den TRUE. Dette fører - til at UTGANG blir FALSE, men bare når START er FALSE! -
    • -
    -
    - SR blokk - logikk -
    Figur CS1.1
    -
    -
    - SR blokk - HMI -
    - Figur CS1.2 - HMI for flere av eksempelene -
    -
    - -

    F_TRIG/R_TRIG

    -

    Hvordan funker blokken?

    -
      -
    • - R_TRIG: Når CLK får inn et signal som går fra lav til høy, blir - Q høy, men forblir ikke høy -
    • -
    • - F_TRIG: Når CLK får inn et signal som går fra høy til lav, blir - Q høy, men forblir ikke høy -
    • -
    • - Q sender konstant lav. Så i det CLK sender høy, blir Q høy, også - blir den umiddelbart lav igjen. Dette gjør at utgangen til en - trigger funker bra sammen med tellere. -
    • -
    -
    - R_TRIG - logikk -
    Figur CS1.3
    -
    - -

    CTU/CDU (teller)

    -

    Hvordan funker blokken?

    -

    - CTU og CDU funker på samme måte, men CTU teller oppover, og CDU - teller nedover. Teksten under er for CTU -

    -
      -
    • CU inngangen funker som en R_TRIG sin inngang
    • -
    • CV er en integer som telles oppover
    • -
    • PV er en integer som er "maks" verdi til telleren
    • -
    • - Når CU blir høy, blir CV plusset med 1. Altså om CV er 1, så - blir den 2. -
    • -
    • Når CV er lavere enn PV, er UTGANG lav.
    • -
    • Når CV er lik eller høyere enn PV, er UTGANG høy.
    • -
    • - Når RESET er høy, er CV 0, som gjør at UTGANG er lav. CV forblir - 0 så lenge RESET er høy. -
    • -
    -
    - CTU - CV under PV -
    Figur CS1.4.1, når CV er under PV
    - CTU - CP lik PV -
    - Figur CS1.4.2, når CV er lik eller høyere PV -
    - CTU - RESET -
    Figur CS1.4.3, når RESET er høy
    -
    - -

    TOF (timer)

    -

    Hvordan funker blokken?

    -
      -
    • - IN ved rising edge: tilbakestiller timeren, setter høy utgang -
    • -
    • IN ved falling edge: starter timeren, utgang forblir høy
    • -
    • Når timeren er ferdig (ET lik PT), blir utgang lav.
    • -
    • ET er utløpt tid.
    • -
    -
    - TOF - Logikk -
    Figur CS1.5
    -
    - -

    TON (timer)

    -

    Hvordan funker blokken?

    -
      -
    • IN ved rising edge: starter timeren, utgang er lav
    • -
    • - IN ved falling edge: tilbakestiller timeren, utgang forblir lav -
    • -
    • Når timeren er ferdig (ET lik PT), blir utgang høy.
    • -
    - -

    TP (timer)

    -

    Hvordan funker blokken?

    -
      -
    • IN ved rising edge: starter timeren, utgang er høy
    • -
    • - IN ved falling edge: ingenting skjer, alt fortsetter som før, - utgang forblir høy -
    • -
    • Når timeren er ferdig (ET lik PT), blir utgang lav.
    • -
    -
    -
    -
    -
    -
    -
    -

    - Blandetanken har 2 nivåsensorer. Nivåsensorene - gir et logisk høyt (1) signal når nivået ”dekker” sensoren. Når - nivået er lavere enn sensoren gir den logisk 0. To pumper benyttes - for å pumpe væske A og B til tanken. I tillegg finnes det en motor - som styrer en omrører, og en alarmutgang til en alarmlampe. Det - benyttes også en startbryter og en stoppbryter som begge er - normalt åpne (logisk 0) når de ikke er berørt, men som gir logisk - 1 når de holdes inne. De går automatisk til logisk 0 når de - slippes. Du skal lage et PLS-program med Ladder og/eller - Funksjonsblokker som utfører følgende: Når startbryteren trykkes, - og deretter slippes, skal pumpe 1 starte med å pumpe væske inn, - samtidig skal omrøreren starte. Når nivået passerer (høyere) enn - nivåsensoren Niv_norm skal pumpe 1 stoppe. Deretter skal pumpe 2 - starte og pumpe væske B inn i tanken i 3 minutter. Nivåsensorer - Niv_hoy skal fungere som sikkerhet mot at tanken overfylles. Hvis - nivået i tanken passerer Niv_hoy skal begge pumpene stoppe, og et - alarmsignal Alarm_hoy skal aktiveres. Hvis stoppbryteren trykkes - skal anlegget stoppes (pumpe 1, pumpe 2, omrører og alarm skal - slås av.) -

    - codesys oppg - eksamen 2016 -
    - -
    -

    Eksamen 2017

    -

    - Begrepene styring og regulering benyttes ofte med ulik - mening. - Forklar hva som menes med styring. Tegn en figur/skisse som viser - prinsippet. Beskriv to eksempler på systemer som styres. Forklar hva - som menes med regulering. Tegn en figur/skisse som viser prinsippet. - Beskriv to eksempler på systemer som reguleres. -

    -

    - Bør få med at styring normalt ikke benytter - tilbakekobling. Påvirker et system. Men kan også observere. - Trafikklys. Heis. Pakkelinje…… - Regulering bruker tilbakekobling for å oppnå ønsket - resultat. Regulering av nivået i et kar, Cruisekontroll for å holde - hastigheten til en bil, Autopilot for å holde kurs. Holde - temperaturen i et rom…. -

    - -

    - Segway er et batteridrevet kjøretøy på 2 hjul som - balanserer og kjører en person. Den regulerer en prosess som virker - som en invertert pendel. Vis med et blokkskjema hvordan du antar - reguleringssystemet i Segway’en må virke. Forklar hva - blokkene/enhetene som inngår utfører. Hvordan vil du karakterisere - tidskonstantene/tregheten i denne prosessen, og hvordan vil det - påvirke samplingstiden som bør benyttes i reguleringsalgoritmen? Hva - vil skje hvis en velger for lav samplingsfrekvens? -

    -

    - Blokkskjema bør vise hvor komponentene inngår og - tilbakekoblingen. Regulator – pådragsorgan- prosess- måle-element- - summasjonspunktet Tradisjonelt tilbakekoblet system. - Referansen blir satt som en vinkel som skal holde - personen i en loddrett stilling (slik at han/hun ikke faller). - Benytter en vinkelmåler (kan være gyro etc) som indikerer om - personen er loddrett eller ikke. Avviket sendes til - en PID-regulator som genererer pådrag til motorer som kjører hjulene - for å balansere personen. Når personen bikker framover vil - regulatoren kjøre Segway’en framover for å motvirke et fall, og - dermed beveger den seg i riktig retning. Tilsvarende bakover. I - tillegg til å holde en person loddrett, og dermed kjøre rett - fram/eventuelt tilbake kan Seqwayen også styres mot høyre/venstre av - personen som står på den. Det hele fungerer som et system som - balanserer en invertert pendel. Motorene (hjulene) kjøres slik at - håndtaket og personen ikke tipper framover eller bakover. Dette er - en forholdsvis rask prosess med små tidskonstanter (motorstyring), - og en må sample så hurtig at systemet blir stabilt. Seqway benytter - 100Hz for å oppnå dette. Dermed blir regulering mer nøyaktig, stabil - og behagelig. Hadde det blitt benyttet en lav samplingsfrekvens - f.eks 1Hz ville ganske sikkert systemet blitt ustabilt. Personen - ville ha falt framover/bakover før reg.systemet hadde klart å - balansere det loddrett. -

    -

    - Hvorfor er standard Ethernet problematisk å benytte - som en feltbuss? Nyere biler benytter CAN-bus og ODB-2 (On Board - Diagnostics system). Forklar/beskriv hva CAN-bus og ODB-2 har som - oppgave i en bil. -

    -

    - Standard Ethernet er gir ikke sanntids responser. - Kan benyttes på overordnet nivå til HMI, og operatørstasjoner. Hvis - man forbedrer Ethernet slik som ProfiNet og Ethernet/IP. EtherCat, - Så har de sanntidsegensaker som gjør at disse kan benyttes ut mot - felt. -

    -

    - CAN bus (Controller Area Network) is a vehicle bus - standard designed to allow microcontrollers and devices to - communicate with each other within a vehicle without a host - computer. CAN bus is a message-based protocol , designed - specifically for automotive applications but now also used in other - areas such as aerospace, maritime, industrial automation and medical - equipment. CAN bus blir benyttet i ODB-II diagnose system for biler. - Ble introdusert i biler i 1996. Er nå obligatorisk i alle bensin og - diesel biler. Gjør at alle ECU’er i bilen kan snakke sammen. Kan - følgelig overvåke sensorer, aktuatorer, motorstyring ++. - Diagnose-systemet gjør at feil i motor, styriger m.m kan rapporteres - og feilsøkes fra en datamaskin som kjører et diagnose-service - program. -

    - -

    - Reduser blokkdiagrammet og vis at - transferfunksjonen mellom inngang og utgang blir. - \frac{Y(s)}{R(s)} = M(s) = \frac{K}{50s^2 + s + K} -

    -

    - Må først sette opp - åpen sløyfetransferfunksjonen A(S) lik : - K/(s*(1+50s)) Regner så ut følgeforholdet M(s) lik: - A(s)/(1 + A(s)), og da ser vi at svaret blir lik det som er oppgitt. - q.e.d -

    - -

    - De fleste regulatorer har auto-tunings funksjoner. - Forklar hva slags metoder/prinsipper som normalt anvendes ved - auto-tuning? -

    -

    - 1. Bør her kunne forklare kort rele-metoden som - baserer seg på at systemet påtvinges av/på signal i påadraget, og så - observeres utgangen. Systemet blir satt i en kontrollert selvsving. - Og Kritisk forsterkning og svingetid avleses automatisk. Dermed kan - man lage en enkel beregning for P, PI eller PID parametere. 2. En - enklere metode er å påsette sprang (på/av) og - avlese responstider og forsterkning. Ut fra loggede data kan P, PI, - PID parameter anslås. Kalles ofte: - sprangrespons metoden. -

    -
    -
    -
    -
    -
    -
    -

    - Et lydsignal samples, og resultatet er vist på figur 3.1 Signalet - blir testet med en FFT-rutine, og resultatet er vist i figur 3.2. - Benytt figurene, og forklar/beskriv hva slags signal/signaler som er - samplet. Benytt figur 3.2, og sett opp det matematiske uttrykket som - beskriver lydsignalet. -

    -
    - Et samplet lydsignal - FFT-analyse av signalet -
    -

    - Figur 3.1 viser et periodisk signal. Så det ser ut som det er ulike - sinus-signaler (lyd-frekvenser) som summeres. Figur 3.2 viser dette - klarere. Vi ser tydelig at vi har sinus-frekvenser ved 200, 400, 600 - og 800 Hz. Amplituden er gitt av høyden. Det betyr at det er summen - av 4 sinus-komponenter. Signalet kan skrives som: x(t) = sin - (2*pi*200*t) + 2sin (2*pi*400*t) + 3sin (2*pi*600*t)+ 4sin - (2*pi*800*t) -

    -

    - Kode for en diskret PI-regulator: - u_k = u_{k1} + k_p \cdot (1.0 + \dfrac{T_s}{Ti}) \cdot avvik - - k_p \cdot avvik_1 -

    -

    - Forklar hva den utfører og alle variablene som inngår i uttrykket. - Hva skjer hvis Ti settes svært stor? Hva vil skje hvis vi setter Ts - svært stor? Hvorfor må man begrense uk før verdien benyttes mot en - prosess? -

    -

    - Uttrykket er en typisk numerisk beregning som kan - gjøres av en datamaskin. Framkommer ved å digitalisere den analoge - løsningen for en PI-regulator. ( Ikke krav at det vises). Ledd som - inngår: Uk – nytt beregnet pådrag, Uk1 – Pådraget 1 sampling tilbake - i tid, Kp – regulatorforsterkningen, Ts – samplingstiden, Ti - - Integrasjonstiden, Avvik – nåværende avvik, Avvik1 – avviket 1 - sampling tilbake i tid -

    -

    - Hvis Ti settes stor vil I-virkningen bli borte. Vil virke som en - P-regulator. Stor Ts betyr at vi sampler langsomt. Kan gi - svingninger, og til slutt et ustabilt system. Må begrense pådraget - Uk til max/min verdi som pådragsorganet kan benytte. Hvis ikke vil - systemet fungere dårlig (store oversving), eller at D/A-omformeren - ikke takler verdien i det hele tatt. (Anti-wind up) -

    - -

    Oppgave 3E

    -

    - Et analogt høypassfilter er gitt ved av transferfunksjon - \dfrac{Y(s)}{X(s)} = \dfrac{s}{1+0.5s} -

    -

    - Y(s) - Filtrert signal (utgang). X(s) - Signal som skal filtreres - (inngang Du skal lage en diskret ekvivalent. Benytt Eulers metode - med samplingstid T , og f inn den programmerbare differensligningen - som beskriver filteret. Filteret testes med et enhetssprang på - inngangen. Bergen hva responsen blir for k = 0, 1 og 2 -

    -

    - Omformer fra Laplace til tidsplan. Setter så inn - Eulers ekvivalent og regner ut. Det er ikke angitt hva - samplingstiden T skal være. Jeg benytter T=0.01 for å regne helt ut. -

    -

    - \dfrac{Y(s)}{X(s)} = \dfrac{s}{1+0.5s} - \Rightarrow (1+0.5s) \cdot Y(s) = s \cdot X(s) - s-plan: Y(s)+0.5s \cdot Y(s) = s \cdot X(s) -

    -

    - t-plan: y+0.5 \dot{y} = \dot{x} -

    -
    -
    - Erstatter med numerisk ekvivalent -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ky_ky_{k-1}x_kx_{k-1}
    01.96010
    11.921.9611
    21.881.9211
    -
    -
    -

    - \Rightarrow y_k + 0.5 \cdot \dfrac{y_k - y_{k-1}}{T} = \dfrac{x_k - - x_{k-1}}{T} \cdot T - \Rightarrow Ty_k + 0.5y_k - 0.5y_{k-1} = x_k - x_{k-1} - \Rightarrow y_k(T+0.5) = 0.5y_{k-1} + y_k - y_{k-1} - \Rightarrow \underline{\underline{y_k = \dfrac{0.5}{T+0.5} \cdot - y_{k-1} + \dfrac{1}{T+0.5}(y_k - y_{k-1})}} -

    - -
    -

    - FeltbusserHvorfor IKKE benytte feltbusser? Mer - komplekst utstyr, Mange standarder, Driftere må ha gode - IT-kunnskaper, Revisjon av programvare kan gi - integrasjonsproblemer, Nytt og gammelt utstyr snakker ikke alltid - sammen, Kan «hackes»/forstyrres slik at datamistes eller blir - feil. -

    -

    - Det finnes en rekke feltbusser. Noen busser er mer rettet mot - sensor påbitnivå. (ASI, CAN, IO-link). Noen dekker kommunikasjon - mellom PLS’er og instrumenter. (Profibus-DP, Interbus, Modbus, - DeviceNet, EtherCat.) Noen er rettet mot prosessautomatisering. - (Profibus-PA, Fieldbus H1) Noen er rettet mot overordnede - styringssystemer. (ProfiNet, Ethernet/IP, Fieldbus HSE), samt - ulike ethernet-typer beregnet for sanntidsoperasjoner. -

    -
    - -

    - Vanlige feltbusser ASI: Effektiv når det er enkle - digitale signaler mot sensor. IO-Link : Kommunikasjons-Interface. - Punkt til punkt tilkobling mellom sensorer,aktuatorer og PLS’er. - CAN: Control area Network. Mye brukt i bilindustrien. OBD2 diagnose - system for biler. (Seriebus). Profibus-DP: Dekker kommunikasjon - mellom Master (eks. PC/PLS) og distribuerte I/O-enheter som da blir - slaver. Max 12Mbit/s. Max 32 enheter per segment. Benytter RS 485. - Profibus-PA: Benyttes for kommunikasjon motprosessinstrumenter. - 31.25 kBit/sPA nettet kobles mot en DP-Master via en DP til PA - omkobler. Fieldbus Foundation: Konkurrent til Profibus-PA. - Kommunikasjon mot prosessinstrumenter. 31.25 kBit/s. - Funksjonsmoduler (software) i I/O enhetene. Industrielt Ethernet: - Benytter Ethernet med ”programvare/hardware” som sørger for - sanntidsegenskaper. Oppdateringstider mindre enn 10 - 0mikrosekunder.Eks. Profinet, Ethernet/IP, EtherCAT, ModbusTCP -

    - -

    - Måleelement og kalibrering. Må - kalibreremåleelementet slik at vi får mest mulig riktig informasjon - om det fysiske signalet. Må kunne stole på at signalet som angir - resultatet/målingen er riktig. F.eks må alle bensinpumper kalibreres - jevnlig. (Justervesenet.) Veldig viktig ved kjøp og salg av varer. - Viktig for skattelegging. Fiskalemålinger, avgifter. Et måleelement - kalibreres slik at nedre fysiske verdi gir en utgang lik f.eks 4mA, - og høyeste fysiske verdi gir 20mA. Benytte da Zero (angir nullpunkt) - og Span (angir område, maks verdi). -

    - -

    - Digitalisering og sampling. Analoge signaler må - digitaliseres (kvantiseres i tid og verdi) før de kan benyttes av en - datamaskin. Kvantisering i tid kalles sampling/punktprøving. -

    - -

    - Begrensing av pådrag Pådragsorganer har - metningsgrenser. Når disse grensene nås er det uheldig at - regulatoren fortsetter å integrere opp pådraget uk. ådraget kan i en - algoritme bli uendelig stort eller lite. Slike verdier vil ikke ha - noen mening å benytte. NB!!En ventil kan åpnes 100%, det er - meningsløst å si at en ventil skal åpnes 200%. Løsningen er å ikke - la pådraget bli større enn Umax og ikke bli mindre enn Umin. Dette - gjøres enkelt med noen if-setninger. Hvis en slik begrensing (anti - wind-up) ikke legges inn vil det gå uforholdsmessig lang tid før - pådraget bringes tilbake til normalt område igjen etter endringer. - Resultatet vil bli et langvarig oversving. -

    -
    -
    -
    -
    -

    Oppgave 4

    -

    - A. Timere er ofte benyttet i PLS - - programmer. Forklar hvordan de 3 vanligste PLS - Timerne virker, og - gi gjerne eksempel på oppgaver de kan anvendes -

    - -
    -

    - TON - timer - TON – forsinket innkobling. Når noe ikke skal gå - på før etter en viss tid. F.eks. Roobma (Robert) i et bygg som går - på etter en time etter at sistemann gikk ut døren. -

    -

    - TOF - timer - TOF - Forsinket utkobling. Når noe skal holde seg - på en viss tid etter at innsignalet går av. F.eks. lyset skal stå - på noen sekunder et at er at lysbryteren er slått av. -

    -

    - TP - timer - TP - Pulstimer. En timer som er på en spesifisert tid. Den slår - seg av etter gitt tid. F.eks. Døråpner. Når man trykker på - bryteren, så åpner døren seg, og holder seg åpen i x sekunder før - den lukker seg igjen. -

    -
    - -
    -

    Greit å vite

    -

    - Bode-diagram: Gm = forsterkningsmargin = - \Delta K, Pm = Fasemargin = - \psi, K = forsterkning -

    - -

    Faseforskyvning = \phi

    -

    - T kalles Systemets tidskonstant, - hurtighet/treghet. Store tidskonstanter gjør systemet tregt. -

    -

    - Tidsforsinkelse betyr at det går en viss tid før - utgangen reagerer på inngangen. Det er da et delay - (dødtid) i systemet. Det medfører at vi får - målinger forsinket i forhold til pådraget. Vi observerer følgelig - ikke momentant virkningen av et pådrag. Dette gjør at et - reguleringssystem må tunes mer forsiktig (må sikre marginer). Kan - gi treg regulering og utfordringer i forhold til stabilitet. -

    - -

    - Holdelementet holder verdien i samplingstiden T - sek. Hold-elementer skaper dødtid. Ofte T/2? -

    - -

    - Forsterkningsmarginen er uendelig, fordi fasen - ikke passer -180 grader. -

    - -
    -
    -

    - Ved sprangrespons må man benytte M(s). - M(s) = \dfrac{a(s)}{1+a(s)}. Maks - oversving burde være på 1.20 (20%) -

    -

    - Beregning av dB-verdier - K(db) = 20log_{10}(K). Legg merke - til at X \cdot 2 \rightarrow 6 dB, - X \cdot 0.5 \rightarrow -6 dB, - X \cdot 10 \rightarrow 20 dB, - X \cdot 0.1 \rightarrow -20 dB -

    - -
      -
    • - Man kan gjøre et ustabil prosess stabil ved - å benytte tilbakekobling. -
    • -
    • - Lavpassfilter fjerner høye signlar (lar kun - lave komme gjennom) -
    • -
    • - Høypassfilter fjerner lave signlar (lar kun - høye komme gjennom) -
    • -
    • - Hold-element Utgangen holdes på samme verdi - i hele samplingstiden inntil en ny verdi kommer fra D/A - eller A/D-omformeren. -
    • -
    -
    -
    - -
    -

    - Lavpassfilter: Ser av frekvensresponsen at lave frekvenser - slipper gjennom, og at høyere frekvenser dempes. -

    -

    - Cut - off frekvensen - \phi = \dfrac{1}{T_F} -

    -
    -
    -
    -
    - -

    Nullpunkter, poler og tidskonstanter

    -
    - eks. nullpunkter og poler -

    - Systemet har 1 nullpunkt. Tidskonstant 2 sek. Systemet har 2 poler - (tidskonstanter 10 sek og 50 sek), samt 1 integrator. Systemet har - en dødtid/tidsforsinkelse på 20 sekunder NB!: Nullpunkter påvirker - dynamikken og responsen til systemet. Polene påvirker dynamikken, - men også om systemet skal være stabilt eller ikke. Dødtid gjør - systemer trege og vanskeligere å regulere. -

    -

    - Tidsrespons Undersøker hvordan et system takler - endringer/påvirkninger. Gir oss informasjon om; Hurtighet, - forsterkning, stabilitet, reaksjonsmønster. -

    -
    - -

    - Frekvensrespons Undersøker hvordan et system - takler sinussignaler. Gir oss informasjon om; Båndbredde, - stabilitet, filteregenskaper. Ved å la - \omega variere fra null til uendelig vil - vi kunne finne ut hvordan et system overfører sinussignaler. Vi vil - sitte igjen med informasjon som vi kaller frekvensresponsen til - systemet. Frekvensresponsen til et system (lineært og stabilt) kan - finnes direkte fra transferfunksjonen H(s). Det kan vises at vi - finner frekvensresponsen ved å erstatte s med - j\omega i en transferfunksjon. I Matlab - finner man frekvensresponsen enkelt ved å skrive inn - transferfunksjonen. Legger inn teller og nevner hver for seg, og - benytter deretter tf-funksjonen som lager selve transferfunksjonen. - Når den er inne benyttes BODE()-funksjonen for å beregne og plotte - frekvensresponsen. -

    - -

    - Arbeidspunkt:. Angir det normale - virkeområde(setpunkt/referanse) for en reg.sløyfe. Vi må bestemme - oss for hvor hva referansen normalt er innstilt på. Det har - betydning for tuning av PID-parametrene. Hvis prosessen vi skal - regulere er lineærvil reg.parametrene vi har funnet ved et - arbeidspunkt kunne benyttes når vi endrer arbeidspunkt. Er prosessen - ulineærvil optimale reg.parametre variere med arbeidspunktet som - benyttes. Vi bør derfor tune systemet på nytt når arbeidspunktet - endres. -

    - -

    - Man kan gjøre et ustabil prosess stabil ved å benytte - tilbakekobling. -

    - -

    - RFID Radiofrekvensidentifikasjon (engelsk: radio - frequency identification, RFID) er en metode for å lagre og hente - data ved hjelp av små enheter kalt RFID-brikker. En RFID-brikke er - en liten brikke som kan festes til eller bygges inn i et produkt, et - dyr eller en person. -

    -
    -
    -
    -
    -

    - OPC Open Platform Communications. OPCer en - interoperabilitetsstandardfor sikker og pålitelig datautvekslingi - industriell automatisering/nettverk. Den er plattform uavhengig, og - sikrer sømløs strøm av informasjonmellom enheter fra flere - leverandører. Siste utgave er: OPC-UA (Unified Architecture). Gjør - det mulig å lese/skrive PLS-tagger i sanntid. Er basert på en - klient/server modell. -

    -

    - OPC Data Access (OPC Classic) OPC DA sender over - realtimeverdier fra PLS’er til HMI/SCADA system. Altså tilgang til - realtime prosessdata. Brukes til: Lesing av nåverdier( - Måleinstrumenter, Styresignaler, Beregnede verdier). Og skriving av - nåverdier (Settpunkt i regulator, Startkriterier i - logikk-programmer). - OPC Unified Architecture (UA) Motivasjon: Samler - alle eksisterendespesifikasjoner i enhelhetligmodell. Støtter - kompliserte/rike informasjonsmodeller. Fokus på sikkerhet i - kommunikasjon mellomklient og server. Er tilgjengelig på andre - plattformer enn Win32: Linux, Android, VxWorks, iOS, Android -

    - -

    - Rektangel-integrasjon følger Eulers metode. Vi - deler området under en funksjon/kurve opp i rektangler. Bredden på - en skive er samplingstiden T (i matematikken ofte benyttet delta x). - Det blir da lett å beregne arealet av hver rektangel. Lager et - program som beregner arealet av hvert rektangel /Skive og som - summerer fra startpunkt til endepunkt, Får dermed beregnet det - totale (tilnærmede) areal under kurven. På en måten kan vi enkelt - integrere bestemte funksjoner. -

    - -

    - Simpsons metode benytter parabelbuer istedenfor - rektangler. En slik bue kan bede tilpasses en kurve. Dermed vil også - arealberegningen bli mer nøyaktig -

    - -

    - Programbare ligninger fra analoge uttrykk. - Ligningene fremkommer ved å diskretisere analoge uttrykk. Vi må - benytte diskrete løsninger (numeriske) for derivasjon og - integrasjon. Mange metoder å velge blant. Eulers metoder er enkle. - For integrasjon finnes, rektangel og trapesintegrasjon. Simpsons - metode og andre. For derivasjon kan Eulers forovermetode benyttes, - men også mer avanserte fler-skritts metoder som Runge-Kutta. Ved å - erstatte analoge uttrykk med sine diskrete ekvivalenter fremkommer - en differensligning som kan programmeres. -

    - -

    - Eulers midtpunktsmetodeer en forbedring av Eulers - forovermetode. Den går ut på at man beregner den deriverte i punktet - (t0+ T/2). Og benytter den som et estimat av den deriverte i punktet - (t0, x0) En enda bedre metode går ut på å beregne den deriverte i - flere punkter. Runge-Kutta 4-skritts metode - beregner funksjonsverdien fk i 4 delintervaller mellomt0og t1. Det - er en tyngre metode å utføre, men gir vesentlig bedre resultat enn - enkle metoder som Eulers metoder. -

    - -

    Matlab

    -

    Runge-Kutta: ode45()

    -

    Audioread(): Leser flere lyd-formater

    -

    Audiowrite(): Skriver flere lyd-formater

    -

    - sound(y, Fs): Spiller av samplingene. Ofte 2 kanaler med lyd. - (Stereo) Fs angir samplingsfrekvensen som benyttes. -

    -

    - Pause(): Angir at systemet tar en pause på n - sekunder. Ved lyd: spiller ingenting. -

    -

    - Plot(): plotter valgte feks. samplinger eller - annet. Visualisering. -

    -

    - Flipud(): Snur matrisa bak fram. Ved lyd vil den - bli spilt inn bakfrem -

    -

    Eksamen 2014

    -

    - Anta at du skal utføre en PID-regulering, og at algoritmen under - benyttes - uk = u_{k-1} + K(1 + \dfrac{T}{T_i})e_k - Ke_{k-1} - - \dfrac{KT_d}{T}(y_k - 2y_{k-1} + y_{k-2}) -

    -

    - Parametere i algoritmer: uk – beregnet pådrag ved - et gitt samplingspunkt, uk-1 – pådraget en sampling tilbake (gamle - pådraget), ek – nåværende avvikk, ek-1 – avviket en sampling - tilbake, ek-2 – avviket to sampling tilbake, yk - målt verdi, rk - - referanse. Evt. A, B og C er konstanter. -

    - -

    - Numeriske løsninger - Integrasjonsmetoder:Eulers metoder: Enkle men ikke - så nøyaktige. Trapesmetoden_ Mer nøyaktig og enkel å implementere. - Simpsons metode: Meget nøyaktig, men tyngre å implementere. - Differensialapproksimasjoner: Eulers metoder, grove - mhp nøyaktighet, 1-skritts metoder, rask. Runge-Kutta metoden: - Flerskritts metoder. Mer nøyaktige. Trenger desto flere beregninger. - Mye benyttet i simulering. -

    -

    - Viktig: Det er viktig at tidsskrittet T man velger ved numeriske - løsninger (simuleringer) er liten i forhold til systemets dynamikk. - En regel er at man bør velge en skrittlengde T som er minst 10 - ganger mindre enn systemets minste tidskonstant. En annen måte å si - dette på er at en bør velge en samplingsfrekvens som er minst 10 - ganger raskere en den øverste frekvens som skal gjengis tilnærmet - uendret. Velges tids-skrittet T for stor i en numerisk - løsningvilhele simuleringen kunne bli ustabil. Resultatet blir da - helt ubrukelig. -

    - -

    - For å kunne analysere et system/prosess i t-plan trenger vi en - matematisk modell som beskriver hvordan systemet - oppfører seg. Vi kan benytte forskjellige metoderfor å utføre en - slik analyse/simulering. 1. Simulere løsninger ved å - diskretiser edifferensialligningene som beskriver - systemet. Får da programmerbare løsninger (numeriske løsninger). 2. - 2. Vi kan benytte Laplacetransformen. Transformerer - modell-ligningene over i s-plan. Blir da lettere å jobbe med - ”koblede”systemer. Hvis systemet/prosessen er beskrevet med lineære - diff.ligninger kan vi etablere koblinger mellom inngang og utgang - som kalles en transferfunksjon. -

    - -
    -

    - 2015 4B: en liten industriprosess er følgende - koblet opp mot en PLS. -

    -
      -
    • - En startbryter og en stoppbryter som begge er normalt åpne - logisk 0 når de ikke er berørt, men som gir logisk 1 når de - holdes inne. De går automatisk til logisk 0 når de slippes, - (touch - brytere) -
    • -
    • To motorer som kan slås av og på
    • -
    -

    - Du skal lage et PLS - program med ladder og/eller funksjonsblokker - som gjør følgende: Når startbryteren trykkes (startsignal) skal - motor 1 kjøres i 2 minutter før den stoppes. Når motor 1 stopper - skal motor 2 kjøres i 4 minutter før den stopper. Hvis - stoppbryteren trykkes (stoppsignal) skal begge motorer stoppe - umiddelbart. Skriv/tegn programmet som løser oppgaven. Forklar - kort hvordan ditt program løser dette. Benytt funksjonsblokker som - du mener er nødvendige -

    - -

    - Kan løses på flere måter. Ettersom start - og stoppbryterne er - touch - brytere må vi sikre at verdiene holdes med en RS - vippe. - Vil benytte en TOF - timer (forsinket utkobling ) blokk som settes - til 2 minutter, samt en RS - blokk og en AND - blokk som vist - under -

    - -
    - -
    - Figuren viser kun hvordan motor 1 kan styres. Må gjøre noe - tilsvarende for motor 2 -
    -
    -

    - Når startbryteren trykkes og slippes starter TOF, og holder - utgangen høy i 2 minutter. (Forsinket utkobling). Så lenge - stoppbryteren ikke trykkes løper tiden, og motor en vil gå i 2 - minutter ettersom både TOF og RS - vippa har høy utgang. AND - - blokka gir nå på - signal til motoren. Hvis stopp trykkes vil RS - - vippa resettes og AND - blokka vil gi lavt utgangssignal . Motoren - stoppes. Det samme vil skje når timertiden på 2 minutte r utløper. - AND - blokka vil gå lav og stoppe motoren. -

    -
    -
    -
    -
    - - - - - - - diff --git a/dist/_/skole/hio/2017/eksamensark/js/app.js b/dist/_/skole/hio/2017/eksamensark/js/app.js deleted file mode 100644 index 4bd4886..0000000 --- a/dist/_/skole/hio/2017/eksamensark/js/app.js +++ /dev/null @@ -1,16259 +0,0 @@ -/******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { -/******/ configurable: false, -/******/ enumerable: true, -/******/ get: getter -/******/ }); -/******/ } -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 1); -/******/ }) -/************************************************************************/ -/******/ ([ -/* 0 */ -/***/ (function(module, exports, __webpack_require__) { - -(function webpackUniversalModuleDefinition(root, factory) { - if(true) - module.exports = factory(); - else if(typeof define === 'function' && define.amd) - define([], factory); - else if(typeof exports === 'object') - exports["katex"] = factory(); - else - root["katex"] = factory(); -})(this, function() { -return /******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { -/******/ configurable: false, -/******/ enumerable: true, -/******/ get: getter -/******/ }); -/******/ } -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 63); -/******/ }) -/************************************************************************/ -/******/ ([ -/* 0 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_slicedToArray__ = __webpack_require__(57); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_slicedToArray___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_slicedToArray__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_get_iterator__ = __webpack_require__(18); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_get_iterator___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_get_iterator__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__domTree__ = __webpack_require__(12); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__fontMetrics__ = __webpack_require__(30); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__symbols__ = __webpack_require__(28); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__utils__ = __webpack_require__(5); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__stretchy__ = __webpack_require__(13); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__units__ = __webpack_require__(19); - - - -/* eslint no-console:0 */ -/** - * This module contains general functions that can be used for building - * different kinds of domTree nodes in a consistent manner. - */ - - - - - - - - -// The following have to be loaded from Main-Italic font, using class mainit -var mainitLetters = ["\\imath", "ı", // dotless i -"\\jmath", "ȷ", // dotless j -"\\pounds", "\\mathsterling", "\\textsterling", "£"]; - -/** - * Looks up the given symbol in fontMetrics, after applying any symbol - * replacements defined in symbol.js - */ -var lookupSymbol = function lookupSymbol(value, -// TODO(#963): Use a union type for this. -fontFamily, mode) { - // Replace the value with its replaced value from symbol.js - if (__WEBPACK_IMPORTED_MODULE_4__symbols__["a" /* default */][mode][value] && __WEBPACK_IMPORTED_MODULE_4__symbols__["a" /* default */][mode][value].replace) { - value = __WEBPACK_IMPORTED_MODULE_4__symbols__["a" /* default */][mode][value].replace; - } - return { - value: value, - metrics: __WEBPACK_IMPORTED_MODULE_3__fontMetrics__["a" /* default */].getCharacterMetrics(value, fontFamily, mode) - }; -}; - -/** - * Makes a symbolNode after translation via the list of symbols in symbols.js. - * Correctly pulls out metrics for the character, and optionally takes a list of - * classes to be attached to the node. - * - * TODO: make argument order closer to makeSpan - * TODO: add a separate argument for math class (e.g. `mop`, `mbin`), which - * should if present come first in `classes`. - * TODO(#953): Make `options` mandatory and always pass it in. - */ -var makeSymbol = function makeSymbol(value, fontFamily, mode, options, classes) { - var lookup = lookupSymbol(value, fontFamily, mode); - var metrics = lookup.metrics; - value = lookup.value; - - var symbolNode = void 0; - if (metrics) { - var italic = metrics.italic; - if (mode === "text") { - italic = 0; - } - symbolNode = new __WEBPACK_IMPORTED_MODULE_2__domTree__["a" /* default */].symbolNode(value, metrics.height, metrics.depth, italic, metrics.skew, metrics.width, classes); - } else { - // TODO(emily): Figure out a good way to only print this in development - typeof console !== "undefined" && console.warn("No character metrics for '" + value + "' in style '" + fontFamily + "'"); - symbolNode = new __WEBPACK_IMPORTED_MODULE_2__domTree__["a" /* default */].symbolNode(value, 0, 0, 0, 0, 0, classes); - } - - if (options) { - symbolNode.maxFontSize = options.sizeMultiplier; - if (options.style.isTight()) { - symbolNode.classes.push("mtight"); - } - var color = options.getColor(); - if (color) { - symbolNode.style.color = color; - } - } - - return symbolNode; -}; - -/** - * Makes a symbol in Main-Regular or AMS-Regular. - * Used for rel, bin, open, close, inner, and punct. - * - * TODO(#953): Make `options` mandatory and always pass it in. - */ -var mathsym = function mathsym(value, mode, options) { - var classes = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : []; - - // Decide what font to render the symbol in by its entry in the symbols - // table. - // Have a special case for when the value = \ because the \ is used as a - // textord in unsupported command errors but cannot be parsed as a regular - // text ordinal and is therefore not present as a symbol in the symbols - // table for text, as well as a special case for boldsymbol because it - // can be used for bold + and - - if (options && options.fontFamily && options.fontFamily === "boldsymbol" && lookupSymbol(value, "Main-Bold", mode).metrics) { - return makeSymbol(value, "Main-Bold", mode, options, classes.concat(["mathbf"])); - } else if (value === "\\" || __WEBPACK_IMPORTED_MODULE_4__symbols__["a" /* default */][mode][value].font === "main") { - return makeSymbol(value, "Main-Regular", mode, options, classes); - } else { - return makeSymbol(value, "AMS-Regular", mode, options, classes.concat(["amsrm"])); - } -}; - -/** - * Makes a symbol in the default font for mathords and textords. - */ -var mathDefault = function mathDefault(value, mode, options, classes, type) { - if (type === "mathord") { - var fontLookup = mathit(value, mode, options, classes); - return makeSymbol(value, fontLookup.fontName, mode, options, classes.concat([fontLookup.fontClass])); - } else if (type === "textord") { - var font = __WEBPACK_IMPORTED_MODULE_4__symbols__["a" /* default */][mode][value] && __WEBPACK_IMPORTED_MODULE_4__symbols__["a" /* default */][mode][value].font; - if (font === "ams") { - var _fontName = retrieveTextFontName("amsrm", options.fontWeight, options.fontShape); - return makeSymbol(value, _fontName, mode, options, classes.concat("amsrm", options.fontWeight, options.fontShape)); - } else { - // if (font === "main") { - var _fontName2 = retrieveTextFontName("textrm", options.fontWeight, options.fontShape); - return makeSymbol(value, _fontName2, mode, options, classes.concat(options.fontWeight, options.fontShape)); - } - } else { - throw new Error("unexpected type: " + type + " in mathDefault"); - } -}; - -/** - * Determines which of the two font names (Main-Italic and Math-Italic) and - * corresponding style tags (mainit or mathit) to use for font "mathit", - * depending on the symbol. Use this function instead of fontMap for font - * "mathit". - */ -var mathit = function mathit(value, mode, options, classes) { - if (/[0-9]/.test(value.charAt(0)) || - // glyphs for \imath and \jmath do not exist in Math-Italic so we - // need to use Main-Italic instead - __WEBPACK_IMPORTED_MODULE_5__utils__["a" /* default */].contains(mainitLetters, value)) { - return { - fontName: "Main-Italic", - fontClass: "mainit" - }; - } else { - return { - fontName: "Math-Italic", - fontClass: "mathit" - }; - } -}; - -/** - * Determines which of the two font names (Main-Bold and Math-BoldItalic) and - * corresponding style tags (mathbf or boldsymbol) to use for font "boldsymbol", - * depending on the symbol. Use this function instead of fontMap for font - * "boldsymbol". - */ -var boldsymbol = function boldsymbol(value, mode, options, classes) { - if (lookupSymbol(value, "Math-BoldItalic", mode).metrics) { - return { - fontName: "Math-BoldItalic", - fontClass: "boldsymbol" - }; - } else { - // Some glyphs do not exist in Math-BoldItalic so we need to use - // Main-Bold instead. - return { - fontName: "Main-Bold", - fontClass: "mathbf" - }; - } -}; - -/** - * Makes either a mathord or textord in the correct font and color. - */ -var makeOrd = function makeOrd(group, options, type) { - var mode = group.mode; - var value = group.value; - - var classes = ["mord"]; - - var fontFamily = options.fontFamily; - if (fontFamily) { - var _fontName3 = void 0; - var fontClasses = void 0; - if (fontFamily === "boldsymbol") { - var fontData = boldsymbol(value, mode, options, classes); - _fontName3 = fontData.fontName; - fontClasses = [fontData.fontClass]; - } else if (fontFamily === "mathit" || __WEBPACK_IMPORTED_MODULE_5__utils__["a" /* default */].contains(mainitLetters, value)) { - var _fontData = mathit(value, mode, options, classes); - _fontName3 = _fontData.fontName; - fontClasses = [_fontData.fontClass]; - } else if (fontFamily.indexOf("math") !== -1 || mode === "math") { - // To support old font functions (i.e. \rm \sf etc.) or math mode. - _fontName3 = fontMap[fontFamily].fontName; - fontClasses = [fontFamily]; - } else { - _fontName3 = retrieveTextFontName(fontFamily, options.fontWeight, options.fontShape); - fontClasses = [fontFamily, options.fontWeight, options.fontShape]; - } - if (lookupSymbol(value, _fontName3, mode).metrics) { - return makeSymbol(value, _fontName3, mode, options, classes.concat(fontClasses)); - } else { - return mathDefault(value, mode, options, classes, type); - } - } else { - return mathDefault(value, mode, options, classes, type); - } -}; - -/** - * Combine as many characters as possible in the given array of characters - * via their tryCombine method. - */ -var tryCombineChars = function tryCombineChars(chars) { - for (var i = 0; i < chars.length - 1; i++) { - if (chars[i].tryCombine(chars[i + 1])) { - chars.splice(i + 1, 1); - i--; - } - } - return chars; -}; - -/** - * Calculate the height, depth, and maxFontSize of an element based on its - * children. - */ -var sizeElementFromChildren = function sizeElementFromChildren(elem) { - var height = 0; - var depth = 0; - var maxFontSize = 0; - - var _iteratorNormalCompletion = true; - var _didIteratorError = false; - var _iteratorError = undefined; - - try { - for (var _iterator = __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_get_iterator___default()(elem.children), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { - var child = _step.value; - - if (child.height > height) { - height = child.height; - } - if (child.depth > depth) { - depth = child.depth; - } - if (child.maxFontSize > maxFontSize) { - maxFontSize = child.maxFontSize; - } - } - } catch (err) { - _didIteratorError = true; - _iteratorError = err; - } finally { - try { - if (!_iteratorNormalCompletion && _iterator.return) { - _iterator.return(); - } - } finally { - if (_didIteratorError) { - throw _iteratorError; - } - } - } - - elem.height = height; - elem.depth = depth; - elem.maxFontSize = maxFontSize; -}; - -/** - * Makes a span with the given list of classes, list of children, and options. - * - * TODO(#953): Ensure that `options` is always provided (currently some call - * sites don't pass it) and make the type below mandatory. - * TODO: add a separate argument for math class (e.g. `mop`, `mbin`), which - * should if present come first in `classes`. - */ -var makeSpan = function makeSpan(classes, children, options, style) { - var span = new __WEBPACK_IMPORTED_MODULE_2__domTree__["a" /* default */].span(classes, children, options, style); - - sizeElementFromChildren(span); - - return span; -}; - -var makeLineSpan = function makeLineSpan(className, options) { - // Return a span with an SVG image of a horizontal line. The SVG path - // fills the middle fifth of the span. We want an extra tall span - // because Chrome will sometimes not display a span that is 0.04em tall. - var lineHeight = options.fontMetrics().defaultRuleThickness; - var line = __WEBPACK_IMPORTED_MODULE_6__stretchy__["a" /* default */].ruleSpan(className, lineHeight, options); - line.height = lineHeight; - line.style.height = 5 * line.height + "em"; - line.maxFontSize = 1.0; - return line; -}; - -/** - * Makes an anchor with the given href, list of classes, list of children, - * and options. - */ -var makeAnchor = function makeAnchor(href, classes, children, options) { - var anchor = new __WEBPACK_IMPORTED_MODULE_2__domTree__["a" /* default */].anchor(href, classes, children, options); - - sizeElementFromChildren(anchor); - - return anchor; -}; - -/** - * Makes a document fragment with the given list of children. - */ -var makeFragment = function makeFragment(children) { - var fragment = new __WEBPACK_IMPORTED_MODULE_2__domTree__["a" /* default */].documentFragment(children); - - sizeElementFromChildren(fragment); - - return fragment; -}; - -// These are exact object types to catch typos in the names of the optional fields. - - -// A list of child or kern nodes to be stacked on top of each other (i.e. the -// first element will be at the bottom, and the last at the top). - - -// Computes the updated `children` list and the overall depth. -// -// This helper function for makeVList makes it easier to enforce type safety by -// allowing early exits (returns) in the logic. -var getVListChildrenAndDepth = function getVListChildrenAndDepth(params) { - if (params.positionType === "individualShift") { - var oldChildren = params.children; - var _children = [oldChildren[0]]; - - // Add in kerns to the list of params.children to get each element to be - // shifted to the correct specified shift - var _depth = -oldChildren[0].shift - oldChildren[0].elem.depth; - var currPos = _depth; - for (var i = 1; i < oldChildren.length; i++) { - var diff = -oldChildren[i].shift - currPos - oldChildren[i].elem.depth; - var _size = diff - (oldChildren[i - 1].elem.height + oldChildren[i - 1].elem.depth); - - currPos = currPos + diff; - - _children.push({ type: "kern", size: _size }); - _children.push(oldChildren[i]); - } - - return { children: _children, depth: _depth }; - } - - var depth = void 0; - if (params.positionType === "top") { - // We always start at the bottom, so calculate the bottom by adding up - // all the sizes - var bottom = params.positionData; - var _iteratorNormalCompletion2 = true; - var _didIteratorError2 = false; - var _iteratorError2 = undefined; - - try { - for (var _iterator2 = __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_get_iterator___default()(params.children), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { - var child = _step2.value; - - bottom -= child.type === "kern" ? child.size : child.elem.height + child.elem.depth; - } - } catch (err) { - _didIteratorError2 = true; - _iteratorError2 = err; - } finally { - try { - if (!_iteratorNormalCompletion2 && _iterator2.return) { - _iterator2.return(); - } - } finally { - if (_didIteratorError2) { - throw _iteratorError2; - } - } - } - - depth = bottom; - } else if (params.positionType === "bottom") { - depth = -params.positionData; - } else { - var firstChild = params.children[0]; - if (firstChild.type !== "elem") { - throw new Error('First child must have type "elem".'); - } - if (params.positionType === "shift") { - depth = -firstChild.elem.depth - params.positionData; - } else if (params.positionType === "firstBaseline") { - depth = -firstChild.elem.depth; - } else { - throw new Error("Invalid positionType " + params.positionType + "."); - } - } - return { children: params.children, depth: depth }; -}; - -/** - * Makes a vertical list by stacking elements and kerns on top of each other. - * Allows for many different ways of specifying the positioning method. - * - * See VListParam documentation above. - */ -var makeVList = function makeVList(params, options) { - var _getVListChildrenAndD = getVListChildrenAndDepth(params), - children = _getVListChildrenAndD.children, - depth = _getVListChildrenAndD.depth; - - // Create a strut that is taller than any list item. The strut is added to - // each item, where it will determine the item's baseline. Since it has - // `overflow:hidden`, the strut's top edge will sit on the item's line box's - // top edge and the strut's bottom edge will sit on the item's baseline, - // with no additional line-height spacing. This allows the item baseline to - // be positioned precisely without worrying about font ascent and - // line-height. - - - var pstrutSize = 0; - var _iteratorNormalCompletion3 = true; - var _didIteratorError3 = false; - var _iteratorError3 = undefined; - - try { - for (var _iterator3 = __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_get_iterator___default()(children), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { - var child = _step3.value; - - if (child.type === "elem") { - var _elem = child.elem; - pstrutSize = Math.max(pstrutSize, _elem.maxFontSize, _elem.height); - } - } - } catch (err) { - _didIteratorError3 = true; - _iteratorError3 = err; - } finally { - try { - if (!_iteratorNormalCompletion3 && _iterator3.return) { - _iterator3.return(); - } - } finally { - if (_didIteratorError3) { - throw _iteratorError3; - } - } - } - - pstrutSize += 2; - var pstrut = makeSpan(["pstrut"], []); - pstrut.style.height = pstrutSize + "em"; - - // Create a new list of actual children at the correct offsets - var realChildren = []; - var minPos = depth; - var maxPos = depth; - var currPos = depth; - var _iteratorNormalCompletion4 = true; - var _didIteratorError4 = false; - var _iteratorError4 = undefined; - - try { - for (var _iterator4 = __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_get_iterator___default()(children), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { - var _child = _step4.value; - - if (_child.type === "kern") { - currPos += _child.size; - } else { - var _elem2 = _child.elem; - var classes = _child.wrapperClasses || []; - var style = _child.wrapperStyle || {}; - - var childWrap = makeSpan(classes, [pstrut, _elem2], undefined, style); - childWrap.style.top = -pstrutSize - currPos - _elem2.depth + "em"; - if (_child.marginLeft) { - childWrap.style.marginLeft = _child.marginLeft; - } - if (_child.marginRight) { - childWrap.style.marginRight = _child.marginRight; - } - - realChildren.push(childWrap); - currPos += _elem2.height + _elem2.depth; - } - minPos = Math.min(minPos, currPos); - maxPos = Math.max(maxPos, currPos); - } - - // The vlist contents go in a table-cell with `vertical-align:bottom`. - // This cell's bottom edge will determine the containing table's baseline - // without overly expanding the containing line-box. - } catch (err) { - _didIteratorError4 = true; - _iteratorError4 = err; - } finally { - try { - if (!_iteratorNormalCompletion4 && _iterator4.return) { - _iterator4.return(); - } - } finally { - if (_didIteratorError4) { - throw _iteratorError4; - } - } - } - - var vlist = makeSpan(["vlist"], realChildren); - vlist.style.height = maxPos + "em"; - - // A second row is used if necessary to represent the vlist's depth. - var rows = void 0; - if (minPos < 0) { - var depthStrut = makeSpan(["vlist"], []); - depthStrut.style.height = -minPos + "em"; - - // Safari wants the first row to have inline content; otherwise it - // puts the bottom of the *second* row on the baseline. - var topStrut = makeSpan(["vlist-s"], [new __WEBPACK_IMPORTED_MODULE_2__domTree__["a" /* default */].symbolNode("\u200B")]); - - rows = [makeSpan(["vlist-r"], [vlist, topStrut]), makeSpan(["vlist-r"], [depthStrut])]; - } else { - rows = [makeSpan(["vlist-r"], [vlist])]; - } - - var vtable = makeSpan(["vlist-t"], rows); - if (rows.length === 2) { - vtable.classes.push("vlist-t2"); - } - vtable.height = maxPos; - vtable.depth = -minPos; - return vtable; -}; - -// Converts verb group into body string, dealing with \verb* form -var makeVerb = function makeVerb(group, options) { - // TODO(#892): Make ParseNode type-safe and confirm `group.type` to guarantee - // that `group.value.body` is of type string. - var text = group.value.body; - if (group.value.star) { - text = text.replace(/ /g, "\u2423"); // Open Box - } else { - text = text.replace(/ /g, '\xA0'); // No-Break Space - // (so that, in particular, spaces don't coalesce) - } - return text; -}; - -// Glue is a concept from TeX which is a flexible space between elements in -// either a vertical or horizontal list. In KaTeX, at least for now, it's -// static space between elements in a horizontal layout. -var makeGlue = function makeGlue(measurement, options) { - // Make an empty span for the rule - var rule = makeSpan(["mord", "rule"], [], options); - var size = Object(__WEBPACK_IMPORTED_MODULE_7__units__["a" /* calculateSize */])(measurement, options); - rule.style.marginRight = size + "em"; - return rule; -}; - -// Takes an Options object, and returns the appropriate fontLookup -var retrieveTextFontName = function retrieveTextFontName(fontFamily, fontWeight, fontShape) { - var baseFontName = retrieveBaseFontName(fontFamily); - var fontStylesName = retrieveFontStylesName(fontWeight, fontShape); - return baseFontName + "-" + fontStylesName; -}; - -var retrieveBaseFontName = function retrieveBaseFontName(font) { - var baseFontName = ""; - switch (font) { - case "amsrm": - baseFontName = "AMS"; - break; - case "textrm": - baseFontName = "Main"; - break; - case "textsf": - baseFontName = "SansSerif"; - break; - case "texttt": - baseFontName = "Typewriter"; - break; - default: - throw new Error("Invalid font provided: " + font); - } - return baseFontName; -}; - -var retrieveFontStylesName = function retrieveFontStylesName(fontWeight, fontShape) { - var fontStylesName = ''; - if (fontWeight === "textbf") { - fontStylesName += "Bold"; - } - if (fontShape === "textit") { - fontStylesName += "Italic"; - } - return fontStylesName || "Regular"; -}; - -// A map of spacing functions to their attributes, like size and corresponding -// CSS class -var spacingFunctions = { - "\\qquad": { - size: "2em", - className: "qquad" - }, - "\\quad": { - size: "1em", - className: "quad" - }, - "\\enspace": { - size: "0.5em", - className: "enspace" - }, - "\\;": { - size: "0.277778em", - className: "thickspace" - }, - "\\:": { - size: "0.22222em", - className: "mediumspace" - }, - "\\,": { - size: "0.16667em", - className: "thinspace" - }, - "\\!": { - size: "-0.16667em", - className: "negativethinspace" - } -}; - -/** - * Maps TeX font commands to objects containing: - * - variant: string used for "mathvariant" attribute in buildMathML.js - * - fontName: the "style" parameter to fontMetrics.getCharacterMetrics - */ -// A map between tex font commands an MathML mathvariant attribute values -var fontMap = { - // styles - "mathbf": { - variant: "bold", - fontName: "Main-Bold" - }, - "mathrm": { - variant: "normal", - fontName: "Main-Regular" - }, - "textit": { - variant: "italic", - fontName: "Main-Italic" - }, - - // "mathit" and "boldsymbol" are missing because they require the use of two - // fonts: Main-Italic and Math-Italic for "mathit", and Math-BoldItalic and - // Main-Bold for "boldsymbol". This is handled by a special case in makeOrd - // which ends up calling mathit and boldsymbol. - - // families - "mathbb": { - variant: "double-struck", - fontName: "AMS-Regular" - }, - "mathcal": { - variant: "script", - fontName: "Caligraphic-Regular" - }, - "mathfrak": { - variant: "fraktur", - fontName: "Fraktur-Regular" - }, - "mathscr": { - variant: "script", - fontName: "Script-Regular" - }, - "mathsf": { - variant: "sans-serif", - fontName: "SansSerif-Regular" - }, - "mathtt": { - variant: "monospace", - fontName: "Typewriter-Regular" - } -}; - -var svgData = { - // path, width, height - vec: ["vec", 0.471, 0.714] // values from the font glyph -}; - -var staticSvg = function staticSvg(value, options) { - // Create a span with inline SVG for the element. - var _svgData$value = __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_slicedToArray___default()(svgData[value], 3), - pathName = _svgData$value[0], - width = _svgData$value[1], - height = _svgData$value[2]; - - var path = new __WEBPACK_IMPORTED_MODULE_2__domTree__["a" /* default */].pathNode(pathName); - var svgNode = new __WEBPACK_IMPORTED_MODULE_2__domTree__["a" /* default */].svgNode([path], { - "width": width + "em", - "height": height + "em", - // Override CSS rule `.katex svg { width: 100% }` - "style": "width:" + width + "em", - "viewBox": "0 0 " + 1000 * width + " " + 1000 * height, - "preserveAspectRatio": "xMinYMin" - }); - var span = makeSpan(["overlay"], [svgNode], options); - span.height = height; - span.style.height = height + "em"; - span.style.width = width + "em"; - return span; -}; - -/* harmony default export */ __webpack_exports__["a"] = ({ - fontMap: fontMap, - makeSymbol: makeSymbol, - mathsym: mathsym, - makeSpan: makeSpan, - makeLineSpan: makeLineSpan, - makeAnchor: makeAnchor, - makeFragment: makeFragment, - makeVList: makeVList, - makeOrd: makeOrd, - makeVerb: makeVerb, - makeGlue: makeGlue, - staticSvg: staticSvg, - svgData: svgData, - tryCombineChars: tryCombineChars, - spacingFunctions: spacingFunctions -}); - -/***/ }), -/* 1 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_get_iterator__ = __webpack_require__(18); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_get_iterator___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_get_iterator__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_classCallCheck__ = __webpack_require__(7); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_classCallCheck___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_classCallCheck__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_createClass__ = __webpack_require__(10); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_createClass___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_createClass__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__utils__ = __webpack_require__(5); - - - - -/** - * These objects store data about MathML nodes. This is the MathML equivalent - * of the types in domTree.js. Since MathML handles its own rendering, and - * since we're mainly using MathML to improve accessibility, we don't manage - * any of the styling state that the plain DOM nodes do. - * - * The `toNode` and `toMarkup` functions work simlarly to how they do in - * domTree.js, creating namespaced DOM nodes and HTML text markup respectively. - */ - - - -/** - * MathML node types used in KaTeX. For a complete list of MathML nodes, see - * https://developer.mozilla.org/en-US/docs/Web/MathML/Element. - */ - -/** - * This node represents a general purpose MathML node of any type. The - * constructor requires the type of node to create (for example, `"mo"` or - * `"mspace"`, corresponding to `` and `` tags). - */ -var MathNode = function () { - function MathNode(type, children) { - __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_classCallCheck___default()(this, MathNode); - - this.type = type; - this.attributes = {}; - this.children = children || []; - } - - /** - * Sets an attribute on a MathML node. MathML depends on attributes to convey a - * semantic content, so this is used heavily. - */ - - - __WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_createClass___default()(MathNode, [{ - key: "setAttribute", - value: function setAttribute(name, value) { - this.attributes[name] = value; - } - - /** - * Converts the math node into a MathML-namespaced DOM element. - */ - - }, { - key: "toNode", - value: function toNode() { - var node = document.createElementNS("http://www.w3.org/1998/Math/MathML", this.type); - - for (var attr in this.attributes) { - if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) { - node.setAttribute(attr, this.attributes[attr]); - } - } - - var _iteratorNormalCompletion = true; - var _didIteratorError = false; - var _iteratorError = undefined; - - try { - for (var _iterator = __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_get_iterator___default()(this.children), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { - var child = _step.value; - - node.appendChild(child.toNode()); - } - } catch (err) { - _didIteratorError = true; - _iteratorError = err; - } finally { - try { - if (!_iteratorNormalCompletion && _iterator.return) { - _iterator.return(); - } - } finally { - if (_didIteratorError) { - throw _iteratorError; - } - } - } - - return node; - } - - /** - * Converts the math node into an HTML markup string. - */ - - }, { - key: "toMarkup", - value: function toMarkup() { - var markup = "<" + this.type; - - // Add the attributes - for (var attr in this.attributes) { - if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) { - markup += " " + attr + "=\""; - markup += __WEBPACK_IMPORTED_MODULE_3__utils__["a" /* default */].escape(this.attributes[attr]); - markup += "\""; - } - } - - markup += ">"; - - for (var i = 0; i < this.children.length; i++) { - markup += this.children[i].toMarkup(); - } - - markup += ""; - - return markup; - } - - /** - * Converts the math node into a string, similar to innerText. - */ - - }, { - key: "toText", - value: function toText() { - if (this.type === "mspace") { - if (this.attributes.width === "0.16667em") { - return "\u2006"; - } else { - // TODO: Use other space characters for different widths. - // https://github.com/Khan/KaTeX/issues/1036 - return " "; - } - } - return this.children.map(function (child) { - return child.toText(); - }).join(""); - } - }]); - - return MathNode; -}(); - -/** - * This node represents a piece of text. - */ - - -var TextNode = function () { - function TextNode(text) { - __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_classCallCheck___default()(this, TextNode); - - this.text = text; - } - - /** - * Converts the text node into a DOM text node. - */ - - - __WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_createClass___default()(TextNode, [{ - key: "toNode", - value: function toNode() { - return document.createTextNode(this.text); - } - - /** - * Converts the text node into HTML markup (which is just the text itself). - */ - - }, { - key: "toMarkup", - value: function toMarkup() { - return __WEBPACK_IMPORTED_MODULE_3__utils__["a" /* default */].escape(this.text); - } - - /** - * Converts the text node into a string (which is just the text iteself). - */ - - }, { - key: "toText", - value: function toText() { - return this.text; - } - }]); - - return TextNode; -}(); - -/* harmony default export */ __webpack_exports__["a"] = ({ - MathNode: MathNode, - TextNode: TextNode -}); - -/***/ }), -/* 2 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return makeText; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return groupTypes; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return buildExpression; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return buildGroup; }); -/* harmony export (immutable) */ __webpack_exports__["c"] = buildMathML; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__fontMetrics__ = __webpack_require__(30); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__mathMLTree__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__ParseError__ = __webpack_require__(6); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__Style__ = __webpack_require__(9); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__symbols__ = __webpack_require__(28); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__utils__ = __webpack_require__(5); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__stretchy__ = __webpack_require__(13); -/** - * WARNING: New methods on groupTypes should be added to src/functions. - * - * This file converts a parse tree into a cooresponding MathML tree. The main - * entry point is the `buildMathML` function, which takes a parse tree from the - * parser. - */ - - - - - - - - - - -/** - * Takes a symbol and converts it into a MathML text node after performing - * optional replacement from symbols.js. - */ -var makeText = function makeText(text, mode) { - if (__WEBPACK_IMPORTED_MODULE_5__symbols__["a" /* default */][mode][text] && __WEBPACK_IMPORTED_MODULE_5__symbols__["a" /* default */][mode][text].replace) { - text = __WEBPACK_IMPORTED_MODULE_5__symbols__["a" /* default */][mode][text].replace; - } - - return new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].TextNode(text); -}; - -/** - * Returns the math variant as a string or null if none is required. - */ -var getVariant = function getVariant(group, options) { - var font = options.fontFamily; - if (!font) { - return null; - } - - var mode = group.mode; - if (font === "mathit") { - return "italic"; - } else if (font === "boldsymbol") { - return "bold-italic"; - } - - var value = group.value; - if (__WEBPACK_IMPORTED_MODULE_6__utils__["a" /* default */].contains(["\\imath", "\\jmath"], value)) { - return null; - } - - if (__WEBPACK_IMPORTED_MODULE_5__symbols__["a" /* default */][mode][value] && __WEBPACK_IMPORTED_MODULE_5__symbols__["a" /* default */][mode][value].replace) { - value = __WEBPACK_IMPORTED_MODULE_5__symbols__["a" /* default */][mode][value].replace; - } - - var fontName = __WEBPACK_IMPORTED_MODULE_0__buildCommon__["a" /* default */].fontMap[font].fontName; - if (__WEBPACK_IMPORTED_MODULE_1__fontMetrics__["a" /* default */].getCharacterMetrics(value, fontName, mode)) { - return __WEBPACK_IMPORTED_MODULE_0__buildCommon__["a" /* default */].fontMap[font].variant; - } - - return null; -}; - -/** - * Functions for handling the different types of groups found in the parse - * tree. Each function should take a parse group and return a MathML node. - */ -var groupTypes = {}; - -var defaultVariant = { - "mi": "italic", - "mn": "normal", - "mtext": "normal" -}; - -groupTypes.mathord = function (group, options) { - var node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mi", [makeText(group.value, group.mode)]); - - var variant = getVariant(group, options) || "italic"; - if (variant !== defaultVariant[node.type]) { - node.setAttribute("mathvariant", variant); - } - return node; -}; - -groupTypes.textord = function (group, options) { - var text = makeText(group.value, group.mode); - - var variant = getVariant(group, options) || "normal"; - - var node = void 0; - if (group.mode === 'text') { - node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mtext", [text]); - } else if (/[0-9]/.test(group.value)) { - // TODO(kevinb) merge adjacent nodes - // do it as a post processing step - node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mn", [text]); - } else if (group.value === "\\prime") { - node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mo", [text]); - } else { - node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mi", [text]); - } - if (variant !== defaultVariant[node.type]) { - node.setAttribute("mathvariant", variant); - } - - return node; -}; - -groupTypes.bin = function (group, options) { - var node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mo", [makeText(group.value, group.mode)]); - - var variant = getVariant(group, options); - if (variant === "bold-italic") { - node.setAttribute("mathvariant", variant); - } - - return node; -}; - -groupTypes.rel = function (group) { - var node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mo", [makeText(group.value, group.mode)]); - - return node; -}; - -groupTypes.open = function (group) { - var node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mo", [makeText(group.value, group.mode)]); - - return node; -}; - -groupTypes.close = function (group) { - var node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mo", [makeText(group.value, group.mode)]); - - return node; -}; - -groupTypes.inner = function (group) { - var node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mo", [makeText(group.value, group.mode)]); - - return node; -}; - -groupTypes.punct = function (group) { - var node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mo", [makeText(group.value, group.mode)]); - - node.setAttribute("separator", "true"); - - return node; -}; - -groupTypes.ordgroup = function (group, options) { - var inner = buildExpression(group.value, options); - - var node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mrow", inner); - - return node; -}; - -groupTypes.supsub = function (group, options) { - // Is the inner group a relevant horizonal brace? - var isBrace = false; - var isOver = void 0; - var isSup = void 0; - if (group.value.base) { - if (group.value.base.value.type === "horizBrace") { - isSup = group.value.sup ? true : false; - if (isSup === group.value.base.value.isOver) { - isBrace = true; - isOver = group.value.base.value.isOver; - } - } - } - - var removeUnnecessaryRow = true; - var children = [buildGroup(group.value.base, options, removeUnnecessaryRow)]; - - if (group.value.sub) { - children.push(buildGroup(group.value.sub, options, removeUnnecessaryRow)); - } - - if (group.value.sup) { - children.push(buildGroup(group.value.sup, options, removeUnnecessaryRow)); - } - - var nodeType = void 0; - if (isBrace) { - nodeType = isOver ? "mover" : "munder"; - } else if (!group.value.sub) { - var base = group.value.base; - if (base && base.value.limits && options.style === __WEBPACK_IMPORTED_MODULE_4__Style__["a" /* default */].DISPLAY) { - nodeType = "mover"; - } else { - nodeType = "msup"; - } - } else if (!group.value.sup) { - var _base = group.value.base; - if (_base && _base.value.limits && options.style === __WEBPACK_IMPORTED_MODULE_4__Style__["a" /* default */].DISPLAY) { - nodeType = "munder"; - } else { - nodeType = "msub"; - } - } else { - var _base2 = group.value.base; - if (_base2 && _base2.value.limits && options.style === __WEBPACK_IMPORTED_MODULE_4__Style__["a" /* default */].DISPLAY) { - nodeType = "munderover"; - } else { - nodeType = "msubsup"; - } - } - - var node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode(nodeType, children); - - return node; -}; - -groupTypes.spacing = function (group) { - var node = void 0; - - if (group.value === "\\ " || group.value === "\\space" || group.value === " " || group.value === "~") { - node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mtext", [new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].TextNode("\xA0")]); - } else { - node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mspace"); - - node.setAttribute("width", __WEBPACK_IMPORTED_MODULE_0__buildCommon__["a" /* default */].spacingFunctions[group.value].size); - } - - return node; -}; - -groupTypes.horizBrace = function (group, options) { - var accentNode = __WEBPACK_IMPORTED_MODULE_7__stretchy__["a" /* default */].mathMLnode(group.value.label); - return new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode(group.value.isOver ? "mover" : "munder", [buildGroup(group.value.base, options), accentNode]); -}; - -groupTypes.xArrow = function (group, options) { - var arrowNode = __WEBPACK_IMPORTED_MODULE_7__stretchy__["a" /* default */].mathMLnode(group.value.label); - var node = void 0; - var lowerNode = void 0; - - if (group.value.body) { - var upperNode = buildGroup(group.value.body, options); - if (group.value.below) { - lowerNode = buildGroup(group.value.below, options); - node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("munderover", [arrowNode, lowerNode, upperNode]); - } else { - node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mover", [arrowNode, upperNode]); - } - } else if (group.value.below) { - lowerNode = buildGroup(group.value.below, options); - node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("munder", [arrowNode, lowerNode]); - } else { - node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mover", [arrowNode]); - } - return node; -}; - -groupTypes.mclass = function (group, options) { - var inner = buildExpression(group.value.value, options); - return new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mstyle", inner); -}; - -groupTypes.raisebox = function (group, options) { - var node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mpadded", [buildGroup(group.value.body, options)]); - var dy = group.value.dy.value.number + group.value.dy.value.unit; - node.setAttribute("voffset", dy); - return node; -}; - -/** - * Takes a list of nodes, builds them, and returns a list of the generated - * MathML nodes. A little simpler than the HTML version because we don't do any - * previous-node handling. - */ -var buildExpression = function buildExpression(expression, options) { - var groups = []; - for (var i = 0; i < expression.length; i++) { - var group = expression[i]; - groups.push(buildGroup(group, options)); - } - - // TODO(kevinb): combine \\not with mrels and mords - - return groups; -}; - -/** - * Takes a group from the parser and calls the appropriate groupTypes function - * on it to produce a MathML node. - */ -var buildGroup = function buildGroup(group, options) { - var removeUnnecessaryRow = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - - if (!group) { - return new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mrow"); - } - - if (groupTypes[group.type]) { - // Call the groupTypes function - var result = groupTypes[group.type](group, options); - if (removeUnnecessaryRow) { - if (result.type === "mrow" && result.children.length === 1) { - return result.children[0]; - } - } - return result; - } else { - throw new __WEBPACK_IMPORTED_MODULE_3__ParseError__["a" /* default */]("Got group of unknown type: '" + group.type + "'"); - } -}; - -/** - * Takes a full parse tree and settings and builds a MathML representation of - * it. In particular, we put the elements from building the parse tree into a - * tag so we can also include that TeX source as an annotation. - * - * Note that we actually return a domTree element with a `` inside it so - * we can do appropriate styling. - */ -function buildMathML(tree, texExpression, options) { - var expression = buildExpression(tree, options); - - // Wrap up the expression in an mrow so it is presented in the semantics - // tag correctly. - var wrapper = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mrow", expression); - - // Build a TeX annotation of the source - var annotation = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("annotation", [new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].TextNode(texExpression)]); - - annotation.setAttribute("encoding", "application/x-tex"); - - var semantics = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("semantics", [wrapper, annotation]); - - var math = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("math", [semantics]); - - // You can't style nodes, so we wrap the node in a span. - return __WEBPACK_IMPORTED_MODULE_0__buildCommon__["a" /* default */].makeSpan(["katex-mathml"], [math]); -} - -/***/ }), -/* 3 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return _functions; }); -/* harmony export (immutable) */ __webpack_exports__["b"] = defineFunction; -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return ordargument; }); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__buildHTML__ = __webpack_require__(4); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__buildMathML__ = __webpack_require__(2); - - - -/** Context provided to function handlers for error messages. */ - - -// TODO: Enumerate all allowed output types. - - -/** - * Final function spec for use at parse time. - * This is almost identical to `FunctionPropSpec`, except it - * 1. includes the function handler, and - * 2. requires all arguments except argTypes. - * It is generated by `defineFunction()` below. - */ - - -/** - * All registered functions. - * `functions.js` just exports this same dictionary again and makes it public. - * `Parser.js` requires this dictionary. - */ -var _functions = {}; - -function defineFunction(_ref) { - var type = _ref.type, - names = _ref.names, - props = _ref.props, - handler = _ref.handler, - htmlBuilder = _ref.htmlBuilder, - mathmlBuilder = _ref.mathmlBuilder; - - // Set default values of functions - var data = { - numArgs: props.numArgs, - argTypes: props.argTypes, - greediness: props.greediness === undefined ? 1 : props.greediness, - allowedInText: !!props.allowedInText, - allowedInMath: props.allowedInMath === undefined ? true : props.allowedInMath, - numOptionalArgs: props.numOptionalArgs || 0, - infix: !!props.infix, - handler: handler - }; - for (var i = 0; i < names.length; ++i) { - _functions[names[i]] = data; - } - if (type) { - if (htmlBuilder) { - __WEBPACK_IMPORTED_MODULE_0__buildHTML__["d" /* groupTypes */][type] = htmlBuilder; - } - if (mathmlBuilder) { - __WEBPACK_IMPORTED_MODULE_1__buildMathML__["d" /* groupTypes */][type] = mathmlBuilder; - } - } -} - -// Since the corresponding buildHTML/buildMathML function expects a -// list of elements, we normalize for different kinds of arguments -var ordargument = function ordargument(arg) { - if (arg.type === "ordgroup") { - return arg.value; - } else { - return [arg]; - } -}; - -/***/ }), -/* 4 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return buildExpression; }); -/* unused harmony export getTypeOfDomTree */ -/* unused harmony export isLeftTight */ -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return makeNullDelimiter; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return groupTypes; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return buildGroup; }); -/* harmony export (immutable) */ __webpack_exports__["c"] = buildHTML; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_json_stringify__ = __webpack_require__(77); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_json_stringify___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_json_stringify__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_toConsumableArray__ = __webpack_require__(35); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_toConsumableArray___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_toConsumableArray__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__ParseError__ = __webpack_require__(6); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Style__ = __webpack_require__(9); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__domTree__ = __webpack_require__(12); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__units__ = __webpack_require__(19); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__utils__ = __webpack_require__(5); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__stretchy__ = __webpack_require__(13); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__spacingData__ = __webpack_require__(112); - - -/** - * WARNING: New methods on groupTypes should be added to src/functions. - * - * This file does the main work of building a domTree structure from a parse - * tree. The entry point is the `buildHTML` function, which takes a parse tree. - * Then, the buildExpression, buildGroup, and various groupTypes functions are - * called, to produce a final HTML tree. - */ - - - - - - - - - - - -var makeSpan = __WEBPACK_IMPORTED_MODULE_4__buildCommon__["a" /* default */].makeSpan; - -// Binary atoms (first class `mbin`) change into ordinary atoms (`mord`) -// depending on their surroundings. See TeXbook pg. 442-446, Rules 5 and 6, -// and the text before Rule 19. -var isBinLeftCanceller = function isBinLeftCanceller(node, isRealGroup) { - // TODO: This code assumes that a node's math class is the first element - // of its `classes` array. A later cleanup should ensure this, for - // instance by changing the signature of `makeSpan`. - if (node) { - return __WEBPACK_IMPORTED_MODULE_7__utils__["a" /* default */].contains(["mbin", "mopen", "mrel", "mop", "mpunct"], getTypeOfDomTree(node, "right")); - } else { - return isRealGroup; - } -}; - -var isBinRightCanceller = function isBinRightCanceller(node, isRealGroup) { - if (node) { - return __WEBPACK_IMPORTED_MODULE_7__utils__["a" /* default */].contains(["mrel", "mclose", "mpunct"], getTypeOfDomTree(node, "left")); - } else { - return isRealGroup; - } -}; - -var styleMap = { - "display": __WEBPACK_IMPORTED_MODULE_3__Style__["a" /* default */].DISPLAY, - "text": __WEBPACK_IMPORTED_MODULE_3__Style__["a" /* default */].TEXT, - "script": __WEBPACK_IMPORTED_MODULE_3__Style__["a" /* default */].SCRIPT, - "scriptscript": __WEBPACK_IMPORTED_MODULE_3__Style__["a" /* default */].SCRIPTSCRIPT -}; - -/** - * Take a list of nodes, build them in order, and return a list of the built - * nodes. documentFragments are flattened into their contents, so the - * returned list contains no fragments. `isRealGroup` is true if `expression` - * is a real group (no atoms will be added on either side), as opposed to - * a partial group (e.g. one created by \color). `surrounding` is an array - * consisting type of nodes that will be added to the left and right. - */ -var buildExpression = function buildExpression(expression, options, isRealGroup) { - var surrounding = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [null, null]; - - // Parse expressions into `groups`. - var rawGroups = []; - for (var i = 0; i < expression.length; i++) { - var group = expression[i]; - var output = buildGroup(group, options); - if (output instanceof __WEBPACK_IMPORTED_MODULE_5__domTree__["a" /* default */].documentFragment) { - rawGroups.push.apply(rawGroups, __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_toConsumableArray___default()(output.children)); - } else { - rawGroups.push(output); - } - } - // At this point `rawGroups` consists entirely of `symbolNode`s and `span`s. - - // Ignore explicit spaces (e.g., \;, \,) when determining what implicit - // spacing should go between atoms of different classes, and add dummy - // spans for determining spacings between surrounding atoms - var nonSpaces = [surrounding[0] && makeSpan([surrounding[0]], [], options)].concat(__WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_toConsumableArray___default()(rawGroups.filter(function (group) { - return group && group.classes[0] !== "mspace"; - })), [surrounding[1] && makeSpan([surrounding[1]], [], options)]); - - // Before determining what spaces to insert, perform bin cancellation. - // Binary operators change to ordinary symbols in some contexts. - for (var _i = 1; _i < nonSpaces.length - 1; _i++) { - var left = getOutermostNode(nonSpaces[_i], "left"); - if (left.classes[0] === "mbin" && isBinLeftCanceller(nonSpaces[_i - 1], isRealGroup)) { - left.classes[0] = "mord"; - } - - var right = getOutermostNode(nonSpaces[_i], "right"); - if (right.classes[0] === "mbin" && isBinRightCanceller(nonSpaces[_i + 1], isRealGroup)) { - right.classes[0] = "mord"; - } - } - - var groups = []; - var j = 0; - for (var _i2 = 0; _i2 < rawGroups.length; _i2++) { - groups.push(rawGroups[_i2]); - - // For any group that is not a space, get the next non-space. Then - // lookup what implicit space should be placed between those atoms and - // add it to groups. - if (rawGroups[_i2].classes[0] !== "mspace" && j < nonSpaces.length - 1) { - // if current non-space node is left dummy span, add a glue before - // first real non-space node - if (j === 0) { - groups.pop(); - _i2--; - } - - // Get the type of the current non-space node. If it's a document - // fragment, get the type of the rightmost node in the fragment. - var _left = getTypeOfDomTree(nonSpaces[j], "right"); - - // Get the type of the next non-space node. If it's a document - // fragment, get the type of the leftmost node in the fragment. - var _right = getTypeOfDomTree(nonSpaces[j + 1], "left"); - - // We use buildExpression inside of sizingGroup, but it returns a - // document fragment of elements. sizingGroup sets `isRealGroup` - // to false to avoid processing spans multiple times. - if (_left && _right && isRealGroup) { - var space = isLeftTight(nonSpaces[j + 1]) ? __WEBPACK_IMPORTED_MODULE_9__spacingData__["b" /* tightSpacings */][_left][_right] : __WEBPACK_IMPORTED_MODULE_9__spacingData__["a" /* spacings */][_left][_right]; - - if (space) { - var glueOptions = options; - - if (expression.length === 1) { - if (expression[0].type === "sizing") { - glueOptions = options.havingSize(expression[0].value.size); - } else if (expression[0].type === "styling") { - glueOptions = options.havingStyle(styleMap[expression[0].value.style]); - } - } - - groups.push(__WEBPACK_IMPORTED_MODULE_4__buildCommon__["a" /* default */].makeGlue(space, glueOptions)); - } - } - j++; - } - } - - // Process \\not commands within the group. - for (var _i3 = 0; _i3 < groups.length; _i3++) { - if (groups[_i3].value === "\u0338") { - groups[_i3].style.position = "absolute"; - // TODO(kevinb) fix this for Safari by switching to a non-combining - // character for \not. - // This value was determined empirically. - // TODO(kevinb) figure out the real math for this value. - groups[_i3].style.paddingLeft = "0.8em"; - } - } - - return groups; -}; - -// Return the outermost node of a domTree. -var getOutermostNode = function getOutermostNode(node) { - var side = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "right"; - - if (node instanceof __WEBPACK_IMPORTED_MODULE_5__domTree__["a" /* default */].documentFragment || node instanceof __WEBPACK_IMPORTED_MODULE_5__domTree__["a" /* default */].anchor) { - if (node.children.length) { - if (side === "right") { - return getOutermostNode(node.children[node.children.length - 1]); - } else if (side === "left") { - return getOutermostNode(node.children[0]); - } - } - } - return node; -}; - -// Return math atom class (mclass) of a domTree. -var getTypeOfDomTree = function getTypeOfDomTree(node) { - var side = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "right"; - - if (!node) { - return null; - } - - node = getOutermostNode(node, side); - // This makes a lot of assumptions as to where the type of atom - // appears. We should do a better job of enforcing this. - if (__WEBPACK_IMPORTED_MODULE_7__utils__["a" /* default */].contains(["mord", "mop", "mbin", "mrel", "mopen", "mclose", "mpunct", "minner"], node.classes[0])) { - return node.classes[0]; - } - return null; -}; - -// If `node` is an atom return whether it's been assigned the mtight class. -// If `node` is a document fragment, return the value of isLeftTight() for the -// leftmost node in the fragment. -// 'mtight' indicates that the node is script or scriptscript style. -var isLeftTight = function isLeftTight(node) { - node = getOutermostNode(node, "left"); - return __WEBPACK_IMPORTED_MODULE_7__utils__["a" /* default */].contains(node.classes, "mtight"); -}; - -/** - * Sometimes, groups perform special rules when they have superscripts or - * subscripts attached to them. This function lets the `supsub` group know that - * its inner element should handle the superscripts and subscripts instead of - * handling them itself. - */ -var shouldHandleSupSub = function shouldHandleSupSub(group, options) { - if (!group.value.base) { - return false; - } else { - var base = group.value.base; - if (base.type === "op") { - // Operators handle supsubs differently when they have limits - // (e.g. `\displaystyle\sum_2^3`) - return base.value.limits && (options.style.size === __WEBPACK_IMPORTED_MODULE_3__Style__["a" /* default */].DISPLAY.size || base.value.alwaysHandleSupSub); - } else if (base.type === "accent") { - return __WEBPACK_IMPORTED_MODULE_7__utils__["a" /* default */].isCharacterBox(base.value.base); - } else if (base.type === "horizBrace") { - var isSup = group.value.sub ? false : true; - return isSup === base.value.isOver; - } else { - return null; - } - } -}; - -var makeNullDelimiter = function makeNullDelimiter(options, classes) { - var moreClasses = ["nulldelimiter"].concat(options.baseSizingClasses()); - return makeSpan(classes.concat(moreClasses)); -}; - -/** - * This is a map of group types to the function used to handle that type. - * Simpler types come at the beginning, while complicated types come afterwards. - */ -var groupTypes = {}; - -groupTypes.mathord = function (group, options) { - return __WEBPACK_IMPORTED_MODULE_4__buildCommon__["a" /* default */].makeOrd(group, options, "mathord"); -}; - -groupTypes.textord = function (group, options) { - return __WEBPACK_IMPORTED_MODULE_4__buildCommon__["a" /* default */].makeOrd(group, options, "textord"); -}; - -groupTypes.bin = function (group, options) { - return __WEBPACK_IMPORTED_MODULE_4__buildCommon__["a" /* default */].mathsym(group.value, group.mode, options, ["mbin"]); -}; - -groupTypes.rel = function (group, options) { - return __WEBPACK_IMPORTED_MODULE_4__buildCommon__["a" /* default */].mathsym(group.value, group.mode, options, ["mrel"]); -}; - -groupTypes.open = function (group, options) { - return __WEBPACK_IMPORTED_MODULE_4__buildCommon__["a" /* default */].mathsym(group.value, group.mode, options, ["mopen"]); -}; - -groupTypes.close = function (group, options) { - return __WEBPACK_IMPORTED_MODULE_4__buildCommon__["a" /* default */].mathsym(group.value, group.mode, options, ["mclose"]); -}; - -groupTypes.inner = function (group, options) { - return __WEBPACK_IMPORTED_MODULE_4__buildCommon__["a" /* default */].mathsym(group.value, group.mode, options, ["minner"]); -}; - -groupTypes.punct = function (group, options) { - return __WEBPACK_IMPORTED_MODULE_4__buildCommon__["a" /* default */].mathsym(group.value, group.mode, options, ["mpunct"]); -}; - -groupTypes.ordgroup = function (group, options) { - return makeSpan(["mord"], buildExpression(group.value, options, true), options); -}; - -groupTypes.supsub = function (group, options) { - // Superscript and subscripts are handled in the TeXbook on page - // 445-446, rules 18(a-f). - - // Here is where we defer to the inner group if it should handle - // superscripts and subscripts itself. - if (shouldHandleSupSub(group, options)) { - return groupTypes[group.value.base.type](group, options); - } - - var base = buildGroup(group.value.base, options); - var supm = void 0; - var subm = void 0; - - var metrics = options.fontMetrics(); - var newOptions = void 0; - - // Rule 18a - var supShift = 0; - var subShift = 0; - - if (group.value.sup) { - newOptions = options.havingStyle(options.style.sup()); - supm = buildGroup(group.value.sup, newOptions, options); - if (!__WEBPACK_IMPORTED_MODULE_7__utils__["a" /* default */].isCharacterBox(group.value.base)) { - supShift = base.height - newOptions.fontMetrics().supDrop * newOptions.sizeMultiplier / options.sizeMultiplier; - } - } - - if (group.value.sub) { - newOptions = options.havingStyle(options.style.sub()); - subm = buildGroup(group.value.sub, newOptions, options); - if (!__WEBPACK_IMPORTED_MODULE_7__utils__["a" /* default */].isCharacterBox(group.value.base)) { - subShift = base.depth + newOptions.fontMetrics().subDrop * newOptions.sizeMultiplier / options.sizeMultiplier; - } - } - - // Rule 18c - var minSupShift = void 0; - if (options.style === __WEBPACK_IMPORTED_MODULE_3__Style__["a" /* default */].DISPLAY) { - minSupShift = metrics.sup1; - } else if (options.style.cramped) { - minSupShift = metrics.sup3; - } else { - minSupShift = metrics.sup2; - } - - // scriptspace is a font-size-independent size, so scale it - // appropriately - var multiplier = options.sizeMultiplier; - var scriptspace = 0.5 / metrics.ptPerEm / multiplier + "em"; - - var supsub = void 0; - if (!group.value.sup) { - // Rule 18b - subShift = Math.max(subShift, metrics.sub1, subm.height - 0.8 * metrics.xHeight); - - var vlistElem = [{ type: "elem", elem: subm, marginRight: scriptspace }]; - // Subscripts shouldn't be shifted by the base's italic correction. - // Account for that by shifting the subscript back the appropriate - // amount. Note we only do this when the base is a single symbol. - if (base instanceof __WEBPACK_IMPORTED_MODULE_5__domTree__["a" /* default */].symbolNode) { - vlistElem[0].marginLeft = -base.italic + "em"; - } - - supsub = __WEBPACK_IMPORTED_MODULE_4__buildCommon__["a" /* default */].makeVList({ - positionType: "shift", - positionData: subShift, - children: vlistElem - }, options); - } else if (!group.value.sub) { - // Rule 18c, d - supShift = Math.max(supShift, minSupShift, supm.depth + 0.25 * metrics.xHeight); - - supsub = __WEBPACK_IMPORTED_MODULE_4__buildCommon__["a" /* default */].makeVList({ - positionType: "shift", - positionData: -supShift, - children: [{ type: "elem", elem: supm, marginRight: scriptspace }] - }, options); - } else { - supShift = Math.max(supShift, minSupShift, supm.depth + 0.25 * metrics.xHeight); - subShift = Math.max(subShift, metrics.sub2); - - var ruleWidth = metrics.defaultRuleThickness; - - // Rule 18e - if (supShift - supm.depth - (subm.height - subShift) < 4 * ruleWidth) { - subShift = 4 * ruleWidth - (supShift - supm.depth) + subm.height; - var psi = 0.8 * metrics.xHeight - (supShift - supm.depth); - if (psi > 0) { - supShift += psi; - subShift -= psi; - } - } - - var _vlistElem = [{ type: "elem", elem: subm, shift: subShift, marginRight: scriptspace }, { type: "elem", elem: supm, shift: -supShift, marginRight: scriptspace }]; - // See comment above about subscripts not being shifted - if (base instanceof __WEBPACK_IMPORTED_MODULE_5__domTree__["a" /* default */].symbolNode) { - _vlistElem[0].marginLeft = -base.italic + "em"; - } - - supsub = __WEBPACK_IMPORTED_MODULE_4__buildCommon__["a" /* default */].makeVList({ - positionType: "individualShift", - children: _vlistElem - }, options); - } - - // We ensure to wrap the supsub vlist in a span.msupsub to reset text-align - var mclass = getTypeOfDomTree(base) || "mord"; - return makeSpan([mclass], [base, makeSpan(["msupsub"], [supsub])], options); -}; - -groupTypes.spacing = function (group, options) { - if (group.value === "\\ " || group.value === "\\space" || group.value === " " || group.value === "~") { - // Spaces are generated by adding an actual space. Each of these - // things has an entry in the symbols table, so these will be turned - // into appropriate outputs. - if (group.mode === "text") { - return __WEBPACK_IMPORTED_MODULE_4__buildCommon__["a" /* default */].makeOrd(group, options, "textord"); - } else { - return makeSpan(["mspace"], [__WEBPACK_IMPORTED_MODULE_4__buildCommon__["a" /* default */].mathsym(group.value, group.mode, options)], options); - } - } else { - // Other kinds of spaces are of arbitrary width. We use CSS to - // generate these. - return makeSpan(["mspace", __WEBPACK_IMPORTED_MODULE_4__buildCommon__["a" /* default */].spacingFunctions[group.value].className], [], options); - } -}; - -groupTypes.horizBrace = function (group, options) { - var style = options.style; - - var hasSupSub = group.type === "supsub"; - var supSubGroup = void 0; - var newOptions = void 0; - if (hasSupSub) { - // Ref: LaTeX source2e: }}}}\limits} - // i.e. LaTeX treats the brace similar to an op and passes it - // with \limits, so we need to assign supsub style. - if (group.value.sup) { - newOptions = options.havingStyle(style.sup()); - supSubGroup = buildGroup(group.value.sup, newOptions, options); - } else { - newOptions = options.havingStyle(style.sub()); - supSubGroup = buildGroup(group.value.sub, newOptions, options); - } - group = group.value.base; - } - - // Build the base group - var body = buildGroup(group.value.base, options.havingBaseStyle(__WEBPACK_IMPORTED_MODULE_3__Style__["a" /* default */].DISPLAY)); - - // Create the stretchy element - var braceBody = __WEBPACK_IMPORTED_MODULE_8__stretchy__["a" /* default */].svgSpan(group, options); - - // Generate the vlist, with the appropriate kerns ┏━━━━━━━━┓ - // This first vlist contains the subject matter and the brace: equation - var vlist = void 0; - if (group.value.isOver) { - vlist = __WEBPACK_IMPORTED_MODULE_4__buildCommon__["a" /* default */].makeVList({ - positionType: "firstBaseline", - children: [{ type: "elem", elem: body }, { type: "kern", size: 0.1 }, { type: "elem", elem: braceBody }] - }, options); - vlist.children[0].children[0].children[1].classes.push("svg-align"); - } else { - vlist = __WEBPACK_IMPORTED_MODULE_4__buildCommon__["a" /* default */].makeVList({ - positionType: "bottom", - positionData: body.depth + 0.1 + braceBody.height, - children: [{ type: "elem", elem: braceBody }, { type: "kern", size: 0.1 }, { type: "elem", elem: body }] - }, options); - vlist.children[0].children[0].children[0].classes.push("svg-align"); - } - - if (hasSupSub) { - // In order to write the supsub, wrap the first vlist in another vlist: - // They can't all go in the same vlist, because the note might be wider - // than the equation. We want the equation to control the brace width. - - // note long note long note - // ┏━━━━━━━━┓ or ┏━━━┓ not ┏━━━━━━━━━┓ - // equation eqn eqn - - var vSpan = makeSpan(["mord", group.value.isOver ? "mover" : "munder"], [vlist], options); - - if (group.value.isOver) { - vlist = __WEBPACK_IMPORTED_MODULE_4__buildCommon__["a" /* default */].makeVList({ - positionType: "firstBaseline", - children: [{ type: "elem", elem: vSpan }, { type: "kern", size: 0.2 }, { type: "elem", elem: supSubGroup }] - }, options); - } else { - vlist = __WEBPACK_IMPORTED_MODULE_4__buildCommon__["a" /* default */].makeVList({ - positionType: "bottom", - positionData: vSpan.depth + 0.2 + supSubGroup.height, - children: [{ type: "elem", elem: supSubGroup }, { type: "kern", size: 0.2 }, { type: "elem", elem: vSpan }] - }, options); - } - } - - return makeSpan(["mord", group.value.isOver ? "mover" : "munder"], [vlist], options); -}; - -groupTypes.xArrow = function (group, options) { - var style = options.style; - - // Build the argument groups in the appropriate style. - // Ref: amsmath.dtx: \hbox{$\scriptstyle\mkern#3mu{#6}\mkern#4mu$}% - - var newOptions = options.havingStyle(style.sup()); - var upperGroup = buildGroup(group.value.body, newOptions, options); - upperGroup.classes.push("x-arrow-pad"); - - var lowerGroup = void 0; - if (group.value.below) { - // Build the lower group - newOptions = options.havingStyle(style.sub()); - lowerGroup = buildGroup(group.value.below, newOptions, options); - lowerGroup.classes.push("x-arrow-pad"); - } - - var arrowBody = __WEBPACK_IMPORTED_MODULE_8__stretchy__["a" /* default */].svgSpan(group, options); - - // Re shift: Note that stretchy.svgSpan returned arrowBody.depth = 0. - // The point we want on the math axis is at 0.5 * arrowBody.height. - var arrowShift = -options.fontMetrics().axisHeight + 0.5 * arrowBody.height; - // 2 mu kern. Ref: amsmath.dtx: #7\if0#2\else\mkern#2mu\fi - var upperShift = -options.fontMetrics().axisHeight - 0.5 * arrowBody.height - 0.111; - if (group.value.label === "\\xleftequilibrium") { - upperShift -= upperGroup.depth; - } - - // Generate the vlist - var vlist = void 0; - if (group.value.below) { - var lowerShift = -options.fontMetrics().axisHeight + lowerGroup.height + 0.5 * arrowBody.height + 0.111; - vlist = __WEBPACK_IMPORTED_MODULE_4__buildCommon__["a" /* default */].makeVList({ - positionType: "individualShift", - children: [{ type: "elem", elem: upperGroup, shift: upperShift }, { type: "elem", elem: arrowBody, shift: arrowShift }, { type: "elem", elem: lowerGroup, shift: lowerShift }] - }, options); - } else { - vlist = __WEBPACK_IMPORTED_MODULE_4__buildCommon__["a" /* default */].makeVList({ - positionType: "individualShift", - children: [{ type: "elem", elem: upperGroup, shift: upperShift }, { type: "elem", elem: arrowBody, shift: arrowShift }] - }, options); - } - - vlist.children[0].children[0].children[1].classes.push("svg-align"); - - return makeSpan(["mrel", "x-arrow"], [vlist], options); -}; - -groupTypes.mclass = function (group, options) { - var elements = buildExpression(group.value.value, options, true); - - return makeSpan([group.value.mclass], elements, options); -}; - -groupTypes.raisebox = function (group, options) { - var body = groupTypes.sizing({ value: { - value: [{ - type: "text", - value: { - body: group.value.value, - font: "mathrm" // simulate \textrm - } - }], - size: 6 // simulate \normalsize - } }, options); - var dy = Object(__WEBPACK_IMPORTED_MODULE_6__units__["a" /* calculateSize */])(group.value.dy.value, options); - return __WEBPACK_IMPORTED_MODULE_4__buildCommon__["a" /* default */].makeVList({ - positionType: "shift", - positionData: -dy, - children: [{ type: "elem", elem: body }] - }, options); -}; - -/** - * buildGroup is the function that takes a group and calls the correct groupType - * function for it. It also handles the interaction of size and style changes - * between parents and children. - */ -var buildGroup = function buildGroup(group, options, baseOptions) { - if (!group) { - return makeSpan(); - } - - if (groupTypes[group.type]) { - // Call the groupTypes function - var groupNode = groupTypes[group.type](group, options); - - // If the size changed between the parent and the current group, account - // for that size difference. - if (baseOptions && options.size !== baseOptions.size) { - groupNode = makeSpan(options.sizingClasses(baseOptions), [groupNode], options); - - var multiplier = options.sizeMultiplier / baseOptions.sizeMultiplier; - - groupNode.height *= multiplier; - groupNode.depth *= multiplier; - } - - return groupNode; - } else { - throw new __WEBPACK_IMPORTED_MODULE_2__ParseError__["a" /* default */]("Got group of unknown type: '" + group.type + "'"); - } -}; - -/** - * Take an entire parse tree, and build it into an appropriate set of HTML - * nodes. - */ -function buildHTML(tree, options) { - // buildExpression is destructive, so we need to make a clone - // of the incoming tree so that it isn't accidentally changed - tree = JSON.parse(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_json_stringify___default()(tree)); - - // Build the expression contained in the tree - var expression = buildExpression(tree, options, true); - var body = makeSpan(["base"], expression, options); - - // Add struts, which ensure that the top of the HTML element falls at the - // height of the expression, and the bottom of the HTML element falls at the - // depth of the expression. - var topStrut = makeSpan(["strut"]); - var bottomStrut = makeSpan(["strut", "bottom"]); - - topStrut.style.height = body.height + "em"; - bottomStrut.style.height = body.height + body.depth + "em"; - // We'd like to use `vertical-align: top` but in IE 9 this lowers the - // baseline of the box to the bottom of this strut (instead staying in the - // normal place) so we use an absolute value for vertical-align instead - bottomStrut.style.verticalAlign = -body.depth + "em"; - - // Wrap the struts and body together - var htmlNode = makeSpan(["katex-html"], [topStrut, bottomStrut, body]); - - htmlNode.setAttribute("aria-hidden", "true"); - - return htmlNode; -} - -/***/ }), -/* 5 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; - -/** - * This file contains a list of utility functions which are useful in other - * files. - */ - -/** - * Provide an `indexOf` function which works in IE8, but defers to native if - * possible. - */ -var nativeIndexOf = Array.prototype.indexOf; -var indexOf = function indexOf(list, elem) { - if (list == null) { - return -1; - } - if (nativeIndexOf && list.indexOf === nativeIndexOf) { - return list.indexOf(elem); - } - var l = list.length; - for (var i = 0; i < l; i++) { - if (list[i] === elem) { - return i; - } - } - return -1; -}; - -/** - * Return whether an element is contained in a list - */ -var contains = function contains(list, elem) { - return indexOf(list, elem) !== -1; -}; - -/** - * Provide a default value if a setting is undefined - * NOTE: Couldn't use `T` as the output type due to facebook/flow#5022. - */ -var deflt = function deflt(setting, defaultIfUndefined) { - return setting === undefined ? defaultIfUndefined : setting; -}; - -// hyphenate and escape adapted from Facebook's React under Apache 2 license - -var uppercase = /([A-Z])/g; -var hyphenate = function hyphenate(str) { - return str.replace(uppercase, "-$1").toLowerCase(); -}; - -var ESCAPE_LOOKUP = { - "&": "&", - ">": ">", - "<": "<", - "\"": """, - "'": "'" -}; - -var ESCAPE_REGEX = /[&><"']/g; - -/** - * Escapes text to prevent scripting attacks. - */ -function escape(text) { - return String(text).replace(ESCAPE_REGEX, function (match) { - return ESCAPE_LOOKUP[match]; - }); -} - -/** - * A function to set the text content of a DOM element in all supported - * browsers. Note that we don't define this if there is no document. - */ -var setTextContent = void 0; -if (typeof document !== "undefined") { - var testNode = document.createElement("span"); - if ("textContent" in testNode) { - setTextContent = function setTextContent(node, text) { - node.textContent = text; - }; - } else { - setTextContent = function setTextContent(node, text) { - node.innerText = text; - }; - } -} - -/** - * A function to clear a node. - */ -function clearNode(node) { - setTextContent(node, ""); -} - -/** - * Sometimes we want to pull out the innermost element of a group. In most - * cases, this will just be the group itself, but when ordgroups and colors have - * a single element, we want to pull that out. - */ -var getBaseElem = function getBaseElem(group) { - if (!group) { - return false; - } else if (group.type === "ordgroup") { - if (group.value.length === 1) { - return getBaseElem(group.value[0]); - } else { - return group; - } - } else if (group.type === "color") { - if (group.value.value.length === 1) { - return getBaseElem(group.value.value[0]); - } else { - return group; - } - } else if (group.type === "font") { - return getBaseElem(group.value.body); - } else { - return group; - } -}; - -/** - * TeXbook algorithms often reference "character boxes", which are simply groups - * with a single character in them. To decide if something is a character box, - * we find its innermost group, and see if it is a single character. - */ -var isCharacterBox = function isCharacterBox(group) { - var baseElem = getBaseElem(group); - - // These are all they types of groups which hold single characters - return baseElem.type === "mathord" || baseElem.type === "textord" || baseElem.type === "bin" || baseElem.type === "rel" || baseElem.type === "inner" || baseElem.type === "open" || baseElem.type === "close" || baseElem.type === "punct"; -}; - -/* harmony default export */ __webpack_exports__["a"] = ({ - contains: contains, - deflt: deflt, - escape: escape, - hyphenate: hyphenate, - indexOf: indexOf, - setTextContent: setTextContent, - clearNode: clearNode, - getBaseElem: getBaseElem, - isCharacterBox: isCharacterBox -}); - -/***/ }), -/* 6 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck__ = __webpack_require__(7); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__ParseNode__ = __webpack_require__(14); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Token__ = __webpack_require__(27); - - - - -/** - * This is the ParseError class, which is the main error thrown by KaTeX - * functions when something has gone wrong. This is used to distinguish internal - * errors from errors in the expression that the user provided. - * - * If possible, a caller should provide a Token or ParseNode with information - * about where in the source string the problem occurred. - */ - -var ParseError = -// Error position based on passed-in Token or ParseNode. - -function ParseError(message, // The error message -token) // An object providing position information -{ - __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck___default()(this, ParseError); - - var error = "KaTeX parse error: " + message; - var start = void 0; - - var loc = token && token.loc; - if (loc && loc.start <= loc.end) { - // If we have the input and a position, make the error a bit fancier - - // Get the input - var input = loc.lexer.input; - - // Prepend some information - start = loc.start; - var end = loc.end; - if (start === input.length) { - error += " at end of input: "; - } else { - error += " at position " + (start + 1) + ": "; - } - - // Underline token in question using combining underscores - var underlined = input.slice(start, end).replace(/[^]/g, "$&\u0332"); - - // Extract some context from the input and add it to the error - var left = void 0; - if (start > 15) { - left = "…" + input.slice(start - 15, start); - } else { - left = input.slice(0, start); - } - var right = void 0; - if (end + 15 < input.length) { - right = input.slice(end, end + 15) + "…"; - } else { - right = input.slice(end); - } - error += left + underlined + right; - } - - // Some hackery to make ParseError a prototype of Error - // See http://stackoverflow.com/a/8460753 - var self = new Error(error); - self.name = "ParseError"; - // $FlowFixMe - self.__proto__ = ParseError.prototype; - // $FlowFixMe - self.position = start; - return self; -}; - -// $FlowFixMe More hackery - - -ParseError.prototype.__proto__ = Error.prototype; - -/* harmony default export */ __webpack_exports__["a"] = (ParseError); - -/***/ }), -/* 7 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -exports.__esModule = true; - -exports.default = function (instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -}; - -/***/ }), -/* 8 */ -/***/ (function(module, exports) { - -var core = module.exports = {version: '2.4.0'}; -if(typeof __e == 'number')__e = core; // eslint-disable-line no-undef - -/***/ }), -/* 9 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck__ = __webpack_require__(7); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_createClass__ = __webpack_require__(10); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_createClass___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_createClass__); - - - -/** - * This file contains information and classes for the various kinds of styles - * used in TeX. It provides a generic `Style` class, which holds information - * about a specific style. It then provides instances of all the different kinds - * of styles possible, and provides functions to move between them and get - * information about them. - */ - -/** - * The main style class. Contains a unique id for the style, a size (which is - * the same for cramped and uncramped version of a style), and a cramped flag. - */ -var Style = function () { - function Style(id, size, cramped) { - __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck___default()(this, Style); - - this.id = id; - this.size = size; - this.cramped = cramped; - } - - /** - * Get the style of a superscript given a base in the current style. - */ - - - __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_createClass___default()(Style, [{ - key: "sup", - value: function sup() { - return styles[_sup[this.id]]; - } - - /** - * Get the style of a subscript given a base in the current style. - */ - - }, { - key: "sub", - value: function sub() { - return styles[_sub[this.id]]; - } - - /** - * Get the style of a fraction numerator given the fraction in the current - * style. - */ - - }, { - key: "fracNum", - value: function fracNum() { - return styles[_fracNum[this.id]]; - } - - /** - * Get the style of a fraction denominator given the fraction in the current - * style. - */ - - }, { - key: "fracDen", - value: function fracDen() { - return styles[_fracDen[this.id]]; - } - - /** - * Get the cramped version of a style (in particular, cramping a cramped style - * doesn't change the style). - */ - - }, { - key: "cramp", - value: function cramp() { - return styles[_cramp[this.id]]; - } - - /** - * Get a text or display version of this style. - */ - - }, { - key: "text", - value: function text() { - return styles[_text[this.id]]; - } - - /** - * Return true if this style is tightly spaced (scriptstyle/scriptscriptstyle) - */ - - }, { - key: "isTight", - value: function isTight() { - return this.size >= 2; - } - }]); - - return Style; -}(); - -// Export an interface for type checking, but don't expose the implementation. -// This way, no more styles can be generated. - - -// IDs of the different styles -var D = 0; -var Dc = 1; -var T = 2; -var Tc = 3; -var S = 4; -var Sc = 5; -var SS = 6; -var SSc = 7; - -// Instances of the different styles -var styles = [new Style(D, 0, false), new Style(Dc, 0, true), new Style(T, 1, false), new Style(Tc, 1, true), new Style(S, 2, false), new Style(Sc, 2, true), new Style(SS, 3, false), new Style(SSc, 3, true)]; - -// Lookup tables for switching from one style to another -var _sup = [S, Sc, S, Sc, SS, SSc, SS, SSc]; -var _sub = [Sc, Sc, Sc, Sc, SSc, SSc, SSc, SSc]; -var _fracNum = [T, Tc, S, Sc, SS, SSc, SS, SSc]; -var _fracDen = [Tc, Tc, Sc, Sc, SSc, SSc, SSc, SSc]; -var _cramp = [Dc, Dc, Tc, Tc, Sc, Sc, SSc, SSc]; -var _text = [D, Dc, T, Tc, T, Tc, T, Tc]; - -// We only export some of the styles. -/* harmony default export */ __webpack_exports__["a"] = ({ - DISPLAY: styles[D], - TEXT: styles[T], - SCRIPT: styles[S], - SCRIPTSCRIPT: styles[SS] -}); - -/***/ }), -/* 10 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -exports.__esModule = true; - -var _defineProperty = __webpack_require__(73); - -var _defineProperty2 = _interopRequireDefault(_defineProperty); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -exports.default = function () { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - (0, _defineProperty2.default)(target, descriptor.key, descriptor); - } - } - - return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps); - if (staticProps) defineProperties(Constructor, staticProps); - return Constructor; - }; -}(); - -/***/ }), -/* 11 */ -/***/ (function(module, exports, __webpack_require__) { - -var store = __webpack_require__(52)('wks') - , uid = __webpack_require__(32) - , Symbol = __webpack_require__(16).Symbol - , USE_SYMBOL = typeof Symbol == 'function'; - -var $exports = module.exports = function(name){ - return store[name] || (store[name] = - USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name)); -}; - -$exports.store = store; - -/***/ }), -/* 12 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_get_iterator__ = __webpack_require__(18); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_get_iterator___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_get_iterator__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_object_assign__ = __webpack_require__(105); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_object_assign___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_object_assign__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_classCallCheck__ = __webpack_require__(7); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_classCallCheck___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_classCallCheck__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_babel_runtime_helpers_createClass__ = __webpack_require__(10); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_babel_runtime_helpers_createClass___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_babel_runtime_helpers_createClass__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__unicodeScripts__ = __webpack_require__(42); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__utils__ = __webpack_require__(5); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__svgGeometry__ = __webpack_require__(111); - - - - - -/** - * These objects store the data about the DOM nodes we create, as well as some - * extra data. They can then be transformed into real DOM nodes with the - * `toNode` function or HTML markup using `toMarkup`. They are useful for both - * storing extra properties on the nodes, as well as providing a way to easily - * work with the DOM. - * - * Similar functions for working with MathML nodes exist in mathMLTree.js. - */ - - - - - -/** - * Create an HTML className based on a list of classes. In addition to joining - * with spaces, we also remove null or empty classes. - */ -var createClass = function createClass(classes) { - classes = classes.slice(); - for (var i = classes.length - 1; i >= 0; i--) { - if (!classes[i]) { - classes.splice(i, 1); - } - } - - return classes.join(" "); -}; - -// To ensure that all nodes have compatible signatures for these methods. - - -/** - * All `DomChildNode`s MUST have `height`, `depth`, and `maxFontSize` numeric - * fields. - * - * `DomChildNode` is not defined as an interface since `documentFragment` also - * has these fields but should not be considered a `DomChildNode`. - */ - -/** - * This node represents a span node, with a className, a list of children, and - * an inline style. It also contains information about its height, depth, and - * maxFontSize. - */ -var span = function () { - function span(classes, children, options, style) { - __WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_classCallCheck___default()(this, span); - - this.classes = classes || []; - this.children = children || []; - this.height = 0; - this.depth = 0; - this.maxFontSize = 0; - this.style = __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_object_assign___default()({}, style); - this.attributes = {}; - if (options) { - if (options.style.isTight()) { - this.classes.push("mtight"); - } - var color = options.getColor(); - if (color) { - this.style.color = color; - } - } - } - - /** - * Sets an arbitrary attribute on the span. Warning: use this wisely. Not all - * browsers support attributes the same, and having too many custom attributes - * is probably bad. - */ - - - __WEBPACK_IMPORTED_MODULE_3_babel_runtime_helpers_createClass___default()(span, [{ - key: "setAttribute", - value: function setAttribute(attribute, value) { - this.attributes[attribute] = value; - } - }, { - key: "tryCombine", - value: function tryCombine(sibling) { - return false; - } - - /** - * Convert the span into an HTML node - */ - - }, { - key: "toNode", - value: function toNode() { - var span = document.createElement("span"); - - // Apply the class - span.className = createClass(this.classes); - - // Apply inline styles - for (var style in this.style) { - if (Object.prototype.hasOwnProperty.call(this.style, style)) { - // $FlowFixMe Flow doesn't seem to understand span.style's type. - span.style[style] = this.style[style]; - } - } - - // Apply attributes - for (var attr in this.attributes) { - if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) { - span.setAttribute(attr, this.attributes[attr]); - } - } - - // Append the children, also as HTML nodes - for (var i = 0; i < this.children.length; i++) { - span.appendChild(this.children[i].toNode()); - } - - return span; - } - - /** - * Convert the span into an HTML markup string - */ - - }, { - key: "toMarkup", - value: function toMarkup() { - var markup = ") element with a hyperlink, a list of classes, - * a list of children, and an inline style. It also contains information about its - * height, depth, and maxFontSize. - */ - - -var anchor = function () { - function anchor(href, classes, children, options) { - __WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_classCallCheck___default()(this, anchor); - - this.href = href; - this.classes = classes; - this.children = children; - this.height = 0; - this.depth = 0; - this.maxFontSize = 0; - this.style = {}; - this.attributes = {}; - if (options.style.isTight()) { - this.classes.push("mtight"); - } - var color = options.getColor(); - if (color) { - this.style.color = color; - } - } - - /** - * Sets an arbitrary attribute on the anchor. Warning: use this wisely. Not all - * browsers support attributes the same, and having too many custom attributes - * is probably bad. - */ - - - __WEBPACK_IMPORTED_MODULE_3_babel_runtime_helpers_createClass___default()(anchor, [{ - key: "setAttribute", - value: function setAttribute(attribute, value) { - this.attributes[attribute] = value; - } - }, { - key: "tryCombine", - value: function tryCombine(sibling) { - return false; - } - - /** - * Convert the anchor into an HTML node - */ - - }, { - key: "toNode", - value: function toNode() { - var a = document.createElement("a"); - - // Apply the href - a.setAttribute('href', this.href); - - // Apply the class - if (this.classes.length) { - a.className = createClass(this.classes); - } - - // Apply inline styles - for (var style in this.style) { - if (Object.prototype.hasOwnProperty.call(this.style, style)) { - // $FlowFixMe Flow doesn't seem to understand a.style's type. - a.style[style] = this.style[style]; - } - } - - // Apply attributes - for (var attr in this.attributes) { - if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) { - a.setAttribute(attr, this.attributes[attr]); - } - } - - // Append the children, also as HTML nodes - for (var i = 0; i < this.children.length; i++) { - a.appendChild(this.children[i].toNode()); - } - - return a; - } - - /** - * Convert the a into an HTML markup string - */ - - }, { - key: "toMarkup", - value: function toMarkup() { - var markup = " 0 || createClass(this.classes) !== createClass(sibling.classes) || this.skew !== sibling.skew || this.maxFontSize !== sibling.maxFontSize) { - return false; - } - for (var style in this.style) { - if (this.style.hasOwnProperty(style) && this.style[style] !== sibling.style[style]) { - return false; - } - } - for (var _style in sibling.style) { - if (sibling.style.hasOwnProperty(_style) && this.style[_style] !== sibling.style[_style]) { - return false; - } - } - this.value += sibling.value; - this.height = Math.max(this.height, sibling.height); - this.depth = Math.max(this.depth, sibling.depth); - this.italic = sibling.italic; - return true; - } - - /** - * Creates a text node or span from a symbol node. Note that a span is only - * created if it is needed. - */ - - }, { - key: "toNode", - value: function toNode() { - var node = document.createTextNode(this.value); - var span = null; - - if (this.italic > 0) { - span = document.createElement("span"); - span.style.marginRight = this.italic + "em"; - } - - if (this.classes.length > 0) { - span = span || document.createElement("span"); - span.className = createClass(this.classes); - } - - for (var style in this.style) { - if (this.style.hasOwnProperty(style)) { - span = span || document.createElement("span"); - // $FlowFixMe Flow doesn't seem to understand span.style's type. - span.style[style] = this.style[style]; - } - } - - if (span) { - span.appendChild(node); - return span; - } else { - return node; - } - } - - /** - * Creates markup for a symbol node. - */ - - }, { - key: "toMarkup", - value: function toMarkup() { - // TODO(alpert): More duplication than I'd like from - // span.prototype.toMarkup and symbolNode.prototype.toNode... - var needsSpan = false; - - var markup = " 0) { - styles += "margin-right:" + this.italic + "em;"; - } - for (var style in this.style) { - if (this.style.hasOwnProperty(style)) { - styles += __WEBPACK_IMPORTED_MODULE_5__utils__["a" /* default */].hyphenate(style) + ":" + this.style[style] + ";"; - } - } - - if (styles) { - needsSpan = true; - markup += " style=\"" + __WEBPACK_IMPORTED_MODULE_5__utils__["a" /* default */].escape(styles) + "\""; - } - - var escaped = __WEBPACK_IMPORTED_MODULE_5__utils__["a" /* default */].escape(this.value); - if (needsSpan) { - markup += ">"; - markup += escaped; - markup += ""; - return markup; - } else { - return escaped; - } - } - }]); - - return symbolNode; -}(); - -/** - * SVG nodes are used to render stretchy wide elements. - */ - - -var svgNode = function () { - function svgNode(children, attributes) { - __WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_classCallCheck___default()(this, svgNode); - - this.children = children || []; - this.attributes = attributes || {}; - this.height = 0; - this.depth = 0; - this.maxFontSize = 0; - } - // Required for all `DomChildNode`s. Are always 0 for svgNode. - - - __WEBPACK_IMPORTED_MODULE_3_babel_runtime_helpers_createClass___default()(svgNode, [{ - key: "toNode", - value: function toNode() { - var svgNS = "http://www.w3.org/2000/svg"; - var node = document.createElementNS(svgNS, "svg"); - - // Apply attributes - for (var attr in this.attributes) { - if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) { - node.setAttribute(attr, this.attributes[attr]); - } - } - - for (var i = 0; i < this.children.length; i++) { - node.appendChild(this.children[i].toNode()); - } - return node; - } - }, { - key: "toMarkup", - value: function toMarkup() { - var markup = ""; - } else { - return ""; - } - } - }]); - - return pathNode; -}(); - -var lineNode = function () { - function lineNode(attributes) { - __WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_classCallCheck___default()(this, lineNode); - - this.attributes = attributes || {}; - } - - __WEBPACK_IMPORTED_MODULE_3_babel_runtime_helpers_createClass___default()(lineNode, [{ - key: "toNode", - value: function toNode() { - var svgNS = "http://www.w3.org/2000/svg"; - var node = document.createElementNS(svgNS, "line"); - - // Apply attributes - for (var attr in this.attributes) { - if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) { - node.setAttribute(attr, this.attributes[attr]); - } - } - - return node; - } - }, { - key: "toMarkup", - value: function toMarkup() { - var markup = ") -// Copyright (c) 2014-2017 Khan Academy () -// Licensed under the SIL Open Font License, Version 1.1. -// See \nhttp://scripts.sil.org/OFL - -// Very Long SVGs -// Many of the KaTeX stretchy wide elements use a long SVG image and an -// overflow: hidden tactic to achieve a stretchy image while avoiding -// distortion of arrowheads or brace corners. - -// The SVG typically contains a very long (400 em) arrow. - -// The SVG is in a container span that has overflow: hidden, so the span -// acts like a window that exposes only part of the SVG. - -// The SVG always has a longer, thinner aspect ratio than the container span. -// After the SVG fills 100% of the height of the container span, -// there is a long arrow shaft left over. That left-over shaft is not shown. -// Instead, it is sliced off because the span's CSS has overflow: hidden. - -// Thus, the reader sees an arrow that matches the subject matter width -// without distortion. - -// Some functions, such as \cancel, need to vary their aspect ratio. These -// functions do not get the overflow SVG treatment. - -// Second Brush Stroke -// Low resolution monitors struggle to display images in fine detail. -// So browsers apply anti-aliasing. A long straight arrow shaft therefore -// will sometimes appear as if it has a blurred edge. - -// To mitigate this, these SVG files contain a second "brush-stroke" on the -// arrow shafts. That is, a second long thin rectangular SVG path has been -// written directly on top of each arrow shaft. This reinforcement causes -// some of the screen pixels to display as black instead of the anti-aliased -// gray pixel that a single path would generate. So we get arrow shafts -// whose edges appear to be sharper. - -// In the katexImagesData object just below, the dimensions all -// correspond to path geometry inside the relevant SVG. -// For example, \overrightarrow uses the same arrowhead as glyph U+2192 -// from the KaTeX Main font. The scaling factor is 1000. -// That is, inside the font, that arrowhead is 522 units tall, which -// corresponds to 0.522 em inside the document. - -var katexImagesData = { - // path(s), minWidth, height, align - overrightarrow: [["rightarrow"], 0.888, 522, "xMaxYMin"], - overleftarrow: [["leftarrow"], 0.888, 522, "xMinYMin"], - underrightarrow: [["rightarrow"], 0.888, 522, "xMaxYMin"], - underleftarrow: [["leftarrow"], 0.888, 522, "xMinYMin"], - xrightarrow: [["rightarrow"], 1.469, 522, "xMaxYMin"], - xleftarrow: [["leftarrow"], 1.469, 522, "xMinYMin"], - Overrightarrow: [["doublerightarrow"], 0.888, 560, "xMaxYMin"], - xRightarrow: [["doublerightarrow"], 1.526, 560, "xMaxYMin"], - xLeftarrow: [["doubleleftarrow"], 1.526, 560, "xMinYMin"], - overleftharpoon: [["leftharpoon"], 0.888, 522, "xMinYMin"], - xleftharpoonup: [["leftharpoon"], 0.888, 522, "xMinYMin"], - xleftharpoondown: [["leftharpoondown"], 0.888, 522, "xMinYMin"], - overrightharpoon: [["rightharpoon"], 0.888, 522, "xMaxYMin"], - xrightharpoonup: [["rightharpoon"], 0.888, 522, "xMaxYMin"], - xrightharpoondown: [["rightharpoondown"], 0.888, 522, "xMaxYMin"], - xlongequal: [["longequal"], 0.888, 334, "xMinYMin"], - xtwoheadleftarrow: [["twoheadleftarrow"], 0.888, 334, "xMinYMin"], - xtwoheadrightarrow: [["twoheadrightarrow"], 0.888, 334, "xMaxYMin"], - - overleftrightarrow: [["leftarrow", "rightarrow"], 0.888, 522], - overbrace: [["leftbrace", "midbrace", "rightbrace"], 1.6, 548], - underbrace: [["leftbraceunder", "midbraceunder", "rightbraceunder"], 1.6, 548], - underleftrightarrow: [["leftarrow", "rightarrow"], 0.888, 522], - xleftrightarrow: [["leftarrow", "rightarrow"], 1.75, 522], - xLeftrightarrow: [["doubleleftarrow", "doublerightarrow"], 1.75, 560], - xrightleftharpoons: [["leftharpoondownplus", "rightharpoonplus"], 1.75, 716], - xleftrightharpoons: [["leftharpoonplus", "rightharpoondownplus"], 1.75, 716], - xhookleftarrow: [["leftarrow", "righthook"], 1.08, 522], - xhookrightarrow: [["lefthook", "rightarrow"], 1.08, 522], - overlinesegment: [["leftlinesegment", "rightlinesegment"], 0.888, 522], - underlinesegment: [["leftlinesegment", "rightlinesegment"], 0.888, 522], - overgroup: [["leftgroup", "rightgroup"], 0.888, 342], - undergroup: [["leftgroupunder", "rightgroupunder"], 0.888, 342], - xmapsto: [["leftmapsto", "rightarrow"], 1.5, 522], - xtofrom: [["leftToFrom", "rightToFrom"], 1.75, 528], - - // The next three arrows are from the mhchem package. - // In mhchem.sty, min-length is 2.0em. But these arrows might appear in the - // document as \xrightarrow or \xrightleftharpoons. Those have - // min-length = 1.75em, so we set min-length on these next three to match. - xrightleftarrows: [["baraboveleftarrow", "rightarrowabovebar"], 1.75, 667], - xrightequilibrium: [["baraboveshortleftharpoon", "rightharpoonaboveshortbar"], 1.75, 716], - xleftequilibrium: [["shortbaraboveleftharpoon", "shortrightharpoonabovebar"], 1.75, 716] -}; - -var groupLength = function groupLength(arg) { - if (arg.type === "ordgroup") { - return arg.value.length; - } else { - return 1; - } -}; - -var svgSpan = function svgSpan(group, options) { - // Create a span with inline SVG for the element. - function buildSvgSpan_() { - var viewBoxWidth = 400000; // default - var label = group.value.label.substr(1); - if (__WEBPACK_IMPORTED_MODULE_4__utils__["a" /* default */].contains(["widehat", "widetilde", "utilde"], label)) { - // There are four SVG images available for each function. - // Choose a taller image when there are more characters. - var numChars = groupLength(group.value.base); - var viewBoxHeight = void 0; - var pathName = void 0; - var _height = void 0; - - if (numChars > 5) { - viewBoxHeight = label === "widehat" ? 420 : 312; - viewBoxWidth = label === "widehat" ? 2364 : 2340; - // Next get the span height, in 1000 ems - _height = label === "widehat" ? 0.42 : 0.34; - pathName = (label === "widehat" ? "widehat" : "tilde") + "4"; - } else { - var imgIndex = [1, 1, 2, 2, 3, 3][numChars]; - if (label === "widehat") { - viewBoxWidth = [0, 1062, 2364, 2364, 2364][imgIndex]; - viewBoxHeight = [0, 239, 300, 360, 420][imgIndex]; - _height = [0, 0.24, 0.3, 0.3, 0.36, 0.42][imgIndex]; - pathName = "widehat" + imgIndex; - } else { - viewBoxWidth = [0, 600, 1033, 2339, 2340][imgIndex]; - viewBoxHeight = [0, 260, 286, 306, 312][imgIndex]; - _height = [0, 0.26, 0.286, 0.3, 0.306, 0.34][imgIndex]; - pathName = "tilde" + imgIndex; - } - } - var path = new __WEBPACK_IMPORTED_MODULE_1__domTree__["a" /* default */].pathNode(pathName); - var svgNode = new __WEBPACK_IMPORTED_MODULE_1__domTree__["a" /* default */].svgNode([path], { - "width": "100%", - "height": _height + "em", - "viewBox": "0 0 " + viewBoxWidth + " " + viewBoxHeight, - "preserveAspectRatio": "none" - }); - return { - span: __WEBPACK_IMPORTED_MODULE_2__buildCommon__["a" /* default */].makeSpan([], [svgNode], options), - minWidth: 0, - height: _height - }; - } else { - var spans = []; - - var _katexImagesData$labe = __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_slicedToArray___default()(katexImagesData[label], 4), - paths = _katexImagesData$labe[0], - _minWidth = _katexImagesData$labe[1], - _viewBoxHeight = _katexImagesData$labe[2], - align1 = _katexImagesData$labe[3]; - - var _height2 = _viewBoxHeight / 1000; - - var numSvgChildren = paths.length; - var widthClasses = void 0; - var aligns = void 0; - if (numSvgChildren === 1) { - widthClasses = ["hide-tail"]; - aligns = [align1]; - } else if (numSvgChildren === 2) { - widthClasses = ["halfarrow-left", "halfarrow-right"]; - aligns = ["xMinYMin", "xMaxYMin"]; - } else if (numSvgChildren === 3) { - widthClasses = ["brace-left", "brace-center", "brace-right"]; - aligns = ["xMinYMin", "xMidYMin", "xMaxYMin"]; - } else { - throw new Error("Correct katexImagesData or update code here to support\n " + numSvgChildren + " children."); - } - - for (var i = 0; i < numSvgChildren; i++) { - var _path = new __WEBPACK_IMPORTED_MODULE_1__domTree__["a" /* default */].pathNode(paths[i]); - - var _svgNode = new __WEBPACK_IMPORTED_MODULE_1__domTree__["a" /* default */].svgNode([_path], { - "width": "400em", - "height": _height2 + "em", - "viewBox": "0 0 " + viewBoxWidth + " " + _viewBoxHeight, - "preserveAspectRatio": aligns[i] + " slice" - }); - - var _span = __WEBPACK_IMPORTED_MODULE_2__buildCommon__["a" /* default */].makeSpan([widthClasses[i]], [_svgNode], options); - if (numSvgChildren === 1) { - return { span: _span, minWidth: _minWidth, height: _height2 }; - } else { - _span.style.height = _height2 + "em"; - spans.push(_span); - } - } - - return { - span: __WEBPACK_IMPORTED_MODULE_2__buildCommon__["a" /* default */].makeSpan(["stretchy"], spans, options), - minWidth: _minWidth, - height: _height2 - }; - } - } // buildSvgSpan_() - - var _buildSvgSpan_ = buildSvgSpan_(), - span = _buildSvgSpan_.span, - minWidth = _buildSvgSpan_.minWidth, - height = _buildSvgSpan_.height; - - // Note that we are returning span.depth = 0. - // Any adjustments relative to the baseline must be done in buildHTML. - - - span.height = height; - span.style.height = height + "em"; - if (minWidth > 0) { - span.style.minWidth = minWidth + "em"; - } - - return span; -}; - -var encloseSpan = function encloseSpan(inner, label, pad, options) { - // Return an image span for \cancel, \bcancel, \xcancel, or \fbox - var img = void 0; - var totalHeight = inner.height + inner.depth + 2 * pad; - - if (/fbox|color/.test(label)) { - img = __WEBPACK_IMPORTED_MODULE_2__buildCommon__["a" /* default */].makeSpan(["stretchy", label], [], options); - - if (label === "fbox") { - var color = options.color && options.getColor(); - if (color) { - img.style.borderColor = color; - } - } - } else { - // \cancel, \bcancel, or \xcancel - // Since \cancel's SVG is inline and it omits the viewBox attribute, - // its stroke-width will not vary with span area. - - var lines = []; - if (/^[bx]cancel$/.test(label)) { - lines.push(new __WEBPACK_IMPORTED_MODULE_1__domTree__["a" /* default */].lineNode({ - "x1": "0", - "y1": "0", - "x2": "100%", - "y2": "100%", - "stroke-width": "0.046em" - })); - } - - if (/^x?cancel$/.test(label)) { - lines.push(new __WEBPACK_IMPORTED_MODULE_1__domTree__["a" /* default */].lineNode({ - "x1": "0", - "y1": "100%", - "x2": "100%", - "y2": "0", - "stroke-width": "0.046em" - })); - } - - var svgNode = new __WEBPACK_IMPORTED_MODULE_1__domTree__["a" /* default */].svgNode(lines, { - "width": "100%", - "height": totalHeight + "em" - }); - - img = __WEBPACK_IMPORTED_MODULE_2__buildCommon__["a" /* default */].makeSpan([], [svgNode], options); - } - - img.height = totalHeight; - img.style.height = totalHeight + "em"; - - return img; -}; - -var ruleSpan = function ruleSpan(className, lineThickness, options) { - - // Get a span with an SVG path that fills the middle fifth of the span. - // We're using an extra wide span so Chrome won't round it down to zero. - - var path = void 0; - var svgNode = void 0; - var parentClass = "stretchy"; // default - - if (className === "vertical-separator") { - path = new __WEBPACK_IMPORTED_MODULE_1__domTree__["a" /* default */].pathNode("vertSeparator"); - svgNode = new __WEBPACK_IMPORTED_MODULE_1__domTree__["a" /* default */].svgNode([path], { - "width": "0.25em", // contains a path that is 0.05 ems wide. - "height": "400em", - "viewBox": "0 0 250 400000", - "preserveAspectRatio": "xMinYMin slice" - }); - parentClass = "vertical-separator"; - } else { - // The next two lines are the only place in KaTeX where SVG paths are - // put into a viewBox that is not always exactly a 1000:1 scale to the - // document em size. Instead, the path is a horizontal line set to - // take up the middle fifth of the viewBox and span. If the context is - // normalsize/textstyle then the line will be 0.04em and the usual - // 1000:1 ratio holds. But if the context is scriptstyle, then - // lineThickness > 0.04em and we have a ratio somewhat different than - // 1000:1. - - path = new __WEBPACK_IMPORTED_MODULE_1__domTree__["a" /* default */].pathNode("stdHorizRule"); - svgNode = new __WEBPACK_IMPORTED_MODULE_1__domTree__["a" /* default */].svgNode([path], { - "width": "400em", - "height": 5 * lineThickness + "em", - "viewBox": "0 0 400000 200", - "preserveAspectRatio": "xMinYMin slice" - }); - } - - return __WEBPACK_IMPORTED_MODULE_2__buildCommon__["a" /* default */].makeSpan([parentClass], [svgNode], options); -}; - -/* harmony default export */ __webpack_exports__["a"] = ({ - encloseSpan: encloseSpan, - mathMLnode: mathMLnode, - ruleSpan: ruleSpan, - svgSpan: svgSpan -}); - -/***/ }), -/* 14 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck__ = __webpack_require__(7); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__SourceLocation__ = __webpack_require__(31); - - - -/** - * The resulting parse tree nodes of the parse tree. - * - * It is possible to provide position information, so that a `ParseNode` can - * fulfill a role similar to a `Token` in error reporting. - * For details on the corresponding properties see `Token` constructor. - * Providing such information can lead to better error reporting. - */ -var ParseNode = function ParseNode(type, // type of node, like e.g. "ordgroup" -value, // type-specific representation of the node -mode, // parse mode in action for this node, "math" or "text" -first, // first token or node of the input for -last) // last token or node of the input for this -// node, will default to firstToken if unset -{ - __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck___default()(this, ParseNode); - - this.type = type; - this.value = value; - this.mode = mode; - this.loc = __WEBPACK_IMPORTED_MODULE_1__SourceLocation__["a" /* default */].range(first, last); -}; - -/* harmony default export */ __webpack_exports__["a"] = (ParseNode); - -/***/ }), -/* 15 */ -/***/ (function(module, exports, __webpack_require__) { - -var anObject = __webpack_require__(22) - , IE8_DOM_DEFINE = __webpack_require__(70) - , toPrimitive = __webpack_require__(71) - , dP = Object.defineProperty; - -exports.f = __webpack_require__(23) ? Object.defineProperty : function defineProperty(O, P, Attributes){ - anObject(O); - P = toPrimitive(P, true); - anObject(Attributes); - if(IE8_DOM_DEFINE)try { - return dP(O, P, Attributes); - } catch(e){ /* empty */ } - if('get' in Attributes || 'set' in Attributes)throw TypeError('Accessors not supported!'); - if('value' in Attributes)O[P] = Attributes.value; - return O; -}; - -/***/ }), -/* 16 */ -/***/ (function(module, exports) { - -// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 -var global = module.exports = typeof window != 'undefined' && window.Math == Math - ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')(); -if(typeof __g == 'number')__g = global; // eslint-disable-line no-undef - -/***/ }), -/* 17 */ -/***/ (function(module, exports) { - -module.exports = {}; - -/***/ }), -/* 18 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = { "default": __webpack_require__(103), __esModule: true }; - -/***/ }), -/* 19 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return validUnit; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return calculateSize; }); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__ParseError__ = __webpack_require__(6); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Options__ = __webpack_require__(43); - - -/** - * This file does conversion between units. In particular, it provides - * calculateSize to convert other units into ems. - */ - - - - -// This table gives the number of TeX pts in one of each *absolute* TeX unit. -// Thus, multiplying a length by this number converts the length from units -// into pts. Dividing the result by ptPerEm gives the number of ems -// *assuming* a font size of ptPerEm (normal size, normal style). -var ptPerUnit = { - // https://en.wikibooks.org/wiki/LaTeX/Lengths and - // https://tex.stackexchange.com/a/8263 - "pt": 1, // TeX point - "mm": 7227 / 2540, // millimeter - "cm": 7227 / 254, // centimeter - "in": 72.27, // inch - "bp": 803 / 800, // big (PostScript) points - "pc": 12, // pica - "dd": 1238 / 1157, // didot - "cc": 14856 / 1157, // cicero (12 didot) - "nd": 685 / 642, // new didot - "nc": 1370 / 107, // new cicero (12 new didot) - "sp": 1 / 65536, // scaled point (TeX's internal smallest unit) - // https://tex.stackexchange.com/a/41371 - "px": 803 / 800 // \pdfpxdimen defaults to 1 bp in pdfTeX and LuaTeX -}; - -// Dictionary of relative units, for fast validity testing. -var relativeUnit = { - "ex": true, - "em": true, - "mu": true -}; - -/** - * Determine whether the specified unit (either a string defining the unit - * or a "size" parse node containing a unit field) is valid. - */ -var validUnit = function validUnit(unit) { - if (typeof unit !== "string") { - unit = unit.unit; - } - return unit in ptPerUnit || unit in relativeUnit || unit === "ex"; -}; - -/* - * Convert a "size" parse node (with numeric "number" and string "unit" fields, - * as parsed by functions.js argType "size") into a CSS em value for the - * current style/scale. `options` gives the current options. - */ -var calculateSize = function calculateSize(sizeValue, options) { - var scale = void 0; - if (sizeValue.unit in ptPerUnit) { - // Absolute units - scale = ptPerUnit[sizeValue.unit] // Convert unit to pt - / options.fontMetrics().ptPerEm // Convert pt to CSS em - / options.sizeMultiplier; // Unscale to make absolute units - } else if (sizeValue.unit === "mu") { - // `mu` units scale with scriptstyle/scriptscriptstyle. - scale = options.fontMetrics().cssEmPerMu; - } else { - // Other relative units always refer to the *textstyle* font - // in the current size. - var unitOptions = void 0; - if (options.style.isTight()) { - // isTight() means current style is script/scriptscript. - unitOptions = options.havingStyle(options.style.text()); - } else { - unitOptions = options; - } - // TODO: In TeX these units are relative to the quad of the current - // *text* font, e.g. cmr10. KaTeX instead uses values from the - // comparably-sized *Computer Modern symbol* font. At 10pt, these - // match. At 7pt and 5pt, they differ: cmr7=1.138894, cmsy7=1.170641; - // cmr5=1.361133, cmsy5=1.472241. Consider $\scriptsize a\kern1emb$. - // TeX \showlists shows a kern of 1.13889 * fontsize; - // KaTeX shows a kern of 1.171 * fontsize. - if (sizeValue.unit === "ex") { - scale = unitOptions.fontMetrics().xHeight; - } else if (sizeValue.unit === "em") { - scale = unitOptions.fontMetrics().quad; - } else { - throw new __WEBPACK_IMPORTED_MODULE_0__ParseError__["a" /* default */]("Invalid unit: '" + sizeValue.unit + "'"); - } - if (unitOptions !== options) { - scale *= unitOptions.sizeMultiplier / options.sizeMultiplier; - } - } - return Math.min(sizeValue.number * scale, options.maxSize); -}; - -/***/ }), -/* 20 */ -/***/ (function(module, exports) { - -module.exports = function(it){ - return typeof it === 'object' ? it !== null : typeof it === 'function'; -}; - -/***/ }), -/* 21 */ -/***/ (function(module, exports) { - -var hasOwnProperty = {}.hasOwnProperty; -module.exports = function(it, key){ - return hasOwnProperty.call(it, key); -}; - -/***/ }), -/* 22 */ -/***/ (function(module, exports, __webpack_require__) { - -var isObject = __webpack_require__(20); -module.exports = function(it){ - if(!isObject(it))throw TypeError(it + ' is not an object!'); - return it; -}; - -/***/ }), -/* 23 */ -/***/ (function(module, exports, __webpack_require__) { - -// Thank's IE8 for his funny defineProperty -module.exports = !__webpack_require__(24)(function(){ - return Object.defineProperty({}, 'a', {get: function(){ return 7; }}).a != 7; -}); - -/***/ }), -/* 24 */ -/***/ (function(module, exports) { - -module.exports = function(exec){ - try { - return !!exec(); - } catch(e){ - return true; - } -}; - -/***/ }), -/* 25 */ -/***/ (function(module, exports, __webpack_require__) { - -var global = __webpack_require__(16) - , core = __webpack_require__(8) - , ctx = __webpack_require__(47) - , hide = __webpack_require__(26) - , PROTOTYPE = 'prototype'; - -var $export = function(type, name, source){ - var IS_FORCED = type & $export.F - , IS_GLOBAL = type & $export.G - , IS_STATIC = type & $export.S - , IS_PROTO = type & $export.P - , IS_BIND = type & $export.B - , IS_WRAP = type & $export.W - , exports = IS_GLOBAL ? core : core[name] || (core[name] = {}) - , expProto = exports[PROTOTYPE] - , target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE] - , key, own, out; - if(IS_GLOBAL)source = name; - for(key in source){ - // contains in native - own = !IS_FORCED && target && target[key] !== undefined; - if(own && key in exports)continue; - // export native or passed - out = own ? target[key] : source[key]; - // prevent global pollution for namespaces - exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key] - // bind timers to global for call from export context - : IS_BIND && own ? ctx(out, global) - // wrap global constructors for prevent change them in library - : IS_WRAP && target[key] == out ? (function(C){ - var F = function(a, b, c){ - if(this instanceof C){ - switch(arguments.length){ - case 0: return new C; - case 1: return new C(a); - case 2: return new C(a, b); - } return new C(a, b, c); - } return C.apply(this, arguments); - }; - F[PROTOTYPE] = C[PROTOTYPE]; - return F; - // make static versions for prototype methods - })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out; - // export proto methods to core.%CONSTRUCTOR%.methods.%NAME% - if(IS_PROTO){ - (exports.virtual || (exports.virtual = {}))[key] = out; - // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME% - if(type & $export.R && expProto && !expProto[key])hide(expProto, key, out); - } - } -}; -// type bitmap -$export.F = 1; // forced -$export.G = 2; // global -$export.S = 4; // static -$export.P = 8; // proto -$export.B = 16; // bind -$export.W = 32; // wrap -$export.U = 64; // safe -$export.R = 128; // real proto method for `library` -module.exports = $export; - -/***/ }), -/* 26 */ -/***/ (function(module, exports, __webpack_require__) { - -var dP = __webpack_require__(15) - , createDesc = __webpack_require__(33); -module.exports = __webpack_require__(23) ? function(object, key, value){ - return dP.f(object, key, createDesc(1, value)); -} : function(object, key, value){ - object[key] = value; - return object; -}; - -/***/ }), -/* 27 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Token; }); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck__ = __webpack_require__(7); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_createClass__ = __webpack_require__(10); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_createClass___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_createClass__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__SourceLocation__ = __webpack_require__(31); - - - - -/** - * Interface required to break circular dependency between Token, Lexer, and - * ParseError. - */ - - -/** - * The resulting token returned from `lex`. - * - * It consists of the token text plus some position information. - * The position information is essentially a range in an input string, - * but instead of referencing the bare input string, we refer to the lexer. - * That way it is possible to attach extra metadata to the input string, - * like for example a file name or similar. - * - * The position information is optional, so it is OK to construct synthetic - * tokens if appropriate. Not providing available position information may - * lead to degraded error reporting, though. - */ -var Token = function () { - function Token(text, // the text of this token - loc) { - __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck___default()(this, Token); - - this.text = text; - this.loc = loc; - } - - /** - * Given a pair of tokens (this and endToken), compute a `Token` encompassing - * the whole input range enclosed by these two. - */ - - - __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_createClass___default()(Token, [{ - key: "range", - value: function range(endToken, // last token of the range, inclusive - text) // the text of the newly constructed token - { - return new Token(text, __WEBPACK_IMPORTED_MODULE_2__SourceLocation__["a" /* default */].range(this, endToken)); - } - }]); - - return Token; -}(); - -/***/ }), -/* 28 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; - -/** - * This file holds a list of all no-argument functions and single-character - * symbols (like 'a' or ';'). - * - * For each of the symbols, there are three properties they can have: - * - font (required): the font to be used for this symbol. Either "main" (the - normal font), or "ams" (the ams fonts). - * - group (required): the ParseNode group type the symbol should have (i.e. - "textord", "mathord", etc). - See https://github.com/Khan/KaTeX/wiki/Examining-TeX#group-types - * - replace: the character that this symbol or function should be - * replaced with (i.e. "\phi" has a replace value of "\u03d5", the phi - * character in the main font). - * - * The outermost map in the table indicates what mode the symbols should be - * accepted in (e.g. "math" or "text"). - */ - -var symbols = { - "math": {}, - "text": {} -}; -/* harmony default export */ __webpack_exports__["a"] = (symbols); - -/** `acceptUnicodeChar = true` is only applicable if `replace` is set. */ -function defineSymbol(mode, font, group, replace, name, acceptUnicodeChar) { - symbols[mode][name] = { font: font, group: group, replace: replace }; - - if (acceptUnicodeChar && replace) { - symbols[mode][replace] = symbols[mode][name]; - } -} - -// Some abbreviations for commonly used strings. -// This helps minify the code, and also spotting typos using jshint. - -// modes: -var math = "math"; -var text = "text"; - -// fonts: -var main = "main"; -var ams = "ams"; - -// groups: -var accent = "accent"; -var bin = "bin"; -var close = "close"; -var inner = "inner"; -var mathord = "mathord"; -var op = "op"; -var open = "open"; -var punct = "punct"; -var rel = "rel"; -var spacing = "spacing"; -var textord = "textord"; - -// Now comes the symbol table - -// Relation Symbols -defineSymbol(math, main, rel, "\u2261", "\\equiv", true); -defineSymbol(math, main, rel, "\u227A", "\\prec", true); -defineSymbol(math, main, rel, "\u227B", "\\succ", true); -defineSymbol(math, main, rel, "\u223C", "\\sim", true); -defineSymbol(math, main, rel, "\u22A5", "\\perp"); -defineSymbol(math, main, rel, "\u2AAF", "\\preceq", true); -defineSymbol(math, main, rel, "\u2AB0", "\\succeq", true); -defineSymbol(math, main, rel, "\u2243", "\\simeq", true); -defineSymbol(math, main, rel, "\u2223", "\\mid", true); -defineSymbol(math, main, rel, "\u226A", "\\ll"); -defineSymbol(math, main, rel, "\u226B", "\\gg", true); -defineSymbol(math, main, rel, "\u224D", "\\asymp", true); -defineSymbol(math, main, rel, "\u2225", "\\parallel"); -defineSymbol(math, main, rel, "\u22C8", "\\bowtie", true); -defineSymbol(math, main, rel, "\u2323", "\\smile", true); -defineSymbol(math, main, rel, "\u2291", "\\sqsubseteq", true); -defineSymbol(math, main, rel, "\u2292", "\\sqsupseteq", true); -defineSymbol(math, main, rel, "\u2250", "\\doteq", true); -defineSymbol(math, main, rel, "\u2322", "\\frown", true); -defineSymbol(math, main, rel, "\u220B", "\\ni", true); -defineSymbol(math, main, rel, "\u221D", "\\propto", true); -defineSymbol(math, main, rel, "\u22A2", "\\vdash", true); -defineSymbol(math, main, rel, "\u22A3", "\\dashv", true); -defineSymbol(math, main, rel, "\u220B", "\\owns"); - -// Punctuation -defineSymbol(math, main, punct, ".", "\\ldotp"); -defineSymbol(math, main, punct, "\u22C5", "\\cdotp"); - -// Misc Symbols -defineSymbol(math, main, textord, "#", "\\#"); -defineSymbol(text, main, textord, "#", "\\#"); -defineSymbol(math, main, textord, "&", "\\&"); -defineSymbol(text, main, textord, "&", "\\&"); -defineSymbol(math, main, textord, "\u2135", "\\aleph", true); -defineSymbol(math, main, textord, "\u2200", "\\forall", true); -defineSymbol(math, main, textord, "\u210F", "\\hbar"); -defineSymbol(math, main, textord, "\u2203", "\\exists", true); -defineSymbol(math, main, textord, "\u2207", "\\nabla", true); -defineSymbol(math, main, textord, "\u266D", "\\flat", true); -defineSymbol(math, main, textord, "\u2113", "\\ell", true); -defineSymbol(math, main, textord, "\u266E", "\\natural", true); -defineSymbol(math, main, textord, "\u2663", "\\clubsuit", true); -defineSymbol(math, main, textord, "\u2118", "\\wp", true); -defineSymbol(math, main, textord, "\u266F", "\\sharp", true); -defineSymbol(math, main, textord, "\u2662", "\\diamondsuit", true); -defineSymbol(math, main, textord, "\u211C", "\\Re", true); -defineSymbol(math, main, textord, "\u2661", "\\heartsuit", true); -defineSymbol(math, main, textord, "\u2111", "\\Im", true); -defineSymbol(math, main, textord, "\u2660", "\\spadesuit", true); -defineSymbol(text, main, textord, "\xA7", "\\S", true); -defineSymbol(text, main, textord, "\xB6", "\\P", true); - -// Math and Text -defineSymbol(math, main, textord, "\u2020", "\\dag"); -defineSymbol(text, main, textord, "\u2020", "\\dag"); -defineSymbol(text, main, textord, "\u2020", "\\textdagger"); -defineSymbol(math, main, textord, "\u2021", "\\ddag"); -defineSymbol(text, main, textord, "\u2021", "\\ddag"); -defineSymbol(text, main, textord, "\u2020", "\\textdaggerdbl"); - -// Large Delimiters -defineSymbol(math, main, close, "\u23B1", "\\rmoustache"); -defineSymbol(math, main, open, "\u23B0", "\\lmoustache"); -defineSymbol(math, main, close, "\u27EF", "\\rgroup"); -defineSymbol(math, main, open, "\u27EE", "\\lgroup"); - -// Binary Operators -defineSymbol(math, main, bin, "\u2213", "\\mp", true); -defineSymbol(math, main, bin, "\u2296", "\\ominus", true); -defineSymbol(math, main, bin, "\u228E", "\\uplus", true); -defineSymbol(math, main, bin, "\u2293", "\\sqcap", true); -defineSymbol(math, main, bin, "\u2217", "\\ast"); -defineSymbol(math, main, bin, "\u2294", "\\sqcup", true); -defineSymbol(math, main, bin, "\u25EF", "\\bigcirc"); -defineSymbol(math, main, bin, "\u2219", "\\bullet"); -defineSymbol(math, main, bin, "\u2021", "\\ddagger"); -defineSymbol(math, main, bin, "\u2240", "\\wr", true); -defineSymbol(math, main, bin, "\u2A3F", "\\amalg"); -defineSymbol(math, main, bin, "&", "\\And"); // from amsmath - -// Arrow Symbols -defineSymbol(math, main, rel, "\u27F5", "\\longleftarrow", true); -defineSymbol(math, main, rel, "\u21D0", "\\Leftarrow", true); -defineSymbol(math, main, rel, "\u27F8", "\\Longleftarrow", true); -defineSymbol(math, main, rel, "\u27F6", "\\longrightarrow", true); -defineSymbol(math, main, rel, "\u21D2", "\\Rightarrow", true); -defineSymbol(math, main, rel, "\u27F9", "\\Longrightarrow", true); -defineSymbol(math, main, rel, "\u2194", "\\leftrightarrow", true); -defineSymbol(math, main, rel, "\u27F7", "\\longleftrightarrow", true); -defineSymbol(math, main, rel, "\u21D4", "\\Leftrightarrow", true); -defineSymbol(math, main, rel, "\u27FA", "\\Longleftrightarrow", true); -defineSymbol(math, main, rel, "\u21A6", "\\mapsto", true); -defineSymbol(math, main, rel, "\u27FC", "\\longmapsto", true); -defineSymbol(math, main, rel, "\u2197", "\\nearrow", true); -defineSymbol(math, main, rel, "\u21A9", "\\hookleftarrow", true); -defineSymbol(math, main, rel, "\u21AA", "\\hookrightarrow", true); -defineSymbol(math, main, rel, "\u2198", "\\searrow", true); -defineSymbol(math, main, rel, "\u21BC", "\\leftharpoonup", true); -defineSymbol(math, main, rel, "\u21C0", "\\rightharpoonup", true); -defineSymbol(math, main, rel, "\u2199", "\\swarrow", true); -defineSymbol(math, main, rel, "\u21BD", "\\leftharpoondown", true); -defineSymbol(math, main, rel, "\u21C1", "\\rightharpoondown", true); -defineSymbol(math, main, rel, "\u2196", "\\nwarrow", true); -defineSymbol(math, main, rel, "\u21CC", "\\rightleftharpoons", true); - -// AMS Negated Binary Relations -defineSymbol(math, ams, rel, "\u226E", "\\nless", true); -defineSymbol(math, ams, rel, "\uE010", "\\nleqslant"); -defineSymbol(math, ams, rel, "\uE011", "\\nleqq"); -defineSymbol(math, ams, rel, "\u2A87", "\\lneq", true); -defineSymbol(math, ams, rel, "\u2268", "\\lneqq", true); -defineSymbol(math, ams, rel, "\uE00C", "\\lvertneqq"); -defineSymbol(math, ams, rel, "\u22E6", "\\lnsim", true); -defineSymbol(math, ams, rel, "\u2A89", "\\lnapprox", true); -defineSymbol(math, ams, rel, "\u2280", "\\nprec", true); -// unicode-math maps \u22e0 to \npreccurlyeq. We'll use the AMS synonym. -defineSymbol(math, ams, rel, "\u22E0", "\\npreceq", true); -defineSymbol(math, ams, rel, "\u22E8", "\\precnsim", true); -defineSymbol(math, ams, rel, "\u2AB9", "\\precnapprox", true); -defineSymbol(math, ams, rel, "\u2241", "\\nsim", true); -defineSymbol(math, ams, rel, "\uE006", "\\nshortmid"); -defineSymbol(math, ams, rel, "\u2224", "\\nmid", true); -defineSymbol(math, ams, rel, "\u22AC", "\\nvdash", true); -defineSymbol(math, ams, rel, "\u22AD", "\\nvDash", true); -defineSymbol(math, ams, rel, "\u22EA", "\\ntriangleleft"); -defineSymbol(math, ams, rel, "\u22EC", "\\ntrianglelefteq", true); -defineSymbol(math, ams, rel, "\u228A", "\\subsetneq", true); -defineSymbol(math, ams, rel, "\uE01A", "\\varsubsetneq"); -defineSymbol(math, ams, rel, "\u2ACB", "\\subsetneqq", true); -defineSymbol(math, ams, rel, "\uE017", "\\varsubsetneqq"); -defineSymbol(math, ams, rel, "\u226F", "\\ngtr", true); -defineSymbol(math, ams, rel, "\uE00F", "\\ngeqslant"); -defineSymbol(math, ams, rel, "\uE00E", "\\ngeqq"); -defineSymbol(math, ams, rel, "\u2A88", "\\gneq", true); -defineSymbol(math, ams, rel, "\u2269", "\\gneqq", true); -defineSymbol(math, ams, rel, "\uE00D", "\\gvertneqq"); -defineSymbol(math, ams, rel, "\u22E7", "\\gnsim", true); -defineSymbol(math, ams, rel, "\u2A8A", "\\gnapprox", true); -defineSymbol(math, ams, rel, "\u2281", "\\nsucc", true); -// unicode-math maps \u22e1 to \nsucccurlyeq. We'll use the AMS synonym. -defineSymbol(math, ams, rel, "\u22E1", "\\nsucceq", true); -defineSymbol(math, ams, rel, "\u22E9", "\\succnsim", true); -defineSymbol(math, ams, rel, "\u2ABA", "\\succnapprox", true); -// unicode-math maps \u2246 to \simneqq. We'll use the AMS synonym. -defineSymbol(math, ams, rel, "\u2246", "\\ncong", true); -defineSymbol(math, ams, rel, "\uE007", "\\nshortparallel"); -defineSymbol(math, ams, rel, "\u2226", "\\nparallel", true); -defineSymbol(math, ams, rel, "\u22AF", "\\nVDash", true); -defineSymbol(math, ams, rel, "\u22EB", "\\ntriangleright"); -defineSymbol(math, ams, rel, "\u22ED", "\\ntrianglerighteq", true); -defineSymbol(math, ams, rel, "\uE018", "\\nsupseteqq"); -defineSymbol(math, ams, rel, "\u228B", "\\supsetneq", true); -defineSymbol(math, ams, rel, "\uE01B", "\\varsupsetneq"); -defineSymbol(math, ams, rel, "\u2ACC", "\\supsetneqq", true); -defineSymbol(math, ams, rel, "\uE019", "\\varsupsetneqq"); -defineSymbol(math, ams, rel, "\u22AE", "\\nVdash", true); -defineSymbol(math, ams, rel, "\u2AB5", "\\precneqq", true); -defineSymbol(math, ams, rel, "\u2AB6", "\\succneqq", true); -defineSymbol(math, ams, rel, "\uE016", "\\nsubseteqq"); -defineSymbol(math, ams, bin, "\u22B4", "\\unlhd"); -defineSymbol(math, ams, bin, "\u22B5", "\\unrhd"); - -// AMS Negated Arrows -defineSymbol(math, ams, rel, "\u219A", "\\nleftarrow", true); -defineSymbol(math, ams, rel, "\u219B", "\\nrightarrow", true); -defineSymbol(math, ams, rel, "\u21CD", "\\nLeftarrow", true); -defineSymbol(math, ams, rel, "\u21CF", "\\nRightarrow", true); -defineSymbol(math, ams, rel, "\u21AE", "\\nleftrightarrow", true); -defineSymbol(math, ams, rel, "\u21CE", "\\nLeftrightarrow", true); - -// AMS Misc -defineSymbol(math, ams, rel, "\u25B3", "\\vartriangle"); -defineSymbol(math, ams, textord, "\u210F", "\\hslash"); -defineSymbol(math, ams, textord, "\u25BD", "\\triangledown"); -defineSymbol(math, ams, textord, "\u25CA", "\\lozenge"); -defineSymbol(math, ams, textord, "\u24C8", "\\circledS"); -defineSymbol(math, ams, textord, "\xAE", "\\circledR"); -defineSymbol(text, ams, textord, "\xAE", "\\circledR"); -defineSymbol(math, ams, textord, "\u2221", "\\measuredangle", true); -defineSymbol(math, ams, textord, "\u2204", "\\nexists"); -defineSymbol(math, ams, textord, "\u2127", "\\mho"); -defineSymbol(math, ams, textord, "\u2132", "\\Finv", true); -defineSymbol(math, ams, textord, "\u2141", "\\Game", true); -defineSymbol(math, ams, textord, "k", "\\Bbbk"); -defineSymbol(math, ams, textord, "\u2035", "\\backprime"); -defineSymbol(math, ams, textord, "\u25B2", "\\blacktriangle"); -defineSymbol(math, ams, textord, "\u25BC", "\\blacktriangledown"); -defineSymbol(math, ams, textord, "\u25A0", "\\blacksquare"); -defineSymbol(math, ams, textord, "\u29EB", "\\blacklozenge"); -defineSymbol(math, ams, textord, "\u2605", "\\bigstar"); -defineSymbol(math, ams, textord, "\u2222", "\\sphericalangle", true); -defineSymbol(math, ams, textord, "\u2201", "\\complement", true); -// unicode-math maps U+F0 (ð) to \matheth. We map to AMS function \eth -defineSymbol(math, ams, textord, "\xF0", "\\eth", true); -defineSymbol(math, ams, textord, "\u2571", "\\diagup"); -defineSymbol(math, ams, textord, "\u2572", "\\diagdown"); -defineSymbol(math, ams, textord, "\u25A1", "\\square"); -defineSymbol(math, ams, textord, "\u25A1", "\\Box"); -defineSymbol(math, ams, textord, "\u25CA", "\\Diamond"); -// unicode-math maps U+A5 to \mathyen. We map to AMS function \yen -defineSymbol(math, ams, textord, "\xA5", "\\yen", true); -defineSymbol(math, ams, textord, "\u2713", "\\checkmark", true); -defineSymbol(text, ams, textord, "\u2713", "\\checkmark"); - -// AMS Hebrew -defineSymbol(math, ams, textord, "\u2136", "\\beth", true); -defineSymbol(math, ams, textord, "\u2138", "\\daleth", true); -defineSymbol(math, ams, textord, "\u2137", "\\gimel", true); - -// AMS Greek -defineSymbol(math, ams, textord, "\u03DD", "\\digamma"); -defineSymbol(math, ams, textord, "\u03F0", "\\varkappa"); - -// AMS Delimiters -defineSymbol(math, ams, open, "\u250C", "\\ulcorner"); -defineSymbol(math, ams, close, "\u2510", "\\urcorner"); -defineSymbol(math, ams, open, "\u2514", "\\llcorner"); -defineSymbol(math, ams, close, "\u2518", "\\lrcorner"); - -// AMS Binary Relations -defineSymbol(math, ams, rel, "\u2266", "\\leqq", true); -defineSymbol(math, ams, rel, "\u2A7D", "\\leqslant"); -defineSymbol(math, ams, rel, "\u2A95", "\\eqslantless", true); -defineSymbol(math, ams, rel, "\u2272", "\\lesssim"); -defineSymbol(math, ams, rel, "\u2A85", "\\lessapprox"); -defineSymbol(math, ams, rel, "\u224A", "\\approxeq", true); -defineSymbol(math, ams, bin, "\u22D6", "\\lessdot"); -defineSymbol(math, ams, rel, "\u22D8", "\\lll"); -defineSymbol(math, ams, rel, "\u2276", "\\lessgtr"); -defineSymbol(math, ams, rel, "\u22DA", "\\lesseqgtr"); -defineSymbol(math, ams, rel, "\u2A8B", "\\lesseqqgtr"); -defineSymbol(math, ams, rel, "\u2251", "\\doteqdot"); -defineSymbol(math, ams, rel, "\u2253", "\\risingdotseq", true); -defineSymbol(math, ams, rel, "\u2252", "\\fallingdotseq", true); -defineSymbol(math, ams, rel, "\u223D", "\\backsim", true); -defineSymbol(math, ams, rel, "\u22CD", "\\backsimeq", true); -defineSymbol(math, ams, rel, "\u2AC5", "\\subseteqq", true); -defineSymbol(math, ams, rel, "\u22D0", "\\Subset", true); -defineSymbol(math, ams, rel, "\u228F", "\\sqsubset", true); -defineSymbol(math, ams, rel, "\u227C", "\\preccurlyeq", true); -defineSymbol(math, ams, rel, "\u22DE", "\\curlyeqprec", true); -defineSymbol(math, ams, rel, "\u227E", "\\precsim", true); -defineSymbol(math, ams, rel, "\u2AB7", "\\precapprox", true); -defineSymbol(math, ams, rel, "\u22B2", "\\vartriangleleft"); -defineSymbol(math, ams, rel, "\u22B4", "\\trianglelefteq"); -defineSymbol(math, ams, rel, "\u22A8", "\\vDash"); -defineSymbol(math, ams, rel, "\u22AA", "\\Vvdash", true); -defineSymbol(math, ams, rel, "\u2323", "\\smallsmile"); -defineSymbol(math, ams, rel, "\u2322", "\\smallfrown"); -defineSymbol(math, ams, rel, "\u224F", "\\bumpeq", true); -defineSymbol(math, ams, rel, "\u224E", "\\Bumpeq", true); -defineSymbol(math, ams, rel, "\u2267", "\\geqq", true); -defineSymbol(math, ams, rel, "\u2A7E", "\\geqslant", true); -defineSymbol(math, ams, rel, "\u2A96", "\\eqslantgtr", true); -defineSymbol(math, ams, rel, "\u2273", "\\gtrsim", true); -defineSymbol(math, ams, rel, "\u2A86", "\\gtrapprox", true); -defineSymbol(math, ams, bin, "\u22D7", "\\gtrdot"); -defineSymbol(math, ams, rel, "\u22D9", "\\ggg", true); -defineSymbol(math, ams, rel, "\u2277", "\\gtrless", true); -defineSymbol(math, ams, rel, "\u22DB", "\\gtreqless", true); -defineSymbol(math, ams, rel, "\u2A8C", "\\gtreqqless", true); -defineSymbol(math, ams, rel, "\u2256", "\\eqcirc", true); -defineSymbol(math, ams, rel, "\u2257", "\\circeq", true); -defineSymbol(math, ams, rel, "\u225C", "\\triangleq", true); -defineSymbol(math, ams, rel, "\u223C", "\\thicksim"); -defineSymbol(math, ams, rel, "\u2248", "\\thickapprox"); -defineSymbol(math, ams, rel, "\u2AC6", "\\supseteqq", true); -defineSymbol(math, ams, rel, "\u22D1", "\\Supset", true); -defineSymbol(math, ams, rel, "\u2290", "\\sqsupset", true); -defineSymbol(math, ams, rel, "\u227D", "\\succcurlyeq", true); -defineSymbol(math, ams, rel, "\u22DF", "\\curlyeqsucc", true); -defineSymbol(math, ams, rel, "\u227F", "\\succsim", true); -defineSymbol(math, ams, rel, "\u2AB8", "\\succapprox", true); -defineSymbol(math, ams, rel, "\u22B3", "\\vartriangleright"); -defineSymbol(math, ams, rel, "\u22B5", "\\trianglerighteq"); -defineSymbol(math, ams, rel, "\u22A9", "\\Vdash", true); -defineSymbol(math, ams, rel, "\u2223", "\\shortmid"); -defineSymbol(math, ams, rel, "\u2225", "\\shortparallel"); -defineSymbol(math, ams, rel, "\u226C", "\\between", true); -defineSymbol(math, ams, rel, "\u22D4", "\\pitchfork", true); -defineSymbol(math, ams, rel, "\u221D", "\\varpropto"); -defineSymbol(math, ams, rel, "\u25C0", "\\blacktriangleleft"); -// unicode-math says that \therefore is a mathord atom. -// We kept the amssymb atom type, which is rel. -defineSymbol(math, ams, rel, "\u2234", "\\therefore", true); -defineSymbol(math, ams, rel, "\u220D", "\\backepsilon"); -defineSymbol(math, ams, rel, "\u25B6", "\\blacktriangleright"); -// unicode-math says that \because is a mathord atom. -// We kept the amssymb atom type, which is rel. -defineSymbol(math, ams, rel, "\u2235", "\\because", true); -defineSymbol(math, ams, rel, "\u22D8", "\\llless"); -defineSymbol(math, ams, rel, "\u22D9", "\\gggtr"); -defineSymbol(math, ams, bin, "\u22B2", "\\lhd"); -defineSymbol(math, ams, bin, "\u22B3", "\\rhd"); -defineSymbol(math, ams, rel, "\u2242", "\\eqsim", true); -defineSymbol(math, main, rel, "\u22C8", "\\Join"); -defineSymbol(math, ams, rel, "\u2251", "\\Doteq", true); - -// AMS Binary Operators -defineSymbol(math, ams, bin, "\u2214", "\\dotplus", true); -defineSymbol(math, ams, bin, "\u2216", "\\smallsetminus"); -defineSymbol(math, ams, bin, "\u22D2", "\\Cap", true); -defineSymbol(math, ams, bin, "\u22D3", "\\Cup", true); -defineSymbol(math, ams, bin, "\u2A5E", "\\doublebarwedge", true); -defineSymbol(math, ams, bin, "\u229F", "\\boxminus", true); -defineSymbol(math, ams, bin, "\u229E", "\\boxplus", true); -defineSymbol(math, ams, bin, "\u22C7", "\\divideontimes", true); -defineSymbol(math, ams, bin, "\u22C9", "\\ltimes", true); -defineSymbol(math, ams, bin, "\u22CA", "\\rtimes", true); -defineSymbol(math, ams, bin, "\u22CB", "\\leftthreetimes", true); -defineSymbol(math, ams, bin, "\u22CC", "\\rightthreetimes", true); -defineSymbol(math, ams, bin, "\u22CF", "\\curlywedge", true); -defineSymbol(math, ams, bin, "\u22CE", "\\curlyvee", true); -defineSymbol(math, ams, bin, "\u229D", "\\circleddash", true); -defineSymbol(math, ams, bin, "\u229B", "\\circledast", true); -defineSymbol(math, ams, bin, "\u22C5", "\\centerdot"); -defineSymbol(math, ams, bin, "\u22BA", "\\intercal", true); -defineSymbol(math, ams, bin, "\u22D2", "\\doublecap"); -defineSymbol(math, ams, bin, "\u22D3", "\\doublecup"); -defineSymbol(math, ams, bin, "\u22A0", "\\boxtimes", true); - -// AMS Arrows -// Note: unicode-math maps \u21e2 to their own function \rightdasharrow. -// We'll map it to AMS function \dashrightarrow. It produces the same atom. -defineSymbol(math, ams, rel, "\u21E2", "\\dashrightarrow", true); -// unicode-math maps \u21e0 to \leftdasharrow. We'll use the AMS synonym. -defineSymbol(math, ams, rel, "\u21E0", "\\dashleftarrow", true); -defineSymbol(math, ams, rel, "\u21C7", "\\leftleftarrows", true); -defineSymbol(math, ams, rel, "\u21C6", "\\leftrightarrows", true); -defineSymbol(math, ams, rel, "\u21DA", "\\Lleftarrow", true); -defineSymbol(math, ams, rel, "\u219E", "\\twoheadleftarrow", true); -defineSymbol(math, ams, rel, "\u21A2", "\\leftarrowtail", true); -defineSymbol(math, ams, rel, "\u21AB", "\\looparrowleft", true); -defineSymbol(math, ams, rel, "\u21CB", "\\leftrightharpoons", true); -defineSymbol(math, ams, rel, "\u21B6", "\\curvearrowleft", true); -// unicode-math maps \u21ba to \acwopencirclearrow. We'll use the AMS synonym. -defineSymbol(math, ams, rel, "\u21BA", "\\circlearrowleft", true); -defineSymbol(math, ams, rel, "\u21B0", "\\Lsh", true); -defineSymbol(math, ams, rel, "\u21C8", "\\upuparrows", true); -defineSymbol(math, ams, rel, "\u21BF", "\\upharpoonleft", true); -defineSymbol(math, ams, rel, "\u21C3", "\\downharpoonleft", true); -defineSymbol(math, ams, rel, "\u22B8", "\\multimap", true); -defineSymbol(math, ams, rel, "\u21AD", "\\leftrightsquigarrow", true); -defineSymbol(math, ams, rel, "\u21C9", "\\rightrightarrows", true); -defineSymbol(math, ams, rel, "\u21C4", "\\rightleftarrows", true); -defineSymbol(math, ams, rel, "\u21A0", "\\twoheadrightarrow", true); -defineSymbol(math, ams, rel, "\u21A3", "\\rightarrowtail", true); -defineSymbol(math, ams, rel, "\u21AC", "\\looparrowright", true); -defineSymbol(math, ams, rel, "\u21B7", "\\curvearrowright", true); -// unicode-math maps \u21bb to \cwopencirclearrow. We'll use the AMS synonym. -defineSymbol(math, ams, rel, "\u21BB", "\\circlearrowright", true); -defineSymbol(math, ams, rel, "\u21B1", "\\Rsh", true); -defineSymbol(math, ams, rel, "\u21CA", "\\downdownarrows", true); -defineSymbol(math, ams, rel, "\u21BE", "\\upharpoonright", true); -defineSymbol(math, ams, rel, "\u21C2", "\\downharpoonright", true); -defineSymbol(math, ams, rel, "\u21DD", "\\rightsquigarrow", true); -defineSymbol(math, ams, rel, "\u21DD", "\\leadsto"); -defineSymbol(math, ams, rel, "\u21DB", "\\Rrightarrow", true); -defineSymbol(math, ams, rel, "\u21BE", "\\restriction"); - -defineSymbol(math, main, textord, "\u2018", "`"); -defineSymbol(math, main, textord, "$", "\\$"); -defineSymbol(text, main, textord, "$", "\\$"); -defineSymbol(text, main, textord, "$", "\\textdollar"); -defineSymbol(math, main, textord, "%", "\\%"); -defineSymbol(text, main, textord, "%", "\\%"); -defineSymbol(math, main, textord, "_", "\\_"); -defineSymbol(text, main, textord, "_", "\\_"); -defineSymbol(text, main, textord, "_", "\\textunderscore"); -defineSymbol(math, main, textord, "\u2220", "\\angle", true); -defineSymbol(math, main, textord, "\u221E", "\\infty", true); -defineSymbol(math, main, textord, "\u2032", "\\prime"); -defineSymbol(math, main, textord, "\u25B3", "\\triangle"); -defineSymbol(math, main, textord, "\u0393", "\\Gamma", true); -defineSymbol(math, main, textord, "\u0394", "\\Delta", true); -defineSymbol(math, main, textord, "\u0398", "\\Theta", true); -defineSymbol(math, main, textord, "\u039B", "\\Lambda", true); -defineSymbol(math, main, textord, "\u039E", "\\Xi", true); -defineSymbol(math, main, textord, "\u03A0", "\\Pi", true); -defineSymbol(math, main, textord, "\u03A3", "\\Sigma", true); -defineSymbol(math, main, textord, "\u03A5", "\\Upsilon", true); -defineSymbol(math, main, textord, "\u03A6", "\\Phi", true); -defineSymbol(math, main, textord, "\u03A8", "\\Psi", true); -defineSymbol(math, main, textord, "\u03A9", "\\Omega", true); -defineSymbol(math, main, textord, "\xAC", "\\neg"); -defineSymbol(math, main, textord, "\xAC", "\\lnot"); -defineSymbol(math, main, textord, "\u22A4", "\\top"); -defineSymbol(math, main, textord, "\u22A5", "\\bot"); -defineSymbol(math, main, textord, "\u2205", "\\emptyset"); -defineSymbol(math, ams, textord, "\u2205", "\\varnothing"); -defineSymbol(math, main, mathord, "\u03B1", "\\alpha", true); -defineSymbol(math, main, mathord, "\u03B2", "\\beta", true); -defineSymbol(math, main, mathord, "\u03B3", "\\gamma", true); -defineSymbol(math, main, mathord, "\u03B4", "\\delta", true); -defineSymbol(math, main, mathord, "\u03F5", "\\epsilon", true); -defineSymbol(math, main, mathord, "\u03B6", "\\zeta", true); -defineSymbol(math, main, mathord, "\u03B7", "\\eta", true); -defineSymbol(math, main, mathord, "\u03B8", "\\theta", true); -defineSymbol(math, main, mathord, "\u03B9", "\\iota", true); -defineSymbol(math, main, mathord, "\u03BA", "\\kappa", true); -defineSymbol(math, main, mathord, "\u03BB", "\\lambda", true); -defineSymbol(math, main, mathord, "\u03BC", "\\mu", true); -defineSymbol(math, main, mathord, "\u03BD", "\\nu", true); -defineSymbol(math, main, mathord, "\u03BE", "\\xi", true); -defineSymbol(math, main, mathord, "\u03BF", "\\omicron", true); -defineSymbol(math, main, mathord, "\u03C0", "\\pi", true); -defineSymbol(math, main, mathord, "\u03C1", "\\rho", true); -defineSymbol(math, main, mathord, "\u03C3", "\\sigma", true); -defineSymbol(math, main, mathord, "\u03C4", "\\tau", true); -defineSymbol(math, main, mathord, "\u03C5", "\\upsilon", true); -defineSymbol(math, main, mathord, "\u03D5", "\\phi", true); -defineSymbol(math, main, mathord, "\u03C7", "\\chi", true); -defineSymbol(math, main, mathord, "\u03C8", "\\psi", true); -defineSymbol(math, main, mathord, "\u03C9", "\\omega", true); -defineSymbol(math, main, mathord, "\u03B5", "\\varepsilon", true); -defineSymbol(math, main, mathord, "\u03D1", "\\vartheta", true); -defineSymbol(math, main, mathord, "\u03D6", "\\varpi", true); -defineSymbol(math, main, mathord, "\u03F1", "\\varrho", true); -defineSymbol(math, main, mathord, "\u03C2", "\\varsigma", true); -defineSymbol(math, main, mathord, "\u03C6", "\\varphi", true); -defineSymbol(math, main, bin, "\u2217", "*"); -defineSymbol(math, main, bin, "+", "+"); -defineSymbol(math, main, bin, "\u2212", "-"); -defineSymbol(math, main, bin, "\u22C5", "\\cdot", true); -defineSymbol(math, main, bin, "\u2218", "\\circ"); -defineSymbol(math, main, bin, "\xF7", "\\div", true); -defineSymbol(math, main, bin, "\xB1", "\\pm", true); -defineSymbol(math, main, bin, "\xD7", "\\times", true); -defineSymbol(math, main, bin, "\u2229", "\\cap", true); -defineSymbol(math, main, bin, "\u222A", "\\cup", true); -defineSymbol(math, main, bin, "\u2216", "\\setminus"); -defineSymbol(math, main, bin, "\u2227", "\\land"); -defineSymbol(math, main, bin, "\u2228", "\\lor"); -defineSymbol(math, main, bin, "\u2227", "\\wedge", true); -defineSymbol(math, main, bin, "\u2228", "\\vee", true); -defineSymbol(math, main, textord, "\u221A", "\\surd"); -defineSymbol(math, main, open, "(", "("); -defineSymbol(math, main, open, "[", "["); -defineSymbol(math, main, open, "\u27E8", "\\langle", true); -defineSymbol(math, main, open, "\u2223", "\\lvert"); -defineSymbol(math, main, open, "\u2225", "\\lVert"); -defineSymbol(math, main, close, ")", ")"); -defineSymbol(math, main, close, "]", "]"); -defineSymbol(math, main, close, "?", "?"); -defineSymbol(math, main, close, "!", "!"); -defineSymbol(math, main, close, "\u27E9", "\\rangle", true); -defineSymbol(math, main, close, "\u2223", "\\rvert"); -defineSymbol(math, main, close, "\u2225", "\\rVert"); -defineSymbol(math, main, rel, "=", "="); -defineSymbol(math, main, rel, "<", "<"); -defineSymbol(math, main, rel, ">", ">"); -defineSymbol(math, main, rel, ":", ":"); -defineSymbol(math, main, rel, "\u2248", "\\approx", true); -defineSymbol(math, main, rel, "\u2245", "\\cong", true); -defineSymbol(math, main, rel, "\u2265", "\\ge"); -defineSymbol(math, main, rel, "\u2265", "\\geq", true); -defineSymbol(math, main, rel, "\u2190", "\\gets"); -defineSymbol(math, main, rel, ">", "\\gt"); -defineSymbol(math, main, rel, "\u2208", "\\in", true); -defineSymbol(math, main, rel, "\u2209", "\\notin", true); -defineSymbol(math, main, rel, "\u0338", "\\not"); -defineSymbol(math, main, rel, "\u2282", "\\subset", true); -defineSymbol(math, main, rel, "\u2283", "\\supset", true); -defineSymbol(math, main, rel, "\u2286", "\\subseteq", true); -defineSymbol(math, main, rel, "\u2287", "\\supseteq", true); -defineSymbol(math, ams, rel, "\u2288", "\\nsubseteq", true); -defineSymbol(math, ams, rel, "\u2289", "\\nsupseteq", true); -defineSymbol(math, main, rel, "\u22A8", "\\models"); -defineSymbol(math, main, rel, "\u2190", "\\leftarrow", true); -defineSymbol(math, main, rel, "\u2264", "\\le"); -defineSymbol(math, main, rel, "\u2264", "\\leq", true); -defineSymbol(math, main, rel, "<", "\\lt"); -defineSymbol(math, main, rel, "\u2260", "\\ne", true); -defineSymbol(math, main, rel, "\u2260", "\\neq"); -defineSymbol(math, main, rel, "\u2192", "\\rightarrow", true); -defineSymbol(math, main, rel, "\u2192", "\\to"); -defineSymbol(math, ams, rel, "\u2271", "\\ngeq", true); -defineSymbol(math, ams, rel, "\u2270", "\\nleq", true); -defineSymbol(math, main, spacing, null, "\\!"); -defineSymbol(math, main, spacing, "\xA0", "\\ "); -defineSymbol(math, main, spacing, "\xA0", "~"); -defineSymbol(math, main, spacing, null, "\\,"); -defineSymbol(math, main, spacing, null, "\\:"); -defineSymbol(math, main, spacing, null, "\\;"); -defineSymbol(math, main, spacing, null, "\\enspace"); -defineSymbol(math, main, spacing, null, "\\qquad"); -defineSymbol(math, main, spacing, null, "\\quad"); -defineSymbol(math, main, spacing, "\xA0", "\\space"); -// Ref: LaTeX Source 2e: \DeclareRobustCommand{\nobreakspace}{% -defineSymbol(math, main, spacing, "\xA0", "\\nobreakspace"); -defineSymbol(text, main, spacing, null, "\\!"); -defineSymbol(text, main, spacing, "\xA0", "\\ "); -defineSymbol(text, main, spacing, "\xA0", "~"); -defineSymbol(text, main, spacing, null, "\\,"); -defineSymbol(text, main, spacing, null, "\\:"); -defineSymbol(text, main, spacing, null, "\\;"); -defineSymbol(text, main, spacing, null, "\\enspace"); -defineSymbol(text, main, spacing, null, "\\qquad"); -defineSymbol(text, main, spacing, null, "\\quad"); -defineSymbol(text, main, spacing, "\xA0", "\\space"); -defineSymbol(text, main, spacing, "\xA0", "\\nobreakspace"); -defineSymbol(math, main, punct, ",", ","); -defineSymbol(math, main, punct, ";", ";"); -defineSymbol(math, main, punct, ":", "\\colon"); -defineSymbol(math, ams, bin, "\u22BC", "\\barwedge", true); -defineSymbol(math, ams, bin, "\u22BB", "\\veebar", true); -defineSymbol(math, main, bin, "\u2299", "\\odot", true); -defineSymbol(math, main, bin, "\u2295", "\\oplus", true); -defineSymbol(math, main, bin, "\u2297", "\\otimes", true); -defineSymbol(math, main, textord, "\u2202", "\\partial", true); -defineSymbol(math, main, bin, "\u2298", "\\oslash", true); -defineSymbol(math, ams, bin, "\u229A", "\\circledcirc", true); -defineSymbol(math, ams, bin, "\u22A1", "\\boxdot", true); -defineSymbol(math, main, bin, "\u25B3", "\\bigtriangleup"); -defineSymbol(math, main, bin, "\u25BD", "\\bigtriangledown"); -defineSymbol(math, main, bin, "\u2020", "\\dagger"); -defineSymbol(math, main, bin, "\u22C4", "\\diamond"); -defineSymbol(math, main, bin, "\u22C6", "\\star"); -defineSymbol(math, main, bin, "\u25C3", "\\triangleleft"); -defineSymbol(math, main, bin, "\u25B9", "\\triangleright"); -defineSymbol(math, main, open, "{", "\\{"); -defineSymbol(text, main, textord, "{", "\\{"); -defineSymbol(text, main, textord, "{", "\\textbraceleft"); -defineSymbol(math, main, close, "}", "\\}"); -defineSymbol(text, main, textord, "}", "\\}"); -defineSymbol(text, main, textord, "}", "\\textbraceright"); -defineSymbol(math, main, open, "{", "\\lbrace"); -defineSymbol(math, main, close, "}", "\\rbrace"); -defineSymbol(math, main, open, "[", "\\lbrack"); -defineSymbol(math, main, close, "]", "\\rbrack"); -defineSymbol(text, main, textord, "<", "\\textless"); // in T1 fontenc -defineSymbol(text, main, textord, ">", "\\textgreater"); // in T1 fontenc -defineSymbol(math, main, open, "\u230A", "\\lfloor"); -defineSymbol(math, main, close, "\u230B", "\\rfloor"); -defineSymbol(math, main, open, "\u2308", "\\lceil"); -defineSymbol(math, main, close, "\u2309", "\\rceil"); -defineSymbol(math, main, textord, "\\", "\\backslash"); -defineSymbol(math, main, textord, "\u2223", "|"); -defineSymbol(math, main, textord, "\u2223", "\\vert"); -defineSymbol(text, main, textord, "|", "\\textbar"); // in T1 fontenc -defineSymbol(math, main, textord, "\u2225", "\\|"); -defineSymbol(math, main, textord, "\u2225", "\\Vert"); -defineSymbol(text, main, textord, "\u2225", "\\textbardbl"); -defineSymbol(math, main, rel, "\u2191", "\\uparrow", true); -defineSymbol(math, main, rel, "\u21D1", "\\Uparrow", true); -defineSymbol(math, main, rel, "\u2193", "\\downarrow", true); -defineSymbol(math, main, rel, "\u21D3", "\\Downarrow", true); -defineSymbol(math, main, rel, "\u2195", "\\updownarrow", true); -defineSymbol(math, main, rel, "\u21D5", "\\Updownarrow", true); -defineSymbol(math, main, op, "\u2210", "\\coprod"); -defineSymbol(math, main, op, "\u22C1", "\\bigvee"); -defineSymbol(math, main, op, "\u22C0", "\\bigwedge"); -defineSymbol(math, main, op, "\u2A04", "\\biguplus"); -defineSymbol(math, main, op, "\u22C2", "\\bigcap"); -defineSymbol(math, main, op, "\u22C3", "\\bigcup"); -defineSymbol(math, main, op, "\u222B", "\\int"); -defineSymbol(math, main, op, "\u222B", "\\intop"); -defineSymbol(math, main, op, "\u222C", "\\iint"); -defineSymbol(math, main, op, "\u222D", "\\iiint"); -defineSymbol(math, main, op, "\u220F", "\\prod"); -defineSymbol(math, main, op, "\u2211", "\\sum"); -defineSymbol(math, main, op, "\u2A02", "\\bigotimes"); -defineSymbol(math, main, op, "\u2A01", "\\bigoplus"); -defineSymbol(math, main, op, "\u2A00", "\\bigodot"); -defineSymbol(math, main, op, "\u222E", "\\oint"); -defineSymbol(math, main, op, "\u2A06", "\\bigsqcup"); -defineSymbol(math, main, op, "\u222B", "\\smallint"); -defineSymbol(text, main, inner, "\u2026", "\\textellipsis"); -defineSymbol(math, main, inner, "\u2026", "\\mathellipsis"); -defineSymbol(text, main, inner, "\u2026", "\\ldots", true); -defineSymbol(math, main, inner, "\u2026", "\\ldots", true); -defineSymbol(math, main, inner, "\u22EF", "\\@cdots", true); -defineSymbol(math, main, inner, "\u22F1", "\\ddots", true); -defineSymbol(math, main, textord, "\u22EE", "\\vdots", true); -defineSymbol(math, main, accent, "\u02CA", "\\acute"); -defineSymbol(math, main, accent, "\u02CB", "\\grave"); -defineSymbol(math, main, accent, "\xA8", "\\ddot"); -defineSymbol(math, main, accent, "~", "\\tilde"); -defineSymbol(math, main, accent, "\u02C9", "\\bar"); -defineSymbol(math, main, accent, "\u02D8", "\\breve"); -defineSymbol(math, main, accent, "\u02C7", "\\check"); -defineSymbol(math, main, accent, "^", "\\hat"); -defineSymbol(math, main, accent, "\u20D7", "\\vec"); -defineSymbol(math, main, accent, "\u02D9", "\\dot"); -defineSymbol(math, main, accent, "\u02DA", "\\mathring"); -defineSymbol(math, main, mathord, "\u0131", "\\imath", true); -defineSymbol(math, main, mathord, "\u0237", "\\jmath", true); -defineSymbol(text, main, textord, "\u0131", "\\i", true); -defineSymbol(text, main, textord, "\u0237", "\\j", true); -defineSymbol(text, main, textord, "\xDF", "\\ss", true); -defineSymbol(text, main, textord, "\xE6", "\\ae", true); -defineSymbol(text, main, textord, "\xE6", "\\ae", true); -defineSymbol(text, main, textord, "\u0153", "\\oe", true); -defineSymbol(text, main, textord, "\xF8", "\\o", true); -defineSymbol(text, main, textord, "\xC6", "\\AE", true); -defineSymbol(text, main, textord, "\u0152", "\\OE", true); -defineSymbol(text, main, textord, "\xD8", "\\O", true); -defineSymbol(text, main, accent, "\u02CA", "\\'"); // acute -defineSymbol(text, main, accent, "\u02CB", "\\`"); // grave -defineSymbol(text, main, accent, "\u02C6", "\\^"); // circumflex -defineSymbol(text, main, accent, "\u02DC", "\\~"); // tilde -defineSymbol(text, main, accent, "\u02C9", "\\="); // macron -defineSymbol(text, main, accent, "\u02D8", "\\u"); // breve -defineSymbol(text, main, accent, "\u02D9", "\\."); // dot above -defineSymbol(text, main, accent, "\u02DA", "\\r"); // ring above -defineSymbol(text, main, accent, "\u02C7", "\\v"); // caron -defineSymbol(text, main, accent, "\xA8", '\\"'); // diaresis -defineSymbol(text, main, accent, "\u02DD", "\\H"); // double acute - -defineSymbol(text, main, textord, "\u2013", "--"); -defineSymbol(text, main, textord, "\u2013", "\\textendash"); -defineSymbol(text, main, textord, "\u2014", "---"); -defineSymbol(text, main, textord, "\u2014", "\\textemdash"); -defineSymbol(text, main, textord, "\u2018", "`"); -defineSymbol(text, main, textord, "\u2018", "\\textquoteleft"); -defineSymbol(text, main, textord, "\u2019", "'"); -defineSymbol(text, main, textord, "\u2019", "\\textquoteright"); -defineSymbol(text, main, textord, "\u201C", "``"); -defineSymbol(text, main, textord, "\u201C", "\\textquotedblleft"); -defineSymbol(text, main, textord, "\u201D", "''"); -defineSymbol(text, main, textord, "\u201D", "\\textquotedblright"); -defineSymbol(math, main, textord, "\xB0", "\\degree"); -defineSymbol(text, main, textord, "\xB0", "\\degree"); -// TODO: In LaTeX, \pounds can generate a different character in text and math -// mode, but among our fonts, only Main-Italic defines this character "163". -defineSymbol(math, main, mathord, "\xA3", "\\pounds"); -defineSymbol(math, main, mathord, "\xA3", "\\mathsterling", true); -defineSymbol(text, main, mathord, "\xA3", "\\pounds"); -defineSymbol(text, main, mathord, "\xA3", "\\textsterling", true); -defineSymbol(math, ams, textord, "\u2720", "\\maltese"); -defineSymbol(text, ams, textord, "\u2720", "\\maltese"); - -defineSymbol(text, main, spacing, "\xA0", "\\ "); -defineSymbol(text, main, spacing, "\xA0", " "); -defineSymbol(text, main, spacing, "\xA0", "~"); - -// There are lots of symbols which are the same, so we add them in afterwards. - -// All of these are textords in math mode -var mathTextSymbols = "0123456789/@.\""; -for (var i = 0; i < mathTextSymbols.length; i++) { - var ch = mathTextSymbols.charAt(i); - defineSymbol(math, main, textord, ch, ch); -} - -// All of these are textords in text mode -var textSymbols = "0123456789!@*()-=+[]<>|\";:?/.,"; -for (var _i = 0; _i < textSymbols.length; _i++) { - var _ch = textSymbols.charAt(_i); - defineSymbol(text, main, textord, _ch, _ch); -} - -// All of these are textords in text mode, and mathords in math mode -var letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; -for (var _i2 = 0; _i2 < letters.length; _i2++) { - var _ch2 = letters.charAt(_i2); - defineSymbol(math, main, mathord, _ch2, _ch2); - defineSymbol(text, main, textord, _ch2, _ch2); -} - -// We add these Latin-1 letters as symbols for backwards-compatibility, -// but they are not actually in the font, nor are they supported by the -// Unicode accent mechanism, so they fall back to Times font and look ugly. -// TODO(edemaine): Fix this. -var extraLatin = "ÇÐÞçþ"; -for (var _i3 = 0; _i3 < extraLatin.length; _i3++) { - var _ch3 = extraLatin.charAt(_i3); - defineSymbol(math, main, mathord, _ch3, _ch3); - defineSymbol(text, main, textord, _ch3, _ch3); -} -defineSymbol(text, main, textord, "ð", "ð"); - -// Unicode versions of existing characters -defineSymbol(text, main, textord, "\u2013", "–"); -defineSymbol(text, main, textord, "\u2014", "—"); -defineSymbol(text, main, textord, "\u2018", "‘"); -defineSymbol(text, main, textord, "\u2019", "’"); -defineSymbol(text, main, textord, "\u201C", "“"); -defineSymbol(text, main, textord, "\u201D", "”"); - -/***/ }), -/* 29 */ -/***/ (function(module, exports, __webpack_require__) { - -// 7.1.13 ToObject(argument) -var defined = __webpack_require__(38); -module.exports = function(it){ - return Object(defined(it)); -}; - -/***/ }), -/* 30 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__unicodeScripts__ = __webpack_require__(42); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__submodules_katex_fonts_fontMetricsData__ = __webpack_require__(59); - - -/** - * This file contains metrics regarding fonts and individual symbols. The sigma - * and xi variables, as well as the metricMap map contain data extracted from - * TeX, TeX font metrics, and the TTF files. These data are then exposed via the - * `metrics` variable and the getCharacterMetrics function. - */ - -// In TeX, there are actually three sets of dimensions, one for each of -// textstyle (size index 5 and higher: >=9pt), scriptstyle (size index 3 and 4: -// 7-8pt), and scriptscriptstyle (size index 1 and 2: 5-6pt). These are -// provided in the the arrays below, in that order. -// -// The font metrics are stored in fonts cmsy10, cmsy7, and cmsy5 respsectively. -// This was determined by running the following script: -// -// latex -interaction=nonstopmode \ -// '\documentclass{article}\usepackage{amsmath}\begin{document}' \ -// '$a$ \expandafter\show\the\textfont2' \ -// '\expandafter\show\the\scriptfont2' \ -// '\expandafter\show\the\scriptscriptfont2' \ -// '\stop' -// -// The metrics themselves were retreived using the following commands: -// -// tftopl cmsy10 -// tftopl cmsy7 -// tftopl cmsy5 -// -// The output of each of these commands is quite lengthy. The only part we -// care about is the FONTDIMEN section. Each value is measured in EMs. -var sigmasAndXis = { - slant: [0.250, 0.250, 0.250], // sigma1 - space: [0.000, 0.000, 0.000], // sigma2 - stretch: [0.000, 0.000, 0.000], // sigma3 - shrink: [0.000, 0.000, 0.000], // sigma4 - xHeight: [0.431, 0.431, 0.431], // sigma5 - quad: [1.000, 1.171, 1.472], // sigma6 - extraSpace: [0.000, 0.000, 0.000], // sigma7 - num1: [0.677, 0.732, 0.925], // sigma8 - num2: [0.394, 0.384, 0.387], // sigma9 - num3: [0.444, 0.471, 0.504], // sigma10 - denom1: [0.686, 0.752, 1.025], // sigma11 - denom2: [0.345, 0.344, 0.532], // sigma12 - sup1: [0.413, 0.503, 0.504], // sigma13 - sup2: [0.363, 0.431, 0.404], // sigma14 - sup3: [0.289, 0.286, 0.294], // sigma15 - sub1: [0.150, 0.143, 0.200], // sigma16 - sub2: [0.247, 0.286, 0.400], // sigma17 - supDrop: [0.386, 0.353, 0.494], // sigma18 - subDrop: [0.050, 0.071, 0.100], // sigma19 - delim1: [2.390, 1.700, 1.980], // sigma20 - delim2: [1.010, 1.157, 1.420], // sigma21 - axisHeight: [0.250, 0.250, 0.250], // sigma22 - - // These font metrics are extracted from TeX by using tftopl on cmex10.tfm; - // they correspond to the font parameters of the extension fonts (family 3). - // See the TeXbook, page 441. In AMSTeX, the extension fonts scale; to - // match cmex7, we'd use cmex7.tfm values for script and scriptscript - // values. - defaultRuleThickness: [0.04, 0.049, 0.049], // xi8; cmex7: 0.049 - bigOpSpacing1: [0.111, 0.111, 0.111], // xi9 - bigOpSpacing2: [0.166, 0.166, 0.166], // xi10 - bigOpSpacing3: [0.2, 0.2, 0.2], // xi11 - bigOpSpacing4: [0.6, 0.611, 0.611], // xi12; cmex7: 0.611 - bigOpSpacing5: [0.1, 0.143, 0.143], // xi13; cmex7: 0.143 - - // The \sqrt rule width is taken from the height of the surd character. - // Since we use the same font at all sizes, this thickness doesn't scale. - sqrtRuleThickness: [0.04, 0.04, 0.04], - - // This value determines how large a pt is, for metrics which are defined - // in terms of pts. - // This value is also used in katex.less; if you change it make sure the - // values match. - ptPerEm: [10.0, 10.0, 10.0], - - // The space between adjacent `|` columns in an array definition. From - // `\showthe\doublerulesep` in LaTeX. Equals 2.0 / ptPerEm. - doubleRuleSep: [0.2, 0.2, 0.2] -}; - -// This map contains a mapping from font name and character code to character -// metrics, including height, depth, italic correction, and skew (kern from the -// character to the corresponding \skewchar) -// This map is generated via `make metrics`. It should not be changed manually. - - -// These are very rough approximations. We default to Times New Roman which -// should have Latin-1 and Cyrillic characters, but may not depending on the -// operating system. The metrics do not account for extra height from the -// accents. In the case of Cyrillic characters which have both ascenders and -// descenders we prefer approximations with ascenders, primarily to prevent -// the fraction bar or root line from intersecting the glyph. -// TODO(kevinb) allow union of multiple glyph metrics for better accuracy. -var extraCharacterMap = { - // Latin-1 - 'Å': 'A', - 'Ç': 'C', - 'Ð': 'D', - 'Þ': 'o', - 'å': 'a', - 'ç': 'c', - 'ð': 'd', - 'þ': 'o', - - // Cyrillic - 'А': 'A', - 'Б': 'B', - 'В': 'B', - 'Г': 'F', - 'Д': 'A', - 'Е': 'E', - 'Ж': 'K', - 'З': '3', - 'И': 'N', - 'Й': 'N', - 'К': 'K', - 'Л': 'N', - 'М': 'M', - 'Н': 'H', - 'О': 'O', - 'П': 'N', - 'Р': 'P', - 'С': 'C', - 'Т': 'T', - 'У': 'y', - 'Ф': 'O', - 'Х': 'X', - 'Ц': 'U', - 'Ч': 'h', - 'Ш': 'W', - 'Щ': 'W', - 'Ъ': 'B', - 'Ы': 'X', - 'Ь': 'B', - 'Э': '3', - 'Ю': 'X', - 'Я': 'R', - 'а': 'a', - 'б': 'b', - 'в': 'a', - 'г': 'r', - 'д': 'y', - 'е': 'e', - 'ж': 'm', - 'з': 'e', - 'и': 'n', - 'й': 'n', - 'к': 'n', - 'л': 'n', - 'м': 'm', - 'н': 'n', - 'о': 'o', - 'п': 'n', - 'р': 'p', - 'с': 'c', - 'т': 'o', - 'у': 'y', - 'ф': 'b', - 'х': 'x', - 'ц': 'n', - 'ч': 'n', - 'ш': 'w', - 'щ': 'w', - 'ъ': 'a', - 'ы': 'm', - 'ь': 'a', - 'э': 'e', - 'ю': 'm', - 'я': 'r' -}; - -/** - * This function is a convenience function for looking up information in the - * metricMap table. It takes a character as a string, and a font. - * - * Note: the `width` property may be undefined if fontMetricsData.js wasn't - * built using `Make extended_metrics`. - */ -var getCharacterMetrics = function getCharacterMetrics(character, font, mode) { - if (!__WEBPACK_IMPORTED_MODULE_1__submodules_katex_fonts_fontMetricsData__["a" /* default */][font]) { - throw new Error("Font metrics not found for font: " + font + "."); - } - var ch = character.charCodeAt(0); - if (character[0] in extraCharacterMap) { - ch = extraCharacterMap[character[0]].charCodeAt(0); - } - var metrics = __WEBPACK_IMPORTED_MODULE_1__submodules_katex_fonts_fontMetricsData__["a" /* default */][font][ch]; - - if (!metrics && mode === 'text') { - // We don't typically have font metrics for Asian scripts. - // But since we support them in text mode, we need to return - // some sort of metrics. - // So if the character is in a script we support but we - // don't have metrics for it, just use the metrics for - // the Latin capital letter M. This is close enough because - // we (currently) only care about the height of the glpyh - // not its width. - if (Object(__WEBPACK_IMPORTED_MODULE_0__unicodeScripts__["b" /* supportedCodepoint */])(ch)) { - metrics = __WEBPACK_IMPORTED_MODULE_1__submodules_katex_fonts_fontMetricsData__["a" /* default */][font][77]; // 77 is the charcode for 'M' - } - } - - if (metrics) { - return { - depth: metrics[0], - height: metrics[1], - italic: metrics[2], - skew: metrics[3], - width: metrics[4] - }; - } -}; - -var fontMetricsBySizeIndex = {}; - -/** - * Get the font metrics for a given size. - */ -var getFontMetrics = function getFontMetrics(size) { - var sizeIndex = void 0; - if (size >= 5) { - sizeIndex = 0; - } else if (size >= 3) { - sizeIndex = 1; - } else { - sizeIndex = 2; - } - if (!fontMetricsBySizeIndex[sizeIndex]) { - var metrics = fontMetricsBySizeIndex[sizeIndex] = { - cssEmPerMu: sigmasAndXis.quad[sizeIndex] / 18 - }; - for (var key in sigmasAndXis) { - if (sigmasAndXis.hasOwnProperty(key)) { - metrics[key] = sigmasAndXis[key][sizeIndex]; - } - } - } - return fontMetricsBySizeIndex[sizeIndex]; -}; - -/* harmony default export */ __webpack_exports__["a"] = ({ - getFontMetrics: getFontMetrics, - getCharacterMetrics: getCharacterMetrics -}); - -/***/ }), -/* 31 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_freeze__ = __webpack_require__(66); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_freeze___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_freeze__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_classCallCheck__ = __webpack_require__(7); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_classCallCheck___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_classCallCheck__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_createClass__ = __webpack_require__(10); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_createClass___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_createClass__); - - - - -/** - * Lexing or parsing positional information for error reporting. - * This object is immutable. - */ -var SourceLocation = function () { - // End offset, zero-based exclusive. - - // Lexer holding the input string. - function SourceLocation(lexer, start, end) { - __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_classCallCheck___default()(this, SourceLocation); - - this.lexer = lexer; - this.start = start; - this.end = end; - __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_freeze___default()(this); // Immutable to allow sharing in range(). - } - - /** - * Merges two `SourceLocation`s from location providers, given they are - * provided in order of appearance. - * - Returns the first one's location if only the first is provided. - * - Returns a merged range of the first and the last if both are provided - * and their lexers match. - * - Otherwise, returns null. - */ - // Start offset, zero-based inclusive. - - - __WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_createClass___default()(SourceLocation, null, [{ - key: "range", - value: function range(first, second) { - if (!second) { - return first && first.loc; - } else if (!first || !first.loc || !second.loc || first.loc.lexer !== second.loc.lexer) { - return null; - } else { - return new SourceLocation(first.loc.lexer, first.loc.start, second.loc.end); - } - } - }]); - - return SourceLocation; -}(); - -/* harmony default export */ __webpack_exports__["a"] = (SourceLocation); - -/***/ }), -/* 32 */ -/***/ (function(module, exports) { - -var id = 0 - , px = Math.random(); -module.exports = function(key){ - return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36)); -}; - -/***/ }), -/* 33 */ -/***/ (function(module, exports) { - -module.exports = function(bitmap, value){ - return { - enumerable : !(bitmap & 1), - configurable: !(bitmap & 2), - writable : !(bitmap & 4), - value : value - }; -}; - -/***/ }), -/* 34 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck__ = __webpack_require__(7); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__utils__ = __webpack_require__(5); - - -/** - * This is a module for storing settings passed into KaTeX. It correctly handles - * default settings. - */ - - - -/** - * The main Settings object - * - * The current options stored are: - * - displayMode: Whether the expression should be typeset as inline math - * (false, the default), meaning that the math starts in - * \textstyle and is placed in an inline-block); or as display - * math (true), meaning that the math starts in \displaystyle - * and is placed in a block with vertical margin. - */ -var Settings = function Settings(options) { - __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck___default()(this, Settings); - - // allow null options - options = options || {}; - this.displayMode = __WEBPACK_IMPORTED_MODULE_1__utils__["a" /* default */].deflt(options.displayMode, false); - this.throwOnError = __WEBPACK_IMPORTED_MODULE_1__utils__["a" /* default */].deflt(options.throwOnError, true); - this.errorColor = __WEBPACK_IMPORTED_MODULE_1__utils__["a" /* default */].deflt(options.errorColor, "#cc0000"); - this.macros = options.macros || {}; - this.colorIsTextColor = __WEBPACK_IMPORTED_MODULE_1__utils__["a" /* default */].deflt(options.colorIsTextColor, false); - this.maxSize = Math.max(0, __WEBPACK_IMPORTED_MODULE_1__utils__["a" /* default */].deflt(options.maxSize, Infinity)); -}; - -/* harmony default export */ __webpack_exports__["a"] = (Settings); - -/***/ }), -/* 35 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -exports.__esModule = true; - -var _from = __webpack_require__(79); - -var _from2 = _interopRequireDefault(_from); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -exports.default = function (arr) { - if (Array.isArray(arr)) { - for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { - arr2[i] = arr[i]; - } - - return arr2; - } else { - return (0, _from2.default)(arr); - } -}; - -/***/ }), -/* 36 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var $at = __webpack_require__(81)(true); - -// 21.1.3.27 String.prototype[@@iterator]() -__webpack_require__(48)(String, 'String', function(iterated){ - this._t = String(iterated); // target - this._i = 0; // next index -// 21.1.5.2.1 %StringIteratorPrototype%.next() -}, function(){ - var O = this._t - , index = this._i - , point; - if(index >= O.length)return {value: undefined, done: true}; - point = $at(O, index); - this._i += point.length; - return {value: point, done: false}; -}); - -/***/ }), -/* 37 */ -/***/ (function(module, exports) { - -// 7.1.4 ToInteger -var ceil = Math.ceil - , floor = Math.floor; -module.exports = function(it){ - return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it); -}; - -/***/ }), -/* 38 */ -/***/ (function(module, exports) { - -// 7.2.1 RequireObjectCoercible(argument) -module.exports = function(it){ - if(it == undefined)throw TypeError("Can't call method on " + it); - return it; -}; - -/***/ }), -/* 39 */ -/***/ (function(module, exports, __webpack_require__) { - -// 19.1.2.14 / 15.2.3.14 Object.keys(O) -var $keys = __webpack_require__(87) - , enumBugKeys = __webpack_require__(53); - -module.exports = Object.keys || function keys(O){ - return $keys(O, enumBugKeys); -}; - -/***/ }), -/* 40 */ -/***/ (function(module, exports, __webpack_require__) { - -// to indexed object, toObject with fallback for non-array-like ES3 strings -var IObject = __webpack_require__(49) - , defined = __webpack_require__(38); -module.exports = function(it){ - return IObject(defined(it)); -}; - -/***/ }), -/* 41 */ -/***/ (function(module, exports, __webpack_require__) { - -var shared = __webpack_require__(52)('keys') - , uid = __webpack_require__(32); -module.exports = function(key){ - return shared[key] || (shared[key] = uid(key)); -}; - -/***/ }), -/* 42 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony export (immutable) */ __webpack_exports__["a"] = scriptFromCodepoint; -/* harmony export (immutable) */ __webpack_exports__["b"] = supportedCodepoint; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_toConsumableArray__ = __webpack_require__(35); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_toConsumableArray___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_toConsumableArray__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_get_iterator__ = __webpack_require__(18); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_get_iterator___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_get_iterator__); - - - - -/** - * Unicode block data for the families of scripts we support in \text{}. - * Scripts only need to appear here if they do not have font metrics. - */ -var scriptData = [{ - // Latin characters beyond the Latin-1 characters we have metrics for. - // Needed for Czech, Hungarian and Turkish text, for example. - name: 'latin', - blocks: [[0x0100, 0x024f], // Latin Extended-A and Latin Extended-B - [0x0300, 0x036f]] -}, { - // The Cyrillic script used by Russian and related languages. - // A Cyrillic subset used to be supported as explicitly defined - // symbols in symbols.js - name: 'cyrillic', - blocks: [[0x0400, 0x04ff]] -}, { - // The Brahmic scripts of South and Southeast Asia - // Devanagari (0900–097F) - // Bengali (0980–09FF) - // Gurmukhi (0A00–0A7F) - // Gujarati (0A80–0AFF) - // Oriya (0B00–0B7F) - // Tamil (0B80–0BFF) - // Telugu (0C00–0C7F) - // Kannada (0C80–0CFF) - // Malayalam (0D00–0D7F) - // Sinhala (0D80–0DFF) - // Thai (0E00–0E7F) - // Lao (0E80–0EFF) - // Tibetan (0F00–0FFF) - // Myanmar (1000–109F) - name: 'brahmic', - blocks: [[0x0900, 0x109F]] -}, { - name: 'georgian', - blocks: [[0x10A0, 0x10ff]] -}, { - // Chinese and Japanese. - // The "k" in cjk is for Korean, but we've separated Korean out - name: "cjk", - blocks: [[0x3000, 0x30FF], // CJK symbols and punctuation, Hiragana, Katakana - [0x4E00, 0x9FAF], // CJK ideograms - [0xFF00, 0xFF60]] -}, { - // Korean - name: 'hangul', - blocks: [[0xAC00, 0xD7AF]] -}]; - -/** - * Given a codepoint, return the name of the script or script family - * it is from, or null if it is not part of a known block - */ - - -/* - * This file defines the Unicode scripts and script families that we - * support. To add new scripts or families, just add a new entry to the - * scriptData array below. Adding scripts to the scriptData array allows - * characters from that script to appear in \text{} environments. - */ - -/** - * Each script or script family has a name and an array of blocks. - * Each block is an array of two numbers which specify the start and - * end points (inclusive) of a block of Unicode codepoints. - */ -function scriptFromCodepoint(codepoint) { - var _iteratorNormalCompletion = true; - var _didIteratorError = false; - var _iteratorError = undefined; - - try { - for (var _iterator = __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_get_iterator___default()(scriptData), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { - var script = _step.value; - var _iteratorNormalCompletion2 = true; - var _didIteratorError2 = false; - var _iteratorError2 = undefined; - - try { - for (var _iterator2 = __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_get_iterator___default()(script.blocks), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { - var block = _step2.value; - - if (codepoint >= block[0] && codepoint <= block[1]) { - return script.name; - } - } - } catch (err) { - _didIteratorError2 = true; - _iteratorError2 = err; - } finally { - try { - if (!_iteratorNormalCompletion2 && _iterator2.return) { - _iterator2.return(); - } - } finally { - if (_didIteratorError2) { - throw _iteratorError2; - } - } - } - } - } catch (err) { - _didIteratorError = true; - _iteratorError = err; - } finally { - try { - if (!_iteratorNormalCompletion && _iterator.return) { - _iterator.return(); - } - } finally { - if (_didIteratorError) { - throw _iteratorError; - } - } - } - - return null; -} - -/** - * A flattened version of all the supported blocks in a single array. - * This is an optimization to make supportedCodepoint() fast. - */ -var allBlocks = []; -scriptData.forEach(function (s) { - return s.blocks.forEach(function (b) { - return allBlocks.push.apply(allBlocks, __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_toConsumableArray___default()(b)); - }); -}); - -/** - * Given a codepoint, return true if it falls within one of the - * scripts or script families defined above and false otherwise. - * - * Micro benchmarks shows that this is faster than - * /[\u3000-\u30FF\u4E00-\u9FAF\uFF00-\uFF60\uAC00-\uD7AF\u0900-\u109F]/.test() - * in Firefox, Chrome and Node. - */ -function supportedCodepoint(codepoint) { - for (var i = 0; i < allBlocks.length; i += 2) { - if (codepoint >= allBlocks[i] && codepoint <= allBlocks[i + 1]) { - return true; - } - } - return false; -} - -/***/ }), -/* 43 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck__ = __webpack_require__(7); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_createClass__ = __webpack_require__(10); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_createClass___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_createClass__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__fontMetrics__ = __webpack_require__(30); - - - -/** - * This file contains information about the options that the Parser carries - * around with it while parsing. Data is held in an `Options` object, and when - * recursing, a new `Options` object can be created with the `.with*` and - * `.reset` functions. - */ - - - - -var sizeStyleMap = [ -// Each element contains [textsize, scriptsize, scriptscriptsize]. -// The size mappings are taken from TeX with \normalsize=10pt. -[1, 1, 1], // size1: [5, 5, 5] \tiny -[2, 1, 1], // size2: [6, 5, 5] -[3, 1, 1], // size3: [7, 5, 5] \scriptsize -[4, 2, 1], // size4: [8, 6, 5] \footnotesize -[5, 2, 1], // size5: [9, 6, 5] \small -[6, 3, 1], // size6: [10, 7, 5] \normalsize -[7, 4, 2], // size7: [12, 8, 6] \large -[8, 6, 3], // size8: [14.4, 10, 7] \Large -[9, 7, 6], // size9: [17.28, 12, 10] \LARGE -[10, 8, 7], // size10: [20.74, 14.4, 12] \huge -[11, 10, 9]]; - -var sizeMultipliers = [ -// fontMetrics.js:getFontMetrics also uses size indexes, so if -// you change size indexes, change that function. -0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.2, 1.44, 1.728, 2.074, 2.488]; - -var sizeAtStyle = function sizeAtStyle(size, style) { - return style.size < 2 ? size : sizeStyleMap[size - 1][style.size - 1]; -}; - -/** - * This is the main options class. It contains the current style, size, color, - * and font. - * - * Options objects should not be modified. To create a new Options with - * different properties, call a `.having*` method. - */ -var Options = function () { - function Options(data) { - __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck___default()(this, Options); - - this.style = data.style; - this.color = data.color; - this.size = data.size || Options.BASESIZE; - this.textSize = data.textSize || this.size; - this.phantom = !!data.phantom; - this.fontFamily = data.fontFamily; - this.fontWeight = data.fontWeight || ''; - this.fontShape = data.fontShape || ''; - this.sizeMultiplier = sizeMultipliers[this.size - 1]; - this.maxSize = data.maxSize; - this._fontMetrics = undefined; - } - - /** - * Returns a new options object with the same properties as "this". Properties - * from "extension" will be copied to the new options object. - */ - - - /** - * The base size index. - */ - - - __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_createClass___default()(Options, [{ - key: "extend", - value: function extend(extension) { - var data = { - style: this.style, - size: this.size, - textSize: this.textSize, - color: this.color, - phantom: this.phantom, - fontFamily: this.fontFamily, - fontWeight: this.fontWeight, - fontShape: this.fontShape, - maxSize: this.maxSize - }; - - for (var key in extension) { - if (extension.hasOwnProperty(key)) { - data[key] = extension[key]; - } - } - - return new Options(data); - } - - /** - * Return an options object with the given style. If `this.style === style`, - * returns `this`. - */ - - }, { - key: "havingStyle", - value: function havingStyle(style) { - if (this.style === style) { - return this; - } else { - return this.extend({ - style: style, - size: sizeAtStyle(this.textSize, style) - }); - } - } - - /** - * Return an options object with a cramped version of the current style. If - * the current style is cramped, returns `this`. - */ - - }, { - key: "havingCrampedStyle", - value: function havingCrampedStyle() { - return this.havingStyle(this.style.cramp()); - } - - /** - * Return an options object with the given size and in at least `\textstyle`. - * Returns `this` if appropriate. - */ - - }, { - key: "havingSize", - value: function havingSize(size) { - if (this.size === size && this.textSize === size) { - return this; - } else { - return this.extend({ - style: this.style.text(), - size: size, - textSize: size, - sizeMultiplier: sizeMultipliers[size - 1] - }); - } - } - - /** - * Like `this.havingSize(BASESIZE).havingStyle(style)`. If `style` is omitted, - * changes to at least `\textstyle`. - */ - - }, { - key: "havingBaseStyle", - value: function havingBaseStyle(style) { - style = style || this.style.text(); - var wantSize = sizeAtStyle(Options.BASESIZE, style); - if (this.size === wantSize && this.textSize === Options.BASESIZE && this.style === style) { - return this; - } else { - return this.extend({ - style: style, - size: wantSize - }); - } - } - - /** - * Create a new options object with the given color. - */ - - }, { - key: "withColor", - value: function withColor(color) { - return this.extend({ - color: color - }); - } - - /** - * Create a new options object with "phantom" set to true. - */ - - }, { - key: "withPhantom", - value: function withPhantom() { - return this.extend({ - phantom: true - }); - } - - /** - * Create a new options objects with the give font. - */ - - }, { - key: "withFontFamily", - value: function withFontFamily(fontFamily) { - return this.extend({ - fontFamily: fontFamily || this.fontFamily - }); - } - - /** - * Creates a new options object with the given font weight - */ - - }, { - key: "withFontWeight", - value: function withFontWeight(fontWeight) { - return this.extend({ - fontWeight: fontWeight - }); - } - - /** - * Creates a new options object with the given font weight - */ - - }, { - key: "withFontShape", - value: function withFontShape(fontShape) { - return this.extend({ - fontShape: fontShape - }); - } - - /** - * Return the CSS sizing classes required to switch from enclosing options - * `oldOptions` to `this`. Returns an array of classes. - */ - - }, { - key: "sizingClasses", - value: function sizingClasses(oldOptions) { - if (oldOptions.size !== this.size) { - return ["sizing", "reset-size" + oldOptions.size, "size" + this.size]; - } else { - return []; - } - } - - /** - * Return the CSS sizing classes required to switch to the base size. Like - * `this.havingSize(BASESIZE).sizingClasses(this)`. - */ - - }, { - key: "baseSizingClasses", - value: function baseSizingClasses() { - if (this.size !== Options.BASESIZE) { - return ["sizing", "reset-size" + this.size, "size" + Options.BASESIZE]; - } else { - return []; - } - } - - /** - * Return the font metrics for this size. - */ - - }, { - key: "fontMetrics", - value: function fontMetrics() { - if (!this._fontMetrics) { - this._fontMetrics = __WEBPACK_IMPORTED_MODULE_2__fontMetrics__["a" /* default */].getFontMetrics(this.size); - } - return this._fontMetrics; - } - - /** - * A map of color names to CSS colors. - * TODO(emily): Remove this when we have real macros - */ - - }, { - key: "getColor", - - - /** - * Gets the CSS color of the current options object, accounting for the - * `colorMap`. - */ - value: function getColor() { - if (this.phantom) { - return "transparent"; - } else if (this.color != null && Options.colorMap.hasOwnProperty(this.color)) { - return Options.colorMap[this.color]; - } else { - return this.color; - } - } - }]); - - return Options; -}(); - -Options.BASESIZE = 6; -Options.colorMap = { - "katex-blue": "#6495ed", - "katex-orange": "#ffa500", - "katex-pink": "#ff00af", - "katex-red": "#df0030", - "katex-green": "#28ae7b", - "katex-gray": "gray", - "katex-purple": "#9d38bd", - "katex-blueA": "#ccfaff", - "katex-blueB": "#80f6ff", - "katex-blueC": "#63d9ea", - "katex-blueD": "#11accd", - "katex-blueE": "#0c7f99", - "katex-tealA": "#94fff5", - "katex-tealB": "#26edd5", - "katex-tealC": "#01d1c1", - "katex-tealD": "#01a995", - "katex-tealE": "#208170", - "katex-greenA": "#b6ffb0", - "katex-greenB": "#8af281", - "katex-greenC": "#74cf70", - "katex-greenD": "#1fab54", - "katex-greenE": "#0d923f", - "katex-goldA": "#ffd0a9", - "katex-goldB": "#ffbb71", - "katex-goldC": "#ff9c39", - "katex-goldD": "#e07d10", - "katex-goldE": "#a75a05", - "katex-redA": "#fca9a9", - "katex-redB": "#ff8482", - "katex-redC": "#f9685d", - "katex-redD": "#e84d39", - "katex-redE": "#bc2612", - "katex-maroonA": "#ffbde0", - "katex-maroonB": "#ff92c6", - "katex-maroonC": "#ed5fa6", - "katex-maroonD": "#ca337c", - "katex-maroonE": "#9e034e", - "katex-purpleA": "#ddd7ff", - "katex-purpleB": "#c6b9fc", - "katex-purpleC": "#aa87ff", - "katex-purpleD": "#7854ab", - "katex-purpleE": "#543b78", - "katex-mintA": "#f5f9e8", - "katex-mintB": "#edf2df", - "katex-mintC": "#e0e5cc", - "katex-grayA": "#f6f7f7", - "katex-grayB": "#f0f1f2", - "katex-grayC": "#e3e5e6", - "katex-grayD": "#d6d8da", - "katex-grayE": "#babec2", - "katex-grayF": "#888d93", - "katex-grayG": "#626569", - "katex-grayH": "#3b3e40", - "katex-grayI": "#21242c", - "katex-kaBlue": "#314453", - "katex-kaGreen": "#71B307" -}; - - -/* harmony default export */ __webpack_exports__["a"] = (Options); - -/***/ }), -/* 44 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__ParseError__ = __webpack_require__(6); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Style__ = __webpack_require__(9); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__domTree__ = __webpack_require__(12); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__fontMetrics__ = __webpack_require__(30); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__symbols__ = __webpack_require__(28); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__utils__ = __webpack_require__(5); -/** - * This file deals with creating delimiters of various sizes. The TeXbook - * discusses these routines on page 441-442, in the "Another subroutine sets box - * x to a specified variable delimiter" paragraph. - * - * There are three main routines here. `makeSmallDelim` makes a delimiter in the - * normal font, but in either text, script, or scriptscript style. - * `makeLargeDelim` makes a delimiter in textstyle, but in one of the Size1, - * Size2, Size3, or Size4 fonts. `makeStackedDelim` makes a delimiter out of - * smaller pieces that are stacked on top of one another. - * - * The functions take a parameter `center`, which determines if the delimiter - * should be centered around the axis. - * - * Then, there are three exposed functions. `sizedDelim` makes a delimiter in - * one of the given sizes. This is used for things like `\bigl`. - * `customSizedDelim` makes a delimiter with a given total height+depth. It is - * called in places like `\sqrt`. `leftRightDelim` makes an appropriate - * delimiter which surrounds an expression of a given height an depth. It is - * used in `\left` and `\right`. - */ - - - - - - - - - - -/** - * Get the metrics for a given symbol and font, after transformation (i.e. - * after following replacement from symbols.js) - */ -var getMetrics = function getMetrics(symbol, font, mode) { - if (__WEBPACK_IMPORTED_MODULE_5__symbols__["a" /* default */].math[symbol] && __WEBPACK_IMPORTED_MODULE_5__symbols__["a" /* default */].math[symbol].replace) { - return __WEBPACK_IMPORTED_MODULE_4__fontMetrics__["a" /* default */].getCharacterMetrics(__WEBPACK_IMPORTED_MODULE_5__symbols__["a" /* default */].math[symbol].replace, font, mode); - } else { - return __WEBPACK_IMPORTED_MODULE_4__fontMetrics__["a" /* default */].getCharacterMetrics(symbol, font, mode); - } -}; - -/** - * Puts a delimiter span in a given style, and adds appropriate height, depth, - * and maxFontSizes. - */ -var styleWrap = function styleWrap(delim, toStyle, options, classes) { - var newOptions = options.havingBaseStyle(toStyle); - - var span = __WEBPACK_IMPORTED_MODULE_3__buildCommon__["a" /* default */].makeSpan((classes || []).concat(newOptions.sizingClasses(options)), [delim], options); - - span.delimSizeMultiplier = newOptions.sizeMultiplier / options.sizeMultiplier; - span.height *= span.delimSizeMultiplier; - span.depth *= span.delimSizeMultiplier; - span.maxFontSize = newOptions.sizeMultiplier; - - return span; -}; - -var centerSpan = function centerSpan(span, options, style) { - var newOptions = options.havingBaseStyle(style); - var shift = (1 - options.sizeMultiplier / newOptions.sizeMultiplier) * options.fontMetrics().axisHeight; - - span.classes.push("delimcenter"); - span.style.top = shift + "em"; - span.height -= shift; - span.depth += shift; -}; - -/** - * Makes a small delimiter. This is a delimiter that comes in the Main-Regular - * font, but is restyled to either be in textstyle, scriptstyle, or - * scriptscriptstyle. - */ -var makeSmallDelim = function makeSmallDelim(delim, style, center, options, mode, classes) { - var text = __WEBPACK_IMPORTED_MODULE_3__buildCommon__["a" /* default */].makeSymbol(delim, "Main-Regular", mode, options); - var span = styleWrap(text, style, options, classes); - if (center) { - centerSpan(span, options, style); - } - return span; -}; - -/** - * Builds a symbol in the given font size (note size is an integer) - */ -var mathrmSize = function mathrmSize(value, size, mode, options) { - return __WEBPACK_IMPORTED_MODULE_3__buildCommon__["a" /* default */].makeSymbol(value, "Size" + size + "-Regular", mode, options); -}; - -/** - * Makes a large delimiter. This is a delimiter that comes in the Size1, Size2, - * Size3, or Size4 fonts. It is always rendered in textstyle. - */ -var makeLargeDelim = function makeLargeDelim(delim, size, center, options, mode, classes) { - var inner = mathrmSize(delim, size, mode, options); - var span = styleWrap(__WEBPACK_IMPORTED_MODULE_3__buildCommon__["a" /* default */].makeSpan(["delimsizing", "size" + size], [inner], options), __WEBPACK_IMPORTED_MODULE_1__Style__["a" /* default */].TEXT, options, classes); - if (center) { - centerSpan(span, options, __WEBPACK_IMPORTED_MODULE_1__Style__["a" /* default */].TEXT); - } - return span; -}; - -/** - * Make an inner span with the given offset and in the given font. This is used - * in `makeStackedDelim` to make the stacking pieces for the delimiter. - */ -var makeInner = function makeInner(symbol, font, mode) { - var sizeClass = void 0; - // Apply the correct CSS class to choose the right font. - if (font === "Size1-Regular") { - sizeClass = "delim-size1"; - } else if (font === "Size4-Regular") { - sizeClass = "delim-size4"; - } - - var inner = __WEBPACK_IMPORTED_MODULE_3__buildCommon__["a" /* default */].makeSpan(["delimsizinginner", sizeClass], [__WEBPACK_IMPORTED_MODULE_3__buildCommon__["a" /* default */].makeSpan([], [__WEBPACK_IMPORTED_MODULE_3__buildCommon__["a" /* default */].makeSymbol(symbol, font, mode)])]); - - // Since this will be passed into `makeVList` in the end, wrap the element - // in the appropriate tag that VList uses. - return { type: "elem", elem: inner }; -}; - -/** - * Make a stacked delimiter out of a given delimiter, with the total height at - * least `heightTotal`. This routine is mentioned on page 442 of the TeXbook. - */ -var makeStackedDelim = function makeStackedDelim(delim, heightTotal, center, options, mode, classes) { - // There are four parts, the top, an optional middle, a repeated part, and a - // bottom. - var top = void 0; - var middle = void 0; - var repeat = void 0; - var bottom = void 0; - top = repeat = bottom = delim; - middle = null; - // Also keep track of what font the delimiters are in - var font = "Size1-Regular"; - - // We set the parts and font based on the symbol. Note that we use - // '\u23d0' instead of '|' and '\u2016' instead of '\\|' for the - // repeats of the arrows - if (delim === "\\uparrow") { - repeat = bottom = "\u23D0"; - } else if (delim === "\\Uparrow") { - repeat = bottom = "\u2016"; - } else if (delim === "\\downarrow") { - top = repeat = "\u23D0"; - } else if (delim === "\\Downarrow") { - top = repeat = "\u2016"; - } else if (delim === "\\updownarrow") { - top = "\\uparrow"; - repeat = "\u23D0"; - bottom = "\\downarrow"; - } else if (delim === "\\Updownarrow") { - top = "\\Uparrow"; - repeat = "\u2016"; - bottom = "\\Downarrow"; - } else if (delim === "[" || delim === "\\lbrack") { - top = "\u23A1"; - repeat = "\u23A2"; - bottom = "\u23A3"; - font = "Size4-Regular"; - } else if (delim === "]" || delim === "\\rbrack") { - top = "\u23A4"; - repeat = "\u23A5"; - bottom = "\u23A6"; - font = "Size4-Regular"; - } else if (delim === "\\lfloor") { - repeat = top = "\u23A2"; - bottom = "\u23A3"; - font = "Size4-Regular"; - } else if (delim === "\\lceil") { - top = "\u23A1"; - repeat = bottom = "\u23A2"; - font = "Size4-Regular"; - } else if (delim === "\\rfloor") { - repeat = top = "\u23A5"; - bottom = "\u23A6"; - font = "Size4-Regular"; - } else if (delim === "\\rceil") { - top = "\u23A4"; - repeat = bottom = "\u23A5"; - font = "Size4-Regular"; - } else if (delim === "(") { - top = "\u239B"; - repeat = "\u239C"; - bottom = "\u239D"; - font = "Size4-Regular"; - } else if (delim === ")") { - top = "\u239E"; - repeat = "\u239F"; - bottom = "\u23A0"; - font = "Size4-Regular"; - } else if (delim === "\\{" || delim === "\\lbrace") { - top = "\u23A7"; - middle = "\u23A8"; - bottom = "\u23A9"; - repeat = "\u23AA"; - font = "Size4-Regular"; - } else if (delim === "\\}" || delim === "\\rbrace") { - top = "\u23AB"; - middle = "\u23AC"; - bottom = "\u23AD"; - repeat = "\u23AA"; - font = "Size4-Regular"; - } else if (delim === "\\lgroup") { - top = "\u23A7"; - bottom = "\u23A9"; - repeat = "\u23AA"; - font = "Size4-Regular"; - } else if (delim === "\\rgroup") { - top = "\u23AB"; - bottom = "\u23AD"; - repeat = "\u23AA"; - font = "Size4-Regular"; - } else if (delim === "\\lmoustache") { - top = "\u23A7"; - bottom = "\u23AD"; - repeat = "\u23AA"; - font = "Size4-Regular"; - } else if (delim === "\\rmoustache") { - top = "\u23AB"; - bottom = "\u23A9"; - repeat = "\u23AA"; - font = "Size4-Regular"; - } - - // Get the metrics of the four sections - var topMetrics = getMetrics(top, font, mode); - var topHeightTotal = topMetrics.height + topMetrics.depth; - var repeatMetrics = getMetrics(repeat, font, mode); - var repeatHeightTotal = repeatMetrics.height + repeatMetrics.depth; - var bottomMetrics = getMetrics(bottom, font, mode); - var bottomHeightTotal = bottomMetrics.height + bottomMetrics.depth; - var middleHeightTotal = 0; - var middleFactor = 1; - if (middle !== null) { - var middleMetrics = getMetrics(middle, font, mode); - middleHeightTotal = middleMetrics.height + middleMetrics.depth; - middleFactor = 2; // repeat symmetrically above and below middle - } - - // Calcuate the minimal height that the delimiter can have. - // It is at least the size of the top, bottom, and optional middle combined. - var minHeight = topHeightTotal + bottomHeightTotal + middleHeightTotal; - - // Compute the number of copies of the repeat symbol we will need - var repeatCount = Math.ceil((heightTotal - minHeight) / (middleFactor * repeatHeightTotal)); - - // Compute the total height of the delimiter including all the symbols - var realHeightTotal = minHeight + repeatCount * middleFactor * repeatHeightTotal; - - // The center of the delimiter is placed at the center of the axis. Note - // that in this context, "center" means that the delimiter should be - // centered around the axis in the current style, while normally it is - // centered around the axis in textstyle. - var axisHeight = options.fontMetrics().axisHeight; - if (center) { - axisHeight *= options.sizeMultiplier; - } - // Calculate the depth - var depth = realHeightTotal / 2 - axisHeight; - - // Now, we start building the pieces that will go into the vlist - - // Keep a list of the inner pieces - var inners = []; - - // Add the bottom symbol - inners.push(makeInner(bottom, font, mode)); - - if (middle === null) { - // Add that many symbols - for (var i = 0; i < repeatCount; i++) { - inners.push(makeInner(repeat, font, mode)); - } - } else { - // When there is a middle bit, we need the middle part and two repeated - // sections - for (var _i = 0; _i < repeatCount; _i++) { - inners.push(makeInner(repeat, font, mode)); - } - inners.push(makeInner(middle, font, mode)); - for (var _i2 = 0; _i2 < repeatCount; _i2++) { - inners.push(makeInner(repeat, font, mode)); - } - } - - // Add the top symbol - inners.push(makeInner(top, font, mode)); - - // Finally, build the vlist - var newOptions = options.havingBaseStyle(__WEBPACK_IMPORTED_MODULE_1__Style__["a" /* default */].TEXT); - var inner = __WEBPACK_IMPORTED_MODULE_3__buildCommon__["a" /* default */].makeVList({ - positionType: "bottom", - positionData: depth, - children: inners - }, newOptions); - - return styleWrap(__WEBPACK_IMPORTED_MODULE_3__buildCommon__["a" /* default */].makeSpan(["delimsizing", "mult"], [inner], newOptions), __WEBPACK_IMPORTED_MODULE_1__Style__["a" /* default */].TEXT, options, classes); -}; - -// All surds have 0.08em padding above the viniculum inside the SVG. -// That keeps browser span height rounding error from pinching the line. -var vbPad = 80; // padding above the surd, measured inside the viewBox. -var emPad = 0.08; // padding, in ems, measured in the document. - -var sqrtSvg = function sqrtSvg(sqrtName, height, viewBoxHeight, options) { - var alternate = void 0; - if (sqrtName === "sqrtTall") { - // sqrtTall is from glyph U23B7 in the font KaTeX_Size4-Regular - // One path edge has a variable length. It runs from the viniculumn - // to a point near (14 units) the bottom of the surd. The viniculum - // is 40 units thick. So the length of the line in question is: - var vertSegment = viewBoxHeight - 54 - vbPad; - alternate = "M702 " + vbPad + "H400000v40H742v" + vertSegment + "l-4 4-4 4c-.667.7\n-2 1.5-4 2.5s-4.167 1.833-6.5 2.5-5.5 1-9.5 1h-12l-28-84c-16.667-52-96.667\n-294.333-240-727l-212 -643 -85 170c-4-3.333-8.333-7.667-13 -13l-13-13l77-155\n 77-156c66 199.333 139 419.667 219 661 l218 661zM702 " + vbPad + "H400000v40H742z"; - } - var pathNode = new __WEBPACK_IMPORTED_MODULE_2__domTree__["a" /* default */].pathNode(sqrtName, alternate); - - var svg = new __WEBPACK_IMPORTED_MODULE_2__domTree__["a" /* default */].svgNode([pathNode], { - // Note: 1000:1 ratio of viewBox to document em width. - "width": "400em", - "height": height + "em", - "viewBox": "0 0 400000 " + viewBoxHeight, - "preserveAspectRatio": "xMinYMin slice" - }); - - return __WEBPACK_IMPORTED_MODULE_3__buildCommon__["a" /* default */].makeSpan(["hide-tail"], [svg], options); -}; - -/** - * Make a sqrt image of the given height, - */ -var makeSqrtImage = function makeSqrtImage(height, options) { - var delim = traverseSequence("\\surd", height, stackLargeDelimiterSequence, options); - - // Create a span containing an SVG image of a sqrt symbol. - var span = void 0; - var sizeMultiplier = options.sizeMultiplier; // default - var spanHeight = 0; - var texHeight = 0; - var viewBoxHeight = 0; - - // We create viewBoxes with 80 units of "padding" above each surd. - // Then browser rounding error on the parent span height will not - // encroach on the ink of the viniculum. But that padding is not - // included in the TeX-like `height` used for calculation of - // vertical alignment. So texHeight = span.height < span.style.height. - - if (delim.type === "small") { - // Get an SVG that is derived from glyph U+221A in font KaTeX-Main. - viewBoxHeight = 1000 + vbPad; // 1000 unit glyph height. - var newOptions = options.havingBaseStyle(delim.style); - sizeMultiplier = newOptions.sizeMultiplier / options.sizeMultiplier; - spanHeight = (1.0 + emPad) * sizeMultiplier; - texHeight = 1.00 * sizeMultiplier; - span = sqrtSvg("sqrtMain", spanHeight, viewBoxHeight, options); - span.style.minWidth = "0.853em"; - span.advanceWidth = 0.833 * sizeMultiplier; // from the font. - } else if (delim.type === "large") { - // These SVGs come from fonts: KaTeX_Size1, _Size2, etc. - viewBoxHeight = (1000 + vbPad) * sizeToMaxHeight[delim.size]; - texHeight = sizeToMaxHeight[delim.size] / sizeMultiplier; - spanHeight = (sizeToMaxHeight[delim.size] + emPad) / sizeMultiplier; - span = sqrtSvg("sqrtSize" + delim.size, spanHeight, viewBoxHeight, options); - span.style.minWidth = "1.02em"; - span.advanceWidth = 1.0 / sizeMultiplier; // from the font - } else { - // Tall sqrt. In TeX, this would be stacked using multiple glyphs. - // We'll use a single SVG to accomplish the same thing. - spanHeight = height / sizeMultiplier + emPad; - texHeight = height / sizeMultiplier; - viewBoxHeight = Math.floor(1000 * height) + vbPad; - span = sqrtSvg("sqrtTall", spanHeight, viewBoxHeight, options); - span.style.minWidth = "0.742em"; - span.advanceWidth = 1.056 / sizeMultiplier; - } - - span.height = texHeight; - span.style.height = spanHeight + "em"; - - return { - span: span, - // Calculate the actual line width. - // This actually should depend on the chosen font -- e.g. \boldmath - // should use the thicker surd symbols from e.g. KaTeX_Main-Bold, and - // have thicker rules. - ruleWidth: options.fontMetrics().sqrtRuleThickness * sizeMultiplier - }; -}; - -// There are three kinds of delimiters, delimiters that stack when they become -// too large -var stackLargeDelimiters = ["(", ")", "[", "\\lbrack", "]", "\\rbrack", "\\{", "\\lbrace", "\\}", "\\rbrace", "\\lfloor", "\\rfloor", "\\lceil", "\\rceil", "\\surd"]; - -// delimiters that always stack -var stackAlwaysDelimiters = ["\\uparrow", "\\downarrow", "\\updownarrow", "\\Uparrow", "\\Downarrow", "\\Updownarrow", "|", "\\|", "\\vert", "\\Vert", "\\lvert", "\\rvert", "\\lVert", "\\rVert", "\\lgroup", "\\rgroup", "\\lmoustache", "\\rmoustache"]; - -// and delimiters that never stack -var stackNeverDelimiters = ["<", ">", "\\langle", "\\rangle", "/", "\\backslash", "\\lt", "\\gt"]; - -// Metrics of the different sizes. Found by looking at TeX's output of -// $\bigl| // \Bigl| \biggl| \Biggl| \showlists$ -// Used to create stacked delimiters of appropriate sizes in makeSizedDelim. -var sizeToMaxHeight = [0, 1.2, 1.8, 2.4, 3.0]; - -/** - * Used to create a delimiter of a specific size, where `size` is 1, 2, 3, or 4. - */ -var makeSizedDelim = function makeSizedDelim(delim, size, options, mode, classes) { - // < and > turn into \langle and \rangle in delimiters - if (delim === "<" || delim === "\\lt" || delim === "\u27E8") { - delim = "\\langle"; - } else if (delim === ">" || delim === "\\gt" || delim === "\u27E9") { - delim = "\\rangle"; - } - - // Sized delimiters are never centered. - if (__WEBPACK_IMPORTED_MODULE_6__utils__["a" /* default */].contains(stackLargeDelimiters, delim) || __WEBPACK_IMPORTED_MODULE_6__utils__["a" /* default */].contains(stackNeverDelimiters, delim)) { - return makeLargeDelim(delim, size, false, options, mode, classes); - } else if (__WEBPACK_IMPORTED_MODULE_6__utils__["a" /* default */].contains(stackAlwaysDelimiters, delim)) { - return makeStackedDelim(delim, sizeToMaxHeight[size], false, options, mode, classes); - } else { - throw new __WEBPACK_IMPORTED_MODULE_0__ParseError__["a" /* default */]("Illegal delimiter: '" + delim + "'"); - } -}; - -/** - * There are three different sequences of delimiter sizes that the delimiters - * follow depending on the kind of delimiter. This is used when creating custom - * sized delimiters to decide whether to create a small, large, or stacked - * delimiter. - * - * In real TeX, these sequences aren't explicitly defined, but are instead - * defined inside the font metrics. Since there are only three sequences that - * are possible for the delimiters that TeX defines, it is easier to just encode - * them explicitly here. - */ - -// Delimiters that never stack try small delimiters and large delimiters only -var stackNeverDelimiterSequence = [{ type: "small", style: __WEBPACK_IMPORTED_MODULE_1__Style__["a" /* default */].SCRIPTSCRIPT }, { type: "small", style: __WEBPACK_IMPORTED_MODULE_1__Style__["a" /* default */].SCRIPT }, { type: "small", style: __WEBPACK_IMPORTED_MODULE_1__Style__["a" /* default */].TEXT }, { type: "large", size: 1 }, { type: "large", size: 2 }, { type: "large", size: 3 }, { type: "large", size: 4 }]; - -// Delimiters that always stack try the small delimiters first, then stack -var stackAlwaysDelimiterSequence = [{ type: "small", style: __WEBPACK_IMPORTED_MODULE_1__Style__["a" /* default */].SCRIPTSCRIPT }, { type: "small", style: __WEBPACK_IMPORTED_MODULE_1__Style__["a" /* default */].SCRIPT }, { type: "small", style: __WEBPACK_IMPORTED_MODULE_1__Style__["a" /* default */].TEXT }, { type: "stack" }]; - -// Delimiters that stack when large try the small and then large delimiters, and -// stack afterwards -var stackLargeDelimiterSequence = [{ type: "small", style: __WEBPACK_IMPORTED_MODULE_1__Style__["a" /* default */].SCRIPTSCRIPT }, { type: "small", style: __WEBPACK_IMPORTED_MODULE_1__Style__["a" /* default */].SCRIPT }, { type: "small", style: __WEBPACK_IMPORTED_MODULE_1__Style__["a" /* default */].TEXT }, { type: "large", size: 1 }, { type: "large", size: 2 }, { type: "large", size: 3 }, { type: "large", size: 4 }, { type: "stack" }]; - -/** - * Get the font used in a delimiter based on what kind of delimiter it is. - */ -var delimTypeToFont = function delimTypeToFont(type) { - if (type.type === "small") { - return "Main-Regular"; - } else if (type.type === "large") { - return "Size" + type.size + "-Regular"; - } else if (type.type === "stack") { - return "Size4-Regular"; - } -}; - -/** - * Traverse a sequence of types of delimiters to decide what kind of delimiter - * should be used to create a delimiter of the given height+depth. - */ -var traverseSequence = function traverseSequence(delim, height, sequence, options) { - // Here, we choose the index we should start at in the sequences. In smaller - // sizes (which correspond to larger numbers in style.size) we start earlier - // in the sequence. Thus, scriptscript starts at index 3-3=0, script starts - // at index 3-2=1, text starts at 3-1=2, and display starts at min(2,3-0)=2 - var start = Math.min(2, 3 - options.style.size); - for (var i = start; i < sequence.length; i++) { - if (sequence[i].type === "stack") { - // This is always the last delimiter, so we just break the loop now. - break; - } - - var metrics = getMetrics(delim, delimTypeToFont(sequence[i]), "math"); - var heightDepth = metrics.height + metrics.depth; - - // Small delimiters are scaled down versions of the same font, so we - // account for the style change size. - - if (sequence[i].type === "small") { - var newOptions = options.havingBaseStyle(sequence[i].style); - heightDepth *= newOptions.sizeMultiplier; - } - - // Check if the delimiter at this size works for the given height. - if (heightDepth > height) { - return sequence[i]; - } - } - - // If we reached the end of the sequence, return the last sequence element. - return sequence[sequence.length - 1]; -}; - -/** - * Make a delimiter of a given height+depth, with optional centering. Here, we - * traverse the sequences, and create a delimiter that the sequence tells us to. - */ -var makeCustomSizedDelim = function makeCustomSizedDelim(delim, height, center, options, mode, classes) { - if (delim === "<" || delim === "\\lt" || delim === "\u27E8") { - delim = "\\langle"; - } else if (delim === ">" || delim === "\\gt" || delim === "\u27E9") { - delim = "\\rangle"; - } - - // Decide what sequence to use - var sequence = void 0; - if (__WEBPACK_IMPORTED_MODULE_6__utils__["a" /* default */].contains(stackNeverDelimiters, delim)) { - sequence = stackNeverDelimiterSequence; - } else if (__WEBPACK_IMPORTED_MODULE_6__utils__["a" /* default */].contains(stackLargeDelimiters, delim)) { - sequence = stackLargeDelimiterSequence; - } else { - sequence = stackAlwaysDelimiterSequence; - } - - // Look through the sequence - var delimType = traverseSequence(delim, height, sequence, options); - - // Get the delimiter from font glyphs. - // Depending on the sequence element we decided on, call the - // appropriate function. - if (delimType.type === "small") { - return makeSmallDelim(delim, delimType.style, center, options, mode, classes); - } else if (delimType.type === "large") { - return makeLargeDelim(delim, delimType.size, center, options, mode, classes); - } else /* if (delimType.type === "stack") */{ - return makeStackedDelim(delim, height, center, options, mode, classes); - } -}; - -/** - * Make a delimiter for use with `\left` and `\right`, given a height and depth - * of an expression that the delimiters surround. - */ -var makeLeftRightDelim = function makeLeftRightDelim(delim, height, depth, options, mode, classes) { - // We always center \left/\right delimiters, so the axis is always shifted - var axisHeight = options.fontMetrics().axisHeight * options.sizeMultiplier; - - // Taken from TeX source, tex.web, function make_left_right - var delimiterFactor = 901; - var delimiterExtend = 5.0 / options.fontMetrics().ptPerEm; - - var maxDistFromAxis = Math.max(height - axisHeight, depth + axisHeight); - - var totalHeight = Math.max( - // In real TeX, calculations are done using integral values which are - // 65536 per pt, or 655360 per em. So, the division here truncates in - // TeX but doesn't here, producing different results. If we wanted to - // exactly match TeX's calculation, we could do - // Math.floor(655360 * maxDistFromAxis / 500) * - // delimiterFactor / 655360 - // (To see the difference, compare - // x^{x^{\left(\rule{0.1em}{0.68em}\right)}} - // in TeX and KaTeX) - maxDistFromAxis / 500 * delimiterFactor, 2 * maxDistFromAxis - delimiterExtend); - - // Finally, we defer to `makeCustomSizedDelim` with our calculated total - // height - return makeCustomSizedDelim(delim, totalHeight, true, options, mode, classes); -}; - -/* harmony default export */ __webpack_exports__["a"] = ({ - sqrtImage: makeSqrtImage, - sizedDelim: makeSizedDelim, - customSizedDelim: makeCustomSizedDelim, - leftRightDelim: makeLeftRightDelim -}); - -/***/ }), -/* 45 */ -/***/ (function(module, exports, __webpack_require__) { - -var isObject = __webpack_require__(20) - , document = __webpack_require__(16).document - // in old IE typeof document.createElement is 'object' - , is = isObject(document) && isObject(document.createElement); -module.exports = function(it){ - return is ? document.createElement(it) : {}; -}; - -/***/ }), -/* 46 */ -/***/ (function(module, exports, __webpack_require__) { - -// most Object methods by ES6 should accept primitives -var $export = __webpack_require__(25) - , core = __webpack_require__(8) - , fails = __webpack_require__(24); -module.exports = function(KEY, exec){ - var fn = (core.Object || {})[KEY] || Object[KEY] - , exp = {}; - exp[KEY] = exec(fn); - $export($export.S + $export.F * fails(function(){ fn(1); }), 'Object', exp); -}; - -/***/ }), -/* 47 */ -/***/ (function(module, exports, __webpack_require__) { - -// optional / simple context binding -var aFunction = __webpack_require__(72); -module.exports = function(fn, that, length){ - aFunction(fn); - if(that === undefined)return fn; - switch(length){ - case 1: return function(a){ - return fn.call(that, a); - }; - case 2: return function(a, b){ - return fn.call(that, a, b); - }; - case 3: return function(a, b, c){ - return fn.call(that, a, b, c); - }; - } - return function(/* ...args */){ - return fn.apply(that, arguments); - }; -}; - -/***/ }), -/* 48 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var LIBRARY = __webpack_require__(82) - , $export = __webpack_require__(25) - , redefine = __webpack_require__(83) - , hide = __webpack_require__(26) - , has = __webpack_require__(21) - , Iterators = __webpack_require__(17) - , $iterCreate = __webpack_require__(84) - , setToStringTag = __webpack_require__(54) - , getPrototypeOf = __webpack_require__(91) - , ITERATOR = __webpack_require__(11)('iterator') - , BUGGY = !([].keys && 'next' in [].keys()) // Safari has buggy iterators w/o `next` - , FF_ITERATOR = '@@iterator' - , KEYS = 'keys' - , VALUES = 'values'; - -var returnThis = function(){ return this; }; - -module.exports = function(Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED){ - $iterCreate(Constructor, NAME, next); - var getMethod = function(kind){ - if(!BUGGY && kind in proto)return proto[kind]; - switch(kind){ - case KEYS: return function keys(){ return new Constructor(this, kind); }; - case VALUES: return function values(){ return new Constructor(this, kind); }; - } return function entries(){ return new Constructor(this, kind); }; - }; - var TAG = NAME + ' Iterator' - , DEF_VALUES = DEFAULT == VALUES - , VALUES_BUG = false - , proto = Base.prototype - , $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT] - , $default = $native || getMethod(DEFAULT) - , $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined - , $anyNative = NAME == 'Array' ? proto.entries || $native : $native - , methods, key, IteratorPrototype; - // Fix native - if($anyNative){ - IteratorPrototype = getPrototypeOf($anyNative.call(new Base)); - if(IteratorPrototype !== Object.prototype){ - // Set @@toStringTag to native iterators - setToStringTag(IteratorPrototype, TAG, true); - // fix for some old engines - if(!LIBRARY && !has(IteratorPrototype, ITERATOR))hide(IteratorPrototype, ITERATOR, returnThis); - } - } - // fix Array#{values, @@iterator}.name in V8 / FF - if(DEF_VALUES && $native && $native.name !== VALUES){ - VALUES_BUG = true; - $default = function values(){ return $native.call(this); }; - } - // Define iterator - if((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])){ - hide(proto, ITERATOR, $default); - } - // Plug for library - Iterators[NAME] = $default; - Iterators[TAG] = returnThis; - if(DEFAULT){ - methods = { - values: DEF_VALUES ? $default : getMethod(VALUES), - keys: IS_SET ? $default : getMethod(KEYS), - entries: $entries - }; - if(FORCED)for(key in methods){ - if(!(key in proto))redefine(proto, key, methods[key]); - } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods); - } - return methods; -}; - -/***/ }), -/* 49 */ -/***/ (function(module, exports, __webpack_require__) { - -// fallback for non-array-like ES3 and non-enumerable old V8 strings -var cof = __webpack_require__(50); -module.exports = Object('z').propertyIsEnumerable(0) ? Object : function(it){ - return cof(it) == 'String' ? it.split('') : Object(it); -}; - -/***/ }), -/* 50 */ -/***/ (function(module, exports) { - -var toString = {}.toString; - -module.exports = function(it){ - return toString.call(it).slice(8, -1); -}; - -/***/ }), -/* 51 */ -/***/ (function(module, exports, __webpack_require__) { - -// 7.1.15 ToLength -var toInteger = __webpack_require__(37) - , min = Math.min; -module.exports = function(it){ - return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991 -}; - -/***/ }), -/* 52 */ -/***/ (function(module, exports, __webpack_require__) { - -var global = __webpack_require__(16) - , SHARED = '__core-js_shared__' - , store = global[SHARED] || (global[SHARED] = {}); -module.exports = function(key){ - return store[key] || (store[key] = {}); -}; - -/***/ }), -/* 53 */ -/***/ (function(module, exports) { - -// IE 8- don't enum bug keys -module.exports = ( - 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf' -).split(','); - -/***/ }), -/* 54 */ -/***/ (function(module, exports, __webpack_require__) { - -var def = __webpack_require__(15).f - , has = __webpack_require__(21) - , TAG = __webpack_require__(11)('toStringTag'); - -module.exports = function(it, tag, stat){ - if(it && !has(it = stat ? it : it.prototype, TAG))def(it, TAG, {configurable: true, value: tag}); -}; - -/***/ }), -/* 55 */ -/***/ (function(module, exports, __webpack_require__) { - -var classof = __webpack_require__(56) - , ITERATOR = __webpack_require__(11)('iterator') - , Iterators = __webpack_require__(17); -module.exports = __webpack_require__(8).getIteratorMethod = function(it){ - if(it != undefined)return it[ITERATOR] - || it['@@iterator'] - || Iterators[classof(it)]; -}; - -/***/ }), -/* 56 */ -/***/ (function(module, exports, __webpack_require__) { - -// getting tag from 19.1.3.6 Object.prototype.toString() -var cof = __webpack_require__(50) - , TAG = __webpack_require__(11)('toStringTag') - // ES3 wrong here - , ARG = cof(function(){ return arguments; }()) == 'Arguments'; - -// fallback for IE11 Script Access Denied error -var tryGet = function(it, key){ - try { - return it[key]; - } catch(e){ /* empty */ } -}; - -module.exports = function(it){ - var O, T, B; - return it === undefined ? 'Undefined' : it === null ? 'Null' - // @@toStringTag case - : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T - // builtinTag case - : ARG ? cof(O) - // ES3 arguments fallback - : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B; -}; - -/***/ }), -/* 57 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -exports.__esModule = true; - -var _isIterable2 = __webpack_require__(97); - -var _isIterable3 = _interopRequireDefault(_isIterable2); - -var _getIterator2 = __webpack_require__(18); - -var _getIterator3 = _interopRequireDefault(_getIterator2); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -exports.default = function () { - function sliceIterator(arr, i) { - var _arr = []; - var _n = true; - var _d = false; - var _e = undefined; - - try { - for (var _i = (0, _getIterator3.default)(arr), _s; !(_n = (_s = _i.next()).done); _n = true) { - _arr.push(_s.value); - - if (i && _arr.length === i) break; - } - } catch (err) { - _d = true; - _e = err; - } finally { - try { - if (!_n && _i["return"]) _i["return"](); - } finally { - if (_d) throw _e; - } - } - - return _arr; - } - - return function (arr, i) { - if (Array.isArray(arr)) { - return arr; - } else if ((0, _isIterable3.default)(Object(arr))) { - return sliceIterator(arr, i); - } else { - throw new TypeError("Invalid attempt to destructure non-iterable instance"); - } - }; -}(); - -/***/ }), -/* 58 */ -/***/ (function(module, exports, __webpack_require__) { - -__webpack_require__(99); -var global = __webpack_require__(16) - , hide = __webpack_require__(26) - , Iterators = __webpack_require__(17) - , TO_STRING_TAG = __webpack_require__(11)('toStringTag'); - -for(var collections = ['NodeList', 'DOMTokenList', 'MediaList', 'StyleSheetList', 'CSSRuleList'], i = 0; i < 5; i++){ - var NAME = collections[i] - , Collection = global[NAME] - , proto = Collection && Collection.prototype; - if(proto && !proto[TO_STRING_TAG])hide(proto, TO_STRING_TAG, NAME); - Iterators[NAME] = Iterators.Array; -} - -/***/ }), -/* 59 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony default export */ __webpack_exports__["a"] = ({ - "AMS-Regular": { - "65": [0, 0.68889, 0, 0, 0.72222], - "66": [0, 0.68889, 0, 0, 0.66667], - "67": [0, 0.68889, 0, 0, 0.72222], - "68": [0, 0.68889, 0, 0, 0.72222], - "69": [0, 0.68889, 0, 0, 0.66667], - "70": [0, 0.68889, 0, 0, 0.61111], - "71": [0, 0.68889, 0, 0, 0.77778], - "72": [0, 0.68889, 0, 0, 0.77778], - "73": [0, 0.68889, 0, 0, 0.38889], - "74": [0.16667, 0.68889, 0, 0, 0.5], - "75": [0, 0.68889, 0, 0, 0.77778], - "76": [0, 0.68889, 0, 0, 0.66667], - "77": [0, 0.68889, 0, 0, 0.94445], - "78": [0, 0.68889, 0, 0, 0.72222], - "79": [0.16667, 0.68889, 0, 0, 0.77778], - "80": [0, 0.68889, 0, 0, 0.61111], - "81": [0.16667, 0.68889, 0, 0, 0.77778], - "82": [0, 0.68889, 0, 0, 0.72222], - "83": [0, 0.68889, 0, 0, 0.55556], - "84": [0, 0.68889, 0, 0, 0.66667], - "85": [0, 0.68889, 0, 0, 0.72222], - "86": [0, 0.68889, 0, 0, 0.72222], - "87": [0, 0.68889, 0, 0, 1.0], - "88": [0, 0.68889, 0, 0, 0.72222], - "89": [0, 0.68889, 0, 0, 0.72222], - "90": [0, 0.68889, 0, 0, 0.66667], - "107": [0, 0.68889, 0, 0, 0.55556], - "165": [0, 0.675, 0.025, 0, 0.75], - "174": [0.15559, 0.69224, 0, 0, 0.94666], - "240": [0, 0.68889, 0, 0, 0.55556], - "295": [0, 0.68889, 0, 0, 0.54028], - "710": [0, 0.825, 0, 0, 2.33334], - "732": [0, 0.9, 0, 0, 2.33334], - "770": [0, 0.825, 0, 0, 2.33334], - "771": [0, 0.9, 0, 0, 2.33334], - "989": [0.08167, 0.58167, 0, 0, 0.77778], - "1008": [0, 0.43056, 0.04028, 0, 0.66667], - "8245": [0, 0.54986, 0, 0, 0.275], - "8463": [0, 0.68889, 0, 0, 0.54028], - "8487": [0, 0.68889, 0, 0, 0.72222], - "8498": [0, 0.68889, 0, 0, 0.55556], - "8502": [0, 0.68889, 0, 0, 0.66667], - "8503": [0, 0.68889, 0, 0, 0.44445], - "8504": [0, 0.68889, 0, 0, 0.66667], - "8513": [0, 0.68889, 0, 0, 0.63889], - "8592": [-0.03598, 0.46402, 0, 0, 0.5], - "8594": [-0.03598, 0.46402, 0, 0, 0.5], - "8602": [-0.13313, 0.36687, 0, 0, 1.0], - "8603": [-0.13313, 0.36687, 0, 0, 1.0], - "8606": [0.01354, 0.52239, 0, 0, 1.0], - "8608": [0.01354, 0.52239, 0, 0, 1.0], - "8610": [0.01354, 0.52239, 0, 0, 1.11111], - "8611": [0.01354, 0.52239, 0, 0, 1.11111], - "8619": [0, 0.54986, 0, 0, 1.0], - "8620": [0, 0.54986, 0, 0, 1.0], - "8621": [-0.13313, 0.37788, 0, 0, 1.38889], - "8622": [-0.13313, 0.36687, 0, 0, 1.0], - "8624": [0, 0.69224, 0, 0, 0.5], - "8625": [0, 0.69224, 0, 0, 0.5], - "8630": [0, 0.43056, 0, 0, 1.0], - "8631": [0, 0.43056, 0, 0, 1.0], - "8634": [0.08198, 0.58198, 0, 0, 0.77778], - "8635": [0.08198, 0.58198, 0, 0, 0.77778], - "8638": [0.19444, 0.69224, 0, 0, 0.41667], - "8639": [0.19444, 0.69224, 0, 0, 0.41667], - "8642": [0.19444, 0.69224, 0, 0, 0.41667], - "8643": [0.19444, 0.69224, 0, 0, 0.41667], - "8644": [0.1808, 0.675, 0, 0, 1.0], - "8646": [0.1808, 0.675, 0, 0, 1.0], - "8647": [0.1808, 0.675, 0, 0, 1.0], - "8648": [0.19444, 0.69224, 0, 0, 0.83334], - "8649": [0.1808, 0.675, 0, 0, 1.0], - "8650": [0.19444, 0.69224, 0, 0, 0.83334], - "8651": [0.01354, 0.52239, 0, 0, 1.0], - "8652": [0.01354, 0.52239, 0, 0, 1.0], - "8653": [-0.13313, 0.36687, 0, 0, 1.0], - "8654": [-0.13313, 0.36687, 0, 0, 1.0], - "8655": [-0.13313, 0.36687, 0, 0, 1.0], - "8666": [0.13667, 0.63667, 0, 0, 1.0], - "8667": [0.13667, 0.63667, 0, 0, 1.0], - "8669": [-0.13313, 0.37788, 0, 0, 1.0], - "8672": [-0.064, 0.437, 0, 0, 1187], - "8674": [-0.064, 0.437, 0, 0, 1167], - "8705": [0, 0.825, 0, 0, 0.5], - "8708": [0, 0.68889, 0, 0, 0.55556], - "8709": [0.08167, 0.58167, 0, 0, 0.77778], - "8717": [0, 0.43056, 0, 0, 0.42917], - "8722": [-0.03598, 0.46402, 0, 0, 0.5], - "8724": [0.08198, 0.69224, 0, 0, 0.77778], - "8726": [0.08167, 0.58167, 0, 0, 0.77778], - "8733": [0, 0.69224, 0, 0, 0.77778], - "8736": [0, 0.69224, 0, 0, 0.72222], - "8737": [0, 0.69224, 0, 0, 0.72222], - "8738": [0.03517, 0.52239, 0, 0, 0.72222], - "8739": [0.08167, 0.58167, 0, 0, 0.22222], - "8740": [0.25142, 0.74111, 0, 0, 0.27778], - "8741": [0.08167, 0.58167, 0, 0, 0.38889], - "8742": [0.25142, 0.74111, 0, 0, 0.5], - "8756": [0, 0.69224, 0, 0, 0.66667], - "8757": [0, 0.69224, 0, 0, 0.66667], - "8764": [-0.13313, 0.36687, 0, 0, 0.77778], - "8765": [-0.13313, 0.37788, 0, 0, 0.77778], - "8769": [-0.13313, 0.36687, 0, 0, 0.77778], - "8770": [-0.03625, 0.46375, 0, 0, 0.77778], - "8774": [0.30274, 0.79383, 0, 0, 0.77778], - "8776": [-0.01688, 0.48312, 0, 0, 0.77778], - "8778": [0.08167, 0.58167, 0, 0, 0.77778], - "8782": [0.06062, 0.54986, 0, 0, 0.77778], - "8783": [0.06062, 0.54986, 0, 0, 0.77778], - "8785": [0.08198, 0.58198, 0, 0, 0.77778], - "8786": [0.08198, 0.58198, 0, 0, 0.77778], - "8787": [0.08198, 0.58198, 0, 0, 0.77778], - "8790": [0, 0.69224, 0, 0, 0.77778], - "8791": [0.22958, 0.72958, 0, 0, 0.77778], - "8796": [0.08198, 0.91667, 0, 0, 0.77778], - "8806": [0.25583, 0.75583, 0, 0, 0.77778], - "8807": [0.25583, 0.75583, 0, 0, 0.77778], - "8808": [0.25142, 0.75726, 0, 0, 0.77778], - "8809": [0.25142, 0.75726, 0, 0, 0.77778], - "8812": [0.25583, 0.75583, 0, 0, 0.5], - "8814": [0.20576, 0.70576, 0, 0, 0.77778], - "8815": [0.20576, 0.70576, 0, 0, 0.77778], - "8816": [0.30274, 0.79383, 0, 0, 0.77778], - "8817": [0.30274, 0.79383, 0, 0, 0.77778], - "8818": [0.22958, 0.72958, 0, 0, 0.77778], - "8819": [0.22958, 0.72958, 0, 0, 0.77778], - "8822": [0.1808, 0.675, 0, 0, 0.77778], - "8823": [0.1808, 0.675, 0, 0, 0.77778], - "8828": [0.13667, 0.63667, 0, 0, 0.77778], - "8829": [0.13667, 0.63667, 0, 0, 0.77778], - "8830": [0.22958, 0.72958, 0, 0, 0.77778], - "8831": [0.22958, 0.72958, 0, 0, 0.77778], - "8832": [0.20576, 0.70576, 0, 0, 0.77778], - "8833": [0.20576, 0.70576, 0, 0, 0.77778], - "8840": [0.30274, 0.79383, 0, 0, 0.77778], - "8841": [0.30274, 0.79383, 0, 0, 0.77778], - "8842": [0.13597, 0.63597, 0, 0, 0.77778], - "8843": [0.13597, 0.63597, 0, 0, 0.77778], - "8847": [0.03517, 0.54986, 0, 0, 0.77778], - "8848": [0.03517, 0.54986, 0, 0, 0.77778], - "8858": [0.08198, 0.58198, 0, 0, 0.77778], - "8859": [0.08198, 0.58198, 0, 0, 0.77778], - "8861": [0.08198, 0.58198, 0, 0, 0.77778], - "8862": [0, 0.675, 0, 0, 0.77778], - "8863": [0, 0.675, 0, 0, 0.77778], - "8864": [0, 0.675, 0, 0, 0.77778], - "8865": [0, 0.675, 0, 0, 0.77778], - "8872": [0, 0.69224, 0, 0, 0.61111], - "8873": [0, 0.69224, 0, 0, 0.72222], - "8874": [0, 0.69224, 0, 0, 0.88889], - "8876": [0, 0.68889, 0, 0, 0.61111], - "8877": [0, 0.68889, 0, 0, 0.61111], - "8878": [0, 0.68889, 0, 0, 0.72222], - "8879": [0, 0.68889, 0, 0, 0.72222], - "8882": [0.03517, 0.54986, 0, 0, 0.77778], - "8883": [0.03517, 0.54986, 0, 0, 0.77778], - "8884": [0.13667, 0.63667, 0, 0, 0.77778], - "8885": [0.13667, 0.63667, 0, 0, 0.77778], - "8888": [0, 0.54986, 0, 0, 1.11111], - "8890": [0.19444, 0.43056, 0, 0, 0.55556], - "8891": [0.19444, 0.69224, 0, 0, 0.61111], - "8892": [0.19444, 0.69224, 0, 0, 0.61111], - "8901": [0, 0.54986, 0, 0, 0.27778], - "8903": [0.08167, 0.58167, 0, 0, 0.77778], - "8905": [0.08167, 0.58167, 0, 0, 0.77778], - "8906": [0.08167, 0.58167, 0, 0, 0.77778], - "8907": [0, 0.69224, 0, 0, 0.77778], - "8908": [0, 0.69224, 0, 0, 0.77778], - "8909": [-0.03598, 0.46402, 0, 0, 0.77778], - "8910": [0, 0.54986, 0, 0, 0.76042], - "8911": [0, 0.54986, 0, 0, 0.76042], - "8912": [0.03517, 0.54986, 0, 0, 0.77778], - "8913": [0.03517, 0.54986, 0, 0, 0.77778], - "8914": [0, 0.54986, 0, 0, 0.66667], - "8915": [0, 0.54986, 0, 0, 0.66667], - "8916": [0, 0.69224, 0, 0, 0.66667], - "8918": [0.0391, 0.5391, 0, 0, 0.77778], - "8919": [0.0391, 0.5391, 0, 0, 0.77778], - "8920": [0.03517, 0.54986, 0, 0, 1.33334], - "8921": [0.03517, 0.54986, 0, 0, 1.33334], - "8922": [0.38569, 0.88569, 0, 0, 0.77778], - "8923": [0.38569, 0.88569, 0, 0, 0.77778], - "8926": [0.13667, 0.63667, 0, 0, 0.77778], - "8927": [0.13667, 0.63667, 0, 0, 0.77778], - "8928": [0.30274, 0.79383, 0, 0, 0.77778], - "8929": [0.30274, 0.79383, 0, 0, 0.77778], - "8934": [0.23222, 0.74111, 0, 0, 0.77778], - "8935": [0.23222, 0.74111, 0, 0, 0.77778], - "8936": [0.23222, 0.74111, 0, 0, 0.77778], - "8937": [0.23222, 0.74111, 0, 0, 0.77778], - "8938": [0.20576, 0.70576, 0, 0, 0.77778], - "8939": [0.20576, 0.70576, 0, 0, 0.77778], - "8940": [0.30274, 0.79383, 0, 0, 0.77778], - "8941": [0.30274, 0.79383, 0, 0, 0.77778], - "8994": [0.19444, 0.69224, 0, 0, 0.77778], - "8995": [0.19444, 0.69224, 0, 0, 0.77778], - "9416": [0.15559, 0.69224, 0, 0, 0.90222], - "9484": [0, 0.69224, 0, 0, 0.5], - "9488": [0, 0.69224, 0, 0, 0.5], - "9492": [0, 0.37788, 0, 0, 0.5], - "9496": [0, 0.37788, 0, 0, 0.5], - "9585": [0.19444, 0.68889, 0, 0, 0.88889], - "9586": [0.19444, 0.74111, 0, 0, 0.88889], - "9632": [0, 0.675, 0, 0, 0.77778], - "9633": [0, 0.675, 0, 0, 0.77778], - "9650": [0, 0.54986, 0, 0, 0.72222], - "9651": [0, 0.54986, 0, 0, 0.72222], - "9654": [0.03517, 0.54986, 0, 0, 0.77778], - "9660": [0, 0.54986, 0, 0, 0.72222], - "9661": [0, 0.54986, 0, 0, 0.72222], - "9664": [0.03517, 0.54986, 0, 0, 0.77778], - "9674": [0.11111, 0.69224, 0, 0, 0.66667], - "9733": [0.19444, 0.69224, 0, 0, 0.94445], - "10003": [0, 0.69224, 0, 0, 0.83334], - "10016": [0, 0.69224, 0, 0, 0.83334], - "10731": [0.11111, 0.69224, 0, 0, 0.66667], - "10846": [0.19444, 0.75583, 0, 0, 0.61111], - "10877": [0.13667, 0.63667, 0, 0, 0.77778], - "10878": [0.13667, 0.63667, 0, 0, 0.77778], - "10885": [0.25583, 0.75583, 0, 0, 0.77778], - "10886": [0.25583, 0.75583, 0, 0, 0.77778], - "10887": [0.13597, 0.63597, 0, 0, 0.77778], - "10888": [0.13597, 0.63597, 0, 0, 0.77778], - "10889": [0.26167, 0.75726, 0, 0, 0.77778], - "10890": [0.26167, 0.75726, 0, 0, 0.77778], - "10891": [0.48256, 0.98256, 0, 0, 0.77778], - "10892": [0.48256, 0.98256, 0, 0, 0.77778], - "10901": [0.13667, 0.63667, 0, 0, 0.77778], - "10902": [0.13667, 0.63667, 0, 0, 0.77778], - "10933": [0.25142, 0.75726, 0, 0, 0.77778], - "10934": [0.25142, 0.75726, 0, 0, 0.77778], - "10935": [0.26167, 0.75726, 0, 0, 0.77778], - "10936": [0.26167, 0.75726, 0, 0, 0.77778], - "10937": [0.26167, 0.75726, 0, 0, 0.77778], - "10938": [0.26167, 0.75726, 0, 0, 0.77778], - "10949": [0.25583, 0.75583, 0, 0, 0.77778], - "10950": [0.25583, 0.75583, 0, 0, 0.77778], - "10955": [0.28481, 0.79383, 0, 0, 0.77778], - "10956": [0.28481, 0.79383, 0, 0, 0.77778], - "57350": [0.08167, 0.58167, 0, 0, 0.22222], - "57351": [0.08167, 0.58167, 0, 0, 0.38889], - "57352": [0.08167, 0.58167, 0, 0, 0.77778], - "57353": [0, 0.43056, 0.04028, 0, 0.66667], - "57356": [0.25142, 0.75726, 0, 0, 0.77778], - "57357": [0.25142, 0.75726, 0, 0, 0.77778], - "57358": [0.41951, 0.91951, 0, 0, 0.77778], - "57359": [0.30274, 0.79383, 0, 0, 0.77778], - "57360": [0.30274, 0.79383, 0, 0, 0.77778], - "57361": [0.41951, 0.91951, 0, 0, 0.77778], - "57366": [0.25142, 0.75726, 0, 0, 0.77778], - "57367": [0.25142, 0.75726, 0, 0, 0.77778], - "57368": [0.25142, 0.75726, 0, 0, 0.77778], - "57369": [0.25142, 0.75726, 0, 0, 0.77778], - "57370": [0.13597, 0.63597, 0, 0, 0.77778], - "57371": [0.13597, 0.63597, 0, 0, 0.77778] - }, - "Caligraphic-Regular": { - "48": [0, 0.43056, 0, 0, 0.5], - "49": [0, 0.43056, 0, 0, 0.5], - "50": [0, 0.43056, 0, 0, 0.5], - "51": [0.19444, 0.43056, 0, 0, 0.5], - "52": [0.19444, 0.43056, 0, 0, 0.5], - "53": [0.19444, 0.43056, 0, 0, 0.5], - "54": [0, 0.64444, 0, 0, 0.5], - "55": [0.19444, 0.43056, 0, 0, 0.5], - "56": [0, 0.64444, 0, 0, 0.5], - "57": [0.19444, 0.43056, 0, 0, 0.5], - "65": [0, 0.68333, 0, 0.19445, 0.79847], - "66": [0, 0.68333, 0.03041, 0.13889, 0.65681], - "67": [0, 0.68333, 0.05834, 0.13889, 0.52653], - "68": [0, 0.68333, 0.02778, 0.08334, 0.77139], - "69": [0, 0.68333, 0.08944, 0.11111, 0.52778], - "70": [0, 0.68333, 0.09931, 0.11111, 0.71875], - "71": [0.09722, 0.68333, 0.0593, 0.11111, 0.59487], - "72": [0, 0.68333, 0.00965, 0.11111, 0.84452], - "73": [0, 0.68333, 0.07382, 0, 0.54452], - "74": [0.09722, 0.68333, 0.18472, 0.16667, 0.67778], - "75": [0, 0.68333, 0.01445, 0.05556, 0.76195], - "76": [0, 0.68333, 0, 0.13889, 0.68972], - "77": [0, 0.68333, 0, 0.13889, 1.2009], - "78": [0, 0.68333, 0.14736, 0.08334, 0.82049], - "79": [0, 0.68333, 0.02778, 0.11111, 0.79611], - "80": [0, 0.68333, 0.08222, 0.08334, 0.69556], - "81": [0.09722, 0.68333, 0, 0.11111, 0.81667], - "82": [0, 0.68333, 0, 0.08334, 0.8475], - "83": [0, 0.68333, 0.075, 0.13889, 0.60556], - "84": [0, 0.68333, 0.25417, 0, 0.54464], - "85": [0, 0.68333, 0.09931, 0.08334, 0.62583], - "86": [0, 0.68333, 0.08222, 0, 0.61278], - "87": [0, 0.68333, 0.08222, 0.08334, 0.98778], - "88": [0, 0.68333, 0.14643, 0.13889, 0.7133], - "89": [0.09722, 0.68333, 0.08222, 0.08334, 0.66834], - "90": [0, 0.68333, 0.07944, 0.13889, 0.72473] - }, - "Fraktur-Regular": { - "33": [0, 0.69141, 0, 0, 0.29574], - "34": [0, 0.69141, 0, 0, 0.21471], - "38": [0, 0.69141, 0, 0, 0.73786], - "39": [0, 0.69141, 0, 0, 0.21201], - "40": [0.24982, 0.74947, 0, 0, 0.38865], - "41": [0.24982, 0.74947, 0, 0, 0.38865], - "42": [0, 0.62119, 0, 0, 0.27764], - "43": [0.08319, 0.58283, 0, 0, 0.75623], - "44": [0, 0.10803, 0, 0, 0.27764], - "45": [0.08319, 0.58283, 0, 0, 0.75623], - "46": [0, 0.10803, 0, 0, 0.27764], - "47": [0.24982, 0.74947, 0, 0, 0.50181], - "48": [0, 0.47534, 0, 0, 0.50181], - "49": [0, 0.47534, 0, 0, 0.50181], - "50": [0, 0.47534, 0, 0, 0.50181], - "51": [0.18906, 0.47534, 0, 0, 0.50181], - "52": [0.18906, 0.47534, 0, 0, 0.50181], - "53": [0.18906, 0.47534, 0, 0, 0.50181], - "54": [0, 0.69141, 0, 0, 0.50181], - "55": [0.18906, 0.47534, 0, 0, 0.50181], - "56": [0, 0.69141, 0, 0, 0.50181], - "57": [0.18906, 0.47534, 0, 0, 0.50181], - "58": [0, 0.47534, 0, 0, 0.21606], - "59": [0.12604, 0.47534, 0, 0, 0.21606], - "61": [-0.13099, 0.36866, 0, 0, 0.75623], - "63": [0, 0.69141, 0, 0, 0.36245], - "65": [0, 0.69141, 0, 0, 0.7176], - "66": [0, 0.69141, 0, 0, 0.88397], - "67": [0, 0.69141, 0, 0, 0.61254], - "68": [0, 0.69141, 0, 0, 0.83158], - "69": [0, 0.69141, 0, 0, 0.66278], - "70": [0.12604, 0.69141, 0, 0, 0.61119], - "71": [0, 0.69141, 0, 0, 0.78539], - "72": [0.06302, 0.69141, 0, 0, 0.7203], - "73": [0, 0.69141, 0, 0, 0.55448], - "74": [0.12604, 0.69141, 0, 0, 0.55231], - "75": [0, 0.69141, 0, 0, 0.66845], - "76": [0, 0.69141, 0, 0, 0.66602], - "77": [0, 0.69141, 0, 0, 1.04953], - "78": [0, 0.69141, 0, 0, 0.83212], - "79": [0, 0.69141, 0, 0, 0.82699], - "80": [0.18906, 0.69141, 0, 0, 0.82753], - "81": [0.03781, 0.69141, 0, 0, 0.82699], - "82": [0, 0.69141, 0, 0, 0.82807], - "83": [0, 0.69141, 0, 0, 0.82861], - "84": [0, 0.69141, 0, 0, 0.66899], - "85": [0, 0.69141, 0, 0, 0.64576], - "86": [0, 0.69141, 0, 0, 0.83131], - "87": [0, 0.69141, 0, 0, 1.04602], - "88": [0, 0.69141, 0, 0, 0.71922], - "89": [0.18906, 0.69141, 0, 0, 0.83293], - "90": [0.12604, 0.69141, 0, 0, 0.60201], - "91": [0.24982, 0.74947, 0, 0, 0.27764], - "93": [0.24982, 0.74947, 0, 0, 0.27764], - "94": [0, 0.69141, 0, 0, 0.49965], - "97": [0, 0.47534, 0, 0, 0.50046], - "98": [0, 0.69141, 0, 0, 0.51315], - "99": [0, 0.47534, 0, 0, 0.38946], - "100": [0, 0.62119, 0, 0, 0.49857], - "101": [0, 0.47534, 0, 0, 0.40053], - "102": [0.18906, 0.69141, 0, 0, 0.32626], - "103": [0.18906, 0.47534, 0, 0, 0.5037], - "104": [0.18906, 0.69141, 0, 0, 0.52126], - "105": [0, 0.69141, 0, 0, 0.27899], - "106": [0, 0.69141, 0, 0, 0.28088], - "107": [0, 0.69141, 0, 0, 0.38946], - "108": [0, 0.69141, 0, 0, 0.27953], - "109": [0, 0.47534, 0, 0, 0.76676], - "110": [0, 0.47534, 0, 0, 0.52666], - "111": [0, 0.47534, 0, 0, 0.48885], - "112": [0.18906, 0.52396, 0, 0, 0.50046], - "113": [0.18906, 0.47534, 0, 0, 0.48912], - "114": [0, 0.47534, 0, 0, 0.38919], - "115": [0, 0.47534, 0, 0, 0.44266], - "116": [0, 0.62119, 0, 0, 0.33301], - "117": [0, 0.47534, 0, 0, 0.5172], - "118": [0, 0.52396, 0, 0, 0.5118], - "119": [0, 0.52396, 0, 0, 0.77351], - "120": [0.18906, 0.47534, 0, 0, 0.38865], - "121": [0.18906, 0.47534, 0, 0, 0.49884], - "122": [0.18906, 0.47534, 0, 0, 0.39054], - "8216": [0, 0.69141, 0, 0, 0.21471], - "8217": [0, 0.69141, 0, 0, 0.21471], - "58112": [0, 0.62119, 0, 0, 0.49749], - "58113": [0, 0.62119, 0, 0, 0.4983], - "58114": [0.18906, 0.69141, 0, 0, 0.33328], - "58115": [0.18906, 0.69141, 0, 0, 0.32923], - "58116": [0.18906, 0.47534, 0, 0, 0.50343], - "58117": [0, 0.69141, 0, 0, 0.33301], - "58118": [0, 0.62119, 0, 0, 0.33409], - "58119": [0, 0.47534, 0, 0, 0.50073] - }, - "Main-Bold": { - "33": [0, 0.69444, 0, 0, 0.35], - "34": [0, 0.69444, 0, 0, 0.60278], - "35": [0.19444, 0.69444, 0, 0, 0.95833], - "36": [0.05556, 0.75, 0, 0, 0.575], - "37": [0.05556, 0.75, 0, 0, 0.95833], - "38": [0, 0.69444, 0, 0, 0.89444], - "39": [0, 0.69444, 0, 0, 0.31944], - "40": [0.25, 0.75, 0, 0, 0.44722], - "41": [0.25, 0.75, 0, 0, 0.44722], - "42": [0, 0.75, 0, 0, 0.575], - "43": [0.13333, 0.63333, 0, 0, 0.89444], - "44": [0.19444, 0.15556, 0, 0, 0.31944], - "45": [0, 0.44444, 0, 0, 0.38333], - "46": [0, 0.15556, 0, 0, 0.31944], - "47": [0.25, 0.75, 0, 0, 0.575], - "48": [0, 0.64444, 0, 0, 0.575], - "49": [0, 0.64444, 0, 0, 0.575], - "50": [0, 0.64444, 0, 0, 0.575], - "51": [0, 0.64444, 0, 0, 0.575], - "52": [0, 0.64444, 0, 0, 0.575], - "53": [0, 0.64444, 0, 0, 0.575], - "54": [0, 0.64444, 0, 0, 0.575], - "55": [0, 0.64444, 0, 0, 0.575], - "56": [0, 0.64444, 0, 0, 0.575], - "57": [0, 0.64444, 0, 0, 0.575], - "58": [0, 0.44444, 0, 0, 0.31944], - "59": [0.19444, 0.44444, 0, 0, 0.31944], - "60": [0.08556, 0.58556, 0, 0, 0.89444], - "61": [-0.10889, 0.39111, 0, 0, 0.89444], - "62": [0.08556, 0.58556, 0, 0, 0.89444], - "63": [0, 0.69444, 0, 0, 0.54305], - "64": [0, 0.69444, 0, 0, 0.89444], - "65": [0, 0.68611, 0, 0, 0.86944], - "66": [0, 0.68611, 0, 0, 0.81805], - "67": [0, 0.68611, 0, 0, 0.83055], - "68": [0, 0.68611, 0, 0, 0.88194], - "69": [0, 0.68611, 0, 0, 0.75555], - "70": [0, 0.68611, 0, 0, 0.72361], - "71": [0, 0.68611, 0, 0, 0.90416], - "72": [0, 0.68611, 0, 0, 0.9], - "73": [0, 0.68611, 0, 0, 0.43611], - "74": [0, 0.68611, 0, 0, 0.59444], - "75": [0, 0.68611, 0, 0, 0.90138], - "76": [0, 0.68611, 0, 0, 0.69166], - "77": [0, 0.68611, 0, 0, 1.09166], - "78": [0, 0.68611, 0, 0, 0.9], - "79": [0, 0.68611, 0, 0, 0.86388], - "80": [0, 0.68611, 0, 0, 0.78611], - "81": [0.19444, 0.68611, 0, 0, 0.86388], - "82": [0, 0.68611, 0, 0, 0.8625], - "83": [0, 0.68611, 0, 0, 0.63889], - "84": [0, 0.68611, 0, 0, 0.8], - "85": [0, 0.68611, 0, 0, 0.88472], - "86": [0, 0.68611, 0.01597, 0, 0.86944], - "87": [0, 0.68611, 0.01597, 0, 1.18888], - "88": [0, 0.68611, 0, 0, 0.86944], - "89": [0, 0.68611, 0.02875, 0, 0.86944], - "90": [0, 0.68611, 0, 0, 0.70277], - "91": [0.25, 0.75, 0, 0, 0.31944], - "92": [0.25, 0.75, 0, 0, 0.575], - "93": [0.25, 0.75, 0, 0, 0.31944], - "94": [0, 0.69444, 0, 0, 0.575], - "95": [0.31, 0.13444, 0.03194, 0, 0.575], - "97": [0, 0.44444, 0, 0, 0.55902], - "98": [0, 0.69444, 0, 0, 0.63889], - "99": [0, 0.44444, 0, 0, 0.51111], - "100": [0, 0.69444, 0, 0, 0.63889], - "101": [0, 0.44444, 0, 0, 0.52708], - "102": [0, 0.69444, 0.10903, 0, 0.35139], - "103": [0.19444, 0.44444, 0.01597, 0, 0.575], - "104": [0, 0.69444, 0, 0, 0.63889], - "105": [0, 0.69444, 0, 0, 0.31944], - "106": [0.19444, 0.69444, 0, 0, 0.35139], - "107": [0, 0.69444, 0, 0, 0.60694], - "108": [0, 0.69444, 0, 0, 0.31944], - "109": [0, 0.44444, 0, 0, 0.95833], - "110": [0, 0.44444, 0, 0, 0.63889], - "111": [0, 0.44444, 0, 0, 0.575], - "112": [0.19444, 0.44444, 0, 0, 0.63889], - "113": [0.19444, 0.44444, 0, 0, 0.60694], - "114": [0, 0.44444, 0, 0, 0.47361], - "115": [0, 0.44444, 0, 0, 0.45361], - "116": [0, 0.63492, 0, 0, 0.44722], - "117": [0, 0.44444, 0, 0, 0.63889], - "118": [0, 0.44444, 0.01597, 0, 0.60694], - "119": [0, 0.44444, 0.01597, 0, 0.83055], - "120": [0, 0.44444, 0, 0, 0.60694], - "121": [0.19444, 0.44444, 0.01597, 0, 0.60694], - "122": [0, 0.44444, 0, 0, 0.51111], - "123": [0.25, 0.75, 0, 0, 0.575], - "124": [0.25, 0.75, 0, 0, 0.31944], - "125": [0.25, 0.75, 0, 0, 0.575], - "126": [0.35, 0.34444, 0, 0, 0.575], - "168": [0, 0.69444, 0, 0, 0.575], - "172": [0, 0.44444, 0, 0, 0.76666], - "176": [0, 0.69444, 0, 0, 0.86944], - "177": [0.13333, 0.63333, 0, 0, 0.89444], - "198": [0, 0.68611, 0, 0, 1.04166], - "215": [0.13333, 0.63333, 0, 0, 0.89444], - "216": [0.04861, 0.73472, 0, 0, 0.89444], - "223": [0, 0.69444, 0, 0, 0.59722], - "230": [0, 0.44444, 0, 0, 0.83055], - "247": [0.13333, 0.63333, 0, 0, 0.89444], - "248": [0.09722, 0.54167, 0, 0, 0.575], - "305": [0, 0.44444, 0, 0, 0.31944], - "338": [0, 0.68611, 0, 0, 1.16944], - "339": [0, 0.44444, 0, 0, 0.89444], - "567": [0.19444, 0.44444, 0, 0, 0.35139], - "710": [0, 0.69444, 0, 0, 0.575], - "711": [0, 0.63194, 0, 0, 0.575], - "713": [0, 0.59611, 0, 0, 0.575], - "714": [0, 0.69444, 0, 0, 0.575], - "715": [0, 0.69444, 0, 0, 0.575], - "728": [0, 0.69444, 0, 0, 0.575], - "729": [0, 0.69444, 0, 0, 0.31944], - "730": [0, 0.69444, 0, 0, 0.86944], - "732": [0, 0.69444, 0, 0, 0.575], - "733": [0, 0.69444, 0, 0, 0.575], - "824": [0.19444, 0.69444, 0, 0, 0], - "915": [0, 0.68611, 0, 0, 0.69166], - "916": [0, 0.68611, 0, 0, 0.95833], - "920": [0, 0.68611, 0, 0, 0.89444], - "923": [0, 0.68611, 0, 0, 0.80555], - "926": [0, 0.68611, 0, 0, 0.76666], - "928": [0, 0.68611, 0, 0, 0.9], - "931": [0, 0.68611, 0, 0, 0.83055], - "933": [0, 0.68611, 0, 0, 0.89444], - "934": [0, 0.68611, 0, 0, 0.83055], - "936": [0, 0.68611, 0, 0, 0.89444], - "937": [0, 0.68611, 0, 0, 0.83055], - "8211": [0, 0.44444, 0.03194, 0, 0.575], - "8212": [0, 0.44444, 0.03194, 0, 1.14999], - "8216": [0, 0.69444, 0, 0, 0.31944], - "8217": [0, 0.69444, 0, 0, 0.31944], - "8220": [0, 0.69444, 0, 0, 0.60278], - "8221": [0, 0.69444, 0, 0, 0.60278], - "8224": [0.19444, 0.69444, 0, 0, 0.51111], - "8225": [0.19444, 0.69444, 0, 0, 0.51111], - "8242": [0, 0.55556, 0, 0, 0.34444], - "8407": [0, 0.72444, 0.15486, 0, 0.575], - "8463": [0, 0.69444, 0, 0, 0.66759], - "8465": [0, 0.69444, 0, 0, 0.83055], - "8467": [0, 0.69444, 0, 0, 0.47361], - "8472": [0.19444, 0.44444, 0, 0, 0.74027], - "8476": [0, 0.69444, 0, 0, 0.83055], - "8501": [0, 0.69444, 0, 0, 0.70277], - "8592": [-0.10889, 0.39111, 0, 0, 1.14999], - "8593": [0.19444, 0.69444, 0, 0, 0.575], - "8594": [-0.10889, 0.39111, 0, 0, 1.14999], - "8595": [0.19444, 0.69444, 0, 0, 0.575], - "8596": [-0.10889, 0.39111, 0, 0, 1.14999], - "8597": [0.25, 0.75, 0, 0, 0.575], - "8598": [0.19444, 0.69444, 0, 0, 1.14999], - "8599": [0.19444, 0.69444, 0, 0, 1.14999], - "8600": [0.19444, 0.69444, 0, 0, 1.14999], - "8601": [0.19444, 0.69444, 0, 0, 1.14999], - "8636": [-0.10889, 0.39111, 0, 0, 1.14999], - "8637": [-0.10889, 0.39111, 0, 0, 1.14999], - "8640": [-0.10889, 0.39111, 0, 0, 1.14999], - "8641": [-0.10889, 0.39111, 0, 0, 1.14999], - "8656": [-0.10889, 0.39111, 0, 0, 1.14999], - "8657": [0.19444, 0.69444, 0, 0, 0.70277], - "8658": [-0.10889, 0.39111, 0, 0, 1.14999], - "8659": [0.19444, 0.69444, 0, 0, 0.70277], - "8660": [-0.10889, 0.39111, 0, 0, 1.14999], - "8661": [0.25, 0.75, 0, 0, 0.70277], - "8704": [0, 0.69444, 0, 0, 0.63889], - "8706": [0, 0.69444, 0.06389, 0, 0.62847], - "8707": [0, 0.69444, 0, 0, 0.63889], - "8709": [0.05556, 0.75, 0, 0, 0.575], - "8711": [0, 0.68611, 0, 0, 0.95833], - "8712": [0.08556, 0.58556, 0, 0, 0.76666], - "8715": [0.08556, 0.58556, 0, 0, 0.76666], - "8722": [0.13333, 0.63333, 0, 0, 0.89444], - "8723": [0.13333, 0.63333, 0, 0, 0.89444], - "8725": [0.25, 0.75, 0, 0, 0.575], - "8726": [0.25, 0.75, 0, 0, 0.575], - "8727": [-0.02778, 0.47222, 0, 0, 0.575], - "8728": [-0.02639, 0.47361, 0, 0, 0.575], - "8729": [-0.02639, 0.47361, 0, 0, 0.575], - "8730": [0.18, 0.82, 0, 0, 0.95833], - "8733": [0, 0.44444, 0, 0, 0.89444], - "8734": [0, 0.44444, 0, 0, 1.14999], - "8736": [0, 0.69224, 0, 0, 0.72222], - "8739": [0.25, 0.75, 0, 0, 0.31944], - "8741": [0.25, 0.75, 0, 0, 0.575], - "8743": [0, 0.55556, 0, 0, 0.76666], - "8744": [0, 0.55556, 0, 0, 0.76666], - "8745": [0, 0.55556, 0, 0, 0.76666], - "8746": [0, 0.55556, 0, 0, 0.76666], - "8747": [0.19444, 0.69444, 0.12778, 0, 0.56875], - "8764": [-0.10889, 0.39111, 0, 0, 0.89444], - "8768": [0.19444, 0.69444, 0, 0, 0.31944], - "8771": [0.00222, 0.50222, 0, 0, 0.89444], - "8776": [0.02444, 0.52444, 0, 0, 0.89444], - "8781": [0.00222, 0.50222, 0, 0, 0.89444], - "8801": [0.00222, 0.50222, 0, 0, 0.89444], - "8804": [0.19667, 0.69667, 0, 0, 0.89444], - "8805": [0.19667, 0.69667, 0, 0, 0.89444], - "8810": [0.08556, 0.58556, 0, 0, 1.14999], - "8811": [0.08556, 0.58556, 0, 0, 1.14999], - "8826": [0.08556, 0.58556, 0, 0, 0.89444], - "8827": [0.08556, 0.58556, 0, 0, 0.89444], - "8834": [0.08556, 0.58556, 0, 0, 0.89444], - "8835": [0.08556, 0.58556, 0, 0, 0.89444], - "8838": [0.19667, 0.69667, 0, 0, 0.89444], - "8839": [0.19667, 0.69667, 0, 0, 0.89444], - "8846": [0, 0.55556, 0, 0, 0.76666], - "8849": [0.19667, 0.69667, 0, 0, 0.89444], - "8850": [0.19667, 0.69667, 0, 0, 0.89444], - "8851": [0, 0.55556, 0, 0, 0.76666], - "8852": [0, 0.55556, 0, 0, 0.76666], - "8853": [0.13333, 0.63333, 0, 0, 0.89444], - "8854": [0.13333, 0.63333, 0, 0, 0.89444], - "8855": [0.13333, 0.63333, 0, 0, 0.89444], - "8856": [0.13333, 0.63333, 0, 0, 0.89444], - "8857": [0.13333, 0.63333, 0, 0, 0.89444], - "8866": [0, 0.69444, 0, 0, 0.70277], - "8867": [0, 0.69444, 0, 0, 0.70277], - "8868": [0, 0.69444, 0, 0, 0.89444], - "8869": [0, 0.69444, 0, 0, 0.89444], - "8900": [-0.02639, 0.47361, 0, 0, 0.575], - "8901": [-0.02639, 0.47361, 0, 0, 0.31944], - "8902": [-0.02778, 0.47222, 0, 0, 0.575], - "8968": [0.25, 0.75, 0, 0, 0.51111], - "8969": [0.25, 0.75, 0, 0, 0.51111], - "8970": [0.25, 0.75, 0, 0, 0.51111], - "8971": [0.25, 0.75, 0, 0, 0.51111], - "8994": [-0.13889, 0.36111, 0, 0, 1.14999], - "8995": [-0.13889, 0.36111, 0, 0, 1.14999], - "9651": [0.19444, 0.69444, 0, 0, 1.02222], - "9657": [-0.02778, 0.47222, 0, 0, 0.575], - "9661": [0.19444, 0.69444, 0, 0, 1.02222], - "9667": [-0.02778, 0.47222, 0, 0, 0.575], - "9711": [0.19444, 0.69444, 0, 0, 1.14999], - "9824": [0.12963, 0.69444, 0, 0, 0.89444], - "9825": [0.12963, 0.69444, 0, 0, 0.89444], - "9826": [0.12963, 0.69444, 0, 0, 0.89444], - "9827": [0.12963, 0.69444, 0, 0, 0.89444], - "9837": [0, 0.75, 0, 0, 0.44722], - "9838": [0.19444, 0.69444, 0, 0, 0.44722], - "9839": [0.19444, 0.69444, 0, 0, 0.44722], - "10216": [0.25, 0.75, 0, 0, 0.44722], - "10217": [0.25, 0.75, 0, 0, 0.44722], - "10815": [0, 0.68611, 0, 0, 0.9], - "10927": [0.19667, 0.69667, 0, 0, 0.89444], - "10928": [0.19667, 0.69667, 0, 0, 0.89444] - }, - "Main-BoldItalic": { - "33": [0, 0.69444, 0.11417, 0, 0.38611], - "34": [0, 0.69444, 0.07939, 0, 0.62055], - "35": [0.19444, 0.69444, 0.06833, 0, 0.94444], - "37": [0.05556, 0.75, 0.12861, 0, 0.94444], - "38": [0, 0.69444, 0.08528, 0, 0.88555], - "39": [0, 0.69444, 0.12945, 0, 0.35555], - "40": [0.25, 0.75, 0.15806, 0, 0.47333], - "41": [0.25, 0.75, 0.03306, 0, 0.47333], - "42": [0, 0.75, 0.14333, 0, 0.59111], - "43": [0.10333, 0.60333, 0.03306, 0, 0.88555], - "44": [0.19444, 0.14722, 0, 0, 0.35555], - "45": [0, 0.44444, 0.02611, 0, 0.41444], - "46": [0, 0.14722, 0, 0, 0.35555], - "47": [0.25, 0.75, 0.15806, 0, 0.59111], - "48": [0, 0.64444, 0.13167, 0, 0.59111], - "49": [0, 0.64444, 0.13167, 0, 0.59111], - "50": [0, 0.64444, 0.13167, 0, 0.59111], - "51": [0, 0.64444, 0.13167, 0, 0.59111], - "52": [0.19444, 0.64444, 0.13167, 0, 0.59111], - "53": [0, 0.64444, 0.13167, 0, 0.59111], - "54": [0, 0.64444, 0.13167, 0, 0.59111], - "55": [0.19444, 0.64444, 0.13167, 0, 0.59111], - "56": [0, 0.64444, 0.13167, 0, 0.59111], - "57": [0, 0.64444, 0.13167, 0, 0.59111], - "58": [0, 0.44444, 0.06695, 0, 0.35555], - "59": [0.19444, 0.44444, 0.06695, 0, 0.35555], - "61": [-0.10889, 0.39111, 0.06833, 0, 0.88555], - "63": [0, 0.69444, 0.11472, 0, 0.59111], - "64": [0, 0.69444, 0.09208, 0, 0.88555], - "65": [0, 0.68611, 0, 0, 0.86555], - "66": [0, 0.68611, 0.0992, 0, 0.81666], - "67": [0, 0.68611, 0.14208, 0, 0.82666], - "68": [0, 0.68611, 0.09062, 0, 0.87555], - "69": [0, 0.68611, 0.11431, 0, 0.75666], - "70": [0, 0.68611, 0.12903, 0, 0.72722], - "71": [0, 0.68611, 0.07347, 0, 0.89527], - "72": [0, 0.68611, 0.17208, 0, 0.8961], - "73": [0, 0.68611, 0.15681, 0, 0.47166], - "74": [0, 0.68611, 0.145, 0, 0.61055], - "75": [0, 0.68611, 0.14208, 0, 0.89499], - "76": [0, 0.68611, 0, 0, 0.69777], - "77": [0, 0.68611, 0.17208, 0, 1.07277], - "78": [0, 0.68611, 0.17208, 0, 0.8961], - "79": [0, 0.68611, 0.09062, 0, 0.85499], - "80": [0, 0.68611, 0.0992, 0, 0.78721], - "81": [0.19444, 0.68611, 0.09062, 0, 0.85499], - "82": [0, 0.68611, 0.02559, 0, 0.85944], - "83": [0, 0.68611, 0.11264, 0, 0.64999], - "84": [0, 0.68611, 0.12903, 0, 0.7961], - "85": [0, 0.68611, 0.17208, 0, 0.88083], - "86": [0, 0.68611, 0.18625, 0, 0.86555], - "87": [0, 0.68611, 0.18625, 0, 1.15999], - "88": [0, 0.68611, 0.15681, 0, 0.86555], - "89": [0, 0.68611, 0.19803, 0, 0.86555], - "90": [0, 0.68611, 0.14208, 0, 0.70888], - "91": [0.25, 0.75, 0.1875, 0, 0.35611], - "93": [0.25, 0.75, 0.09972, 0, 0.35611], - "94": [0, 0.69444, 0.06709, 0, 0.59111], - "95": [0.31, 0.13444, 0.09811, 0, 0.59111], - "97": [0, 0.44444, 0.09426, 0, 0.59111], - "98": [0, 0.69444, 0.07861, 0, 0.53222], - "99": [0, 0.44444, 0.05222, 0, 0.53222], - "100": [0, 0.69444, 0.10861, 0, 0.59111], - "101": [0, 0.44444, 0.085, 0, 0.53222], - "102": [0.19444, 0.69444, 0.21778, 0, 0.4], - "103": [0.19444, 0.44444, 0.105, 0, 0.53222], - "104": [0, 0.69444, 0.09426, 0, 0.59111], - "105": [0, 0.69326, 0.11387, 0, 0.35555], - "106": [0.19444, 0.69326, 0.1672, 0, 0.35555], - "107": [0, 0.69444, 0.11111, 0, 0.53222], - "108": [0, 0.69444, 0.10861, 0, 0.29666], - "109": [0, 0.44444, 0.09426, 0, 0.94444], - "110": [0, 0.44444, 0.09426, 0, 0.64999], - "111": [0, 0.44444, 0.07861, 0, 0.59111], - "112": [0.19444, 0.44444, 0.07861, 0, 0.59111], - "113": [0.19444, 0.44444, 0.105, 0, 0.53222], - "114": [0, 0.44444, 0.11111, 0, 0.50167], - "115": [0, 0.44444, 0.08167, 0, 0.48694], - "116": [0, 0.63492, 0.09639, 0, 0.385], - "117": [0, 0.44444, 0.09426, 0, 0.62055], - "118": [0, 0.44444, 0.11111, 0, 0.53222], - "119": [0, 0.44444, 0.11111, 0, 0.76777], - "120": [0, 0.44444, 0.12583, 0, 0.56055], - "121": [0.19444, 0.44444, 0.105, 0, 0.56166], - "122": [0, 0.44444, 0.13889, 0, 0.49055], - "126": [0.35, 0.34444, 0.11472, 0, 0.59111], - "163": [0, 0.69444, 0, 0, 0.86853], - "168": [0, 0.69444, 0.11473, 0, 0.59111], - "176": [0, 0.69444, 0, 0, 0.94888], - "198": [0, 0.68611, 0.11431, 0, 1.02277], - "216": [0.04861, 0.73472, 0.09062, 0, 0.88555], - "223": [0.19444, 0.69444, 0.09736, 0, 0.665], - "230": [0, 0.44444, 0.085, 0, 0.82666], - "248": [0.09722, 0.54167, 0.09458, 0, 0.59111], - "305": [0, 0.44444, 0.09426, 0, 0.35555], - "338": [0, 0.68611, 0.11431, 0, 1.14054], - "339": [0, 0.44444, 0.085, 0, 0.82666], - "567": [0.19444, 0.44444, 0.04611, 0, 0.385], - "710": [0, 0.69444, 0.06709, 0, 0.59111], - "711": [0, 0.63194, 0.08271, 0, 0.59111], - "713": [0, 0.59444, 0.10444, 0, 0.59111], - "714": [0, 0.69444, 0.08528, 0, 0.59111], - "715": [0, 0.69444, 0, 0, 0.59111], - "728": [0, 0.69444, 0.10333, 0, 0.59111], - "729": [0, 0.69444, 0.12945, 0, 0.35555], - "730": [0, 0.69444, 0, 0, 0.94888], - "732": [0, 0.69444, 0.11472, 0, 0.59111], - "733": [0, 0.69444, 0.11472, 0, 0.59111], - "915": [0, 0.68611, 0.12903, 0, 0.69777], - "916": [0, 0.68611, 0, 0, 0.94444], - "920": [0, 0.68611, 0.09062, 0, 0.88555], - "923": [0, 0.68611, 0, 0, 0.80666], - "926": [0, 0.68611, 0.15092, 0, 0.76777], - "928": [0, 0.68611, 0.17208, 0, 0.8961], - "931": [0, 0.68611, 0.11431, 0, 0.82666], - "933": [0, 0.68611, 0.10778, 0, 0.88555], - "934": [0, 0.68611, 0.05632, 0, 0.82666], - "936": [0, 0.68611, 0.10778, 0, 0.88555], - "937": [0, 0.68611, 0.0992, 0, 0.82666], - "8211": [0, 0.44444, 0.09811, 0, 0.59111], - "8212": [0, 0.44444, 0.09811, 0, 1.18221], - "8216": [0, 0.69444, 0.12945, 0, 0.35555], - "8217": [0, 0.69444, 0.12945, 0, 0.35555], - "8220": [0, 0.69444, 0.16772, 0, 0.62055], - "8221": [0, 0.69444, 0.07939, 0, 0.62055] - }, - "Main-Italic": { - "33": [0, 0.69444, 0.12417, 0, 0.30667], - "34": [0, 0.69444, 0.06961, 0, 0.51444], - "35": [0.19444, 0.69444, 0.06616, 0, 0.81777], - "37": [0.05556, 0.75, 0.13639, 0, 0.81777], - "38": [0, 0.69444, 0.09694, 0, 0.76666], - "39": [0, 0.69444, 0.12417, 0, 0.30667], - "40": [0.25, 0.75, 0.16194, 0, 0.40889], - "41": [0.25, 0.75, 0.03694, 0, 0.40889], - "42": [0, 0.75, 0.14917, 0, 0.51111], - "43": [0.05667, 0.56167, 0.03694, 0, 0.76666], - "44": [0.19444, 0.10556, 0, 0, 0.30667], - "45": [0, 0.43056, 0.02826, 0, 0.35778], - "46": [0, 0.10556, 0, 0, 0.30667], - "47": [0.25, 0.75, 0.16194, 0, 0.51111], - "48": [0, 0.64444, 0.13556, 0, 0.51111], - "49": [0, 0.64444, 0.13556, 0, 0.51111], - "50": [0, 0.64444, 0.13556, 0, 0.51111], - "51": [0, 0.64444, 0.13556, 0, 0.51111], - "52": [0.19444, 0.64444, 0.13556, 0, 0.51111], - "53": [0, 0.64444, 0.13556, 0, 0.51111], - "54": [0, 0.64444, 0.13556, 0, 0.51111], - "55": [0.19444, 0.64444, 0.13556, 0, 0.51111], - "56": [0, 0.64444, 0.13556, 0, 0.51111], - "57": [0, 0.64444, 0.13556, 0, 0.51111], - "58": [0, 0.43056, 0.0582, 0, 0.30667], - "59": [0.19444, 0.43056, 0.0582, 0, 0.30667], - "61": [-0.13313, 0.36687, 0.06616, 0, 0.76666], - "63": [0, 0.69444, 0.1225, 0, 0.51111], - "64": [0, 0.69444, 0.09597, 0, 0.76666], - "65": [0, 0.68333, 0, 0, 0.74333], - "66": [0, 0.68333, 0.10257, 0, 0.70389], - "67": [0, 0.68333, 0.14528, 0, 0.71555], - "68": [0, 0.68333, 0.09403, 0, 0.755], - "69": [0, 0.68333, 0.12028, 0, 0.67833], - "70": [0, 0.68333, 0.13305, 0, 0.65277], - "71": [0, 0.68333, 0.08722, 0, 0.77361], - "72": [0, 0.68333, 0.16389, 0, 0.74333], - "73": [0, 0.68333, 0.15806, 0, 0.38555], - "74": [0, 0.68333, 0.14028, 0, 0.525], - "75": [0, 0.68333, 0.14528, 0, 0.76888], - "76": [0, 0.68333, 0, 0, 0.62722], - "77": [0, 0.68333, 0.16389, 0, 0.89666], - "78": [0, 0.68333, 0.16389, 0, 0.74333], - "79": [0, 0.68333, 0.09403, 0, 0.76666], - "80": [0, 0.68333, 0.10257, 0, 0.67833], - "81": [0.19444, 0.68333, 0.09403, 0, 0.76666], - "82": [0, 0.68333, 0.03868, 0, 0.72944], - "83": [0, 0.68333, 0.11972, 0, 0.56222], - "84": [0, 0.68333, 0.13305, 0, 0.71555], - "85": [0, 0.68333, 0.16389, 0, 0.74333], - "86": [0, 0.68333, 0.18361, 0, 0.74333], - "87": [0, 0.68333, 0.18361, 0, 0.99888], - "88": [0, 0.68333, 0.15806, 0, 0.74333], - "89": [0, 0.68333, 0.19383, 0, 0.74333], - "90": [0, 0.68333, 0.14528, 0, 0.61333], - "91": [0.25, 0.75, 0.1875, 0, 0.30667], - "93": [0.25, 0.75, 0.10528, 0, 0.30667], - "94": [0, 0.69444, 0.06646, 0, 0.51111], - "95": [0.31, 0.12056, 0.09208, 0, 0.51111], - "97": [0, 0.43056, 0.07671, 0, 0.51111], - "98": [0, 0.69444, 0.06312, 0, 0.46], - "99": [0, 0.43056, 0.05653, 0, 0.46], - "100": [0, 0.69444, 0.10333, 0, 0.51111], - "101": [0, 0.43056, 0.07514, 0, 0.46], - "102": [0.19444, 0.69444, 0.21194, 0, 0.30667], - "103": [0.19444, 0.43056, 0.08847, 0, 0.46], - "104": [0, 0.69444, 0.07671, 0, 0.51111], - "105": [0, 0.65536, 0.1019, 0, 0.30667], - "106": [0.19444, 0.65536, 0.14467, 0, 0.30667], - "107": [0, 0.69444, 0.10764, 0, 0.46], - "108": [0, 0.69444, 0.10333, 0, 0.25555], - "109": [0, 0.43056, 0.07671, 0, 0.81777], - "110": [0, 0.43056, 0.07671, 0, 0.56222], - "111": [0, 0.43056, 0.06312, 0, 0.51111], - "112": [0.19444, 0.43056, 0.06312, 0, 0.51111], - "113": [0.19444, 0.43056, 0.08847, 0, 0.46], - "114": [0, 0.43056, 0.10764, 0, 0.42166], - "115": [0, 0.43056, 0.08208, 0, 0.40889], - "116": [0, 0.61508, 0.09486, 0, 0.33222], - "117": [0, 0.43056, 0.07671, 0, 0.53666], - "118": [0, 0.43056, 0.10764, 0, 0.46], - "119": [0, 0.43056, 0.10764, 0, 0.66444], - "120": [0, 0.43056, 0.12042, 0, 0.46389], - "121": [0.19444, 0.43056, 0.08847, 0, 0.48555], - "122": [0, 0.43056, 0.12292, 0, 0.40889], - "126": [0.35, 0.31786, 0.11585, 0, 0.51111], - "163": [0, 0.69444, 0, 0, 0.76909], - "168": [0, 0.66786, 0.10474, 0, 0.51111], - "176": [0, 0.69444, 0, 0, 0.83129], - "198": [0, 0.68333, 0.12028, 0, 0.88277], - "216": [0.04861, 0.73194, 0.09403, 0, 0.76666], - "223": [0.19444, 0.69444, 0.10514, 0, 0.53666], - "230": [0, 0.43056, 0.07514, 0, 0.71555], - "248": [0.09722, 0.52778, 0.09194, 0, 0.51111], - "305": [0, 0.43056, 0, 0.02778, 0.32246], - "338": [0, 0.68333, 0.12028, 0, 0.98499], - "339": [0, 0.43056, 0.07514, 0, 0.71555], - "567": [0.19444, 0.43056, 0, 0.08334, 0.38403], - "710": [0, 0.69444, 0.06646, 0, 0.51111], - "711": [0, 0.62847, 0.08295, 0, 0.51111], - "713": [0, 0.56167, 0.10333, 0, 0.51111], - "714": [0, 0.69444, 0.09694, 0, 0.51111], - "715": [0, 0.69444, 0, 0, 0.51111], - "728": [0, 0.69444, 0.10806, 0, 0.51111], - "729": [0, 0.66786, 0.11752, 0, 0.30667], - "730": [0, 0.69444, 0, 0, 0.83129], - "732": [0, 0.66786, 0.11585, 0, 0.51111], - "733": [0, 0.69444, 0.1225, 0, 0.51111], - "915": [0, 0.68333, 0.13305, 0, 0.62722], - "916": [0, 0.68333, 0, 0, 0.81777], - "920": [0, 0.68333, 0.09403, 0, 0.76666], - "923": [0, 0.68333, 0, 0, 0.69222], - "926": [0, 0.68333, 0.15294, 0, 0.66444], - "928": [0, 0.68333, 0.16389, 0, 0.74333], - "931": [0, 0.68333, 0.12028, 0, 0.71555], - "933": [0, 0.68333, 0.11111, 0, 0.76666], - "934": [0, 0.68333, 0.05986, 0, 0.71555], - "936": [0, 0.68333, 0.11111, 0, 0.76666], - "937": [0, 0.68333, 0.10257, 0, 0.71555], - "8211": [0, 0.43056, 0.09208, 0, 0.51111], - "8212": [0, 0.43056, 0.09208, 0, 1.02222], - "8216": [0, 0.69444, 0.12417, 0, 0.30667], - "8217": [0, 0.69444, 0.12417, 0, 0.30667], - "8220": [0, 0.69444, 0.1685, 0, 0.51444], - "8221": [0, 0.69444, 0.06961, 0, 0.51444], - "8463": [0, 0.68889, 0, 0, 0.54028] - }, - "Main-Regular": { - "32": [0, 0, 0, 0, 0], - "33": [0, 0.69444, 0, 0, 0.27778], - "34": [0, 0.69444, 0, 0, 0.5], - "35": [0.19444, 0.69444, 0, 0, 0.83334], - "36": [0.05556, 0.75, 0, 0, 0.5], - "37": [0.05556, 0.75, 0, 0, 0.83334], - "38": [0, 0.69444, 0, 0, 0.77778], - "39": [0, 0.69444, 0, 0, 0.27778], - "40": [0.25, 0.75, 0, 0, 0.38889], - "41": [0.25, 0.75, 0, 0, 0.38889], - "42": [0, 0.75, 0, 0, 0.5], - "43": [0.08333, 0.58333, 0, 0, 0.77778], - "44": [0.19444, 0.10556, 0, 0, 0.27778], - "45": [0, 0.43056, 0, 0, 0.33333], - "46": [0, 0.10556, 0, 0, 0.27778], - "47": [0.25, 0.75, 0, 0, 0.5], - "48": [0, 0.64444, 0, 0, 0.5], - "49": [0, 0.64444, 0, 0, 0.5], - "50": [0, 0.64444, 0, 0, 0.5], - "51": [0, 0.64444, 0, 0, 0.5], - "52": [0, 0.64444, 0, 0, 0.5], - "53": [0, 0.64444, 0, 0, 0.5], - "54": [0, 0.64444, 0, 0, 0.5], - "55": [0, 0.64444, 0, 0, 0.5], - "56": [0, 0.64444, 0, 0, 0.5], - "57": [0, 0.64444, 0, 0, 0.5], - "58": [0, 0.43056, 0, 0, 0.27778], - "59": [0.19444, 0.43056, 0, 0, 0.27778], - "60": [0.0391, 0.5391, 0, 0, 0.77778], - "61": [-0.13313, 0.36687, 0, 0, 0.77778], - "62": [0.0391, 0.5391, 0, 0, 0.77778], - "63": [0, 0.69444, 0, 0, 0.47222], - "64": [0, 0.69444, 0, 0, 0.77778], - "65": [0, 0.68333, 0, 0, 0.75], - "66": [0, 0.68333, 0, 0, 0.70834], - "67": [0, 0.68333, 0, 0, 0.72222], - "68": [0, 0.68333, 0, 0, 0.76389], - "69": [0, 0.68333, 0, 0, 0.68056], - "70": [0, 0.68333, 0, 0, 0.65278], - "71": [0, 0.68333, 0, 0, 0.78472], - "72": [0, 0.68333, 0, 0, 0.75], - "73": [0, 0.68333, 0, 0, 0.36111], - "74": [0, 0.68333, 0, 0, 0.51389], - "75": [0, 0.68333, 0, 0, 0.77778], - "76": [0, 0.68333, 0, 0, 0.625], - "77": [0, 0.68333, 0, 0, 0.91667], - "78": [0, 0.68333, 0, 0, 0.75], - "79": [0, 0.68333, 0, 0, 0.77778], - "80": [0, 0.68333, 0, 0, 0.68056], - "81": [0.19444, 0.68333, 0, 0, 0.77778], - "82": [0, 0.68333, 0, 0, 0.73611], - "83": [0, 0.68333, 0, 0, 0.55556], - "84": [0, 0.68333, 0, 0, 0.72222], - "85": [0, 0.68333, 0, 0, 0.75], - "86": [0, 0.68333, 0.01389, 0, 0.75], - "87": [0, 0.68333, 0.01389, 0, 1.02778], - "88": [0, 0.68333, 0, 0, 0.75], - "89": [0, 0.68333, 0.025, 0, 0.75], - "90": [0, 0.68333, 0, 0, 0.61111], - "91": [0.25, 0.75, 0, 0, 0.27778], - "92": [0.25, 0.75, 0, 0, 0.5], - "93": [0.25, 0.75, 0, 0, 0.27778], - "94": [0, 0.69444, 0, 0, 0.5], - "95": [0.31, 0.12056, 0.02778, 0, 0.5], - "97": [0, 0.43056, 0, 0, 0.5], - "98": [0, 0.69444, 0, 0, 0.55556], - "99": [0, 0.43056, 0, 0, 0.44445], - "100": [0, 0.69444, 0, 0, 0.55556], - "101": [0, 0.43056, 0, 0, 0.44445], - "102": [0, 0.69444, 0.07778, 0, 0.30556], - "103": [0.19444, 0.43056, 0.01389, 0, 0.5], - "104": [0, 0.69444, 0, 0, 0.55556], - "105": [0, 0.66786, 0, 0, 0.27778], - "106": [0.19444, 0.66786, 0, 0, 0.30556], - "107": [0, 0.69444, 0, 0, 0.52778], - "108": [0, 0.69444, 0, 0, 0.27778], - "109": [0, 0.43056, 0, 0, 0.83334], - "110": [0, 0.43056, 0, 0, 0.55556], - "111": [0, 0.43056, 0, 0, 0.5], - "112": [0.19444, 0.43056, 0, 0, 0.55556], - "113": [0.19444, 0.43056, 0, 0, 0.52778], - "114": [0, 0.43056, 0, 0, 0.39167], - "115": [0, 0.43056, 0, 0, 0.39445], - "116": [0, 0.61508, 0, 0, 0.38889], - "117": [0, 0.43056, 0, 0, 0.55556], - "118": [0, 0.43056, 0.01389, 0, 0.52778], - "119": [0, 0.43056, 0.01389, 0, 0.72222], - "120": [0, 0.43056, 0, 0, 0.52778], - "121": [0.19444, 0.43056, 0.01389, 0, 0.52778], - "122": [0, 0.43056, 0, 0, 0.44445], - "123": [0.25, 0.75, 0, 0, 0.5], - "124": [0.25, 0.75, 0, 0, 0.27778], - "125": [0.25, 0.75, 0, 0, 0.5], - "126": [0.35, 0.31786, 0, 0, 0.5], - "160": [0, 0, 0, 0, 0], - "168": [0, 0.66786, 0, 0, 0.5], - "172": [0, 0.43056, 0, 0, 0.66667], - "176": [0, 0.69444, 0, 0, 0.75], - "177": [0.08333, 0.58333, 0, 0, 0.77778], - "198": [0, 0.68333, 0, 0, 0.90278], - "215": [0.08333, 0.58333, 0, 0, 0.77778], - "216": [0.04861, 0.73194, 0, 0, 0.77778], - "223": [0, 0.69444, 0, 0, 0.5], - "230": [0, 0.43056, 0, 0, 0.72222], - "247": [0.08333, 0.58333, 0, 0, 0.77778], - "248": [0.09722, 0.52778, 0, 0, 0.5], - "305": [0, 0.43056, 0, 0, 0.27778], - "338": [0, 0.68333, 0, 0, 1.01389], - "339": [0, 0.43056, 0, 0, 0.77778], - "567": [0.19444, 0.43056, 0, 0, 0.30556], - "710": [0, 0.69444, 0, 0, 0.5], - "711": [0, 0.62847, 0, 0, 0.5], - "713": [0, 0.56778, 0, 0, 0.5], - "714": [0, 0.69444, 0, 0, 0.5], - "715": [0, 0.69444, 0, 0, 0.5], - "728": [0, 0.69444, 0, 0, 0.5], - "729": [0, 0.66786, 0, 0, 0.27778], - "730": [0, 0.69444, 0, 0, 0.75], - "732": [0, 0.66786, 0, 0, 0.5], - "733": [0, 0.69444, 0, 0, 0.5], - "824": [0.19444, 0.69444, 0, 0, 0], - "915": [0, 0.68333, 0, 0, 0.625], - "916": [0, 0.68333, 0, 0, 0.83334], - "920": [0, 0.68333, 0, 0, 0.77778], - "923": [0, 0.68333, 0, 0, 0.69445], - "926": [0, 0.68333, 0, 0, 0.66667], - "928": [0, 0.68333, 0, 0, 0.75], - "931": [0, 0.68333, 0, 0, 0.72222], - "933": [0, 0.68333, 0, 0, 0.77778], - "934": [0, 0.68333, 0, 0, 0.72222], - "936": [0, 0.68333, 0, 0, 0.77778], - "937": [0, 0.68333, 0, 0, 0.72222], - "8211": [0, 0.43056, 0.02778, 0, 0.5], - "8212": [0, 0.43056, 0.02778, 0, 1.0], - "8216": [0, 0.69444, 0, 0, 0.27778], - "8217": [0, 0.69444, 0, 0, 0.27778], - "8220": [0, 0.69444, 0, 0, 0.5], - "8221": [0, 0.69444, 0, 0, 0.5], - "8224": [0.19444, 0.69444, 0, 0, 0.44445], - "8225": [0.19444, 0.69444, 0, 0, 0.44445], - "8230": [0, 0.12, 0, 0, 1015], - "8242": [0, 0.55556, 0, 0, 0.275], - "8407": [0, 0.71444, 0.15382, 0, 0.5], - "8463": [0, 0.68889, 0, 0, 0.54028], - "8465": [0, 0.69444, 0, 0, 0.72222], - "8467": [0, 0.69444, 0, 0.11111, 0.41667], - "8472": [0.19444, 0.43056, 0, 0.11111, 0.63646], - "8476": [0, 0.69444, 0, 0, 0.72222], - "8501": [0, 0.69444, 0, 0, 0.61111], - "8592": [-0.13313, 0.36687, 0, 0, 1.0], - "8593": [0.19444, 0.69444, 0, 0, 0.5], - "8594": [-0.13313, 0.36687, 0, 0, 1.0], - "8595": [0.19444, 0.69444, 0, 0, 0.5], - "8596": [-0.13313, 0.36687, 0, 0, 1.0], - "8597": [0.25, 0.75, 0, 0, 0.5], - "8598": [0.19444, 0.69444, 0, 0, 1.0], - "8599": [0.19444, 0.69444, 0, 0, 1.0], - "8600": [0.19444, 0.69444, 0, 0, 1.0], - "8601": [0.19444, 0.69444, 0, 0, 1.0], - "8614": [0.011, 0.511, 0, 0, 889], - "8617": [0.011, 0.511, 0, 0, 1015], - "8618": [0.011, 0.511, 0, 0, 1015], - "8636": [-0.13313, 0.36687, 0, 0, 1.0], - "8637": [-0.13313, 0.36687, 0, 0, 1.0], - "8640": [-0.13313, 0.36687, 0, 0, 1.0], - "8641": [-0.13313, 0.36687, 0, 0, 1.0], - "8652": [0.011, 0.671, 0, 0, 889], - "8656": [-0.13313, 0.36687, 0, 0, 1.0], - "8657": [0.19444, 0.69444, 0, 0, 0.61111], - "8658": [-0.13313, 0.36687, 0, 0, 1.0], - "8659": [0.19444, 0.69444, 0, 0, 0.61111], - "8660": [-0.13313, 0.36687, 0, 0, 1.0], - "8661": [0.25, 0.75, 0, 0, 0.61111], - "8704": [0, 0.69444, 0, 0, 0.55556], - "8706": [0, 0.69444, 0.05556, 0.08334, 0.5309], - "8707": [0, 0.69444, 0, 0, 0.55556], - "8709": [0.05556, 0.75, 0, 0, 0.5], - "8711": [0, 0.68333, 0, 0, 0.83334], - "8712": [0.0391, 0.5391, 0, 0, 0.66667], - "8715": [0.0391, 0.5391, 0, 0, 0.66667], - "8722": [0.08333, 0.58333, 0, 0, 0.77778], - "8723": [0.08333, 0.58333, 0, 0, 0.77778], - "8725": [0.25, 0.75, 0, 0, 0.5], - "8726": [0.25, 0.75, 0, 0, 0.5], - "8727": [-0.03472, 0.46528, 0, 0, 0.5], - "8728": [-0.05555, 0.44445, 0, 0, 0.5], - "8729": [-0.05555, 0.44445, 0, 0, 0.5], - "8730": [0.2, 0.8, 0, 0, 0.83334], - "8733": [0, 0.43056, 0, 0, 0.77778], - "8734": [0, 0.43056, 0, 0, 1.0], - "8736": [0, 0.69224, 0, 0, 0.72222], - "8739": [0.25, 0.75, 0, 0, 0.27778], - "8741": [0.25, 0.75, 0, 0, 0.5], - "8743": [0, 0.55556, 0, 0, 0.66667], - "8744": [0, 0.55556, 0, 0, 0.66667], - "8745": [0, 0.55556, 0, 0, 0.66667], - "8746": [0, 0.55556, 0, 0, 0.66667], - "8747": [0.19444, 0.69444, 0.11111, 0, 0.41667], - "8764": [-0.13313, 0.36687, 0, 0, 0.77778], - "8768": [0.19444, 0.69444, 0, 0, 0.27778], - "8771": [-0.03625, 0.46375, 0, 0, 0.77778], - "8773": [-0.022, 0.589, 0, 0, 667], - "8776": [-0.01688, 0.48312, 0, 0, 0.77778], - "8781": [-0.03625, 0.46375, 0, 0, 0.77778], - "8784": [-0.133, 0.67, 0, 0, 666], - "8800": [0.215, 0.716, 0, 0, 666], - "8801": [-0.03625, 0.46375, 0, 0, 0.77778], - "8804": [0.13597, 0.63597, 0, 0, 0.77778], - "8805": [0.13597, 0.63597, 0, 0, 0.77778], - "8810": [0.0391, 0.5391, 0, 0, 1.0], - "8811": [0.0391, 0.5391, 0, 0, 1.0], - "8826": [0.0391, 0.5391, 0, 0, 0.77778], - "8827": [0.0391, 0.5391, 0, 0, 0.77778], - "8834": [0.0391, 0.5391, 0, 0, 0.77778], - "8835": [0.0391, 0.5391, 0, 0, 0.77778], - "8838": [0.13597, 0.63597, 0, 0, 0.77778], - "8839": [0.13597, 0.63597, 0, 0, 0.77778], - "8846": [0, 0.55556, 0, 0, 0.66667], - "8849": [0.13597, 0.63597, 0, 0, 0.77778], - "8850": [0.13597, 0.63597, 0, 0, 0.77778], - "8851": [0, 0.55556, 0, 0, 0.66667], - "8852": [0, 0.55556, 0, 0, 0.66667], - "8853": [0.08333, 0.58333, 0, 0, 0.77778], - "8854": [0.08333, 0.58333, 0, 0, 0.77778], - "8855": [0.08333, 0.58333, 0, 0, 0.77778], - "8856": [0.08333, 0.58333, 0, 0, 0.77778], - "8857": [0.08333, 0.58333, 0, 0, 0.77778], - "8866": [0, 0.69444, 0, 0, 0.61111], - "8867": [0, 0.69444, 0, 0, 0.61111], - "8868": [0, 0.69444, 0, 0, 0.77778], - "8869": [0, 0.69444, 0, 0, 0.77778], - "8872": [0.249, 0.75, 0, 0, 692], - "8900": [-0.05555, 0.44445, 0, 0, 0.5], - "8901": [-0.05555, 0.44445, 0, 0, 0.27778], - "8902": [-0.03472, 0.46528, 0, 0, 0.5], - "8904": [0.005, 0.505, 0, 0, 847], - "8942": [0.03, 0.9, 0, 0, 121], - "8943": [-0.19, 0.31, 0, 0, 1015], - "8945": [-0.1, 0.82, 0, 0, 1015], - "8968": [0.25, 0.75, 0, 0, 0.44445], - "8969": [0.25, 0.75, 0, 0, 0.44445], - "8970": [0.25, 0.75, 0, 0, 0.44445], - "8971": [0.25, 0.75, 0, 0, 0.44445], - "8994": [-0.14236, 0.35764, 0, 0, 1.0], - "8995": [-0.14236, 0.35764, 0, 0, 1.0], - "9136": [0.244, 0.744, 0, 0, 301], - "9137": [0.244, 0.744, 0, 0, 301], - "9651": [0.19444, 0.69444, 0, 0, 0.88889], - "9657": [-0.03472, 0.46528, 0, 0, 0.5], - "9661": [0.19444, 0.69444, 0, 0, 0.88889], - "9667": [-0.03472, 0.46528, 0, 0, 0.5], - "9711": [0.19444, 0.69444, 0, 0, 1.0], - "9824": [0.12963, 0.69444, 0, 0, 0.77778], - "9825": [0.12963, 0.69444, 0, 0, 0.77778], - "9826": [0.12963, 0.69444, 0, 0, 0.77778], - "9827": [0.12963, 0.69444, 0, 0, 0.77778], - "9837": [0, 0.75, 0, 0, 0.38889], - "9838": [0.19444, 0.69444, 0, 0, 0.38889], - "9839": [0.19444, 0.69444, 0, 0, 0.38889], - "10216": [0.25, 0.75, 0, 0, 0.38889], - "10217": [0.25, 0.75, 0, 0, 0.38889], - "10222": [0.244, 0.744, 0, 0, 184], - "10223": [0.244, 0.744, 0, 0, 184], - "10229": [0.011, 0.511, 0, 0, 1470], - "10230": [0.011, 0.511, 0, 0, 1469], - "10231": [0.011, 0.511, 0, 0, 1748], - "10232": [0.024, 0.525, 0, 0, 1497], - "10233": [0.024, 0.525, 0, 0, 1526], - "10234": [0.024, 0.525, 0, 0, 1746], - "10236": [0.011, 0.511, 0, 0, 1498], - "10815": [0, 0.68333, 0, 0, 0.75], - "10927": [0.13597, 0.63597, 0, 0, 0.77778], - "10928": [0.13597, 0.63597, 0, 0, 0.77778] - }, - "Math-BoldItalic": { - "47": [0.19444, 0.69444, 0, 0, 0], - "65": [0, 0.68611, 0, 0, 0.86944], - "66": [0, 0.68611, 0.04835, 0, 0.8664], - "67": [0, 0.68611, 0.06979, 0, 0.81694], - "68": [0, 0.68611, 0.03194, 0, 0.93812], - "69": [0, 0.68611, 0.05451, 0, 0.81007], - "70": [0, 0.68611, 0.15972, 0, 0.68889], - "71": [0, 0.68611, 0, 0, 0.88673], - "72": [0, 0.68611, 0.08229, 0, 0.98229], - "73": [0, 0.68611, 0.07778, 0, 0.51111], - "74": [0, 0.68611, 0.10069, 0, 0.63125], - "75": [0, 0.68611, 0.06979, 0, 0.97118], - "76": [0, 0.68611, 0, 0, 0.75555], - "77": [0, 0.68611, 0.11424, 0, 1.14201], - "78": [0, 0.68611, 0.11424, 0, 0.95034], - "79": [0, 0.68611, 0.03194, 0, 0.83666], - "80": [0, 0.68611, 0.15972, 0, 0.72309], - "81": [0.19444, 0.68611, 0, 0, 0.86861], - "82": [0, 0.68611, 0.00421, 0, 0.87235], - "83": [0, 0.68611, 0.05382, 0, 0.69271], - "84": [0, 0.68611, 0.15972, 0, 0.63663], - "85": [0, 0.68611, 0.11424, 0, 0.80027], - "86": [0, 0.68611, 0.25555, 0, 0.67778], - "87": [0, 0.68611, 0.15972, 0, 1.09305], - "88": [0, 0.68611, 0.07778, 0, 0.94722], - "89": [0, 0.68611, 0.25555, 0, 0.67458], - "90": [0, 0.68611, 0.06979, 0, 0.77257], - "97": [0, 0.44444, 0, 0, 0.63287], - "98": [0, 0.69444, 0, 0, 0.52083], - "99": [0, 0.44444, 0, 0, 0.51342], - "100": [0, 0.69444, 0, 0, 0.60972], - "101": [0, 0.44444, 0, 0, 0.55361], - "102": [0.19444, 0.69444, 0.11042, 0, 0.56806], - "103": [0.19444, 0.44444, 0.03704, 0, 0.5449], - "104": [0, 0.69444, 0, 0, 0.66759], - "105": [0, 0.69326, 0, 0, 0.4048], - "106": [0.19444, 0.69326, 0.0622, 0, 0.47083], - "107": [0, 0.69444, 0.01852, 0, 0.6037], - "108": [0, 0.69444, 0.0088, 0, 0.34815], - "109": [0, 0.44444, 0, 0, 1.0324], - "110": [0, 0.44444, 0, 0, 0.71296], - "111": [0, 0.44444, 0, 0, 0.58472], - "112": [0.19444, 0.44444, 0, 0, 0.60092], - "113": [0.19444, 0.44444, 0.03704, 0, 0.54213], - "114": [0, 0.44444, 0.03194, 0, 0.5287], - "115": [0, 0.44444, 0, 0, 0.53125], - "116": [0, 0.63492, 0, 0, 0.41528], - "117": [0, 0.44444, 0, 0, 0.68102], - "118": [0, 0.44444, 0.03704, 0, 0.56666], - "119": [0, 0.44444, 0.02778, 0, 0.83148], - "120": [0, 0.44444, 0, 0, 0.65903], - "121": [0.19444, 0.44444, 0.03704, 0, 0.59028], - "122": [0, 0.44444, 0.04213, 0, 0.55509], - "915": [0, 0.68611, 0.15972, 0, 0.65694], - "916": [0, 0.68611, 0, 0, 0.95833], - "920": [0, 0.68611, 0.03194, 0, 0.86722], - "923": [0, 0.68611, 0, 0, 0.80555], - "926": [0, 0.68611, 0.07458, 0, 0.84125], - "928": [0, 0.68611, 0.08229, 0, 0.98229], - "931": [0, 0.68611, 0.05451, 0, 0.88507], - "933": [0, 0.68611, 0.15972, 0, 0.67083], - "934": [0, 0.68611, 0, 0, 0.76666], - "936": [0, 0.68611, 0.11653, 0, 0.71402], - "937": [0, 0.68611, 0.04835, 0, 0.8789], - "945": [0, 0.44444, 0, 0, 0.76064], - "946": [0.19444, 0.69444, 0.03403, 0, 0.65972], - "947": [0.19444, 0.44444, 0.06389, 0, 0.59003], - "948": [0, 0.69444, 0.03819, 0, 0.52222], - "949": [0, 0.44444, 0, 0, 0.52882], - "950": [0.19444, 0.69444, 0.06215, 0, 0.50833], - "951": [0.19444, 0.44444, 0.03704, 0, 0.6], - "952": [0, 0.69444, 0.03194, 0, 0.5618], - "953": [0, 0.44444, 0, 0, 0.41204], - "954": [0, 0.44444, 0, 0, 0.66759], - "955": [0, 0.69444, 0, 0, 0.67083], - "956": [0.19444, 0.44444, 0, 0, 0.70787], - "957": [0, 0.44444, 0.06898, 0, 0.57685], - "958": [0.19444, 0.69444, 0.03021, 0, 0.50833], - "959": [0, 0.44444, 0, 0, 0.58472], - "960": [0, 0.44444, 0.03704, 0, 0.68241], - "961": [0.19444, 0.44444, 0, 0, 0.6118], - "962": [0.09722, 0.44444, 0.07917, 0, 0.42361], - "963": [0, 0.44444, 0.03704, 0, 0.68588], - "964": [0, 0.44444, 0.13472, 0, 0.52083], - "965": [0, 0.44444, 0.03704, 0, 0.63055], - "966": [0.19444, 0.44444, 0, 0, 0.74722], - "967": [0.19444, 0.44444, 0, 0, 0.71805], - "968": [0.19444, 0.69444, 0.03704, 0, 0.75833], - "969": [0, 0.44444, 0.03704, 0, 0.71782], - "977": [0, 0.69444, 0, 0, 0.69155], - "981": [0.19444, 0.69444, 0, 0, 0.7125], - "982": [0, 0.44444, 0.03194, 0, 0.975], - "1009": [0.19444, 0.44444, 0, 0, 0.6118], - "1013": [0, 0.44444, 0, 0, 0.48333] - }, - "Math-Italic": { - "47": [0.19444, 0.69444, 0, 0, 0], - "65": [0, 0.68333, 0, 0.13889, 0.75], - "66": [0, 0.68333, 0.05017, 0.08334, 0.75851], - "67": [0, 0.68333, 0.07153, 0.08334, 0.71472], - "68": [0, 0.68333, 0.02778, 0.05556, 0.82792], - "69": [0, 0.68333, 0.05764, 0.08334, 0.7382], - "70": [0, 0.68333, 0.13889, 0.08334, 0.64306], - "71": [0, 0.68333, 0, 0.08334, 0.78625], - "72": [0, 0.68333, 0.08125, 0.05556, 0.83125], - "73": [0, 0.68333, 0.07847, 0.11111, 0.43958], - "74": [0, 0.68333, 0.09618, 0.16667, 0.55451], - "75": [0, 0.68333, 0.07153, 0.05556, 0.84931], - "76": [0, 0.68333, 0, 0.02778, 0.68056], - "77": [0, 0.68333, 0.10903, 0.08334, 0.97014], - "78": [0, 0.68333, 0.10903, 0.08334, 0.80347], - "79": [0, 0.68333, 0.02778, 0.08334, 0.76278], - "80": [0, 0.68333, 0.13889, 0.08334, 0.64201], - "81": [0.19444, 0.68333, 0, 0.08334, 0.79056], - "82": [0, 0.68333, 0.00773, 0.08334, 0.75929], - "83": [0, 0.68333, 0.05764, 0.08334, 0.6132], - "84": [0, 0.68333, 0.13889, 0.08334, 0.58438], - "85": [0, 0.68333, 0.10903, 0.02778, 0.68278], - "86": [0, 0.68333, 0.22222, 0, 0.58333], - "87": [0, 0.68333, 0.13889, 0, 0.94445], - "88": [0, 0.68333, 0.07847, 0.08334, 0.82847], - "89": [0, 0.68333, 0.22222, 0, 0.58056], - "90": [0, 0.68333, 0.07153, 0.08334, 0.68264], - "97": [0, 0.43056, 0, 0, 0.52859], - "98": [0, 0.69444, 0, 0, 0.42917], - "99": [0, 0.43056, 0, 0.05556, 0.43276], - "100": [0, 0.69444, 0, 0.16667, 0.52049], - "101": [0, 0.43056, 0, 0.05556, 0.46563], - "102": [0.19444, 0.69444, 0.10764, 0.16667, 0.48959], - "103": [0.19444, 0.43056, 0.03588, 0.02778, 0.47697], - "104": [0, 0.69444, 0, 0, 0.57616], - "105": [0, 0.65952, 0, 0, 0.34451], - "106": [0.19444, 0.65952, 0.05724, 0, 0.41181], - "107": [0, 0.69444, 0.03148, 0, 0.5206], - "108": [0, 0.69444, 0.01968, 0.08334, 0.29838], - "109": [0, 0.43056, 0, 0, 0.87801], - "110": [0, 0.43056, 0, 0, 0.60023], - "111": [0, 0.43056, 0, 0.05556, 0.48472], - "112": [0.19444, 0.43056, 0, 0.08334, 0.50313], - "113": [0.19444, 0.43056, 0.03588, 0.08334, 0.44641], - "114": [0, 0.43056, 0.02778, 0.05556, 0.45116], - "115": [0, 0.43056, 0, 0.05556, 0.46875], - "116": [0, 0.61508, 0, 0.08334, 0.36111], - "117": [0, 0.43056, 0, 0.02778, 0.57246], - "118": [0, 0.43056, 0.03588, 0.02778, 0.48472], - "119": [0, 0.43056, 0.02691, 0.08334, 0.71592], - "120": [0, 0.43056, 0, 0.02778, 0.57153], - "121": [0.19444, 0.43056, 0.03588, 0.05556, 0.49028], - "122": [0, 0.43056, 0.04398, 0.05556, 0.46505], - "915": [0, 0.68333, 0.13889, 0.08334, 0.61528], - "916": [0, 0.68333, 0, 0.16667, 0.83334], - "920": [0, 0.68333, 0.02778, 0.08334, 0.76278], - "923": [0, 0.68333, 0, 0.16667, 0.69445], - "926": [0, 0.68333, 0.07569, 0.08334, 0.74236], - "928": [0, 0.68333, 0.08125, 0.05556, 0.83125], - "931": [0, 0.68333, 0.05764, 0.08334, 0.77986], - "933": [0, 0.68333, 0.13889, 0.05556, 0.58333], - "934": [0, 0.68333, 0, 0.08334, 0.66667], - "936": [0, 0.68333, 0.11, 0.05556, 0.61222], - "937": [0, 0.68333, 0.05017, 0.08334, 0.7724], - "945": [0, 0.43056, 0.0037, 0.02778, 0.6397], - "946": [0.19444, 0.69444, 0.05278, 0.08334, 0.56563], - "947": [0.19444, 0.43056, 0.05556, 0, 0.51773], - "948": [0, 0.69444, 0.03785, 0.05556, 0.44444], - "949": [0, 0.43056, 0, 0.08334, 0.46632], - "950": [0.19444, 0.69444, 0.07378, 0.08334, 0.4375], - "951": [0.19444, 0.43056, 0.03588, 0.05556, 0.49653], - "952": [0, 0.69444, 0.02778, 0.08334, 0.46944], - "953": [0, 0.43056, 0, 0.05556, 0.35394], - "954": [0, 0.43056, 0, 0, 0.57616], - "955": [0, 0.69444, 0, 0, 0.58334], - "956": [0.19444, 0.43056, 0, 0.02778, 0.60255], - "957": [0, 0.43056, 0.06366, 0.02778, 0.49398], - "958": [0.19444, 0.69444, 0.04601, 0.11111, 0.4375], - "959": [0, 0.43056, 0, 0.05556, 0.48472], - "960": [0, 0.43056, 0.03588, 0, 0.57003], - "961": [0.19444, 0.43056, 0, 0.08334, 0.51702], - "962": [0.09722, 0.43056, 0.07986, 0.08334, 0.36285], - "963": [0, 0.43056, 0.03588, 0, 0.57141], - "964": [0, 0.43056, 0.1132, 0.02778, 0.43715], - "965": [0, 0.43056, 0.03588, 0.02778, 0.54028], - "966": [0.19444, 0.43056, 0, 0.08334, 0.65417], - "967": [0.19444, 0.43056, 0, 0.05556, 0.62569], - "968": [0.19444, 0.69444, 0.03588, 0.11111, 0.65139], - "969": [0, 0.43056, 0.03588, 0, 0.62245], - "977": [0, 0.69444, 0, 0.08334, 0.59144], - "981": [0.19444, 0.69444, 0, 0.08334, 0.59583], - "982": [0, 0.43056, 0.02778, 0, 0.82813], - "1009": [0.19444, 0.43056, 0, 0.08334, 0.51702], - "1013": [0, 0.43056, 0, 0.05556, 0.4059] - }, - "Math-Regular": { - "65": [0, 0.68333, 0, 0.13889, 0.75], - "66": [0, 0.68333, 0.05017, 0.08334, 0.75851], - "67": [0, 0.68333, 0.07153, 0.08334, 0.71472], - "68": [0, 0.68333, 0.02778, 0.05556, 0.82792], - "69": [0, 0.68333, 0.05764, 0.08334, 0.7382], - "70": [0, 0.68333, 0.13889, 0.08334, 0.64306], - "71": [0, 0.68333, 0, 0.08334, 0.78625], - "72": [0, 0.68333, 0.08125, 0.05556, 0.83125], - "73": [0, 0.68333, 0.07847, 0.11111, 0.43958], - "74": [0, 0.68333, 0.09618, 0.16667, 0.55451], - "75": [0, 0.68333, 0.07153, 0.05556, 0.84931], - "76": [0, 0.68333, 0, 0.02778, 0.68056], - "77": [0, 0.68333, 0.10903, 0.08334, 0.97014], - "78": [0, 0.68333, 0.10903, 0.08334, 0.80347], - "79": [0, 0.68333, 0.02778, 0.08334, 0.76278], - "80": [0, 0.68333, 0.13889, 0.08334, 0.64201], - "81": [0.19444, 0.68333, 0, 0.08334, 0.79056], - "82": [0, 0.68333, 0.00773, 0.08334, 0.75929], - "83": [0, 0.68333, 0.05764, 0.08334, 0.6132], - "84": [0, 0.68333, 0.13889, 0.08334, 0.58438], - "85": [0, 0.68333, 0.10903, 0.02778, 0.68278], - "86": [0, 0.68333, 0.22222, 0, 0.58333], - "87": [0, 0.68333, 0.13889, 0, 0.94445], - "88": [0, 0.68333, 0.07847, 0.08334, 0.82847], - "89": [0, 0.68333, 0.22222, 0, 0.58056], - "90": [0, 0.68333, 0.07153, 0.08334, 0.68264], - "97": [0, 0.43056, 0, 0, 0.52859], - "98": [0, 0.69444, 0, 0, 0.42917], - "99": [0, 0.43056, 0, 0.05556, 0.43276], - "100": [0, 0.69444, 0, 0.16667, 0.52049], - "101": [0, 0.43056, 0, 0.05556, 0.46563], - "102": [0.19444, 0.69444, 0.10764, 0.16667, 0.48959], - "103": [0.19444, 0.43056, 0.03588, 0.02778, 0.47697], - "104": [0, 0.69444, 0, 0, 0.57616], - "105": [0, 0.65952, 0, 0, 0.34451], - "106": [0.19444, 0.65952, 0.05724, 0, 0.41181], - "107": [0, 0.69444, 0.03148, 0, 0.5206], - "108": [0, 0.69444, 0.01968, 0.08334, 0.29838], - "109": [0, 0.43056, 0, 0, 0.87801], - "110": [0, 0.43056, 0, 0, 0.60023], - "111": [0, 0.43056, 0, 0.05556, 0.48472], - "112": [0.19444, 0.43056, 0, 0.08334, 0.50313], - "113": [0.19444, 0.43056, 0.03588, 0.08334, 0.44641], - "114": [0, 0.43056, 0.02778, 0.05556, 0.45116], - "115": [0, 0.43056, 0, 0.05556, 0.46875], - "116": [0, 0.61508, 0, 0.08334, 0.36111], - "117": [0, 0.43056, 0, 0.02778, 0.57246], - "118": [0, 0.43056, 0.03588, 0.02778, 0.48472], - "119": [0, 0.43056, 0.02691, 0.08334, 0.71592], - "120": [0, 0.43056, 0, 0.02778, 0.57153], - "121": [0.19444, 0.43056, 0.03588, 0.05556, 0.49028], - "122": [0, 0.43056, 0.04398, 0.05556, 0.46505], - "915": [0, 0.68333, 0.13889, 0.08334, 0.61528], - "916": [0, 0.68333, 0, 0.16667, 0.83334], - "920": [0, 0.68333, 0.02778, 0.08334, 0.76278], - "923": [0, 0.68333, 0, 0.16667, 0.69445], - "926": [0, 0.68333, 0.07569, 0.08334, 0.74236], - "928": [0, 0.68333, 0.08125, 0.05556, 0.83125], - "931": [0, 0.68333, 0.05764, 0.08334, 0.77986], - "933": [0, 0.68333, 0.13889, 0.05556, 0.58333], - "934": [0, 0.68333, 0, 0.08334, 0.66667], - "936": [0, 0.68333, 0.11, 0.05556, 0.61222], - "937": [0, 0.68333, 0.05017, 0.08334, 0.7724], - "945": [0, 0.43056, 0.0037, 0.02778, 0.6397], - "946": [0.19444, 0.69444, 0.05278, 0.08334, 0.56563], - "947": [0.19444, 0.43056, 0.05556, 0, 0.51773], - "948": [0, 0.69444, 0.03785, 0.05556, 0.44444], - "949": [0, 0.43056, 0, 0.08334, 0.46632], - "950": [0.19444, 0.69444, 0.07378, 0.08334, 0.4375], - "951": [0.19444, 0.43056, 0.03588, 0.05556, 0.49653], - "952": [0, 0.69444, 0.02778, 0.08334, 0.46944], - "953": [0, 0.43056, 0, 0.05556, 0.35394], - "954": [0, 0.43056, 0, 0, 0.57616], - "955": [0, 0.69444, 0, 0, 0.58334], - "956": [0.19444, 0.43056, 0, 0.02778, 0.60255], - "957": [0, 0.43056, 0.06366, 0.02778, 0.49398], - "958": [0.19444, 0.69444, 0.04601, 0.11111, 0.4375], - "959": [0, 0.43056, 0, 0.05556, 0.48472], - "960": [0, 0.43056, 0.03588, 0, 0.57003], - "961": [0.19444, 0.43056, 0, 0.08334, 0.51702], - "962": [0.09722, 0.43056, 0.07986, 0.08334, 0.36285], - "963": [0, 0.43056, 0.03588, 0, 0.57141], - "964": [0, 0.43056, 0.1132, 0.02778, 0.43715], - "965": [0, 0.43056, 0.03588, 0.02778, 0.54028], - "966": [0.19444, 0.43056, 0, 0.08334, 0.65417], - "967": [0.19444, 0.43056, 0, 0.05556, 0.62569], - "968": [0.19444, 0.69444, 0.03588, 0.11111, 0.65139], - "969": [0, 0.43056, 0.03588, 0, 0.62245], - "977": [0, 0.69444, 0, 0.08334, 0.59144], - "981": [0.19444, 0.69444, 0, 0.08334, 0.59583], - "982": [0, 0.43056, 0.02778, 0, 0.82813], - "1009": [0.19444, 0.43056, 0, 0.08334, 0.51702], - "1013": [0, 0.43056, 0, 0.05556, 0.4059] - }, - "SansSerif-Bold": { - "33": [0, 0.69444, 0, 0, 0.36667], - "34": [0, 0.69444, 0, 0, 0.55834], - "35": [0.19444, 0.69444, 0, 0, 0.91667], - "36": [0.05556, 0.75, 0, 0, 0.55], - "37": [0.05556, 0.75, 0, 0, 1.02912], - "38": [0, 0.69444, 0, 0, 0.83056], - "39": [0, 0.69444, 0, 0, 0.30556], - "40": [0.25, 0.75, 0, 0, 0.42778], - "41": [0.25, 0.75, 0, 0, 0.42778], - "42": [0, 0.75, 0, 0, 0.55], - "43": [0.11667, 0.61667, 0, 0, 0.85556], - "44": [0.10556, 0.13056, 0, 0, 0.30556], - "45": [0, 0.45833, 0, 0, 0.36667], - "46": [0, 0.13056, 0, 0, 0.30556], - "47": [0.25, 0.75, 0, 0, 0.55], - "48": [0, 0.69444, 0, 0, 0.55], - "49": [0, 0.69444, 0, 0, 0.55], - "50": [0, 0.69444, 0, 0, 0.55], - "51": [0, 0.69444, 0, 0, 0.55], - "52": [0, 0.69444, 0, 0, 0.55], - "53": [0, 0.69444, 0, 0, 0.55], - "54": [0, 0.69444, 0, 0, 0.55], - "55": [0, 0.69444, 0, 0, 0.55], - "56": [0, 0.69444, 0, 0, 0.55], - "57": [0, 0.69444, 0, 0, 0.55], - "58": [0, 0.45833, 0, 0, 0.30556], - "59": [0.10556, 0.45833, 0, 0, 0.30556], - "61": [-0.09375, 0.40625, 0, 0, 0.85556], - "63": [0, 0.69444, 0, 0, 0.51945], - "64": [0, 0.69444, 0, 0, 0.73334], - "65": [0, 0.69444, 0, 0, 0.73334], - "66": [0, 0.69444, 0, 0, 0.73334], - "67": [0, 0.69444, 0, 0, 0.70278], - "68": [0, 0.69444, 0, 0, 0.79445], - "69": [0, 0.69444, 0, 0, 0.64167], - "70": [0, 0.69444, 0, 0, 0.61111], - "71": [0, 0.69444, 0, 0, 0.73334], - "72": [0, 0.69444, 0, 0, 0.79445], - "73": [0, 0.69444, 0, 0, 0.33056], - "74": [0, 0.69444, 0, 0, 0.51945], - "75": [0, 0.69444, 0, 0, 0.76389], - "76": [0, 0.69444, 0, 0, 0.58056], - "77": [0, 0.69444, 0, 0, 0.97778], - "78": [0, 0.69444, 0, 0, 0.79445], - "79": [0, 0.69444, 0, 0, 0.79445], - "80": [0, 0.69444, 0, 0, 0.70278], - "81": [0.10556, 0.69444, 0, 0, 0.79445], - "82": [0, 0.69444, 0, 0, 0.70278], - "83": [0, 0.69444, 0, 0, 0.61111], - "84": [0, 0.69444, 0, 0, 0.73334], - "85": [0, 0.69444, 0, 0, 0.76389], - "86": [0, 0.69444, 0.01528, 0, 0.73334], - "87": [0, 0.69444, 0.01528, 0, 1.03889], - "88": [0, 0.69444, 0, 0, 0.73334], - "89": [0, 0.69444, 0.0275, 0, 0.73334], - "90": [0, 0.69444, 0, 0, 0.67223], - "91": [0.25, 0.75, 0, 0, 0.34306], - "93": [0.25, 0.75, 0, 0, 0.34306], - "94": [0, 0.69444, 0, 0, 0.55], - "95": [0.35, 0.10833, 0.03056, 0, 0.55], - "97": [0, 0.45833, 0, 0, 0.525], - "98": [0, 0.69444, 0, 0, 0.56111], - "99": [0, 0.45833, 0, 0, 0.48889], - "100": [0, 0.69444, 0, 0, 0.56111], - "101": [0, 0.45833, 0, 0, 0.51111], - "102": [0, 0.69444, 0.07639, 0, 0.33611], - "103": [0.19444, 0.45833, 0.01528, 0, 0.55], - "104": [0, 0.69444, 0, 0, 0.56111], - "105": [0, 0.69444, 0, 0, 0.25556], - "106": [0.19444, 0.69444, 0, 0, 0.28611], - "107": [0, 0.69444, 0, 0, 0.53056], - "108": [0, 0.69444, 0, 0, 0.25556], - "109": [0, 0.45833, 0, 0, 0.86667], - "110": [0, 0.45833, 0, 0, 0.56111], - "111": [0, 0.45833, 0, 0, 0.55], - "112": [0.19444, 0.45833, 0, 0, 0.56111], - "113": [0.19444, 0.45833, 0, 0, 0.56111], - "114": [0, 0.45833, 0.01528, 0, 0.37222], - "115": [0, 0.45833, 0, 0, 0.42167], - "116": [0, 0.58929, 0, 0, 0.40417], - "117": [0, 0.45833, 0, 0, 0.56111], - "118": [0, 0.45833, 0.01528, 0, 0.5], - "119": [0, 0.45833, 0.01528, 0, 0.74445], - "120": [0, 0.45833, 0, 0, 0.5], - "121": [0.19444, 0.45833, 0.01528, 0, 0.5], - "122": [0, 0.45833, 0, 0, 0.47639], - "126": [0.35, 0.34444, 0, 0, 0.55], - "168": [0, 0.69444, 0, 0, 0.55], - "176": [0, 0.69444, 0, 0, 0.73334], - "180": [0, 0.69444, 0, 0, 0.55], - "305": [0, 0.45833, 0, 0, 0.25556], - "567": [0.19444, 0.45833, 0, 0, 0.28611], - "710": [0, 0.69444, 0, 0, 0.55], - "711": [0, 0.63542, 0, 0, 0.55], - "713": [0, 0.63778, 0, 0, 0.55], - "728": [0, 0.69444, 0, 0, 0.55], - "729": [0, 0.69444, 0, 0, 0.30556], - "730": [0, 0.69444, 0, 0, 0.73334], - "732": [0, 0.69444, 0, 0, 0.55], - "733": [0, 0.69444, 0, 0, 0.55], - "915": [0, 0.69444, 0, 0, 0.58056], - "916": [0, 0.69444, 0, 0, 0.91667], - "920": [0, 0.69444, 0, 0, 0.85556], - "923": [0, 0.69444, 0, 0, 0.67223], - "926": [0, 0.69444, 0, 0, 0.73334], - "928": [0, 0.69444, 0, 0, 0.79445], - "931": [0, 0.69444, 0, 0, 0.79445], - "933": [0, 0.69444, 0, 0, 0.85556], - "934": [0, 0.69444, 0, 0, 0.79445], - "936": [0, 0.69444, 0, 0, 0.85556], - "937": [0, 0.69444, 0, 0, 0.79445], - "8211": [0, 0.45833, 0.03056, 0, 0.55], - "8212": [0, 0.45833, 0.03056, 0, 1.10001], - "8216": [0, 0.69444, 0, 0, 0.30556], - "8217": [0, 0.69444, 0, 0, 0.30556], - "8220": [0, 0.69444, 0, 0, 0.55834], - "8221": [0, 0.69444, 0, 0, 0.55834] - }, - "SansSerif-Italic": { - "33": [0, 0.69444, 0.05733, 0, 0.31945], - "34": [0, 0.69444, 0.00316, 0, 0.5], - "35": [0.19444, 0.69444, 0.05087, 0, 0.83334], - "36": [0.05556, 0.75, 0.11156, 0, 0.5], - "37": [0.05556, 0.75, 0.03126, 0, 0.83334], - "38": [0, 0.69444, 0.03058, 0, 0.75834], - "39": [0, 0.69444, 0.07816, 0, 0.27778], - "40": [0.25, 0.75, 0.13164, 0, 0.38889], - "41": [0.25, 0.75, 0.02536, 0, 0.38889], - "42": [0, 0.75, 0.11775, 0, 0.5], - "43": [0.08333, 0.58333, 0.02536, 0, 0.77778], - "44": [0.125, 0.08333, 0, 0, 0.27778], - "45": [0, 0.44444, 0.01946, 0, 0.33333], - "46": [0, 0.08333, 0, 0, 0.27778], - "47": [0.25, 0.75, 0.13164, 0, 0.5], - "48": [0, 0.65556, 0.11156, 0, 0.5], - "49": [0, 0.65556, 0.11156, 0, 0.5], - "50": [0, 0.65556, 0.11156, 0, 0.5], - "51": [0, 0.65556, 0.11156, 0, 0.5], - "52": [0, 0.65556, 0.11156, 0, 0.5], - "53": [0, 0.65556, 0.11156, 0, 0.5], - "54": [0, 0.65556, 0.11156, 0, 0.5], - "55": [0, 0.65556, 0.11156, 0, 0.5], - "56": [0, 0.65556, 0.11156, 0, 0.5], - "57": [0, 0.65556, 0.11156, 0, 0.5], - "58": [0, 0.44444, 0.02502, 0, 0.27778], - "59": [0.125, 0.44444, 0.02502, 0, 0.27778], - "61": [-0.13, 0.37, 0.05087, 0, 0.77778], - "63": [0, 0.69444, 0.11809, 0, 0.47222], - "64": [0, 0.69444, 0.07555, 0, 0.66667], - "65": [0, 0.69444, 0, 0, 0.66667], - "66": [0, 0.69444, 0.08293, 0, 0.66667], - "67": [0, 0.69444, 0.11983, 0, 0.63889], - "68": [0, 0.69444, 0.07555, 0, 0.72223], - "69": [0, 0.69444, 0.11983, 0, 0.59722], - "70": [0, 0.69444, 0.13372, 0, 0.56945], - "71": [0, 0.69444, 0.11983, 0, 0.66667], - "72": [0, 0.69444, 0.08094, 0, 0.70834], - "73": [0, 0.69444, 0.13372, 0, 0.27778], - "74": [0, 0.69444, 0.08094, 0, 0.47222], - "75": [0, 0.69444, 0.11983, 0, 0.69445], - "76": [0, 0.69444, 0, 0, 0.54167], - "77": [0, 0.69444, 0.08094, 0, 0.875], - "78": [0, 0.69444, 0.08094, 0, 0.70834], - "79": [0, 0.69444, 0.07555, 0, 0.73611], - "80": [0, 0.69444, 0.08293, 0, 0.63889], - "81": [0.125, 0.69444, 0.07555, 0, 0.73611], - "82": [0, 0.69444, 0.08293, 0, 0.64584], - "83": [0, 0.69444, 0.09205, 0, 0.55556], - "84": [0, 0.69444, 0.13372, 0, 0.68056], - "85": [0, 0.69444, 0.08094, 0, 0.6875], - "86": [0, 0.69444, 0.1615, 0, 0.66667], - "87": [0, 0.69444, 0.1615, 0, 0.94445], - "88": [0, 0.69444, 0.13372, 0, 0.66667], - "89": [0, 0.69444, 0.17261, 0, 0.66667], - "90": [0, 0.69444, 0.11983, 0, 0.61111], - "91": [0.25, 0.75, 0.15942, 0, 0.28889], - "93": [0.25, 0.75, 0.08719, 0, 0.28889], - "94": [0, 0.69444, 0.0799, 0, 0.5], - "95": [0.35, 0.09444, 0.08616, 0, 0.5], - "97": [0, 0.44444, 0.00981, 0, 0.48056], - "98": [0, 0.69444, 0.03057, 0, 0.51667], - "99": [0, 0.44444, 0.08336, 0, 0.44445], - "100": [0, 0.69444, 0.09483, 0, 0.51667], - "101": [0, 0.44444, 0.06778, 0, 0.44445], - "102": [0, 0.69444, 0.21705, 0, 0.30556], - "103": [0.19444, 0.44444, 0.10836, 0, 0.5], - "104": [0, 0.69444, 0.01778, 0, 0.51667], - "105": [0, 0.67937, 0.09718, 0, 0.23889], - "106": [0.19444, 0.67937, 0.09162, 0, 0.26667], - "107": [0, 0.69444, 0.08336, 0, 0.48889], - "108": [0, 0.69444, 0.09483, 0, 0.23889], - "109": [0, 0.44444, 0.01778, 0, 0.79445], - "110": [0, 0.44444, 0.01778, 0, 0.51667], - "111": [0, 0.44444, 0.06613, 0, 0.5], - "112": [0.19444, 0.44444, 0.0389, 0, 0.51667], - "113": [0.19444, 0.44444, 0.04169, 0, 0.51667], - "114": [0, 0.44444, 0.10836, 0, 0.34167], - "115": [0, 0.44444, 0.0778, 0, 0.38333], - "116": [0, 0.57143, 0.07225, 0, 0.36111], - "117": [0, 0.44444, 0.04169, 0, 0.51667], - "118": [0, 0.44444, 0.10836, 0, 0.46111], - "119": [0, 0.44444, 0.10836, 0, 0.68334], - "120": [0, 0.44444, 0.09169, 0, 0.46111], - "121": [0.19444, 0.44444, 0.10836, 0, 0.46111], - "122": [0, 0.44444, 0.08752, 0, 0.43472], - "126": [0.35, 0.32659, 0.08826, 0, 0.5], - "168": [0, 0.67937, 0.06385, 0, 0.5], - "176": [0, 0.69444, 0, 0, 0.73752], - "305": [0, 0.44444, 0.04169, 0, 0.23889], - "567": [0.19444, 0.44444, 0.04169, 0, 0.26667], - "710": [0, 0.69444, 0.0799, 0, 0.5], - "711": [0, 0.63194, 0.08432, 0, 0.5], - "713": [0, 0.60889, 0.08776, 0, 0.5], - "714": [0, 0.69444, 0.09205, 0, 0.5], - "715": [0, 0.69444, 0, 0, 0.5], - "728": [0, 0.69444, 0.09483, 0, 0.5], - "729": [0, 0.67937, 0.07774, 0, 0.27778], - "730": [0, 0.69444, 0, 0, 0.73752], - "732": [0, 0.67659, 0.08826, 0, 0.5], - "733": [0, 0.69444, 0.09205, 0, 0.5], - "915": [0, 0.69444, 0.13372, 0, 0.54167], - "916": [0, 0.69444, 0, 0, 0.83334], - "920": [0, 0.69444, 0.07555, 0, 0.77778], - "923": [0, 0.69444, 0, 0, 0.61111], - "926": [0, 0.69444, 0.12816, 0, 0.66667], - "928": [0, 0.69444, 0.08094, 0, 0.70834], - "931": [0, 0.69444, 0.11983, 0, 0.72222], - "933": [0, 0.69444, 0.09031, 0, 0.77778], - "934": [0, 0.69444, 0.04603, 0, 0.72222], - "936": [0, 0.69444, 0.09031, 0, 0.77778], - "937": [0, 0.69444, 0.08293, 0, 0.72222], - "8211": [0, 0.44444, 0.08616, 0, 0.5], - "8212": [0, 0.44444, 0.08616, 0, 1.0], - "8216": [0, 0.69444, 0.07816, 0, 0.27778], - "8217": [0, 0.69444, 0.07816, 0, 0.27778], - "8220": [0, 0.69444, 0.14205, 0, 0.5], - "8221": [0, 0.69444, 0.00316, 0, 0.5] - }, - "SansSerif-Regular": { - "33": [0, 0.69444, 0, 0, 0.31945], - "34": [0, 0.69444, 0, 0, 0.5], - "35": [0.19444, 0.69444, 0, 0, 0.83334], - "36": [0.05556, 0.75, 0, 0, 0.5], - "37": [0.05556, 0.75, 0, 0, 0.83334], - "38": [0, 0.69444, 0, 0, 0.75834], - "39": [0, 0.69444, 0, 0, 0.27778], - "40": [0.25, 0.75, 0, 0, 0.38889], - "41": [0.25, 0.75, 0, 0, 0.38889], - "42": [0, 0.75, 0, 0, 0.5], - "43": [0.08333, 0.58333, 0, 0, 0.77778], - "44": [0.125, 0.08333, 0, 0, 0.27778], - "45": [0, 0.44444, 0, 0, 0.33333], - "46": [0, 0.08333, 0, 0, 0.27778], - "47": [0.25, 0.75, 0, 0, 0.5], - "48": [0, 0.65556, 0, 0, 0.5], - "49": [0, 0.65556, 0, 0, 0.5], - "50": [0, 0.65556, 0, 0, 0.5], - "51": [0, 0.65556, 0, 0, 0.5], - "52": [0, 0.65556, 0, 0, 0.5], - "53": [0, 0.65556, 0, 0, 0.5], - "54": [0, 0.65556, 0, 0, 0.5], - "55": [0, 0.65556, 0, 0, 0.5], - "56": [0, 0.65556, 0, 0, 0.5], - "57": [0, 0.65556, 0, 0, 0.5], - "58": [0, 0.44444, 0, 0, 0.27778], - "59": [0.125, 0.44444, 0, 0, 0.27778], - "61": [-0.13, 0.37, 0, 0, 0.77778], - "63": [0, 0.69444, 0, 0, 0.47222], - "64": [0, 0.69444, 0, 0, 0.66667], - "65": [0, 0.69444, 0, 0, 0.66667], - "66": [0, 0.69444, 0, 0, 0.66667], - "67": [0, 0.69444, 0, 0, 0.63889], - "68": [0, 0.69444, 0, 0, 0.72223], - "69": [0, 0.69444, 0, 0, 0.59722], - "70": [0, 0.69444, 0, 0, 0.56945], - "71": [0, 0.69444, 0, 0, 0.66667], - "72": [0, 0.69444, 0, 0, 0.70834], - "73": [0, 0.69444, 0, 0, 0.27778], - "74": [0, 0.69444, 0, 0, 0.47222], - "75": [0, 0.69444, 0, 0, 0.69445], - "76": [0, 0.69444, 0, 0, 0.54167], - "77": [0, 0.69444, 0, 0, 0.875], - "78": [0, 0.69444, 0, 0, 0.70834], - "79": [0, 0.69444, 0, 0, 0.73611], - "80": [0, 0.69444, 0, 0, 0.63889], - "81": [0.125, 0.69444, 0, 0, 0.73611], - "82": [0, 0.69444, 0, 0, 0.64584], - "83": [0, 0.69444, 0, 0, 0.55556], - "84": [0, 0.69444, 0, 0, 0.68056], - "85": [0, 0.69444, 0, 0, 0.6875], - "86": [0, 0.69444, 0.01389, 0, 0.66667], - "87": [0, 0.69444, 0.01389, 0, 0.94445], - "88": [0, 0.69444, 0, 0, 0.66667], - "89": [0, 0.69444, 0.025, 0, 0.66667], - "90": [0, 0.69444, 0, 0, 0.61111], - "91": [0.25, 0.75, 0, 0, 0.28889], - "93": [0.25, 0.75, 0, 0, 0.28889], - "94": [0, 0.69444, 0, 0, 0.5], - "95": [0.35, 0.09444, 0.02778, 0, 0.5], - "97": [0, 0.44444, 0, 0, 0.48056], - "98": [0, 0.69444, 0, 0, 0.51667], - "99": [0, 0.44444, 0, 0, 0.44445], - "100": [0, 0.69444, 0, 0, 0.51667], - "101": [0, 0.44444, 0, 0, 0.44445], - "102": [0, 0.69444, 0.06944, 0, 0.30556], - "103": [0.19444, 0.44444, 0.01389, 0, 0.5], - "104": [0, 0.69444, 0, 0, 0.51667], - "105": [0, 0.67937, 0, 0, 0.23889], - "106": [0.19444, 0.67937, 0, 0, 0.26667], - "107": [0, 0.69444, 0, 0, 0.48889], - "108": [0, 0.69444, 0, 0, 0.23889], - "109": [0, 0.44444, 0, 0, 0.79445], - "110": [0, 0.44444, 0, 0, 0.51667], - "111": [0, 0.44444, 0, 0, 0.5], - "112": [0.19444, 0.44444, 0, 0, 0.51667], - "113": [0.19444, 0.44444, 0, 0, 0.51667], - "114": [0, 0.44444, 0.01389, 0, 0.34167], - "115": [0, 0.44444, 0, 0, 0.38333], - "116": [0, 0.57143, 0, 0, 0.36111], - "117": [0, 0.44444, 0, 0, 0.51667], - "118": [0, 0.44444, 0.01389, 0, 0.46111], - "119": [0, 0.44444, 0.01389, 0, 0.68334], - "120": [0, 0.44444, 0, 0, 0.46111], - "121": [0.19444, 0.44444, 0.01389, 0, 0.46111], - "122": [0, 0.44444, 0, 0, 0.43472], - "126": [0.35, 0.32659, 0, 0, 0.5], - "176": [0, 0.69444, 0, 0, 0.66667], - "305": [0, 0.44444, 0, 0, 0.23889], - "567": [0.19444, 0.44444, 0, 0, 0.26667], - "710": [0, 0.69444, 0, 0, 0.5], - "711": [0, 0.63194, 0, 0, 0.5], - "713": [0, 0.60889, 0, 0, 0.5], - "714": [0, 0.69444, 0, 0, 0.5], - "728": [0, 0.69444, 0, 0, 0.5], - "729": [0, 0.67937, 0, 0, 0.27778], - "730": [0, 0.69444, 0, 0, 0.66667], - "733": [0, 0.69444, 0, 0, 0.5], - "771": [0, 0.67659, 0, 0, 0.5], - "776": [0, 0.67937, 0, 0, 0.5], - "915": [0, 0.69444, 0, 0, 0.54167], - "916": [0, 0.69444, 0, 0, 0.83334], - "920": [0, 0.69444, 0, 0, 0.77778], - "923": [0, 0.69444, 0, 0, 0.61111], - "926": [0, 0.69444, 0, 0, 0.66667], - "928": [0, 0.69444, 0, 0, 0.70834], - "931": [0, 0.69444, 0, 0, 0.72222], - "933": [0, 0.69444, 0, 0, 0.77778], - "934": [0, 0.69444, 0, 0, 0.72222], - "936": [0, 0.69444, 0, 0, 0.77778], - "937": [0, 0.69444, 0, 0, 0.72222], - "8211": [0, 0.44444, 0.02778, 0, 0.5], - "8212": [0, 0.44444, 0.02778, 0, 1.0], - "8216": [0, 0.69444, 0, 0, 0.27778], - "8217": [0, 0.69444, 0, 0, 0.27778], - "8220": [0, 0.69444, 0, 0, 0.5], - "8221": [0, 0.69444, 0, 0, 0.5] - }, - "Script-Regular": { - "65": [0, 0.7, 0.22925, 0, 0.80253], - "66": [0, 0.7, 0.04087, 0, 0.90757], - "67": [0, 0.7, 0.1689, 0, 0.66619], - "68": [0, 0.7, 0.09371, 0, 0.77443], - "69": [0, 0.7, 0.18583, 0, 0.56162], - "70": [0, 0.7, 0.13634, 0, 0.89544], - "71": [0, 0.7, 0.17322, 0, 0.60961], - "72": [0, 0.7, 0.29694, 0, 0.96919], - "73": [0, 0.7, 0.19189, 0, 0.80907], - "74": [0.27778, 0.7, 0.19189, 0, 1.05159], - "75": [0, 0.7, 0.31259, 0, 0.91364], - "76": [0, 0.7, 0.19189, 0, 0.87373], - "77": [0, 0.7, 0.15981, 0, 1.08031], - "78": [0, 0.7, 0.3525, 0, 0.9015], - "79": [0, 0.7, 0.08078, 0, 0.73787], - "80": [0, 0.7, 0.08078, 0, 1.01262], - "81": [0, 0.7, 0.03305, 0, 0.88282], - "82": [0, 0.7, 0.06259, 0, 0.85], - "83": [0, 0.7, 0.19189, 0, 0.86767], - "84": [0, 0.7, 0.29087, 0, 0.74697], - "85": [0, 0.7, 0.25815, 0, 0.79996], - "86": [0, 0.7, 0.27523, 0, 0.62204], - "87": [0, 0.7, 0.27523, 0, 0.80532], - "88": [0, 0.7, 0.26006, 0, 0.94445], - "89": [0, 0.7, 0.2939, 0, 0.70961], - "90": [0, 0.7, 0.24037, 0, 0.8212] - }, - "Size1-Regular": { - "40": [0.35001, 0.85, 0, 0, 0.45834], - "41": [0.35001, 0.85, 0, 0, 0.45834], - "47": [0.35001, 0.85, 0, 0, 0.57778], - "91": [0.35001, 0.85, 0, 0, 0.41667], - "92": [0.35001, 0.85, 0, 0, 0.57778], - "93": [0.35001, 0.85, 0, 0, 0.41667], - "123": [0.35001, 0.85, 0, 0, 0.58334], - "125": [0.35001, 0.85, 0, 0, 0.58334], - "710": [0, 0.72222, 0, 0, 0.55556], - "732": [0, 0.72222, 0, 0, 0.55556], - "770": [0, 0.72222, 0, 0, 0.55556], - "771": [0, 0.72222, 0, 0, 0.55556], - "8214": [-0.00099, 0.601, 0, 0, 0.77778], - "8593": [1e-05, 0.6, 0, 0, 0.66667], - "8595": [1e-05, 0.6, 0, 0, 0.66667], - "8657": [1e-05, 0.6, 0, 0, 0.77778], - "8659": [1e-05, 0.6, 0, 0, 0.77778], - "8719": [0.25001, 0.75, 0, 0, 0.94445], - "8720": [0.25001, 0.75, 0, 0, 0.94445], - "8721": [0.25001, 0.75, 0, 0, 1.05556], - "8730": [0.35001, 0.85, 0, 0, 1.0], - "8739": [-0.00599, 0.606, 0, 0, 0.33333], - "8741": [-0.00599, 0.606, 0, 0, 0.55556], - "8747": [0.30612, 0.805, 0.19445, 0, 0.47222], - "8748": [0.306, 0.805, 0.19445, 0, 0.47222], - "8749": [0.306, 0.805, 0.19445, 0, 0.47222], - "8750": [0.30612, 0.805, 0.19445, 0, 0.47222], - "8896": [0.25001, 0.75, 0, 0, 0.83334], - "8897": [0.25001, 0.75, 0, 0, 0.83334], - "8898": [0.25001, 0.75, 0, 0, 0.83334], - "8899": [0.25001, 0.75, 0, 0, 0.83334], - "8968": [0.35001, 0.85, 0, 0, 0.47222], - "8969": [0.35001, 0.85, 0, 0, 0.47222], - "8970": [0.35001, 0.85, 0, 0, 0.47222], - "8971": [0.35001, 0.85, 0, 0, 0.47222], - "9168": [-0.00099, 0.601, 0, 0, 0.66667], - "10216": [0.35001, 0.85, 0, 0, 0.47222], - "10217": [0.35001, 0.85, 0, 0, 0.47222], - "10752": [0.25001, 0.75, 0, 0, 1.11111], - "10753": [0.25001, 0.75, 0, 0, 1.11111], - "10754": [0.25001, 0.75, 0, 0, 1.11111], - "10756": [0.25001, 0.75, 0, 0, 0.83334], - "10758": [0.25001, 0.75, 0, 0, 0.83334] - }, - "Size2-Regular": { - "40": [0.65002, 1.15, 0, 0, 0.59722], - "41": [0.65002, 1.15, 0, 0, 0.59722], - "47": [0.65002, 1.15, 0, 0, 0.81111], - "91": [0.65002, 1.15, 0, 0, 0.47222], - "92": [0.65002, 1.15, 0, 0, 0.81111], - "93": [0.65002, 1.15, 0, 0, 0.47222], - "123": [0.65002, 1.15, 0, 0, 0.66667], - "125": [0.65002, 1.15, 0, 0, 0.66667], - "710": [0, 0.75, 0, 0, 1.0], - "732": [0, 0.75, 0, 0, 1.0], - "770": [0, 0.75, 0, 0, 1.0], - "771": [0, 0.75, 0, 0, 1.0], - "8719": [0.55001, 1.05, 0, 0, 1.27778], - "8720": [0.55001, 1.05, 0, 0, 1.27778], - "8721": [0.55001, 1.05, 0, 0, 1.44445], - "8730": [0.65002, 1.15, 0, 0, 1.0], - "8747": [0.86225, 1.36, 0.44445, 0, 0.55556], - "8748": [0.862, 1.36, 0.44445, 0, 0.55556], - "8749": [0.862, 1.36, 0.44445, 0, 0.55556], - "8750": [0.86225, 1.36, 0.44445, 0, 0.55556], - "8896": [0.55001, 1.05, 0, 0, 1.11111], - "8897": [0.55001, 1.05, 0, 0, 1.11111], - "8898": [0.55001, 1.05, 0, 0, 1.11111], - "8899": [0.55001, 1.05, 0, 0, 1.11111], - "8968": [0.65002, 1.15, 0, 0, 0.52778], - "8969": [0.65002, 1.15, 0, 0, 0.52778], - "8970": [0.65002, 1.15, 0, 0, 0.52778], - "8971": [0.65002, 1.15, 0, 0, 0.52778], - "10216": [0.65002, 1.15, 0, 0, 0.61111], - "10217": [0.65002, 1.15, 0, 0, 0.61111], - "10752": [0.55001, 1.05, 0, 0, 1.51112], - "10753": [0.55001, 1.05, 0, 0, 1.51112], - "10754": [0.55001, 1.05, 0, 0, 1.51112], - "10756": [0.55001, 1.05, 0, 0, 1.11111], - "10758": [0.55001, 1.05, 0, 0, 1.11111] - }, - "Size3-Regular": { - "40": [0.95003, 1.45, 0, 0, 0.73611], - "41": [0.95003, 1.45, 0, 0, 0.73611], - "47": [0.95003, 1.45, 0, 0, 1.04445], - "91": [0.95003, 1.45, 0, 0, 0.52778], - "92": [0.95003, 1.45, 0, 0, 1.04445], - "93": [0.95003, 1.45, 0, 0, 0.52778], - "123": [0.95003, 1.45, 0, 0, 0.75], - "125": [0.95003, 1.45, 0, 0, 0.75], - "710": [0, 0.75, 0, 0, 1.44445], - "732": [0, 0.75, 0, 0, 1.44445], - "770": [0, 0.75, 0, 0, 1.44445], - "771": [0, 0.75, 0, 0, 1.44445], - "8730": [0.95003, 1.45, 0, 0, 1.0], - "8968": [0.95003, 1.45, 0, 0, 0.58334], - "8969": [0.95003, 1.45, 0, 0, 0.58334], - "8970": [0.95003, 1.45, 0, 0, 0.58334], - "8971": [0.95003, 1.45, 0, 0, 0.58334], - "10216": [0.95003, 1.45, 0, 0, 0.75], - "10217": [0.95003, 1.45, 0, 0, 0.75] - }, - "Size4-Regular": { - "40": [1.25003, 1.75, 0, 0, 0.79167], - "41": [1.25003, 1.75, 0, 0, 0.79167], - "47": [1.25003, 1.75, 0, 0, 1.27778], - "91": [1.25003, 1.75, 0, 0, 0.58334], - "92": [1.25003, 1.75, 0, 0, 1.27778], - "93": [1.25003, 1.75, 0, 0, 0.58334], - "123": [1.25003, 1.75, 0, 0, 0.80556], - "125": [1.25003, 1.75, 0, 0, 0.80556], - "710": [0, 0.825, 0, 0, 1.8889], - "732": [0, 0.825, 0, 0, 1.8889], - "770": [0, 0.825, 0, 0, 1.8889], - "771": [0, 0.825, 0, 0, 1.8889], - "8730": [1.25003, 1.75, 0, 0, 1.0], - "8968": [1.25003, 1.75, 0, 0, 0.63889], - "8969": [1.25003, 1.75, 0, 0, 0.63889], - "8970": [1.25003, 1.75, 0, 0, 0.63889], - "8971": [1.25003, 1.75, 0, 0, 0.63889], - "9115": [0.64502, 1.155, 0, 0, 0.875], - "9116": [1e-05, 0.6, 0, 0, 0.875], - "9117": [0.64502, 1.155, 0, 0, 0.875], - "9118": [0.64502, 1.155, 0, 0, 0.875], - "9119": [1e-05, 0.6, 0, 0, 0.875], - "9120": [0.64502, 1.155, 0, 0, 0.875], - "9121": [0.64502, 1.155, 0, 0, 0.66667], - "9122": [-0.00099, 0.601, 0, 0, 0.66667], - "9123": [0.64502, 1.155, 0, 0, 0.66667], - "9124": [0.64502, 1.155, 0, 0, 0.66667], - "9125": [-0.00099, 0.601, 0, 0, 0.66667], - "9126": [0.64502, 1.155, 0, 0, 0.66667], - "9127": [1e-05, 0.9, 0, 0, 0.88889], - "9128": [0.65002, 1.15, 0, 0, 0.88889], - "9129": [0.90001, 0, 0, 0, 0.88889], - "9130": [0, 0.3, 0, 0, 0.88889], - "9131": [1e-05, 0.9, 0, 0, 0.88889], - "9132": [0.65002, 1.15, 0, 0, 0.88889], - "9133": [0.90001, 0, 0, 0, 0.88889], - "9143": [0.88502, 0.915, 0, 0, 1.05556], - "10216": [1.25003, 1.75, 0, 0, 0.80556], - "10217": [1.25003, 1.75, 0, 0, 0.80556], - "57344": [-0.00499, 0.605, 0, 0, 1.05556], - "57345": [-0.00499, 0.605, 0, 0, 1.05556], - "57680": [0, 0.12, 0, 0, 0.45], - "57681": [0, 0.12, 0, 0, 0.45], - "57682": [0, 0.12, 0, 0, 0.45], - "57683": [0, 0.12, 0, 0, 0.45] - }, - "Typewriter-Regular": { - "33": [0, 0.61111, 0, 0, 0.525], - "34": [0, 0.61111, 0, 0, 0.525], - "35": [0, 0.61111, 0, 0, 0.525], - "36": [0.08333, 0.69444, 0, 0, 0.525], - "37": [0.08333, 0.69444, 0, 0, 0.525], - "38": [0, 0.61111, 0, 0, 0.525], - "39": [0, 0.61111, 0, 0, 0.525], - "40": [0.08333, 0.69444, 0, 0, 0.525], - "41": [0.08333, 0.69444, 0, 0, 0.525], - "42": [0, 0.52083, 0, 0, 0.525], - "43": [-0.08056, 0.53055, 0, 0, 0.525], - "44": [0.13889, 0.125, 0, 0, 0.525], - "45": [-0.08056, 0.53055, 0, 0, 0.525], - "46": [0, 0.125, 0, 0, 0.525], - "47": [0.08333, 0.69444, 0, 0, 0.525], - "48": [0, 0.61111, 0, 0, 0.525], - "49": [0, 0.61111, 0, 0, 0.525], - "50": [0, 0.61111, 0, 0, 0.525], - "51": [0, 0.61111, 0, 0, 0.525], - "52": [0, 0.61111, 0, 0, 0.525], - "53": [0, 0.61111, 0, 0, 0.525], - "54": [0, 0.61111, 0, 0, 0.525], - "55": [0, 0.61111, 0, 0, 0.525], - "56": [0, 0.61111, 0, 0, 0.525], - "57": [0, 0.61111, 0, 0, 0.525], - "58": [0, 0.43056, 0, 0, 0.525], - "59": [0.13889, 0.43056, 0, 0, 0.525], - "60": [-0.05556, 0.55556, 0, 0, 0.525], - "61": [-0.19549, 0.41562, 0, 0, 0.525], - "62": [-0.05556, 0.55556, 0, 0, 0.525], - "63": [0, 0.61111, 0, 0, 0.525], - "64": [0, 0.61111, 0, 0, 0.525], - "65": [0, 0.61111, 0, 0, 0.525], - "66": [0, 0.61111, 0, 0, 0.525], - "67": [0, 0.61111, 0, 0, 0.525], - "68": [0, 0.61111, 0, 0, 0.525], - "69": [0, 0.61111, 0, 0, 0.525], - "70": [0, 0.61111, 0, 0, 0.525], - "71": [0, 0.61111, 0, 0, 0.525], - "72": [0, 0.61111, 0, 0, 0.525], - "73": [0, 0.61111, 0, 0, 0.525], - "74": [0, 0.61111, 0, 0, 0.525], - "75": [0, 0.61111, 0, 0, 0.525], - "76": [0, 0.61111, 0, 0, 0.525], - "77": [0, 0.61111, 0, 0, 0.525], - "78": [0, 0.61111, 0, 0, 0.525], - "79": [0, 0.61111, 0, 0, 0.525], - "80": [0, 0.61111, 0, 0, 0.525], - "81": [0.13889, 0.61111, 0, 0, 0.525], - "82": [0, 0.61111, 0, 0, 0.525], - "83": [0, 0.61111, 0, 0, 0.525], - "84": [0, 0.61111, 0, 0, 0.525], - "85": [0, 0.61111, 0, 0, 0.525], - "86": [0, 0.61111, 0, 0, 0.525], - "87": [0, 0.61111, 0, 0, 0.525], - "88": [0, 0.61111, 0, 0, 0.525], - "89": [0, 0.61111, 0, 0, 0.525], - "90": [0, 0.61111, 0, 0, 0.525], - "91": [0.08333, 0.69444, 0, 0, 0.525], - "92": [0.08333, 0.69444, 0, 0, 0.525], - "93": [0.08333, 0.69444, 0, 0, 0.525], - "94": [0, 0.61111, 0, 0, 0.525], - "95": [0.09514, 0, 0, 0, 0.525], - "96": [0, 0.61111, 0, 0, 0.525], - "97": [0, 0.43056, 0, 0, 0.525], - "98": [0, 0.61111, 0, 0, 0.525], - "99": [0, 0.43056, 0, 0, 0.525], - "100": [0, 0.61111, 0, 0, 0.525], - "101": [0, 0.43056, 0, 0, 0.525], - "102": [0, 0.61111, 0, 0, 0.525], - "103": [0.22222, 0.43056, 0, 0, 0.525], - "104": [0, 0.61111, 0, 0, 0.525], - "105": [0, 0.61111, 0, 0, 0.525], - "106": [0.22222, 0.61111, 0, 0, 0.525], - "107": [0, 0.61111, 0, 0, 0.525], - "108": [0, 0.61111, 0, 0, 0.525], - "109": [0, 0.43056, 0, 0, 0.525], - "110": [0, 0.43056, 0, 0, 0.525], - "111": [0, 0.43056, 0, 0, 0.525], - "112": [0.22222, 0.43056, 0, 0, 0.525], - "113": [0.22222, 0.43056, 0, 0, 0.525], - "114": [0, 0.43056, 0, 0, 0.525], - "115": [0, 0.43056, 0, 0, 0.525], - "116": [0, 0.55358, 0, 0, 0.525], - "117": [0, 0.43056, 0, 0, 0.525], - "118": [0, 0.43056, 0, 0, 0.525], - "119": [0, 0.43056, 0, 0, 0.525], - "120": [0, 0.43056, 0, 0, 0.525], - "121": [0.22222, 0.43056, 0, 0, 0.525], - "122": [0, 0.43056, 0, 0, 0.525], - "123": [0.08333, 0.69444, 0, 0, 0.525], - "124": [0.08333, 0.69444, 0, 0, 0.525], - "125": [0.08333, 0.69444, 0, 0, 0.525], - "126": [0, 0.61111, 0, 0, 0.525], - "127": [0, 0.61111, 0, 0, 0.525], - "176": [0, 0.61111, 0, 0, 0.525], - "305": [0, 0.43056, 0, 0, 0.525], - "567": [0.22222, 0.43056, 0, 0, 0.525], - "711": [0, 0.56597, 0, 0, 0.525], - "713": [0, 0.56555, 0, 0, 0.525], - "714": [0, 0.61111, 0, 0, 0.525], - "715": [0, 0.61111, 0, 0, 0.525], - "728": [0, 0.61111, 0, 0, 0.525], - "730": [0, 0.61111, 0, 0, 0.525], - "770": [0, 0.61111, 0, 0, 0.525], - "771": [0, 0.61111, 0, 0, 0.525], - "776": [0, 0.61111, 0, 0, 0.525], - "915": [0, 0.61111, 0, 0, 0.525], - "916": [0, 0.61111, 0, 0, 0.525], - "920": [0, 0.61111, 0, 0, 0.525], - "923": [0, 0.61111, 0, 0, 0.525], - "926": [0, 0.61111, 0, 0, 0.525], - "928": [0, 0.61111, 0, 0, 0.525], - "931": [0, 0.61111, 0, 0, 0.525], - "933": [0, 0.61111, 0, 0, 0.525], - "934": [0, 0.61111, 0, 0, 0.525], - "936": [0, 0.61111, 0, 0, 0.525], - "937": [0, 0.61111, 0, 0, 0.525], - "8216": [0, 0.61111, 0, 0, 0.525], - "8217": [0, 0.61111, 0, 0, 0.525], - "8242": [0, 0.61111, 0, 0, 0.525], - "9251": [0.11111, 0.21944, 0, 0, 0.525] - } -}); - -/***/ }), -/* 60 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony export (immutable) */ __webpack_exports__["a"] = sizingGroup; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__defineFunction__ = __webpack_require__(3); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__mathMLTree__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__utils__ = __webpack_require__(5); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__buildHTML__ = __webpack_require__(4); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__buildMathML__ = __webpack_require__(2); - - - - - - - - -function sizingGroup(value, options, baseOptions) { - var inner = __WEBPACK_IMPORTED_MODULE_4__buildHTML__["a" /* buildExpression */](value, options, false); - var multiplier = options.sizeMultiplier / baseOptions.sizeMultiplier; - - // Add size-resetting classes to the inner list and set maxFontSize - // manually. Handle nested size changes. - for (var i = 0; i < inner.length; i++) { - var pos = __WEBPACK_IMPORTED_MODULE_3__utils__["a" /* default */].indexOf(inner[i].classes, "sizing"); - if (pos < 0) { - Array.prototype.push.apply(inner[i].classes, options.sizingClasses(baseOptions)); - } else if (inner[i].classes[pos + 1] === "reset-size" + options.size) { - // This is a nested size change: e.g., inner[i] is the "b" in - // `\Huge a \small b`. Override the old size (the `reset-` class) - // but not the new size. - inner[i].classes[pos + 1] = "reset-size" + baseOptions.size; - } - - inner[i].height *= multiplier; - inner[i].depth *= multiplier; - } - - return __WEBPACK_IMPORTED_MODULE_0__buildCommon__["a" /* default */].makeFragment(inner); -} - -var sizeFuncs = ["\\tiny", "\\sixptsize", "\\scriptsize", "\\footnotesize", "\\small", "\\normalsize", "\\large", "\\Large", "\\LARGE", "\\huge", "\\Huge"]; - -Object(__WEBPACK_IMPORTED_MODULE_1__defineFunction__["b" /* default */])({ - type: "sizing", - names: sizeFuncs, - props: { - numArgs: 0, - allowedInText: true - }, - handler: function handler(context, args) { - var breakOnTokenText = context.breakOnTokenText, - funcName = context.funcName, - parser = context.parser; - - - parser.consumeSpaces(); - var body = parser.parseExpression(false, breakOnTokenText); - - return { - type: "sizing", - // Figure out what size to use based on the list of functions above - size: __WEBPACK_IMPORTED_MODULE_3__utils__["a" /* default */].indexOf(sizeFuncs, funcName) + 1, - value: body - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - // Handle sizing operators like \Huge. Real TeX doesn't actually allow - // these functions inside of math expressions, so we do some special - // handling. - var newOptions = options.havingSize(group.value.size); - return sizingGroup(group.value.value, newOptions, options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var newOptions = options.havingSize(group.value.size); - var inner = __WEBPACK_IMPORTED_MODULE_5__buildMathML__["a" /* buildExpression */](group.value.value, newOptions); - - var node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mstyle", inner); - - // TODO(emily): This doesn't produce the correct size for nested size - // changes, because we don't keep state of what style we're currently - // in, so we can't reset the size to normal before changing it. Now - // that we're passing an options parameter we should be able to fix - // this. - node.setAttribute("mathsize", newOptions.sizeMultiplier + "em"); - - return node; - } -}); - -/***/ }), -/* 61 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return _environments; }); -/* harmony export (immutable) */ __webpack_exports__["b"] = defineEnvironment; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__buildHTML__ = __webpack_require__(4); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__buildMathML__ = __webpack_require__(2); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Options__ = __webpack_require__(43); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__ParseNode__ = __webpack_require__(14); - - - - - - -/** - * The context contains the following properties: - * - mode: current parsing mode. - * - envName: the name of the environment, one of the listed names. - * - parser: the parser object. - */ - - -/** - * - context: information and references provided by the parser - * - args: an array of arguments passed to \begin{name} - * - optArgs: an array of optional arguments passed to \begin{name} - */ - - -/** - * - numArgs: (default 0) The number of arguments after the \begin{name} function. - * - argTypes: (optional) Just like for a function - * - allowedInText: (default false) Whether or not the environment is allowed - * inside text mode (not enforced yet). - * - numOptionalArgs: (default 0) Just like for a function - */ - - -/** - * Final enviornment spec for use at parse time. - * This is almost identical to `EnvDefSpec`, except it - * 1. includes the function handler - * 2. requires all arguments except argType - * It is generated by `defineEnvironment()` below. - */ - - -/** - * All registered environments. - * `environments.js` exports this same dictionary again and makes it public. - * `Parser.js` requires this dictionary via `environments.js`. - */ -var _environments = {}; - -function defineEnvironment(_ref) { - var type = _ref.type, - names = _ref.names, - props = _ref.props, - handler = _ref.handler, - htmlBuilder = _ref.htmlBuilder, - mathmlBuilder = _ref.mathmlBuilder; - - // Set default values of environments - var data = { - numArgs: props.numArgs || 0, - greediness: 1, - allowedInText: false, - numOptionalArgs: 0, - handler: handler - }; - for (var i = 0; i < names.length; ++i) { - _environments[names[i]] = data; - } - if (htmlBuilder) { - __WEBPACK_IMPORTED_MODULE_0__buildHTML__["d" /* groupTypes */][type] = htmlBuilder; - } - if (mathmlBuilder) { - __WEBPACK_IMPORTED_MODULE_1__buildMathML__["d" /* groupTypes */][type] = mathmlBuilder; - } -} - -/***/ }), -/* 62 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return combiningDiacriticalMarksEndRegex; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return controlWordRegex; }); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck__ = __webpack_require__(7); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_createClass__ = __webpack_require__(10); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_createClass___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_createClass__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_match_at__ = __webpack_require__(145); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_match_at___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_match_at__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__ParseError__ = __webpack_require__(6); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__SourceLocation__ = __webpack_require__(31); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__Token__ = __webpack_require__(27); - - - -/** - * The Lexer class handles tokenizing the input in various ways. Since our - * parser expects us to be able to backtrack, the lexer allows lexing from any - * given starting point. - * - * Its main exposed function is the `lex` function, which takes a position to - * lex from and a type of token to lex. It defers to the appropriate `_innerLex` - * function. - * - * The various `_innerLex` functions perform the actual lexing of different - * kinds. - */ - - - - - - -/* The following tokenRegex - * - matches typical whitespace (but not NBSP etc.) using its first group - * - matches comments (must have trailing newlines) - * - does not match any control character \x00-\x1f except whitespace - * - does not match a bare backslash - * - matches any ASCII character except those just mentioned - * - does not match the BMP private use area \uE000-\uF8FF - * - does not match bare surrogate code units - * - matches any BMP character except for those just described - * - matches any valid Unicode surrogate pair - * - matches a backslash followed by one or more letters - * - matches a backslash followed by any BMP character, including newline - * Just because the Lexer matches something doesn't mean it's valid input: - * If there is no matching function or symbol definition, the Parser will - * still reject the input. - */ -var commentRegexString = "%[^\n]*[\n]"; -var controlWordRegexString = "\\\\[a-zA-Z@]+"; -var controlSymbolRegexString = "\\\\[^\uD800-\uDFFF]"; -var combiningDiacriticalMarkString = "[\u0300-\u036F]"; -var combiningDiacriticalMarksEndRegex = new RegExp(combiningDiacriticalMarkString + "+$"); -var tokenRegex = new RegExp("([ \r\n\t]+)|" + ( // whitespace -"(" + commentRegexString) + // comments -"|[!-\\[\\]-\u2027\u202A-\uD7FF\uF900-\uFFFF]" + ( // single codepoint -combiningDiacriticalMarkString + "*") + // ...plus accents -"|[\uD800-\uDBFF][\uDC00-\uDFFF]" + ( // surrogate pair -combiningDiacriticalMarkString + "*") + // ...plus accents -"|\\\\verb\\*([^]).*?\\3" + // \verb* -"|\\\\verb([^*a-zA-Z]).*?\\4" + ( // \verb unstarred -"|" + controlWordRegexString) + ( // \macroName -"|" + controlSymbolRegexString) + // \\, \', etc. -")"); - -// tokenRegex has no ^ marker, as required by matchAt. -// These regexs are for matching results from tokenRegex, -// so they do have ^ markers. -var controlWordRegex = new RegExp("^" + controlWordRegexString); -var commentRegex = new RegExp("^" + commentRegexString); - -/** Main Lexer class */ - -var Lexer = function () { - function Lexer(input) { - __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck___default()(this, Lexer); - - // Separate accents from characters - this.input = input; - this.pos = 0; - } - - /** - * This function lexes a single token. - */ - - - __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_createClass___default()(Lexer, [{ - key: "lex", - value: function lex() { - var input = this.input; - var pos = this.pos; - if (pos === input.length) { - return new __WEBPACK_IMPORTED_MODULE_5__Token__["a" /* Token */]("EOF", new __WEBPACK_IMPORTED_MODULE_4__SourceLocation__["a" /* default */](this, pos, pos)); - } - var match = __WEBPACK_IMPORTED_MODULE_2_match_at___default()(tokenRegex, input, pos); - if (match === null) { - throw new __WEBPACK_IMPORTED_MODULE_3__ParseError__["a" /* default */]("Unexpected character: '" + input[pos] + "'", new __WEBPACK_IMPORTED_MODULE_5__Token__["a" /* Token */](input[pos], new __WEBPACK_IMPORTED_MODULE_4__SourceLocation__["a" /* default */](this, pos, pos + 1))); - } - var text = match[2] || " "; - var start = this.pos; - this.pos += match[0].length; - var end = this.pos; - - if (commentRegex.test(text)) { - return this.lex(); - } else { - return new __WEBPACK_IMPORTED_MODULE_5__Token__["a" /* Token */](text, new __WEBPACK_IMPORTED_MODULE_4__SourceLocation__["a" /* default */](this, start, end)); - } - } - }]); - - return Lexer; -}(); - -/* harmony default export */ __webpack_exports__["c"] = (Lexer); - -/***/ }), -/* 63 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__src_katex_less__ = __webpack_require__(64); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__src_katex_less___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__src_katex_less__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__katex_js__ = __webpack_require__(65); -/** - * This is the webpack entry point for KaTeX. As flow[1] and jest[2] doesn't support - * CSS modules natively, a separate entry point is used and it is not flowtyped. - * - * [1] https://gist.github.com/lambdahands/d19e0da96285b749f0ef - * [2] https://facebook.github.io/jest/docs/en/webpack.html - */ - - - -/* harmony default export */ __webpack_exports__["default"] = (__WEBPACK_IMPORTED_MODULE_1__katex_js__["a" /* default */]); - -/***/ }), -/* 64 */ -/***/ (function(module, exports) { - -// removed by extract-text-webpack-plugin - -/***/ }), -/* 65 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__src_ParseError__ = __webpack_require__(6); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__src_Settings__ = __webpack_require__(34); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__src_buildTree__ = __webpack_require__(76); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__src_parseTree__ = __webpack_require__(113); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__src_utils__ = __webpack_require__(5); - -/* eslint no-console:0 */ -/** - * This is the main entry point for KaTeX. Here, we expose functions for - * rendering expressions either to DOM nodes or to markup strings. - * - * We also expose the ParseError class to check if errors thrown from KaTeX are - * errors in the expression, or errors in javascript handling. - */ - - - - - - - - -/** - * Parse and build an expression, and place that expression in the DOM node - * given. - */ -var render = function render(expression, baseNode, options) { - __WEBPACK_IMPORTED_MODULE_4__src_utils__["a" /* default */].clearNode(baseNode); - var node = renderToDomTree(expression, options).toNode(); - baseNode.appendChild(node); -}; - -// KaTeX's styles don't work properly in quirks mode. Print out an error, and -// disable rendering. -if (typeof document !== "undefined") { - if (document.compatMode !== "CSS1Compat") { - typeof console !== "undefined" && console.warn("Warning: KaTeX doesn't work in quirks mode. Make sure your " + "website has a suitable doctype."); - - render = function render() { - throw new __WEBPACK_IMPORTED_MODULE_0__src_ParseError__["a" /* default */]("KaTeX doesn't work in quirks mode."); - }; - } -} - -/** - * Parse and build an expression, and return the markup for that. - */ -var renderToString = function renderToString(expression, options) { - var markup = renderToDomTree(expression, options).toMarkup(); - return markup; -}; - -/** - * Parse an expression and return the parse tree. - */ -var generateParseTree = function generateParseTree(expression, options) { - var settings = new __WEBPACK_IMPORTED_MODULE_1__src_Settings__["a" /* default */](options); - return Object(__WEBPACK_IMPORTED_MODULE_3__src_parseTree__["a" /* default */])(expression, settings); -}; - -/** - * Generates and returns the katex build tree. This is used for advanced - * use cases (like rendering to custom output). - */ -var renderToDomTree = function renderToDomTree(expression, options) { - var settings = new __WEBPACK_IMPORTED_MODULE_1__src_Settings__["a" /* default */](options); - var tree = Object(__WEBPACK_IMPORTED_MODULE_3__src_parseTree__["a" /* default */])(expression, settings); - return Object(__WEBPACK_IMPORTED_MODULE_2__src_buildTree__["b" /* buildTree */])(tree, expression, settings); -}; - -/** - * Generates and returns the katex build tree, with just HTML (no MathML). - * This is used for advanced use cases (like rendering to custom output). - */ -var renderToHTMLTree = function renderToHTMLTree(expression, options) { - var settings = new __WEBPACK_IMPORTED_MODULE_1__src_Settings__["a" /* default */](options); - var tree = Object(__WEBPACK_IMPORTED_MODULE_3__src_parseTree__["a" /* default */])(expression, settings); - return Object(__WEBPACK_IMPORTED_MODULE_2__src_buildTree__["a" /* buildHTMLTree */])(tree, expression, settings); -}; - -/* harmony default export */ __webpack_exports__["a"] = ({ - /** - * Renders the given LaTeX into an HTML+MathML combination, and adds - * it as a child to the specified DOM node. - */ - render: render, - /** - * Renders the given LaTeX into an HTML+MathML combination string, - * for sending to the client. - */ - renderToString: renderToString, - /** - * KaTeX error, usually during parsing. - */ - ParseError: __WEBPACK_IMPORTED_MODULE_0__src_ParseError__["a" /* default */], - /** - * Parses the given LaTeX into KaTeX's internal parse tree structure, - * without rendering to HTML or MathML. - * - * NOTE: This method is not currently recommended for public use. - * The internal tree representation is unstable and is very likely - * to change. Use at your own risk. - */ - __parse: generateParseTree, - /** - * Renders the given LaTeX into an HTML+MathML internal DOM tree - * representation, without flattening that representation to a string. - * - * NOTE: This method is not currently recommended for public use. - * The internal tree representation is unstable and is very likely - * to change. Use at your own risk. - */ - __renderToDomTree: renderToDomTree, - /** - * Renders the given LaTeX into an HTML internal DOM tree representation, - * without MathML and without flattening that representation to a string. - * - * NOTE: This method is not currently recommended for public use. - * The internal tree representation is unstable and is very likely - * to change. Use at your own risk. - */ - __renderToHTMLTree: renderToHTMLTree -}); - -/***/ }), -/* 66 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = { "default": __webpack_require__(67), __esModule: true }; - -/***/ }), -/* 67 */ -/***/ (function(module, exports, __webpack_require__) { - -__webpack_require__(68); -module.exports = __webpack_require__(8).Object.freeze; - -/***/ }), -/* 68 */ -/***/ (function(module, exports, __webpack_require__) { - -// 19.1.2.5 Object.freeze(O) -var isObject = __webpack_require__(20) - , meta = __webpack_require__(69).onFreeze; - -__webpack_require__(46)('freeze', function($freeze){ - return function freeze(it){ - return $freeze && isObject(it) ? $freeze(meta(it)) : it; - }; -}); - -/***/ }), -/* 69 */ -/***/ (function(module, exports, __webpack_require__) { - -var META = __webpack_require__(32)('meta') - , isObject = __webpack_require__(20) - , has = __webpack_require__(21) - , setDesc = __webpack_require__(15).f - , id = 0; -var isExtensible = Object.isExtensible || function(){ - return true; -}; -var FREEZE = !__webpack_require__(24)(function(){ - return isExtensible(Object.preventExtensions({})); -}); -var setMeta = function(it){ - setDesc(it, META, {value: { - i: 'O' + ++id, // object ID - w: {} // weak collections IDs - }}); -}; -var fastKey = function(it, create){ - // return primitive with prefix - if(!isObject(it))return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it; - if(!has(it, META)){ - // can't set metadata to uncaught frozen object - if(!isExtensible(it))return 'F'; - // not necessary to add metadata - if(!create)return 'E'; - // add missing metadata - setMeta(it); - // return object ID - } return it[META].i; -}; -var getWeak = function(it, create){ - if(!has(it, META)){ - // can't set metadata to uncaught frozen object - if(!isExtensible(it))return true; - // not necessary to add metadata - if(!create)return false; - // add missing metadata - setMeta(it); - // return hash weak collections IDs - } return it[META].w; -}; -// add metadata on freeze-family methods calling -var onFreeze = function(it){ - if(FREEZE && meta.NEED && isExtensible(it) && !has(it, META))setMeta(it); - return it; -}; -var meta = module.exports = { - KEY: META, - NEED: false, - fastKey: fastKey, - getWeak: getWeak, - onFreeze: onFreeze -}; - -/***/ }), -/* 70 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = !__webpack_require__(23) && !__webpack_require__(24)(function(){ - return Object.defineProperty(__webpack_require__(45)('div'), 'a', {get: function(){ return 7; }}).a != 7; -}); - -/***/ }), -/* 71 */ -/***/ (function(module, exports, __webpack_require__) { - -// 7.1.1 ToPrimitive(input [, PreferredType]) -var isObject = __webpack_require__(20); -// instead of the ES6 spec version, we didn't implement @@toPrimitive case -// and the second argument - flag - preferred type is a string -module.exports = function(it, S){ - if(!isObject(it))return it; - var fn, val; - if(S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val; - if(typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it)))return val; - if(!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val; - throw TypeError("Can't convert object to primitive value"); -}; - -/***/ }), -/* 72 */ -/***/ (function(module, exports) { - -module.exports = function(it){ - if(typeof it != 'function')throw TypeError(it + ' is not a function!'); - return it; -}; - -/***/ }), -/* 73 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = { "default": __webpack_require__(74), __esModule: true }; - -/***/ }), -/* 74 */ -/***/ (function(module, exports, __webpack_require__) { - -__webpack_require__(75); -var $Object = __webpack_require__(8).Object; -module.exports = function defineProperty(it, key, desc){ - return $Object.defineProperty(it, key, desc); -}; - -/***/ }), -/* 75 */ -/***/ (function(module, exports, __webpack_require__) { - -var $export = __webpack_require__(25); -// 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes) -$export($export.S + $export.F * !__webpack_require__(23), 'Object', {defineProperty: __webpack_require__(15).f}); - -/***/ }), -/* 76 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return buildTree; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return buildHTMLTree; }); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__buildHTML__ = __webpack_require__(4); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__buildMathML__ = __webpack_require__(2); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Options__ = __webpack_require__(43); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__Settings__ = __webpack_require__(34); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__Style__ = __webpack_require__(9); - - - - - - - -var optionsFromSettings = function optionsFromSettings(settings) { - return new __WEBPACK_IMPORTED_MODULE_3__Options__["a" /* default */]({ - style: settings.displayMode ? __WEBPACK_IMPORTED_MODULE_5__Style__["a" /* default */].DISPLAY : __WEBPACK_IMPORTED_MODULE_5__Style__["a" /* default */].TEXT, - maxSize: settings.maxSize - }); -}; - -var buildTree = function buildTree(tree, expression, settings) { - var options = optionsFromSettings(settings); - // `buildHTML` sometimes messes with the parse tree (like turning bins -> - // ords), so we build the MathML version first. - var mathMLNode = Object(__WEBPACK_IMPORTED_MODULE_1__buildMathML__["c" /* default */])(tree, expression, options); - var htmlNode = Object(__WEBPACK_IMPORTED_MODULE_0__buildHTML__["c" /* default */])(tree, options); - - var katexNode = __WEBPACK_IMPORTED_MODULE_2__buildCommon__["a" /* default */].makeSpan(["katex"], [mathMLNode, htmlNode]); - - if (settings.displayMode) { - return __WEBPACK_IMPORTED_MODULE_2__buildCommon__["a" /* default */].makeSpan(["katex-display"], [katexNode]); - } else { - return katexNode; - } -}; - -var buildHTMLTree = function buildHTMLTree(tree, expression, settings) { - var options = optionsFromSettings(settings); - var htmlNode = Object(__WEBPACK_IMPORTED_MODULE_0__buildHTML__["c" /* default */])(tree, options); - var katexNode = __WEBPACK_IMPORTED_MODULE_2__buildCommon__["a" /* default */].makeSpan(["katex"], [htmlNode]); - if (settings.displayMode) { - return __WEBPACK_IMPORTED_MODULE_2__buildCommon__["a" /* default */].makeSpan(["katex-display"], [katexNode]); - } else { - return katexNode; - } -}; - -/* unused harmony default export */ var _unused_webpack_default_export = (buildTree); - -/***/ }), -/* 77 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = { "default": __webpack_require__(78), __esModule: true }; - -/***/ }), -/* 78 */ -/***/ (function(module, exports, __webpack_require__) { - -var core = __webpack_require__(8) - , $JSON = core.JSON || (core.JSON = {stringify: JSON.stringify}); -module.exports = function stringify(it){ // eslint-disable-line no-unused-vars - return $JSON.stringify.apply($JSON, arguments); -}; - -/***/ }), -/* 79 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = { "default": __webpack_require__(80), __esModule: true }; - -/***/ }), -/* 80 */ -/***/ (function(module, exports, __webpack_require__) { - -__webpack_require__(36); -__webpack_require__(92); -module.exports = __webpack_require__(8).Array.from; - -/***/ }), -/* 81 */ -/***/ (function(module, exports, __webpack_require__) { - -var toInteger = __webpack_require__(37) - , defined = __webpack_require__(38); -// true -> String#at -// false -> String#codePointAt -module.exports = function(TO_STRING){ - return function(that, pos){ - var s = String(defined(that)) - , i = toInteger(pos) - , l = s.length - , a, b; - if(i < 0 || i >= l)return TO_STRING ? '' : undefined; - a = s.charCodeAt(i); - return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff - ? TO_STRING ? s.charAt(i) : a - : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000; - }; -}; - -/***/ }), -/* 82 */ -/***/ (function(module, exports) { - -module.exports = true; - -/***/ }), -/* 83 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = __webpack_require__(26); - -/***/ }), -/* 84 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var create = __webpack_require__(85) - , descriptor = __webpack_require__(33) - , setToStringTag = __webpack_require__(54) - , IteratorPrototype = {}; - -// 25.1.2.1.1 %IteratorPrototype%[@@iterator]() -__webpack_require__(26)(IteratorPrototype, __webpack_require__(11)('iterator'), function(){ return this; }); - -module.exports = function(Constructor, NAME, next){ - Constructor.prototype = create(IteratorPrototype, {next: descriptor(1, next)}); - setToStringTag(Constructor, NAME + ' Iterator'); -}; - -/***/ }), -/* 85 */ -/***/ (function(module, exports, __webpack_require__) { - -// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties]) -var anObject = __webpack_require__(22) - , dPs = __webpack_require__(86) - , enumBugKeys = __webpack_require__(53) - , IE_PROTO = __webpack_require__(41)('IE_PROTO') - , Empty = function(){ /* empty */ } - , PROTOTYPE = 'prototype'; - -// Create object with fake `null` prototype: use iframe Object with cleared prototype -var createDict = function(){ - // Thrash, waste and sodomy: IE GC bug - var iframe = __webpack_require__(45)('iframe') - , i = enumBugKeys.length - , lt = '<' - , gt = '>' - , iframeDocument; - iframe.style.display = 'none'; - __webpack_require__(90).appendChild(iframe); - iframe.src = 'javascript:'; // eslint-disable-line no-script-url - // createDict = iframe.contentWindow.Object; - // html.removeChild(iframe); - iframeDocument = iframe.contentWindow.document; - iframeDocument.open(); - iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt); - iframeDocument.close(); - createDict = iframeDocument.F; - while(i--)delete createDict[PROTOTYPE][enumBugKeys[i]]; - return createDict(); -}; - -module.exports = Object.create || function create(O, Properties){ - var result; - if(O !== null){ - Empty[PROTOTYPE] = anObject(O); - result = new Empty; - Empty[PROTOTYPE] = null; - // add "__proto__" for Object.getPrototypeOf polyfill - result[IE_PROTO] = O; - } else result = createDict(); - return Properties === undefined ? result : dPs(result, Properties); -}; - - -/***/ }), -/* 86 */ -/***/ (function(module, exports, __webpack_require__) { - -var dP = __webpack_require__(15) - , anObject = __webpack_require__(22) - , getKeys = __webpack_require__(39); - -module.exports = __webpack_require__(23) ? Object.defineProperties : function defineProperties(O, Properties){ - anObject(O); - var keys = getKeys(Properties) - , length = keys.length - , i = 0 - , P; - while(length > i)dP.f(O, P = keys[i++], Properties[P]); - return O; -}; - -/***/ }), -/* 87 */ -/***/ (function(module, exports, __webpack_require__) { - -var has = __webpack_require__(21) - , toIObject = __webpack_require__(40) - , arrayIndexOf = __webpack_require__(88)(false) - , IE_PROTO = __webpack_require__(41)('IE_PROTO'); - -module.exports = function(object, names){ - var O = toIObject(object) - , i = 0 - , result = [] - , key; - for(key in O)if(key != IE_PROTO)has(O, key) && result.push(key); - // Don't enum bug & hidden keys - while(names.length > i)if(has(O, key = names[i++])){ - ~arrayIndexOf(result, key) || result.push(key); - } - return result; -}; - -/***/ }), -/* 88 */ -/***/ (function(module, exports, __webpack_require__) { - -// false -> Array#indexOf -// true -> Array#includes -var toIObject = __webpack_require__(40) - , toLength = __webpack_require__(51) - , toIndex = __webpack_require__(89); -module.exports = function(IS_INCLUDES){ - return function($this, el, fromIndex){ - var O = toIObject($this) - , length = toLength(O.length) - , index = toIndex(fromIndex, length) - , value; - // Array#includes uses SameValueZero equality algorithm - if(IS_INCLUDES && el != el)while(length > index){ - value = O[index++]; - if(value != value)return true; - // Array#toIndex ignores holes, Array#includes - not - } else for(;length > index; index++)if(IS_INCLUDES || index in O){ - if(O[index] === el)return IS_INCLUDES || index || 0; - } return !IS_INCLUDES && -1; - }; -}; - -/***/ }), -/* 89 */ -/***/ (function(module, exports, __webpack_require__) { - -var toInteger = __webpack_require__(37) - , max = Math.max - , min = Math.min; -module.exports = function(index, length){ - index = toInteger(index); - return index < 0 ? max(index + length, 0) : min(index, length); -}; - -/***/ }), -/* 90 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = __webpack_require__(16).document && document.documentElement; - -/***/ }), -/* 91 */ -/***/ (function(module, exports, __webpack_require__) { - -// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O) -var has = __webpack_require__(21) - , toObject = __webpack_require__(29) - , IE_PROTO = __webpack_require__(41)('IE_PROTO') - , ObjectProto = Object.prototype; - -module.exports = Object.getPrototypeOf || function(O){ - O = toObject(O); - if(has(O, IE_PROTO))return O[IE_PROTO]; - if(typeof O.constructor == 'function' && O instanceof O.constructor){ - return O.constructor.prototype; - } return O instanceof Object ? ObjectProto : null; -}; - -/***/ }), -/* 92 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var ctx = __webpack_require__(47) - , $export = __webpack_require__(25) - , toObject = __webpack_require__(29) - , call = __webpack_require__(93) - , isArrayIter = __webpack_require__(94) - , toLength = __webpack_require__(51) - , createProperty = __webpack_require__(95) - , getIterFn = __webpack_require__(55); - -$export($export.S + $export.F * !__webpack_require__(96)(function(iter){ Array.from(iter); }), 'Array', { - // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined) - from: function from(arrayLike/*, mapfn = undefined, thisArg = undefined*/){ - var O = toObject(arrayLike) - , C = typeof this == 'function' ? this : Array - , aLen = arguments.length - , mapfn = aLen > 1 ? arguments[1] : undefined - , mapping = mapfn !== undefined - , index = 0 - , iterFn = getIterFn(O) - , length, result, step, iterator; - if(mapping)mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2); - // if object isn't iterable or it's array with default iterator - use simple case - if(iterFn != undefined && !(C == Array && isArrayIter(iterFn))){ - for(iterator = iterFn.call(O), result = new C; !(step = iterator.next()).done; index++){ - createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value); - } - } else { - length = toLength(O.length); - for(result = new C(length); length > index; index++){ - createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]); - } - } - result.length = index; - return result; - } -}); - - -/***/ }), -/* 93 */ -/***/ (function(module, exports, __webpack_require__) { - -// call something on iterator step with safe closing on error -var anObject = __webpack_require__(22); -module.exports = function(iterator, fn, value, entries){ - try { - return entries ? fn(anObject(value)[0], value[1]) : fn(value); - // 7.4.6 IteratorClose(iterator, completion) - } catch(e){ - var ret = iterator['return']; - if(ret !== undefined)anObject(ret.call(iterator)); - throw e; - } -}; - -/***/ }), -/* 94 */ -/***/ (function(module, exports, __webpack_require__) { - -// check on default Array iterator -var Iterators = __webpack_require__(17) - , ITERATOR = __webpack_require__(11)('iterator') - , ArrayProto = Array.prototype; - -module.exports = function(it){ - return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it); -}; - -/***/ }), -/* 95 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var $defineProperty = __webpack_require__(15) - , createDesc = __webpack_require__(33); - -module.exports = function(object, index, value){ - if(index in object)$defineProperty.f(object, index, createDesc(0, value)); - else object[index] = value; -}; - -/***/ }), -/* 96 */ -/***/ (function(module, exports, __webpack_require__) { - -var ITERATOR = __webpack_require__(11)('iterator') - , SAFE_CLOSING = false; - -try { - var riter = [7][ITERATOR](); - riter['return'] = function(){ SAFE_CLOSING = true; }; - Array.from(riter, function(){ throw 2; }); -} catch(e){ /* empty */ } - -module.exports = function(exec, skipClosing){ - if(!skipClosing && !SAFE_CLOSING)return false; - var safe = false; - try { - var arr = [7] - , iter = arr[ITERATOR](); - iter.next = function(){ return {done: safe = true}; }; - arr[ITERATOR] = function(){ return iter; }; - exec(arr); - } catch(e){ /* empty */ } - return safe; -}; - -/***/ }), -/* 97 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = { "default": __webpack_require__(98), __esModule: true }; - -/***/ }), -/* 98 */ -/***/ (function(module, exports, __webpack_require__) { - -__webpack_require__(58); -__webpack_require__(36); -module.exports = __webpack_require__(102); - -/***/ }), -/* 99 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var addToUnscopables = __webpack_require__(100) - , step = __webpack_require__(101) - , Iterators = __webpack_require__(17) - , toIObject = __webpack_require__(40); - -// 22.1.3.4 Array.prototype.entries() -// 22.1.3.13 Array.prototype.keys() -// 22.1.3.29 Array.prototype.values() -// 22.1.3.30 Array.prototype[@@iterator]() -module.exports = __webpack_require__(48)(Array, 'Array', function(iterated, kind){ - this._t = toIObject(iterated); // target - this._i = 0; // next index - this._k = kind; // kind -// 22.1.5.2.1 %ArrayIteratorPrototype%.next() -}, function(){ - var O = this._t - , kind = this._k - , index = this._i++; - if(!O || index >= O.length){ - this._t = undefined; - return step(1); - } - if(kind == 'keys' )return step(0, index); - if(kind == 'values')return step(0, O[index]); - return step(0, [index, O[index]]); -}, 'values'); - -// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7) -Iterators.Arguments = Iterators.Array; - -addToUnscopables('keys'); -addToUnscopables('values'); -addToUnscopables('entries'); - -/***/ }), -/* 100 */ -/***/ (function(module, exports) { - -module.exports = function(){ /* empty */ }; - -/***/ }), -/* 101 */ -/***/ (function(module, exports) { - -module.exports = function(done, value){ - return {value: value, done: !!done}; -}; - -/***/ }), -/* 102 */ -/***/ (function(module, exports, __webpack_require__) { - -var classof = __webpack_require__(56) - , ITERATOR = __webpack_require__(11)('iterator') - , Iterators = __webpack_require__(17); -module.exports = __webpack_require__(8).isIterable = function(it){ - var O = Object(it); - return O[ITERATOR] !== undefined - || '@@iterator' in O - || Iterators.hasOwnProperty(classof(O)); -}; - -/***/ }), -/* 103 */ -/***/ (function(module, exports, __webpack_require__) { - -__webpack_require__(58); -__webpack_require__(36); -module.exports = __webpack_require__(104); - -/***/ }), -/* 104 */ -/***/ (function(module, exports, __webpack_require__) { - -var anObject = __webpack_require__(22) - , get = __webpack_require__(55); -module.exports = __webpack_require__(8).getIterator = function(it){ - var iterFn = get(it); - if(typeof iterFn != 'function')throw TypeError(it + ' is not iterable!'); - return anObject(iterFn.call(it)); -}; - -/***/ }), -/* 105 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = { "default": __webpack_require__(106), __esModule: true }; - -/***/ }), -/* 106 */ -/***/ (function(module, exports, __webpack_require__) { - -__webpack_require__(107); -module.exports = __webpack_require__(8).Object.assign; - -/***/ }), -/* 107 */ -/***/ (function(module, exports, __webpack_require__) { - -// 19.1.3.1 Object.assign(target, source) -var $export = __webpack_require__(25); - -$export($export.S + $export.F, 'Object', {assign: __webpack_require__(108)}); - -/***/ }), -/* 108 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -// 19.1.2.1 Object.assign(target, source, ...) -var getKeys = __webpack_require__(39) - , gOPS = __webpack_require__(109) - , pIE = __webpack_require__(110) - , toObject = __webpack_require__(29) - , IObject = __webpack_require__(49) - , $assign = Object.assign; - -// should work with symbols and should have deterministic property order (V8 bug) -module.exports = !$assign || __webpack_require__(24)(function(){ - var A = {} - , B = {} - , S = Symbol() - , K = 'abcdefghijklmnopqrst'; - A[S] = 7; - K.split('').forEach(function(k){ B[k] = k; }); - return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K; -}) ? function assign(target, source){ // eslint-disable-line no-unused-vars - var T = toObject(target) - , aLen = arguments.length - , index = 1 - , getSymbols = gOPS.f - , isEnum = pIE.f; - while(aLen > index){ - var S = IObject(arguments[index++]) - , keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S) - , length = keys.length - , j = 0 - , key; - while(length > j)if(isEnum.call(S, key = keys[j++]))T[key] = S[key]; - } return T; -} : $assign; - -/***/ }), -/* 109 */ -/***/ (function(module, exports) { - -exports.f = Object.getOwnPropertySymbols; - -/***/ }), -/* 110 */ -/***/ (function(module, exports) { - -exports.f = {}.propertyIsEnumerable; - -/***/ }), -/* 111 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; - -/** - * This file provides support to domTree.js - * It's a storehouse of path geometry for SVG images. - */ - -// We do frac-lines, underlines, and overlines with an SVG path and we put that -// path is into a viewBox that is 5 times as thick as the line. That way, -// any browser rounding error on the size of the surrounding span will -// not pinch the ink of the line. Think of it as padding for the line. -// As usual, the viewBox-to-em scale is 1000. - -var hLinePad = 80; // padding above and below a std 0.04em horiz rule. -var vLinePad = 100; // padding on either side of a std vert 0.05em rule. - -var path = { - // stdHorizRule is used for frac-lines, underlines, and overlines. - // It is 0.04em thick if the line comes from normalsize/textstyle. - stdHorizRule: "M0 " + hLinePad + "H400000 v40H0z M0 " + hLinePad + "H400000 v40H0z", - - // vertSeparator is used in arrays. It is 0.05em wide in a 0.25em viewBox. - vertSeparator: "M" + vLinePad + " 0h50V400000h-50zM" + vLinePad + " 0h50V400000h-50z", - - // sqrtMain path geometry is from glyph U221A in the font KaTeX Main - // All surds have 80 units padding above the viniculumn. - sqrtMain: "M95," + (622 + hLinePad) + "c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,\n-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8,\n-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0,\n35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5,\n-221c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467\ns-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422\ns-65,47,-65,47z M834 " + hLinePad + "H400000v40H845z", - - // size1 is from glyph U221A in the font KaTeX_Size1-Regular - sqrtSize1: "M263," + (601 + hLinePad) + "c0.7,0,18,39.7,52,119c34,79.3,68.167,\n158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120c340,-704.7,510.7,-1060.3,512,-1067\nc4.7,-7.3,11,-11,19,-11H40000v40H1012.3s-271.3,567,-271.3,567c-38.7,80.7,-84,\n175,-136,283c-52,108,-89.167,185.3,-111.5,232c-22.3,46.7,-33.8,70.3,-34.5,71\nc-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1s-109,-253,-109,-253c-72.7,-168,-109.3,\n-252,-110,-252c-10.7,8,-22,16.7,-34,26c-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26\ns76,-59,76,-59s76,-60,76,-60z M1001 " + hLinePad + "H40000v40H1012z", - - // size2 is from glyph U221A in the font KaTeX_Size2-Regular - // The 80 units padding is most obvious here. Note start node at M1001 80. - sqrtSize2: "M1001," + hLinePad + "H400000v40H1013.1s-83.4,268,-264.1,840c-180.7,\n572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7s-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,\n-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744c-10,12,-21,25,-33,39s-32,39,-32,39\nc-6,-5.3,-15,-14,-27,-26s25,-30,25,-30c26.7,-32.7,52,-63,76,-91s52,-60,52,-60\ns208,722,208,722c56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,\n-658.5c53.7,-170.3,84.5,-266.8,92.5,-289.5c4,-6.7,10,-10,18,-10z\nM1001 " + hLinePad + "H400000v40H1013z", - - // size3 is from glyph U221A in the font KaTeX_Size3-Regular - sqrtSize3: "M424," + (2398 + hLinePad) + "c-1.3,-0.7,-38.5,-172,-111.5,-514c-73,\n-342,-109.8,-513.3,-110.5,-514c0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,\n25c-5.7,9.3,-9.8,16,-12.5,20s-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,\n-13s76,-122,76,-122s77,-121,77,-121s209,968,209,968c0,-2,84.7,-361.7,254,-1079\nc169.3,-717.3,254.7,-1077.7,256,-1081c4,-6.7,10,-10,18,-10H400000v40H1014.6\ns-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185c-2,6,-10,9,-24,9\nc-8,0,-12,-0.7,-12,-2z M1001 " + hLinePad + "H400000v40H1014z", - - // size4 is from glyph U221A in the font KaTeX_Size4-Regular - sqrtSize4: "M473," + (2713 + hLinePad) + "c339.3,-1799.3,509.3,-2700,510,-2702\nc3.3,-7.3,9.3,-11,18,-11H400000v40H1017.7s-90.5,478,-276.2,1466c-185.7,988,\n-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9c-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,\n-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200c0,-1.3,-5.3,8.7,-16,30c-10.7,\n21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26s76,-153,76,-153s77,-151,\n77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104,606z\nM1001 " + hLinePad + "H400000v40H1017z", - - // The doubleleftarrow geometry is from glyph U+21D0 in the font KaTeX Main - doubleleftarrow: "M262 157\nl10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3\n 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28\n 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5\nc2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5\n 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87\n-86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7\n-2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z\nm8 0v40h399730v-40zm0 194v40h399730v-40z", - - // doublerightarrow is from glyph U+21D2 in font KaTeX Main - doublerightarrow: "M399738 392l\n-10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5\n 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88\n-33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68\n-17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18\n-13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782\nc-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3\n-107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z", - - // leftarrow is from glyph U+2190 in font KaTeX Main - leftarrow: "M400000 241H110l3-3c68.7-52.7 113.7-120\n 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8\n-5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247\nc-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208\n 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3\n 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202\n l-3-3h399890zM100 241v40h399900v-40z", - - // overbrace is from glyphs U+23A9/23A8/23A7 in font KaTeX_Size4-Regular - leftbrace: "M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117\n-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7\n 5-6 9-10 13-.7 1-7.3 1-20 1H6z", - - leftbraceunder: "M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13\n 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688\n 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7\n-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z", - - // overgroup is from the MnSymbol package (public domain) - leftgroup: "M400000 80\nH435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0\n 435 0h399565z", - - leftgroupunder: "M400000 262\nH435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219\n 435 219h399565z", - - // Harpoons are from glyph U+21BD in font KaTeX Main - leftharpoon: "M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3\n-3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5\n-18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7\n-196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z", - - leftharpoonplus: "M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5\n 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3\n-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7\n-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z\nm0 0v40h400000v-40z", - - leftharpoondown: "M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333\n 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5\n 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667\n-152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z", - - leftharpoondownplus: "M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12\n 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7\n-2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0\nv40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z", - - // hook is from glyph U+21A9 in font KaTeX Main - lefthook: "M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5\n-83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3\n-68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21\n 71.5 23h399859zM103 281v-40h399897v40z", - - leftlinesegment: "M40 281 V428 H0 V94 H40 V241 H400000 v40z\nM40 281 V428 H0 V94 H40 V241 H400000 v40z", - - leftmapsto: "M40 281 V448H0V74H40V241H400000v40z\nM40 281 V448H0V74H40V241H400000v40z", - - // tofrom is from glyph U+21C4 in font KaTeX AMS Regular - leftToFrom: "M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23\n-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8\nc28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3\n 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z", - - longequal: "M0 50 h400000 v40H0z m0 194h40000v40H0z\nM0 50 h400000 v40H0z m0 194h40000v40H0z", - - midbrace: "M200428 334\nc-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14\n-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7\n 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11\n 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z", - - midbraceunder: "M199572 214\nc100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14\n 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3\n 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0\n-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z", - - rightarrow: "M0 241v40h399891c-47.3 35.3-84 78-110 128\n-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20\n 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7\n 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85\n-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n 151.7 139 205zm0 0v40h399900v-40z", - - rightbrace: "M400000 542l\n-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5\ns-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1\nc124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z", - - rightbraceunder: "M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3\n 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237\n-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z", - - rightgroup: "M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0\n 3-1 3-3v-38c-76-158-257-219-435-219H0z", - - rightgroupunder: "M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18\n 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z", - - rightharpoon: "M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3\n-3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2\n-10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58\n 69.2 92 94.5zm0 0v40h399900v-40z", - - rightharpoonplus: "M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11\n-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7\n 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z\nm0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z", - - rightharpoondown: "M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8\n 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5\n-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95\n-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z", - - rightharpoondownplus: "M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8\n 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3\n 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3\n-64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z\nm0-194v40h400000v-40zm0 0v40h400000v-40z", - - righthook: "M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3\n 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0\n-13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21\n 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z", - - rightlinesegment: "M399960 241 V94 h40 V428 h-40 V281 H0 v-40z\nM399960 241 V94 h40 V428 h-40 V281 H0 v-40z", - - rightToFrom: "M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23\n 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32\n-52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142\n-167z M100 147v40h399900v-40zM0 341v40h399900v-40z", - - // twoheadleftarrow is from glyph U+219E in font KaTeX AMS Regular - twoheadleftarrow: "M0 167c68 40\n 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69\n-70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3\n-40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19\n-37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101\n 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z", - - twoheadrightarrow: "M400000 167\nc-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3\n 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42\n 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333\n-19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70\n 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z", - - // tilde1 is a modified version of a glyph from the MnSymbol package - tilde1: "M200 55.538c-77 0-168 73.953-177 73.953-3 0-7\n-2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0\n 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0\n 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128\n-68.267.847-113-73.952-191-73.952z", - - // ditto tilde2, tilde3, & tilde4 - tilde2: "M344 55.266c-142 0-300.638 81.316-311.5 86.418\n-8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9\n 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114\nc1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751\n 181.476 676 181.476c-149 0-189-126.21-332-126.21z", - - tilde3: "M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457\n-11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0\n 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697\n 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696\n -338 0-409-156.573-744-156.573z", - - tilde4: "M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345\n-11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409\n 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9\n 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409\n -175.236-744-175.236z", - - // vec is from glyph U+20D7 in font KaTeX Main - vec: "M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z", - - // widehat1 is a modified version of a glyph from the MnSymbol package - widehat1: "M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22\nc-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z", - - // ditto widehat2, widehat3, & widehat4 - widehat2: "M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z", - - widehat3: "M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z", - - widehat4: "M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z", - - // baraboveleftarrow is from glyph U+21C4 in font KaTeX AMS Regular - baraboveleftarrow: "M1 500c30.67-18 59-41.833 85-71.5s45-61.17 57-94.5h23\nc15.33 0 23 .33 23 1 0 .67-5.33 12.67-16 36-16.67 34.67-39 67.33-67 98l-10 11\nh39904v40H96l9 10c27.33 30.67 50.67 65 70 103l14 33c0 .67-7.67 1-23 1h-22\nC116.67 596.33 69 540.67 1 500z M96 480 H400000 v40 H96z\nM1 147 H399905 v40 H1z M0 147 H399905 v40 H0z", - - // ditto rightarrowabovebar - rightarrowabovebar: "M400000 167c-70.67 42-118 97.67-142 167h-23c-15.33 0\n-23-.33-23-1 0-1.33 5.33-13.67 16-37 18-35.33 41.33-69 70-101l7-8h-39905\nv-40h39905c-389 0 0 0 0 0l-7-8c-28.67-32-52-65.67-70-101-10.67-23.33-16-35.67\n-16-37 0-.67 7.67-1 23-1h23c11.33 33.33 30 64.833 56 94.5s54.67 53.83 86 72.5z\nM0 147 H399905 v40 H0z M96 480 H400000 v40 H0z M96 480 H400000 v40 H0z", - - // The next eight paths support reaction arrows from the mhchem package. - - // The short left harpoon has 0.5em (i.e. 500 units) kern on the left end. - // Ref from mhchem.sty: \rlap{\raisebox{-.22ex}{$\kern0.5em - baraboveshortleftharpoon: "M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17\nc2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21\nc-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40\nc-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z\nM0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z", - - rightharpoonaboveshortbar: "M0,241 l0,40c399126,0,399993,0,399993,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z", - - shortbaraboveleftharpoon: "M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9,\n1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7,\n-152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z\nM93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z", - - shortrightharpoonabovebar: "M53,241l0,40c398570,0,399437,0,399437,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z" -}; - -/* harmony default export */ __webpack_exports__["a"] = ({ path: path }); - -/***/ }), -/* 112 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return spacings; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return tightSpacings; }); -/** - * Describes spaces between different classes of atoms. - */ - -var thinspace = { - number: 3, - unit: "mu" -}; -var mediumspace = { - number: 4, - unit: "mu" -}; -var thickspace = { - number: 5, - unit: "mu" -}; - -// Spacing relationships for display and text styles -var spacings = { - mord: { - mop: thinspace, - mbin: mediumspace, - mrel: thickspace, - minner: thinspace - }, - mop: { - mord: thinspace, - mop: thinspace, - mrel: thickspace, - minner: thinspace - }, - mbin: { - mord: mediumspace, - mop: mediumspace, - mopen: mediumspace, - minner: mediumspace - }, - mrel: { - mord: thickspace, - mop: thickspace, - mopen: thickspace, - minner: thickspace - }, - mopen: {}, - mclose: { - mop: thinspace, - mbin: mediumspace, - mrel: thickspace, - minner: thinspace - }, - mpunct: { - mord: thinspace, - mop: thinspace, - mrel: thickspace, - mopen: thinspace, - mclose: thinspace, - mpunct: thinspace, - minner: thinspace - }, - minner: { - mord: thinspace, - mop: thinspace, - mbin: mediumspace, - mrel: thickspace, - mopen: thinspace, - mpunct: thinspace, - minner: thinspace - } -}; - -// Spacing relationships for script and scriptscript styles -var tightSpacings = { - mord: { - mop: thinspace - }, - mop: { - mord: thinspace, - mop: thinspace - }, - mbin: {}, - mrel: {}, - mopen: {}, - mclose: { - mop: thinspace - }, - mpunct: {}, - minner: { - mop: thinspace - } -}; - -/***/ }), -/* 113 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Parser__ = __webpack_require__(114); - -/** - * Provides a single function for parsing an expression using a Parser - * TODO(emily): Remove this - */ - - - -/** - * Parses an expression using a Parser, then returns the parsed result. - */ -var parseTree = function parseTree(toParse, settings) { - if (!(typeof toParse === 'string' || toParse instanceof String)) { - throw new TypeError('KaTeX can only parse string typed expression'); - } - var parser = new __WEBPACK_IMPORTED_MODULE_0__Parser__["a" /* default */](toParse, settings); - - return parser.parse(); -}; - -/* harmony default export */ __webpack_exports__["a"] = (parseTree); - -/***/ }), -/* 114 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck__ = __webpack_require__(7); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_createClass__ = __webpack_require__(10); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_createClass___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_createClass__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__functions__ = __webpack_require__(115); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__environments__ = __webpack_require__(142); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__MacroExpander__ = __webpack_require__(144); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__symbols__ = __webpack_require__(28); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__units__ = __webpack_require__(19); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__unicodeScripts__ = __webpack_require__(42); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__unicodeAccents__ = __webpack_require__(148); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__unicodeAccents___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_8__unicodeAccents__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__unicodeSymbols__ = __webpack_require__(149); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__ParseNode__ = __webpack_require__(14); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__ParseError__ = __webpack_require__(6); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__Lexer_js__ = __webpack_require__(62); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_13__Settings__ = __webpack_require__(34); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_14__Token__ = __webpack_require__(27); - - - -/* eslint no-constant-condition:0 */ -/* eslint no-console:0 */ - - - - - - - - - - - - - - -/** - * This file contains the parser used to parse out a TeX expression from the - * input. Since TeX isn't context-free, standard parsers don't work particularly - * well. - * - * The strategy of this parser is as such: - * - * The main functions (the `.parse...` ones) take a position in the current - * parse string to parse tokens from. The lexer (found in Lexer.js, stored at - * this.lexer) also supports pulling out tokens at arbitrary places. When - * individual tokens are needed at a position, the lexer is called to pull out a - * token, which is then used. - * - * The parser has a property called "mode" indicating the mode that - * the parser is currently in. Currently it has to be one of "math" or - * "text", which denotes whether the current environment is a math-y - * one or a text-y one (e.g. inside \text). Currently, this serves to - * limit the functions which can be used in text mode. - * - * The main functions then return an object which contains the useful data that - * was parsed at its given point, and a new position at the end of the parsed - * data. The main functions can call each other and continue the parsing by - * using the returned position as a new starting point. - * - * There are also extra `.handle...` functions, which pull out some reused - * functionality into self-contained functions. - * - * The earlier functions return ParseNodes. - * The later functions (which are called deeper in the parse) sometimes return - * ParsedFuncOrArgOrDollar, which contain a ParseNode as well as some data about - * whether the parsed object is a function which is missing some arguments, or a - * standalone object which can be used as an argument to another function. - */ - -function newArgument(result, token) { - return { type: "arg", result: result, token: token }; -} - -function newFunction(token) { - return { type: "fn", result: token.text, token: token }; -} - -function newDollar(token) { - return { type: "$", result: "$", token: token }; -} - -function assertFuncOrArg(parsed) { - if (parsed.type === "$") { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("Unexpected $", parsed.token); - } - return parsed; -} - -var Parser = function () { - function Parser(input, settings) { - __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck___default()(this, Parser); - - // Start in math mode - this.mode = "math"; - // Create a new macro expander (gullet) and (indirectly via that) also a - // new lexer (mouth) for this parser (stomach, in the language of TeX) - this.gullet = new __WEBPACK_IMPORTED_MODULE_4__MacroExpander__["a" /* default */](input, settings.macros, this.mode); - // Use old \color behavior (same as LaTeX's \textcolor) if requested. - // We do this after the macros object has been copied by MacroExpander. - if (settings.colorIsTextColor) { - this.gullet.macros["\\color"] = "\\textcolor"; - } - // Store the settings for use in parsing - this.settings = settings; - // Count leftright depth (for \middle errors) - this.leftrightDepth = 0; - } - - /** - * Checks a result to make sure it has the right type, and throws an - * appropriate error otherwise. - */ - - - __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_createClass___default()(Parser, [{ - key: "expect", - value: function expect(text) { - var consume = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; - - if (this.nextToken.text !== text) { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("Expected '" + text + "', got '" + this.nextToken.text + "'", this.nextToken); - } - if (consume) { - this.consume(); - } - } - - /** - * Considers the current look ahead token as consumed, - * and fetches the one after that as the new look ahead. - */ - - }, { - key: "consume", - value: function consume() { - this.nextToken = this.gullet.expandNextToken(); - } - - /** - * Switches between "text" and "math" modes. - */ - - }, { - key: "switchMode", - value: function switchMode(newMode) { - this.mode = newMode; - this.gullet.switchMode(newMode); - } - - /** - * Main parsing function, which parses an entire input. - */ - - }, { - key: "parse", - value: function parse() { - // Try to parse the input - this.consume(); - var parse = this.parseInput(); - return parse; - } - - /** - * Parses an entire input tree. - */ - - }, { - key: "parseInput", - value: function parseInput() { - // Parse an expression - var expression = this.parseExpression(false); - // If we succeeded, make sure there's an EOF at the end - this.expect("EOF", false); - return expression; - } - }, { - key: "parseExpression", - - - /** - * Parses an "expression", which is a list of atoms. - * - * `breakOnInfix`: Should the parsing stop when we hit infix nodes? This - * happens when functions have higher precendence han infix - * nodes in implicit parses. - * - * `breakOnTokenText`: The text of the token that the expression should end - * with, or `null` if something else should end the - * expression. - */ - value: function parseExpression(breakOnInfix, breakOnTokenText) { - var body = []; - // Keep adding atoms to the body until we can't parse any more atoms (either - // we reached the end, a }, or a \right) - while (true) { - // Ignore spaces in math mode - if (this.mode === "math") { - this.consumeSpaces(); - } - var lex = this.nextToken; - if (Parser.endOfExpression.indexOf(lex.text) !== -1) { - break; - } - if (breakOnTokenText && lex.text === breakOnTokenText) { - break; - } - if (breakOnInfix && __WEBPACK_IMPORTED_MODULE_2__functions__["a" /* default */][lex.text] && __WEBPACK_IMPORTED_MODULE_2__functions__["a" /* default */][lex.text].infix) { - break; - } - var atom = this.parseAtom(breakOnTokenText); - if (!atom) { - if (!this.settings.throwOnError && lex.text[0] === "\\") { - var errorNode = this.handleUnsupportedCmd(); - body.push(errorNode); - continue; - } - - break; - } - body.push(atom); - } - return this.handleInfixNodes(body); - } - - /** - * Rewrites infix operators such as \over with corresponding commands such - * as \frac. - * - * There can only be one infix operator per group. If there's more than one - * then the expression is ambiguous. This can be resolved by adding {}. - */ - - }, { - key: "handleInfixNodes", - value: function handleInfixNodes(body) { - var overIndex = -1; - var funcName = void 0; - - for (var i = 0; i < body.length; i++) { - var node = body[i]; - if (node.type === "infix") { - if (overIndex !== -1) { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("only one infix operator per group", node.value.token); - } - overIndex = i; - funcName = node.value.replaceWith; - } - } - - if (overIndex !== -1 && funcName) { - var numerNode = void 0; - var denomNode = void 0; - - var numerBody = body.slice(0, overIndex); - var denomBody = body.slice(overIndex + 1); - - if (numerBody.length === 1 && numerBody[0].type === "ordgroup") { - numerNode = numerBody[0]; - } else { - numerNode = new __WEBPACK_IMPORTED_MODULE_10__ParseNode__["a" /* default */]("ordgroup", numerBody, this.mode); - } - - if (denomBody.length === 1 && denomBody[0].type === "ordgroup") { - denomNode = denomBody[0]; - } else { - denomNode = new __WEBPACK_IMPORTED_MODULE_10__ParseNode__["a" /* default */]("ordgroup", denomBody, this.mode); - } - - var value = this.callFunction(funcName, [numerNode, denomNode], []); - return [new __WEBPACK_IMPORTED_MODULE_10__ParseNode__["a" /* default */](value.type, value, this.mode)]; - } else { - return body; - } - } - - // The greediness of a superscript or subscript - - }, { - key: "handleSupSubscript", - - - /** - * Handle a subscript or superscript with nice errors. - */ - value: function handleSupSubscript(name) { - var symbolToken = this.nextToken; - var symbol = symbolToken.text; - this.consume(); - this.consumeSpaces(); // ignore spaces before sup/subscript argument - var group = this.parseGroup(); - - if (!group) { - if (!this.settings.throwOnError && this.nextToken.text[0] === "\\") { - return this.handleUnsupportedCmd(); - } else { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("Expected group after '" + symbol + "'", symbolToken); - } - } - - var arg = assertFuncOrArg(group); - if (arg.type === "fn") { - // ^ and _ have a greediness, so handle interactions with functions' - // greediness - var funcGreediness = __WEBPACK_IMPORTED_MODULE_2__functions__["a" /* default */][arg.result].greediness; - if (funcGreediness > Parser.SUPSUB_GREEDINESS) { - return this.parseGivenFunction(group); - } else { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("Got function '" + arg.result + "' with no arguments " + "as " + name, symbolToken); - } - } else { - return arg.result; - } - } - - /** - * Converts the textual input of an unsupported command into a text node - * contained within a color node whose color is determined by errorColor - */ - - }, { - key: "handleUnsupportedCmd", - value: function handleUnsupportedCmd() { - var text = this.nextToken.text; - var textordArray = []; - - for (var i = 0; i < text.length; i++) { - textordArray.push(new __WEBPACK_IMPORTED_MODULE_10__ParseNode__["a" /* default */]("textord", text[i], "text")); - } - - var textNode = new __WEBPACK_IMPORTED_MODULE_10__ParseNode__["a" /* default */]("text", { - body: textordArray, - type: "text" - }, this.mode); - - var colorNode = new __WEBPACK_IMPORTED_MODULE_10__ParseNode__["a" /* default */]("color", { - color: this.settings.errorColor, - value: [textNode], - type: "color" - }, this.mode); - - this.consume(); - return colorNode; - } - - /** - * Parses a group with optional super/subscripts. - */ - - }, { - key: "parseAtom", - value: function parseAtom(breakOnTokenText) { - // The body of an atom is an implicit group, so that things like - // \left(x\right)^2 work correctly. - var base = this.parseImplicitGroup(breakOnTokenText); - - // In text mode, we don't have superscripts or subscripts - if (this.mode === "text") { - return base; - } - - // Note that base may be empty (i.e. null) at this point. - - var superscript = void 0; - var subscript = void 0; - while (true) { - // Guaranteed in math mode, so eat any spaces first. - this.consumeSpaces(); - - // Lex the first token - var lex = this.nextToken; - - if (lex.text === "\\limits" || lex.text === "\\nolimits") { - // We got a limit control - if (!base || base.type !== "op") { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("Limit controls must follow a math operator", lex); - } else { - var limits = lex.text === "\\limits"; - base.value.limits = limits; - base.value.alwaysHandleSupSub = true; - } - this.consume(); - } else if (lex.text === "^") { - // We got a superscript start - if (superscript) { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("Double superscript", lex); - } - superscript = this.handleSupSubscript("superscript"); - } else if (lex.text === "_") { - // We got a subscript start - if (subscript) { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("Double subscript", lex); - } - subscript = this.handleSupSubscript("subscript"); - } else if (lex.text === "'") { - // We got a prime - if (superscript) { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("Double superscript", lex); - } - var prime = new __WEBPACK_IMPORTED_MODULE_10__ParseNode__["a" /* default */]("textord", "\\prime", this.mode); - - // Many primes can be grouped together, so we handle this here - var primes = [prime]; - this.consume(); - // Keep lexing tokens until we get something that's not a prime - while (this.nextToken.text === "'") { - // For each one, add another prime to the list - primes.push(prime); - this.consume(); - } - // If there's a superscript following the primes, combine that - // superscript in with the primes. - if (this.nextToken.text === "^") { - primes.push(this.handleSupSubscript("superscript")); - } - // Put everything into an ordgroup as the superscript - superscript = new __WEBPACK_IMPORTED_MODULE_10__ParseNode__["a" /* default */]("ordgroup", primes, this.mode); - } else { - // If it wasn't ^, _, or ', stop parsing super/subscripts - break; - } - } - - if (superscript || subscript) { - // If we got either a superscript or subscript, create a supsub - return new __WEBPACK_IMPORTED_MODULE_10__ParseNode__["a" /* default */]("supsub", { - base: base, - sup: superscript, - sub: subscript - }, this.mode); - } else { - // Otherwise return the original body - return base; - } - } - - /** - * Parses an implicit group, which is a group that starts at the end of a - * specified, and ends right before a higher explicit group ends, or at EOL. It - * is used for functions that appear to affect the current style, like \Large or - * \textrm, where instead of keeping a style we just pretend that there is an - * implicit grouping after it until the end of the group. E.g. - * small text {\Large large text} small text again - */ - - }, { - key: "parseImplicitGroup", - value: function parseImplicitGroup(breakOnTokenText) { - var start = this.parseSymbol(); - - if (start == null) { - // If we didn't get anything we handle, fall back to parseFunction - return this.parseFunction(); - } else if (start.type === "arg") { - // Defer to parseGivenFunction if it's not a function we handle - return this.parseGivenFunction(start); - } - - var func = start.result; - - if (func === "$") { - if (this.mode === "math") { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("$ within math mode"); - } - var outerMode = this.mode; - this.switchMode("math"); - // Expand next symbol now that we're in math mode. - this.consume(); - var body = this.parseExpression(false, "$"); - // We can't expand the next symbol after the $ until after - // switching modes back. So don't consume within expect. - this.expect("$", false); - this.switchMode(outerMode); - this.consume(); - return new __WEBPACK_IMPORTED_MODULE_10__ParseNode__["a" /* default */]("styling", { - style: "text", - value: body - }, "math"); - } else if (func === "\\begin") { - // begin...end is similar to left...right - var begin = this.parseGivenFunction(start); - var envName = begin.value.name; - if (!__WEBPACK_IMPORTED_MODULE_3__environments__["a" /* default */].hasOwnProperty(envName)) { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("No such environment: " + envName, begin.value.nameGroup); - } - // Build the environment object. Arguments and other information will - // be made available to the begin and end methods using properties. - var env = __WEBPACK_IMPORTED_MODULE_3__environments__["a" /* default */][envName]; - - var _parseArguments = this.parseArguments("\\begin{" + envName + "}", env), - args = _parseArguments.args, - optArgs = _parseArguments.optArgs; - - var context = { - mode: this.mode, - envName: envName, - parser: this - }; - var _result = env.handler(context, args, optArgs); - this.expect("\\end", false); - var endNameToken = this.nextToken; - var end = this.parseFunction(); - if (!end) { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("failed to parse function after \\end"); - } else if (end.value.name !== envName) { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("Mismatch: \\begin{" + envName + "} matched " + "by \\end{" + end.value.name + "}", endNameToken); - } - return _result; - } else { - // Defer to parseGivenFunction if it's not a function we handle - return this.parseGivenFunction(start, breakOnTokenText); - } - } - - /** - * Parses an entire function, including its base and all of its arguments. - * It also handles the case where the parsed node is not a function. - */ - - }, { - key: "parseFunction", - value: function parseFunction() { - var baseGroup = this.parseGroup(); - return baseGroup ? this.parseGivenFunction(baseGroup) : null; - } - - /** - * Same as parseFunction(), except that the base is provided, guaranteeing a - * non-nullable result. - */ - - }, { - key: "parseGivenFunction", - value: function parseGivenFunction(baseGroup, breakOnTokenText) { - baseGroup = assertFuncOrArg(baseGroup); - if (baseGroup.type === "fn") { - var func = baseGroup.result; - var funcData = __WEBPACK_IMPORTED_MODULE_2__functions__["a" /* default */][func]; - if (this.mode === "text" && !funcData.allowedInText) { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("Can't use function '" + func + "' in text mode", baseGroup.token); - } else if (this.mode === "math" && funcData.allowedInMath === false) { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("Can't use function '" + func + "' in math mode", baseGroup.token); - } - - var _parseArguments2 = this.parseArguments(func, funcData), - args = _parseArguments2.args, - optArgs = _parseArguments2.optArgs; - - var _token = baseGroup.token; - var _result2 = this.callFunction(func, args, optArgs, _token, breakOnTokenText); - return new __WEBPACK_IMPORTED_MODULE_10__ParseNode__["a" /* default */](_result2.type, _result2, this.mode); - } else { - return baseGroup.result; - } - } - - /** - * Call a function handler with a suitable context and arguments. - */ - - }, { - key: "callFunction", - value: function callFunction(name, args, optArgs, token, breakOnTokenText) { - var context = { - funcName: name, - parser: this, - token: token, - breakOnTokenText: breakOnTokenText - }; - var func = __WEBPACK_IMPORTED_MODULE_2__functions__["a" /* default */][name]; - if (func && func.handler) { - return func.handler(context, args, optArgs); - } else { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("No function handler for " + name); - } - } - - /** - * Parses the arguments of a function or environment - */ - - }, { - key: "parseArguments", - value: function parseArguments(func, // Should look like "\name" or "\begin{name}". - funcData) { - var totalArgs = funcData.numArgs + funcData.numOptionalArgs; - if (totalArgs === 0) { - return { args: [], optArgs: [] }; - } - - var baseGreediness = funcData.greediness; - var args = []; - var optArgs = []; - - for (var i = 0; i < totalArgs; i++) { - var argType = funcData.argTypes && funcData.argTypes[i]; - var isOptional = i < funcData.numOptionalArgs; - // Ignore spaces between arguments. As the TeXbook says: - // "After you have said ‘\def\row#1#2{...}’, you are allowed to - // put spaces between the arguments (e.g., ‘\row x n’), because - // TeX doesn’t use single spaces as undelimited arguments." - if (i > 0 && !isOptional) { - this.consumeSpaces(); - } - // Also consume leading spaces in math mode, as parseSymbol - // won't know what to do with them. This can only happen with - // macros, e.g. \frac\foo\foo where \foo expands to a space symbol. - // In LaTeX, the \foo's get treated as (blank) arguments). - // In KaTeX, for now, both spaces will get consumed. - // TODO(edemaine) - if (i === 0 && !isOptional && this.mode === "math") { - this.consumeSpaces(); - } - var nextToken = this.nextToken; - var arg = argType ? this.parseGroupOfType(argType, isOptional) : this.parseGroup(isOptional); - if (!arg) { - if (isOptional) { - optArgs.push(null); - continue; - } - if (!this.settings.throwOnError && this.nextToken.text[0] === "\\") { - arg = newArgument(this.handleUnsupportedCmd(), nextToken); - } else { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("Expected group after '" + func + "'", nextToken); - } - } - var argNode = void 0; - arg = assertFuncOrArg(arg); - if (arg.type === "fn") { - var argGreediness = __WEBPACK_IMPORTED_MODULE_2__functions__["a" /* default */][arg.result].greediness; - if (argGreediness > baseGreediness) { - argNode = this.parseGivenFunction(arg); - } else { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("Got function '" + arg.result + "' as " + "argument to '" + func + "'", nextToken); - } - } else { - argNode = arg.result; - } - (isOptional ? optArgs : args).push(argNode); - } - - return { args: args, optArgs: optArgs }; - } - - /** - * Parses a group when the mode is changing. - */ - - }, { - key: "parseGroupOfType", - value: function parseGroupOfType(type, // Used to describe the mode in error messages. - optional) { - // Handle `original` argTypes - if (type === "original") { - type = this.mode; - } - - if (type === "color") { - return this.parseColorGroup(optional); - } - if (type === "size") { - return this.parseSizeGroup(optional); - } - if (type === "url") { - return this.parseUrlGroup(optional); - } - - // By the time we get here, type is one of "text" or "math". - // Specify this as mode to parseGroup. - return this.parseGroup(optional, type); - } - }, { - key: "consumeSpaces", - value: function consumeSpaces() { - while (this.nextToken.text === " ") { - this.consume(); - } - } - - /** - * Parses a group, essentially returning the string formed by the - * brace-enclosed tokens plus some position information. - */ - - }, { - key: "parseStringGroup", - value: function parseStringGroup(modeName, // Used to describe the mode in error messages. - optional) { - if (optional && this.nextToken.text !== "[") { - return null; - } - var outerMode = this.mode; - this.mode = "text"; - this.expect(optional ? "[" : "{"); - var str = ""; - var firstToken = this.nextToken; - var lastToken = firstToken; - while (this.nextToken.text !== (optional ? "]" : "}")) { - if (this.nextToken.text === "EOF") { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("Unexpected end of input in " + modeName, firstToken.range(this.nextToken, str)); - } - lastToken = this.nextToken; - str += lastToken.text; - this.consume(); - } - this.mode = outerMode; - this.expect(optional ? "]" : "}"); - return firstToken.range(lastToken, str); - } - - /** - * Parses a group, essentially returning the string formed by the - * brace-enclosed tokens plus some position information, possibly - * with nested braces. - */ - - }, { - key: "parseStringGroupWithBalancedBraces", - value: function parseStringGroupWithBalancedBraces(modeName, // Used to describe the mode in error messages. - optional) { - if (optional && this.nextToken.text !== "[") { - return null; - } - var outerMode = this.mode; - this.mode = "text"; - this.expect(optional ? "[" : "{"); - var str = ""; - var nest = 0; - var firstToken = this.nextToken; - var lastToken = firstToken; - while (nest > 0 || this.nextToken.text !== (optional ? "]" : "}")) { - if (this.nextToken.text === "EOF") { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("Unexpected end of input in " + modeName, firstToken.range(this.nextToken, str)); - } - lastToken = this.nextToken; - str += lastToken.text; - if (lastToken.text === "{") { - nest += 1; - } else if (lastToken.text === "}") { - if (nest <= 0) { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("Unbalanced brace of input in " + modeName, firstToken.range(this.nextToken, str)); - } else { - nest -= 1; - } - } - this.consume(); - } - this.mode = outerMode; - this.expect(optional ? "]" : "}"); - return firstToken.range(lastToken, str); - } - - /** - * Parses a regex-delimited group: the largest sequence of tokens - * whose concatenated strings match `regex`. Returns the string - * formed by the tokens plus some position information. - */ - - }, { - key: "parseRegexGroup", - value: function parseRegexGroup(regex, modeName) { - var outerMode = this.mode; - this.mode = "text"; - var firstToken = this.nextToken; - var lastToken = firstToken; - var str = ""; - while (this.nextToken.text !== "EOF" && regex.test(str + this.nextToken.text)) { - lastToken = this.nextToken; - str += lastToken.text; - this.consume(); - } - if (str === "") { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("Invalid " + modeName + ": '" + firstToken.text + "'", firstToken); - } - this.mode = outerMode; - return firstToken.range(lastToken, str); - } - - /** - * Parses a color description. - */ - - }, { - key: "parseColorGroup", - value: function parseColorGroup(optional) { - var res = this.parseStringGroup("color", optional); - if (!res) { - return null; - } - var match = /^(#[a-f0-9]{3}|#[a-f0-9]{6}|[a-z]+)$/i.exec(res.text); - if (!match) { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("Invalid color: '" + res.text + "'", res); - } - return newArgument(new __WEBPACK_IMPORTED_MODULE_10__ParseNode__["a" /* default */]("color", match[0], this.mode), res); - } - - /** - * Parses a url string. - */ - - }, { - key: "parseUrlGroup", - value: function parseUrlGroup(optional) { - var res = this.parseStringGroupWithBalancedBraces("url", optional); - if (!res) { - return null; - } - var raw = res.text; - // hyperref package allows backslashes alone in href, but doesn't generate - // valid links in such cases; we interpret this as "undefiend" behaviour, - // and keep them as-is. Some browser will replace backslashes with - // forward slashes. - var url = raw.replace(/\\([#$%&~_^{}])/g, '$1'); - return newArgument(new __WEBPACK_IMPORTED_MODULE_10__ParseNode__["a" /* default */]("url", url, this.mode), res); - } - - /** - * Parses a size specification, consisting of magnitude and unit. - */ - - }, { - key: "parseSizeGroup", - value: function parseSizeGroup(optional) { - var res = void 0; - if (!optional && this.nextToken.text !== "{") { - res = this.parseRegexGroup(/^[-+]? *(?:$|\d+|\d+\.\d*|\.\d*) *[a-z]{0,2} *$/, "size"); - } else { - res = this.parseStringGroup("size", optional); - } - if (!res) { - return null; - } - var match = /([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(res.text); - if (!match) { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("Invalid size: '" + res.text + "'", res); - } - var data = { - number: +(match[1] + match[2]), // sign + magnitude, cast to number - unit: match[3] - }; - if (!Object(__WEBPACK_IMPORTED_MODULE_6__units__["b" /* validUnit */])(data)) { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("Invalid unit: '" + data.unit + "'", res); - } - return newArgument(new __WEBPACK_IMPORTED_MODULE_10__ParseNode__["a" /* default */]("size", data, this.mode), res); - } - - /** - * If `optional` is false or absent, this parses an ordinary group, - * which is either a single nucleus (like "x") or an expression - * in braces (like "{x+y}"). - * If `optional` is true, it parses either a bracket-delimited expression - * (like "[x+y]") or returns null to indicate the absence of a - * bracket-enclosed group. - * If `mode` is present, switches to that mode while parsing the group, - * and switches back after. - */ - - }, { - key: "parseGroup", - value: function parseGroup(optional, mode) { - var outerMode = this.mode; - var firstToken = this.nextToken; - // Try to parse an open brace - if (this.nextToken.text === (optional ? "[" : "{")) { - // Switch to specified mode before we expand symbol after brace - if (mode) { - this.switchMode(mode); - } - // If we get a brace, parse an expression - this.consume(); - var expression = this.parseExpression(false, optional ? "]" : "}"); - var lastToken = this.nextToken; - // Switch mode back before consuming symbol after close brace - if (mode) { - this.switchMode(outerMode); - } - // Make sure we get a close brace - this.expect(optional ? "]" : "}"); - if (mode === "text") { - this.formLigatures(expression); - } - return newArgument(new __WEBPACK_IMPORTED_MODULE_10__ParseNode__["a" /* default */]("ordgroup", expression, this.mode, firstToken, lastToken), firstToken.range(lastToken, firstToken.text)); - } else { - // Otherwise, just return a nucleus, or nothing for an optional group - if (mode) { - this.switchMode(mode); - } - var _result3 = optional ? null : this.parseSymbol(); - if (mode) { - this.switchMode(outerMode); - } - return _result3; - } - } - - /** - * Form ligature-like combinations of characters for text mode. - * This includes inputs like "--", "---", "``" and "''". - * The result will simply replace multiple textord nodes with a single - * character in each value by a single textord node having multiple - * characters in its value. The representation is still ASCII source. - * The group will be modified in place. - */ - - }, { - key: "formLigatures", - value: function formLigatures(group) { - var n = group.length - 1; - for (var i = 0; i < n; ++i) { - var a = group[i]; - var v = a.value; - if (v === "-" && group[i + 1].value === "-") { - if (i + 1 < n && group[i + 2].value === "-") { - group.splice(i, 3, new __WEBPACK_IMPORTED_MODULE_10__ParseNode__["a" /* default */]("textord", "---", "text", a, group[i + 2])); - n -= 2; - } else { - group.splice(i, 2, new __WEBPACK_IMPORTED_MODULE_10__ParseNode__["a" /* default */]("textord", "--", "text", a, group[i + 1])); - n -= 1; - } - } - if ((v === "'" || v === "`") && group[i + 1].value === v) { - group.splice(i, 2, new __WEBPACK_IMPORTED_MODULE_10__ParseNode__["a" /* default */]("textord", v + v, "text", a, group[i + 1])); - n -= 1; - } - } - } - - /** - * Parse a single symbol out of the string. Here, we handle both the functions - * we have defined, as well as the single character symbols - */ - - }, { - key: "parseSymbol", - value: function parseSymbol() { - var nucleus = this.nextToken; - var text = nucleus.text; - - if (__WEBPACK_IMPORTED_MODULE_2__functions__["a" /* default */][text]) { - this.consume(); - // If there exists a function with this name, we return the function and - // say that it is a function. - return newFunction(nucleus); - } else if (/^\\verb[^a-zA-Z]/.test(text)) { - this.consume(); - var arg = text.slice(5); - var star = arg.charAt(0) === "*"; - if (star) { - arg = arg.slice(1); - } - // Lexer's tokenRegex is constructed to always have matching - // first/last characters. - if (arg.length < 2 || arg.charAt(0) !== arg.slice(-1)) { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("\\verb assertion failed --\n please report what input caused this bug"); - } - arg = arg.slice(1, -1); // remove first and last char - return newArgument(new __WEBPACK_IMPORTED_MODULE_10__ParseNode__["a" /* default */]("verb", { - body: arg, - star: star - }, "text"), nucleus); - } else if (text === "$") { - return newDollar(nucleus); - } - // At this point, we should have a symbol, possibly with accents. - // First expand any accented base symbol according to unicodeSymbols. - if (__WEBPACK_IMPORTED_MODULE_9__unicodeSymbols__["a" /* default */].hasOwnProperty(text[0]) && !__WEBPACK_IMPORTED_MODULE_5__symbols__["a" /* default */][this.mode][text[0]]) { - text = __WEBPACK_IMPORTED_MODULE_9__unicodeSymbols__["a" /* default */][text[0]] + text.substr(1); - } - // Strip off any combining characters - var match = __WEBPACK_IMPORTED_MODULE_12__Lexer_js__["a" /* combiningDiacriticalMarksEndRegex */].exec(text); - if (match) { - text = text.substring(0, match.index); - if (text === 'i') { - text = "\u0131"; // dotless i, in math and text mode - } else if (text === 'j') { - text = "\u0237"; // dotless j, in math and text mode - } - } - // Recognize base symbol - var symbol = null; - if (__WEBPACK_IMPORTED_MODULE_5__symbols__["a" /* default */][this.mode][text]) { - symbol = new __WEBPACK_IMPORTED_MODULE_10__ParseNode__["a" /* default */](__WEBPACK_IMPORTED_MODULE_5__symbols__["a" /* default */][this.mode][text].group, text, this.mode, nucleus); - } else if (this.mode === "text" && Object(__WEBPACK_IMPORTED_MODULE_7__unicodeScripts__["b" /* supportedCodepoint */])(text.charCodeAt(0))) { - symbol = new __WEBPACK_IMPORTED_MODULE_10__ParseNode__["a" /* default */]("textord", text, this.mode, nucleus); - } else { - return null; // EOF, ^, _, {, }, etc. - } - this.consume(); - // Transform combining characters into accents - if (match) { - for (var i = 0; i < match[0].length; i++) { - var accent = match[0][i]; - if (!__WEBPACK_IMPORTED_MODULE_8__unicodeAccents___default.a[accent]) { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("Unknown accent ' " + accent + "'", nucleus); - } - var command = __WEBPACK_IMPORTED_MODULE_8__unicodeAccents___default.a[accent][this.mode]; - if (!command) { - throw new __WEBPACK_IMPORTED_MODULE_11__ParseError__["a" /* default */]("Accent " + accent + " unsupported in " + this.mode + " mode", nucleus); - } - symbol = new __WEBPACK_IMPORTED_MODULE_10__ParseNode__["a" /* default */]("accent", { - type: "accent", - label: command, - isStretchy: false, - isShifty: true, - base: symbol - }, this.mode, nucleus); - } - } - return newArgument(symbol, nucleus); - } - }]); - - return Parser; -}(); - -Parser.endOfExpression = ["}", "\\end", "\\right", "&", "\\\\", "\\cr"]; -Parser.SUPSUB_GREEDINESS = 1; -/* harmony default export */ __webpack_exports__["a"] = (Parser); - -/***/ }), -/* 115 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__ParseError__ = __webpack_require__(6); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__ParseNode__ = __webpack_require__(14); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__defineFunction__ = __webpack_require__(3); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__functions_sqrt__ = __webpack_require__(116); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__functions_color__ = __webpack_require__(117); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__functions_text__ = __webpack_require__(118); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__functions_enclose__ = __webpack_require__(119); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__functions_overline__ = __webpack_require__(120); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__functions_underline__ = __webpack_require__(121); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__functions_rule__ = __webpack_require__(122); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__functions_kern__ = __webpack_require__(123); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__functions_phantom__ = __webpack_require__(124); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__functions_mod__ = __webpack_require__(125); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_13__functions_op__ = __webpack_require__(126); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_14__functions_operatorname__ = __webpack_require__(127); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_15__functions_genfrac__ = __webpack_require__(128); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_16__functions_lap__ = __webpack_require__(129); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_17__functions_smash__ = __webpack_require__(130); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_18__functions_delimsizing__ = __webpack_require__(131); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_19__functions_sizing__ = __webpack_require__(60); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_20__functions_styling__ = __webpack_require__(132); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_21__functions_font__ = __webpack_require__(133); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_22__functions_accent__ = __webpack_require__(137); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_23__functions_accentunder__ = __webpack_require__(138); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_24__functions_verb__ = __webpack_require__(139); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_25__functions_href__ = __webpack_require__(140); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_26__functions_mathchoice__ = __webpack_require__(141); - -/** Include this to ensure that all functions are defined. */ - - - - -// WARNING: New functions should be added to src/functions and imported here. - -var functions = __WEBPACK_IMPORTED_MODULE_2__defineFunction__["a" /* _functions */]; -/* harmony default export */ __webpack_exports__["a"] = (functions); - -// Define a convenience function that mimcs the old semantics of defineFunction -// to support existing code so that we can migrate it a little bit at a time. -var defineFunction = function defineFunction(names, props, handler) // null only if handled in parser -{ - Object(__WEBPACK_IMPORTED_MODULE_2__defineFunction__["b" /* default */])({ names: names, props: props, handler: handler }); -}; - -// TODO(kevinb): have functions return an object and call defineFunction with -// that object in this file instead of relying on side-effects. - - - - - - - - - - - - - - - - - - -// Math class commands except \mathop -defineFunction(["\\mathord", "\\mathbin", "\\mathrel", "\\mathopen", "\\mathclose", "\\mathpunct", "\\mathinner"], { - numArgs: 1 -}, function (context, args) { - var body = args[0]; - return { - type: "mclass", - mclass: "m" + context.funcName.substr(5), - value: Object(__WEBPACK_IMPORTED_MODULE_2__defineFunction__["c" /* ordargument */])(body) - }; -}); - -// Build a relation by placing one symbol on top of another -defineFunction(["\\stackrel"], { - numArgs: 2 -}, function (context, args) { - var top = args[0]; - var bottom = args[1]; - - var bottomop = new __WEBPACK_IMPORTED_MODULE_1__ParseNode__["a" /* default */]("op", { - type: "op", - limits: true, - alwaysHandleSupSub: true, - symbol: false, - value: Object(__WEBPACK_IMPORTED_MODULE_2__defineFunction__["c" /* ordargument */])(bottom) - }, bottom.mode); - - var supsub = new __WEBPACK_IMPORTED_MODULE_1__ParseNode__["a" /* default */]("supsub", { - base: bottomop, - sup: top, - sub: null - }, top.mode); - - return { - type: "mclass", - mclass: "mrel", - value: [supsub] - }; -}); - - - -var singleCharIntegrals = { - "\u222B": "\\int", - "\u222C": "\\iint", - "\u222D": "\\iiint", - "\u222E": "\\oint" -}; - -// There are 2 flags for operators; whether they produce limits in -// displaystyle, and whether they are symbols and should grow in -// displaystyle. These four groups cover the four possible choices. - -// No limits, not symbols -defineFunction(["\\arcsin", "\\arccos", "\\arctan", "\\arctg", "\\arcctg", "\\arg", "\\ch", "\\cos", "\\cosec", "\\cosh", "\\cot", "\\cotg", "\\coth", "\\csc", "\\ctg", "\\cth", "\\deg", "\\dim", "\\exp", "\\hom", "\\ker", "\\lg", "\\ln", "\\log", "\\sec", "\\sin", "\\sinh", "\\sh", "\\tan", "\\tanh", "\\tg", "\\th"], { - numArgs: 0 -}, function (context) { - return { - type: "op", - limits: false, - symbol: false, - body: context.funcName - }; -}); - -// Limits, not symbols -defineFunction(["\\det", "\\gcd", "\\inf", "\\lim", "\\max", "\\min", "\\Pr", "\\sup"], { - numArgs: 0 -}, function (context) { - return { - type: "op", - limits: true, - symbol: false, - body: context.funcName - }; -}); - -// No limits, symbols -defineFunction(["\\int", "\\iint", "\\iiint", "\\oint", "\u222B", "\u222C", "\u222D", "\u222E"], { - numArgs: 0 -}, function (context) { - var fName = context.funcName; - if (fName.length === 1) { - fName = singleCharIntegrals[fName]; - } - return { - type: "op", - limits: false, - symbol: true, - body: fName - }; -}); - - - - - - - - - - - - - - - - - - - - - -// Horizontal stretchy braces -defineFunction(["\\overbrace", "\\underbrace"], { - numArgs: 1 -}, function (context, args) { - var base = args[0]; - return { - type: "horizBrace", - label: context.funcName, - isOver: /^\\over/.test(context.funcName), - base: base - }; -}); - -// Stretchy accents under the body - - -// Stretchy arrows with an optional argument -defineFunction(["\\xleftarrow", "\\xrightarrow", "\\xLeftarrow", "\\xRightarrow", "\\xleftrightarrow", "\\xLeftrightarrow", "\\xhookleftarrow", "\\xhookrightarrow", "\\xmapsto", "\\xrightharpoondown", "\\xrightharpoonup", "\\xleftharpoondown", "\\xleftharpoonup", "\\xrightleftharpoons", "\\xleftrightharpoons", "\\xlongequal", "\\xtwoheadrightarrow", "\\xtwoheadleftarrow", "\\xtofrom", -// The next 3 functions are here to support the mhchem extension. -// Direct use of these functions is discouraged and may break someday. -"\\xrightleftarrows", "\\xrightequilibrium", "\\xleftequilibrium"], { - numArgs: 1, - numOptionalArgs: 1 -}, function (context, args, optArgs) { - var below = optArgs[0]; - var body = args[0]; - return { - type: "xArrow", // x for extensible - label: context.funcName, - body: body, - below: below - }; -}); - -// Infix generalized fractions -defineFunction(["\\over", "\\choose", "\\atop"], { - numArgs: 0, - infix: true -}, function (context) { - var replaceWith = void 0; - switch (context.funcName) { - case "\\over": - replaceWith = "\\frac"; - break; - case "\\choose": - replaceWith = "\\binom"; - break; - case "\\atop": - replaceWith = "\\\\atopfrac"; - break; - default: - throw new Error("Unrecognized infix genfrac command"); - } - return { - type: "infix", - replaceWith: replaceWith, - token: context.token - }; -}); - -// Row breaks for aligned data -defineFunction(["\\\\", "\\cr"], { - numArgs: 0, - numOptionalArgs: 1, - argTypes: ["size"] -}, function (context, args, optArgs) { - var size = optArgs[0]; - return { - type: "cr", - size: size - }; -}); - -// Environment delimiters -defineFunction(["\\begin", "\\end"], { - numArgs: 1, - argTypes: ["text"] -}, function (context, args) { - var nameGroup = args[0]; - if (nameGroup.type !== "ordgroup") { - throw new __WEBPACK_IMPORTED_MODULE_0__ParseError__["a" /* default */]("Invalid environment name", nameGroup); - } - var name = ""; - for (var i = 0; i < nameGroup.value.length; ++i) { - name += nameGroup.value[i].value; - } - return { - type: "environment", - name: name, - nameGroup: nameGroup - }; -}); - -// Box manipulation -defineFunction(["\\raisebox"], { - numArgs: 2, - argTypes: ["size", "text"], - allowedInText: true -}, function (context, args) { - var amount = args[0]; - var body = args[1]; - return { - type: "raisebox", - dy: amount, - body: body, - value: Object(__WEBPACK_IMPORTED_MODULE_2__defineFunction__["c" /* ordargument */])(body) - }; -}); - - - -// Hyperlinks - - -// MathChoice - - -/***/ }), -/* 116 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__defineFunction__ = __webpack_require__(3); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__domTree__ = __webpack_require__(12); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__mathMLTree__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__delimiter__ = __webpack_require__(44); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__Style__ = __webpack_require__(9); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__buildHTML__ = __webpack_require__(4); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__buildMathML__ = __webpack_require__(2); - - - - - - - - - - -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "sqrt", - names: ["\\sqrt"], - props: { - numArgs: 1, - numOptionalArgs: 1 - }, - handler: function handler(context, args, optArgs) { - var index = optArgs[0]; - var body = args[0]; - return { - type: "sqrt", - body: body, - index: index - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - // Square roots are handled in the TeXbook pg. 443, Rule 11. - - // First, we do the same steps as in overline to build the inner group - // and line - var inner = __WEBPACK_IMPORTED_MODULE_6__buildHTML__["b" /* buildGroup */](group.value.body, options.havingCrampedStyle()); - if (inner.height === 0) { - // Render a small surd. - inner.height = options.fontMetrics().xHeight; - } - - // Some groups can return document fragments. Handle those by wrapping - // them in a span. - if (inner instanceof __WEBPACK_IMPORTED_MODULE_2__domTree__["a" /* default */].documentFragment) { - inner = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan([], [inner], options); - } - - // Calculate the minimum size for the \surd delimiter - var metrics = options.fontMetrics(); - var theta = metrics.defaultRuleThickness; - - var phi = theta; - if (options.style.id < __WEBPACK_IMPORTED_MODULE_5__Style__["a" /* default */].TEXT.id) { - phi = options.fontMetrics().xHeight; - } - - // Calculate the clearance between the body and line - var lineClearance = theta + phi / 4; - - var minDelimiterHeight = (inner.height + inner.depth + lineClearance + theta) * options.sizeMultiplier; - - // Create a sqrt SVG of the required minimum size - - var _delimiter$sqrtImage = __WEBPACK_IMPORTED_MODULE_4__delimiter__["a" /* default */].sqrtImage(minDelimiterHeight, options), - img = _delimiter$sqrtImage.span, - ruleWidth = _delimiter$sqrtImage.ruleWidth; - - var delimDepth = img.height - ruleWidth; - - // Adjust the clearance based on the delimiter size - if (delimDepth > inner.height + inner.depth + lineClearance) { - lineClearance = (lineClearance + delimDepth - inner.height - inner.depth) / 2; - } - - // Shift the sqrt image - var imgShift = img.height - inner.height - lineClearance - ruleWidth; - - inner.style.paddingLeft = img.advanceWidth + "em"; - - // Overlay the image and the argument. - var body = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeVList({ - positionType: "firstBaseline", - children: [{ type: "elem", elem: inner, wrapperClasses: ["svg-align"] }, { type: "kern", size: -(inner.height + imgShift) }, { type: "elem", elem: img }, { type: "kern", size: ruleWidth }] - }, options); - - if (!group.value.index) { - return __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mord", "sqrt"], [body], options); - } else { - // Handle the optional root index - - // The index is always in scriptscript style - var newOptions = options.havingStyle(__WEBPACK_IMPORTED_MODULE_5__Style__["a" /* default */].SCRIPTSCRIPT); - var rootm = __WEBPACK_IMPORTED_MODULE_6__buildHTML__["b" /* buildGroup */](group.value.index, newOptions, options); - - // The amount the index is shifted by. This is taken from the TeX - // source, in the definition of `\r@@t`. - var toShift = 0.6 * (body.height - body.depth); - - // Build a VList with the superscript shifted up correctly - var rootVList = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeVList({ - positionType: "shift", - positionData: -toShift, - children: [{ type: "elem", elem: rootm }] - }, options); - // Add a class surrounding it so we can add on the appropriate - // kerning - var rootVListWrap = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["root"], [rootVList]); - - return __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mord", "sqrt"], [rootVListWrap, body], options); - } - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var node = void 0; - if (group.value.index) { - node = new __WEBPACK_IMPORTED_MODULE_3__mathMLTree__["a" /* default */].MathNode("mroot", [__WEBPACK_IMPORTED_MODULE_7__buildMathML__["b" /* buildGroup */](group.value.body, options), __WEBPACK_IMPORTED_MODULE_7__buildMathML__["b" /* buildGroup */](group.value.index, options)]); - } else { - node = new __WEBPACK_IMPORTED_MODULE_3__mathMLTree__["a" /* default */].MathNode("msqrt", [__WEBPACK_IMPORTED_MODULE_7__buildMathML__["b" /* buildGroup */](group.value.body, options)]); - } - - return node; - } -}); - -/***/ }), -/* 117 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__defineFunction__ = __webpack_require__(3); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__mathMLTree__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__ParseError__ = __webpack_require__(6); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__buildHTML__ = __webpack_require__(4); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__buildMathML__ = __webpack_require__(2); - - - - - - - - -var htmlBuilder = function htmlBuilder(group, options) { - var elements = __WEBPACK_IMPORTED_MODULE_4__buildHTML__["a" /* buildExpression */](group.value.value, options.withColor(group.value.color), false); - - // \color isn't supposed to affect the type of the elements it contains. - // To accomplish this, we wrap the results in a fragment, so the inner - // elements will be able to directly interact with their neighbors. For - // example, `\color{red}{2 +} 3` has the same spacing as `2 + 3` - return new __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeFragment(elements); -}; - -var mathmlBuilder = function mathmlBuilder(group, options) { - var inner = __WEBPACK_IMPORTED_MODULE_5__buildMathML__["a" /* buildExpression */](group.value.value, options); - - var node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mstyle", inner); - - node.setAttribute("mathcolor", group.value.color); - - return node; -}; - -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "color", - names: ["\\textcolor"], - props: { - numArgs: 2, - allowedInText: true, - greediness: 3, - argTypes: ["color", "original"] - }, - handler: function handler(context, args) { - var color = args[0]; - var body = args[1]; - return { - type: "color", - color: color.value, - value: Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["c" /* ordargument */])(body) - }; - }, - - htmlBuilder: htmlBuilder, - mathmlBuilder: mathmlBuilder -}); - -// TODO(kevinb): define these using macros -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "color", - names: ["\\blue", "\\orange", "\\pink", "\\red", "\\green", "\\gray", "\\purple", "\\blueA", "\\blueB", "\\blueC", "\\blueD", "\\blueE", "\\tealA", "\\tealB", "\\tealC", "\\tealD", "\\tealE", "\\greenA", "\\greenB", "\\greenC", "\\greenD", "\\greenE", "\\goldA", "\\goldB", "\\goldC", "\\goldD", "\\goldE", "\\redA", "\\redB", "\\redC", "\\redD", "\\redE", "\\maroonA", "\\maroonB", "\\maroonC", "\\maroonD", "\\maroonE", "\\purpleA", "\\purpleB", "\\purpleC", "\\purpleD", "\\purpleE", "\\mintA", "\\mintB", "\\mintC", "\\grayA", "\\grayB", "\\grayC", "\\grayD", "\\grayE", "\\grayF", "\\grayG", "\\grayH", "\\grayI", "\\kaBlue", "\\kaGreen"], - props: { - numArgs: 1, - allowedInText: true, - greediness: 3 - }, - handler: function handler(context, args) { - var body = args[0]; - return { - type: "color", - color: "katex-" + context.funcName.slice(1), - value: Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["c" /* ordargument */])(body) - }; - }, - - htmlBuilder: htmlBuilder, - mathmlBuilder: mathmlBuilder -}); - -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "color", - names: ["\\color"], - props: { - numArgs: 1, - allowedInText: true, - greediness: 3, - argTypes: ["color"] - }, - handler: function handler(context, args) { - var parser = context.parser, - breakOnTokenText = context.breakOnTokenText; - - - var color = args[0]; - if (!color) { - throw new __WEBPACK_IMPORTED_MODULE_3__ParseError__["a" /* default */]("\\color not followed by color"); - } - - // If we see a styling function, parse out the implicit body - var body = parser.parseExpression(true, breakOnTokenText); - - return { - type: "color", - color: color.value, - value: body - }; - }, - - htmlBuilder: htmlBuilder, - mathmlBuilder: mathmlBuilder -}); - -/***/ }), -/* 118 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__defineFunction__ = __webpack_require__(3); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__mathMLTree__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__buildHTML__ = __webpack_require__(4); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__buildMathML__ = __webpack_require__(2); - - - - - - - -// Non-mathy text, possibly in a font -var textFontFamilies = { - "\\text": undefined, "\\textrm": "textrm", "\\textsf": "textsf", - "\\texttt": "texttt", "\\textnormal": "textrm" -}; - -var textFontWeights = { - "\\textbf": "textbf" -}; - -var textFontShapes = { - "\\textit": "textit" -}; - -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "text", - names: [ - // Font families - "\\text", "\\textrm", "\\textsf", "\\texttt", "\\textnormal", - // Font weights - "\\textbf", - // Font Shapes - "\\textit"], - props: { - numArgs: 1, - argTypes: ["text"], - greediness: 2, - allowedInText: true - }, - handler: function handler(context, args) { - var body = args[0]; - return { - type: "text", - body: Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["c" /* ordargument */])(body), - font: context.funcName - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - var font = group.value.font; - // Checks if the argument is a font family or a font style. - var newOptions = void 0; - if (textFontFamilies[font]) { - newOptions = options.withFontFamily(textFontFamilies[font]); - } else if (textFontWeights[font]) { - newOptions = options.withFontWeight(textFontWeights[font]); - } else { - newOptions = options.withFontShape(textFontShapes[font]); - } - var inner = __WEBPACK_IMPORTED_MODULE_3__buildHTML__["a" /* buildExpression */](group.value.body, newOptions, true); - __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].tryCombineChars(inner); - return __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mord", "text"], inner, newOptions); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var body = group.value.body; - - // Convert each element of the body into MathML, and combine consecutive - // outputs into a single tag. In this way, we don't - // nest non-text items (e.g., $nested-math$) within an . - var inner = []; - var currentText = null; - for (var i = 0; i < body.length; i++) { - var _group = __WEBPACK_IMPORTED_MODULE_4__buildMathML__["b" /* buildGroup */](body[i], options); - if (_group.type === 'mtext' && currentText != null) { - Array.prototype.push.apply(currentText.children, _group.children); - } else { - inner.push(_group); - if (_group.type === 'mtext') { - currentText = _group; - } - } - } - - // If there is a single tag in the end (presumably ), - // just return it. Otherwise, wrap them in an . - if (inner.length === 1) { - return inner[0]; - } else { - return new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mrow", inner); - } - } -}); - -/***/ }), -/* 119 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__defineFunction__ = __webpack_require__(3); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__mathMLTree__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__utils__ = __webpack_require__(5); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__stretchy__ = __webpack_require__(13); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__buildHTML__ = __webpack_require__(4); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__buildMathML__ = __webpack_require__(2); - - - - - - - - - -var htmlBuilder = function htmlBuilder(group, options) { - // \cancel, \bcancel, \xcancel, \sout, \fbox, \colorbox, \fcolorbox - var inner = __WEBPACK_IMPORTED_MODULE_5__buildHTML__["b" /* buildGroup */](group.value.body, options); - - var label = group.value.label.substr(1); - var scale = options.sizeMultiplier; - var img = void 0; - var imgShift = 0; - var isColorbox = /color/.test(label); - - if (label === "sout") { - img = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["stretchy", "sout"]); - img.height = options.fontMetrics().defaultRuleThickness / scale; - imgShift = -0.5 * options.fontMetrics().xHeight; - } else { - // Add horizontal padding - inner.classes.push(/cancel/.test(label) ? "cancel-pad" : "boxpad"); - - // Add vertical padding - var vertPad = 0; - // ref: LaTeX source2e: \fboxsep = 3pt; \fboxrule = .4pt - // ref: cancel package: \advance\totalheight2\p@ % "+2" - if (/box/.test(label)) { - vertPad = label === "colorbox" ? 0.3 : 0.34; - } else { - vertPad = __WEBPACK_IMPORTED_MODULE_3__utils__["a" /* default */].isCharacterBox(group.value.body) ? 0.2 : 0; - } - - img = __WEBPACK_IMPORTED_MODULE_4__stretchy__["a" /* default */].encloseSpan(inner, label, vertPad, options); - imgShift = inner.depth + vertPad; - - if (isColorbox) { - img.style.backgroundColor = group.value.backgroundColor.value; - if (label === "fcolorbox") { - img.style.borderColor = group.value.borderColor.value; - } - } - } - - var vlist = void 0; - if (isColorbox) { - vlist = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeVList({ - positionType: "individualShift", - children: [ - // Put the color background behind inner; - { type: "elem", elem: img, shift: imgShift }, { type: "elem", elem: inner, shift: 0 }] - }, options); - } else { - vlist = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeVList({ - positionType: "individualShift", - children: [ - // Write the \cancel stroke on top of inner. - { - type: "elem", - elem: inner, - shift: 0 - }, { - type: "elem", - elem: img, - shift: imgShift, - wrapperClasses: /cancel/.test(label) ? ["svg-align"] : [] - }] - }, options); - } - - if (/cancel/.test(label)) { - // cancel does not create horiz space for its line extension. - // That is, not when adjacent to a mord. - return __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mord", "cancel-lap"], [vlist], options); - } else { - return __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mord"], [vlist], options); - } -}; - -var mathmlBuilder = function mathmlBuilder(group, options) { - var node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("menclose", [__WEBPACK_IMPORTED_MODULE_6__buildMathML__["b" /* buildGroup */](group.value.body, options)]); - switch (group.value.label) { - case "\\cancel": - node.setAttribute("notation", "updiagonalstrike"); - break; - case "\\bcancel": - node.setAttribute("notation", "downdiagonalstrike"); - break; - case "\\sout": - node.setAttribute("notation", "horizontalstrike"); - break; - case "\\fbox": - node.setAttribute("notation", "box"); - break; - case "\\colorbox": - node.setAttribute("mathbackground", group.value.backgroundColor.value); - break; - case "\\fcolorbox": - node.setAttribute("mathbackground", group.value.backgroundColor.value); - // TODO(ron): I don't know any way to set the border color. - node.setAttribute("notation", "box"); - break; - default: - // xcancel - node.setAttribute("notation", "updiagonalstrike downdiagonalstrike"); - } - return node; -}; - -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "enclose", - names: ["\\colorbox"], - props: { - numArgs: 2, - allowedInText: true, - greediness: 3, - argTypes: ["color", "text"] - }, - handler: function handler(context, args, optArgs) { - var color = args[0]; - var body = args[1]; - return { - type: "enclose", - label: context.funcName, - backgroundColor: color, - body: body - }; - }, - - htmlBuilder: htmlBuilder, - mathmlBuilder: mathmlBuilder -}); - -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "enclose", - names: ["\\fcolorbox"], - props: { - numArgs: 3, - allowedInText: true, - greediness: 3, - argTypes: ["color", "color", "text"] - }, - handler: function handler(context, args, optArgs) { - var borderColor = args[0]; - var backgroundColor = args[1]; - var body = args[2]; - return { - type: "enclose", - label: context.funcName, - backgroundColor: backgroundColor, - borderColor: borderColor, - body: body - }; - }, - - htmlBuilder: htmlBuilder, - mathmlBuilder: mathmlBuilder -}); - -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "enclose", - names: ["\\cancel", "\\bcancel", "\\xcancel", "\\sout", "\\fbox"], - props: { - numArgs: 1 - }, - handler: function handler(context, args, optArgs) { - var body = args[0]; - return { - type: "enclose", - label: context.funcName, - body: body - }; - }, - - htmlBuilder: htmlBuilder, - mathmlBuilder: mathmlBuilder -}); - -/***/ }), -/* 120 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__defineFunction__ = __webpack_require__(3); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__mathMLTree__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__buildHTML__ = __webpack_require__(4); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__buildMathML__ = __webpack_require__(2); - - - - - - - -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "overline", - names: ["\\overline"], - props: { - numArgs: 1 - }, - handler: function handler(context, args) { - var body = args[0]; - return { - type: "overline", - body: body - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - // Overlines are handled in the TeXbook pg 443, Rule 9. - - // Build the inner group in the cramped style. - var innerGroup = __WEBPACK_IMPORTED_MODULE_3__buildHTML__["b" /* buildGroup */](group.value.body, options.havingCrampedStyle()); - - // Create the line above the body - var line = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeLineSpan("overline-line", options); - - // Generate the vlist, with the appropriate kerns - var vlist = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeVList({ - positionType: "firstBaseline", - children: [{ type: "elem", elem: innerGroup }, - // The kern on the next line would ordinarily be 3 * line.height - // But we put the line into a span that is 5 lines tall, to - // overcome a Chrome rendering issue. The SVG has a space in - // the bottom that is 2 lines high. That and the 1-line-high - // kern sum up to the same distance as the old 3 line kern. - { type: "kern", size: line.height }, { type: "elem", elem: line }] - }, options); - - return __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mord", "overline"], [vlist], options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var operator = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mo", [new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].TextNode("\u203E")]); - operator.setAttribute("stretchy", "true"); - - var node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mover", [__WEBPACK_IMPORTED_MODULE_4__buildMathML__["b" /* buildGroup */](group.value.body, options), operator]); - node.setAttribute("accent", "true"); - - return node; - } -}); - -/***/ }), -/* 121 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__defineFunction__ = __webpack_require__(3); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__mathMLTree__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__buildHTML__ = __webpack_require__(4); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__buildMathML__ = __webpack_require__(2); - - - - - - - -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "underline", - names: ["\\underline"], - props: { - numArgs: 1, - allowedInText: true - }, - handler: function handler(context, args) { - var body = args[0]; - return { - type: "underline", - body: body - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - // Underlines are handled in the TeXbook pg 443, Rule 10. - // Build the inner group. - var innerGroup = __WEBPACK_IMPORTED_MODULE_3__buildHTML__["b" /* buildGroup */](group.value.body, options); - - // Create the line to go below the body - var line = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeLineSpan("underline-line", options); - - // Generate the vlist, with the appropriate kerns - var vlist = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeVList({ - positionType: "top", - positionData: innerGroup.height, - children: [ - // The SVG image is 5x as tall as the line. - // The bottom 2/5 of the image is blank and acts like a kern. - // So we omit the kern that would otherwise go at the bottom. - { type: "elem", elem: line }, { type: "kern", size: 5 * line.height }, { type: "elem", elem: innerGroup }] - }, options); - - return __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mord", "underline"], [vlist], options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var operator = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mo", [new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].TextNode("\u203E")]); - operator.setAttribute("stretchy", "true"); - - var node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("munder", [__WEBPACK_IMPORTED_MODULE_4__buildMathML__["b" /* buildGroup */](group.value.body, options), operator]); - node.setAttribute("accentunder", "true"); - - return node; - } -}); - -/***/ }), -/* 122 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__defineFunction__ = __webpack_require__(3); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__mathMLTree__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__units__ = __webpack_require__(19); - - - - - -Object(__WEBPACK_IMPORTED_MODULE_1__defineFunction__["b" /* default */])({ - type: "rule", - names: ["\\rule"], - props: { - numArgs: 2, - numOptionalArgs: 1, - argTypes: ["size", "size", "size"] - }, - handler: function handler(context, args, optArgs) { - var shift = optArgs[0]; - var width = args[0]; - var height = args[1]; - return { - type: "rule", - shift: shift && shift.value, - width: width.value, - height: height.value - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - // Make an empty span for the rule - var rule = __WEBPACK_IMPORTED_MODULE_0__buildCommon__["a" /* default */].makeSpan(["mord", "rule"], [], options); - - // Calculate the shift, width, and height of the rule, and account for units - var shift = 0; - if (group.value.shift) { - shift = Object(__WEBPACK_IMPORTED_MODULE_3__units__["a" /* calculateSize */])(group.value.shift, options); - } - - var width = Object(__WEBPACK_IMPORTED_MODULE_3__units__["a" /* calculateSize */])(group.value.width, options); - var height = Object(__WEBPACK_IMPORTED_MODULE_3__units__["a" /* calculateSize */])(group.value.height, options); - - // Style the rule to the right size - rule.style.borderRightWidth = width + "em"; - rule.style.borderTopWidth = height + "em"; - rule.style.bottom = shift + "em"; - - // Record the height and width - rule.width = width; - rule.height = height + shift; - rule.depth = -shift; - // Font size is the number large enough that the browser will - // reserve at least `absHeight` space above the baseline. - // The 1.125 factor was empirically determined - rule.maxFontSize = height * 1.125 * options.sizeMultiplier; - - return rule; - }, - mathmlBuilder: function mathmlBuilder(group, options) { - // TODO(emily): Figure out if there's an actual way to draw black boxes - // in MathML. - var node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mrow"); - - return node; - } -}); - -/***/ }), -/* 123 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__defineFunction__ = __webpack_require__(3); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__mathMLTree__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__units__ = __webpack_require__(19); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__ParseError__ = __webpack_require__(6); - -/* eslint no-console:0 */ -// Horizontal spacing commands - - - - - - - -// TODO: \hskip and \mskip should support plus and minus in lengths - -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "kern", - names: ["\\kern", "\\mkern", "\\hskip", "\\mskip"], - props: { - numArgs: 1, - argTypes: ["size"], - allowedInText: true - }, - handler: function handler(context, args) { - var mathFunction = context.funcName[1] === 'm'; // \mkern, \mskip - var muUnit = args[0].value.unit === 'mu'; - if (mathFunction) { - if (!muUnit) { - typeof console !== "undefined" && console.warn("In LaTeX, " + context.funcName + " supports only mu units, " + ("not " + args[0].value.unit + " units")); - } - if (context.parser.mode !== "math") { - throw new __WEBPACK_IMPORTED_MODULE_4__ParseError__["a" /* default */]("Can't use function '" + context.funcName + "' in text mode"); - } - } else { - // !mathFunction - if (muUnit) { - typeof console !== "undefined" && console.warn("In LaTeX, " + context.funcName + " does not support mu units"); - } - } - return { - type: "kern", - dimension: args[0].value - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - return __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeGlue(group.value.dimension, options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mspace"); - - var dimension = Object(__WEBPACK_IMPORTED_MODULE_3__units__["a" /* calculateSize */])(group.value.dimension, options); - node.setAttribute("width", dimension + "em"); - - return node; - } -}); - -/***/ }), -/* 124 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__defineFunction__ = __webpack_require__(3); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__mathMLTree__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__buildHTML__ = __webpack_require__(4); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__buildMathML__ = __webpack_require__(2); - - - - - - - -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "phantom", - names: ["\\phantom"], - props: { - numArgs: 1 - }, - handler: function handler(context, args) { - var body = args[0]; - return { - type: "phantom", - value: Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["c" /* ordargument */])(body) - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - var elements = __WEBPACK_IMPORTED_MODULE_3__buildHTML__["a" /* buildExpression */](group.value.value, options.withPhantom(), false); - - // \phantom isn't supposed to affect the elements it contains. - // See "color" for more details. - return new __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeFragment(elements); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var inner = __WEBPACK_IMPORTED_MODULE_4__buildMathML__["a" /* buildExpression */](group.value.value, options); - return new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mphantom", inner); - } -}); - -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "hphantom", - names: ["\\hphantom"], - props: { - numArgs: 1 - }, - handler: function handler(context, args) { - var body = args[0]; - return { - type: "hphantom", - value: Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["c" /* ordargument */])(body), - body: body - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - var node = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan([], [__WEBPACK_IMPORTED_MODULE_3__buildHTML__["b" /* buildGroup */](group.value.body, options.withPhantom())]); - node.height = 0; - node.depth = 0; - if (node.children) { - for (var i = 0; i < node.children.length; i++) { - node.children[i].height = 0; - node.children[i].depth = 0; - } - } - - // See smash for comment re: use of makeVList - node = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeVList({ - positionType: "firstBaseline", - children: [{ type: "elem", elem: node }] - }, options); - - return node; - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var inner = __WEBPACK_IMPORTED_MODULE_4__buildMathML__["a" /* buildExpression */](group.value.value, options); - var node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mphantom", inner); - node.setAttribute("height", "0px"); - return node; - } -}); - -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "vphantom", - names: ["\\vphantom"], - props: { - numArgs: 1 - }, - handler: function handler(context, args) { - var body = args[0]; - return { - type: "vphantom", - value: Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["c" /* ordargument */])(body), - body: body - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - var inner = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["inner"], [__WEBPACK_IMPORTED_MODULE_3__buildHTML__["b" /* buildGroup */](group.value.body, options.withPhantom())]); - var fix = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["fix"], []); - return __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mord", "rlap"], [inner, fix], options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var inner = __WEBPACK_IMPORTED_MODULE_4__buildMathML__["a" /* buildExpression */](group.value.value, options); - var node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mphantom", inner); - node.setAttribute("width", "0px"); - return node; - } -}); - -/***/ }), -/* 125 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__defineFunction__ = __webpack_require__(3); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__mathMLTree__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Style__ = __webpack_require__(9); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__buildHTML__ = __webpack_require__(4); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__buildMathML__ = __webpack_require__(2); - -// \mod-type functions - - - - - - - - -var htmlModBuilder = function htmlModBuilder(group, options) { - var inner = []; - - if (group.value.modType === "bmod") { - // “\nonscript\mskip-\medmuskip\mkern5mu”, where \medmuskip is - // 4mu plus 2mu minus 1mu, translates to 1mu space in - // display/textstyle and 5mu space in script/scriptscriptstyle. - if (!options.style.isTight()) { - inner.push(__WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mspace", "muspace"], [], options)); - } else { - inner.push(__WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mspace", "thickspace"], [], options)); - } - } else if (options.style.size === __WEBPACK_IMPORTED_MODULE_3__Style__["a" /* default */].DISPLAY.size) { - inner.push(__WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mspace", "quad"], [], options)); - } else if (group.value.modType === "mod") { - inner.push(__WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mspace", "twelvemuspace"], [], options)); - } else { - inner.push(__WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mspace", "eightmuspace"], [], options)); - } - - if (group.value.modType === "pod" || group.value.modType === "pmod") { - inner.push(__WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].mathsym("(", group.mode)); - } - - if (group.value.modType !== "pod") { - var modInner = [__WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].mathsym("m", group.mode), __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].mathsym("o", group.mode), __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].mathsym("d", group.mode)]; - if (group.value.modType === "bmod") { - inner.push(__WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mbin"], modInner, options)); - // “\mkern5mu\nonscript\mskip-\medmuskip” as above - if (!options.style.isTight()) { - inner.push(__WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mspace", "muspace"], [], options)); - } else { - inner.push(__WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mspace", "thickspace"], [], options)); - } - } else { - Array.prototype.push.apply(inner, modInner); - inner.push(__WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mspace", "sixmuspace"], [], options)); - } - } - - if (group.value.value) { - Array.prototype.push.apply(inner, __WEBPACK_IMPORTED_MODULE_4__buildHTML__["a" /* buildExpression */](group.value.value, options, false)); - } - - if (group.value.modType === "pod" || group.value.modType === "pmod") { - inner.push(__WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].mathsym(")", group.mode)); - } - - return __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeFragment(inner); -}; - -var mmlModBuilder = function mmlModBuilder(group, options) { - var inner = []; - - if (group.value.modType === "pod" || group.value.modType === "pmod") { - inner.push(new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mo", [__WEBPACK_IMPORTED_MODULE_5__buildMathML__["e" /* makeText */]("(", group.mode)])); - } - if (group.value.modType !== "pod") { - inner.push(new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mo", [__WEBPACK_IMPORTED_MODULE_5__buildMathML__["e" /* makeText */]("mod", group.mode)])); - } - if (group.value.value) { - var space = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mspace"); - space.setAttribute("width", "0.333333em"); - inner.push(space); - inner = inner.concat(__WEBPACK_IMPORTED_MODULE_5__buildMathML__["a" /* buildExpression */](group.value.value, options)); - } - if (group.value.modType === "pod" || group.value.modType === "pmod") { - inner.push(new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mo", [__WEBPACK_IMPORTED_MODULE_5__buildMathML__["e" /* makeText */](")", group.mode)])); - } - - return new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mo", inner); -}; - -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "mod", - names: ["\\bmod"], - props: { - numArgs: 0 - }, - handler: function handler(context, args) { - return { - type: "mod", - modType: "bmod", - value: null - }; - }, - htmlBuilder: htmlModBuilder, - mathmlBuilder: mmlModBuilder -}); - -// Note: calling defineFunction with a type that's already been defined only -// works because the same htmlBuilder and mathmlBuilder are being used. -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "mod", - names: ["\\pod", "\\pmod", "\\mod"], - props: { - numArgs: 1 - }, - handler: function handler(context, args) { - var body = args[0]; - return { - type: "mod", - modType: context.funcName.substr(1), - value: Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["c" /* ordargument */])(body) - }; - }, - htmlBuilder: htmlModBuilder, - mathmlBuilder: mmlModBuilder -}); - -/***/ }), -/* 126 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__defineFunction__ = __webpack_require__(3); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__domTree__ = __webpack_require__(12); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__mathMLTree__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__utils__ = __webpack_require__(5); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__Style__ = __webpack_require__(9); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__buildHTML__ = __webpack_require__(4); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__buildMathML__ = __webpack_require__(2); - -// Limits, symbols - - - - - - - - - - -var htmlBuilder = function htmlBuilder(group, options) { - // Operators are handled in the TeXbook pg. 443-444, rule 13(a). - var supGroup = void 0; - var subGroup = void 0; - var hasLimits = false; - if (group.type === "supsub") { - // If we have limits, supsub will pass us its group to handle. Pull - // out the superscript and subscript and set the group to the op in - // its base. - supGroup = group.value.sup; - subGroup = group.value.sub; - group = group.value.base; - hasLimits = true; - } - - var style = options.style; - - // Most operators have a large successor symbol, but these don't. - var noSuccessor = ["\\smallint"]; - - var large = false; - if (style.size === __WEBPACK_IMPORTED_MODULE_5__Style__["a" /* default */].DISPLAY.size && group.value.symbol && !__WEBPACK_IMPORTED_MODULE_4__utils__["a" /* default */].contains(noSuccessor, group.value.body)) { - - // Most symbol operators get larger in displaystyle (rule 13) - large = true; - } - - var base = void 0; - if (group.value.symbol) { - // If this is a symbol, create the symbol. - var fontName = large ? "Size2-Regular" : "Size1-Regular"; - base = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSymbol(group.value.body, fontName, "math", options, ["mop", "op-symbol", large ? "large-op" : "small-op"]); - } else if (group.value.value) { - // If this is a list, compose that list. - var inner = __WEBPACK_IMPORTED_MODULE_6__buildHTML__["a" /* buildExpression */](group.value.value, options, true); - if (inner.length === 1 && inner[0] instanceof __WEBPACK_IMPORTED_MODULE_2__domTree__["a" /* default */].symbolNode) { - base = inner[0]; - base.classes[0] = "mop"; // replace old mclass - } else { - base = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mop"], inner, options); - } - } else { - // Otherwise, this is a text operator. Build the text from the - // operator's name. - // TODO(emily): Add a space in the middle of some of these - // operators, like \limsup - var output = []; - for (var i = 1; i < group.value.body.length; i++) { - output.push(__WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].mathsym(group.value.body[i], group.mode)); - } - base = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mop"], output, options); - } - - // If content of op is a single symbol, shift it vertically. - var baseShift = 0; - var slant = 0; - if (base instanceof __WEBPACK_IMPORTED_MODULE_2__domTree__["a" /* default */].symbolNode) { - // Shift the symbol so its center lies on the axis (rule 13). It - // appears that our fonts have the centers of the symbols already - // almost on the axis, so these numbers are very small. Note we - // don't actually apply this here, but instead it is used either in - // the vlist creation or separately when there are no limits. - baseShift = (base.height - base.depth) / 2 - options.fontMetrics().axisHeight; - - // The slant of the symbol is just its italic correction. - slant = base.italic; - } - - if (hasLimits) { - // IE 8 clips \int if it is in a display: inline-block. We wrap it - // in a new span so it is an inline, and works. - base = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan([], [base]); - - var sub = void 0; - var sup = void 0; - // We manually have to handle the superscripts and subscripts. This, - // aside from the kern calculations, is copied from supsub. - if (supGroup) { - var elem = __WEBPACK_IMPORTED_MODULE_6__buildHTML__["b" /* buildGroup */](supGroup, options.havingStyle(style.sup()), options); - - sup = { - elem: elem, - kern: Math.max(options.fontMetrics().bigOpSpacing1, options.fontMetrics().bigOpSpacing3 - elem.depth) - }; - } - - if (subGroup) { - var _elem = __WEBPACK_IMPORTED_MODULE_6__buildHTML__["b" /* buildGroup */](subGroup, options.havingStyle(style.sub()), options); - - sub = { - elem: _elem, - kern: Math.max(options.fontMetrics().bigOpSpacing2, options.fontMetrics().bigOpSpacing4 - _elem.height) - }; - } - - // Build the final group as a vlist of the possible subscript, base, - // and possible superscript. - var finalGroup = void 0; - if (sup && sub) { - var bottom = options.fontMetrics().bigOpSpacing5 + sub.elem.height + sub.elem.depth + sub.kern + base.depth + baseShift; - - finalGroup = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeVList({ - positionType: "bottom", - positionData: bottom, - children: [{ type: "kern", size: options.fontMetrics().bigOpSpacing5 }, { type: "elem", elem: sub.elem, marginLeft: -slant + "em" }, { type: "kern", size: sub.kern }, { type: "elem", elem: base }, { type: "kern", size: sup.kern }, { type: "elem", elem: sup.elem, marginLeft: slant + "em" }, { type: "kern", size: options.fontMetrics().bigOpSpacing5 }] - }, options); - } else if (sub) { - var top = base.height - baseShift; - - // Shift the limits by the slant of the symbol. Note - // that we are supposed to shift the limits by 1/2 of the slant, - // but since we are centering the limits adding a full slant of - // margin will shift by 1/2 that. - finalGroup = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeVList({ - positionType: "top", - positionData: top, - children: [{ type: "kern", size: options.fontMetrics().bigOpSpacing5 }, { type: "elem", elem: sub.elem, marginLeft: -slant + "em" }, { type: "kern", size: sub.kern }, { type: "elem", elem: base }] - }, options); - } else if (sup) { - var _bottom = base.depth + baseShift; - - finalGroup = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeVList({ - positionType: "bottom", - positionData: _bottom, - children: [{ type: "elem", elem: base }, { type: "kern", size: sup.kern }, { type: "elem", elem: sup.elem, marginLeft: slant + "em" }, { type: "kern", size: options.fontMetrics().bigOpSpacing5 }] - }, options); - } else { - // This case probably shouldn't occur (this would mean the - // supsub was sending us a group with no superscript or - // subscript) but be safe. - return base; - } - - return __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mop", "op-limits"], [finalGroup], options); - } else { - if (baseShift) { - base.style.position = "relative"; - base.style.top = baseShift + "em"; - } - - return base; - } -}; - -var mathmlBuilder = function mathmlBuilder(group, options) { - var node = void 0; - - // TODO(emily): handle big operators using the `largeop` attribute - - if (group.value.symbol) { - // This is a symbol. Just add the symbol. - node = new __WEBPACK_IMPORTED_MODULE_3__mathMLTree__["a" /* default */].MathNode("mo", [__WEBPACK_IMPORTED_MODULE_7__buildMathML__["e" /* makeText */](group.value.body, group.mode)]); - } else if (group.value.value) { - // This is an operator with children. Add them. - node = new __WEBPACK_IMPORTED_MODULE_3__mathMLTree__["a" /* default */].MathNode("mo", __WEBPACK_IMPORTED_MODULE_7__buildMathML__["a" /* buildExpression */](group.value.value, options)); - } else { - // This is a text operator. Add all of the characters from the - // operator's name. - // TODO(emily): Add a space in the middle of some of these - // operators, like \limsup. - node = new __WEBPACK_IMPORTED_MODULE_3__mathMLTree__["a" /* default */].MathNode("mi", [new __WEBPACK_IMPORTED_MODULE_3__mathMLTree__["a" /* default */].TextNode(group.value.body.slice(1))]); - - // Append an . - // ref: https://www.w3.org/TR/REC-MathML/chap3_2.html#sec3.2.4 - var operator = new __WEBPACK_IMPORTED_MODULE_3__mathMLTree__["a" /* default */].MathNode("mo", [__WEBPACK_IMPORTED_MODULE_7__buildMathML__["e" /* makeText */]("\u2061", "text")]); - - return new __WEBPACK_IMPORTED_MODULE_2__domTree__["a" /* default */].documentFragment([node, operator]); - } - - return node; -}; - -var singleCharBigOps = { - "\u220F": "\\prod", - "\u2210": "\\coprod", - "\u2211": "\\sum", - "\u22C0": "\\bigwedge", - "\u22C1": "\\bigvee", - "\u22C2": "\\bigcap", - "\u22C3": "\\bigcap", - "\u2A00": "\\bigodot", - "\u2A01": "\\bigoplus", - "\u2A02": "\\bigotimes", - "\u2A04": "\\biguplus", - "\u2A06": "\\bigsqcup" -}; - -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "op", - names: ["\\coprod", "\\bigvee", "\\bigwedge", "\\biguplus", "\\bigcap", "\\bigcup", "\\intop", "\\prod", "\\sum", "\\bigotimes", "\\bigoplus", "\\bigodot", "\\bigsqcup", "\\smallint", "\u220F", "\u2210", "\u2211", "\u22C0", "\u22C1", "\u22C2", "\u22C3", "\u2A00", "\u2A01", "\u2A02", "\u2A04", "\u2A06"], - props: { - numArgs: 0 - }, - handler: function handler(context, args) { - var fName = context.funcName; - if (fName.length === 1) { - fName = singleCharBigOps[fName]; - } - return { - type: "op", - limits: true, - symbol: true, - body: fName - }; - }, - htmlBuilder: htmlBuilder, - mathmlBuilder: mathmlBuilder -}); - -// Note: calling defineFunction with a type that's already been defined only -// works because the same htmlBuilder and mathmlBuilder are being used. -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "op", - names: ["\\mathop"], - props: { - numArgs: 1 - }, - handler: function handler(context, args) { - var body = args[0]; - return { - type: "op", - limits: false, - symbol: false, - value: Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["c" /* ordargument */])(body) - }; - }, - htmlBuilder: htmlBuilder, - mathmlBuilder: mathmlBuilder -}); - -/***/ }), -/* 127 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_get_iterator__ = __webpack_require__(18); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_get_iterator___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_get_iterator__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__defineFunction__ = __webpack_require__(3); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__mathMLTree__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__domTree__ = __webpack_require__(12); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__buildHTML__ = __webpack_require__(4); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__buildMathML__ = __webpack_require__(2); - - - - - - - - - -// \operatorname -// amsopn.dtx: \mathop{#1\kern\z@\operator@font#3}\newmcodes@ -Object(__WEBPACK_IMPORTED_MODULE_1__defineFunction__["b" /* default */])({ - type: "operatorname", - names: ["\\operatorname"], - props: { - numArgs: 1 - }, - handler: function handler(context, args) { - var body = args[0]; - return { - type: "operatorname", - value: Object(__WEBPACK_IMPORTED_MODULE_1__defineFunction__["c" /* ordargument */])(body) - }; - }, - - htmlBuilder: function htmlBuilder(group, options) { - var output = []; - if (group.value.value.length > 0) { - var letter = ""; - var mode = ""; - - var _iteratorNormalCompletion = true; - var _didIteratorError = false; - var _iteratorError = undefined; - - try { - for (var _iterator = __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_get_iterator___default()(group.value.value), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { - var child = _step.value; - - // In the amsopn package, \newmcodes@ changes four - // characters, *-/:’, from math operators back into text. - if ("*-/:".indexOf(child.value) !== -1) { - child.type = "textord"; - } - } - - // Consolidate Greek letter function names into symbol characters. - } catch (err) { - _didIteratorError = true; - _iteratorError = err; - } finally { - try { - if (!_iteratorNormalCompletion && _iterator.return) { - _iterator.return(); - } - } finally { - if (_didIteratorError) { - throw _iteratorError; - } - } - } - - var temp = __WEBPACK_IMPORTED_MODULE_5__buildHTML__["a" /* buildExpression */](group.value.value, options.withFontFamily("mathrm"), true); - - // All we want from temp are the letters. With them, we'll - // create a text operator similar to \tan or \cos. - var _iteratorNormalCompletion2 = true; - var _didIteratorError2 = false; - var _iteratorError2 = undefined; - - try { - for (var _iterator2 = __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_get_iterator___default()(temp), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { - var _child = _step2.value; - - if (_child instanceof __WEBPACK_IMPORTED_MODULE_4__domTree__["a" /* default */].symbolNode) { - letter = _child.value; - - // In the amsopn package, \newmcodes@ changes four - // characters, *-/:’, from math operators back into text. - // Given what is in temp, we have to address two of them. - letter = letter.replace(/\u2212/, "-"); // minus => hyphen - letter = letter.replace(/\u2217/, "*"); - - // Use math mode for Greek letters - mode = /[\u0391-\u03D7]/.test(letter) ? "math" : "text"; - output.push(__WEBPACK_IMPORTED_MODULE_2__buildCommon__["a" /* default */].mathsym(letter, mode)); - } else { - output.push(_child); - } - } - } catch (err) { - _didIteratorError2 = true; - _iteratorError2 = err; - } finally { - try { - if (!_iteratorNormalCompletion2 && _iterator2.return) { - _iterator2.return(); - } - } finally { - if (_didIteratorError2) { - throw _iteratorError2; - } - } - } - } - return __WEBPACK_IMPORTED_MODULE_2__buildCommon__["a" /* default */].makeSpan(["mop"], output, options); - }, - - mathmlBuilder: function mathmlBuilder(group, options) { - // The steps taken here are similar to the html version. - var output = []; - if (group.value.value.length > 0) { - var temp = __WEBPACK_IMPORTED_MODULE_6__buildMathML__["a" /* buildExpression */](group.value.value, options.withFontFamily("mathrm")); - - var word = temp.map(function (node) { - return node.toText(); - }).join(""); - - word = word.replace(/\u2212/g, "-"); - word = word.replace(/\u2217/g, "*"); - output = [new __WEBPACK_IMPORTED_MODULE_3__mathMLTree__["a" /* default */].TextNode(word)]; - } - var identifier = new __WEBPACK_IMPORTED_MODULE_3__mathMLTree__["a" /* default */].MathNode("mi", output); - identifier.setAttribute("mathvariant", "normal"); - - // \u2061 is the same as ⁡ - // ref: https://www.w3schools.com/charsets/ref_html_entities_a.asp - var operator = new __WEBPACK_IMPORTED_MODULE_3__mathMLTree__["a" /* default */].MathNode("mo", [__WEBPACK_IMPORTED_MODULE_6__buildMathML__["e" /* makeText */]("\u2061", "text")]); - - return new __WEBPACK_IMPORTED_MODULE_4__domTree__["a" /* default */].documentFragment([identifier, operator]); - } -}); - -/***/ }), -/* 128 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__defineFunction__ = __webpack_require__(3); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__delimiter__ = __webpack_require__(44); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__mathMLTree__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__Style__ = __webpack_require__(9); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__buildHTML__ = __webpack_require__(4); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__buildMathML__ = __webpack_require__(2); - - - - - - - - - -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "genfrac", - names: ["\\dfrac", "\\frac", "\\tfrac", "\\dbinom", "\\binom", "\\tbinom", "\\\\atopfrac"], - props: { - numArgs: 2, - greediness: 2 - }, - handler: function handler(context, args) { - var numer = args[0]; - var denom = args[1]; - var hasBarLine = void 0; - var leftDelim = null; - var rightDelim = null; - var size = "auto"; - - switch (context.funcName) { - case "\\dfrac": - case "\\frac": - case "\\tfrac": - hasBarLine = true; - break; - case "\\\\atopfrac": - hasBarLine = false; - break; - case "\\dbinom": - case "\\binom": - case "\\tbinom": - hasBarLine = false; - leftDelim = "("; - rightDelim = ")"; - break; - default: - throw new Error("Unrecognized genfrac command"); - } - - switch (context.funcName) { - case "\\dfrac": - case "\\dbinom": - size = "display"; - break; - case "\\tfrac": - case "\\tbinom": - size = "text"; - break; - } - - return { - type: "genfrac", - numer: numer, - denom: denom, - hasBarLine: hasBarLine, - leftDelim: leftDelim, - rightDelim: rightDelim, - size: size - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - // Fractions are handled in the TeXbook on pages 444-445, rules 15(a-e). - // Figure out what style this fraction should be in based on the - // function used - var style = options.style; - if (group.value.size === "display") { - style = __WEBPACK_IMPORTED_MODULE_4__Style__["a" /* default */].DISPLAY; - } else if (group.value.size === "text") { - style = __WEBPACK_IMPORTED_MODULE_4__Style__["a" /* default */].TEXT; - } - - var nstyle = style.fracNum(); - var dstyle = style.fracDen(); - var newOptions = void 0; - - newOptions = options.havingStyle(nstyle); - var numerm = __WEBPACK_IMPORTED_MODULE_5__buildHTML__["b" /* buildGroup */](group.value.numer, newOptions, options); - - newOptions = options.havingStyle(dstyle); - var denomm = __WEBPACK_IMPORTED_MODULE_5__buildHTML__["b" /* buildGroup */](group.value.denom, newOptions, options); - - var rule = void 0; - var ruleWidth = void 0; - var ruleSpacing = void 0; - if (group.value.hasBarLine) { - rule = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeLineSpan("frac-line", options); - ruleWidth = rule.height; - ruleSpacing = rule.height; - } else { - rule = null; - ruleWidth = 0; - ruleSpacing = options.fontMetrics().defaultRuleThickness; - } - - // Rule 15b - var numShift = void 0; - var clearance = void 0; - var denomShift = void 0; - if (style.size === __WEBPACK_IMPORTED_MODULE_4__Style__["a" /* default */].DISPLAY.size) { - numShift = options.fontMetrics().num1; - if (ruleWidth > 0) { - clearance = 3 * ruleSpacing; - } else { - clearance = 7 * ruleSpacing; - } - denomShift = options.fontMetrics().denom1; - } else { - if (ruleWidth > 0) { - numShift = options.fontMetrics().num2; - clearance = ruleSpacing; - } else { - numShift = options.fontMetrics().num3; - clearance = 3 * ruleSpacing; - } - denomShift = options.fontMetrics().denom2; - } - - var frac = void 0; - if (!rule) { - // Rule 15c - var candidateClearance = numShift - numerm.depth - (denomm.height - denomShift); - if (candidateClearance < clearance) { - numShift += 0.5 * (clearance - candidateClearance); - denomShift += 0.5 * (clearance - candidateClearance); - } - - frac = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeVList({ - positionType: "individualShift", - children: [{ type: "elem", elem: denomm, shift: denomShift }, { type: "elem", elem: numerm, shift: -numShift }] - }, options); - } else { - // Rule 15d - var axisHeight = options.fontMetrics().axisHeight; - - if (numShift - numerm.depth - (axisHeight + 0.5 * ruleWidth) < clearance) { - numShift += clearance - (numShift - numerm.depth - (axisHeight + 0.5 * ruleWidth)); - } - - if (axisHeight - 0.5 * ruleWidth - (denomm.height - denomShift) < clearance) { - denomShift += clearance - (axisHeight - 0.5 * ruleWidth - (denomm.height - denomShift)); - } - - var midShift = -(axisHeight - 0.5 * ruleWidth); - - frac = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeVList({ - positionType: "individualShift", - children: [{ type: "elem", elem: denomm, shift: denomShift }, - // The next line would ordinarily contain "shift: midShift". - // But we put the rule into a a span that is 5 rules tall, - // to overcome a Chrome rendering issue. Put another way, - // we've replaced a kern of width = 2 * ruleWidth with a - // bottom padding inside the SVG = 2 * ruleWidth. - { type: "elem", elem: rule, shift: midShift + 2 * ruleWidth }, { type: "elem", elem: numerm, shift: -numShift }] - }, options); - } - - // Since we manually change the style sometimes (with \dfrac or \tfrac), - // account for the possible size change here. - newOptions = options.havingStyle(style); - frac.height *= newOptions.sizeMultiplier / options.sizeMultiplier; - frac.depth *= newOptions.sizeMultiplier / options.sizeMultiplier; - - // Rule 15e - var delimSize = void 0; - if (style.size === __WEBPACK_IMPORTED_MODULE_4__Style__["a" /* default */].DISPLAY.size) { - delimSize = options.fontMetrics().delim1; - } else { - delimSize = options.fontMetrics().delim2; - } - - var leftDelim = void 0; - var rightDelim = void 0; - if (group.value.leftDelim == null) { - leftDelim = __WEBPACK_IMPORTED_MODULE_5__buildHTML__["e" /* makeNullDelimiter */](options, ["mopen"]); - } else { - leftDelim = __WEBPACK_IMPORTED_MODULE_2__delimiter__["a" /* default */].customSizedDelim(group.value.leftDelim, delimSize, true, options.havingStyle(style), group.mode, ["mopen"]); - } - if (group.value.rightDelim == null) { - rightDelim = __WEBPACK_IMPORTED_MODULE_5__buildHTML__["e" /* makeNullDelimiter */](options, ["mclose"]); - } else { - rightDelim = __WEBPACK_IMPORTED_MODULE_2__delimiter__["a" /* default */].customSizedDelim(group.value.rightDelim, delimSize, true, options.havingStyle(style), group.mode, ["mclose"]); - } - - return __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mord"].concat(newOptions.sizingClasses(options)), [leftDelim, __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mfrac"], [frac]), rightDelim], options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var node = new __WEBPACK_IMPORTED_MODULE_3__mathMLTree__["a" /* default */].MathNode("mfrac", [__WEBPACK_IMPORTED_MODULE_6__buildMathML__["b" /* buildGroup */](group.value.numer, options), __WEBPACK_IMPORTED_MODULE_6__buildMathML__["b" /* buildGroup */](group.value.denom, options)]); - - if (!group.value.hasBarLine) { - node.setAttribute("linethickness", "0px"); - } - - if (group.value.leftDelim != null || group.value.rightDelim != null) { - var withDelims = []; - - if (group.value.leftDelim != null) { - var leftOp = new __WEBPACK_IMPORTED_MODULE_3__mathMLTree__["a" /* default */].MathNode("mo", [new __WEBPACK_IMPORTED_MODULE_3__mathMLTree__["a" /* default */].TextNode(group.value.leftDelim)]); - - leftOp.setAttribute("fence", "true"); - - withDelims.push(leftOp); - } - - withDelims.push(node); - - if (group.value.rightDelim != null) { - var rightOp = new __WEBPACK_IMPORTED_MODULE_3__mathMLTree__["a" /* default */].MathNode("mo", [new __WEBPACK_IMPORTED_MODULE_3__mathMLTree__["a" /* default */].TextNode(group.value.rightDelim)]); - - rightOp.setAttribute("fence", "true"); - - withDelims.push(rightOp); - } - - var outerNode = new __WEBPACK_IMPORTED_MODULE_3__mathMLTree__["a" /* default */].MathNode("mrow", withDelims); - - return outerNode; - } - - return node; - } -}); - -/***/ }), -/* 129 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__defineFunction__ = __webpack_require__(3); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__mathMLTree__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__buildHTML__ = __webpack_require__(4); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__buildMathML__ = __webpack_require__(2); - -// Horizontal overlap functions - - - - - - - -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "lap", - names: ["\\mathllap", "\\mathrlap", "\\mathclap"], - props: { - numArgs: 1, - allowedInText: true - }, - handler: function handler(context, args) { - var body = args[0]; - return { - type: "lap", - alignment: context.funcName.slice(5), - body: body - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - // mathllap, mathrlap, mathclap - var inner = void 0; - if (group.value.alignment === "clap") { - // ref: https://www.math.lsu.edu/~aperlis/publications/mathclap/ - inner = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan([], [__WEBPACK_IMPORTED_MODULE_3__buildHTML__["b" /* buildGroup */](group.value.body, options)]); - // wrap, since CSS will center a .clap > .inner > span - inner = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["inner"], [inner], options); - } else { - inner = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["inner"], [__WEBPACK_IMPORTED_MODULE_3__buildHTML__["b" /* buildGroup */](group.value.body, options)]); - } - var fix = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["fix"], []); - return __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mord", group.value.alignment], [inner, fix], options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - // mathllap, mathrlap, mathclap - var node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mpadded", [__WEBPACK_IMPORTED_MODULE_4__buildMathML__["b" /* buildGroup */](group.value.body, options)]); - - if (group.value.alignment !== "rlap") { - var offset = group.value.alignment === "llap" ? "-1" : "-0.5"; - node.setAttribute("lspace", offset + "width"); - } - node.setAttribute("width", "0px"); - - return node; - } -}); - -/***/ }), -/* 130 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__defineFunction__ = __webpack_require__(3); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__mathMLTree__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__buildHTML__ = __webpack_require__(4); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__buildMathML__ = __webpack_require__(2); - -// smash, with optional [tb], as in AMS - - - - - - - -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "smash", - names: ["\\smash"], - props: { - numArgs: 1, - numOptionalArgs: 1, - allowedInText: true - }, - handler: function handler(context, args, optArgs) { - var smashHeight = false; - var smashDepth = false; - var tbArg = optArgs[0]; - if (tbArg) { - // Optional [tb] argument is engaged. - // ref: amsmath: \renewcommand{\smash}[1][tb]{% - // def\mb@t{\ht}\def\mb@b{\dp}\def\mb@tb{\ht\z@\z@\dp}% - var letter = ""; - for (var i = 0; i < tbArg.value.length; ++i) { - letter = tbArg.value[i].value; - if (letter === "t") { - smashHeight = true; - } else if (letter === "b") { - smashDepth = true; - } else { - smashHeight = false; - smashDepth = false; - break; - } - } - } else { - smashHeight = true; - smashDepth = true; - } - - var body = args[0]; - return { - type: "smash", - body: body, - smashHeight: smashHeight, - smashDepth: smashDepth - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - var node = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mord"], [__WEBPACK_IMPORTED_MODULE_3__buildHTML__["b" /* buildGroup */](group.value.body, options)]); - - if (!group.value.smashHeight && !group.value.smashDepth) { - return node; - } - - if (group.value.smashHeight) { - node.height = 0; - // In order to influence makeVList, we have to reset the children. - if (node.children) { - for (var i = 0; i < node.children.length; i++) { - node.children[i].height = 0; - } - } - } - - if (group.value.smashDepth) { - node.depth = 0; - if (node.children) { - for (var _i = 0; _i < node.children.length; _i++) { - node.children[_i].depth = 0; - } - } - } - - // At this point, we've reset the TeX-like height and depth values. - // But the span still has an HTML line height. - // makeVList applies "display: table-cell", which prevents the browser - // from acting on that line height. So we'll call makeVList now. - - return __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeVList({ - positionType: "firstBaseline", - children: [{ type: "elem", elem: node }] - }, options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mpadded", [__WEBPACK_IMPORTED_MODULE_4__buildMathML__["b" /* buildGroup */](group.value.body, options)]); - - if (group.value.smashHeight) { - node.setAttribute("height", "0px"); - } - - if (group.value.smashDepth) { - node.setAttribute("depth", "0px"); - } - - return node; - } -}); - -/***/ }), -/* 131 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__defineFunction__ = __webpack_require__(3); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__delimiter__ = __webpack_require__(44); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__mathMLTree__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__ParseError__ = __webpack_require__(6); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__utils__ = __webpack_require__(5); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__buildHTML__ = __webpack_require__(4); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__buildMathML__ = __webpack_require__(2); - - - - - - - - - - -// Extra data needed for the delimiter handler down below -var delimiterSizes = { - "\\bigl": { mclass: "mopen", size: 1 }, - "\\Bigl": { mclass: "mopen", size: 2 }, - "\\biggl": { mclass: "mopen", size: 3 }, - "\\Biggl": { mclass: "mopen", size: 4 }, - "\\bigr": { mclass: "mclose", size: 1 }, - "\\Bigr": { mclass: "mclose", size: 2 }, - "\\biggr": { mclass: "mclose", size: 3 }, - "\\Biggr": { mclass: "mclose", size: 4 }, - "\\bigm": { mclass: "mrel", size: 1 }, - "\\Bigm": { mclass: "mrel", size: 2 }, - "\\biggm": { mclass: "mrel", size: 3 }, - "\\Biggm": { mclass: "mrel", size: 4 }, - "\\big": { mclass: "mord", size: 1 }, - "\\Big": { mclass: "mord", size: 2 }, - "\\bigg": { mclass: "mord", size: 3 }, - "\\Bigg": { mclass: "mord", size: 4 } -}; - -var delimiters = ["(", ")", "[", "\\lbrack", "]", "\\rbrack", "\\{", "\\lbrace", "\\}", "\\rbrace", "\\lfloor", "\\rfloor", "\\lceil", "\\rceil", "<", ">", "\\langle", "\u27E8", "\\rangle", "\u27E9", "\\lt", "\\gt", "\\lvert", "\\rvert", "\\lVert", "\\rVert", "\\lgroup", "\\rgroup", "\\lmoustache", "\\rmoustache", "/", "\\backslash", "|", "\\vert", "\\|", "\\Vert", "\\uparrow", "\\Uparrow", "\\downarrow", "\\Downarrow", "\\updownarrow", "\\Updownarrow", "."]; - -// Delimiter functions -function checkDelimiter(delim, context) { - if (__WEBPACK_IMPORTED_MODULE_5__utils__["a" /* default */].contains(delimiters, delim.value)) { - return delim; - } else { - throw new __WEBPACK_IMPORTED_MODULE_4__ParseError__["a" /* default */]("Invalid delimiter: '" + delim.value + "' after '" + context.funcName + "'", delim); - } -} - -Object(__WEBPACK_IMPORTED_MODULE_1__defineFunction__["b" /* default */])({ - type: "delimsizing", - names: ["\\bigl", "\\Bigl", "\\biggl", "\\Biggl", "\\bigr", "\\Bigr", "\\biggr", "\\Biggr", "\\bigm", "\\Bigm", "\\biggm", "\\Biggm", "\\big", "\\Big", "\\bigg", "\\Bigg"], - props: { - numArgs: 1 - }, - handler: function handler(context, args) { - var delim = checkDelimiter(args[0], context); - - return { - type: "delimsizing", - size: delimiterSizes[context.funcName].size, - mclass: delimiterSizes[context.funcName].mclass, - value: delim.value - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - var delim = group.value.value; - - if (delim === ".") { - // Empty delimiters still count as elements, even though they don't - // show anything. - return __WEBPACK_IMPORTED_MODULE_0__buildCommon__["a" /* default */].makeSpan([group.value.mclass]); - } - - // Use delimiter.sizedDelim to generate the delimiter. - return __WEBPACK_IMPORTED_MODULE_2__delimiter__["a" /* default */].sizedDelim(delim, group.value.size, options, group.mode, [group.value.mclass]); - }, - mathmlBuilder: function mathmlBuilder(group) { - var children = []; - - if (group.value.value !== ".") { - children.push(__WEBPACK_IMPORTED_MODULE_7__buildMathML__["e" /* makeText */](group.value.value, group.mode)); - } - - var node = new __WEBPACK_IMPORTED_MODULE_3__mathMLTree__["a" /* default */].MathNode("mo", children); - - if (group.value.mclass === "mopen" || group.value.mclass === "mclose") { - // Only some of the delimsizing functions act as fences, and they - // return "mopen" or "mclose" mclass. - node.setAttribute("fence", "true"); - } else { - // Explicitly disable fencing if it's not a fence, to override the - // defaults. - node.setAttribute("fence", "false"); - } - - return node; - } -}); - -Object(__WEBPACK_IMPORTED_MODULE_1__defineFunction__["b" /* default */])({ - type: "leftright", - names: ["\\left", "\\right"], - props: { - numArgs: 1 - }, - handler: function handler(context, args) { - var delim = checkDelimiter(args[0], context); - - if (context.funcName === "\\left") { - var parser = context.parser; - // Parse out the implicit body - ++parser.leftrightDepth; - // parseExpression stops before '\\right' - var body = parser.parseExpression(false); - --parser.leftrightDepth; - // Check the next token - parser.expect("\\right", false); - var right = parser.parseFunction(); - if (!right) { - throw new __WEBPACK_IMPORTED_MODULE_4__ParseError__["a" /* default */]('failed to parse function after \\right'); - } - return { - type: "leftright", - body: body, - left: delim.value, - right: right.value.value - }; - } else { - // This is a little weird. We return this object which gets turned - // into a ParseNode which gets returned by - // `const right = parser.parseFunction();` up above. - return { - type: "leftright", - value: delim.value - }; - } - }, - htmlBuilder: function htmlBuilder(group, options) { - // Build the inner expression - var inner = __WEBPACK_IMPORTED_MODULE_6__buildHTML__["a" /* buildExpression */](group.value.body, options, true, [null, "mclose"]); - - var innerHeight = 0; - var innerDepth = 0; - var hadMiddle = false; - - // Calculate its height and depth - for (var i = 0; i < inner.length; i++) { - if (inner[i].isMiddle) { - hadMiddle = true; - } else { - innerHeight = Math.max(inner[i].height, innerHeight); - innerDepth = Math.max(inner[i].depth, innerDepth); - } - } - - // The size of delimiters is the same, regardless of what style we are - // in. Thus, to correctly calculate the size of delimiter we need around - // a group, we scale down the inner size based on the size. - innerHeight *= options.sizeMultiplier; - innerDepth *= options.sizeMultiplier; - - var leftDelim = void 0; - if (group.value.left === ".") { - // Empty delimiters in \left and \right make null delimiter spaces. - leftDelim = __WEBPACK_IMPORTED_MODULE_6__buildHTML__["e" /* makeNullDelimiter */](options, ["mopen"]); - } else { - // Otherwise, use leftRightDelim to generate the correct sized - // delimiter. - leftDelim = __WEBPACK_IMPORTED_MODULE_2__delimiter__["a" /* default */].leftRightDelim(group.value.left, innerHeight, innerDepth, options, group.mode, ["mopen"]); - } - // Add it to the beginning of the expression - inner.unshift(leftDelim); - - // Handle middle delimiters - if (hadMiddle) { - for (var _i = 1; _i < inner.length; _i++) { - var middleDelim = inner[_i]; - if (middleDelim.isMiddle) { - // Apply the options that were active when \middle was called - inner[_i] = __WEBPACK_IMPORTED_MODULE_2__delimiter__["a" /* default */].leftRightDelim(middleDelim.isMiddle.value, innerHeight, innerDepth, middleDelim.isMiddle.options, group.mode, []); - } - } - } - - var rightDelim = void 0; - // Same for the right delimiter - if (group.value.right === ".") { - rightDelim = __WEBPACK_IMPORTED_MODULE_6__buildHTML__["e" /* makeNullDelimiter */](options, ["mclose"]); - } else { - rightDelim = __WEBPACK_IMPORTED_MODULE_2__delimiter__["a" /* default */].leftRightDelim(group.value.right, innerHeight, innerDepth, options, group.mode, ["mclose"]); - } - // Add it to the end of the expression. - inner.push(rightDelim); - - return __WEBPACK_IMPORTED_MODULE_0__buildCommon__["a" /* default */].makeSpan(["minner"], inner, options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var inner = __WEBPACK_IMPORTED_MODULE_7__buildMathML__["a" /* buildExpression */](group.value.body, options); - - if (group.value.left !== ".") { - var leftNode = new __WEBPACK_IMPORTED_MODULE_3__mathMLTree__["a" /* default */].MathNode("mo", [__WEBPACK_IMPORTED_MODULE_7__buildMathML__["e" /* makeText */](group.value.left, group.mode)]); - - leftNode.setAttribute("fence", "true"); - - inner.unshift(leftNode); - } - - if (group.value.right !== ".") { - var rightNode = new __WEBPACK_IMPORTED_MODULE_3__mathMLTree__["a" /* default */].MathNode("mo", [__WEBPACK_IMPORTED_MODULE_7__buildMathML__["e" /* makeText */](group.value.right, group.mode)]); - - rightNode.setAttribute("fence", "true"); - - inner.push(rightNode); - } - - var outerNode = new __WEBPACK_IMPORTED_MODULE_3__mathMLTree__["a" /* default */].MathNode("mrow", inner); - - return outerNode; - } -}); - -Object(__WEBPACK_IMPORTED_MODULE_1__defineFunction__["b" /* default */])({ - type: "middle", - names: ["\\middle"], - props: { - numArgs: 1 - }, - handler: function handler(context, args) { - var delim = checkDelimiter(args[0], context); - if (!context.parser.leftrightDepth) { - throw new __WEBPACK_IMPORTED_MODULE_4__ParseError__["a" /* default */]("\\middle without preceding \\left", delim); - } - - return { - type: "middle", - value: delim.value - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - var middleDelim = void 0; - if (group.value.value === ".") { - middleDelim = __WEBPACK_IMPORTED_MODULE_6__buildHTML__["e" /* makeNullDelimiter */](options, []); - } else { - middleDelim = __WEBPACK_IMPORTED_MODULE_2__delimiter__["a" /* default */].sizedDelim(group.value.value, 1, options, group.mode, []); - middleDelim.isMiddle = { value: group.value.value, options: options }; - } - return middleDelim; - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var middleNode = new __WEBPACK_IMPORTED_MODULE_3__mathMLTree__["a" /* default */].MathNode("mo", [__WEBPACK_IMPORTED_MODULE_7__buildMathML__["e" /* makeText */](group.value.middle, group.mode)]); - middleNode.setAttribute("fence", "true"); - return middleNode; - } -}); - -/***/ }), -/* 132 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__defineFunction__ = __webpack_require__(3); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__mathMLTree__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Style__ = __webpack_require__(9); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__sizing__ = __webpack_require__(60); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__buildMathML__ = __webpack_require__(2); - - - - - - - -var styleMap = { - "display": __WEBPACK_IMPORTED_MODULE_2__Style__["a" /* default */].DISPLAY, - "text": __WEBPACK_IMPORTED_MODULE_2__Style__["a" /* default */].TEXT, - "script": __WEBPACK_IMPORTED_MODULE_2__Style__["a" /* default */].SCRIPT, - "scriptscript": __WEBPACK_IMPORTED_MODULE_2__Style__["a" /* default */].SCRIPTSCRIPT -}; - -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "styling", - names: ["\\displaystyle", "\\textstyle", "\\scriptstyle", "\\scriptscriptstyle"], - props: { - numArgs: 0, - allowedInText: true - }, - handler: function handler(context, args) { - var breakOnTokenText = context.breakOnTokenText, - funcName = context.funcName, - parser = context.parser; - - // parse out the implicit body - - parser.consumeSpaces(); - var body = parser.parseExpression(true, breakOnTokenText); - - return { - type: "styling", - // Figure out what style to use by pulling out the style from - // the function name - style: funcName.slice(1, funcName.length - 5), - value: body - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - // Style changes are handled in the TeXbook on pg. 442, Rule 3. - var newStyle = styleMap[group.value.style]; - var newOptions = options.havingStyle(newStyle); - return Object(__WEBPACK_IMPORTED_MODULE_3__sizing__["a" /* sizingGroup */])(group.value.value, newOptions, options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - // Figure out what style we're changing to. - // TODO(kevinb): dedupe this with buildHTML.js - // This will be easier of handling of styling nodes is in the same file. - var styleMap = { - "display": __WEBPACK_IMPORTED_MODULE_2__Style__["a" /* default */].DISPLAY, - "text": __WEBPACK_IMPORTED_MODULE_2__Style__["a" /* default */].TEXT, - "script": __WEBPACK_IMPORTED_MODULE_2__Style__["a" /* default */].SCRIPT, - "scriptscript": __WEBPACK_IMPORTED_MODULE_2__Style__["a" /* default */].SCRIPTSCRIPT - }; - - var newStyle = styleMap[group.value.style]; - var newOptions = options.havingStyle(newStyle); - - var inner = __WEBPACK_IMPORTED_MODULE_4__buildMathML__["a" /* buildExpression */](group.value.value, newOptions); - - var node = new __WEBPACK_IMPORTED_MODULE_1__mathMLTree__["a" /* default */].MathNode("mstyle", inner); - - var styleAttributes = { - "display": ["0", "true"], - "text": ["0", "false"], - "script": ["1", "false"], - "scriptscript": ["2", "false"] - }; - - var attr = styleAttributes[group.value.style]; - - node.setAttribute("scriptlevel", attr[0]); - node.setAttribute("displaystyle", attr[1]); - - return node; - } -}); - -/***/ }), -/* 133 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys__ = __webpack_require__(134); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__defineFunction__ = __webpack_require__(3); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__ParseNode__ = __webpack_require__(14); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__buildHTML__ = __webpack_require__(4); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__buildMathML__ = __webpack_require__(2); - - -// TODO(kevinb): implement \\sl and \\sc - - - - - - - -var htmlBuilder = function htmlBuilder(group, options) { - var font = group.value.font; - return __WEBPACK_IMPORTED_MODULE_3__buildHTML__["b" /* buildGroup */](group.value.body, options.withFontFamily(font)); -}; - -var mathmlBuilder = function mathmlBuilder(group, options) { - var font = group.value.font; - return __WEBPACK_IMPORTED_MODULE_4__buildMathML__["b" /* buildGroup */](group.value.body, options.withFontFamily(font)); -}; - -var fontAliases = { - "\\Bbb": "\\mathbb", - "\\bold": "\\mathbf", - "\\frak": "\\mathfrak", - "\\bm": "\\boldsymbol" -}; - -Object(__WEBPACK_IMPORTED_MODULE_1__defineFunction__["b" /* default */])({ - type: "font", - names: [ - // styles - "\\mathrm", "\\mathit", "\\mathbf", "\\boldsymbol", - - // families - "\\mathbb", "\\mathcal", "\\mathfrak", "\\mathscr", "\\mathsf", "\\mathtt", - - // aliases - "\\Bbb", "\\bold", "\\frak", "\\bm"], - props: { - numArgs: 1, - greediness: 2 - }, - handler: function handler(context, args) { - var body = args[0]; - var func = context.funcName; - if (func in fontAliases) { - func = fontAliases[func]; - } - return { - type: "font", - font: func.slice(1), - body: body - }; - }, - htmlBuilder: htmlBuilder, - mathmlBuilder: mathmlBuilder -}); - -var oldFontFuncsMap = { - "\\rm": "mathrm", - "\\sf": "mathsf", - "\\tt": "mathtt", - "\\bf": "mathbf", - "\\it": "mathit" -}; - -// Old font changing functions -Object(__WEBPACK_IMPORTED_MODULE_1__defineFunction__["b" /* default */])({ - type: "font", - names: __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default()(oldFontFuncsMap), - props: { - numArgs: 0, - allowedInText: true - }, - handler: function handler(context, args) { - var parser = context.parser, - funcName = context.funcName, - breakOnTokenText = context.breakOnTokenText; - - - parser.consumeSpaces(); - var body = parser.parseExpression(true, breakOnTokenText); - var style = oldFontFuncsMap[funcName]; - - return { - type: "font", - font: style, - body: new __WEBPACK_IMPORTED_MODULE_2__ParseNode__["a" /* default */]("ordgroup", body, parser.mode) - }; - }, - htmlBuilder: htmlBuilder, - mathmlBuilder: mathmlBuilder -}); - -/***/ }), -/* 134 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = { "default": __webpack_require__(135), __esModule: true }; - -/***/ }), -/* 135 */ -/***/ (function(module, exports, __webpack_require__) { - -__webpack_require__(136); -module.exports = __webpack_require__(8).Object.keys; - -/***/ }), -/* 136 */ -/***/ (function(module, exports, __webpack_require__) { - -// 19.1.2.14 Object.keys(O) -var toObject = __webpack_require__(29) - , $keys = __webpack_require__(39); - -__webpack_require__(46)('keys', function(){ - return function keys(it){ - return $keys(toObject(it)); - }; -}); - -/***/ }), -/* 137 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__defineFunction__ = __webpack_require__(3); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__mathMLTree__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__utils__ = __webpack_require__(5); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__stretchy__ = __webpack_require__(13); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__buildHTML__ = __webpack_require__(4); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__buildMathML__ = __webpack_require__(2); - - - - - - - - - -var htmlBuilder = function htmlBuilder(group, options) { - // Accents are handled in the TeXbook pg. 443, rule 12. - var base = group.value.base; - - var supsubGroup = void 0; - if (group.type === "supsub") { - // If our base is a character box, and we have superscripts and - // subscripts, the supsub will defer to us. In particular, we want - // to attach the superscripts and subscripts to the inner body (so - // that the position of the superscripts and subscripts won't be - // affected by the height of the accent). We accomplish this by - // sticking the base of the accent into the base of the supsub, and - // rendering that, while keeping track of where the accent is. - - // The supsub group is the group that was passed in - var supsub = group; - // The real accent group is the base of the supsub group - group = supsub.value.base; - // The character box is the base of the accent group - base = group.value.base; - // Stick the character box into the base of the supsub group - supsub.value.base = base; - - // Rerender the supsub group with its new base, and store that - // result. - supsubGroup = __WEBPACK_IMPORTED_MODULE_5__buildHTML__["b" /* buildGroup */](supsub, options); - } - - // Build the base group - var body = __WEBPACK_IMPORTED_MODULE_5__buildHTML__["b" /* buildGroup */](base, options.havingCrampedStyle()); - - // Does the accent need to shift for the skew of a character? - var mustShift = group.value.isShifty && __WEBPACK_IMPORTED_MODULE_3__utils__["a" /* default */].isCharacterBox(base); - - // Calculate the skew of the accent. This is based on the line "If the - // nucleus is not a single character, let s = 0; otherwise set s to the - // kern amount for the nucleus followed by the \skewchar of its font." - // Note that our skew metrics are just the kern between each character - // and the skewchar. - var skew = 0; - if (mustShift) { - // If the base is a character box, then we want the skew of the - // innermost character. To do that, we find the innermost character: - var baseChar = __WEBPACK_IMPORTED_MODULE_3__utils__["a" /* default */].getBaseElem(base); - // Then, we render its group to get the symbol inside it - var baseGroup = __WEBPACK_IMPORTED_MODULE_5__buildHTML__["b" /* buildGroup */](baseChar, options.havingCrampedStyle()); - // Finally, we pull the skew off of the symbol. - skew = baseGroup.skew; - // Note that we now throw away baseGroup, because the layers we - // removed with getBaseElem might contain things like \color which - // we can't get rid of. - // TODO(emily): Find a better way to get the skew - } - - // calculate the amount of space between the body and the accent - var clearance = Math.min(body.height, options.fontMetrics().xHeight); - - // Build the accent - var accentBody = void 0; - if (!group.value.isStretchy) { - var accent = void 0; - var width = void 0; - if (group.value.label === "\\vec") { - // Before version 0.9, \vec used the combining font glyph U+20D7. - // But browsers, especially Safari, are not consistent in how they - // render combining characters when not preceded by a character. - // So now we use an SVG. - // If Safari reforms, we should consider reverting to the glyph. - accent = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].staticSvg("vec", options); - width = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].svgData.vec[1]; - } else { - accent = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSymbol(group.value.label, "Main-Regular", group.mode, options); - // Remove the italic correction of the accent, because it only serves to - // shift the accent over to a place we don't want. - accent.italic = 0; - width = accent.width; - } - - accentBody = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["accent-body"], [accent]); - - // CSS defines `.katex .accent .accent-body { width: 0 }` - // so that the accent doesn't contribute to the bounding box. - // We need to shift the character by its width (effectively half - // its width) to compensate. - var left = -width / 2; - - // Shift the accent over by the skew. - left += skew; - - accentBody.style.left = left + "em"; - - accentBody = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeVList({ - positionType: "firstBaseline", - children: [{ type: "elem", elem: body }, { type: "kern", size: -clearance }, { type: "elem", elem: accentBody }] - }, options); - } else { - accentBody = __WEBPACK_IMPORTED_MODULE_4__stretchy__["a" /* default */].svgSpan(group, options); - - accentBody = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeVList({ - positionType: "firstBaseline", - children: [{ type: "elem", elem: body }, { - type: "elem", - elem: accentBody, - wrapperClasses: ["svg-align"], - wrapperStyle: skew > 0 ? { - width: "calc(100% - " + 2 * skew + "em)", - marginLeft: 2 * skew + "em" - } : undefined - }] - }, options); - } - - var accentWrap = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mord", "accent"], [accentBody], options); - - if (supsubGroup) { - // Here, we replace the "base" child of the supsub with our newly - // generated accent. - supsubGroup.children[0] = accentWrap; - - // Since we don't rerun the height calculation after replacing the - // accent, we manually recalculate height. - supsubGroup.height = Math.max(accentWrap.height, supsubGroup.height); - - // Accents should always be ords, even when their innards are not. - supsubGroup.classes[0] = "mord"; - - return supsubGroup; - } else { - return accentWrap; - } -}; - -var mathmlBuilder = function mathmlBuilder(group, options) { - var accentNode = void 0; - if (group.value.isStretchy) { - accentNode = __WEBPACK_IMPORTED_MODULE_4__stretchy__["a" /* default */].mathMLnode(group.value.label); - } else { - accentNode = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mo", [__WEBPACK_IMPORTED_MODULE_6__buildMathML__["e" /* makeText */](group.value.label, group.mode)]); - } - - var node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mover", [__WEBPACK_IMPORTED_MODULE_6__buildMathML__["b" /* buildGroup */](group.value.base, options), accentNode]); - - node.setAttribute("accent", "true"); - - return node; -}; - -var NON_STRETCHY_ACCENT_REGEX = new RegExp(["\\acute", "\\grave", "\\ddot", "\\tilde", "\\bar", "\\breve", "\\check", "\\hat", "\\vec", "\\dot", "\\mathring"].map(function (accent) { - return "\\" + accent; -}).join("|")); - -// Accents -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "accent", - names: ["\\acute", "\\grave", "\\ddot", "\\tilde", "\\bar", "\\breve", "\\check", "\\hat", "\\vec", "\\dot", "\\mathring", "\\widehat", "\\widetilde", "\\overrightarrow", "\\overleftarrow", "\\Overrightarrow", "\\overleftrightarrow", "\\overgroup", "\\overlinesegment", "\\overleftharpoon", "\\overrightharpoon"], - props: { - numArgs: 1 - }, - handler: function handler(context, args) { - var base = args[0]; - - var isStretchy = !NON_STRETCHY_ACCENT_REGEX.test(context.funcName); - var isShifty = !isStretchy || context.funcName === "\\widehat" || context.funcName === "\\widetilde"; - - return { - type: "accent", - label: context.funcName, - isStretchy: isStretchy, - isShifty: isShifty, - base: base - }; - }, - htmlBuilder: htmlBuilder, - mathmlBuilder: mathmlBuilder -}); - -// Text-mode accents -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "accent", - names: ["\\'", "\\`", "\\^", "\\~", "\\=", "\\u", "\\.", '\\"', "\\r", "\\H", "\\v"], - props: { - numArgs: 1, - allowedInText: true, - allowedInMath: false - }, - handler: function handler(context, args) { - var base = args[0]; - - return { - type: "accent", - label: context.funcName, - isStretchy: false, - isShifty: true, - base: base - }; - }, - htmlBuilder: htmlBuilder, - mathmlBuilder: mathmlBuilder -}); - -/***/ }), -/* 138 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__defineFunction__ = __webpack_require__(3); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__mathMLTree__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__stretchy__ = __webpack_require__(13); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__buildHTML__ = __webpack_require__(4); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__buildMathML__ = __webpack_require__(2); - -// Horizontal overlap functions - - - - - - - - -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "accentUnder", - names: ["\\underleftarrow", "\\underrightarrow", "\\underleftrightarrow", "\\undergroup", "\\underlinesegment", "\\utilde"], - props: { - numArgs: 1 - }, - handler: function handler(context, args) { - var base = args[0]; - return { - type: "accentUnder", - label: context.funcName, - base: base - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - // Treat under accents much like underlines. - var innerGroup = __WEBPACK_IMPORTED_MODULE_4__buildHTML__["b" /* buildGroup */](group.value.base, options); - - var accentBody = __WEBPACK_IMPORTED_MODULE_3__stretchy__["a" /* default */].svgSpan(group, options); - var kern = group.value.label === "\\utilde" ? 0.12 : 0; - - // Generate the vlist, with the appropriate kerns - var vlist = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeVList({ - positionType: "bottom", - positionData: accentBody.height + kern, - children: [{ type: "elem", elem: accentBody, wrapperClasses: ["svg-align"] }, { type: "kern", size: kern }, { type: "elem", elem: innerGroup }] - }, options); - - return __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mord", "accentunder"], [vlist], options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var accentNode = __WEBPACK_IMPORTED_MODULE_3__stretchy__["a" /* default */].mathMLnode(group.value.label); - var node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("munder", [__WEBPACK_IMPORTED_MODULE_5__buildMathML__["b" /* buildGroup */](group.value.body, options), accentNode]); - node.setAttribute("accentunder", "true"); - return node; - } -}); - -/***/ }), -/* 139 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__defineFunction__ = __webpack_require__(3); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__mathMLTree__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__ParseError__ = __webpack_require__(6); - - - - - -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "verb", - names: ["\\verb"], - props: { - numArgs: 0, - allowedInText: true - }, - handler: function handler(context, args, optArgs) { - // \verb and \verb* are dealt with directly in Parser.js. - // If we end up here, it's because of a failure to match the two delimiters - // in the regex in Lexer.js. LaTeX raises the following error when \verb is - // terminated by end of line (or file). - throw new __WEBPACK_IMPORTED_MODULE_3__ParseError__["a" /* default */]("\\verb ended by end of line instead of matching delimiter"); - }, - htmlBuilder: function htmlBuilder(group, options) { - var text = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeVerb(group, options); - var body = []; - // \verb enters text mode and therefore is sized like \textstyle - var newOptions = options.havingStyle(options.style.text()); - for (var i = 0; i < text.length; i++) { - if (text[i] === '\xA0') { - // spaces appear as nonbreaking space - // The space character isn't in the Typewriter-Regular font, - // so we implement it as a kern of the same size as a character. - // 0.525 is the width of a texttt character in LaTeX. - // It automatically gets scaled by the font size. - var rule = __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mord", "rule"], [], newOptions); - rule.style.marginLeft = "0.525em"; - body.push(rule); - } else { - body.push(__WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSymbol(text[i], "Typewriter-Regular", group.mode, newOptions, ["mathtt"])); - } - } - __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].tryCombineChars(body); - return __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeSpan(["mord", "text"].concat(newOptions.sizingClasses(options)), - // tryCombinChars expects CombinableDomNode[] while makeSpan expects - // DomChildNode[]. - // $FlowFixMe: CombinableDomNode[] is not compatible with DomChildNode[] - body, newOptions); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var text = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].TextNode(__WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeVerb(group, options)); - var node = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mtext", [text]); - node.setAttribute("mathvariant", __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].fontMap["mathtt"].variant); - return node; - } -}); - -/***/ }), -/* 140 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__defineFunction__ = __webpack_require__(3); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__mathMLTree__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__buildHTML__ = __webpack_require__(4); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__buildMathML__ = __webpack_require__(2); - - - - - - - -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "href", - names: ["\\href"], - props: { - numArgs: 2, - argTypes: ["url", "original"] - }, - handler: function handler(context, args) { - var body = args[1]; - var href = args[0].value; - return { - type: "href", - href: href, - body: Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["c" /* ordargument */])(body) - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - var elements = __WEBPACK_IMPORTED_MODULE_3__buildHTML__["a" /* buildExpression */](group.value.body, options, false); - - var href = group.value.href; - - return new __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeAnchor(href, [], elements, options); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var inner = __WEBPACK_IMPORTED_MODULE_4__buildMathML__["a" /* buildExpression */](group.value.body, options); - var math = new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mrow", inner); - math.setAttribute("href", group.value.href); - return math; - } -}); - -/***/ }), -/* 141 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__defineFunction__ = __webpack_require__(3); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__mathMLTree__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Style__ = __webpack_require__(9); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__buildHTML__ = __webpack_require__(4); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__buildMathML__ = __webpack_require__(2); - - - - - - - -var chooseMathStyle = function chooseMathStyle(group, options) { - var style = options.style; - if (style.size === __WEBPACK_IMPORTED_MODULE_3__Style__["a" /* default */].DISPLAY.size) { - return group.value.display; - } else if (style.size === __WEBPACK_IMPORTED_MODULE_3__Style__["a" /* default */].TEXT.size) { - return group.value.text; - } else if (style.size === __WEBPACK_IMPORTED_MODULE_3__Style__["a" /* default */].SCRIPT.size) { - return group.value.script; - } else if (style.size === __WEBPACK_IMPORTED_MODULE_3__Style__["a" /* default */].SCRIPTSCRIPT.size) { - return group.value.scriptscript; - } - return group.value.text; -}; - -Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["b" /* default */])({ - type: "mathchoice", - names: ["\\mathchoice"], - props: { - numArgs: 4 - }, - handler: function handler(context, args) { - return { - type: "mathchoice", - display: Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["c" /* ordargument */])(args[0]), - text: Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["c" /* ordargument */])(args[1]), - script: Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["c" /* ordargument */])(args[2]), - scriptscript: Object(__WEBPACK_IMPORTED_MODULE_0__defineFunction__["c" /* ordargument */])(args[3]) - }; - }, - htmlBuilder: function htmlBuilder(group, options) { - var body = chooseMathStyle(group, options); - var elements = __WEBPACK_IMPORTED_MODULE_4__buildHTML__["a" /* buildExpression */](body, options, false); - return new __WEBPACK_IMPORTED_MODULE_1__buildCommon__["a" /* default */].makeFragment(elements); - }, - mathmlBuilder: function mathmlBuilder(group, options) { - var body = chooseMathStyle(group, options); - var elements = __WEBPACK_IMPORTED_MODULE_5__buildMathML__["a" /* buildExpression */](body, options, false); - return new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mrow", elements); - } -}); - -/***/ }), -/* 142 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__defineEnvironment__ = __webpack_require__(61); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__environments_array_js__ = __webpack_require__(143); - - -var environments = __WEBPACK_IMPORTED_MODULE_0__defineEnvironment__["a" /* _environments */]; - -/* harmony default export */ __webpack_exports__["a"] = (environments); - -// All environment definitions should be imported below - - -/***/ }), -/* 143 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__buildCommon__ = __webpack_require__(0); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__defineEnvironment__ = __webpack_require__(61); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__mathMLTree__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__ParseError__ = __webpack_require__(6); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__ParseNode__ = __webpack_require__(14); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__units__ = __webpack_require__(19); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__utils__ = __webpack_require__(5); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__stretchy__ = __webpack_require__(13); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__buildHTML__ = __webpack_require__(4); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__buildMathML__ = __webpack_require__(2); - - - - - - - - - - - - -// Data stored in the ParseNode associated with the environment. - - -/** - * Parse the body of the environment, with rows delimited by \\ and - * columns delimited by &, and create a nested list in row-major order - * with one group per cell. If given an optional argument style - * ("text", "display", etc.), then each cell is cast into that style. - */ -function parseArray(parser, result, style) { - var row = []; - var body = [row]; - var rowGaps = []; - while (true) { - // eslint-disable-line no-constant-condition - var cell = parser.parseExpression(false, undefined); - cell = new __WEBPACK_IMPORTED_MODULE_4__ParseNode__["a" /* default */]("ordgroup", cell, parser.mode); - if (style) { - cell = new __WEBPACK_IMPORTED_MODULE_4__ParseNode__["a" /* default */]("styling", { - style: style, - value: [cell] - }, parser.mode); - } - row.push(cell); - var next = parser.nextToken.text; - if (next === "&") { - parser.consume(); - } else if (next === "\\end") { - // Arrays terminate newlines with `\crcr` which consumes a `\cr` if - // the last line is empty. - var lastRow = body[body.length - 1]; - if (body.length > 1 && lastRow.length === 1 && lastRow[0].value.value[0].value.length === 0) { - body.pop(); - } - break; - } else if (next === "\\\\" || next === "\\cr") { - var cr = parser.parseFunction(); - if (!cr) { - throw new __WEBPACK_IMPORTED_MODULE_3__ParseError__["a" /* default */]("Failed to parse function after " + next); - } - rowGaps.push(cr.value.size); - row = []; - body.push(row); - } else { - throw new __WEBPACK_IMPORTED_MODULE_3__ParseError__["a" /* default */]("Expected & or \\\\ or \\end", parser.nextToken); - } - } - result.body = body; - result.rowGaps = rowGaps; - return new __WEBPACK_IMPORTED_MODULE_4__ParseNode__["a" /* default */](result.type, result, parser.mode); -} - -// Decides on a style for cells in an array according to whether the given -// environment name starts with the letter 'd'. -function dCellStyle(envName) { - if (envName.substr(0, 1) === "d") { - return "display"; - } else { - return "text"; - } -} - -var htmlBuilder = function htmlBuilder(group, options) { - var r = void 0; - var c = void 0; - var nr = group.value.body.length; - var nc = 0; - var body = new Array(nr); - - // Horizontal spacing - var pt = 1 / options.fontMetrics().ptPerEm; - var arraycolsep = 5 * pt; // \arraycolsep in article.cls - - // Vertical spacing - var baselineskip = 12 * pt; // see size10.clo - // Default \jot from ltmath.dtx - // TODO(edemaine): allow overriding \jot via \setlength (#687) - var jot = 3 * pt; - // Default \arraystretch from lttab.dtx - // TODO(gagern): may get redefined once we have user-defined macros - var arraystretch = __WEBPACK_IMPORTED_MODULE_6__utils__["a" /* default */].deflt(group.value.arraystretch, 1); - var arrayskip = arraystretch * baselineskip; - var arstrutHeight = 0.7 * arrayskip; // \strutbox in ltfsstrc.dtx and - var arstrutDepth = 0.3 * arrayskip; // \@arstrutbox in lttab.dtx - - var totalHeight = 0; - for (r = 0; r < group.value.body.length; ++r) { - var inrow = group.value.body[r]; - var _height = arstrutHeight; // \@array adds an \@arstrut - var _depth = arstrutDepth; // to each tow (via the template) - - if (nc < inrow.length) { - nc = inrow.length; - } - - var outrow = new Array(inrow.length); - for (c = 0; c < inrow.length; ++c) { - var elt = __WEBPACK_IMPORTED_MODULE_8__buildHTML__["b" /* buildGroup */](inrow[c], options); - if (_depth < elt.depth) { - _depth = elt.depth; - } - if (_height < elt.height) { - _height = elt.height; - } - outrow[c] = elt; - } - - var gap = 0; - if (group.value.rowGaps[r]) { - gap = Object(__WEBPACK_IMPORTED_MODULE_5__units__["a" /* calculateSize */])(group.value.rowGaps[r].value, options); - if (gap > 0) { - // \@argarraycr - gap += arstrutDepth; - if (_depth < gap) { - _depth = gap; // \@xargarraycr - } - gap = 0; - } - } - // In AMS multiline environments such as aligned and gathered, rows - // correspond to lines that have additional \jot added to the - // \baselineskip via \openup. - if (group.value.addJot) { - _depth += jot; - } - - outrow.height = _height; - outrow.depth = _depth; - totalHeight += _height; - outrow.pos = totalHeight; - totalHeight += _depth + gap; // \@yargarraycr - body[r] = outrow; - } - - var offset = totalHeight / 2 + options.fontMetrics().axisHeight; - var colDescriptions = group.value.cols || []; - var cols = []; - var colSep = void 0; - var colDescrNum = void 0; - for (c = 0, colDescrNum = 0; - // Continue while either there are more columns or more column - // descriptions, so trailing separators don't get lost. - c < nc || colDescrNum < colDescriptions.length; ++c, ++colDescrNum) { - - var colDescr = colDescriptions[colDescrNum] || {}; - - var firstSeparator = true; - while (colDescr.type === "separator") { - // If there is more than one separator in a row, add a space - // between them. - if (!firstSeparator) { - colSep = __WEBPACK_IMPORTED_MODULE_0__buildCommon__["a" /* default */].makeSpan(["arraycolsep"], []); - colSep.style.width = options.fontMetrics().doubleRuleSep + "em"; - cols.push(colSep); - } - - if (colDescr.separator === "|") { - var _separator = __WEBPACK_IMPORTED_MODULE_7__stretchy__["a" /* default */].ruleSpan("vertical-separator", 0.05, options); - _separator.style.height = totalHeight + "em"; - _separator.style.verticalAlign = -(totalHeight - offset) + "em"; - - cols.push(_separator); - } else { - throw new __WEBPACK_IMPORTED_MODULE_3__ParseError__["a" /* default */]("Invalid separator type: " + colDescr.separator); - } - - colDescrNum++; - colDescr = colDescriptions[colDescrNum] || {}; - firstSeparator = false; - } - - if (c >= nc) { - continue; - } - - var sepwidth = void 0; - if (c > 0 || group.value.hskipBeforeAndAfter) { - sepwidth = __WEBPACK_IMPORTED_MODULE_6__utils__["a" /* default */].deflt(colDescr.pregap, arraycolsep); - if (sepwidth !== 0) { - colSep = __WEBPACK_IMPORTED_MODULE_0__buildCommon__["a" /* default */].makeSpan(["arraycolsep"], []); - colSep.style.width = sepwidth + "em"; - cols.push(colSep); - } - } - - var col = []; - for (r = 0; r < nr; ++r) { - var row = body[r]; - var elem = row[c]; - if (!elem) { - continue; - } - var shift = row.pos - offset; - elem.depth = row.depth; - elem.height = row.height; - col.push({ type: "elem", elem: elem, shift: shift }); - } - - col = __WEBPACK_IMPORTED_MODULE_0__buildCommon__["a" /* default */].makeVList({ - positionType: "individualShift", - children: col - }, options); - col = __WEBPACK_IMPORTED_MODULE_0__buildCommon__["a" /* default */].makeSpan(["col-align-" + (colDescr.align || "c")], [col]); - cols.push(col); - - if (c < nc - 1 || group.value.hskipBeforeAndAfter) { - sepwidth = __WEBPACK_IMPORTED_MODULE_6__utils__["a" /* default */].deflt(colDescr.postgap, arraycolsep); - if (sepwidth !== 0) { - colSep = __WEBPACK_IMPORTED_MODULE_0__buildCommon__["a" /* default */].makeSpan(["arraycolsep"], []); - colSep.style.width = sepwidth + "em"; - cols.push(colSep); - } - } - } - body = __WEBPACK_IMPORTED_MODULE_0__buildCommon__["a" /* default */].makeSpan(["mtable"], cols); - return __WEBPACK_IMPORTED_MODULE_0__buildCommon__["a" /* default */].makeSpan(["mord"], [body], options); -}; - -var mathmlBuilder = function mathmlBuilder(group, options) { - return new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mtable", group.value.body.map(function (row) { - return new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mtr", row.map(function (cell) { - return new __WEBPACK_IMPORTED_MODULE_2__mathMLTree__["a" /* default */].MathNode("mtd", [__WEBPACK_IMPORTED_MODULE_9__buildMathML__["b" /* buildGroup */](cell, options)]); - })); - })); -}; - -// Convinient function for aligned and alignedat environments. -var alignedHandler = function alignedHandler(context, args) { - var res = { - type: "array", - cols: [], - addJot: true - }; - res = parseArray(context.parser, res, "display"); - - // Determining number of columns. - // 1. If the first argument is given, we use it as a number of columns, - // and makes sure that each row doesn't exceed that number. - // 2. Otherwise, just count number of columns = maximum number - // of cells in each row ("aligned" mode -- isAligned will be true). - // - // At the same time, prepend empty group {} at beginning of every second - // cell in each row (starting with second cell) so that operators become - // binary. This behavior is implemented in amsmath's \start@aligned. - var numMaths = void 0; - var numCols = 0; - var emptyGroup = new __WEBPACK_IMPORTED_MODULE_4__ParseNode__["a" /* default */]("ordgroup", [], context.mode); - if (args[0] && args[0].value) { - var arg0 = ""; - for (var i = 0; i < args[0].value.length; i++) { - arg0 += args[0].value[i].value; - } - numMaths = Number(arg0); - numCols = numMaths * 2; - } - var isAligned = !numCols; - res.value.body.forEach(function (row) { - for (var _i = 1; _i < row.length; _i += 2) { - // Modify ordgroup node within styling node - var ordgroup = row[_i].value.value[0]; - ordgroup.value.unshift(emptyGroup); - } - if (!isAligned) { - // Case 1 - var curMaths = row.length / 2; - if (numMaths < curMaths) { - throw new __WEBPACK_IMPORTED_MODULE_3__ParseError__["a" /* default */]("Too many math in a row: " + ("expected " + numMaths + ", but got " + curMaths), row); - } - } else if (numCols < row.length) { - // Case 2 - numCols = row.length; - } - }); - - // Adjusting alignment. - // In aligned mode, we add one \qquad between columns; - // otherwise we add nothing. - for (var _i2 = 0; _i2 < numCols; ++_i2) { - var _align = "r"; - var _pregap = 0; - if (_i2 % 2 === 1) { - _align = "l"; - } else if (_i2 > 0 && isAligned) { - // "aligned" mode. - _pregap = 1; // add one \quad - } - res.value.cols[_i2] = { - type: "align", - align: _align, - pregap: _pregap, - postgap: 0 - }; - } - return res; -}; - -// Arrays are part of LaTeX, defined in lttab.dtx so its documentation -// is part of the source2e.pdf file of LaTeX2e source documentation. -// {darray} is an {array} environment where cells are set in \displaystyle, -// as defined in nccmath.sty. -Object(__WEBPACK_IMPORTED_MODULE_1__defineEnvironment__["b" /* default */])({ - type: "array", - names: ["array", "darray"], - props: { - numArgs: 1 - }, - handler: function handler(context, args) { - var colalign = args[0]; - colalign = colalign.value.map ? colalign.value : [colalign]; - var cols = colalign.map(function (node) { - var ca = node.value; - if ("lcr".indexOf(ca) !== -1) { - return { - type: "align", - align: ca - }; - } else if (ca === "|") { - return { - type: "separator", - separator: "|" - }; - } - throw new __WEBPACK_IMPORTED_MODULE_3__ParseError__["a" /* default */]("Unknown column alignment: " + node.value, node); - }); - var res = { - type: "array", - cols: cols, - hskipBeforeAndAfter: true // \@preamble in lttab.dtx - }; - res = parseArray(context.parser, res, dCellStyle(context.envName)); - return res; - }, - htmlBuilder: htmlBuilder, - mathmlBuilder: mathmlBuilder -}); - -// The matrix environments of amsmath builds on the array environment -// of LaTeX, which is discussed above. -Object(__WEBPACK_IMPORTED_MODULE_1__defineEnvironment__["b" /* default */])({ - type: "array", - names: ["matrix", "pmatrix", "bmatrix", "Bmatrix", "vmatrix", "Vmatrix"], - props: { - numArgs: 0 - }, - handler: function handler(context) { - var delimiters = { - "matrix": null, - "pmatrix": ["(", ")"], - "bmatrix": ["[", "]"], - "Bmatrix": ["\\{", "\\}"], - "vmatrix": ["|", "|"], - "Vmatrix": ["\\Vert", "\\Vert"] - }[context.envName]; - var res = { - type: "array", - hskipBeforeAndAfter: false // \hskip -\arraycolsep in amsmath - }; - res = parseArray(context.parser, res, dCellStyle(context.envName)); - if (delimiters) { - res = new __WEBPACK_IMPORTED_MODULE_4__ParseNode__["a" /* default */]("leftright", { - body: [res], - left: delimiters[0], - right: delimiters[1] - }, context.mode); - } - return res; - }, - htmlBuilder: htmlBuilder, - mathmlBuilder: mathmlBuilder -}); - -// A cases environment (in amsmath.sty) is almost equivalent to -// \def\arraystretch{1.2}% -// \left\{\begin{array}{@{}l@{\quad}l@{}} … \end{array}\right. -// {dcases} is a {cases} environment where cells are set in \displaystyle, -// as defined in mathtools.sty. -Object(__WEBPACK_IMPORTED_MODULE_1__defineEnvironment__["b" /* default */])({ - type: "array", - names: ["cases", "dcases"], - props: { - numArgs: 0 - }, - handler: function handler(context) { - var res = { - type: "array", - arraystretch: 1.2, - cols: [{ - type: "align", - align: "l", - pregap: 0, - // TODO(kevinb) get the current style. - // For now we use the metrics for TEXT style which is what we were - // doing before. Before attempting to get the current style we - // should look at TeX's behavior especially for \over and matrices. - postgap: 1.0 /* 1em quad */ - }, { - type: "align", - align: "l", - pregap: 0, - postgap: 0 - }] - }; - res = parseArray(context.parser, res, dCellStyle(context.envName)); - res = new __WEBPACK_IMPORTED_MODULE_4__ParseNode__["a" /* default */]("leftright", { - body: [res], - left: "\\{", - right: "." - }, context.mode); - return res; - }, - htmlBuilder: htmlBuilder, - mathmlBuilder: mathmlBuilder -}); - -// An aligned environment is like the align* environment -// except it operates within math mode. -// Note that we assume \nomallineskiplimit to be zero, -// so that \strut@ is the same as \strut. -Object(__WEBPACK_IMPORTED_MODULE_1__defineEnvironment__["b" /* default */])({ - type: "array", - names: ["aligned"], - props: { - numArgs: 0 - }, - handler: alignedHandler, - htmlBuilder: htmlBuilder, - mathmlBuilder: mathmlBuilder -}); - -// A gathered environment is like an array environment with one centered -// column, but where rows are considered lines so get \jot line spacing -// and contents are set in \displaystyle. -Object(__WEBPACK_IMPORTED_MODULE_1__defineEnvironment__["b" /* default */])({ - type: "array", - names: ["gathered"], - props: { - numArgs: 0 - }, - handler: function handler(context) { - var res = { - type: "array", - cols: [{ - type: "align", - align: "c" - }], - addJot: true - }; - res = parseArray(context.parser, res, "display"); - return res; - }, - htmlBuilder: htmlBuilder, - mathmlBuilder: mathmlBuilder -}); - -// alignat environment is like an align environment, but one must explicitly -// specify maximum number of columns in each row, and can adjust spacing between -// each columns. -Object(__WEBPACK_IMPORTED_MODULE_1__defineEnvironment__["b" /* default */])({ - type: "array", - names: ["alignedat"], - // One for numbered and for unnumbered; - // but, KaTeX doesn't supports math numbering yet, - // they make no difference for now. - props: { - numArgs: 1 - }, - handler: alignedHandler, - htmlBuilder: htmlBuilder, - mathmlBuilder: mathmlBuilder -}); - -/***/ }), -/* 144 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_toConsumableArray__ = __webpack_require__(35); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_toConsumableArray___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_toConsumableArray__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_classCallCheck__ = __webpack_require__(7); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_classCallCheck___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_classCallCheck__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_createClass__ = __webpack_require__(10); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_createClass___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_createClass__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Lexer__ = __webpack_require__(62); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__Token__ = __webpack_require__(27); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__macros__ = __webpack_require__(146); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__ParseError__ = __webpack_require__(6); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7_object_assign__ = __webpack_require__(147); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7_object_assign___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_7_object_assign__); - - - - -/** - * This file contains the “gullet” where macros are expanded - * until only non-macro tokens remain. - */ - - - - - - - - -var MacroExpander = function () { - function MacroExpander(input, macros, mode) { - __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_classCallCheck___default()(this, MacroExpander); - - this.lexer = new __WEBPACK_IMPORTED_MODULE_3__Lexer__["c" /* default */](input); - this.macros = __WEBPACK_IMPORTED_MODULE_7_object_assign___default()({}, __WEBPACK_IMPORTED_MODULE_5__macros__["a" /* default */], macros); - this.mode = mode; - this.stack = []; // contains tokens in REVERSE order - } - - /** - * Switches between "text" and "math" modes. - */ - - - __WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_createClass___default()(MacroExpander, [{ - key: "switchMode", - value: function switchMode(newMode) { - this.mode = newMode; - } - - /** - * Returns the topmost token on the stack, without expanding it. - * Similar in behavior to TeX's `\futurelet`. - */ - - }, { - key: "future", - value: function future() { - if (this.stack.length === 0) { - this.pushToken(this.lexer.lex()); - } - return this.stack[this.stack.length - 1]; - } - - /** - * Remove and return the next unexpanded token. - */ - - }, { - key: "popToken", - value: function popToken() { - this.future(); // ensure non-empty stack - return this.stack.pop(); - } - - /** - * Add a given token to the token stack. In particular, this get be used - * to put back a token returned from one of the other methods. - */ - - }, { - key: "pushToken", - value: function pushToken(token) { - this.stack.push(token); - } - - /** - * Append an array of tokens to the token stack. - */ - - }, { - key: "pushTokens", - value: function pushTokens(tokens) { - var _stack; - - (_stack = this.stack).push.apply(_stack, __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_toConsumableArray___default()(tokens)); - } - - /** - * Consume all following space tokens, without expansion. - */ - - }, { - key: "consumeSpaces", - value: function consumeSpaces() { - for (;;) { - var token = this.future(); - if (token.text === " ") { - this.stack.pop(); - } else { - break; - } - } - } - - /** - * Consume the specified number of arguments from the token stream, - * and return the resulting array of arguments. - */ - - }, { - key: "consumeArgs", - value: function consumeArgs(numArgs) { - var args = []; - // obtain arguments, either single token or balanced {…} group - for (var i = 0; i < numArgs; ++i) { - this.consumeSpaces(); // ignore spaces before each argument - var startOfArg = this.popToken(); - if (startOfArg.text === "{") { - var arg = []; - var depth = 1; - while (depth !== 0) { - var tok = this.popToken(); - arg.push(tok); - if (tok.text === "{") { - ++depth; - } else if (tok.text === "}") { - --depth; - } else if (tok.text === "EOF") { - throw new __WEBPACK_IMPORTED_MODULE_6__ParseError__["a" /* default */]("End of input in macro argument", startOfArg); - } - } - arg.pop(); // remove last } - arg.reverse(); // like above, to fit in with stack order - args[i] = arg; - } else if (startOfArg.text === "EOF") { - throw new __WEBPACK_IMPORTED_MODULE_6__ParseError__["a" /* default */]("End of input expecting macro argument"); - } else { - args[i] = [startOfArg]; - } - } - return args; - } - - /** - * Expand the next token only once if possible. - * - * If the token is expanded, the resulting tokens will be pushed onto - * the stack in reverse order and will be returned as an array, - * also in reverse order. - * - * If not, the next token will be returned without removing it - * from the stack. This case can be detected by a `Token` return value - * instead of an `Array` return value. - * - * In either case, the next token will be on the top of the stack, - * or the stack will be empty. - * - * Used to implement `expandAfterFuture` and `expandNextToken`. - * - * At the moment, macro expansion doesn't handle delimited macros, - * i.e. things like those defined by \def\foo#1\end{…}. - * See the TeX book page 202ff. for details on how those should behave. - */ - - }, { - key: "expandOnce", - value: function expandOnce() { - var topToken = this.popToken(); - var name = topToken.text; - var isMacro = name.charAt(0) === "\\"; - if (isMacro && __WEBPACK_IMPORTED_MODULE_3__Lexer__["b" /* controlWordRegex */].test(name)) { - // Consume all spaces after \macro (but not \\, \', etc.) - this.consumeSpaces(); - } - if (!this.macros.hasOwnProperty(name)) { - // Fully expanded - this.pushToken(topToken); - return topToken; - } - - var _getExpansion2 = this._getExpansion(name), - tokens = _getExpansion2.tokens, - numArgs = _getExpansion2.numArgs; - - var expansion = tokens; - if (numArgs) { - var args = this.consumeArgs(numArgs); - // paste arguments in place of the placeholders - expansion = expansion.slice(); // make a shallow copy - for (var i = expansion.length - 1; i >= 0; --i) { - var tok = expansion[i]; - if (tok.text === "#") { - if (i === 0) { - throw new __WEBPACK_IMPORTED_MODULE_6__ParseError__["a" /* default */]("Incomplete placeholder at end of macro body", tok); - } - tok = expansion[--i]; // next token on stack - if (tok.text === "#") { - // ## → # - expansion.splice(i + 1, 1); // drop first # - } else if (/^[1-9]$/.test(tok.text)) { - var _expansion; - - // replace the placeholder with the indicated argument - (_expansion = expansion).splice.apply(_expansion, [i, 2].concat(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_toConsumableArray___default()(args[+tok.text - 1]))); - } else { - throw new __WEBPACK_IMPORTED_MODULE_6__ParseError__["a" /* default */]("Not a valid argument number", tok); - } - } - } - } - // Concatenate expansion onto top of stack. - this.pushTokens(expansion); - return expansion; - } - - /** - * Expand the next token only once (if possible), and return the resulting - * top token on the stack (without removing anything from the stack). - * Similar in behavior to TeX's `\expandafter\futurelet`. - * Equivalent to expandOnce() followed by future(). - */ - - }, { - key: "expandAfterFuture", - value: function expandAfterFuture() { - this.expandOnce(); - return this.future(); - } - - /** - * Recursively expand first token, then return first non-expandable token. - */ - - }, { - key: "expandNextToken", - value: function expandNextToken() { - for (;;) { - var expanded = this.expandOnce(); - // expandOnce returns Token if and only if it's fully expanded. - if (expanded instanceof __WEBPACK_IMPORTED_MODULE_4__Token__["a" /* Token */]) { - // \relax stops the expansion, but shouldn't get returned (a - // null return value couldn't get implemented as a function). - if (expanded.text === "\\relax") { - this.stack.pop(); - } else { - return this.stack.pop(); // === expanded - } - } - } - - // Flow unable to figure out that this pathway is impossible. - // https://github.com/facebook/flow/issues/4808 - throw new Error(); // eslint-disable-line no-unreachable - } - - /** - * Returns the expanded macro as a reversed array of tokens and a macro - * argument count. - * Caches macro expansions for those that were defined simple TeX strings. - */ - - }, { - key: "_getExpansion", - value: function _getExpansion(name) { - var definition = this.macros[name]; - var expansion = typeof definition === "function" ? definition(this) : definition; - if (typeof expansion === "string") { - var numArgs = 0; - if (expansion.indexOf("#") !== -1) { - var stripped = expansion.replace(/##/g, ""); - while (stripped.indexOf("#" + (numArgs + 1)) !== -1) { - ++numArgs; - } - } - var bodyLexer = new __WEBPACK_IMPORTED_MODULE_3__Lexer__["c" /* default */](expansion); - var tokens = []; - var tok = bodyLexer.lex(); - while (tok.text !== "EOF") { - tokens.push(tok); - tok = bodyLexer.lex(); - } - tokens.reverse(); // to fit in with stack using push and pop - var expanded = { tokens: tokens, numArgs: numArgs }; - // Cannot cache a macro defined using a function since it relies on - // parser context. - if (typeof definition !== "function") { - this.macros[name] = expanded; - } - return expanded; - } - - return expansion; - } - }]); - - return MacroExpander; -}(); - -/* harmony default export */ __webpack_exports__["a"] = (MacroExpander); - -/***/ }), -/* 145 */ -/***/ (function(module, exports) { - -function getRelocatable(re) { - // In the future, this could use a WeakMap instead of an expando. - if (!re.__matchAtRelocatable) { - // Disjunctions are the lowest-precedence operator, so we can make any - // pattern match the empty string by appending `|()` to it: - // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-patterns - var source = re.source + '|()'; - - // We always make the new regex global. - var flags = 'g' + (re.ignoreCase ? 'i' : '') + (re.multiline ? 'm' : '') + (re.unicode ? 'u' : '') - // sticky (/.../y) doesn't make sense in conjunction with our relocation - // logic, so we ignore it here. - ; - - re.__matchAtRelocatable = new RegExp(source, flags); - } - return re.__matchAtRelocatable; -} - -function matchAt(re, str, pos) { - if (re.global || re.sticky) { - throw new Error('matchAt(...): Only non-global regexes are supported'); - } - var reloc = getRelocatable(re); - reloc.lastIndex = pos; - var match = reloc.exec(str); - // Last capturing group is our sentinel that indicates whether the regex - // matched at the given location. - if (match[match.length - 1] == null) { - // Original regex matched. - match.length = match.length - 1; - return match; - } else { - return null; - } -} - -module.exports = matchAt; - -/***/ }), -/* 146 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* unused harmony export defineMacro */ -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__submodules_katex_fonts_fontMetricsData__ = __webpack_require__(59); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__symbols__ = __webpack_require__(28); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__utils__ = __webpack_require__(5); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Token__ = __webpack_require__(27); - -/** - * Predefined macros for KaTeX. - * This can be used to define some commands in terms of others. - */ - - - - - - -/** - * Provides context to macros defined by functions. Implemented by - * MacroExpander. - */ - - -/** Macro tokens (in reverse order). */ - - -var builtinMacros = {}; -/* harmony default export */ __webpack_exports__["a"] = (builtinMacros); - -// This function might one day accept an additional argument and do more things. -function defineMacro(name, body) { - builtinMacros[name] = body; -} - -////////////////////////////////////////////////////////////////////// -// macro tools - -// LaTeX's \@firstoftwo{#1}{#2} expands to #1, skipping #2 -// TeX source: \long\def\@firstoftwo#1#2{#1} -defineMacro("\\@firstoftwo", function (context) { - var args = context.consumeArgs(2); - return { tokens: args[0], numArgs: 0 }; -}); - -// LaTeX's \@secondoftwo{#1}{#2} expands to #2, skipping #1 -// TeX source: \long\def\@secondoftwo#1#2{#2} -defineMacro("\\@secondoftwo", function (context) { - var args = context.consumeArgs(2); - return { tokens: args[1], numArgs: 0 }; -}); - -// LaTeX's \@ifnextchar{#1}{#2}{#3} looks ahead to the next (unexpanded) -// symbol. If it matches #1, then the macro expands to #2; otherwise, #3. -// Note, however, that it does not consume the next symbol in either case. -defineMacro("\\@ifnextchar", function (context) { - var args = context.consumeArgs(3); // symbol, if, else - var nextToken = context.future(); - if (args[0].length === 1 && args[0][0].text === nextToken.text) { - return { tokens: args[1], numArgs: 0 }; - } else { - return { tokens: args[2], numArgs: 0 }; - } -}); - -// LaTeX's \@ifstar{#1}{#2} looks ahead to the next (unexpanded) symbol. -// If it is `*`, then it consumes the symbol, and the macro expands to #1; -// otherwise, the macro expands to #2 (without consuming the symbol). -// TeX source: \def\@ifstar#1{\@ifnextchar *{\@firstoftwo{#1}}} -defineMacro("\\@ifstar", "\\@ifnextchar *{\\@firstoftwo{#1}}"); - -// LaTeX's \TextOrMath{#1}{#2} expands to #1 in text mode, #2 in math mode -defineMacro("\\TextOrMath", function (context) { - var args = context.consumeArgs(2); - if (context.mode === 'text') { - return { tokens: args[0], numArgs: 0 }; - } else { - return { tokens: args[1], numArgs: 0 }; - } -}); - -////////////////////////////////////////////////////////////////////// -// Grouping -// \let\bgroup={ \let\egroup=} -defineMacro("\\bgroup", "{"); -defineMacro("\\egroup", "}"); -defineMacro("\\begingroup", "{"); -defineMacro("\\endgroup", "}"); - -// Symbols from latex.ltx: -// \def\lq{`} -// \def\rq{'} -// \def\lbrack{[} -// \def\rbrack{]} -// \def \aa {\r a} -// \def \AA {\r A} -defineMacro("\\lq", "`"); -defineMacro("\\rq", "'"); -defineMacro("\\lbrack", "["); -defineMacro("\\rbrack", "]"); -defineMacro("\\aa", "\\r a"); -defineMacro("\\AA", "\\r A"); - -// Unicode double-struck letters -defineMacro("\u2102", "\\mathbb{C}"); -defineMacro("\u210D", "\\mathbb{H}"); -defineMacro("\u2115", "\\mathbb{N}"); -defineMacro("\u2119", "\\mathbb{P}"); -defineMacro("\u211A", "\\mathbb{Q}"); -defineMacro("\u211D", "\\mathbb{R}"); -defineMacro("\u2124", "\\mathbb{Z}"); - -// Unicode middle dot -// The KaTeX fonts do not contain U+00B7. Instead, \cdotp displays -// the dot at U+22C5 and gives it punct spacing. -defineMacro("\xB7", "\\cdotp"); - -// \llap and \rlap render their contents in text mode -defineMacro("\\llap", "\\mathllap{\\textrm{#1}}"); -defineMacro("\\rlap", "\\mathrlap{\\textrm{#1}}"); -defineMacro("\\clap", "\\mathclap{\\textrm{#1}}"); - -////////////////////////////////////////////////////////////////////// -// amsmath.sty -// http://mirrors.concertpass.com/tex-archive/macros/latex/required/amsmath/amsmath.pdf - -// Italic Greek capital letters. AMS defines these with \DeclareMathSymbol, -// but they are equivalent to \mathit{\Letter}. -defineMacro("\\varGamma", "\\mathit{\\Gamma}"); -defineMacro("\\varDelta", "\\mathit{\\Delta}"); -defineMacro("\\varTheta", "\\mathit{\\Theta}"); -defineMacro("\\varLambda", "\\mathit{\\Lambda}"); -defineMacro("\\varXi", "\\mathit{\\Xi}"); -defineMacro("\\varPi", "\\mathit{\\Pi}"); -defineMacro("\\varSigma", "\\mathit{\\Sigma}"); -defineMacro("\\varUpsilon", "\\mathit{\\Upsilon}"); -defineMacro("\\varPhi", "\\mathit{\\Phi}"); -defineMacro("\\varPsi", "\\mathit{\\Psi}"); -defineMacro("\\varOmega", "\\mathit{\\Omega}"); - -// \def\overset#1#2{\binrel@{#2}\binrel@@{\mathop{\kern\z@#2}\limits^{#1}}} -defineMacro("\\overset", "\\mathop{#2}\\limits^{#1}"); -defineMacro("\\underset", "\\mathop{#2}\\limits_{#1}"); - -// \newcommand{\boxed}[1]{\fbox{\m@th$\displaystyle#1$}} -defineMacro("\\boxed", "\\fbox{\\displaystyle{#1}}"); - -// \def\iff{\DOTSB\;\Longleftrightarrow\;} -// \def\implies{\DOTSB\;\Longrightarrow\;} -// \def\impliedby{\DOTSB\;\Longleftarrow\;} -defineMacro("\\iff", "\\DOTSB\\;\\Longleftrightarrow\\;"); -defineMacro("\\implies", "\\DOTSB\\;\\Longrightarrow\\;"); -defineMacro("\\impliedby", "\\DOTSB\\;\\Longleftarrow\\;"); - -// AMSMath's automatic \dots, based on \mdots@@ macro. -var dotsByToken = { - ',': '\\dotsc', - '\\not': '\\dotsb', - // \keybin@ checks for the following: - '+': '\\dotsb', - '=': '\\dotsb', - '<': '\\dotsb', - '>': '\\dotsb', - '-': '\\dotsb', - '*': '\\dotsb', - ':': '\\dotsb', - // Symbols whose definition starts with \DOTSB: - '\\DOTSB': '\\dotsb', - '\\coprod': '\\dotsb', - '\\bigvee': '\\dotsb', - '\\bigwedge': '\\dotsb', - '\\biguplus': '\\dotsb', - '\\bigcap': '\\dotsb', - '\\bigcup': '\\dotsb', - '\\prod': '\\dotsb', - '\\sum': '\\dotsb', - '\\bigotimes': '\\dotsb', - '\\bigoplus': '\\dotsb', - '\\bigodot': '\\dotsb', - '\\bigsqcup': '\\dotsb', - '\\implies': '\\dotsb', - '\\impliedby': '\\dotsb', - '\\And': '\\dotsb', - '\\longrightarrow': '\\dotsb', - '\\Longrightarrow': '\\dotsb', - '\\longleftarrow': '\\dotsb', - '\\Longleftarrow': '\\dotsb', - '\\longleftrightarrow': '\\dotsb', - '\\Longleftrightarrow': '\\dotsb', - '\\mapsto': '\\dotsb', - '\\longmapsto': '\\dotsb', - '\\hookrightarrow': '\\dotsb', - '\\iff': '\\dotsb', - '\\doteq': '\\dotsb', - // Symbols whose definition starts with \mathbin: - '\\mathbin': '\\dotsb', - '\\bmod': '\\dotsb', - // Symbols whose definition starts with \mathrel: - '\\mathrel': '\\dotsb', - '\\relbar': '\\dotsb', - '\\Relbar': '\\dotsb', - '\\xrightarrow': '\\dotsb', - '\\xleftarrow': '\\dotsb', - // Symbols whose definition starts with \DOTSI: - '\\DOTSI': '\\dotsi', - '\\int': '\\dotsi', - '\\oint': '\\dotsi', - '\\iint': '\\dotsi', - '\\iiint': '\\dotsi', - '\\iiiint': '\\dotsi', - '\\idotsint': '\\dotsi', - // Symbols whose definition starts with \DOTSX: - '\\DOTSX': '\\dotsx' -}; - -defineMacro("\\dots", function (context) { - // TODO: If used in text mode, should expand to \textellipsis. - // However, in KaTeX, \textellipsis and \ldots behave the same - // (in text mode), and it's unlikely we'd see any of the math commands - // that affect the behavior of \dots when in text mode. So fine for now - // (until we support \ifmmode ... \else ... \fi). - var thedots = '\\dotso'; - var next = context.expandAfterFuture().text; - if (next in dotsByToken) { - thedots = dotsByToken[next]; - } else if (next.substr(0, 4) === '\\not') { - thedots = '\\dotsb'; - } else if (next in __WEBPACK_IMPORTED_MODULE_1__symbols__["a" /* default */].math) { - if (__WEBPACK_IMPORTED_MODULE_2__utils__["a" /* default */].contains(['bin', 'rel'], __WEBPACK_IMPORTED_MODULE_1__symbols__["a" /* default */].math[next].group)) { - thedots = '\\dotsb'; - } - } - return thedots; -}); - -var spaceAfterDots = { - // \rightdelim@ checks for the following: - ')': true, - ']': true, - '\\rbrack': true, - '\\}': true, - '\\rbrace': true, - '\\rangle': true, - '\\rceil': true, - '\\rfloor': true, - '\\rgroup': true, - '\\rmoustache': true, - '\\right': true, - '\\bigr': true, - '\\biggr': true, - '\\Bigr': true, - '\\Biggr': true, - // \extra@ also tests for the following: - '$': true, - // \extrap@ checks for the following: - ';': true, - '.': true, - ',': true -}; - -defineMacro("\\dotso", function (context) { - var next = context.future().text; - if (next in spaceAfterDots) { - return "\\ldots\\,"; - } else { - return "\\ldots"; - } -}); - -defineMacro("\\dotsc", function (context) { - var next = context.future().text; - // \dotsc uses \extra@ but not \extrap@, instead specially checking for - // ';' and '.', but doesn't check for ','. - if (next in spaceAfterDots && next !== ',') { - return "\\ldots\\,"; - } else { - return "\\ldots"; - } -}); - -defineMacro("\\cdots", function (context) { - var next = context.future().text; - if (next in spaceAfterDots) { - return "\\@cdots\\,"; - } else { - return "\\@cdots"; - } -}); - -defineMacro("\\dotsb", "\\cdots"); -defineMacro("\\dotsm", "\\cdots"); -defineMacro("\\dotsi", "\\!\\cdots"); -// amsmath doesn't actually define \dotsx, but \dots followed by a macro -// starting with \DOTSX implies \dotso, and then \extra@ detects this case -// and forces the added `\,`. -defineMacro("\\dotsx", "\\ldots\\,"); - -// \let\DOTSI\relax -// \let\DOTSB\relax -// \let\DOTSX\relax -defineMacro("\\DOTSI", "\\relax"); -defineMacro("\\DOTSB", "\\relax"); -defineMacro("\\DOTSX", "\\relax"); - -// http://texdoc.net/texmf-dist/doc/latex/amsmath/amsmath.pdf -defineMacro("\\thinspace", "\\,"); // \let\thinspace\, -defineMacro("\\medspace", "\\:"); // \let\medspace\: -defineMacro("\\thickspace", "\\;"); // \let\thickspace\; - -////////////////////////////////////////////////////////////////////// -// LaTeX source2e - -// \def\TeX{T\kern-.1667em\lower.5ex\hbox{E}\kern-.125emX\@} -// TODO: Doesn't normally work in math mode because \@ fails. KaTeX doesn't -// support \@ yet, so that's omitted, and we add \text so that the result -// doesn't look funny in math mode. -defineMacro("\\TeX", "\\textrm{T\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125emX}"); - -// \DeclareRobustCommand{\LaTeX}{L\kern-.36em% -// {\sbox\z@ T% -// \vbox to\ht\z@{\hbox{\check@mathfonts -// \fontsize\sf@size\z@ -// \math@fontsfalse\selectfont -// A}% -// \vss}% -// }% -// \kern-.15em% -// \TeX} -// This code aligns the top of the A with the T (from the perspective of TeX's -// boxes, though visually the A appears to extend above slightly). -// We compute the corresponding \raisebox when A is rendered at \scriptsize, -// which is size3, which has a scale factor of 0.7 (see Options.js). -var latexRaiseA = __WEBPACK_IMPORTED_MODULE_0__submodules_katex_fonts_fontMetricsData__["a" /* default */]['Main-Regular']["T".charCodeAt(0)][1] - 0.7 * __WEBPACK_IMPORTED_MODULE_0__submodules_katex_fonts_fontMetricsData__["a" /* default */]['Main-Regular']["A".charCodeAt(0)][1] + "em"; -defineMacro("\\LaTeX", "\\textrm{L\\kern-.36em\\raisebox{" + latexRaiseA + "}{\\scriptsize A}" + "\\kern-.15em\\TeX}"); - -// New KaTeX logo based on tweaking LaTeX logo -defineMacro("\\KaTeX", "\\textrm{K\\kern-.17em\\raisebox{" + latexRaiseA + "}{\\scriptsize A}" + "\\kern-.15em\\TeX}"); - -// \DeclareRobustCommand\hspace{\@ifstar\@hspacer\@hspace} -// \def\@hspace#1{\hskip #1\relax} -// KaTeX doesn't do line breaks, so \hspace and \hspace* are the same as \kern -defineMacro("\\hspace", "\\@ifstar\\kern\\kern"); - -////////////////////////////////////////////////////////////////////// -// mathtools.sty - -//\providecommand\ordinarycolon{:} -defineMacro("\\ordinarycolon", ":"); -//\def\vcentcolon{\mathrel{\mathop\ordinarycolon}} -//TODO(edemaine): Not yet centered. Fix via \raisebox or #726 -defineMacro("\\vcentcolon", "\\mathrel{\\mathop\\ordinarycolon}"); -// \providecommand*\dblcolon{\vcentcolon\mathrel{\mkern-.9mu}\vcentcolon} -defineMacro("\\dblcolon", "\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon"); -// \providecommand*\coloneqq{\vcentcolon\mathrel{\mkern-1.2mu}=} -defineMacro("\\coloneqq", "\\vcentcolon\\mathrel{\\mkern-1.2mu}="); -// \providecommand*\Coloneqq{\dblcolon\mathrel{\mkern-1.2mu}=} -defineMacro("\\Coloneqq", "\\dblcolon\\mathrel{\\mkern-1.2mu}="); -// \providecommand*\coloneq{\vcentcolon\mathrel{\mkern-1.2mu}\mathrel{-}} -defineMacro("\\coloneq", "\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}"); -// \providecommand*\Coloneq{\dblcolon\mathrel{\mkern-1.2mu}\mathrel{-}} -defineMacro("\\Coloneq", "\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}"); -// \providecommand*\eqqcolon{=\mathrel{\mkern-1.2mu}\vcentcolon} -defineMacro("\\eqqcolon", "=\\mathrel{\\mkern-1.2mu}\\vcentcolon"); -// \providecommand*\Eqqcolon{=\mathrel{\mkern-1.2mu}\dblcolon} -defineMacro("\\Eqqcolon", "=\\mathrel{\\mkern-1.2mu}\\dblcolon"); -// \providecommand*\eqcolon{\mathrel{-}\mathrel{\mkern-1.2mu}\vcentcolon} -defineMacro("\\eqcolon", "\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon"); -// \providecommand*\Eqcolon{\mathrel{-}\mathrel{\mkern-1.2mu}\dblcolon} -defineMacro("\\Eqcolon", "\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon"); -// \providecommand*\colonapprox{\vcentcolon\mathrel{\mkern-1.2mu}\approx} -defineMacro("\\colonapprox", "\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx"); -// \providecommand*\Colonapprox{\dblcolon\mathrel{\mkern-1.2mu}\approx} -defineMacro("\\Colonapprox", "\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx"); -// \providecommand*\colonsim{\vcentcolon\mathrel{\mkern-1.2mu}\sim} -defineMacro("\\colonsim", "\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim"); -// \providecommand*\Colonsim{\dblcolon\mathrel{\mkern-1.2mu}\sim} -defineMacro("\\Colonsim", "\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim"); - -// Some Unicode characters are implemented with macros to mathtools functions. -defineMacro("\u2254", "\\coloneqq"); // := -defineMacro("\u2255", "\\eqqcolon"); // =: -defineMacro("\u2A74", "\\Coloneqq"); // ::= - -////////////////////////////////////////////////////////////////////// -// colonequals.sty - -// Alternate names for mathtools's macros: -defineMacro("\\ratio", "\\vcentcolon"); -defineMacro("\\coloncolon", "\\dblcolon"); -defineMacro("\\colonequals", "\\coloneqq"); -defineMacro("\\coloncolonequals", "\\Coloneqq"); -defineMacro("\\equalscolon", "\\eqqcolon"); -defineMacro("\\equalscoloncolon", "\\Eqqcolon"); -defineMacro("\\colonminus", "\\coloneq"); -defineMacro("\\coloncolonminus", "\\Coloneq"); -defineMacro("\\minuscolon", "\\eqcolon"); -defineMacro("\\minuscoloncolon", "\\Eqcolon"); -// \colonapprox name is same in mathtools and colonequals. -defineMacro("\\coloncolonapprox", "\\Colonapprox"); -// \colonsim name is same in mathtools and colonequals. -defineMacro("\\coloncolonsim", "\\Colonsim"); - -// Additional macros, implemented by analogy with mathtools definitions: -defineMacro("\\simcolon", "\\sim\\mathrel{\\mkern-1.2mu}\\vcentcolon"); -defineMacro("\\simcoloncolon", "\\sim\\mathrel{\\mkern-1.2mu}\\dblcolon"); -defineMacro("\\approxcolon", "\\approx\\mathrel{\\mkern-1.2mu}\\vcentcolon"); -defineMacro("\\approxcoloncolon", "\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon"); - -// Present in newtxmath, pxfonts and txfonts -// TODO: The unicode character U+220C ∌ should be added to the font, and this -// macro turned into a propper defineSymbol in symbols.js. That way, the -// MathML result will be much cleaner. -defineMacro("\\notni", "\\not\\ni"); -defineMacro("\\limsup", "\\DOTSB\\mathop{\\operatorname{lim\\,sup}}\\limits"); -defineMacro("\\liminf", "\\DOTSB\\mathop{\\operatorname{lim\\,inf}}\\limits"); - -/***/ }), -/* 147 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/* -object-assign -(c) Sindre Sorhus -@license MIT -*/ - - -/* eslint-disable no-unused-vars */ -var getOwnPropertySymbols = Object.getOwnPropertySymbols; -var hasOwnProperty = Object.prototype.hasOwnProperty; -var propIsEnumerable = Object.prototype.propertyIsEnumerable; - -function toObject(val) { - if (val === null || val === undefined) { - throw new TypeError('Object.assign cannot be called with null or undefined'); - } - - return Object(val); -} - -function shouldUseNative() { - try { - if (!Object.assign) { - return false; - } - - // Detect buggy property enumeration order in older V8 versions. - - // https://bugs.chromium.org/p/v8/issues/detail?id=4118 - var test1 = new String('abc'); // eslint-disable-line no-new-wrappers - test1[5] = 'de'; - if (Object.getOwnPropertyNames(test1)[0] === '5') { - return false; - } - - // https://bugs.chromium.org/p/v8/issues/detail?id=3056 - var test2 = {}; - for (var i = 0; i < 10; i++) { - test2['_' + String.fromCharCode(i)] = i; - } - var order2 = Object.getOwnPropertyNames(test2).map(function (n) { - return test2[n]; - }); - if (order2.join('') !== '0123456789') { - return false; - } - - // https://bugs.chromium.org/p/v8/issues/detail?id=3056 - var test3 = {}; - 'abcdefghijklmnopqrst'.split('').forEach(function (letter) { - test3[letter] = letter; - }); - if (Object.keys(Object.assign({}, test3)).join('') !== - 'abcdefghijklmnopqrst') { - return false; - } - - return true; - } catch (err) { - // We don't expect any of the above to throw, but better to be safe. - return false; - } -} - -module.exports = shouldUseNative() ? Object.assign : function (target, source) { - var from; - var to = toObject(target); - var symbols; - - for (var s = 1; s < arguments.length; s++) { - from = Object(arguments[s]); - - for (var key in from) { - if (hasOwnProperty.call(from, key)) { - to[key] = from[key]; - } - } - - if (getOwnPropertySymbols) { - symbols = getOwnPropertySymbols(from); - for (var i = 0; i < symbols.length; i++) { - if (propIsEnumerable.call(from, symbols[i])) { - to[symbols[i]] = from[symbols[i]]; - } - } - } - } - - return to; -}; - - -/***/ }), -/* 148 */ -/***/ (function(module, exports) { - -// Mapping of Unicode accent characters to their LaTeX equivalent in text and -// math mode (when they exist). - -// NOTE: This module needs to be written with Node-style modules (not -// ES6 modules) so that unicodeMake.js (a Node application) can import it. -module.exports = { - '\u0301': { text: "\\'", math: '\\acute' }, - '\u0300': { text: '\\`', math: '\\grave' }, - '\u0308': { text: '\\"', math: '\\ddot' }, - '\u0303': { text: '\\~', math: '\\tilde' }, - '\u0304': { text: '\\=', math: '\\bar' }, - '\u0306': { text: '\\u', math: '\\breve' }, - '\u030C': { text: '\\v', math: '\\check' }, - '\u0302': { text: '\\^', math: '\\hat' }, - '\u0307': { text: '\\.', math: '\\dot' }, - '\u030A': { text: '\\r', math: '\\mathring' }, - '\u030B': { text: '\\H' } -}; - -/***/ }), -/* 149 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -// This file is GENERATED by unicodeMake.js. DO NOT MODIFY. - -/* harmony default export */ __webpack_exports__["a"] = ({ - "\xE1": "a\u0301", // á = \'{a} - "\xE0": "a\u0300", // à = \`{a} - "\xE4": "a\u0308", // ä = \"{a} - "\u01DF": "a\u0308\u0304", // ǟ = \"\={a} - "\xE3": "a\u0303", // ã = \~{a} - "\u0101": "a\u0304", // ā = \={a} - "\u0103": "a\u0306", // ă = \u{a} - "\u1EAF": "a\u0306\u0301", // ắ = \u\'{a} - "\u1EB1": "a\u0306\u0300", // ằ = \u\`{a} - "\u1EB5": "a\u0306\u0303", // ẵ = \u\~{a} - "\u01CE": "a\u030C", // ǎ = \v{a} - "\xE2": "a\u0302", // â = \^{a} - "\u1EA5": "a\u0302\u0301", // ấ = \^\'{a} - "\u1EA7": "a\u0302\u0300", // ầ = \^\`{a} - "\u1EAB": "a\u0302\u0303", // ẫ = \^\~{a} - "\u0227": "a\u0307", // ȧ = \.{a} - "\u01E1": "a\u0307\u0304", // ǡ = \.\={a} - "\xE5": "a\u030A", // å = \r{a} - "\u01FB": "a\u030A\u0301", // ǻ = \r\'{a} - "\u1E03": "b\u0307", // ḃ = \.{b} - "\u0107": "c\u0301", // ć = \'{c} - "\u010D": "c\u030C", // č = \v{c} - "\u0109": "c\u0302", // ĉ = \^{c} - "\u010B": "c\u0307", // ċ = \.{c} - "\u010F": "d\u030C", // ď = \v{d} - "\u1E0B": "d\u0307", // ḋ = \.{d} - "\xE9": "e\u0301", // é = \'{e} - "\xE8": "e\u0300", // è = \`{e} - "\xEB": "e\u0308", // ë = \"{e} - "\u1EBD": "e\u0303", // ẽ = \~{e} - "\u0113": "e\u0304", // ē = \={e} - "\u1E17": "e\u0304\u0301", // ḗ = \=\'{e} - "\u1E15": "e\u0304\u0300", // ḕ = \=\`{e} - "\u0115": "e\u0306", // ĕ = \u{e} - "\u011B": "e\u030C", // ě = \v{e} - "\xEA": "e\u0302", // ê = \^{e} - "\u1EBF": "e\u0302\u0301", // ế = \^\'{e} - "\u1EC1": "e\u0302\u0300", // ề = \^\`{e} - "\u1EC5": "e\u0302\u0303", // ễ = \^\~{e} - "\u0117": "e\u0307", // ė = \.{e} - "\u1E1F": "f\u0307", // ḟ = \.{f} - "\u01F5": "g\u0301", // ǵ = \'{g} - "\u1E21": "g\u0304", // ḡ = \={g} - "\u011F": "g\u0306", // ğ = \u{g} - "\u01E7": "g\u030C", // ǧ = \v{g} - "\u011D": "g\u0302", // ĝ = \^{g} - "\u0121": "g\u0307", // ġ = \.{g} - "\u1E27": "h\u0308", // ḧ = \"{h} - "\u021F": "h\u030C", // ȟ = \v{h} - "\u0125": "h\u0302", // ĥ = \^{h} - "\u1E23": "h\u0307", // ḣ = \.{h} - "\xED": "i\u0301", // í = \'{i} - "\xEC": "i\u0300", // ì = \`{i} - "\xEF": "i\u0308", // ï = \"{i} - "\u1E2F": "i\u0308\u0301", // ḯ = \"\'{i} - "\u0129": "i\u0303", // ĩ = \~{i} - "\u012B": "i\u0304", // ī = \={i} - "\u012D": "i\u0306", // ĭ = \u{i} - "\u01D0": "i\u030C", // ǐ = \v{i} - "\xEE": "i\u0302", // î = \^{i} - "\u01F0": "j\u030C", // ǰ = \v{j} - "\u0135": "j\u0302", // ĵ = \^{j} - "\u1E31": "k\u0301", // ḱ = \'{k} - "\u01E9": "k\u030C", // ǩ = \v{k} - "\u013A": "l\u0301", // ĺ = \'{l} - "\u013E": "l\u030C", // ľ = \v{l} - "\u1E3F": "m\u0301", // ḿ = \'{m} - "\u1E41": "m\u0307", // ṁ = \.{m} - "\u0144": "n\u0301", // ń = \'{n} - "\u01F9": "n\u0300", // ǹ = \`{n} - "\xF1": "n\u0303", // ñ = \~{n} - "\u0148": "n\u030C", // ň = \v{n} - "\u1E45": "n\u0307", // ṅ = \.{n} - "\xF3": "o\u0301", // ó = \'{o} - "\xF2": "o\u0300", // ò = \`{o} - "\xF6": "o\u0308", // ö = \"{o} - "\u022B": "o\u0308\u0304", // ȫ = \"\={o} - "\xF5": "o\u0303", // õ = \~{o} - "\u1E4D": "o\u0303\u0301", // ṍ = \~\'{o} - "\u1E4F": "o\u0303\u0308", // ṏ = \~\"{o} - "\u022D": "o\u0303\u0304", // ȭ = \~\={o} - "\u014D": "o\u0304", // ō = \={o} - "\u1E53": "o\u0304\u0301", // ṓ = \=\'{o} - "\u1E51": "o\u0304\u0300", // ṑ = \=\`{o} - "\u014F": "o\u0306", // ŏ = \u{o} - "\u01D2": "o\u030C", // ǒ = \v{o} - "\xF4": "o\u0302", // ô = \^{o} - "\u1ED1": "o\u0302\u0301", // ố = \^\'{o} - "\u1ED3": "o\u0302\u0300", // ồ = \^\`{o} - "\u1ED7": "o\u0302\u0303", // ỗ = \^\~{o} - "\u022F": "o\u0307", // ȯ = \.{o} - "\u0231": "o\u0307\u0304", // ȱ = \.\={o} - "\u0151": "o\u030B", // ő = \H{o} - "\u1E55": "p\u0301", // ṕ = \'{p} - "\u1E57": "p\u0307", // ṗ = \.{p} - "\u0155": "r\u0301", // ŕ = \'{r} - "\u0159": "r\u030C", // ř = \v{r} - "\u1E59": "r\u0307", // ṙ = \.{r} - "\u015B": "s\u0301", // ś = \'{s} - "\u1E65": "s\u0301\u0307", // ṥ = \'\.{s} - "\u0161": "s\u030C", // š = \v{s} - "\u1E67": "s\u030C\u0307", // ṧ = \v\.{s} - "\u015D": "s\u0302", // ŝ = \^{s} - "\u1E61": "s\u0307", // ṡ = \.{s} - "\u1E97": "t\u0308", // ẗ = \"{t} - "\u0165": "t\u030C", // ť = \v{t} - "\u1E6B": "t\u0307", // ṫ = \.{t} - "\xFA": "u\u0301", // ú = \'{u} - "\xF9": "u\u0300", // ù = \`{u} - "\xFC": "u\u0308", // ü = \"{u} - "\u01D8": "u\u0308\u0301", // ǘ = \"\'{u} - "\u01DC": "u\u0308\u0300", // ǜ = \"\`{u} - "\u01D6": "u\u0308\u0304", // ǖ = \"\={u} - "\u01DA": "u\u0308\u030C", // ǚ = \"\v{u} - "\u0169": "u\u0303", // ũ = \~{u} - "\u1E79": "u\u0303\u0301", // ṹ = \~\'{u} - "\u016B": "u\u0304", // ū = \={u} - "\u1E7B": "u\u0304\u0308", // ṻ = \=\"{u} - "\u016D": "u\u0306", // ŭ = \u{u} - "\u01D4": "u\u030C", // ǔ = \v{u} - "\xFB": "u\u0302", // û = \^{u} - "\u016F": "u\u030A", // ů = \r{u} - "\u0171": "u\u030B", // ű = \H{u} - "\u1E7D": "v\u0303", // ṽ = \~{v} - "\u1E83": "w\u0301", // ẃ = \'{w} - "\u1E81": "w\u0300", // ẁ = \`{w} - "\u1E85": "w\u0308", // ẅ = \"{w} - "\u0175": "w\u0302", // ŵ = \^{w} - "\u1E87": "w\u0307", // ẇ = \.{w} - "\u1E98": "w\u030A", // ẘ = \r{w} - "\u1E8D": "x\u0308", // ẍ = \"{x} - "\u1E8B": "x\u0307", // ẋ = \.{x} - "\xFD": "y\u0301", // ý = \'{y} - "\u1EF3": "y\u0300", // ỳ = \`{y} - "\xFF": "y\u0308", // ÿ = \"{y} - "\u1EF9": "y\u0303", // ỹ = \~{y} - "\u0233": "y\u0304", // ȳ = \={y} - "\u0177": "y\u0302", // ŷ = \^{y} - "\u1E8F": "y\u0307", // ẏ = \.{y} - "\u1E99": "y\u030A", // ẙ = \r{y} - "\u017A": "z\u0301", // ź = \'{z} - "\u017E": "z\u030C", // ž = \v{z} - "\u1E91": "z\u0302", // ẑ = \^{z} - "\u017C": "z\u0307", // ż = \.{z} - "\xC1": "A\u0301", // Á = \'{A} - "\xC0": "A\u0300", // À = \`{A} - "\xC4": "A\u0308", // Ä = \"{A} - "\u01DE": "A\u0308\u0304", // Ǟ = \"\={A} - "\xC3": "A\u0303", // Ã = \~{A} - "\u0100": "A\u0304", // Ā = \={A} - "\u0102": "A\u0306", // Ă = \u{A} - "\u1EAE": "A\u0306\u0301", // Ắ = \u\'{A} - "\u1EB0": "A\u0306\u0300", // Ằ = \u\`{A} - "\u1EB4": "A\u0306\u0303", // Ẵ = \u\~{A} - "\u01CD": "A\u030C", // Ǎ = \v{A} - "\xC2": "A\u0302", // Â = \^{A} - "\u1EA4": "A\u0302\u0301", // Ấ = \^\'{A} - "\u1EA6": "A\u0302\u0300", // Ầ = \^\`{A} - "\u1EAA": "A\u0302\u0303", // Ẫ = \^\~{A} - "\u0226": "A\u0307", // Ȧ = \.{A} - "\u01E0": "A\u0307\u0304", // Ǡ = \.\={A} - "\xC5": "A\u030A", // Å = \r{A} - "\u01FA": "A\u030A\u0301", // Ǻ = \r\'{A} - "\u1E02": "B\u0307", // Ḃ = \.{B} - "\u0106": "C\u0301", // Ć = \'{C} - "\u010C": "C\u030C", // Č = \v{C} - "\u0108": "C\u0302", // Ĉ = \^{C} - "\u010A": "C\u0307", // Ċ = \.{C} - "\u010E": "D\u030C", // Ď = \v{D} - "\u1E0A": "D\u0307", // Ḋ = \.{D} - "\xC9": "E\u0301", // É = \'{E} - "\xC8": "E\u0300", // È = \`{E} - "\xCB": "E\u0308", // Ë = \"{E} - "\u1EBC": "E\u0303", // Ẽ = \~{E} - "\u0112": "E\u0304", // Ē = \={E} - "\u1E16": "E\u0304\u0301", // Ḗ = \=\'{E} - "\u1E14": "E\u0304\u0300", // Ḕ = \=\`{E} - "\u0114": "E\u0306", // Ĕ = \u{E} - "\u011A": "E\u030C", // Ě = \v{E} - "\xCA": "E\u0302", // Ê = \^{E} - "\u1EBE": "E\u0302\u0301", // Ế = \^\'{E} - "\u1EC0": "E\u0302\u0300", // Ề = \^\`{E} - "\u1EC4": "E\u0302\u0303", // Ễ = \^\~{E} - "\u0116": "E\u0307", // Ė = \.{E} - "\u1E1E": "F\u0307", // Ḟ = \.{F} - "\u01F4": "G\u0301", // Ǵ = \'{G} - "\u1E20": "G\u0304", // Ḡ = \={G} - "\u011E": "G\u0306", // Ğ = \u{G} - "\u01E6": "G\u030C", // Ǧ = \v{G} - "\u011C": "G\u0302", // Ĝ = \^{G} - "\u0120": "G\u0307", // Ġ = \.{G} - "\u1E26": "H\u0308", // Ḧ = \"{H} - "\u021E": "H\u030C", // Ȟ = \v{H} - "\u0124": "H\u0302", // Ĥ = \^{H} - "\u1E22": "H\u0307", // Ḣ = \.{H} - "\xCD": "I\u0301", // Í = \'{I} - "\xCC": "I\u0300", // Ì = \`{I} - "\xCF": "I\u0308", // Ï = \"{I} - "\u1E2E": "I\u0308\u0301", // Ḯ = \"\'{I} - "\u0128": "I\u0303", // Ĩ = \~{I} - "\u012A": "I\u0304", // Ī = \={I} - "\u012C": "I\u0306", // Ĭ = \u{I} - "\u01CF": "I\u030C", // Ǐ = \v{I} - "\xCE": "I\u0302", // Î = \^{I} - "\u0130": "I\u0307", // İ = \.{I} - "\u0134": "J\u0302", // Ĵ = \^{J} - "\u1E30": "K\u0301", // Ḱ = \'{K} - "\u01E8": "K\u030C", // Ǩ = \v{K} - "\u0139": "L\u0301", // Ĺ = \'{L} - "\u013D": "L\u030C", // Ľ = \v{L} - "\u1E3E": "M\u0301", // Ḿ = \'{M} - "\u1E40": "M\u0307", // Ṁ = \.{M} - "\u0143": "N\u0301", // Ń = \'{N} - "\u01F8": "N\u0300", // Ǹ = \`{N} - "\xD1": "N\u0303", // Ñ = \~{N} - "\u0147": "N\u030C", // Ň = \v{N} - "\u1E44": "N\u0307", // Ṅ = \.{N} - "\xD3": "O\u0301", // Ó = \'{O} - "\xD2": "O\u0300", // Ò = \`{O} - "\xD6": "O\u0308", // Ö = \"{O} - "\u022A": "O\u0308\u0304", // Ȫ = \"\={O} - "\xD5": "O\u0303", // Õ = \~{O} - "\u1E4C": "O\u0303\u0301", // Ṍ = \~\'{O} - "\u1E4E": "O\u0303\u0308", // Ṏ = \~\"{O} - "\u022C": "O\u0303\u0304", // Ȭ = \~\={O} - "\u014C": "O\u0304", // Ō = \={O} - "\u1E52": "O\u0304\u0301", // Ṓ = \=\'{O} - "\u1E50": "O\u0304\u0300", // Ṑ = \=\`{O} - "\u014E": "O\u0306", // Ŏ = \u{O} - "\u01D1": "O\u030C", // Ǒ = \v{O} - "\xD4": "O\u0302", // Ô = \^{O} - "\u1ED0": "O\u0302\u0301", // Ố = \^\'{O} - "\u1ED2": "O\u0302\u0300", // Ồ = \^\`{O} - "\u1ED6": "O\u0302\u0303", // Ỗ = \^\~{O} - "\u022E": "O\u0307", // Ȯ = \.{O} - "\u0230": "O\u0307\u0304", // Ȱ = \.\={O} - "\u0150": "O\u030B", // Ő = \H{O} - "\u1E54": "P\u0301", // Ṕ = \'{P} - "\u1E56": "P\u0307", // Ṗ = \.{P} - "\u0154": "R\u0301", // Ŕ = \'{R} - "\u0158": "R\u030C", // Ř = \v{R} - "\u1E58": "R\u0307", // Ṙ = \.{R} - "\u015A": "S\u0301", // Ś = \'{S} - "\u1E64": "S\u0301\u0307", // Ṥ = \'\.{S} - "\u0160": "S\u030C", // Š = \v{S} - "\u1E66": "S\u030C\u0307", // Ṧ = \v\.{S} - "\u015C": "S\u0302", // Ŝ = \^{S} - "\u1E60": "S\u0307", // Ṡ = \.{S} - "\u0164": "T\u030C", // Ť = \v{T} - "\u1E6A": "T\u0307", // Ṫ = \.{T} - "\xDA": "U\u0301", // Ú = \'{U} - "\xD9": "U\u0300", // Ù = \`{U} - "\xDC": "U\u0308", // Ü = \"{U} - "\u01D7": "U\u0308\u0301", // Ǘ = \"\'{U} - "\u01DB": "U\u0308\u0300", // Ǜ = \"\`{U} - "\u01D5": "U\u0308\u0304", // Ǖ = \"\={U} - "\u01D9": "U\u0308\u030C", // Ǚ = \"\v{U} - "\u0168": "U\u0303", // Ũ = \~{U} - "\u1E78": "U\u0303\u0301", // Ṹ = \~\'{U} - "\u016A": "U\u0304", // Ū = \={U} - "\u1E7A": "U\u0304\u0308", // Ṻ = \=\"{U} - "\u016C": "U\u0306", // Ŭ = \u{U} - "\u01D3": "U\u030C", // Ǔ = \v{U} - "\xDB": "U\u0302", // Û = \^{U} - "\u016E": "U\u030A", // Ů = \r{U} - "\u0170": "U\u030B", // Ű = \H{U} - "\u1E7C": "V\u0303", // Ṽ = \~{V} - "\u1E82": "W\u0301", // Ẃ = \'{W} - "\u1E80": "W\u0300", // Ẁ = \`{W} - "\u1E84": "W\u0308", // Ẅ = \"{W} - "\u0174": "W\u0302", // Ŵ = \^{W} - "\u1E86": "W\u0307", // Ẇ = \.{W} - "\u1E8C": "X\u0308", // Ẍ = \"{X} - "\u1E8A": "X\u0307", // Ẋ = \.{X} - "\xDD": "Y\u0301", // Ý = \'{Y} - "\u1EF2": "Y\u0300", // Ỳ = \`{Y} - "\u0178": "Y\u0308", // Ÿ = \"{Y} - "\u1EF8": "Y\u0303", // Ỹ = \~{Y} - "\u0232": "Y\u0304", // Ȳ = \={Y} - "\u0176": "Y\u0302", // Ŷ = \^{Y} - "\u1E8E": "Y\u0307", // Ẏ = \.{Y} - "\u0179": "Z\u0301", // Ź = \'{Z} - "\u017D": "Z\u030C", // Ž = \v{Z} - "\u1E90": "Z\u0302", // Ẑ = \^{Z} - "\u017B": "Z\u0307", // Ż = \.{Z} - "\u03AC": "\u03B1\u0301", // ά = \'{α} - "\u1F70": "\u03B1\u0300", // ὰ = \`{α} - "\u1FB1": "\u03B1\u0304", // ᾱ = \={α} - "\u1FB0": "\u03B1\u0306", // ᾰ = \u{α} - "\u03AD": "\u03B5\u0301", // έ = \'{ε} - "\u1F72": "\u03B5\u0300", // ὲ = \`{ε} - "\u03AE": "\u03B7\u0301", // ή = \'{η} - "\u1F74": "\u03B7\u0300", // ὴ = \`{η} - "\u03AF": "\u03B9\u0301", // ί = \'{ι} - "\u1F76": "\u03B9\u0300", // ὶ = \`{ι} - "\u03CA": "\u03B9\u0308", // ϊ = \"{ι} - "\u0390": "\u03B9\u0308\u0301", // ΐ = \"\'{ι} - "\u1FD2": "\u03B9\u0308\u0300", // ῒ = \"\`{ι} - "\u1FD1": "\u03B9\u0304", // ῑ = \={ι} - "\u1FD0": "\u03B9\u0306", // ῐ = \u{ι} - "\u03CC": "\u03BF\u0301", // ό = \'{ο} - "\u1F78": "\u03BF\u0300", // ὸ = \`{ο} - "\u03CD": "\u03C5\u0301", // ύ = \'{υ} - "\u1F7A": "\u03C5\u0300", // ὺ = \`{υ} - "\u03CB": "\u03C5\u0308", // ϋ = \"{υ} - "\u03B0": "\u03C5\u0308\u0301", // ΰ = \"\'{υ} - "\u1FE2": "\u03C5\u0308\u0300", // ῢ = \"\`{υ} - "\u1FE1": "\u03C5\u0304", // ῡ = \={υ} - "\u1FE0": "\u03C5\u0306", // ῠ = \u{υ} - "\u03CE": "\u03C9\u0301", // ώ = \'{ω} - "\u1F7C": "\u03C9\u0300", // ὼ = \`{ω} - "\u038E": "\u03A5\u0301", // Ύ = \'{Υ} - "\u1FEA": "\u03A5\u0300", // Ὺ = \`{Υ} - "\u03AB": "\u03A5\u0308", // Ϋ = \"{Υ} - "\u1FE9": "\u03A5\u0304", // Ῡ = \={Υ} - "\u1FE8": "\u03A5\u0306", // Ῠ = \u{Υ} - "\u038F": "\u03A9\u0301", // Ώ = \'{Ω} - "\u1FFA": "\u03A9\u0300" // Ὼ = \`{Ω} -}); - -/***/ }) -/******/ ])["default"]; -}); - -/***/ }), -/* 1 */ -/***/ (function(module, exports, __webpack_require__) { - -window.katex = __webpack_require__(0); - -__webpack_require__(2); - - -/***/ }), -/* 2 */ -/***/ (function(module, exports, __webpack_require__) { - -(function() { - var renderMathInElement = __webpack_require__(3); - - var checkReadyState = setInterval(function() { - if (document.readyState === 'complete') { - clearInterval(checkReadyState); - run(); - } - }, 50); - - function run() { - var allKatexElements = document.querySelectorAll('.katex'); - - for (var i = allKatexElements.length - 1; i >= 0; i--) { - window.katex.render(allKatexElements[i].innerHTML, allKatexElements[i]); - } - - renderMathInElement(document.body); - } -})(); - - -/***/ }), -/* 3 */ -/***/ (function(module, exports, __webpack_require__) { - -!function(t,e){ true?module.exports=e(__webpack_require__(0)):"function"==typeof define&&define.amd?define(["katex"],e):"object"==typeof exports?exports.renderMathInElement=e(require("katex")):t.renderMathInElement=e(t.katex)}(this,function(t){return function(t){var e={};function n(r){if(e[r])return e[r].exports;var o=e[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:r})},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=9)}([function(t,e){var n=t.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},function(t,e){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},function(t,e,n){t.exports=!n(3)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(t,e){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,e){var n=t.exports={version:"2.4.0"};"number"==typeof __e&&(__e=n)},function(t,e,n){var r=n(6),o=n(7);t.exports=function(t){return r(o(t))}},function(t,e,n){var r=n(27);t.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==r(t)?t.split(""):Object(t)}},function(t,e){t.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},function(t,e){var n=Math.ceil,r=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?r:n)(t)}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(10),o=n.n(r),i=n(38),u=n.n(i),c=n(39),a=function(t,e){for(var n=function(t,e){for(var n=[{type:"text",data:t}],r=0;rf;)for(var p,d=c(arguments[f++]),h=s?r(d).concat(s(d)):r(d),v=h.length,y=0;v>y;)l.call(d,p=h[y++])&&(n[p]=d[p]);return n}:a},function(t,e,n){var r=n(25),o=n(34);t.exports=Object.keys||function(t){return r(t,o)}},function(t,e,n){var r=n(26),o=n(5),i=n(28)(!1),u=n(31)("IE_PROTO");t.exports=function(t,e){var n,c=o(t),a=0,f=[];for(n in c)n!=u&&r(c,n)&&f.push(n);for(;e.length>a;)r(c,n=e[a++])&&(~i(f,n)||f.push(n));return f}},function(t,e){var n={}.hasOwnProperty;t.exports=function(t,e){return n.call(t,e)}},function(t,e){var n={}.toString;t.exports=function(t){return n.call(t).slice(8,-1)}},function(t,e,n){var r=n(5),o=n(29),i=n(30);t.exports=function(t){return function(e,n,u){var c,a=r(e),f=o(a.length),s=i(u,f);if(t&&n!=n){for(;f>s;)if((c=a[s++])!=c)return!0}else for(;f>s;s++)if((t||s in a)&&a[s]===n)return t||s||0;return!t&&-1}}},function(t,e,n){var r=n(8),o=Math.min;t.exports=function(t){return t>0?o(r(t),9007199254740991):0}},function(t,e,n){var r=n(8),o=Math.max,i=Math.min;t.exports=function(t,e){return(t=r(t))<0?o(t+e,0):i(t,e)}},function(t,e,n){var r=n(32)("keys"),o=n(33);t.exports=function(t){return r[t]||(r[t]=o(t))}},function(t,e,n){var r=n(0),o="__core-js_shared__",i=r[o]||(r[o]={});t.exports=function(t){return i[t]||(i[t]={})}},function(t,e){var n=0,r=Math.random();t.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++n+r).toString(36))}},function(t,e){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(t,e){e.f=Object.getOwnPropertySymbols},function(t,e){e.f={}.propertyIsEnumerable},function(t,e,n){var r=n(7);t.exports=function(t){return Object(r(t))}},function(e,n){e.exports=t},function(t,e,n){"use strict";var r=function(t,e,n){for(var r=n,o=0,i=t.length;r - - - - - - Linux - eksamensark - - - - - - -
    -
    -
    -

    2 Kommandoer

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Hvordan...Kommando
    Elementær navigering
    får jeg mer info om en kommando?man <kommando>
    <kommando> --help
    lister jeg filer i en katalog?ls
    skifter jeg katalog?cd <katalog>
    vet jeg i hvilken katalog jeg er?pwd
    oppretter/fjerner jeg en katalog?mkdir/rmdir <katalog>
    kopierer jeg en fil?cp
    sletter jeg en fil?rm
    lager jeg en (tom) fil?touch
    flytter jeg en fil/endrer navn på filmv
    lister jeg innholdet i en fil?cat / more / less
    får jeg opp informasjon om diskbruk?df
    sjekker jeg hvor mye diskplass brukt?du -sh
    sjekker jeg ledig minne?free
    finner jeg en spesifikk fil?find / whereis <fil>
    lager jeg en snarvei?ln -s <faktisk_fil> <snarvei>
    pakker jeg inn/ut filer?gzip/bunzip / tar
    Bruker-relaterte kommandoer
    vet jeg hvem jeg er?whoami
    logger jeg meg inn som root?su
    endrer jeg passord?passwd
    får jeg opp diverse info om systemet?w
    finner jeg ut mer om en bruker?finger
    endrer jeg rettigheter på filer?chmod
    endrer jeg eierskap på filer?chown
    legger jeg til bruker?useradd
    endrer jeg mitt shell?chsh
    Enkle nettverkskommandoer
    sjekker jeg om en boks er på nett?ping
    konfigurerer jeg nettverket?ifconfig
    bruker jeg traceroute?traceroute
    snakker jeg med andre som er innlogget?talk
    Mer avanserte kommandoer
    finner jeg ut hvilken linux-ver jeg har?uname
    - cat /proc/version
    får jeg tilgang til andre disker?mount
    formaterer jeg en disk?mkfs
    sjekker jeg om en disk er skadet?fsck
    lister jeg alle prosesser?ps
    lister jeg alle prosesser i en fin tabell?top
    avslutter (dreper) jeg en prosess?kill
    slår jeg av boksen?shutdown
    partitionerer jeg en disk?fdisk
    viser jeg all oppstarts-info?dmesg
    aktiverer jeg shadow passord?pwconv
    lister hvilke moduler som er lastet?lsmod
    Annet
    sjekker jeg hvilket skjermkort jeg har?SuperProbe
    konfigurerer jeg X?xf86config
    -
    -
    -
    -
    -

    Forklaring

    -
    -

    ls

    -
    Brukes for å bytte working directory
    -
    ls [options] [file|dir]
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ls -alist all files including hidden file starting with '.'
    ls --colorcolored list [=always/never/auto]
    ls -dlist directories - with ' */'
    ls -Fadd one char of */=>@| to enteries
    ls -ilist file's inode index number
    ls -llist with long format - show permissions
    ls -lalist long format including hidden files
    ls -lhlist long format with readable file size
    ls -lslist with long format with file size
    ls -rlist in reverse order
    ls -Rlist recursively directory tree
    ls -slist file size
    ls -Ssort by file size
    ls -tsort by time & date
    ls -Xsort by extension name
    Eks
    ls ~cathrinebSkriver ut innholdet i hjemmekatalogen til brukeren cathrineb (hvis du har lesetilgang til denne katalogen).
    ls -ld h*Skriver ut, i langt format (opsjonen '-l), informasjon om alle katalogfiler/underkataloger - (opsjonen '-d) i stående katalog med navn som begynner på 'h'. Innholdet i katalogene skrives ikke ut.
    -
    - -

    cd

    -
    Brukes for å bytte working directory
    -
    cd [option] [directory]
    - -
    pwd
    -
    Viser i hvilken katalog som bruker befinner seg i.
    -
    -
    -
    Eksempel
    -
    -
    -[bruker@pc /]$ cd ~
    -[bruker@pc ~]$ pwd
    -/home/bruker
    -
    -
    -
    -
    - -
    mkdir/rmdir
    -
    Disse kommandoene oppretter/fjerner kataloger. NB! Katalogen må være tom før du får slettet den med denne kommandoen.
    - -

    cp

    -
    Brukes for å kopiere filer og/eller kataloger
    -
    cp [options] source dest
    -
    - - - - - - - -
    cp -rCopy recursively
    -
    - -

    mv

    -
    Brukes for å flytte filer og/eller kataloger
    -
    Kan også brukes for å endre navn på filer eller kataloger
    -
    mv [options] source dest
    -
    - - - - - - - - - - - - - - - - - - - -
    mv -fforce move by overwriting destination file without prompt
    mv -iinteractive prompt before overwrite
    mv -uupdate - move when source is newer than destination
    mv -vverbose - print source and destination files
    -
    -
    - Eksempler -
    -
    [bruker@pc ~]$ mv testfil katalog1/
    -
    Vi flytter filen testfil1 til katalog1/
    - -
    [bruker@pc ~]$ mv testfil nyttnavn
    -
    Vi "flytter" filen til ett annet navn.
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    3 alias

    -
    Brukes for å lage aliaser til kommandoer
    -
    alias [-p] [name[=value] ... ]
    -
    - - - - - - - - - - - - - - - -
    alias -p [name[=value] ...]print all defined aliases in a reusable format
    Eks
    alias harakiri 'rm -r'Definerer et kommandoalias med navn harakiri, som skal fjerne alle filer i stående katalog og alle - underkataloger av stående katalog.
    -
    - -

    rm

    -
    Brukes for å slette filer og/eller kataloger
    -
    rm [OPTION]... FILE...
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -f, --forceIgnore nonexistant files, and never prompt before removing.
    -iPrompt before every removal.
    -IPrompt once before removing more than three files, or when removing recursively. Less intrusive than -i, while still giving protection against most mistakes.
    --interactive[=WHEN]Prompt according to WHEN: never, once (-I), or always (-i). If WHEN is not specified, then prompt always.
    --one-file-systemWhen removing a hierarchy recursively, skip any directory that is on a file system different from that of the corresponding command line argument
    --no-preserve-rootDo not treat "/" (the root directory) in any special way.
    --preserve-rootDo not remove "/" (the root directory), which is the default behavior.
    -r, -R, --recursiveRemove directories and their contents recursively.
    -v, --verboseVerbose mode; explain at all times what is being done.
    --helpDisplay a help message, and exit.
    --versionDisplay version information, and exit.
    Eks
    rm -rf firefox/cache/*Fjerner alle filer som brukeren er eier av (uansett filbeskyttelse) i hele katalogtreet med rot i - underkatalogen ./firefox/cache/ .
    rm -f ~/personal/memo*.docFjerner alle filer som ligger i katalogen personal med filnavn som starter med memo og slutter med - .doc
    rm -f ~/linuxbook/final/ch??.prnFjerner alle filer som ligger i katalogen final, som er en underkatalog av linuxbook, med filnavn - på åtte tegn som starter med ch, etterfulgt av to vilkårlige tegn, og deretter slutter med .prn
    rm -f ~/linuxbook/final/*.oFjerner alle filer som ligger i katalogen final, som er en underkatalog av linuxbook, med filnavn - som slutter med .o
    rm -f ~/courses/ece446/lab[1-6].[cC]Fjerner alle filer som ligger i katalogen ece446, som er en underkatalog av courses, med filnavn - på 6 tegn som starter med lab, etterfulgt av ett av sifrene 1-6, og deretter slutter med .c eller .C
    -
    - -

    cat

    -
    Brukes for å vise innholdet i en fil
    -
    Cat kommandoen er meget nyttig. Cat har flere funksjoner, men elementært, så leser den en fil og viser den til "standard output". Kort (og grovt) fortalt, kan vi si at kommadoen henter ett filformat og "kaster" den til riktig utgang. F.eks. kan vi "kaste" en musikk-fil til lydkortet (og dermed få lyd), eller en fil til printerporten (og printe ut noe).
    -
    cat [options] file1 [file2...]
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    cat -badd line numbers to non blank lines
    cat -nadd line numbers to all lines
    cat -ssqueeze blank lines to one line
    cat -Eshow $ at the end of line
    cat -Tshow ^I instead of tabs
    Eks
    cat < fil_1 >> fil_2fil_1 legges til på slutten av fil_2
    cat < kapittel_1.txt | tee kapittel_1.txt.backup | lprEn kopi av filen kapittel_1.txt lagres på filen kapittel_1.txt.backup. kapittel_1.txt sendes også - til utskrift på default printer.
    -
    - -
    -
    -
    -
    -
    -
    -
    df -h
    -
    Viser hvor mye ledig diskplass som er ledig. Ved bruk av df -h gir det en litt mer leslig format (megabyte, kilobyte etc.). Eks:
    -
    -
    -[bruker@pc ~]$ df -h
    -Filesystem      Size  Used Avail Use% Mounted on
    -udev            3,8G     0  3,8G   0% /dev
    -tmpfs           783M   11M  773M   2% /run
    -/dev/nvme0n1p2  234G   56G  167G  25% /
    -
    -
    -
    du -sh
    -
    Viser hvor mye plass stående katalogen (med underkataloger) tar av diskplass. Eks:
    -
    -
    -[bruker@pc ~]$ pwd
    -/home/bruker
    -[bruker@pc ~]$ dh -sh
    -35.6G    .
    -[bruker@pc ~]$ cd testmappe
    -[bruker@pc testmappe]$ pwd
    -/home/bruker/testmappe
    -[bruker@pc testmappe]$ dh -sh
    -2.1M     .
    -
    -
    - -
    free
    -
    Viser hvor systemets bruk av minne. "free -m" viser minnebruken i megabytes.
    - -
    find / whereis
    -
    Den første kommandoen, find, leter gjennom de kataloger som er eksportert til bash. Den andre kommandoen, whereis, er leter mer omfattende. Se også kommandoen, locate for mer avansert filsøking.
    -
    [bruker@pc testmappe]$ find . -name '*.java' -exec basename {} \; | sort
    -
    Kommandoen over skriver ut en sortert liste med navnene på alle filer i hele katalogtreet med rot i stående katalog, som har et filnavn som slutter med .java (se manualsidene for find og basename).
    - -
    ln
    -
    Filer kan ha flere navn i UNIX/Linux. Dette gjøres ved kommandoen ln. Du oppretter da en snarvei til den faktiske filen.
    -
    [bruker@pc testmappe]$ ln /mappe/undermappe/filen /home/bruker/snarvei
    -
    Oppretter her en snarvei, kalt "snarvei", som peker på filen "/mappe/undermappe/filen"
    - -
    gzip / bzip2
    -
    For å pakke ned en fil, brukes kommandoen:
    -
    -
    -
    [bruker@pc ~]$ gzip en_fil
    -
    "en_fil" vil da bli pakket ned, og den pakkede filen får navn "en_fil.gz". Merk! "en_fil.gz" erstatter "en_fil"! Du får dermed kun en kopi av den pakkede filen!
    - -
    [bruker@pc ~]$ gzip -9 en_fil
    -
    Ved å bruke -9, vil det si at vi bruker maksimal kompresjon. Ved å bruke lavere tall, vil det ta kortere tid å pakke ned, men den pakkede filen vil bli større.
    -
    -
    For å pakke ut en fil brukes følgende kommando:
    -
    -
    [bruker@pc ~]$ gunzip en_fil.gz
    -
    bzip2 er en forbedret utgave av gzip. Den bruker en litt annen komprimerings-algoritme, og får pakket ned filer bedre. Den bruke på samme måte som gzip/gunzip, bare at det er bzip2/bunzip2. De pakkede filene vil få navn som "en_fil.bz2". Se man sidene for mer avansert bruk av gzip/bzip2.
    -
    - - -
    tar
    -
    Tar ble opprinnlig brukt til backup. Legger alle filer og kataloger i en stor fil, som det igjen ble tatt backup av. Det fine med tar, er at du kan pakke ned hele katalogstrukturer, noe som ikke går med gzip/bzip2. Ofte er tar brukt til først å pakke ned i en stor fil, også pakket med gzip. Dissse filene har ending .tar.gz, også kalt "tarball". Eldre slike filer kan også ha ending .tar.Z. Det er også .tar.gz2 filer, som pakket med tar og pakket ned med gzip. Kernelkildekoden er pakket på denne måten. Pakker ut en tarball med følgende kommando:
    -
    -
    -
    [bruker@pc ~]$ tar zxfv backupavfil.tar.gz
    -
    Igjen, for mer (masse) informasjon om bruk, se man sidene.
    -
    -
    - -
    passwd
    -
    Gjør at du skifter passord. Denne kommandoen skifter kun passord på din lokale maskin. Merk! Hvis det er et nettverk, er det mest sannsynlig "yppasswd" ("yp on lan" eller "Yellow Pages on Local Area Network"). Root kan selvfølgelig skifte passord på hvem han selv måtte ønske ("passwd lars").
    -
    Root kan også stenge en konto ved å bruke følgende kommando:
    -
    [bruker@pc ~]$ passwd -l lars
    -
    Passordet for denne kontoen settes da til noe ugjettbart :) For å låse opp denne kontoen bruker vi kommandoen:
    -
    [bruker@pc ~]$ passwd -u lars
    -
    -
    -
    -
    -
    -
    -
    -
    -
    chmod
    -
    Linux/Unix har et innfløkt (men logisk) system for filtildeling. Filtildeinger gis ved kommadoen chmod.
    -
    -
    -
    Først litt teori:
    -
    Eks: Ved å skrive ls -l kommer følgende opp:
    -
    -
    -[bruker@pc ~]$ ls -l
    --rw-rw-r-- 1 bjornar bjornar     0 nov.   8 15:13 a.out
    -lrwxrwxrwx 1 bjornar bjornar    20 okt.  27 01:37 bin -> .dotfiles/common/bin
    -lrwxrwxrwx 1 bjornar bjornar    22 okt.  27 01:37 crontab -> .dotfiles/cron/crontab
    -drwxr-xr-x 2 bjornar bjornar  4096 nov.  15 13:54 Desktop
    -drwxr-xr-x 5 bjornar bjornar  4096 nov.  29 12:09 Documents
    -drwxr-xr-x 2 bjornar bjornar  4096 des.   4 11:52 Downloads
    -drwx------ 9 bjornar bjornar  4096 des.   5 10:36 Drive
    -drwxr-xr-x 2 bjornar bjornar  4096 okt.  27 01:31 Music
    -drwxr-xr-x 3 bjornar bjornar  4096 nov.   7 13:58 Pictures
    -drwxr-xr-x 2 bjornar bjornar  4096 okt.  27 01:31 Templates
    -drwxr-xr-x 3 bjornar bjornar  4096 okt.  27 17:04 Videos
    -lrwxrwxrwx 1 bjornar bjornar    20 okt.  27 01:37 .vimrc -> .dotfiles/vim/.vimrc
    --rw-r--r-- 1 bjornar users     165 okt.  30 11:10 .wget-hsts
    -
    -
    -
    La oss se på den første kolonnen til den siste filen her... (.wget-hsts)
    -
    -rw-r--r-- bjornar users 165 okt...
    -
    Det første tegnet er -, sier hva slags fil dette er (d for kataloger, - c for enheter osv.). Videre er det 3 tegn rw- (blå) + 3 tegn r-- - (rød) + 3 tegn r-- (grønn) = 3 x 3. Tilsammen 10 tegn. La oss forklare hvert segment (hver farge).
    -
    -
    -
    Blå
    -
    De første tre symbolene er filtildelingene for de som eier filene (i dette tilfelle ser vi at der et bjornar). Dette første segmentet kalles "u" for "user".
    - -
    Rød
    -
    De neste tre symbolene er tilganger for gruppe (i dette tilfellet "users" - Hvis jeg hadde vært i f.eks. gruppen "frisurf", så kunne jeg gitt tilganger til andre som var i min gruppe (dvs. "frisurf"). Andre grupper, f.eks. "total" ville ikke ha hatt de samme tilganger.). Kalt segment "g" for "group".
    - -
    Grønn
    -
    De tre siste symbolene er tilganger for alle andre (dvs. hvemsomhelst). Kalles semgent "o" for "other".
    -
    -
    -
    -
    -
    -
    -
    Rettigheter
    -
    r = read
    -
    w = write
    -
    x = execute (NB! For å få tilgang til kataloger, må de ha tilgang til å bli eksekverbare)
    - -
    Hvordan endre rettigheter?
    -
    1, Du angir først hvem endringen skal gjelde for (enten user, group eller other).
    -
    2. Deretter + eller -
    -
    3. Tilslutt hva slags rettigheter som skal settes (som er read, write eller execute)
    - -
    Eksempeler
    - -
    -
    [bruker@pc ~]$ chmod o+rw test.txt
    -
    Denne kommandoen vil gi lese (r) og skrive (w) til alle andre (other) for filen test.txt
    - -
    [bruker@pc ~]$ chmod o-rw test.txt
    -
    Dette gjør det motsatte, nemlig å fjerne lese og skrive rettigheter for filen test.txt for alle andre (other).
    - -
    [bruker@pc ~]$ chmod go-x lars/
    -
    Gjør at jeg sperrer katalogen lars/ for både min gruppe (group) og alle andre (other). Som bruker har jeg fremdeles mine tilganger inntakt (user).
    - -
    [bruker@pc ~]$ chmod go= fil1
    -
    Fjerner alle tilgangsrettigheter til fil1 for alle brukere untatt eier av filen (user).
    - -
    [bruker@pc ~]$ chmod a=rwx fil2
    -
    Gir alle brukere lese-, skrive- og kjøretilgang til fil2.
    - -
    [bruker@pc ~]$ chmod -R 644 *.html
    -
    Gir eier lese- og skrivetilgang og alle andre lesetilgang, til alle filer som har et navn som slutter på .html, rekursivt i hele katalogtreet med rot i stående i katalog.
    - -
    [bruker@pc ~]$ chmod 777 fil3
    -
    Gir alle brukere lese-, skrive- og kjøretilgang til fil3.
    - -
    [bruker@pc ~]$ find . -name \*.html -exec chmod 644 {} \;
    -
    Gjør nøyaktig det samme som kommandoen i punkt 3 ovenfor.
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    chown < bruker:gruppe > < fil/katalog >
    -
    Selv om rettighetene er i orden, så forutsetter det at bruker eier filen/katalogen. Merk! Det er kun root som kan skifte eierskap av filer/kataloger. Eks:
    -
    [bruker@pc ~]$ chown brev.txt liuns
    -
    Jeg gir bruker "linus" eierskap til filen "brev.txt".
    -
    chown root:mygroup /usr/local/folder -R
    -
    Alle filer og undermapper i /usr/local/folder blir nå eid av bruker root og gruppen mygroup
    - -
    finger < en_bruker >
    -
    Er en kommando som kan brukes til å få opp informasjon om en bruker på systemet. Hvis brukeren har en .plan og/eller .project med utfyllende beskrivelse, kan en annen bruker få opp denne informasjonen ved å bruker finger < bruker >. NB! Denne tjenesten kan være utilgjengelig på enkelte systemer, dette fordi system-administratoren har gjort dette av sikkerhetshensyn. Prøv å skriv:
    -
    [bruker@pc ~]$ finger volkerdi@slackware.com
    -
    Som gjør at du får opp finger kommandoer om Patrick Volkerding; mannen bak Slackware.
    -
    eller
    -
    [bruker@pc ~]$ finger johnc@idsoftware.com
    -
    Med denne kommandoen får du opp informasjon om John Carmack - mannen bak alle grafikk-motorene til ID Software. Carmack pleier å ha mye oppdatert informasjon om grafikk-kort og fremtdige prosjekter til ID Software.
    -
    eller
    -
    [bruker@pc ~]$ finger larstra@ifi.uio.no
    - -
    useradd
    -
    Kommando for å legge til brukere.
    -
    [bruker@pc ~]$ useradd ola -p ola42 -d /home/ola -m
    -
    Legger til ola-bruker med passord "ola42", og med hjemmekatalog under /home/ola. Se man useradd for mer info. Ofte følger det med egne "useradd"-script for hver distribusjon; "adduser" i Slackware, "YaSt" i Suse osv. KDE har også ett eget grafisk bruker administrasjons program.
    - -
    userdel
    -
    Fjerner bruker fra systemet.
    -
    [bruker@pc ~]$ userdel -r ola
    -
    Fjerner brukeren ola fra systemet. Sletter samtidig hjemmekatalogen.
    - -
    chsh
    -
    Hvis brukeren har lyst til å endre sitt shell, gjøres det med denne kommandoen. Ulike shell kan dekke ulike behov. Sjekk først hvilke shell som er tilgjenglig i filen "/etc/shells". Les mer om shell under ordliste.
    - -
    ping
    -
    Dette er noe av den enkleste nettverkskommandoen. Det denne kommandoen gjør, er å se om en annen burk på er på nettverket. Denne kommandoen kan også brukes for å se om du har nettverks-trafikk overhode. Prøve f.eks.
    -
    [bruker@pc ~]$ ping www.online.no
    - -
    ifconfig
    -
    Denne kommandoen konfigurerer ett nettverks-"interface". Eks:
    -
    [bruker@pc ~]$ ifconfig eth0 10.1.1.2 broadcast 10.1.1.255 netmask 255.255.255.0
    -
    Denne setter opp eth0, som er vårt første nettverkskort (og eneste, hvis vi kun har ett kort i boksen), til å bruke IP-adresse 10.1.1.2. Videre broadcaster den til hele 10.1.1 subnettet. Du kan nesten alltid bruke netmaske 255.255.255.0. Hvis du vil bruke andre instillinger, vet du nok allerede nok om denne slags konfigurasjonen :) Sjekk man sidene for mer informasjon.
    -
    Denne kommandoen kan også få opp generell informasjon om interfacet ved kun å skrive "ifconfig".
    - -
    traceroute
    -
    Viser veien nettverks-pakkene må gå for å komme frem til en destinasjonen. Prøv f.eks.
    -
    [bruker@pc ~]$ traceroute www.uio.no
    - -
    talk
    -
    talk < bruker >, åpen er en enkel snakke-kanal med en annne bruker. Den du prøver å snakke med må også skrive talk < bruker > for at forbindelsen skal oppnås.
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    mount
    -
    Avgjør hva som kan aksesseres. Alle harddisker blir mountet til filer (kataloger) under Linux. Faktisk så er alle enhetene i maskinen filer under Linux. Les mer om dette her. En harddisk, cd-rom, diskettstasjon, må "mountes" før de kan aksesseres. Det er to måter å mounte filsystemer på: vanskelig og enkel. - Vanskelig: Når en enhet mountes, må vi vite all relevant informasjon om filsystemet, som vi så plotter inn til en kommando. - Kommandoen blir noe slikt: mount < option > enhet < katalog >. La oss belyse med ett eksempel; mounting av en CD-ROM:
    -
    [bruker@pc ~]$ mount -t iso9660 -o ro /dev/hdc /cdrom
    -
    Det å måtte tast inn dette hver gang vi skal ha tilgang til cdrom'en blir fort kjedelig, derfor ser vi nærmere på den enkle måten..
    -
    Enkel: En enkelt måte å slippe å gjøre dette hver gang vi skal få tilgang til cd-romen er å legge all denne informasjonen inn i /etc/fstab. Som det meste annet i Linux, er også denne filen en ren tekst fil. Slik kan en /etc/fstab fil se ut:
    -
    -
    -[bruker@pc ~]$ cat /etc/fstab
    -/dev/sda1   /            ext2     defaults           1   1
    -/dev/sda2   /usr/local   ext2     defaults           1   2
    -/dev/sda3   /home        ext2     defaults           1   2
    -/dev/sda4   swap         swap     defaults           0   0
    -none        /dev/pts     devpts   gid=5,mode=620     0   0
    -none        /proc        proc     defaults           0   0
    -/dev/fd0    /mnt/floppy  vfat     defaults           0   0
    -/dev/cdrom  /cdrom       iso9660  user, ro, noauto   0   0
    -
    -
    -
    Den første kolonnen viser hvilken "enhet" (device fil) det er snakk om. Neste kolonne viser hvilken katalog denne enheten skal mountes til. Det neste er hvilket filsystem som denne enheten har, i vårt tilfelle er det standard cdrom-format (iso9660). Så kommer kolonnen som viser diverse spesifikasjoner som kan brukes under mounting; "user" vil si at andre brukere enn root kan mounte denne enheten, den er kun lesbar "ro", og den skal ikke mountes under oppstart "noauto".
    -
    De to siste kolonnen er av mindre interesse, men det kan være greit å vite hva de står for: Den nest siste kolonnen, kalt "dump flag", sier om denne enheten skal det bli tatt backup av. Den siste kolonnen, "check sequence", avgjør hvordan systemet skal sjekke filsystemene under oppstart. Root disken skal alltid ha verdi 1, andre disker skal ha verdi 2. Swap og andre disker skal ha verdi 0.
    - -
    På denne måten trenger vi bare å skrive:
    -
    [bruker@pc ~]$ mount /cdrom
    - -
    mkfs -t < filsystem > < enhet >
    -
    Brukes til å formatere en harddisk eller diskett. Eks. på formatering av diskett (1.4"):
    -
    [bruker@pc ~]$ mkfs -t ext2 /dev/fd0 1440
    - -
    fsck < disk >
    -
    Sjekker om en disk inneholder feil. Kan minne veldig om chkdsk eller scandisk i DOS. NB! Ikke kjør denne kommandoen på en disk som allerede er mountet! Hvis du trenger å sjekke en disk som mountes under oppstart (root "/" f.eks.), bør du startet opp Linux fra en oppstartdiskett og kjøre fsck fra den.
    -
    [bruker@pc ~]$ fsck /dev/hdb1
    - -
    ps
    -
    Viser en liste over alle prosesser som kjører. "ps ax | less" gir den komplette listen over prosesser som kjøres. For å finne ett spesifikt programs PID kan det f.eks. skrives: "ps -ax | grep netscape". Her er ett lite utdrag fra en "ps -ax" kommando:
    -
    -
    -[bruker@pc ~]$ ps -ax
    -PID TTY   STAT   TIME   COMMAND 
    - 609 ?     S     0:00   /usr/X11R6/bin/xdm -nodaemon
    - 622 ?     S     0:44   /etc/X11/X -auth /usr/X11R6/lib/X11/xdm/authdir/authf
    - 873 ?     S     0:00   -:0                                                 
    -8099 ?     S     0:08   /local/ssh/sbin/sshd
    -8123 ?     S     0:00   /local/X11R6/bin/xdm -config /local/X11R6/lib/X11/xdm
    -8201 ?     S<    0:16   /local/sbin/xntpd -p /etc/xntpd.pid
    -9237 ?     S     0:00   su
    -9241 ?     S     0:00   bash 
    -9439 ?     S     0:00   mysqld
    -9440 ?     S     0:02   mysqld
    -9441 ?     S     0:00   mysqld
    -9497 ?     S     0:00   /opt/apache/bin/httpd
    -9498 ?     S     0:00   /opt/apache/bin/httpd
    -9499 ?     S     0:00   /opt/apache/bin/httpd
    -
    -
    -
    - Eksempler -
    -
    -
    ps v -u dittbrukernavn
    -
    Skriver ut info. for alle prosessene som tilhører det angitte brukernavnet, i "virtual memory format" (hvor mye virtuelt minne prosessen har tilgjengelig og faktisk bruker).
    - -
    ps -ef
    -
    Viser alle prosesser på systemet (opsjonen -e), i "full format" (opsjonen -f).
    -
    -
    -
    ps -eo euser,ruser,suser,fuser,f,comm,label
    -
    Viser alle prosesser på systemet (opsjonen -e), bruker opsjonen -o til å angi eksplisitt hvilken informasjon (kolonner med utskrift) vi ønsker å se for prosessene.
    - -
    ps aux | cut -c1-8 | sort | uniq -c | sort -nrb | head -10
    -
    Viser, i sortert rekkefølge, de 10 brukerne med flest prosesser på systemet.
    -
    -
    ps -ely
    -
    Viser alle prosesser på systemet (opsjonen -e), i "long format" (opsjonen -l), uten F-feltet (process flag), med angivelse av hvor mye minne (RSS-feltet) prosessen bruker i stedet for minneadressen (ADDR-feltet) til prosessen (opsjonen -y).
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    nice
    -
    Lar deg kjøre prosesser som tar hensyn til systemressuser.
    -
    nice -15 ./mittprogram &
    -
    Starter mittprogram som en bakgrunnsprosess, med redusert prioritet (nice-verdi 15).
    - -
    kill < pid >
    -
    Avslutter programmer. For å kille ett program, må vi vite hva slags PID det har. "kill -9 < pid >"
    - -
    shutdown
    -
    Ett vanlig Linux-system skal aldrig bare slåes rett av. Den må "kjøres ned". Dette gjøres ved bruk av kommandoen shutdown. For å reboot en Linux maskin brukes kommandoen:
    -
    -
    -
    For å slå av en Linux maskin brukes kommandoen:
    -
    [bruker@pc ~]$ shutdown -r now
    - -
    På en vanlig flerbruker server kan vi gi brukerene litt tid til å logge av maskinen:
    -
    [bruker@pc ~]$ shutdown -h +60
    -
    -
    -
    På større systemer med mange brukere er det vanlig at melding om nedkjøring av en server gis flere dager i forveien. Du kan også legge melding om det i filen /etc/motd, på denne måten vil alle som logger seg inn få beskjed. Denne kommandoen har flere bruksmåter, se man sidene for mer informasjon.
    - -
    fdisk < enhet >
    -
    Brukes til å partitionere om harddisk. Se "man fdisk" for mer om bruken av fdisk.
    - - -
    pwconv
    -
    Hvis shadow ikke er aktivert, er passordet (kryptert), lesbart for alle. Dette er som oftest ingen god idé. Ved å skjule passordet i den restriktige filen shadow, har vi sikret oss mot det. For å deaktivere shadow, bruker vi pwunconv.
    -
    -

    grep

    -
    -Usage: grep [OPTION]... PATTERN [FILE]...
    -Search for PATTERN in each FILE.
    -Example: grep -i 'hello world' menu.h main.c
    -
    -Pattern selection and interpretation:
    -  -E, --extended-regexp     PATTERN is an extended regular expression
    -  -F, --fixed-strings       PATTERN is a set of newline-separated strings
    -  -G, --basic-regexp        PATTERN is a basic regular expression (default)
    -  -P, --perl-regexp         PATTERN is a Perl regular expression
    -  -e, --regexp=PATTERN      use PATTERN for matching
    -  -f, --file=FILE           obtain PATTERN from FILE
    -  -i, --ignore-case         ignore case distinctions
    -  -w, --word-regexp         force PATTERN to match only whole words
    -  -x, --line-regexp         force PATTERN to match only whole lines
    -  -z, --null-data           a data line ends in 0 byte, not newline
    -Miscellaneous:
    -  -s, --no-messages         suppress error messages
    -  -v, --invert-match        select non-matching lines
    -  -V, --version             display version information and exit
    -      --help                display this help text and exit
    -Output control:
    -  -m, --max-count=NUM       stop after NUM selected lines
    -  -b, --byte-offset         print the byte offset with output lines
    -  -n, --line-number         print line number with output lines
    -      --line-buffered       flush output on every line
    -  -H, --with-filename       print file name with output lines
    -  -h, --no-filename         suppress the file name prefix on output
    -      --label=LABEL         use LABEL as the standard input file name prefix
    -  -o, --only-matching       show only the part of a line matching PATTERN
    -  -q, --quiet, --silent     suppress all normal output
    -      --binary-files=TYPE   assume that binary files are TYPE;
    -                            TYPE is 'binary', 'text', or 'without-match'
    -  -a, --text                equivalent to --binary-files=text
    -  -I                        equivalent to --binary-files=without-match
    -  -d, --directories=ACTION  how to handle directories;
    -                            ACTION is 'read', 'recurse', or 'skip'
    -  -D, --devices=ACTION      how to handle devices, FIFOs and sockets;
    -                            ACTION is 'read' or 'skip'
    -  -r, --recursive           like --directories=recurse
    -  -R, --dereference-recursive likewise, but follow all symlinks
    -      --include=FILE_PATTERN  search only files that match FILE_PATTERN
    -      --exclude=FILE_PATTERN  skip files and directories matching FILE_PATTERN
    -      --exclude-from=FILE     skip files matching any file pattern from FILE
    -      --exclude-dir=PATTERN   directories that match PATTERN will be skipped.
    -  -L, --files-without-match  print only names of FILEs with no selected lines
    -  -l, --files-with-matches  print only names of FILEs with selected lines
    -  -c, --count               print only a count of selected lines per FILE
    -  -T, --initial-tab         make tabs line up (if needed)
    -  -Z, --null                print 0 byte after FILE name
    -
    -
    -
    -
    -
    -
    -
    -

    sed

    -
    -Usage: sed [OPTION]... {script-only-if-no-other-script} [input-file]...
    -
    -  -n, --quiet, --silent
    -                 suppress automatic printing of pattern space
    -  -e script, --expression=script
    -                 add the script to the commands to be executed
    -  -f script-file, --file=script-file
    -                 add the contents of script-file to the commands to be executed
    -  --follow-symlinks
    -                 follow symlinks when processing in place
    -  -i[SUFFIX], --in-place[=SUFFIX]
    -                 edit files in place (makes backup if SUFFIX supplied)
    -  -l N, --line-length=N
    -                 specify the desired line-wrap length for the `l' command
    -  --posix
    -                 disable all GNU extensions.
    -  -E, -r, --regexp-extended
    -                 use extended regular expressions in the script (for
    -                 portability use POSIX -E).
    -  -s, --separate
    -                 consider files as separate rather than as a single, continuous
    -                 long stream.
    -      --sandbox
    -                 operate in sandbox mode.
    -  -u, --unbuffered
    -                 load minimal amounts of data from the input files andflush the
    -                 output buffers more often
    -  -z, --null-data
    -                 separate lines by NUL characters
    -      --help     display this help and exit
    -      --version  output version information and exit
    -
    -

    cut

    -
    -Usage: cut OPTION... [FILE]...
    -Print selected parts of lines from each FILE to standard output.
    -
    -With no FILE, or when FILE is -, read standard input.
    -
    -Mandatory arguments to long options are mandatory for short options too.
    -  -b, --bytes=LIST        select only these bytes
    -  -c, --characters=LIST   select only these characters
    -  -d, --delimiter=DELIM   use DELIM instead of TAB for field delimiter
    -  -f, --fields=LIST       select only these fields; 
    -                          also print any line that contains no delimiter character,
    -                          unless the -s is specified
    -  -n                      (ignored)
    -      --complement        complement the set of selected bytes, characters or fields
    -  -s, --only-delimited    do not print lines not containing delimiters
    -      --output-delimiter=STRING  use STRING as the output delimiter the default is to
    -                                 use the input delimiter
    -  -z, --zero-terminated    line delimiter is NUL, not newline
    -      --help     display this help and exit
    -      --version  output version information and exit
    -
    -
    -
    -
    -
    -

    sort

    -
    -Usage: sort [OPTION]... [FILE]...
    -  or:  sort [OPTION]... --files0-from=F
    -Write sorted concatenation of all FILE(s) to standard output.
    -
    -With no FILE, or when FILE is -, read standard input.
    -
    -Mandatory arguments to long options are mandatory for short options too.
    -Ordering options:
    -
    -  -b, --ignore-leading-blanks  ignore leading blanks
    -  -d, --dictionary-order      consider only blanks and alphanumeric characters
    -  -f, --ignore-case           fold lower case to upper case characters
    -  -g, --general-numeric-sort  compare according to general numerical value
    -  -i, --ignore-nonprinting    consider only printable characters
    -  -M, --month-sort            compare (unknown) < 'JAN' < ... < 'DEC'
    -  -h, --human-numeric-sort    compare human readable numbers (e.g., 2K 1G)
    -  -n, --numeric-sort          compare according to string numerical value
    -  -R, --random-sort           shuffle, but group identical keys.  See shuf(1)
    -      --random-source=FILE    get random bytes from FILE
    -  -r, --reverse               reverse the result of comparisons
    -      --sort=WORD             sort according to WORD:
    -                                general-numeric -g, human-numeric -h, month -M,
    -                                numeric -n, random -R, version -V
    -  -V, --version-sort          natural sort of (version) numbers within text
    -
    -Other options:
    -      --batch-size=NMERGE   merge at most NMERGE inputs at once; for more use temp files
    -  -c, --check, --check=diagnose-first  check for sorted input; do not sort
    -  -C, --check=quiet, --check=silent  like -c, but do not report first bad line
    -      --compress-program=PROG  compress temporaries with PROG; decompress them with PROG -d
    -      --debug               annotate the part of the line used to sort, and warn about questionable usage to stderr
    -      --files0-from=F       read input from the files specified by NUL-terminated names in file F;
    -                            If F is - then read names from standard input
    -  -k, --key=KEYDEF          sort via a key; KEYDEF gives location and type
    -  -m, --merge               merge already sorted files; do not sort
    -  -o, --output=FILE         write result to FILE instead of standard output
    -  -s, --stable              stabilize sort by disabling last-resort comparison
    -  -S, --buffer-size=SIZE    use SIZE for main memory buffer
    -  -t, --field-separator=SEP  use SEP instead of non-blank to blank transition
    -  -T, --temporary-directory=DIR  use DIR for temporaries, not $TMPDIR or /tmp; multiple options specify multiple directories
    -      --parallel=N          change the number of sorts run concurrently to N
    -  -u, --unique              with -c, check for strict ordering; without -c, output only the first of an equal run
    -  -z, --zero-terminated     line delimiter is NUL, not newline
    -      --help     display this help and exit
    -      --version  output version information and exit
    -
    -

    Eksempler

    -
    -
    sort foo -o foo
    -
    Sorterer filen foo, overskriver filen med "seg selv".
    - -
    sort < foo | tee foo.sort | lpr
    -
    Sorterer filen foo, skriver sorterte linjer til filen foo.sort og til printer (se manualsidene for tee og lpr).
    - -
    cat | sort >> foo.bar
    -
    Sorterer standard input og legger sorterte linjer på slutten av filen foo.bar.
    - -
    ls -R | grep .*\.java$ | sort
    -
    ls -R lister navnene på alle filer i hele katalogtreet, grep-kommandoen filtrerer ut bare linjer som slutter med .java, før linjene til slutt sender til sortering.
    - -
    Oppgaver
    -
    Fil inneholder linjer med: Registreringsnr:Bilmerke:Modell:Årsmodell:Eier:Kilometerstand:Verdi. Eks på linje: AA63187:Volkswagen:Karmann-Ghia:1969:Høiberg,Jan:61338:250000
    -
    -
    -
    Sorter filen på bilenes verdi, slik at bilen med høyest verdi kommer først. Den sorterte filen skal skrives over den opprinnelige filen.
    -
    sort -t: -nr -k7 -o bildata bildata
    - -
    Som i punkt 1., men i tillegg skal biler med lik verdi ligge sortert stigende på årsmodell.
    -
    sort -t: -k7nr -k4n -o bildata bildata
    - -
    Sorter filen alfabetisk etter navn på eier. Sorteringen skal være riktig også hvis noen av navnene er skrevet med bare små eller bare store bokstaver.
    -
    sort -i -t: -k5d bildata
    - -
    Skriv ut reg.nr. og verdi for de 20 bilene som har lavest verdi.
    -
    cut -d: -f1,7 bildata | sort -t: -k2n | head -20
    - -
    Finn og skriv ut i sortert rekkefølge (sortert etter antall biler), navnet på de 10 personene som eier flest biler.
    -
    cut -d: -f5 bildata | sort | uniq -c | sort -nr | head -10
    - -
    Lag en sortert fil med navn tilsalgs. Filen skal være sortert på verdi, og skal kun inneholde bilmerke, årsmodell, kilometerstand og verdi.
    -
    cut -d: -f2,4,6,7 bildata | sort -t: -k4n > tilsalgs
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    tr

    -
    -Usage: tr [OPTION]... SET1 [SET2]
    -Translate, squeeze, and/or delete characters from standard input,
    -writing to standard output.
    -
    -  -c, -C, --complement    use the complement of SET1
    -  -d, --delete            delete characters in SET1, do not translate
    -  -s, --squeeze-repeats   replace each sequence of a repeated character
    -                            that is listed in the last specified SET,
    -                            with a single occurrence of that character
    -  -t, --truncate-set1     first truncate SET1 to length of SET2
    -      --help     display this help and exit
    -      --version  output version information and exit
    -
    -SETs are specified as strings of characters.  Most represent themselves.
    -Interpreted sequences are:
    -
    -  \NNN            character with octal value NNN (1 to 3 octal digits)
    -  \\              backslash
    -  \a              audible BEL
    -  \b              backspace
    -  \f              form feed
    -  \n              new line
    -  \r              return
    -  \t              horizontal tab
    -  \v              vertical tab
    -  CHAR1-CHAR2     all characters from CHAR1 to CHAR2 in ascending order
    -  [CHAR*]         in SET2, copies of CHAR until length of SET1
    -  [CHAR*REPEAT]   REPEAT copies of CHAR, REPEAT octal if starting with 0
    -  [:alnum:]       all letters and digits
    -  [:alpha:]       all letters
    -  [:blank:]       all horizontal whitespace
    -  [:cntrl:]       all control characters
    -  [:digit:]       all digits
    -  [:graph:]       all printable characters, not including space
    -  [:lower:]       all lower case letters
    -  [:print:]       all printable characters, including space
    -  [:punct:]       all punctuation characters
    -  [:space:]       all horizontal or vertical whitespace
    -  [:upper:]       all upper case letters
    -  [:xdigit:]      all hexadecimal digits
    -  [=CHAR=]        all characters which are equivalent to CHAR
    -
    - -
    -
    -

    Switch case

    -
    -
    -
    -case $1 in
    -    hello)
    -        # $i is "hello"
    -        ;;
    -    9[1-3]) # <--- Regex
    -        # $i is 91, 92 or 93
    -        ;;
    -    *)
    -        # $i is non of the above
    -        ;;
    -esac
    -
    -
    -
    - Gjør om fra timer til sec/min ved: bashfil -s/-m < timer > -
    -error() { exit 1; }
    -
    -while getopts ":s:m:" o; do
    -    case "${o}" in
    -        s)
    -            tid=$((${OPTARG}*60*60))
    -            ;;
    -        m)
    -            tid=$((${OPTARG}*60))
    -            ;;
    -        *)
    -            error
    -            ;;
    -    esac
    -done
    -
    -
    -
    -
    - -

    Until loop

    -
    -
    - Tell fra 20 til 10
    -
    -i=20
    -until [  $i -lt 10 ]; do
    -	echo i $i
    -	((i--))
    -done
    -
    -
    -
    -
    -
    -
    -
    -
    -

    if

    -
    Brukes for å starte en if check
    -
    if COMMANDS; then COMMANDS; [ elif COMMANDS; then COMMANDS; ]... [ else COMMANDS; ] fi
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    [ -a FILE ] True if FILE exists.
    [ -b FILE ] True if FILE exists and is a block-special file.
    [ -c FILE ] True if FILE exists and is a character-special file.
    [ -d FILE ] True if FILE exists and is a directory.
    [ -e FILE ] True if FILE exists.
    [ -f FILE ] True if FILE exists and is a regular file.
    [ -g FILE ] True if FILE exists and its SGID bit is set.
    [ -h FILE ] True if FILE exists and is a symbolic link.
    [ -k FILE ] True if FILE exists and its sticky bit is set.
    [ -p FILE ] True if FILE exists and is a named pipe (FIFO).
    [ -r FILE ] True if FILE exists and is readable.
    [ -s FILE ] True if FILE exists and has a size greater than zero.
    [ -t FD ] True if file descriptor FD is open and refers to a terminal.
    [ -u FILE ] True if FILE exists and its SUID (set user ID) bit is set.
    [ -w FILE ] True if FILE exists and is writable.
    [ -x FILE ] True if FILE exists and is executable.
    [ -O FILE ] True if FILE exists and is owned by the effective user ID.
    [ -G FILE ] True if FILE exists and is owned by the effective group ID.
    [ -L FILE ] True if FILE exists and is a symbolic link.
    [ -N FILE ] True if FILE exists and has been modified since it was last read.
    [ -S FILE ] True if FILE exists and is a socket.
    [ FILE1 -nt FILE2 ] True if FILE1 has been changed more recently than FILE2, or if FILE1 exists and FILE2 does not.
    [ FILE1 -ot FILE2 ] True if FILE1 is older than FILE2, or is FILE2 exists and FILE1 does not.
    [ FILE1 -ef FILE2 ] True if FILE1 and FILE2 refer to the same device and inode numbers.
    [ -o OPTIONNAME ]True if shell option "OPTIONNAME" is enabled.
    [ -z STRING ]True of the length if "STRING" is zero.
    [ -n STRING ] or [ STRING ]True if the length of "STRING" is non-zero.
    [ STRING1 == STRING2 ]True if the strings are equal. "=" may be used instead of "==" for strict POSIX compliance.
    [ STRING1 != STRING2 ]True if the strings are not equal.
    [ STRING1 < STRING2 ]True if "STRING1" sorts before "STRING2" lexicographically in the current locale.
    [ STRING1 > STRING2 ]True if "STRING1" sorts after "STRING2" lexicographically in the current locale.
    [ ARG1 OP ARG2 ]"OP" is one of -eq, -ne, -lt, -le, -gt or -ge. These arithmetic binary operators return true if "ARG1" is equal to, not equal to, less than, less than or equal to, greater than, or greater than or equal to "ARG2", respectively. "ARG1" and "ARG2" are integers.
    KombineringExpressions may be combined using the following operators, listed in decreasing order of precedence (viktighet):
    [ ! EXPR ] True if EXPR is false.
    [ ( EXPR ) ] Returns the value of EXPR. This may be used to override the normal precedence of operators.
    [ EXPR1 -a EXPR2 ] True if both EXPR1 and EXPR2 are true. && can also be used.
    [ EXPR1 -o EXPR2 ] True if either EXPR1 or EXPR2 is true. || can also be used.
    Eks
    -
    -
    -
    - Sjekk om en fil finnes
    -
    -#!/bin/bash
    -if [ -f /tmp/messages.txt ]; then
    -	# file exists
    -else
    -	# file does not exists
    -fi
    -
    -
    -
    - Sjekk om en bash option er satt (set -o [OPTIONNAME])
    -
    -#!/bin/bash
    -if [ $USER == 'bob' ] || [ $USER == 'andy' ]
    -	# user is bob or andy
    -else
    -	# user is neither bob nor andy
    -fi
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    While loop

    -
    -
    - Echo hello 4 ganger
    -
    -i="0"
    -while [ $i -lt 4 ]; do
    -	echo "hello"
    -	((i++))
    -done
    -
    -
    -Kan også skrives uten ((i++)) inni loopen:
    -while [[ i++ -lt 4 ]];
    -
    -
    -
    - Lag en ny fil hvert 5. min
    -
    -while true; do
    -	touch filename-'date +%s'.txt
    -	sleep 300
    -done
    -
    -
    -
    - while read
    -
    -echo '1 2 3 4 5 6' | while read a b c
    -do
    -  echo $a $b $c
    -done
    -
    -$a blir 1
    -$b blir 2
    -$c blir 3 4 5 6
    -
    -
    -
    -
    - -

    For in loop

    -
    -
    -
    - Output alle filer & kataloger
    -
    -for i in $( ls -a ); do
    -	echo $i
    -done
    -
    -
    -
    - Loop fra 1 til 10
    -
    -for i in $(seq 1 10); do
    -	echo $i;
    -done
    -
    -
    -Alternativt kan man skrive:
    -for i in {1..10}; do
    -
    -
    -
    -
    -
    - -

    Regex

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    CharacterMeaningExample
    *Match zero, one or more of the previousAh* matches "Ahhhhh" or "A"
    ?Match zero or one of the previousAh? matches "Al" or "Ah" -
    +Match one or more of the previousAh+ matches "Ah" or "Ahhh" but not "A"
    \Used to escape a special characterHungry\? matches "Hungry?"
    .Wildcard character, matches any characterdo.* matches "dog", "door", "dot", etc.
    ( )Group charactersSee example for |
    [ ]Matches a range of characters - [cbf]ar matches "car", "bar", or "far"
    - [0-9]+ matches any positive integer
    - [a-zA-Z] matches ascii letters a-z (uppercase and lower case)
    - [^0-9] matches any character not 0-9. -
    |Matche previous OR next character/group(Mon)|(Tues)day matches "Monday" or "Tuesday"
    { }Matches a specified number of occurrences of the previous - [0-9]{3} matches "315" but not "31"
    - [0-9]{2,4} matches "12", "123", and "1234"
    - [0-9]{2,} matches "1234567..." -
    ^Beginning of a string. Or within a character range [] negation.^http matches strings that begin with http, such as a url.
    [^0-9] matches any character not 0-9.
    $End of a string.ing$ matches "exciting" but not "ingenious"
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Character ClassMeaning
    [:alpha:]Any letter, [A-Za-z]
    [:upper:]Any uppercase letter, [A-Z]
    [:lower:]Any lowercase letter, [a-z]
    [:digit:]Any digit, [0-9]
    [:alnum:]Any alphanumeric character, [A-Za-z0-9]
    [:xdigit:]Any hexadecimal digit, [0-9A-Fa-f]
    [:space:]A tab, new line, vertical tab, form feed, carriage return, or space
    [:blank:]A space or a tab.
    [:print:]Any printable character
    [:punct:]Any punctuation character: ! ' # S % & ' ( ) * + , - . / : ; < = > ? @ [ / ] ^ _ { | } ~
    [:graph:]Any character defined as a printable character except those defined as part of the space character class
    [:word:]Continuous string of alphanumeric characters and underscores.
    [:ascii:]ASCII characters, in the range: 0-127
    [:cntrl:]Any character not part of the character classes: [:upper:], [:lower:], [:alpha:], [:digit:], [:punct:], [:graph:], [:print:], [:xdigit:]
    -
    -
    -
    -
    -

    Kode eksempler

    -
    -
    Finn de 20 ordene som forekommer færrest antall ganger i en tekstfil.
    -
    tr -sc a-zA-Z "\n" < churchill.txt | tr A-Z a-z | sort | uniq -c | sort -n | tr -s ' ' ' ' | head -20
    - -
    Finn de 20 ordene som forekommer færrest antall ganger i en tekstfil, skal også funke for ord med æøå i seg.
    -
    tr -sc a-zA-ZæøåÆØÅ "\n" < kongen_2008.txt | tr A-ZÆØÅ a-zæøå | sort | uniq -c | sort -n | tr -s ' ' ' ' | head -20
    - -
    Lag script som:
    -
    Ber bruker om navnet på en tekstfil, leser et filnavn F fra tastaturet og lagrer dette i en skallvariabel.
    -
    Ber bruker om et positivt heltall N, leser og lagrer også dette tallet.
    -
    Skriver ut de N mest brukte ordene på filen F.
    -
    -
    read -p "Filnavn: " F
    -read -p "Positivt heltakk: " N
    -
    -tr -sc a-zA-Z "\n" < $F | tr A-Z a-z | sort | uniq -c
    -| sort - | tr -s ' ' ' ' | head -$N
    -
    -
    -
    - -
    Sorterer teksten (persondata.txt) slik at linjene blir liggende sortert i omvendt (avtagende) rekkefølge - på personenes alder. Personer med samme alder skal ligge sortert i stigende rekkefølge på postnummer. Den - sorterte utskriften fra kommandoen skal lagres på en fil med navn persondata_sortert.txt.
    -
    -29:Jan:Høiberg:Darres gate 22:0175:Oslo:69215348
    -62:Mette:Myhrvold:Sandakerveien 10G:0743:Oslo:99106353
    -29:Ottar:Fjernvalg:Gata 13:2222:Rena:22232425
    -39:Rick:Danko:Tinker Street 10:1121:Bearsville:20102010
    -...
    -
    - -
    sort -t : -k1nr -k5n < persondata.txt -o persondata-sortert.txt
    -
    Lag en ny fil med navn telefonliste.txt. Den nye filen skal ha like mange linjer som den opprinnelige filen. - Hver linje på den nye filen skal inneholde (i rekkefølge) en persons fornavn, etternavn og telefonnummer, med - tegnet : (kolon) mellom hvert datafelt. En linje på filen telefonliste.txt kan se slik ut: Jan:Høiberg:69215348 - Filen telefonliste.txt skal være alfabetisk sortert på etternavnet.
    -
    cut -d: -f2,3,7 persondata.txt | sort -t: -k2 -o telefonliste.txt
    - -
    Les persondata.txt og bare skriv ut fornavn og etternavn (med tegnet : i mellom), for alle personer som - har et postnummer som begynner med sifrene 11, 12 eller 13. Du kan anta at et postnummer alltid inneholder - fire siffer
    -
    egrep '\<1[1-3][0-9]{2}\>' persondata.txt | cut -d: -f2,3
    - -
    Les persondata.txt og lag en ny fil med navn persondata_2.txt. Den nye filen skal inneholde samme - informasjon som persondata.txt, med unntak av at informasjon om alle personer som har et postnummer som begynner - med sifrene 11, 12 eller 13 ikke skal være med på filen.
    -
    egrep -v '\<1[1-3][0-9]{2}\>' persondata.txt > persondata_2.txt
    - -
    Skriv ut bare de tegnene fra /dev/urandom som er "printable". Output skal splittes opp i linjer, slik at - det er 16 tegn på hver linje som skrives ut (se man fold). Det skal skrives ut 20 linjer med output.
    -
    tr -cd '[:print:]' < /dev/urandom | fold -w 16 | head -20
    - -
    Generer 20 tilfeldige tall. Hvert tall skal ha nøyaktig 16 sifre. Tallene skal inneholde sifrene 0-9, men - kan ikke begynne med sifferet 0 (null). Kommandoen skal skrive ut hvert tall på en egen linje.
    -
    tr -cd '[:digit:]' < /dev/urandom | fold -w 16 | egrep '^[^0][0-9]{15}' | head -n20
    - -
    Skriv ut antall hop, enten helt frem til en gitt server, eller frem til første ruter på veien som kjører - en brannvegg som "kaster" data fra traceroute.
    -
    traceroute xdh.no | egrep '[[:digit:]]{1,2}[[:space:]]{2}(\* \* \*)' | head -n1 | egrep -o '[[:digit:]]{1,2}
    - -
    lag shellscript som leser følgende data interaktivt fra bruker: en URL, et ord og et filnavn
    -
    Marker alle forekomster i teksten av ordet som bruker har angitt, med en * (stjerne) foran og bak ordet.
    -
    Lagre hele teksten (med det angitte ordet markert med stjerner) på en ny fil med det angitte filnavnet.
    -
    -
    -#!/bin/bash
    -
    -read -p "URL: " url
    -read -p "Ord: " word
    -read -p "Filnavn: " filename
    -
    -wget -O $filename $url
    -
    -sed -i 's/'$word'/*'$word'*/g' $filename
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    Hva er de viktigste oppgavene til et operativsystem?
    -
    Kommunisere med bruker og styre hardware. Fordele delte ressurser som RAM, nettverksporter, disk og printere. - Starte og kontrollere programmer. Sikre filer og data. Tilby filsystem.
    - -
    Hva er søkestien (search path) for et skall?
    -
    En søkesti er en liste med kataloger der skallet vil lete for å finne en kommando
    - -
    Hva er navnet på skallvariabelen der søkestien lagres i Bourne-again shell?
    -
    Søkestien ligger i systemvariabelen PATH, som inneholder en tekststreng med katalognavn adskilt med ':' (kolon).
    - -
    Nevn en fordel og en ulempe ved å bruke et GUI (grafisk grensesnitt)
    -
    -
    -
    Fordeler ved GUI:
    -
    Gjør det enklere og mer intuitivt å bruke datamaskinen. Mange brukere er vant til GUI'er (Nintendo, - Windows, web) og arbeider lettere med pek-og-klikk verktøy.
    - -
    Ulemper ved GUI:
    -
    Gir et "ferdigsydd" oppsett med mindre muligheter til å "skreddersy" arbeidsomgivelsene. En GUI er et - ekstra lag med software mellom bruker og oppgavene som skal gjøres på maskinen, noe som gjør at oppgavene utføres saktere.
    -
    -
    - -
    Nevn en fordel og en ulempe ved å bruke et CLI (kommandolinjen)
    -
    -
    -
    Fordeler ved CLI:
    -
    Gir bedre mulighet til å kontrollere systemet og kjøre applikasjonene slik man selv ønsker. Raskt, med - et minimalt ekstra lag med software mellom bruker og kjernen.
    - -
    Ulemper ved CLI:
    -
    Kryptisk syntaks. Høyere inngangsterskel for nybegynnere og GUI-brukere.
    -
    -
    - -
    Forklar forskjellen mellom opsjoner og argumenter til en Linux-kommando.
    -
    Opsjoner er parametre som bestemmer hvordan kommandoen skal virke. Argumenter er parametre som angir - hvilke data kommandoen skal arbeide med, f.eks. filnavn, tall og tekststrenger.
    - -
    Hva utføres ved eksekvering av: man man > man.txt?
    -
    Manualsidene til kommandoen man (manual pages) skrives til filen man.txt.
    - -
    Hva utføres ved eksekvering av: echo a*?
    -
    Navnet på alle filer i stående katalog, hvis navn begynner med en a, skrives ut til standard - utenhet. Hvis det ikke finnes noen filer med navn som begynner med en a, skrives strengen - a* ut.
    -
    - -

    Kommandoen read kan brukes for å lese inn verdier fra tastaturet og lagre dem i en variabel. - Merk at read er en kommando som er "innebygget" i Bash, på samme måte som history. For - å se dokumentasjonen på read, kan du bruke kommandoen help read | more. Les - dokumentasjonen for read, og finn ut hvordan den virker (hva skjer hvis du prøver med - man read?). Skriv en Linux-kommando som spør bruker om fornavn og etternavn (bruk opsjonen - -p til read), og leser navnene inn i to variable. Skriv deretter en Linux-kommando som, - hvis f.eks. brukers navn er Per Hansen, skriver ut på skjermen "Hællæ, Per Hansen".
    - read -p "Tast inn fornavn og etternavn: " fornavn etternavn
    - echo "Hællæ, $fornavn $etternavn"

    - -
    -

    Opprett en ny fil med navn testprogram med en teksteditor. Legg inn de to kommandoene du skrev i - forrige oppgave på hver sin linje i denne filen. Lagre filen og gå tilbake til shellet. Gi kommandoen: - bash testprogram. Hva skjer? Det startes et nytt subshell som leser og utfører de to kommandoene - som er lagret på filen (som er et skallprogram/shellscript). Deretter terminerer subshellet og kontrollen går - tilbake til innloggings-shellet.

    - -
    -
    Hvilke filtyper har vi i Linux?
    -
    -
      -
    • Regulære filer (regular/ordinary files)
    • -
    • Kataloger (directory files)
    • -
    • Spesialfiler (links, devices, pipes,...)
    • -
    -
    - -
    Hva er et inode-nummer i filsystemet til Linux?
    -
    Inoden er en datastruktur i et Unix-stil-filsystem som beskriver et filsystemobjekt som en fil eller en - katalog. Hver inode lagrer attributter og diskblokkposisjon(er) til objektets data. Attributter for - filsystemsobjekter kan inneholde metadata som tider for siste endring og tilgang, samt eier- og tillatelsesdata. - Kataloger er lister over navn som er tilordnet inoder. En katalog inneholder en oppføring for seg selv, sin - forelder og hver av sine barn.
    - -
    Hva inneholder egentlig en katalogfil?
    -
    En katalogfil inneholder en liste med ett element for hver fil (inkludert katalogfiler) i katalogen. Et - element i en katalogfil kalles for en hard link og består av filens inode-nummer og filnavn.
    - -
    Hvordan kan vi skille en ordinær fil fra en katalogfil ved hjelp av kommandoen ls?
    -
    Bruk ls -l, første tegn på linjen for hver fil angir da filtype, d for - katalogfil, - for ordinær fil. Evt. kan ls -F brukes, da angis filtypene med et - spesialtegn (og fargekoding i noen versjoner av ls) etter filnavnene.
    - -
    Skriv en Linux-kommando som skriver ut innholdet av alle filer i stående katalog som har et filnavn som - slutter med .txt.
    -
    cat *.txt
    - -
    -
    -
    -
    -
    -
    -
    (Symbolic links) For å se i praksis hvordan lenker virker, gjør følgende:
    -
    -
    -
    Opprett en fil med navn abcd.txt som inneholder et par linjer med tekst.
    -
    nano/emacs/vim abcd.txt
    - -
    Bruk ln til å lage en hard lenke med navn abcd_hard.txt og en symbolsk lenke - med navn abcd_soft.txt, som begge peker til filen abcd.txt.
    -
    ln abcd.txt abcd_hard.txtln -s abcd.txt abcd_soft.txt
    - -
    Skriv ut innholdet av tekstfilen og av begge lenkene med cat, for å verifisere at de - refererer til samme datafil.
    -
    cat abcd.txt, cat abcd_soft.txt, cat abcd_hard.txt,
    - -
    Skriv ut inodenummerne til tekstfilen og til de to lenkene, med ls -i. Hva ser du?
    -
    Hvis det er flere hard-links til samme fil, vil de ha samme inode-nummer. Filen lagres bare ett sted, - men det kan være flere katalogfiler med hard-links som peker til samme fil.
    - -
    Skriv ut informasjon om bl.a. filtype, størrelse og antall (harde) lenker for tekstfilen og de to - lenkene, med ls -l. Hva ser du?
    -
    Det to hard-linkene har samme filinformasjon, og viser at det er to hard-links til filen. Soft-linken - er en egen fil med eget inode-nummer og størrelse lik antall bytes i den symbolske linken.
    - -
    Fjern tekstfilen abcd.txt. Prøv deretter å skrive ut innholdet av både den harde og den - symbolske lenken. Hva skjer, og hvorfor?
    -
    Den symbolske lenken virker ikke lenger, fordi filnavnet den lenker til er fjernet. Filen i seg selv - fjernes ikke, fordi det fortsatt finnes en hard-link til den.
    -
    -
    - -
    Opprett en tom fil med touch. Gjør om tilgangsrettighetene til denne filen slik at det bare er du selv som har full tilgang, mens de som er medlem i gruppen din bare kan lese filen, og alle andre verken kan lese endre eller eksekvere den.
    -
    -
    -touch tom-fil
    -chmod 740 tom-fil
    -
    -
    -
    Alternativt kan det brukes tre kommandoer med symbolske tilgangsrettigheter i stedet for en tre-sifret file mode:
    - chmod u=rwx tom-fil; chmod g=r tom-fil; chmod o= tom-fil - -
    Forklar hva kommandoene gjør:
    -
    -
    -
    kill -9 1212 1313 1414
    -
    Sender signalet SIGKILL til tre prosesser med angitte PID-numre. Prosessene vil terminere hvis brukeren som gir kill-kommandoen er prosesseier.
    - -
    pkill mysqld
    -
    Sender signalet SIGTERM til alle brukerens prosesser som er startet med kommandoen mysqld.
    - -
    killall mysqld
    -
    Vil her gjøre det samme som kommandoen i forrige deloppgave. Se manualsidene for en beskrivelse av forskjellene i virkemåte for pkill og killall.
    - -
    ps aux --sort -rss | more
    -
    Skriver ut (en "side" om gangen med more) alle prosesser på systemet, sortert etter hvor mye fysisk minne som er satt av til prosessene.
    -
    -
    - -
    Skriv en sammensatt Linux-kommando som, for et gitt brukernavn, skriver ut informasjon om de 5 prosessene som brukeren har på systemet som bruker mest minneressurser. Hint: Ta utgangspunkt i ps-varianten i siste deloppgave ovenfor, utvid denne og kombiner med head.
    -
    Her er det ingen "fasit", siden det ikke er angitt hvilke data som skal skrives ut for prosessene. En mulig løsning er:
    -
    ps ux -u janh --sort -rss | head -6
    - -
    En gammel eksamensoppgave om prosesshåndtering
    -
    Du skal sortere linjene i en meget stor tekstfil. Sorteringen krever mye ressurser og kjøretid på Linux-systemet.
    -
    -
    -
    a) Sorteringen skal helst være ferdig før du logger deg ut, men du vil gjerne kunne gjøre andre ting på maskinen mens sorteringen pågår. Du er også en snill bruker som ikke vil stjele for mye prosessorkraft fra de andre brukerne som er logget på. Skriv en Linux-kommando som løser dette problemet for deg.
    -
    nice sort tekstfil &
    - -
    b) Du blir lei av å vente på at sorteringsjobben fra oppgave a) skal bli ferdig, og bestemmer deg for å terminere den. Hvordan vil du gjøre dette?
    -
    Finn PID for prosessen med bruk av ps. Bruk deretter f.eks. kill -9 PID.
    - -
    c) Etter å ha stoppet sorteringsjobben, finner du ut at du vil starte den en gang til. Problemet nå er at polet stenger om 5 minutter og du må derfor straks logge deg ut. Skriv en kommando som starter sorteringen på nytt, og sikrer at den fortsetter etter utlogging. Hint: Se man nohup på f.eks. ask.hiof.no.
    -
    nohup sort tekstfil &
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    d) I punkt c) glemte du (sier vi) å sette ned prioriteten på sorteringen. Når du kommer tilbake etter en vellykket handel, får du forferdelig mye kjeft av av sys.adm. for å ha gjort systemet tregt i en hektisk periode. Sys.adm. har i tillegg terminert sorteringsjobben din før den var ferdig, og truer med å stenge deg ute fra systemet hvis noe lignende skjer igjen. Som en siste utvei, vil du nå prøve å kjøre sorteringen slik at den bare utføres når belastningen på maskinen er lav og det er mye ledig kapasitet i CPU, f.eks. om natten. Hvordan kan du få til dette? Hint: Se man batch og man at på f.eks. ask.hiof.no.
    -
    Legg kommandolinjen med sorteringskommandoen som skal utføres på en fil med (f.eks.) navnet sort_job. Bruk deretter en av disse kommandoene:
    -
    batch sort_job (starter sortering når belastning er lav)
    -
    at 3am sort_job (starter sortering kl 3 om natten)
    - -
    e) Når du kommer tilbake neste morgen, får du beskjed om at sys.adm. tok ned maskinen kvelden før for uanmeldt "vedlikehold". Sorteringsjobben din er ennå ikke utført. I et anfall av raseri torturerer du sys.adm. inntil han gir deg rotpassordet, og logger deretter på systemet som superbruker/root. Forklar hvordan du nå enkelt kan kjøre sorteringen din hensynsløst og mye raskere enn tidligere.
    -
    Superbruker/root kan starte programmer med negative nice-verdier, som gir raskere eksekvering. "Verste" mulighet er:
    -
    nice --20 sort tekstfil
    -
    -
    - -
    Hva utføres av hver av disse Linux-kommandoene?
    -
    -
    -
    a) grep 'laks' < meny >> dagens
    -
    Legger linjene i filen meny som inneholder strengen laks, på slutten av filen dagens.
    - -
    b) grep 'laks' < meny | tee -a dagens | wc -l
    -
    Programmet tee skriver standard input både til en angitt fil og til standard output. Kommandoen her legger linjene i filen meny som inneholder strengen laks på slutten av filen dagens, og skriver deretter ut antall linjer som ble lagt til.
    - -
    c) ls | fgrep meny | wc -l
    -
    Skriver ut antall filer i stående katalog som har et filnavn som inneholder strengen meny.
    - -
    d) ls -al | egrep -v '^-'
    -
    ls skriver ut "lang" filinformasjon (opsjonen -l) for alle filer i stående katalog, også "skjulte filer" som har et navn som begynner med tegnet '.' (opsjonen -a). egrep-kommandoen sørger for at bare filer som ikke er ordinære diskfiler (filtypen er noe annet enn '-') skrives ut.
    - -
    e) egrep '^[.*]+$' foo
    -
    Skriver ut linjer på filen foo som bare består av null eller flere forekomster av tegnene '.' (punktum) og '*' (stjerne) . '.' og '*' er ikke et spesialtegn i regulæruttykk når de forekommer mellom '[' og ']'.
    - -
    f) egrep -vc '^$' foo
    -
    Skriver ut antall linjer (opsjonen -c) på filen foo som ikke er tomme. "^$" angir en tom linje uten andre tegn enn en NEWLINE. Opsjonen -v betyr at grep skal skrive ut alle linjene som ikke matcher søkemønsteret.
    - -
    g) ps aux | egrep "^$USER" | tr -s ' ' ' ' | cut -d' ' -f2,11- | sort -n
    -
    Skriver ut PID og kommandoen som startet prosessen, for alle dine egne prosesser, sortert på PID.
    -
    -
    - -
    Fil inneholder linjer med: Registreringsnr:Bilmerke:Modell:Årsmodell:Eier:Kilometerstand:Verdi. Eksempel på linje: AA63187:Mitsubishi:Outlander:Høiberg,Jan:61338:210000. Skriv Linux-kommandoer (med piping og redirigering av I/O) som løser følgende oppgaver:
    -
    -
    -
    a) Skriv ut en liste, sortert stigende på kilometerstand, med dataene for alle biler som eies av personer med etternavn lik Hansen.
    -
    grep ':Hansen,' bildata | sort -t: -rn -k5
    - -
    b) Skriv ut antall biler med merke lik VW og modell lik Karmann Ghia.
    -
    egrep -c '^[A-Z]{2}[0-9]{5}:VW:Karmann Ghia:' bildata
    - -
    c) Lag en ny fil med navn bildata-2 som inneholder det samme som filen bildata, med unntak av at alle forekomster av bilmerket Kia skal byttes ut med ordet Riskoker.
    -
    sed 's/:Kia:/:Riskoker:/' bildata > bildata-2
    - -
    d) Lag en ny fil med navn bildata-3 som inneholder det samme som filen bildata, med unntak av at alle biler som har en verdi som er større eller lik 100000 skal markeres med tegnet * ('stjerne') på slutten av linjen.
    -
    sed -r 's/:[1-9][0-9]{5,}$/&*/' bildata > bildata-3
    -
    -
    -
    -
    -
    -
    -
    -
    -
    "Review question" 59, side 311 i læreboken-- script som sjekker om parameter er et palindrom:
    -
    -
    -
    -
    -
    Løsning som bruker expr til strenghåndteringen
    -
    -
    -# Palindrome checker, expr string handling version
    -[ $# -ne 1 ] && { echo "usage: $0 string"; exit 1; }
    -start=1
    -end=$(expr length $1)
    -while [ $start -lt $end ]
    -do
    -  a=$(expr substr $1 $start 1)
    -  b=$(expr substr $1 $end 1)
    -  if [ $a = $b ]
    -  then
    -    ((start++))
    -    ((end--))
    -  else
    -    echo "\"$1\" is not a palindrome"
    -    exit 1
    -  fi
    -done
    -echo "\"$1\" is a palindrome"
    -exit 0
    -
    -
    -
    -
    -
    Løsning som bruker Bash-syntaks til strenghåndteringen
    -
    -
    -# Palindrome checker, Bash string handling version
    -[ $# -ne 1 ] && { echo "usage: $0 string"; exit 1; }
    -S=$1
    -start=0
    -end=$((${#S}-1))
    -while [ $start -lt $end ]
    -do
    -  if [ ${S:$start:1} = ${S:$end:1} ]
    -  then
    -    ((start++))
    -    ((end--))
    -  else
    -    echo "\"$1\" is not a palindrome"
    -    exit 1
    -  fi
    -done
    -echo "\"$1\" is a palindrome"
    -exit 0
    -
    -
    -
    -
    -
    One-liner :-)
    -
    -
    -[ $(echo $1 | rev) = $1 ] && echo "\"$1\" er et palindrom" || echo "\"$1\" er ikke et palindrom"
    -
    -
    -
    -
    - -
    Skriv en if-then-else-setning som tester om første parameter til et shellprogram er en katalog.
    -
    -
    -if [ -d $1 ]
    -then
    -  echo "$1 er en katalog"
    -else
    -  echo "$1 er ikke en katalog"
    -fi
    -
    -
    - -
    Skriv en if-then-else-setning som tester om første parameter til et shellprogram er en vanlig fil som kan leses og eksekveres.
    -
    -
    -if [ -f $1 -a -r $1 -a -x $1 ]
    -then
    -  echo "$1 er en vanlig fil som kan leses og eksekveres."
    -else
    -  echo "$1 er ikke en vanlig fil som kan leses og eksekveres."
    -fi
    -
    -
    - -
    -
    -
    Skriv en case setning som tester om første parameter til et shellprogram har en av verdiene "data", "source" eller "comments". Hvis parameteren ikke har noen av disse tre verdiene, skal det skrives ut en feilmelding.
    -
    -
    -case $1 in
    -  data)
    -     echo "Verdi: data"
    -     ;;
    -  source)
    -     echo "Verdi: source"
    -     ;;   
    -  comments)
    -     echo "Verdi: comments"
    -     ;;
    -  *)
    -     echo "Ukjent verdi"
    -     ;;
    -esac
    -
    -
    -
    -
    -
    Skriv en for løkke som leter etter linjer med ordet "Unix" i alle regulære, lesbare filer i stående katalog. Alle linjer som finnes skal lagres i en fil med navn Unix_linjer.
    -
    -
    -for filnavn in *
    -do
    -  if [ -f $filnavn -a -r $filnavn ] 
    -  then
    -    grep UNIX $filnavn >> UNIX_linjer
    -  fi
    -done
    -
    -
    -
    -
    - -
    Skriv et script med en uendelig løkke, som i hvert gjennomløp spør bruker etter et filnavn som skal fjernes, og fjerner filen hvis den finnes. Bruk break til å avslutte programmet når bruker taster inn filnavnet slutt.
    -
    -
    -while [ true ]
    -do
    -  read -p "Tast inn filnavn: " filnavn
    -  if [ "$filnavn" = slutt ]
    -  then
    -    break
    -  elif [ -e "$filnavn" ]
    -  then
    -    rm "$filnavn"
    -    echo "$filnavn slettet"
    -  else
    -    echo "$filnavn finnes ikke"
    -  fi
    -done
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    Skriv et shellprogram med en uendelig løkke, som i hvert gjennomløp sjekker om det finnes filer i katalogen /tmp som (antagelig) er tekstfiler. Hvis det finnes noen slike tekstfiler, skal de skrives ut til default printer før filene slettes. Programmet skal deretter vente i 15 minutter (se man sleep) før neste gjennomløp av løkken. Kommandoen file kan brukes til å finne ut om en fil (antagelig) er en tekstfil.
    -
    -
    -cd /tmp
    -while [ true ]
    -do
    -  for filnavn in *
    -  do
    -    if file "$filnavn" | grep -q text
    -    then 
    -      lpr $filnavn
    -      rm  $filnavn
    -    fi
    -  done
    -  sleep 900
    -done
    -
    -
    - Skriv et skallprogram som går gjennom alle parametrene som er gitt til programmet. Hvis en parameter er en regulær fil der vi har lese- og skrivetilgang, skal alle dupliserte linjer på filen (identiske linjer som kommer rett etter hverandre) fjernes, slik at filen bare har unike påfølgende linjer. Resultatet av denne fjerningen av duplikater skal overskrive (lagres på samme filnavn som) den opprinnelige filen. -
    -#!/bin/bash
    -for file in $@
    -do
    -  if [ -f "$file" -a -r "$file" -a -w "$file" ]
    -  then
    -    uniq "$file" "${file}_without_duplicates"
    -    mv "${file}_without_duplicates" "$file"
    -  fi
    -done
    -
    -
    -
    - -
    Skriv et shellprogram med navn omform som håndterer én opsjon (som kan utelates) og ett argument, på formen: omform [-s|-m] t Argumentet t er et tidsrom oppgitt i hele timer. omform skal regne om tiden enten til sekunder (opsjonen -s, som skal være default) eller til minutter (opsjonen -m). Resultatet skal skrives til stdout. Programmet skal sjekke at opsjoner og argumenter er riktige bl.a. med bruk av case, og skal gi fornuftige feilmeldinger
    -
    -
    -#!/bin/bash
    -
    -# Sjekker om antall parametre er riktig (1 eller 2)
    -if [ $# -lt 1 -o $# -gt 2 ]
    -then
    -   echo "usage: $0 [-s|-m] number"
    -   exit 1
    -fi
    -
    -factor=3600
    -
    -# Hvis to parametre, skal den første være en opsjon
    -if [ $# -eq 2 ]
    -then
    -
    -  # Tar vare på opsjonen, gjør deretter en shift slik at argumentet
    -  # (timeantallet) alltid ligger i $1
    -  opt=$1
    -  shift
    -
    -  # Sjekker at gitt opsjon er korrekt
    -  case $opt in
    -  -s)
    -     factor=3600
    -     ;;
    -  -m)
    -     factor=60
    -     ;;
    -   *)
    -     echo "$0: invalid option '$opt'"
    -     exit 1
    -     ;;
    -  esac
    -fi
    -
    -# Tester om argumentet faktisk er et positivt heltall, selv om dette
    -# ikke kreves i oppgaven.En slik test på datatype kan gjøres på mange
    -# måter. Her sender vi verdien av argumentet til grep, som sjekker om
    -# det inneholder noen andre tegn enn sifre
    -
    -if echo $1 | egrep -qv [0-9] 
    -then
    -  echo "usage: $0 [-s|-m] number"
    -  exit 1
    -fi
    -  
    -# Alt OK, skriver ut svaret og terminerer
    -echo $(( $factor * $1 )) 
    -exit 0
    -
    -
    -
    -
    -
    -
    -
    -

    Oppgave 1: Bruk av Linux shellkommandoer fra C-program

    -

    Dokumentasjon av C-bibliotekene på et Linux-system ligger integrert i manualsystemet som kan leses med kommandoen man. - For f.eks. å se hvorledes C-funksjonen system virker, kan du skrive man system fra kommandolinjen i Linux. Du vil da se - at system er en C-funksjon som ligger i stdlib og brukes for å utføre en shell-kommando på maskinen fra et C-program. - F.eks. vil programlinjen: system("ls"); i et C-program føre til at det skrives ut en liste over filene i - stående katalog. Programmet må inneholde preprosessordirektivet #include <stdlib.h> i starten av koden. Skriv et - C-program som bruker Linux-kommandoer til å skrive ut i rekkefølge: Nåværende dato og tid. En liste med info. om alle - brukere som er logget på Linux-systemet.

    -
    -#include <stdio.h>
    -#include <stdlib.h>
    -
    -main()
    -{
    -  system("date");
    -  system("who");
    -}
    -
    - -

    Oppgave 2: Enkel utskrift og innlesning av variable

    -

    a) Skriv et C-program som skriver ut fem linjer med fem stjerner på hver linje.

    -
    -#include <stdio.h>
    -
    -main()
    -{
    -  printf("*****\n");
    -  printf("*****\n");
    -  printf("*****\n");
    -  printf("*****\n");
    -  printf("*****\n");
    -}
    -
    - -

    b) Skriv et C-program som deklarerer to heltallsvariable og en flyttallsvariabel, initialiserer disse variablene til å ha verdiene 10, 15 og 12.6, og deretter skriver dem ut.

    -
    -#include <stdio.h>
    -
    -main()
    -{
    -  int i=10, j=15;
    -  float f=12.6;
    -
    -  printf("i=%d\tj=%d\tf=%.1f\n", i, j, f);
    -}
    -
    - -

    Skriv et C-program som leser brukerens alder, og deretter skriver ut hvor gammel brukeren er i antall år, måneder, dager, timer, minutter og sekunder. Du kan anta at brukerens alder alltid er et helt antall år, og at alle år består av 365 dager.

    -
    -#include <stdio.h>
    -
    -main()
    -{
    -  int alder;
    -  printf("Hvor gammel er du (i antall år)? ");
    -  scanf("%d", &alder);
    -  printf("Din alder i: år=%d, måneder=%d, dager=%d, timer=%d, minutter=%d, sekunder=%d\n",
    -	 alder, alder*12, alder*365, alder*365*24, alder*365*24*60, alder*365*24*60*60);
    -}
    -
    - -

    Skriv et C-program som leser tre enkle tegn fra bruker, ikke adskilt med space, og deretter skriver ut alle de seks mulige ulike permutasjonene (omstokkingene) av de tre tegnene.

    -
    -#include <stdio.h>
    -
    -main()
    -{
    -  char c1, c2, c3;
    -  printf("? ");
    -  scanf("%c%c%c", &c1, &c2, &c3);
    -  printf("%c%c%c ", c1, c2, c3);
    -  printf("%c%c%c ", c1, c3, c2);
    -  printf("%c%c%c ", c2, c1, c3);
    -  printf("%c%c%c ", c2, c3, c1);
    -  printf("%c%c%c ", c3, c1, c2);
    -  printf("%c%c%c ", c3, c2, c1);
    -  printf("\n");
    -}
    -
    -
    -
    -
    -
    -
    -
    -

    Oppgave 3: Aritmetiske operatorer

    -

    C inneholder også aritmetiske tilordningsoperatorer som fungerer på samme måte som i Java: +=, -=, *=, /= og %=. Skriv et C-program som leser inn tre heltallsverdier a, b og c, og beregner og skriver ut verdien til a etter hver av de fem operasjonene:

    -

    a+=(b+=c) a-=(b-=c) a*=(b*=c) a/=(b/=c) a%=(b%=c)

    -

    Før hver operasjon skal de tre variablene i utgangspunktet ha samme verdier som ved innlesning.

    -
    -#include <stdio.h>
    - 	
    -main()	
    -{
    -  int A, a, B, b, C, c;
    -  printf("Warning: Certain input values may cause floating point exception\n");
    -  printf("a? b? c? ");
    -  scanf("%d %d %d", &A, &B, &C);
    -  a=A, b=B, c=C;
    -  a+=(b+=c);
    -  printf("a+=(b+=c): a=%d\n", a);
    -
    -  a=A, b=B, c=C;
    -  a-=(b-=c);
    -  printf("a-=(b-=c): a=%d\n", a);
    -
    -  a=A, b=B, c=C;
    -  a*=(b*=c);
    -  printf("a*=(b*=c): a=%d\n", a);
    -
    -  a=A, b=B, c=C;
    -  a/=(b/=c);
    -  printf("a/=(b/=c): a=%d\n", a);
    -
    -  a=A, b=B, c=C;
    -  a%=(b%=c);
    -  printf("a%%=(b%%=c): a=%d\n", a);
    -}
    -
    - -

    Oppgave 4: Seleksjon

    -

    a) Skriv et program som beregner en students karakter. Programmet skal lese prosentvis uttelling (et tall T, der 0≤T≤100) for tre oppgaver, beregne gjennomsnittet G av disse, og skrive ut karakter etter følgende regler:

    -
      -
    • A: G≥95
    • -
    • B: 80≤G<95
    • -
    • C: 60≤G<80
    • -
    • D: 40≤G<60
    • -
    • E: 20≤G<40
    • -
    • F: G<20
    • -
    -
    -#include <stdio.h>
    -
    -main()
    -{
    -  float T_1, T_2, T_3;
    -  float G;
    -  
    -  printf("Skriv 3 prosentvise uttellinger, skilt med mellomrom: ");
    -  scanf("%f %f %f", &T_1, &T_2, &T_3);
    -  G = (T_1 + T_2 + T_3) / 3;
    -       
    -  if ( (G >= 95) && (G <= 100) )
    -    printf("A");
    -  else if ( (G >= 80) && (G < 95) )
    -    printf("B");
    -  else if ( (G >= 60) && (G < 80) ) 
    -    printf("C");
    -  else if ( (G >= 40) && (G < 60) ) 
    -    printf("D");
    -  else if ( (G >= 20) && (G < 40) ) 
    -    printf("E");
    -  else if ( (G < 20) && (G >= 0) )
    -     printf("F");
    -   else
    -     printf("Uhm...");
    -  printf("\n");
    -}
    -
    -
    -
    -
    -
    -

    b) Skriv et C-program som beregner løsningen til andregradsligninger av formen: ax2 + bx + c = 0, a ≠ 0

    -

    Programmet skal lese inn verdiene for a, b og c og deretter beregne verdien: D = b2 - 4ac

    -

    Hvis D<0 har ligningen ingen (reell) løsning, hvis D=0 har ligningen bare én løsning, og hvis D>0 har ligningen to forskjellige løsninger.

    -
    -#include <stdio.h>
    -#include <math.h>
    - 
    -main()
    -{
    -  float a, b, c, D;
    -
    -  printf("a b c ? ");
    -  scanf("%f %f %f", &a, &b, &c);
    -
    -  if (a == 0)
    -    printf("a må være forskjellig fra null\n");
    -  else
    -  {
    -    D = b*b - 4*a*c;
    -    if (D < 0)
    -      printf("Ingen løsning\n");
    -    else if (D == 0)
    -      printf("Løsning: x=%f\n", -b/(2*a));
    -    else
    -      printf("Løsninger: x=%f og x=%f\n",
    -	     (-b - sqrt(D))/(2*a), 
    -	     (-b + sqrt(D))/(2*a)); 
    -  }
    -}
    -
    - -

    Oppgave 5: Iterasjon

    -

    Skriv et C-program som leser et positivt heltall n, og deretter skriver ut et mønster som f.eks. ser slik ut for n=7:

    -
    -
    -*******
    -******
    -*****
    -****
    -***
    -**
    -*
    -
    -
    -#include <stdio.h>
    -#include <stdlib.h>
    -
    -main()
    -{
    -  int n, i, j;
    - 
    -  printf("n? ");
    -  scanf("%d", &n);
    -
    -  if (n <= 0)
    -    exit(1);
    -  
    -  for(i = 0; i < n; i++)
    -  {
    -    for(j = n - i; j > 0; j--)
    -      printf("*");
    -    printf("\n");
    -  }
    -}
    -
    -
    - -

    d) Skriv et program som leser heltall fra bruker inntil det angis et tall som er mindre enn null.

    -
    -#include <stdio.h>
    - 
    -int main()
    -{
    -  int n;
    -  do
    -    {
    -      printf("n? ");            
    -      scanf("%d", &n);
    -    } while (n > 0);
    -}
    -
    -
    -
    -
    -
    -
    -
    -
      -
    • -
        -
      • Forklar kort hvordan et operativsystem på en datamaskin med én enkel CPU (med bare én kjerne) tilsynelatende klarer å kjøre flere prosesser samtidig.
      • -
      • Et OS deler tiden inn i små deler, typisk et hundredels sekund, og fordeler slike korte timeslices til alle prossene som ønsker å bruke CPU. Siden størrelsen på disse timeslicene er så liten, virker det som om flere prosesser kjører samtidig, selvom det til enhver tid kun er en eneste prosess som kjører. Ved hjelp av et interrupt fra en hardwaretimer sørges det for at OS systematisk kan dele ut CPU­tiden på denne måten.
      • -
      -
    • -
    • -
        -
      • Et meget CPU-intensivt C-program som brukes til værvarsling, kan i løpet av en halv time (30 minutter) regne ut værprognosen for neste dag på et Linux-system som har én enkel CPU. Programmet skal kjøres fire (4) ganger med fire forskjellige sett inputdata. De fire kjøringene av programmet startes samtidig. Omtrent hvor lang tid vil det ta før alle de fire værprognosene er ferdige? Begrunn svaret.
      • -
      • Det vil ta omtrent to timer (4 x 30 minutter) å kjøre ferdig de fire kjøringene. Siden prosessene er CPU­intensive, vil de bruke nesten 100% av CPUen når de først kjører, og prosessene vil dermed i praksis måtte bytte på å bruke den ene CPU'en. Når det ikke er noen ventetid på data eller I/O, er det ikke noen tid å tjene inn på å kjøre prosessene samtidig med multitasking.
      • -
      -
    • -
    • -
        -
      • Programmet for værvarsling skrives om slik at det bruker fire tråder. Hver tråd regner ut en værprognose basert på hvert sitt sett med input-data. Omtrent hvor lang tid vil det ta før de fire værprognosene er ferdige, når de kjøres på samme Linux-system som ovenfor? Begrunn svaret
      • -
      • Dette vil i praksis være nesten det samme som å kjøre fire separate prosesser samtidig som i forrige deloppgave. Det vil fortsatt ta ca to timer, fordi de fire trådene må dele på den ene CPUen som er tilgjengelig. En context switch går litt fortere mellom tråder enn mellom prosesser, men dette vil være ubetydelig sammenlignet med den tiden beregningene bruker. Beregningene vil også bruke litt mindre minne, siden trådene kjører felles kode.
      • -
      -
    • -
    • -
        -
      • Tråd-programmet for værvarsling flyttes til et annet Linux-system som har samme hardware som ovenfor, men som har fire identiske enkle CPU’er. Omtrent hvor lang tid bør det nå ta før de fire værprognosene er ferdige? Begrunn svaret.
      • -
      • OS bør nå kjøre de fire trådene uavhengig og samtidig/parallelt på hver sin CPU. Hele beregningen vil da ta omtrent 30 minutter.
      • -
      -
    • -
    • -
        -
      • Meterologene som kjører værvarslingsprogrammet ønsker å se fortløpende hvor stor andel av CPU(ene) og primærminnet som programmet bruker. Hvordan kan de enkelt gjøre dette på et Linux-system?
      • -
      • Ved å kjøre programmet top og følge med på kolonnene %CPU og %MEM.
      • -
      -
    • -
    • -
        -
      • -

        Skriv Linux-kommandoer som utfører følgende:

        -
          -
        1. Sletter filen /tmp/log
        2. -
        3. Gir deg som eier alle rettigheter til filen bare_min.txt , mens ingen andre brukere får noen rettigheter
        4. -
        5. Skriver ut statusinformasjon bare om de prosessene på maskinen der prosessinformasjonen inneholder strengen emacs.
        6. -
        -
      • -
      • -
          -
        1. rm /tmp/log
        2. -
        3. chmod 700 bare_min.txt
        4. -
        5. ps aux | grep emacs
        6. -
        -
      • -
      -
    • -
    • -
        -
      • 2b) Hva utføres av denne kommandolinjen?: maskin=$(hostname); os=$(uname);
      • -
      • Skallvariabelen 'maskin' settes lik Linux­systemets hostname, og skallvariabelen 'os' settes lik navnet på OS'ets kjerne (vanligvis vil dette gi variabelen 'os' verdien "Linux").
      • -
      -
    • -
    • -
        -
      • -

        Følgende Linux-kommandoer blir utført:

        -
        -echo "Kanye West" > data.txt
        -echo "Cashmere Cat" > data.txt
        -cat data.txt | grep Kanye > ny.txt
        -
        -

        Hva inneholder filen ny.txt etter at kommandoene er blitt kjørt? Begrunn svaret

        -
      • -
      • Den andre kommandoen overskriver filen data.txt slik at den ikke lenger inneholder strengen "Kanye", og grep­kommandoen vil returnere null bytes. Filen ny.txt vil derfor være tom etter at kommandoene er blitt kjørt.
      • -
      -
    • -
    • -
        -
      • -

        Hva blir resultatet av at følgende kommandoer blir kjørt? Begrunn svaret

        -
        -mkdir top_secret
        -chmod 000 top_secret
        -cp /etc/passwd top_secret
        -
        -
      • -
      • Dette vil gi en feilmelding. chmod­kommandoen gjør at vi ikke har skrivetilgang til katalogen top_secret, og vi får derfor ikke lov til å kopiere filen passwd fra /etc til top_secret.
      • -
      -
    • -
    • -
        -
      • Hva er "runlevels" på et Linuxsystem?
      • -
      • -
        -
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        lvlNameCommon usage
        0HaltShuts down the system; not used in inittab as it would immediately shut down on initialization.
        1Single-user modeUseful for administrative tasks including unmounting partitions and reinstalling portions of the OS; when used, only root access is available
        2Multi-user modeIn multi-user mode, Linux allows users other than root to log in. In this case, network services are not started so that the user is limited to access via the console only.
        3Multi-user mode with networkingCommonly used mode for servers or systems that do not require graphical interface.
        4Not usedForspecial/undefined purposes
        5Multi-user mode with networking and GUIMost common mode for a Linux workstation.
        6RebootReboots the system; not used in inittab because it would reboot repeatedly
        -
        -
        -

        Runlevels sier hvilket modus serveren kjører i. går fra Runlevel 0­-6, hvor 3 og 5 er mest vanlig i produksjon, 3 er uten grafisk, og 5 er med grafisk. Tjenestene kan konfigurereres til å starte forskjellig i ulike runlevels.

        -
        -
        -
      • -
      -
    • -
    -
    -
    -
    -
    -
      -
    • -
        -
      • Hvorfor er det viktig å partisjonere diskene i et Linuxsystem?
      • -
      • For å sikre at viktige diskområder ikke går fulle og stopper tjenestene på serveren.
      • -
      -
    • -
    • -
        -
      • Hva er forskjellen på protokollene "TCP" og "UDP" i forhold til IPTABLES?
      • -
      • TCP er tilstandsbevarende, så da kan du også teste på om det er en ny pakke, eller om det er en del av en strøm. UDP er tilstandsløs.
      • -
      -
    • -
    • -
        -
      • Forklar kort forskjellen på "Input-kjedet" og "Forward-kjedet" i IPTABLES.
      • -
      • Du kan i Input­kjedet teste på trafikken som går inn til maskinen som IPTABLES kjører på. Dvs begrense eller åpne trafikk til bestemte porter (Alt etter policy). Forward­kjedet dekker trafikk inn og ut på det lokale nettet bak maskinen IPTABLES kjører på. Eks på et lokalt IP­nett bak en router. Skal du f.eks styre trafikken på de lokale maskinene på et lokalnett, så gjør du det i forward­kjedet.
      • -
      -
    • -
    • -
        -
      • -

        Filen /proc/meminfo inneholder oppdatert informasjon om Linux-systemets minnebruk. Her er et eksempel på hvordan et utsnitt av denne filen kan se ut:

        -
        -MemTotal:        8039276 kB
        -MemFree:         3906840 kB
        -Buffers:          410156 kB
        -Cached:          2312828 kB
        -SwapCached:            0 kB
        -Active:          2308000 kB
        -Inactive:        1403820 kB
        -Unevictable:          32 kB
        -Mlocked:              32 kB
        -SwapTotal:       8249340 kB
        -SwapFree:        8249340 kB
        -
        -

        Bruk verktøyene grep, tr og sed til å skrive en Linux-kommando på bare én linje, som henter verdiene for MemTotal og MemFree fra /proc/meminfo og skriver ut:

        -
        -Totalt minne: 8039276 kB 
        -Ledig minne:  3906840 kB 
        -
        - -
      • -
      • grep "MemTotal\|MemFree" /proc/meminfo | tr ­s ' ' ' ' | \ sed ­e 's/MemTotal/Totalt minne/' ­e 's/MemFree/Ledig minne/'
      • -
      -
    • -
    • -
        -
      • -

        Hva utføres av shellprogrammet nedenfor?

        -
        -#!/bin/bash
        -cd $1
        -for f in `ls *.mp3`
        -do
        -   mv $f ~/musikkarkiv/
        -done
        -
        -
      • -
      • Programmet flytter alle filer med filnavn som slutter med ".mp3", fra katalogen angitt som parameter til programmet, til katalogen "musikkarkiv" som ligger under brukers hjemmeområde.
      • -
      -
    • -
    • -
        -
      • Skriv om shellprogrammet i deloppgaven over, slik at det blir mer robust for feil i input.
      • -
      • -

        Ny versjon av programmet som sjekker om antall parametre er riktig og av riktig type:

        -
        -     [ $# ­ne 1 ] && { echo "usage: $0 directory"; exit 1; }
        -     [ ! ­d $1 ] && { echo "$0: $1 is not a directory"; exit 1; }
        -     cd $1
        -     for f in `ls *.mp3`
        -     do
        -        mv $f ~/musikkarkiv/
        -     done
        -
        -

        Man kan også i tillegg sjekke om vi har de nødvendige tilgangsrettigheter til katalogene og filene som brukes i programmet, men siden oppgaven bare angir at programmet skal være "robust for feil i input" er dette ikke nødvendig for å få full uttelling.

        -
      • -
      -
    • -
    • -
        -
      • Forklar hva mappen /etc/skel gjør, og nevn noen gode eksempler på bruk.
      • -
      • /etc/skel brukes som mal for hjemmeområder når nye brukere opprettes. En systemansvarlig kan lage en mal for mappestruktur for alle nye brukere. Eks på bruk: lage gode alias i .bashrc fila for nye brukere. F.eks. sette standard editor til "Pico" e.l. Du kan også f.eks. lage en eksempelnettside i en htmlmappe for hver enkelt bruker.
      • -
      -
    • -
    • -
        -
      • Hvordan ville du gått frem for å opprette 1500 nye brukere i et Linuxsystem?
      • -
      • Laget et script som sendte parametere til adduser kommandoen, f.eks. med parametre som brukernavn, passord, hjemmeområde osv.
      • -
      -
    • -
    -
    -
    -
    -
    -
    -
    -
      -
    • -
        -
      • -

        Brukerne på et Linux-system er vanligvis definert i "passordfilen" /etc/passwd . Starten på denne filen kan se slik ut:

        -
        -root:x:0:0:root:/root:/bin/bash
        -daemon:x:1:1:daemon:/usr/sbin:/bin/sh
        -bin:x:2:2:bin:/bin:/bin/sh
        -nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
        -ftp:x:99:99:Anonymous FTP:/local/it/ftp:/bin/sync
        -snort:x:10004:1005:Snort IDS:/var/log/snort:/bin/false
        -nobody4:x:65534:65534:Nobody:/:/bin/sync
        -mroot:x:0:0:Tcsh Root account:/local/it:/bin/bash
        -studwww:x:24:24:web server daemon:/:/bin/bash
        -snort:x:10044:1005:Snort IDS:/var/log/snort:/bin/false
        -snort:x:10088:1005:Snort IDS:/var/log/snort:/bin/false
        -janh:x:1000:1000:Jan Høiberg:/home/janh:/bin/bash
        -
        -

        Feltene på en linje er skilt med tegnet ':' (kolon). Det første feltet på hver linje inneholder brukernavn, det tredje feltet inneholder numerisk brukerid (UID).

        -

        Skriv et shellprogram som leser /etc/passwd og utfører følgende syv operasjoner:

        -
          -
        1. Skriver ut hvilken maskin (host) scriptet kjøres på og hvilket OS som kjøres.
        2. -
        3. Gir feilmelding og avslutter hvis passordfilen ikke finnes eller ikke kan leses.
        4. -
        5. Skriver ut en lang listing av passordfilens egenskaper (se eksemplet under).
        6. -
        7. Skriver ut antall brukere definert i passordfilen.
        8. -
        9. Skriver ut brukernavn for alle brukere som har UID lik 0 (null).
        10. -
        11. Skriver ut alle brukernavn som forekommer flere ganger.
        12. -
        13. Skriver ut alle UID som forekommer flere ganger.
        14. -
        -

        For filen gitt ovenfor kan programmet gi følgende utskrift:

        -
        -Dette scriptet kjører på ask, operativsystemet er Linux
        -­rw­r­­r­­  1 root root 732 Nov 20 15:02 /etc/passwd
        -Antall brukere: 12
        -root har uid = 0
        -mroot har uid = 0
        -Brukernavn som forekommer flere ganger:
        -       3  snort
        -UID som forekommer flere ganger:
        -       2  0
        -       2  65534
        -
        -

        Noen hint som kan brukes til å løse oppgaven:

        -
          -
        • Deloppgave 2b) ovenfor inneholder noen nyttige kommandoer...
        • -
        • Operasjon nr 5 som programmet skal utføre løses enklest ved å pipe innholdet av passordfilen til en løkke som leser feltene på filen linje for linje.
        • -
        -
      • -
      • -
        -passwd=/etc/passwd
        -# 1. Skriver ut hvilken maskin (host) scriptet kjøres på og hvilket OS som kjøres.
        -echo ­n "Dette scriptet kjører pa $(hostname),"
        -echo "operativsystemet er $(uname)"
        -# 2. Gir feilmelding og avslutter hvis passordfilen ikke finnes eller ikke kan leses.
        -if [ ! ­f $passwd ]
        -then
        -  echo "$0: Passordfilen finnes ikke"
        -  exit 1
        -fi
        -if [ ! ­r $passwd ]
        -then
        -  echo "$0: Passordfilen er ikke lesbar"
        -  exit 1
        -fi
        -# 3. Skriver ut en lang listing av passordfilens egenskaper
        -ls ­l $passwd
        -# 4. Skriver ut antall brukere definert i passordfilen.
        -echo "Antall brukere: $(wc ­l $passwd | cut ­f1 ­d' ')"
        -# 5. Skriver ut brukernavn for alle brukere som har UID lik 0
        -cat $passwd | tr : ' ' |
        -while read user x uid restenavlinjen
        -do
        -  if [ $uid ­eq 0 ]
        -  then
        -    echo "$user har uid = 0"
        -  fi
        -done
        -# 6. Skriver ut alle brukernavn som forekommer flere ganger
        -echo "Brukernavn som forekommer flere ganger:"
        -cat $passwd | cut ­f1 ­d: | sort | uniq ­cd
        -# 7. Skriver ut alle UID som forekommer flere ganger
        -echo "UID som forekommer flere ganger:"
        -cat $passwd | cut ­f3 ­d: | sort ­n | uniq ­cd
        -
        -
      • -
      -
    • -
    -
    -
    -
    -
    -
      -
    • -
        -
      • -

        Følgende C-funksjon er gitt:

        -
        -void min_max(int A[], int n, int min, int max)
        -{
        -  /* 
        -   * Finner minste og største verdi i arrayen A
        -   * som har lengde n. Minste verdi returneres i
        -   * min, største verdi returneres i max.
        -   */
        -  int i;
        -  min = max = A[0];
        -  for (i = 1; i < n; i++)
        -  {    
        -    if (A[i] < min)
        -      min = A[i];
        -    else if (A[i] > max)
        -      max = A[i];
        -  }
        -}
        -
        -
          -
        • a) Denne funksjonen vil ikke fungere slik som beskrevet i kommentarene i koden. Hvorfor?
        • -
        • b) Skriv en ny versjon av funksjonen min_max som fungerer korrekt.
        • -
        • c) Skriv et hovedprogram som fyller en array med tilfeldige tall med verdier større enn 0 og mindre eller lik 100, og deretter tester om funksjonen min_max virker. Programmet skal skrive ut både innholdet av arrayen og resultatet fra min_max
        • -
        -
      • -
      • -
          -
        • a) Parametrene min og max verdioverføres til funksjonen. Dvs. at det opprettes lokale variable som bare får verdien til parameteren som brukes. Alle endringer skjer lokalt og har ingen effekt på variablene som brukes i et kall på funksjonen. For at funksjonen skal virke som beskrevet, må adressene (pekere) til variablene som skal endres overføres i stedet for verdiene.
        • -
        • -

          b)

          -
          -void min_max(int A[], int n, int *min, int *max)
          -{
          -  int i;
          -  *min = *max = A[0];
          -  for (i = 1; i < n; i++)
          -  {    
          -    if (A[i] < *min)
          -      *min = A[i];
          -    else if (A[i] > *max)
          -      *max = A[i];
          -  }
          -}
          -
          -
        • -
        • -

          c)

          -
          -#include <stdio.h>
          -#include <stdlib.h>
          -#define N 10
          -void min_max(int[], int, int *, int *);
          -main() 
          -{
          -  int A[N]; 
          -  int i, min, max; 
          -  for (i = 0; i < N; i++) 
          -    A[i] = rand() % 100 + 1; 
          -  for (i = 0; i < N; i++) 
          -    printf("A[%d] = %d\n", i, A[i]); 
          -  min_max(A, N, &min, &max);
          -  printf("min: %d, max: %d\n", min, max);
          -}
          -
          -
        • -
        -
      • -
      -
    • -
    • -
        -
      • Hva står DocumentRoot for i Apache-sammenheng?
      • -
      • Starten for filområdet til webserveren – der filene som skal publiseres ligger.
      • -
      -
    • -
    • -
        -
      • Du vil passordbeskytte et webområde kalt hemmelig (mappen hemmelig ligger i DocumentRoot). Hvordan kan du gjøre dette med Apache-konfigurering?
      • -
      • -

        Kan settes opp i både en <Directory> seksjon i httpd.conf (angi katalogen som skal være passordbelagt i directory konfig), eller som en .htaccess fil.. Skal du bruke det siste, må AllowOverride AuthConfig være satt i httpd.conf.

        -

        Først setter du opp passordfila: htpasswd ­c /var/www/passord torepeng.

        -

        Skriv deretter passordet inn. Opprett .htaccess med følgende (eller legg det i <Directory /var/www/html/hemmelig>)

        -
        -AuthType Basic
        -AuthName "Hemmelig katalog"
        -AuthBasicProvider file
        -AuthUserFile /var/www/passord
        -Require user torepeng
        -
        -
      • -
      -
    • -
    -
    -
    -
    -
    -
    -
    -
      -
    • -
        -
      • Du vil sperre et bestemt subnett ute fra en bestemt katalogstruktur på webserveren. Hvordan gjør du det?
      • -
      • -
        -<Directory "/var/www/private/public">
        -  Allow from all Deny from
        -  159.39.35.0/24 (angir et helt klasse C subnet)
        -</Directory>
        -
        -
      • -
      -
    • -
    • -
        -
      • -

        Du ser følgende linje i Apache-konfigurasjonen din, hva gjør den?

        - Redirect permanent /studentbedrift http://www.studentbedrift.no -
      • -
      • Oppslag til den lokale url’en på webserven f.eks www.hiof.no/studentbedrift blir redirectet til den nye siden http://www.studentbedrift.no. I tillegg sier webserveren i fra at dette er en permanent redirect (server sender statuskode 301)
      • -
      -
    • -
    • -
        -
      • -

        Beskriv kort hva de forskjellige linjene i følgende direktiv gjør:

        -
        -<VirtualHost *:80>
        -ServerAdmin webmaster@studentbedrift.no 
        -DocumentRoot /var/www/studentbedrift 
        -ServerName www.studentbedrift.no 
        -ErrorLog logs/studentbedrift.no ­error_log 
        -CustomLog logs/studentbedrift.no ­access_log common 
        -</VirtualHost>
        -
        -
      • -
      • Setter opp at virtuell host skal svare på post 80, setter variabel ServerAdmin til webmaster@studentbedrift.no, setter webområdet som skal vise innhold til filstien /var/www/studentbedrift, setter at servernavnet som apache skal svare på til www.studentbedrift.no, oppretter egne logger for den virtuelle hosten til to separate filer. Dette gjør det lett å lete etter feil og analysere besøk til denne hosten.
      • -
      -
    • -
    • -
        -
      • Vi prater ofte om ”default policy” når vi snakker om iptables. Hva menes med dette? Forklar også hva ”accept” og ”drop” betyr i forhold til dette
      • -
      • -
        -
        Default policy:
        -
        Hovedregelen for konfigurasjonen. Skal alle pakker droppes eller aksepteres som standard.
        - -
        Accept:
        -
        Pakker godtas i regelen
        - -
        Drop:
        -
        Pakker slettes i regelen, ingen tilbakemelding gis til avsender av pakken
        -
        -
      • -
      -
    • -
    • -
        -
      • -

        Hva gjør følgende to linjer i et iptables-skript? Forklar parameterne/variablene.

        -
        -IPT ­A FORWARD ­p tcp ­d $INT_NET ­­dport 22 ­j ACCEPT
        -IPT ­t nat ­A PREROUTING ­d $EXT_IP ­p tcp ­­dport 22 ­j DNAT ­­to 192.168.1.3:22
        -
        -
      • -
      • -

        Første linje legger til en regel i iptables som sier at tcp pakker som skal inn til det interne nettet, og som skal til port 22 skal aksepteres.

        -

        Andre linje legger til en regel i iptables som router tcp trafikk mot den eksterne ip og port 22 til den interne ip adressen 192.168.1.3 sin port 22.

        -
      • -
      -
    • -
    • -
        -
      • Du ønsker at alle nye brukere på ditt Linuxsystem skal få VI som standard teksteditor. Du vil også at de skal få en standard nettside med teksten ”Jeg har dessverre ikke oppdatert min nettside...” på adressen www.studentbedrift.no/~brukernavn . Hvordan vil du gjøre dette? Anta at Apache er satt opp til å tillate at brukere kan publisere html-filer i katalogen html­docs på sitt hjemmeområde.
      • -
      • Først legger til en linje med $EDITOR=VI i .bashrc i /etc/skel. Deretter oppretter du mappa html­docs i /etc/skel. Deretter lager du en index.html fil inne i html­docs mappa med innholdet ”Jeg har dess....”
      • -
      -
    • -
    • -
        -
      • Du skal slette en bruker manuelt fra systemet ditt. Hvilke filer trenger du å oppdatere for at all informasjon om brukeren skal bli borte?
      • -
      • Slette linjen med brukerinfo i /etc/passwd, /etc/shadow, /etc/group, /etc/gshadow. Slette hele hjemmeområdet fra /home (om det er satt som hjemmeområde). Deretter slette mail ved å slette filen /var/spool/mail/brukernavn.
      • -
      -
    • -
    • -
        -
      • Du ønsker å lage en mailliste som heter medlemmer@studentbedrift.no. Enkelte av mottagerne har eksterne mailadresser, og noen er interne. Hvordan kan du gjøre dette når du er systemansvarlig for Linuxserveren som administrerer mailserveren studentbedrift.no (anta den kjører Sendmail som mailserver).
      • -
      • Legge til en linje I /etc/aliases på følgende måte: Medlemmer: brukernavn1, brukernavn2, brukernavn3, ekstern@ekstern.com, ekstern2@ekstern.com.
      • -
      -
    • -
    • -
        -
      • Forklar hvordan Spamassassin jobber i forhold til Sendmail, og hvordan den sjekker ut hva som er ”spam” og hva som ikke er ”spam”.
      • -
      • Litt forenklet: Sjekker header og body på mail etter gitte kriterier før det videresendes til lokale brukere. Beregner en score som settes for å beregne om mail er spam eller ikke. Om du setter spam grensen til for eksempel 5, vil mail med score høyere enn 5 få subject omskrevet til SPAM + subject. Du kan selvsagt legge til lokale mailadresser, og gi de minuspoeng, så du hindrer at mail fra direktør med tittel ”Viagratilbud” blir merket som spam.
      • -
      -
    • -
    • -
        -
      • Du administrerer webserveren til din bedrift, og ser i loggene at mange fremdeles etterspør mappen /bilder_2014 (som ble slettet i 2015). Du ønsker i stedet at de skal nå mappen /bilder_2016 . Hvordan gjør du dette, og hva slags statuskode ønsker du at apache skal svare med når brukerne forsøker å slå opp mappa /bilder_2014 ?
      • -
      • - Redirect permanent /bilder_2014 http://www.hostname.no/bilder2016 -

        Permanent gjør at den sender rett statuskode fra APACHE også. Gjøres i httpd.conf.

        -
      • -
      -
    • -
    -
    -
    -
    -
    -
      -
    • -
        -
      • Du vil sette opp to VirtualHosts på din webserver. Det er viktig at e-post til serveradmin blir sendt til forskjellige steder, og det er viktig at hvert nettsted har forskjellige logger. Hvordan kan en slik VirtualHost konfigurasjon se ut?
      • -
      • -

        Sette opp to slike i httpd.conf:

        -
        -<VirtualHost *:80>
        -ServerName www.nyweb.com 
        -ServerAdmin webmaster@nyweb.com 
        -DocumentRoot /var/www/nyweb.com 
        -ErrorLog /var/log/httpd/nyweb.com/error_log 
        -CustomLog /var/log/httpd/nyweb.com/access_log custom 
        -</VirtualHost>
        -
        -<VirtualHost *:80>
        -ServerName www.nyweb2.com 
        -ServerAdmin webmaster@nyweb2.com 
        -DocumentRoot /var/www/nyweb2.com 
        -ErrorLog /var/log/httpd/nyweb2.com/error_log 
        -CustomLog /var/log/httpd/nyweb2.com/access_log custom 
        -</VirtualHost>
        -
        -

        Legg merke til at det er nyweb2 som er satt som navn på den andre virtuelle hosten.

        -
      • -
      -
    • -
    • -
        -
      • Serveren går veldig tregt, og du mistenker at det er noen som prøver å "bryte seg inn" på din webserver. Hvordan kan du sjekke dette litt nærmere?
      • -
      • Gå igjennom logger (/var/log/apache2 eller /var/log/httpd) til apache og se etter mistenkelige kode kjørt mot webserver. Sjekk load på maskinen.
      • -
      -
    • -
    • -
        -
      • Forklar forskjellene på : 1. MUA (Mail User Agent) 2. MTA (Mail Transfer Agent) 3. MDA (Mail Delivery Agent)
      • -
      • -
          -
        1. MUA (Mail User Agent) – Eks Thunderbird, Outlook Express, KMail osv.. dvs en e-postleser
        2. -
        3. MTA (Mail Transfer Agent) – Dvs den tjenesten som overtar etter e-post klieneten, og tar seg av selve sendingen av e-posten. Eks på en MTA er Sendmail, Postfix.
        4. -
        5. MDA (Mail Delivery Agent) – Det er den tjenesten som leverer mailen til den enkeltes mailbox (etter å ha gått igjennom en MTA som Sendmail). Eksempel på MDA er Procmail.
        6. -
        -
      • -
      -
    • -
    • -
        -
      • Hva er sendmail?
      • -
      • -

        Utviklet seg over tid – skrevet av den legendariske Eric Allman. I følge wikipedia den mest brukte MTA.

        -

        I praksis tar sendmail i mot mailen som f.eks. du og jeg sender fra Thunderbird(MUA), og deler den i to deler i katalogen “/var/spool/mqueue”. Sendmail genererer selv en random tekststreng og setter det som navn på fila. Selve innholdet (bodyen) får filendelsen “.df “(datafile), og headeren får filendelsen “.qf ” (queue file). Når mailen blir sendt, vil filene forsvinne fra mailkøen. Dvs – ligger det filer i /var/spool/mailqueue” – ligger det mail som venter på å bli sendt. Når mail blir mottatt av sendmail (fra en annen MTA), legger den mail til (“adder”) i fila /var/spool/mail/brukernavn. Alle brukere har sin egen fil her, som de har tilgang til. Denne fila er det samme som “inbox” i imapfolderen din. Bruker formatet “mbox“.

        -

        Du kan tune forskjellige elementer i Sendmail. Default innstillinger kan endres i “sendmail.mc“. “sendmail.cf” skal IKKE røres. Etter at du har gjort endringer i “sendmail.mc”, restarterter du sendmail på vanlig måte (eks: “/etc/init.d/sendmail restart“) Etter at denne kommandoen er kjørt, bli “sendmail.cf” overskrevet og oppdatert med de tilpasningene du gjorde i “sendmail.mc”. Tips – Ta backup OFTE, og ikke klå for mye hvis du skal få sendmail til å virke. Mange nettleverandører (min ISP tele2.se gjør dette) stenger utgående port 25, slik at ikke alle mulige internettbrukere kan sette opp forskjellige utgaver av MTA’er som går bananas (og brukes til å spamme deg og meg). Derfor må jeg konfigurere min lokale sendmail hjemme til å benytte smtp.tele2.se som min MTA i Sendmail. Eksempler på å bruke din nettleverandør til å sende mail: define(`SMART_HOST’, `smtp.tele2.se’)

        -

        Vil du at sendmail skal kunne ta i mot mail også, er det viktig at du forteller sendmail dette. Default er sendmail konfigurert med at den kun tar i mot mail innen for sitt eget system. Fjerner du referansen til 127.0.0.1, åpner du opp for at den skal ta i mot inkonmende mail. Eksempel: DAEMON_OPTIONS(`Port=smtp, Name=MTA’)dnl. Sendmail kan også konfigureres slik at den sjekker om avsenderdomenet eksisterer (og at den ikke er SPAM/annet).

        -
      • -
      -
    • -
    - -
    -
    Working directory
    -
    Den filkatalogen bruker står i, eller programmet/prosessen er i
    - -
    Standard innenhet og standard utenhet
    -
    stdin: Default kilde (fil) som data leses fra. Stdin er i utgangspunktet tastaturet, eller - egentlig den vicefilen som representerer tastaturet.
    -
    stdout: Default medium (fil) som data skrives til. Stdout er i utgangspunktet skjermen.
    - -
    Filterprogram
    -
    Program som leser tekstlige data linje for linje fra stdin, og skriver tekstlig output linjevis til stdout.
    - -
    Redirigering av I/O.
    -
    Tegnene '<' og '>' brukes til å redefinere hhv. stdin og stdout til å være en fil i stedet for skjermen. - '>>' (append) gjør at utskrift til stdout legges til på slutten av en eksisterende fil.
    - -
    Piping (eller "rørlegging")
    -
    Brukes for interprosesskommunikasjon mellom to filterprogrammer. angis med tegnet '|' mellom navnene på - programmene. Gjør at stdout fra et filter leses som stdin fra neste filter.
    -
    -
    -
    -
    - - \ No newline at end of file diff --git a/dist/_/skole/hio/2017/eksamensark/matte.html b/dist/_/skole/hio/2017/eksamensark/matte.html deleted file mode 100644 index 8aa6efa..0000000 --- a/dist/_/skole/hio/2017/eksamensark/matte.html +++ /dev/null @@ -1,1327 +0,0 @@ - - - - - - - Matte for IT - eksamensark - - - - - -
    -
    -
    -

    Heltall

    -
      -
    • \vec{Z} = \{ ... -2, -1, 0, 1, 2 ... \}.

    • -
    • De naturlige tall \mathbb{N} = \{ 0, 1, 2, 3, ...\}

    • -
    - -

    Divisjon

    -
      -
    • 6i 3 = 2 med 0 i rest

    • -
    • 7i3 = 2 med 1 i rest

    • -
    - -

    Definisjon - delbarhet

    -

    Dersom a og b er heltall med b \ne 0, sier vi at b deler a dersom det finnes et heltall c slik at a = b \cdot c og vi skriver da b \mid a. Da sier vi at b er en faktor i a og at a er et multiplum av b.

    -

    Eksempel 4|20 fordi 20 \div 4 = 5 med 0 i rest. 20 = 4 \cdot 5

    - -

    Teorem

    -

    Gitt a,b,c \in \vec{Z}

    -
      -
    1. dersom c \mid a og c \mid b, så vil også c \mid (a+b)

    2. -
    3. dersom c \mid a vil også c \mid (a \cdot b) for alle b

    4. -
    5. dersom c \mid b og b \mid a, så vil også c \mid a

    6. -
    - -

    Primtall

    -

    Et positivt heltall større enn 1, kalles et primtall dersom de eneste positive faktorene i p, er 1 og p.

    - -

    Faktorisering - skrive som produkt av faktor

    -
      -
    • Eks:
    • -
    • 420 = 2 \cdot 210

    • -
    • 420 = 4 \cdot 105

    • -
    • \underbrace{420 = 2 \cdot 2 \cdot 3 \cdot 5 \cdot 7}_\text{primtallsfaktorisering}

    • -
    - -

    Aritmetikkens fundamentalsteorem

    -

    Ethvert positivt heltall større enn 1 kan skrives entydig som produkt av primtall \rightarrow Goldbachs formodning.

    -

    Ethvert partall større enn 2 kan skrives som summen av to primtall.

    -
      -
    • 4 = 2+2

    • -
    • 6 = 3+3

    • -
    • 8 = 5+3

    • -
    • 10 = 5+5

    • -
    • 12 = 5+7

    • -
    - -

    Divisjonsalgoritme og restklasser

    -
      -
    • 23 \div 3 = 7 \underset{\hookrightarrow \text{kvotient}}{}

    • -
    • 21

    • -
    • 2 \underset{\hookrightarrow \text{rest (skal være positiv)}}{}

    • -
    -

    Kan skrive 23 = 7 \cdot 3 + 2

    - -

    Definisjon - kvotient og rest

    -

    La a være et heltall og b et positivt heltall. Dersom a = qb + r der r = 0, 1, 2, ..., b-1 kalles q kvotienten og r resten når a divideres med b

    - -

    Kongruens

    -
      -
    • \bold{5} \div 5 = 1 med 0 i rest

    • -
    • \bold{10} \div 5 = 2 med 0 i rest

    • -
    • \bold{15} \div 5 = 3 med 0 i rest

    • -
    • \bold{6} \div 5 = 1 med 1 i rest

    • -
    • \bold{11} \div 5 = 2 med 1 i rest

    • -
    • \bold{16} \div 5 = 3 med 1 i rest

    • -
    -

    6, 11 og 16 er kongruente med modulo 5. 11 \equiv 6 \mod 5 fordi 11 \div 5 gir samme rest som 6 \div 5

    -

    Definisjon - kongruens

    -

    La n være et positivt heltall. Dersom a og b er to heltall som gir samme rest ved divisjon med n, så skriver vi a \equiv b \mod n (leses: a er kongruent med b modulus n). Dette innebærer også at n \mid (a-b). Alle heltall som er kongruente med modulo n utgjør en restklasse modulo n.

    -
      -
    • Eks:

    • -
    • 11 \equiv 6 \mod 5

    • -
    • 11 - 6 = 5

    • -
    • Altså: 5 \mid (11-6)

    • -
    -

    Kan brukes for å sjekke om to tall er kongruente

    -
      -
    • Eks:

    • -
    • Er 43 \equiv 7 \mod 4?

    • -
    • 4 \mid (43-7)?

    • -
    • 4 \mid 36 \quad \rightarrow Ja

    • -
    - -

    Fermats lille teorem

    -

    La p være et primtall. Dersom a er et heltall så er a^p \equiv a \mod p

    -
      -
    • p = 3, \quad a= 4

    • -
    • a^p = 4^3 = 64

    • -
    • 64 \equiv 4 \mod 3

    • -
    • (3 \mid (64-4))

    • -
    - -

    Premutasjoner og binomialformelen

    -

    Premutasjon: omordning av elementer

    -
      -
    • Eks: Angi alle premutasjon av a, b, og c

    • -
    • a\ b\ c

    • -
    • a\ c\ b

    • -
    • b\ a\ c

    • -
    • c\ a\ b

    • -
    • c\ b\ a

    • -
    • b\ c\ a

    • -
    -

    Antall permutasjoner av n elementer er n!. Antall permutasjoner av strengen a\ b\ c er følgelig 3! (fordi strengen har 3 elementer). 3! = 3 \cdot 2 \cdot 1 = 6

    -
      -
    • Eks: På hvor mange måter kan 11 drakter fordeles på 11 folk?

    • -
    • 11! = 11 \cdot 10 \cdot 9 \cdot ... \cdot 2 \cdot 1

    • -
    -

    P(n,k) = \underbrace{n(n-1) \cdot ... \cdot (n-k+1)}_\text{k-faktorer} = \dfrac{n!}{(n-k)!}

    -

    Eks: P(7,4) = 7 \cdot 6 \cdot 5 \cdot 4 = \dfrac{7!}{(7-4)!} = \dfrac{7!}{3!} = \dfrac{7 \cdot 6 \cdot 5 \cdot 4 \cdot \ \cancel{3!}}{\cancel{3!}}

    -

    Eks: En frimerkeklubb på 20 personer skal velge et styre bestående av leder, nestleder, sekretør og kasserer. Hvor mange ulike styrer kan man velge blandt? P(20, 4) = \dfrac{20!}{(20-4)!} = ... = 20 \cdot 19 \cdot 18 \cdot 17

    - -

    K - Kombinasjoner

    -

    Rekkefølgen er uten betydning. Eks:

    -
      -
    • Bokstavene a, b, c. 2-kombinasjoner av disse:

    • -
    • ab (samme som ba)

    • -
    • ac
    • -
    • bc
    • -
    -

    Skrives C(3,2) eller mer vanlig \binom{3}{2}

    - -

    Generelt

    -

    C(n,k) = \binom{n}{k} = \dfrac{n!}{(n-k)!k!}

    - -

    Velg k elementer fra en mengde med n elementer

    - - - - - - - - - - - - - - - - - - -
    Ordnet utvalgUordnet utvalg
    Med tilbakelegging

    n^t

    \dfrac{(n+k-1)!}{(n-1)!k!}

    Uten tilbakeleggning

    \underbrace{P(n,k) = \dfrac{n!}{(n-k)!}}_\text{utvalg til styre}

    \underbrace{\binom{n}{t} = C(n,k) = \dfrac{n!}{(n-k)!k!}}_\text{lotto, komite}

    -
    -
    -
    -
    -

    Binomialformelen

    -
      -
    • Eksempel

    • -
    • (x+y)^4 = x^4 + 4x^3y + 6x^2y^2 + 4xy^3 + y^4

    • -
    • Koeffisientene fra hvert ledd kan man finne slik:

    • -
    • Foran: x^4: \binom{4}{0} = \dfrac{4!}{(4-0)!0!} = \dfrac{4!}{4! \cdot 1} = 1

    • -
    • Foran: x^3y^4: \binom{4}{1} = \dfrac{4!}{(4-1)!1!} = \dfrac{4!}{3! \cdot 1} = \dfrac{4 \cdot \cancel{3!}}{\cancel{3!}}= 4

    • -
    • Foran: x^2y^2: \binom{4}{2} = \dfrac{4!}{(4-2)!2!} = \dfrac{4 \cdot 3 \cdot 2 \cdot 1}{2 \cdot 1 \cdot 2 \cdot 1} = 3 \cdot 2 = 6

    • -
    • Foran: xy^3: \binom{4}{3} = \dfrac{4!}{(4-3)!3!} = 4

    • -
    • Foran: y^4: \binom{4}{4} = \dfrac{4!}{(4-4)!4!} = \dfrac{1}{0!} = \dfrac{1}{1} = 1

    • -
    • Generelt: La x og y være variable og n et positivt heltall. Da er

    • -
    • (x+y)^n = \binom{n}{0} \cdot x^n + \binom{n}{1}x^{n-1}y + \binom{n}{2}x^{n-2}y^2 +...+ \binom{n}{n-1}xy^{n-1} + \binom {n}{n}y^n

    • -
    -

    Dirichets skuffeprinsipp

    -
      -
    • Dersom m objekter skal plasseres i n skuffer der m > n, vil det være minst en skuff som inneholder minst to objekter.

    • -
    • Eksempel: Svenske bilskilt

    • -
    • Tre bokstaver og tre siffer (ABC497). Hvor mange biler må det være på en parkeringsplass for at man skal være sikker på at minst to har samme tall på skiltet?

    • -
    • Antall forskjellige tall: 001-999 = 999 tall

    • -
    • Hvis parkeringsplassen inneholder minst 1000 biler, vil minst to biler ha samme tall (sifferkombinasjon) på skiltet

    • -
    -
      -

      Mengder og relasjoner

      -

      Mengdebegrepet

      -
    • Rekkefølgen elementene listet i er uten betydning. Antall ganger et element listes er uten betydning. For å angi at et objekt - er element i en mengde, benyttes symbolet \in

      -
    • -

      Mengdebyggeren

      -
    • Generelt: A = \{ x | P(x) \}

    • -
    • "A" er mengden av alle element x som er slik at P(x) er oppfyllt/sant

    • -
    • S = \{ x | x \equiv 0 (mod 2) \} = \{ ..., -2, 0, 2, 4, ... \}

    • -
    -
      -

      Delmengde

      -
    • A \subseteq A Alle mengder er en delmengde av seg selv

    • -
    • Dersom A \subseteq B og vi ønsker å tydliggjøre at A\ne B, kan vi skrive A \subset B (ekte delmengde)

    • -

      Mengdelikhet

      -
    • Dersom A \subseteq B og samtidig B \subseteq A, så er A = B

    • -

      Kardinalitet

      -
    • For endelige mengder (mengde med endelig antall elementer) er kardinaliteten antall elementer i mengden. Skrives: |A|

    • -
    • Eksempel:\quad A=\{a,b,c\} \ , |A| = 3

    • -

      Potensmengder

      -
    • Potensmengden til en mengde A er mengden av alle delmengder til A. Den betegnes P(A)

    • -
    • Eksempel

      A=\{a,b,c\} \ , P(A)=\{ \phi, \{a\}, \{b\}, \{c\}, \{a,b\}, \{a,c\}, \{b,c\}, \{a,b,c\}\},
    • -
    • |P(A)|=8=2^3, Generelt: Hvis |A|=n, så\ er |P(A)| = 2^n
    • -

      Disjunkte

      -
    • To mengder M og N som ikke har felles elementer, altså der M \cap N = \phi kalles disjunkte.

    • -

      Inklusjons- og eksklusjonsprinsippet

      -
    • Når man skal regne ut |A|+|B| teller man med elementene i A\capB to ganger. Man må derfra trekke fra disse en gang:

    • -
    • |A \cup B| = |A| + |B| - |A \cap B|
    • -
    • Utvidet til 3 mengder:

    • -
    • |A \cup B \cup C| = |A| + |B| +|C| - |A \cap B| - |A \cap C | - | B \cap C | + | A \cap B \cap C |
    • -
    • Kun hva alle mengdene har til felles (snittet):

      |A \cap B \cap C| = |A \cup B \cup C| - |A| - |B| - |C| + |A \cap B| + |A \cap C| + |B \cap C|
    • - -
        -
      • Eksempel

      • -
      • Ved IT-studiet ved en høgskole, var det 67 studenter som tok eksamen i minst ett av fagene matematikk, programmering og databaser. 56 studenter tok eksamen i matematikk, 55 tok eksamen i programmering, mens 53 tok eksamen i databaser. 46 tok eksamen i både matematikk og programmering. Det var like mange som tok eksamen i både matematikk og databaser som dem som tok eksamen i både programmering og databaser. 39 studenter tok eksamen i alle tre fagene. Hvor mange tok eksamen i både matematikk og databaser?

      • -
      • Vi kan kalle mengden av dem som tar eksamen i matematikk for M, mengden av dem som tar eksamen i programmering for P og mengden av dem som tar eksamen i databaser for D. Opplysningene som er gitt i oppgaven kan da uttrykkes slik:

      • -
      • -
          -
        • |M| = 56

        • -
        • |P| = 55

        • -
        • |D| = 53

        • -
        • |M \cap P| = 46

        • -
        • |M \cap D| = |P \cap D|

        • -
        • |M \cap P \cap D| = 39

        • -
        -
      • -
      • Opplysningen om at det totalt var 67 studenter som tok eksamen i minst ett av disse fagene, kan vi uttrykke ved |M \cup P \cup D| = 67. Inklusjons- og eksklusjonsprinsippet sier: | M \cup P \cup D | = | M | + | P | + | D | - | M \cap P | - | M \cap D | - | P \cap D | + | M \cap P \cap D |

      • -
      • Siden | M \cap D| = | P \cap D| kan vi skrive denne som | M \cup P \cup D | = | M | + | P | + | D | - | M \cap P | -2 | M \cap D | + | M \cap P \cap D |

      • -
      • Løser vi så denne med hensyn på | M \cap D | får vi

      • -
      • | M \cap D | = \dfrac{1}{2} (| M + P + D - M \cap P + M \cap P \cap D - M \cup P \cup D |). Setter vi nå inn tall, finner vi | M \cap D | = \dfrac{1}{2} ( 56 + 55 + 53 - 46 - 39 + 67 ) = \dfrac{1}{2} \cdot 90 = \underline{\underline{45}}

      • -
      -
    -
    -
    -
    -
    -
      -

      Kartetiske produkter

      -
    • Ordnet par: et objekt på formen (a,b) hvor a \in A, og b \in B. A og B er mengder. - Mengden av alle ordnede par på denne formen, kalles det kartetiske produktet av A og B, og skrives A x B

    • -
    • Eksempel

    • -
    • A=\{0,1,2\} \ , B=\{3,5\}
    • -
    • A \cdot B=\{ (0,3), (0,5), (1,3), (1,5), (2,3), (2,5) \}
    • -
    • Generelt

      dersom A\neB og a\neb:

    • -
    • (a,b) \ne (b,a) \ og\ A \cdot B \ne B \cdot A
    • -
    • Vi kan ha kartetiske produketer av mengde med seg selv

      A \cdot A = A^2 \ ,\ A \cdot A \cdot A = A^3
    • -
    - -

    Relasjoner

    -
      -
    • Refleksiv (a,a) \in R for alle a \in A

    • -
    • Symmetrisk (a,b) \in R så er (b,a) \in R

    • -
    • Antisymmetrisk Dersom (a,b) \in R og a \ne b, så er (b,a) \notin R

    • -
    • Transitiv Dersom (a,b) \in R og (b,c) \in R så er (a,c) \in R

    • -
    • Viktig: dersom en relasjon er symmetrisk, er det ikke gitt at den er antisymmetrisk.
    • -
    - -

    Ekvivalensrelasjoner

    -
      -
    • Dersom en relasjon på en mengde er:

    • -
    • - refleksiv

    • -
    • - symmetrisk

    • -
    • - transitiv

    • -
    • kalles relasjonen en ekvivalensrelasjon

    • -
    -
      -
    • Ekvivalensklasser

    • -
    • a \equiv b \mod 5

    • -
    • [0] = \{ \dots , -10, -5, 0, 5, 10, 15, \dots \}

    • -
    • [1] = \{ \dots , -9, -4, 1, 6, 11, 16, \dots \}

    • -
    • [2] = \{ \dots , -8, -3, 2, 7, 12, 17, \dots \}

    • -
    • [3] = \{ \dots , -7, -2, 3, 8, 13, 18, \dots \}

    • -
    • [4] = \{ \dots , -6, -1, 4, 9, 14, 19, \dots \}

    • -
    • [5] = [0]

    • -
    • Disse ekvivalensklassene kalles restklasser modulo 5.

    • -
    • Ekvivalensklassene er parvis disjunkte og deler inn domenet i partisjoner

    • -
    - -

    Delvis ordning (partialordning)

    -
      -
    • Dersom en relasjon R på en mengde A er

    • -
    • - refleksiv

    • -
    • - antisymmetrisk

    • -
    • - transitiv

    • -
    • kalles relasjonen en delvis ordning

    • -
    -

    Mengden A med en relasjon R, som er delvis ordrnet, kalles en delvis ordnet mengde, og betegnes (A,R)

    -

    Dersom R er en delvis ordning på A og (x,y) \in R \ (x\ R\ y), så sier vi at x er en forgjenger til y, og y er en etterfølger til x. Vi skriver dette slik x \preceq y. Dersom x \preceq y og x \neq y så kan vi skrive x \prec y

    - -

    Hasse-diagram

    -
    -
    -

    En ikke-rettet graf hvor nodene representerer elementene i den ordnede mengden, og plassering av nodene avgir hva som er forgjenger og etterfølger (forgjenger plasseres nedenfor etterfølger). Umiddel forgjenger til element forbindes med en kant.

    -
      -
    • Eks:

    • -
    • A = \{ 1, 2, 3, 6, 12, 18 \} \quad R = \Bigg\{ (x,y) \Bigg| x \mid y \Bigg\}

    • -
    • R = \Big\{ (1, 1), (1, 2), (1, 3), (1, 62), (1, 12), (1, 18), (2, 2), (2, 6), (2, 12), (2, 18), (3, 3), (3, 6), (3, 12), (3, 18), (6, 6), (6, 12), (6, 18), (12, 12), (18, 18)\Big\}

    • -
    -
    -
    - -

    R som en rettet graf

    -
    -
    -

    Tegn Hasse-diagrammet for (A, R) \rightarrow kun for delvis ordnede mengder. Vi kan her ta utgangspunkt i den rettede grafen, og fjerne ting steg for steg

    -
      -
    1. Fjerner først refleksive kanter (piler fra et element til seg selv)

    2. -
    3. Vi vet at relasjonen er transitiv (fordi det er en delvis ordning). Vi kan derfor fjerne de kanter som vi vet må være der fordi R er transitiv.

    4. -
    5. Ordne nodene slik at alle piler peker oppover

    6. -
    7. Pilenes retning gir nå ikke lenger noe informajson, og retningene på pilene fjernes.

    8. -
    -
      -
    • 1

    • -
    • 2

    • -
    • 3

    • -
    • 4

    • -
    -
    -
    - - -

    Hasse-diagrammet gir samme informasjon som den rettede grafen. Vi ser f.eks at 1 er forgjenger til alle andre elementer, men 1 er umidelbar forgjenger til 2 og 3. 1 kalles det minimale elementet. 12 og 18 er maksimale elementer.

    -
    -
    - - -
    -
    - -

    Totalordning

    -

    Begrepet delvis ordning brukes fordi ikke alle elementene nødvendigvis har relasjon. F.eks er 2 og 3 i eksempelet usammenlignbare, dvs. vi har verken 2 \preceq 3 eller 3 \preceq 2. (hverken (2,3) eller (3,2) er element i relasjonsmengden.

    -

    En delvis ordning hvor alle par er sammenlignbare, kalles en totalordning.

    -

    Eksempler på totalordning

    -
      -
    1. \preceq\mathbb{Z} (har tidligere set på at dette er en delvis ordning). To tall kan alltid sammenlignes

    2. -
    3. Ordningen av ord i en ordbok

    4. -
    -
    -
    -
    -
    -
    -
    -

    Diskrete funksjoner

    -

    En funksjon. Et tall inn gir et tall ut, og alltid samme. Et element i A har relasjon til et element i B -> en funksjon er et spesialtilfelle av en relasjon.

    -

    En funksjon f fra mengden A til mengden B er en relasjon hvor hvert element i A har relasjon til ett element i B.

    -

    Vi skriver da: f: A \rightarrow B \bigg| \binom{\text{A kalles definisjonsmengden (eller domenet.)}}{\text{B kalles kodomenet til f}}

    -

    Dvs. for hver a \in A en så er det nøyaktig ett par (a,b) hvor b \in B. A og B kan være samme mengde

    -

    To krav for at en relasjon skal være en funksjon

    -
      -
    1. Alle elementer i definisjonsmengden A har relasjon.

    2. -
    3. Relasjonene fra et element i A går til nøyaktig ett element iB

    4. -
    -

    Gitt en funksjon f: A \rightarrow B. Da kalles A domenet (eller definisjonsmengden) til f og B kalles kodomenet til f. Dersom (a,b) \ in f kan vi skrive b = f(a) og vi sier at b er bildet av a under f. Vi kan også si at b er funksjonsverdien til a. Mengden av alle bilder kalles funksjonens verdimengde.

    -

    Merk at I) To elementer i domene kan ha samme bilde i kodomenet. II) Ikke alle elementer i kodomenet trenger å være bilde til et element i domenet.

    - -

    Injektive og surjektive funksjoner

    -

    Gitt en funkson f: A \rightarrow B. Dersom ulike elementer i A har ulike bilder i B, sier vi at f er injektiv (èn-entydig). Dvs. at hvert element i A går til et og bare et element i B.

    -

    En funksjon kalles surjektiv hvis og bare hvis for hvert element b \in B så finnes det et element a \in A med b = f(a).. Altså injektiv krever at forhold er kun en-til-en, mens surjektiv krever at alle elementer skal ha et forhold, men bryr seg ikke om det er en-til-en.

    -

    Bijektiv er når en funksjon er både injektiv og surjektiv. Dette er når alle elementer har et forhold, og det er kun en-til-en. Det er ingen elementer som har forhold til f.eks 2 elementer, og det er ingen elementer som ikke har noe forhold.

    - -

    Inverse relasjoner

    -

    Gitt en relasjon fra A til B. Den inverse relasjonen R^{-1} = \Big\{ (b,a) \Big| (a,b) \in R \Big\}

    -

    Eks: A = \{ a, b \} \quad B = \{ 1, 2 \} \quad R = \{ (a,1),(a,2),(b,1) \} \quad R^{-1} = \{ (1,a),(2,a),(1,b) \}

    - -

    Inverse funksjoner

    -

    Gitt en funksjon f: A \rightarrow B siden f er en relasjon, kan vi alltid finne den inverse relasjonen. Hvis denne inverse relasjonen er en funksjon sier vi at f er en inverterbar funksjon og vi kaller den inversje relasjonen f^{-1} for den inverse funksjonen til f \qquadf^{-1} B \rightarrow A \qquad (f^{-1} er en funksjon fra B til A)

    -

    a (element i A) er bilde av b (element i B) under f^{-1}. f^{-1} opphever "virkningen" av f.

    -

    For at en funksjon skal være inverterbar, må den være binjektiv.

    -

    Sammensatte funksjoner

    -

    Eksempel f: Z \rightarrow Z gitt ved f(x)=x^2

    -

    g: Z \rightarrow Z gitt ved g(x)=4x+3

    -

    Da er g \circ f = g(f(x)) = 4 \cdot x^2 +3

    -

    f(1) = 1^2 = 1, g(1) = 4 \cdot 1 + 3 = 7

    -

    Resultet i f(1) (=1) er 1-tallet man putter inn i G(1)

    -

    (g \circ f)(1)=4 \cdot 1^2 +3 = 7

    -

    (f \circ g)(x) = f(g(x))= (4x+3)^2 = 16x^2+4x+9

    -

    Følger og summetegn

    -

    a_1+a_2+a_3+...+a_n = \displaystyle\sum_{i=1}^n a_i

    -

    Leses: summen av a_i fra i=1 til n

    -

    Gjennomsnitt av a_1, a_2,..., a_n: \dfrac{a_1+a_2+... +a_n}{n} = \dfrac{1}{n} \displaystyle\sum_{i=1}^n a_1

    -

    Eks 4^2+5^2+6^2+7^2+8^2= \displaystyle\sum_{i=4}^8 i^2 Eks\displaystyle\sum_{i=0}^{n-1} k^i = k^0 + k^1 + k^2 + ... + k^{n-1}

    -

    Regler: 1. \displaystyle\sum_{i=1}^n (a_i+b_i) = \displaystyle\sum_{i=1}^n a_i + \displaystyle\sum_{i=1}^n b_i 2. \displaystyle\sum_{i=1}^n ka_i = k \displaystyle\sum_{i=1}^n a_i

    - -

    Utsagnslogikk

    -

    Utsagn: en setning som er enten sann (S) eller falsk (F). S eller F er utsagnets sannhetsverdi.

    -

    Eks. "Oslo er hovedstaden i Norge": Ja (S). "Oslo er hovedstaden i Sverige": Ja (F).

    -

    "30 er lang tid": Nei, ikke et utsagn. "Gå ut og lek": Nei, ikke et utsagn.

    -

    Konnektiver: sette sammen utsagn til nye utsagn.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    ikke p

    \neg p

    negasjon

    p og q

    p \wedge q

    konjunksjon

    p eller q

    p \vee q

    disjunksjon (veljunksjon)

    p eksklusiv eller

    p \oplus q

    Hvis p så q

    p \to q

    implikasjon

    p hvis og bare hvis q

    p \leftrightarrow q

    ekvivalens

    -

    Eks. p: det er søndag. q: polet er stengt

    -

    \neg p: det er ikke søndag

    -

    p \wedge q: det er søndag og polet er stengt

    -

    p \to q: hvis det er søndag så er polet stengt

    -

    Eksamen eks?

    -
    -
    -
    -
    -

    Sannhetstabeller

    -
    -
    -

    Konjunksjon, og

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    p

    q

    p \wedge q

    S

    S

    S

    S

    F

    F

    F

    S

    F

    F

    F

    F

    -
    -
    -

    Disjunksjon, eller

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    p

    q

    p \vee q

    S

    S

    S

    S

    F

    S

    F

    S

    S

    F

    F

    F

    -
    -
    -

    Eksklusiv eller

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    p

    q

    p \oplus q

    S

    S

    F

    S

    F

    S

    F

    S

    S

    F

    F

    F

    -
    -
    -

    Implikasjon, hvis-så

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    p

    q

    p \to q

    S

    S

    S

    S

    F

    F

    F

    S

    S

    F

    F

    S

    -
    -
    -

    Ekvivalens, hvis og bare hvis

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    p

    q

    p \leftrightarrow q

    S

    S

    S

    S

    F

    F

    F

    S

    F

    F

    F

    S

    -
    -
    -
    -
    -

    Logisk ekvivalens

    -

    To sammensatte logiske utsagn kalles logisk ekvivalente dersom de har samme sannhetsverdi for enhver kombinasjon av sannhetsverdiene til de atomære utsagnene. (Har samme "høyrekolonne" i sannhetstabellene). Angis med \Leftrightarrow , \equiv

    -
    -
    -

    Tautologi

    -

    Et utsagn som alltid er sant, uavhengig av hva sannhetsverdien til de enkele delene er. Kan vise at et uttrykk er en tautologi enten ved sannhetstabeller eller ved lovene for logisk uttrykk (utrykket blir ekvivalent med S).

    -
    -
    -
    -

    Slutningsregler

    -

    (Regler for gyldige slutninger) \therefore = følgelig, derfor, ergo

    -
    -
    -
    -

    1. Modus ponens. Hvis p er sann, og hvis p medfører q, så kan vi slutte at q er sann.

    -

    - \begin{matrix} - p \qquad \\ - \dfrac{p \to q}{ \therefore q \qquad} - \end{matrix} -

    -
    -
    -

    Eks p: det er søndag. q: polet er stengt

    -

    Det er søndag (p) og det er slik at Hvis det er søndag så er polet stengt (p \to q), kan vi slutte at Polet er stengt (q)

    -
    -

    Hvis q garantert skal være sann, må både utsagnet p være sant og utsagnet p \to q være sant. Merk at: -p og q kan være sammensatte utsagn. -man kan også skrive regelen slik:

    -

    - \begin{matrix} - p \to q \\ - \dfrac{p \qquad}{ \therefore q \qquad} - \end{matrix} -

    -
    -
    -
    -
    -
    -

    2. Modus tollens

    -

    Vanlig: - \begin{matrix} - p \to q \\ - \dfrac{\neg q \qquad}{ \therefore p \qquad} - \end{matrix} -

    -

    Alternativt: - \begin{matrix} - \neg q \qquad \\ - \dfrac{p \to q}{ \therefore p \qquad} - \end{matrix} -

    -
    -
    -

    Eks p: det er søndag. q: polet er stengt

    -

    Hvis det er søndag, så er polet stengt (p \to q)

    -

    \dfrac{\text{Polet er åpent } (\neg q) \qquad}{\therefore \text{ Det er ikke søndag } (\neg p)}

    -
    -
    -
    -
    -

    Sylloismeloven

    -

    - \begin{matrix} - p \to q \\ - \dfrac{q \to r}{ \therefore p \to r} - \end{matrix} -

    -
    -
    -

    Eks p: det er søndag. q: polet er stengt. r: alarmen er på

    -

    Hvis det er søndag, så er alarmen på (p \to r)

    -

    \dfrac{\text{Hvis polet er stengt, så er alarmen på } (q \to r)}{\therefore \text{ Hvis det er søndag, så er alarmen på } (p \to r)}

    -
    -
    -
    -
    -

    Ugyldige argumenter/slutninger

    -

    Eks p: jeg er tørst. q: jeg drikker vann

    -

    Hvis jeg er tørst, så drikker jeg vann (p \to q)

    -

    \dfrac{ \text{Jeg drikker vann } (q) }{ \therefore \text{Jeg er tørst } (p) }

    -
    -
    -

    Eks2

    -

    Hvis jeg er tørst, så drikker jeg vann (p \to q)

    -

    \dfrac{ \text{Jeg er ikke tørst } (\neg q) }{ \therefore \text{Jeg drikker ikke vann } (\neg p) }

    -
    -
    -

    Bevis

    -

    Direkte bevis anta at p er sann, og vis at da følger q

    -

    Påstand: summen av et partall og et oddetall, er et oddetall. p: n er et partall. q: m et oddetall.

    -

    Anta nå at n er et partall og m er et oddetall. Vi skal da vise at n + m er et oddetall. Dersom n er et partall, kan det skrives som n = 2a, a \in Z

    -

    Dersom m er et oddetall, kan det skrives som m = 2b + 1, b \in Z. Da er m+n = 2a + 2b + 1 = 2(a+b)+1 Siden a og b er heltall, er også a + b et heltall. Følgelig er 2(a + b) et partall (siden et heltall ganger 2 er et partall). Et partall + 1 er et oddetall. Følgelig er (a + b) + 1 et oddetall. Siden (a + b) + 1 er lik n + m, er også n + m et oddetall, og det var jo nettopp det vi skulle bevise. qed.

    -

    Kontrapositivt bevis p \to q \Leftrightarrow \neg q \to \neg p. Antar at q er falsk (dvs at \neg q er sann) og vis at det medfører at p er falsk (dvs at \neg p) er sann.

    -

    Påstand: n^2-6n+5 er et partall, så er n et oddetall.

    -

    Det kontrapositive er: Dersom n er et partall så er n^2-6n+5 et oddetall. Dersom n er et partall, kan det skrives slik: n=2a, hvor a er et heltall. Da har vi at n^2-6n+5=(2a)^2 -6 \cdot 2a + 5 = 4a^2 - 12a + 5 = 4a^2-12a+4+1=2(2a^2-6a+2)+1

    -

    Siden a er et heltall, er utrykket i parantesen et heltall. Et heltall ganger 2 er et partall, og 2(2a^2-6a+2) er derfor et partall. Et partall pluss 1 er et oddetall. Uttrykket er derfor et oddetall. QED.

    -

    Bevis ved selvmotsigelse Hvis vi skal bevise p, anta at \neg p er sann og vis at dette fører til en selvmotsigelse

    -

    Eks Bevis at \sqrt{2} er et irrasjonalt tall. Et rasjonalt tall er et tall som kan skrives som en brøk av heltall. Et irrasjonalt tall kan ikke skrives som en brøk av heltall. p: \sqrt{2} er et irrasjonalt tall. Anta at \neg p: \sqrt{2} er et rasjonalt tall

    -

    Da kan man skrive \sqrt{2} = \dfrac{m}{n}, m,n \in Z. Anta nå at \dfrac{m}{n} er skrevet på redusert form (uten felles faktorer). Vi har da \sqrt{2}=\dfrac{m}{n} Vi kvadrerer begge sider: (\sqrt{2})^2=(\dfrac{m}{n})^2 \to 2 = \dfrac{m^2}{n^2}. Ganger begge sider med n^2: 2n^2=\dfrac{m}{n} \cdot n^2. Siden n er et heltall, er n^2 et heltall. 2n^2 er følgelig et partall.

    -

    Siden 2n^2=m^2 (*) er også m^2 et partall. Sist beviste vi at dersom a^2er et partall, er også a et partall. Siden m^2 er et partall, så er også m et partall. Vi kan derfor skrive m = 2p, p \in Z. Setter vi dette inn i (*) får vi: 2n^2=(2p)^2 = 4p^2 Deler med 2 på begge sider: n^2=2p^2. Siden p er et heltall er p^2 et heltall, og 2p^2 er følgelig et partall. Da er også n^2 et partall (fordi den er lik 2p^2). Da er også n et partall.

    -

    Vi har altså vist at både n og m er partall. Dette innebærer at m og n har en felles faktor, nemlig 2. Dette strider mot forutsetningene, og viser at \neg p er falsk. Følgelig må p være sann. qed.

    -
    -
    -
    -
    -

    Predikatlogikk

    -

    Eks predikat: P(x): x er et heltall som oppfyller x^2 = x(Denne er sann for x=0 og x=1. For alle andre x er den falsk)

    -

    For å uttrykke dette bruker vi kvantorer: \forall: allkvantor. Leses "for alle". \exists: eksistenskvantor. "det finnes". Benytter mman en kvantor på et predikat, får man et utsagn.

    -

    Eks P(x): x er et heltall som oppfyller x^2=x.

    -

    \forall x P(x): "for alle x er x^2=x" "for alle x er P(x) sann." \to falskt

    -

    \exists x P(x): "det finnes (minst) én x slik at x^2=x" \to Sant

    -

    Eks R(b): bil b er rød

    -

    \forall b R(b): "alle biler er røde". \exists b R(b): "det finnest (minst) en bil som er rød"

    -

    Generelt \neg \exists x P(x) \Leftrightarrow \forall x \neg P(x)

    -

    Eks P(x): sensor x er snill

    -

    \neg \exists x P(x): Det finnes ikke en sensor som er snill. \forall x \neg P(x): Alle sensorer er ikke snille

    -

    Tilsvarende \neg \forall x P(x) \Leftrightarrow \exists x \neg P(x)

    -

    Eks P(x): sensor x er snill

    -

    \neg \forall x P(x): ikke alle sensorer er snille. \exists x \neg P(x): det finnes minst en sensor som ikke er snill

    -

    \exists er knyttet til \wedge. \forall er knyttet til \to

    -

    Domene: Når vi sier \forall x eller \exists x, så refererer vi til et domene, D, hvor vi henter x fra (universet)

    -

    Logiske porter

    -

    Og, and

    -

    Eller, or

    -

    Matematisk induksjon

    -

    Vi kan bevise at predikatet P(n) gjelder for alle n (n er et heltall) på følgende måte: 1. Basistrinnet

    -

    1. Basistrinnet: Vis at P(n) gjelder for den laveste verdien av n i domenet.

    -

    2. Induksjonstrinnet: Anta at P(n) gjelder for en vilkårlig verdi n=k (induksjonshypotesen), og hvis at dette medfører at predikatet - gjelder for neste n, nemlig n=k+1. Hvis deretter at VS = HS.

    -
      -
    • Bruk induksjonsbevis til å vise at følgende gjelder for alle n \in Z^+ = \{ 1, 2, 3, \dots \}:

    • -
    • \dfrac{1}{1 \cdot 2} + \dfrac{1}{2 \cdot 3} + \dots + \dfrac{1}{n \cdot (n+1)} = \dfrac{n}{n+1}

    • -
    • Basistrinn n = 1: Venstre side: \dfrac{1}{1 \cdot 2} = \dfrac{1}{2}. Høyre side: \dfrac{1}{1+1} = \dfrac{1}{2}

    • -
    • Vi ser at høyre side er lik venstre side for n = 1. Følgelig er basistrinnet OK.

    • -
    • Induksjonstrinn: vi antar at utrykket gjelder for n = k (dette kalles induksjonshypotesen), altså at \dfrac{1}{1 \cdot 2} + \dfrac{1}{2 \cdot 3} + \dots + \dfrac{1}{k \cdot (k+1)} = \dfrac{k}{k+1}

    • -
    • og skal vise at det da følger at uttrykket gjelder for n = k + 1. For n = k + 1 blir utrykket \dfrac{1}{1 \cdot 2} + \dfrac{1}{2 \cdot 3} + \dots + \dfrac{1}{k \cdot (k+1)} + \dfrac{1}{(k+1) \cdot ((k+1)+1)} = \dfrac{k+1}{(k+1)+1}

    • -
    • De første k leddene på venstre side kan vi, basert på induksjonshypotesen, skrive som \dfrac{k}{k+1}. Utrykket blir derfor \dfrac{k}{k+1} + \dfrac{1}{(k+1)} \cdot ((k+1)+1) = \dfrac{k+1}{(k+1)+1}

    • -
    • Vi kan skrive (k + 1) + 1 som k + 2. Uttrykket blir da \dfrac{k}{k+1} + \dfrac{1}{(k+1)\cdot(k+2)} = \dfrac{k+1}{k+2}

    • -
    • Det som gjenstår nå er å vise at venstre side er lik høyre side. Vi ganger så dette uttrykket med (k + 1)(k + 2) for å få bort nevnerne: \dfrac{k}{k+1} \cdot (k+1)\cdot(k+2) + \dfrac{1}{(k+1)\cdot(k+2)} \cdot (k+1)\cdot(k+2) = \dfrac{k+1}{k+2} \cdot (k+1)\cdot(k+2)

    • -
    • Vi kan så forkorte like faktorer og får k \cdot (k+2)+1=(k+1)\cdot (k+1). Regner vi videre på høyre side og venstre side hver for seg, får vi k^2 + 2k + 1 = k^2 + 2k +1. Vi ser at venstre side er lik høyre side, og vi har derfor vist at dersom uttrykket gjelder for n = k så gjelder det også for n = k + 1. Siden vi også har vist at det gjelder for n = 1, betyr det at vi har vist at det gjelder for alle n.

    • -
    - -

    Rekursiv definisjon

    -

    Eks Lag en rekursiv definisjon basert på en direkte funksjon.

    -

    a_n = n(n+1), for\ n \geq 1

    -

    a_1 = 1(1+1) = 2

    -

    a_2 = 2(2+1) = 6

    -

    a_3 = 3(3+1) = 12

    -

    Rekursiv definisjon: 1) Basis a_1 = 2

    -

    2) Rekusjonsformel: a_n=n(n+1), a_{n-1} = (n-1)(n-1+1) = (n-1)n. Forsøker med å subtrahere a_{n-1} fra a_n:

    -

    a_n - a_{n-1} = n(n+1)-(n-1) | - a_n = an_1 + n^2 + n - n^2 + n = an_1 + 2n

    -

    Rekursiv definisjon nr 2

    -

    Rekursive funksjoner hvor y_n er definert ved både y_{n-1} og y_{n-2}. I disse - tilfellene må basis bestå av både y_0 og y_1.

    -
    -
    -
    -
    -
    -
    -

    Differensligninger

    -

    Lineære, homogene differensligninger med konstante koeffisienter

    -

    1. ordens ligning

    -
      -
    • Anta at løsningen er på formen y_n = A \lambda^n, hvor \lambda er et tall og A er et tall.

    • -
    • \lambda finner man slik: a \lambda + b = 0 \ , \lambda = \dfrac{-b}{a}
    • -
    • Eksempel

    • -
    • 4y_n - 5y_{n-1} = 0
    • -
    • a=4, b=5
    • -
    • \lambda = \dfrac{-5}{4} = 1,2
    • -
    • Løsning y_n = A \cdot 1,2^n (Konstanten A finner man dersom man har en startbetingelse)

    • -
    • y_0=50 \ , \ (n=0)
    • -
    • A \cdot 1,2^0 = 50 \ , \ A=50
    • -
    • y_n=50 \cdot 1,2^n
    • -
    • Ofte løser vi ligningen på følgende måte: Erstatt y_n med \lambda , og \ y_{n-1} med \lambda^0 (=1)

    • -
    • Eksempel 4y_n -5y_{n-1} = 0
    • -
    • 4 \lambda - 5 = 0 \ , \lambda = \dfrac{5}{4}
    • -
    -
      -

      2. ordens ligninger

      -
    • Generell 2. ordens ligning: ay_n + by_{n-1} + cy_{n-2} = 0

    • -
    • Karakteristisk ligning: a \lambda^2 + b \lambda + c = 0 Finner lambda ved hjelp av abc-formelen:

    • -
    • Karakteristisk rot: \lambda = \dfrac{-b \pm \sqrt{b^2 - 4ac}}{2a}

    • -
    • 3 tilfeller:
    • -
    • 1. To reelle verdier for \lambda, \lambda_1 og \lambda_2. Da er løsningen av differensligningen

    • -
    • y_n = A \lambda_1^n + B \lambda_2^n
    • -
    • 2. En reell rot, \lambda. Løsning:

    • -
    • y_n = A \lambda^n + Bn \lambda^n
    • -
    • 3. To komplekse røtter \lambda_1 og \lambda_2.\ \lambda_1 = \overline{\lambda_2} = re^{i \varphi} Løsning:

    • -
    • y_n = r^n(Acos(n \varphi) + Bsin(n \varphi)), \ (r = \sqrt{a^2 + b^2}), \ (\varphi = \arccos \dfrac{a}{r})
    • -
    • (Se komplekse tall)

    • -
    • I alle tre tilfellene er A og B ukjente konstanter som kan bestemmes desom vi kjenner startverdiene (y_0 og y_1)

    • -

      Eksempler fra eksamen

      -
    • Generell løsning: løsning som inneholder ukjente konstanter.

    • -
    • Partikulær løsning: en løsning uten ukjente konstanter.

    • -
    -
      -

      Linære inhomogene differensligninger med konstante koeffisienter

      -
    • Inhomogen ligning:

      ay_n + by_{n-1} + cy_{n-2} = F_n
    • -
    • Løsningen av denne er løsningen av den tilhørende homogene ligningen (THL), y_n^{(h)} pluss en partikulær løsning av den inhomogene ligningen, y_n^{(p)}

    • -
    • y_n = y_n^{(h)} + y_n^{(p)}
    • -
    • THL: ay_n + by_{n-1} + cy_{n-2} = 0
    • -
    • En partikulær løsning av den inhomogene ligningen finner vi ved å anta at den er på samme form som høyresiden, Fn, men med ubestemte konstanter. Sett dette uttrykket inn i differensligningen og bestem på den måten konstantene.

    • -

      Hovedregler

      -
    • 1. Dersom Fn er en konstant, bruk y_n^{(p)}=K

    • -
    • 2. Dersom Fn er et polynom av grad r, F_n = c_rn^r + c_{r-1}n^{r-1} + ... + c_1n + c_0, hvor c-ene er tall, bruk: y_n^{(p)} = K_rn^r + K_{r-1}n^{r-1} + ... + K_1n + K_0. Merk at man må ha med alle ledd selv om noen av c-ene er 0.

    • -
    • 3. Dersom F_n = C \cdot \alpha^n (F.eks. F_n = 3 \cdot 2^n). Bruk y_n^{(p)}=K \cdot \alpha^n. (Altså y_n^{(p)}=K \cdot 2^n)

    • -
    • 4. Dersom F_n = c_rn^r \alpha^n + c_{r-1}n^{r-1} \alpha^n + ... + c_1n \alpha^n + c_0 \alpha^n. Bruk

    • -
    • y_n{(p)} = (K_rn^r + K_{r-1}n^{r-1} +...+ K_0) \alpha^n. Også her må man ha med alle leddene selv om noen av c-ene er 0.

    • -
    • Ekstraregel: Dersom løsningen ikke funker, gang med n og prøv igjen. Dette skjer når den partikulære løsningen vi normalt sett ville forsøkt oss med, allerede finnes i løsningen av THL, y_n^{(p)}
    • -

      Eksempel fra eksamen

      -
    -
    -
    -
    -
    -

    Matriser

    -

    Koeffisientmatrise

    -
      -
    • $$ - \begin{matrix} - 3x_1 & + & 4x_2 & = & 2 \\ - 5x_1 & + & 2x_2 & = & 1 \\ - \end{matrix} - \qquad$$ dette ligningssystemet sin koeff.mat. ser slik ut: $$ - \begin{bmatrix} - 3 & 4 \\ - 5 & 2 - \end{bmatrix} - $$

    • -
    -

    Totalmatrise

    -
      -
    • $$ - \left[\begin{array}{cc|c} - 3 & 4 & 2 \\ - 5 & 2 & 2 - \end{array}\right] - - \sim - \left[\begin{array}{cc|c} - 1 & 6 & 3 \\ - 5 & 2 & 2 - \end{array}\right] - \begin{matrix} - R^1_1 = 2R_1 - R_2 \\ - \quad - \end{matrix} - - \sim - \left[\begin{array}{cc|c} - 1 & 6 & 3 \\ - 0 & -28 & -14 - \end{array}\right] - \begin{matrix} - \quad \\ - R^1_2 = R_2 - 5R_1 - \end{matrix} - $$

      $$ - \sim - \left[\begin{array}{cc|c} - 1 & 6 & 3 \\ - 0 & -28 & -14 - \end{array}\right] - \begin{matrix} - \quad \\ - R^1_2 = R_2 - 5R_1 - \end{matrix} - - \sim - \left[\begin{array}{cc|c} - 1 & 6 & 3 \\ - 0 & -1 & \dfrac{1}{2} - \end{array}\right] - \begin{matrix} - \quad \\ - R^1_2 = - \dfrac{1}{28R_2} - \end{matrix} - $$

      $$ - \sim - \left[\begin{array}{cc|c} - 1 & 0 & 0 \\ - 0 & -1 & \dfrac{1}{2} - \end{array}\right] - \begin{matrix} - R^1_2 = - R_1 - 6R_2 \\ - \quad - \end{matrix} - - \qquad\qquad \underline{\underline{x_1 = 0, \quad x_2 = \dfrac{1}{2}}} - $$

    • -
    - -

    Metodikk for gauss-jordaneliminasjon

    -
      -
    • Sørg underveis for at matrisen har trappeform ved å bytte om rekker etter behov

    • -
    • 1) Produser en 1-er øverst til venstre

    • -
    • 2) Produser 0-er under 1-eren i 1. kolonne

    • -
    • 3) Produser en 1-er i 2.rekke, 2. kolonne

    • -
    • 4) Produser 0-er under 1-eren du fikk i trinnet over

    • -
    • 5) Fortsett å produsere 1-ere som første element i hver rekke og 0-er under 1-erne

    • -
    • 6) Når du er ferdig med siste rekke, produserer du 0-er i hver kolonne over hver 1-er. Begynn nedenfra og gå oppover. Når du er ferdig vil matrisen være på redusert trappeform

    • -
    -

    Inkonsistente ligningssystemer:

    -

    ligningssystemer som ikke har noen løsning. Har intet skjæringspunkt, og altså ingen løsning.(Linjene/ligningene er parallelle)

    -

    $$ - \begin{bmatrix} - 3 & -4 & 5 \\ - -6 & 8 & 10 - \end{bmatrix} - - \sim - \left[\begin{array}{cc|c} - 3 & -4 & 5 \\ - 0 & 0 & 20 - \end{array}\right] - \begin{matrix} - \quad \\ - R^1_2 = R_2 + 2R_1 - \end{matrix} - $$

    -

    0 = 20 \rightarrow inkosistent ligningssystem. Ingen løsning

    - -

    Ligningssystemer med uendelig mange løsninger

    -

    Linjene/ligningene overlapper, og alle punkter på linjen er løsning av ligningssystemet

    -

    $$ - \left[\begin{array}{cc|c} - 2 & 2 & 4 \\ - -1 & -1 & -2 - \end{array}\right] - - \sim - \left[\begin{array}{cc|c} - 1 & 1 & 2 \\ - -1 & -1 & -2 - \end{array}\right] - \begin{matrix} - R^1_1 = \dfrac{1}{2}R_1 \\ - \quad - \end{matrix} - $$

    -

    $$ - \sim - \left[\begin{array}{cc|c} - 1 & 1 & 2 \\ - 0 & 0 & 0 - \end{array}\right] - \begin{matrix} - \quad \\ - R^1_2 = R_2 + R_1 - \end{matrix} - - \qquad\bigg\{ - $$ Merk: redusert trappeform

    -

    x_1 + x_2 = 2

    - -

    Rekke med bare 0-ere

    -

    $$ - \begin{matrix} - 2x_1 & + & x_2 & - & 3x_3 & = & 2 \\ - x_1 & - & x_2 & + & x_3 & = & 1 \\ - 6x_1 & + & 3x_2 & - & 9x_3 & = & 6 - \end{matrix} - - \qquad - \dots - \qquad - \sim - \left[\begin{array}{ccc|c} - 1 & 0 & -\dfrac{2}{3} & 1 \\ - 0 & 1 & -\dfrac{5}{3} & 0 \\ - 0 & 0 & 0 & 0 - \end{array}\right] - \begin{matrix} - R^1_1 = R_1 - 2R_2 \\ - \quad \\ - \quad - \end{matrix} - $$

    -
    -
    -

    En rekke med bare 0-er \rightarrow èn fri variabel.

    -

    x_3 = t

    -
    - -
    -

    \underbrace{\qquad\qquad\qquad\qquad\quad}_\text{Redusert trappeform} \qquad\qquad\qquad\qquad\quad

    -
    -
    -

    Ligning 2/rekke 2 gir:

    -

    x_2 - \dfrac{5}{3}x_3 = 0 \qquad x_2 = \dfrac{5}{3}x_3 = \dfrac{5}{3}t

    -

    Ligning 1/rekke 1 gir:

    -

    x_1- \dfrac{2}{3}x_3 = 1 \qquad x_1 = \dfrac{2}{3}x_3 + 1 = \dfrac{2}{3}t + 1

    -

    \underline{\underline{x_1 = \dfrac{2}{3}t + 1 , x_2 = \dfrac{5}{3}t , x_3 = t}}

    - -

    Regneregler for matriser

    -
    -
      -
    • A + B = B + A

    • -
    • (AB)\cdot C = A \cdot (BC)

    • -
    • A(B+C) = AB + AC

    • -
    • (B+C)A = BA+ CA

    • -
    • AI = IA = A

    • -
    • A+0 = 0+A = A \qquad \leftarrow 0 = 0-matrise

    • -
    -
      -
    • (A^T)^T = A

    • -
    • (A+B)^T = A^T + B^T

    • -
    • (AB)^T = B^T \cdot A^T

    • -
    • (A+B)+C = A + (B+C) = A+B+C

    • -
    -
    - -

    Inverse matriser

    -

    Merk: Det er kun kvadratiske matriser som man kan finne den inverse matrisen til.

    -

    Den inverse matrisen til matrise A skrives A^{-1} og er definert som den matrisen som ganget med A gir identitetsmatrisen, altså:

    -

    $$A\cdot A^{-1} = I \qquad\quad A\cdot A^{-1} = \begin{bmatrix} 1 & 0 \\ 0 & 1\end{bmatrix}$$

    -

    2 \times 2-matrise:

    -

    $$A = \begin{bmatrix} a_{11} & & a_{12}\\ & {\huge \times} & \\ a_{21} & & a_{22}\end{bmatrix} \begin{matrix} A^{-1} = \dfrac{1}{\underbrace{a_{11}a_{22}-a_{12}a_{21}}_\text{detA}} \begin{bmatrix} a_{22} & -a_{12} \\ -a_{21} & a_{11} \end{bmatrix} \end{matrix}$$

    -

    For matriser større enn 2\times2 Dann matrisen \Big[A|I\Big]. Utfør elemtære rekkeoperasjoner så venstre halvdel blir I. Da vil høre halvdel ha blitt A^{-1}. Dersom A og B er to inverterbare n\times n-matriser, så er AB inverterbar med (AB)^{-1} = B^{-1}A^{-1}. Ikke alle kvadratiske matriser kan inverteres. Matriser som ikke kan inverteres kalles singulære.

    -

    Teorem: En kvadratisk matrise er inverterbar (ikke-singulær) hvis og bare hvis detA \ne 0

    -

    Triangulær matrise: En kvadratisk matrise med kun 0-er enten over eller under hoveddiagon

    -

    Diagonalmatrise: En kvadratisk matrise der elementene både over og under hoveddiagonalen er 0-er

    -

    Enhetsmatrise/identitetsmatrise: bare 1-ere i hoveddiagonalen.

    -

    Hoveddiagonalen:: skrått over

    -
    -
    -
    -
    -

    Ligningssystemer på matriseform

    -

    Vektorer har vi skrevet slik \vec{v} = [3, -1, 1] eller slik \vec{v} = 3\vec{i}-1\vec{j}+1\vec{k} Vi kan også skriver vektorer slik: \vec{v} = \begin{bmatrix} 3 \\ -1 \\ 1 \end{bmatrix} kolonnevektor. Ved å bruke dette kan vi skrive et ligningssystem slik: - $$ - \begin{matrix} - 2x_1+x_2 = 3 \\ - 3x_1-2x_2 = 4 - \end{matrix} - $$. ligningssystem \Leftrightarrow A\vec{x} = \vec{b} hvor - $$ - A = - \begin{bmatrix} - 2 & 1 \\ - 3 & -2 - \end{bmatrix} - \quad - \vec{x} = - \begin{bmatrix} x_1 \\ - x_2 \end{bmatrix} - \quad \vec{b} = \begin{bmatrix} 3 \\ - 4 - \end{bmatrix} - $$ La oss vise at dette blir det samme: A\vec{x} = \vec{b} $$\begin{bmatrix} 2 & 1 \\ 3 & -2\end{bmatrix} \cdot \begin{bmatrix} x_1 \\ x_2 \end{bmatrix} = \begin{bmatrix} 3 \\ 4 \end{bmatrix}$$ (2\times2) \cdot (2\times1) \Rightarrow 2\times1 $$\begin{bmatrix} 2x_1 + x_2 \\ 3x_1 - 2x_2 \end{bmatrix} = \begin{bmatrix} 3\\4 \end{bmatrix}$$. For at to vektorer skal være like må 1.komponent være lik 1. komponent og 2 - || - 2. - || - 2x_1+x_2 = 3 \qquad\qquad 3x_1-2x_2 = 4 Dersom \vec{b} = 0 er systemet homogent. Løsningen av ligningssystemet: Anta at A er kvadratisk (like mange ligninger som ukjente) og inverterbar (ikke-singulær). Ganger med A^{-1} fra venstre: - $$ - \begin{matrix} - A\vec{x} = \vec{b} \\ - \big\Updownarrow \\ - \underline{A^{-1}A\vec{x}} = A^{-1}\vec{b} \\ - \hookrightarrow I \qquad\quad \\ - I\vec{x} = A ^{-1}\vec{b} \\ - \underline{\underline{\vec{x} = A^{-1}\vec{b}}} - \end{matrix} - $$. Dette er løsningen om A er inverterbar

    - -

    Determinanter

    -

    Gitt - $$ - A = - \begin{bmatrix} - a_{11} & a_{12} \\ - a_{21} & a_{22} - \end{bmatrix} - \qquad - $$Determinanten til A er: - $$ - detA = - \begin{vmatrix} - a_{11} & a_{12} \\ - \qquad\swarrow & \searrow \qquad \\ - a_{21} & a_{22} - \end{vmatrix} = a_{11}a_{22}-a_{12}a_{21} - - \begin{vmatrix} - a_{11} & a_{12} & a_{13} \\ - a_{21} & a_{22} & a_{23} \\ - a_{31} & a_{32} & a_{33} - \end{vmatrix} = - $$$$ - a_{11} - \begin{vmatrix} - a_{22} & a_{23} \\ - a_{32} & a_{33} - \end{vmatrix} - - - a_{12} - \begin{vmatrix} - a_{21} & a_{23} \\ - a_{31} & a_{33} - \end{vmatrix} - - + a_{13} - \begin{vmatrix} - a_{21} & a_{22} \\ - a_{31} & a_{32} - \end{vmatrix} - $$ -

    - -

    Grafer, trær og tilstandsmaskiner

    -
      -
    • Enkel graf: to noder er forbundet med maks en kant, og ingen kant fra en node til seg selv. En graf som ikke er enkel, kalles en multigraf.

    • -
    • Eks. Nodemengde: V={a,b,c}

    • -
    • Eks. Kantmengde E={(a,b),(b,c),(c,a)}

    • -
    • Graden til en node er antall kanter som går ut fra noden.

    • -
    • Naboer: To noder som er knyttet sammen med en kant kalles naboer. En graf kan representeres med en nabomatrise.

    • NABOMATRISE

      -
    • Nabomatrisen til en ikke-rettet graf vil være symmetrisk.

    • -
    • Vei, syklusEn vei er en sekvens av noder. Dersom start- og sluttnode er den samme kaller vi veien en syklus. Lengden av en vei er antall kanter veien har. En vei eller syklus er enkel dersom den ikke innehol.der samme kant mer enn en gang.

    • -
    • Subgraf En subgraf til G=(V,E) er en graf H=(V',E') der V'\subseteq V \ og \ E' \subseteq E

    • EKSEMPEL SUBGRAF

      -
    • Union av grafer: To eller flere grafer settes sammen

    • EKSEMPEL

      -
    -
      -

      Isomorfi

      -
    • Definisjon La G_1=(V_1, E_1) \ og G_2=(V_2, E_2) være to enkle grafer. En funksjon f: V_1 \rightarrow V_2 kalles en isomorfi dersom:

    • -
    • 1. f er injektiv

    • -
    • 2. f er surjektiv

    • -
    • 3. u og v er naboer i G_1, hvis og bare hvis f(u) og f(v) er naboer i G_2, for alle u,v \in V_1

    • -
    • Dersom det finnes en isomorfi sies grafene å være isomorfe.

    • -

      Eksempel Er G1 og G2 isomorfe? Begrunn svaret. Dersom de er isomorfe må du også angi en isomorfi f: V_1 \to V_2. Vi ser at begge grafene har seks noder og åtte kanter. At de har like mange noder og kanter er - en nødvendig men ikke tilstrekkelig betingelse for at de skal være isomorfe. Vi ser at to av nodene i hver graf har grad 4 (b og d, samt 2 og 6) og de resterende har grad 2. - Vi må sørge for å «pare» de nodene som har samme grad. Vi kan forsøke å begynne med f(b)=2, f(d)=6 osv... Vi ser at denne funksjonen er injektiv (én-entydig), fordi ulike elementer i definisjonsmengden - V_1 har ulike bilder i verdimengden V_2 Vi ser videre at f(V_1)=V_2 altså at funksjonen er surjektiv.

      -

      Vi må også sjekke at naboskap beholdes, altså at dersom u og v er naboer i G1 så er f(u) og f(v) naboer i G2. Det er lurt å være systematisk når man lister opp disse: først naboer til a, så naboer til b, osv

      -

      Vi ser at naboskap bevares under f. Siden f også er injektiv og surjektiv (altså bijektiv), kan vi konkludere med at f slik vi har definert den, er en isomorfi. G1 og G2 er følgelig isomorfe.

      -
    - -

    Eulergraf, eulersyklus

    -
      -
    • En syklus som traverserer alle kantene i en graf eksakt én gang, kalles en eulersyklus. En graf hvor dette lar seg gjøre, kalles en eulergraf. En graf G=(V,E) er en eulergraf hvis og bare hvis G er sammenhengende og graden til hver node er et partall.

    • -

      EKS http://www.it.hiof.no/mit/mit_eksamen_des16_losning.pdf

      -

      Hamiltonsyklus, hamiltongraf

      -
    • En syklus som går igjennom hver node i grafen eksakt én gang kalles en hamiltonsyklus. En graf hvor dette lar seg gjøre, kalles en hamiltongraf. (Må bare prøve seg frem)

    • -
    • En komplett graf er en graf hvor alle noder er nabo med alle andre noder. En komplett graf er en hamiltongraf.
    • -
    -
    -
    -
    -
    -
    -
    -
      -

      Dijkstras algoritme

      -
    • Finner den korteste vei (vei med minst samlet vekt) fra en node til enhver annen node i grafen. Baserer seg på at man tilordner en vekt/kost til enhver kant i grafen.

    • -
    • S: mengden av ferdigbehandlede noder. W(u,v); weight, vekten på kanten (u,v). D(u): total distanse (samlet vekt) fra - startnoden til node u. Til hver node er det knyttet en etikett (label) som angir:

    • -
    • - total distanse fra startnode, - forgjenger

    • -
    • Trinn 1 - initialisering

    • -
    • a) Gi Startnoden (a) etiketten 0,-

    • -
    • b) S=\{a\}

    • -
    • Trinn 2

    • -
    • Gjør en tilordning av etiketter til nodene:

    • -
    • - Nodene direkte knyttet til a gis etiketten w(a,v), a for alle v direkte knyttet til a.

    • -
    • - Noder som ikke er nabo til a, gis etiketten \infty, a

    • -
    • Trinn 3

    • -
    • 3.1 Velg den av nodene, u, som ikke er i S som har minst vekt/avstand til a, og føy til S.

    • -
    • For hver node x som ikke er i S og som er nabo til u, erstatt etiketten til x med W(u,x)+D(u),u dersom den nye avstanden W(u,x)+D(u) er mindre enn den vi alt har i etiketten til x.

    • -
    • 3.3 Gjenta trinn 3 inntil S inneholder alle nodene i grafen.

    • -
    • Trinn 4

    • -
    • List korteste veier med deres avstander/vekter (list etikettene).
    • -

      EKS http://www.it.hiof.no/mit/mit_eksamen_des14_losning.pdf

      -
    - -
      -

      Språk og tilstandsmaskiner

      -
    • Alfabet: mengden av de symboler som kan brukes

    • -
    • Grammatikk: et alfabet + produksjonsregler (for ord)

    • -
    • Ord: mengden av alle ord som kan produseres av grammatikken

    • -
    • To typer symboler:

    • -
    • 1. Avslutningssymboler (terminaler). Ferdiglagde ord i et språk består kun av disse. Mengden av alle avslutningssymboler: T

    • -
    • 2. Ikke-avslutningssymboler. Symboler som brukes ved produksjon av ord. Mengden av slike: N.

    • -
    • Startsymbol: S. S \in N

    • -
    • (N \cup T)^* betyr: alle mulige kombinasjoner av symboler fra N og T, inkludert den tomme streng, \lambda (en streng som b estår av 0 symboler)

    • -
    • Kontekstfri grammatikk består av:

    • -
    • 1. En endelig mengde, N, av ikke-avslutningssymboler, inkludert startsymbolet s.

    • -
    • 2. En endelig mengde, T, av avslutningssymboler hvor N \cap T = \phi

    • -
    • En endelig mengde produksjonsregler på formen w_1 \rightarrow w_2, der w_1 \in N (w_1 er ett symbol fra N) og w_2 \in (N \cup T)^*. (w_2 er en vilkårlig streng av symboler fra N og T).

    • -
    • Regulær grammatikk er en kontekstfri grammatikk der produksjonsreglene må ha en av følgende former:

    • -
    • 1. w_1 \rightarrow \lambda

    • -
    • 2. w_1 \rightarrow aw_2

    • -
    • 3. w_1 \rightarrow a

    • -
    • der w_1, w_2 \in N (ett symbol fra N) og a \in T (ett symbol fra T)

      -
    • -
    • Her er det høyre side vi stiller krav til: - den tomme streng, - ett avslutningssymbol fulgt av ett ikke-avslutningssymbol, - ett avslutningssymbol

    • -

      EKS? http://www.it.hiof.no/mit/mit_eksamen_des13_losning.pdf

      -
    - -

    Komplekse tall

    -

    i= \sqrt{-1} , \ i^2=-1

    -

    Kartesisk form, rektangulær form. Z=a+bi, a: Realdel. b: Imaginærdel. i: den imaginære enhet

    -

    Komplekskonjugering Z=a+bi \ | \overline Z = a-bi

    -

    Polarform cos \phi = \dfrac{a}{r} , \ a = r \cdot cos \phi | sin \phi = \dfrac{b}{r} , \ b = r \cdot sin \phi

    -

    Z=a+bi = rcos \phi + r sin \phi i = r(cos \phi + isin \phi)

    -

    Eksponentialform Z=r \cdot e^{i \phi}

    -

    Multiplikasjon og divisjon på eksponentialform

    -

    Z_1 = r_1e^{i \phi_1} , Z_2 = r_2e^{i \phi_2}

    -

    Z_1Z_2 = r_1r_2e^{i(\phi_1 + \phi_2)}

    -

    \dfrac{Z_1}{Z_2} = \dfrac{r_1}{r_2} e^{i(\phi_1 - \phi_2)}

    -

    \phi målt i radianer: \phi = \dfrac{b}{r}

    -

    Euler: e^{i \phi} = cos \phi + isin \phi

    -

    Konvertering fra eksponentialform til rektangulær form

    -

    Z = re^{i \phi} = r(cos \phi + i sin \phi) , \ a=rcos \phi, \ b=rsin \phi

    -

    Kartesisk til eksponential form

    -

    r=|z|= \sqrt{a^2+b^2}

    -

    cos \phi = \dfrac{a}{r} \to \phi = cos^{-1} \dfrac{a}{r}

    -

    sin \phi = \dfrac{b}{r} \to \phi = sin^{-1} \dfrac{b}{r}

    -

    Men husk: cosinus til eksplementvinkler er like. Vi må derfor i tillegg gjøre en vurdering av hvilken kvadrant tallet ligger i. (Man kan gjøre dette ved å se på fortegnene til a+bi)

    -
    -
    -
    -
    -
      -

      Endelige tilstandsmaskiner med utgang

      -
    • "Endelig: antall tilstander er endelig. Tegnes ved tilstandstabell eller som et tilstandsdiagram.

    • -

      Tilstandstabell med utgang??

      -
    • Endelig automat (endelig tilstandsmaskin uten utgang). Ingen utgang, men har en eller flere aksepterende tilstander (sluttilstander). Markeres med dobbel ring i tilstandsdiagrammet. Endelige automater kan brukes til å avgjøre om ord tilhører et språk, dersom språket er et regulært språk.

    • -

      EKS http://www.it.hiof.no/mit/mit_eksamen_des10_losning.pdf

      -
    -
      -

      Turingmaskiner

      -
    • Uendelig lang tape, inndelt i celler som kan være blanke (symboliseres med en B) eller inneholde ett symbol fra turingsmaskinens alfabet. Har også en styringsenhet, som kan være i en av et endelig antall tilstander. Styringsenheten operer trinnvis:

    • -
    • I hvert trinn leser den symbolet i cellen den peker på, så skriver den ett symbol til cellen den peker på, og flytter seg deretter en celle til høyre (R) eller venstre (L) på tapen. I tillegg kan den endre tilstand. Styringsenhetens startposisjon er den cellen lengst til venstre som ikke er blank.

    • -
    • En turingmaskin T=(S,I,f,s_0) består av:

    • -
    • S: en endelig mengde tilstander

    • -
    • I: et alfabet (mulige symboler på tapen) ink. det tomme symbolet B

    • -
    • f: en partiell funksjon fra S \cdot I \ til \ S \cdot I \cdot \{R,L\} (for noen av de mulige (tilstand, symbol)-par definerer f et (tilstand, symbol, retning)-trippel)

    • -
    • s_0: startilstand

    • -
    • Overgangsregler, skrives ofte som fem-tupler:

    • -
    • (tilstand, symbol, tilstand, symbol, retning)

      henholdsvis:
    • -
    • (den er i, lest fra tapen, den havner i, skrives til tapen, den går til)

    • -
    • Dersom f ikke er definert for det (tilstand, symbol)-paret som den er i og leser, henholdsvis, vil den stoppe. Når den stopper kan man skrive ut resultatet: -strengen av symboler på tapen (-at den stopper, -tilstanden den er i)

    • -

      Church-Turing tesen

      -
    • Dersom man har et problem som kan løses med en algoritme, så vil det finnes en turingmaskin som kan løse problemet

    • -
    - -

    Trær

    -
      -
    • Et tre er en sammenhengende urettet graf uten sykluser. Dersom T er et tre med n noder & k kanter, så er k=n-1

    • -
    • Spenntre La G være en enkel graf. Et spenntre T til G er en subgraf til G som inneholder alle nodene i G og er et tre. Merk: en graf kan ha mange spenntrær. Ofte knytter man en vekt/kost til hver kant. Det spenntre som totalt sett gir minimal kost/vekt kalles et minimalt spenntre. Vi bruker Krusklas algoritme til dette.

    • -

      Kruskals algoritme

      -
    • La G=(V,E) være en sammenhengende graf med vektede kanter. Et spenntre kan lages slik:

    • -
    • 1. Sorter kantene basert på deres vekter

    • -
    • 2. Start med en av kantene med lavest vekt

    • -
    • 3. Tilføy så en av de gjenværende kantene med lavest vekt, uten å danne syklus.

    • -
    • Gjenta trinn 3 inntil alle noder er med i treet.

    • -

      EKS http://www.it.hiof.no/mit/mit_eksamen_des11_losning.pdf

      -
    • Et rottre er et tre hvor en node utpekes som rot, og hvor det er en vei fra rota til hver av de andre nodene.

    • -

      Eks?

      -
    - -
      -

      Rettede grafer

      -

      Tegne nabomatrise (fra, til)

      -
    • For å finne rettede veier av lengde 1 i grafen, kan vi se i nabomatrisen, M. For å finne rettede veier av lengde 2, kan vi utføre en boolsk matrisemultiplikasjon. M^{[2]}=M \cdot M.\ M^{[3]} = M \cdot M \cdot M

      1-ere i nabomatrisen vil da si "en rettet vei av lengde x, fra node1 til node2".
    • -
      -
      -
    • Boolsk multiplikasjon 1 \cdot 1 = 0,\ 1 \cdot 0 = 0 \cdot 1 = 0 \cdot 0 = 0

    • -
    • Boolsk addering 1+1=1+0=0+1=1,\ 0+0=0

    • -
      -
      - -
      -
      - -

      Eks?

      -
    • Rekkeviddematrise Hvorvidt det er mulig å nå en node, kan ses av rekkeviddematrisen, M^*. M^* er den boolske summen av M, M^{[2]}, M^{[3]}, osv.

    • -
    - -

    Surjektiv / injektiv

    -

    Gitt en funksjon f: A \to B. Anta at f er injektiv, men ikke nødvendigvis surjektiv. Hvilke av følgende påstander er da korrekte. Begrunn svaret

    -
    -
    -

    Fordi f er en funksjon, må hvert element i A ha relasjon til nøyaktig ett element i B. At funksjonen er injektiv, innebærer at ulike elementer i A har ulike bilder i B. Av dette kan vi slutte at antall elementer i B i det minste må være like stort som antall elementer i A, for hvis antall elementer i B var mindre enn antall i A, måtte minst to elementer i A ha samme bilde i B. Men fordi funksjonen ikke nødvendigvis er surjektiv, kan vi godt ha en situasjon hvor antall elementer i B er større enn antall elementer i A, for det gjør da ikke noe om B har elementer som ikke er bilde av noe element i A.

    -

    Påstand (ii) er derfor riktig.

    -
    -
    - -
    -
    -

    Gitt en funksjon f: A \to B. Anta at f er surjektiv, men ikke nødvendigvis injektiv. Hvilke av følgende påstander er da korrekte. Begrunn svaret.

    -

    Fordi f er en funksjon, må hvert element i A ha relasjon til nøyaktig ett element i B. Hvert element i A kan altså ikke «dekke opp for» mer enn ett element i B. Og siden hvert element i B må være bilde av et element i A (fordi f er surjektiv), må antall elementer i A være større eller lik antall elementer i B.

    -

    Påstand (iv) er derfor riktig

    - -

    Tilstandstabell

    -
    - - -
    -
    -
    -
    -
    -

    Differensligning eksempel

    - - - - - -

    Tilstandsdiagram

    -
    -

    Lag en endelig tilstandsmaskin med binær inngang og utgang som gir 1-er ut når inndatasymbolet den leser er likt det foregående inndatasymbolet, og 0-er ut ellers. For eksempel skal inndatastrengen 0001100 gi følgende ut: 0110101. Her trenger vi minst tre tilstander. En starttilstand ( ) 0 s , en tilstand vi går til når vi leser en 0- er ( ) 1 s og en tilstand vi går til når vi leser en 1-er ( ) 2 s . Tilstandene 1 s og 2 s bruker vi altså til å huske hva sist innleste bit er slik at vi kan sammenligne med det bitet vi leser nå. Tilstandsmaskinen kan da se slik ut (det kan finnes andre korrekte løsninger):

    - -
    -
    -
    -
    - - diff --git a/dist/_/skole/hio/2017/eksamensark/template.html b/dist/_/skole/hio/2017/eksamensark/template.html deleted file mode 100644 index f211d27..0000000 --- a/dist/_/skole/hio/2017/eksamensark/template.html +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - Template - - - -
    -
    -

    Page 1 - Section 1

    -
    -
    -

    Page 1 - Section 2

    -
    -
    -

    Page 1 - Section 3

    -
    -
    -
    -
    -

    Page 2 - Section 1

    -
    -
    -

    Page 2 - Section 2

    -
    -
    -

    Page 2 - Section 3

    -
    -
    -
    -
    -

    Page 3 - Section 1

    -
    -
    -

    Page 3 - Section 2

    -
    -
    -

    Page 3 - Section 3

    -
    -
    -
    -
    -

    Page 4 - Section 1

    -
    -
    -

    Page 4 - Section 2

    -
    -
    -

    Page 4 - Section 3

    -
    -
    - - - - - - - diff --git a/dist/_/startpage/index.html b/dist/_/startpage/index.html deleted file mode 100644 index fe6c79d..0000000 --- a/dist/_/startpage/index.html +++ /dev/null @@ -1,217 +0,0 @@ - - - - - - - Bjørnar Hagen - - - - - - - - - - - - - - - - - -
    -
    -
    - - -
    -
    -
    -
    -

    Adstate

    - -
    -
    -

    Datahjelpen

    - -
    - - -
    -
    - - - \ No newline at end of file diff --git a/dist/android-chrome-192x192.png b/dist/android-chrome-192x192.png deleted file mode 100644 index 224f4cc..0000000 Binary files a/dist/android-chrome-192x192.png and /dev/null differ diff --git a/dist/android-chrome-512x512.png b/dist/android-chrome-512x512.png deleted file mode 100644 index 35b3f56..0000000 Binary files a/dist/android-chrome-512x512.png and /dev/null differ diff --git a/dist/apple-touch-icon.png b/dist/apple-touch-icon.png deleted file mode 100644 index 2a5e572..0000000 Binary files a/dist/apple-touch-icon.png and /dev/null differ diff --git a/dist/bitcoin.pdf b/dist/bitcoin.pdf deleted file mode 100644 index 1e19b73..0000000 Binary files a/dist/bitcoin.pdf and /dev/null differ diff --git a/dist/browserconfig.xml b/dist/browserconfig.xml deleted file mode 100644 index b9639ca..0000000 --- a/dist/browserconfig.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - #000000 - - - diff --git a/dist/categories/code/index.html b/dist/categories/code/index.html deleted file mode 100644 index 166d756..0000000 --- a/dist/categories/code/index.html +++ /dev/null @@ -1,140 +0,0 @@ - - - - - - - - - Code | Bjørnar Hagen - - - - - - - - - - - - - - - - - - - - - - -
    - - -
    -
    -
    -
    -
    - -
    -
    -

    Posts / Code

    -
    -
    -

    Posts / Code

    -
    -
    -

    - Photo by Kenshi Kingami -

    -
    -
    -
    -
    - -
    -
    - -
    - -

    - How to add line numbers to pre tags -

    -

    - - UX - - Code - -

    -
    -
    Reading code is easier when you have line numbers, but how can you show line numbers in a <pre> tag? This can easily be solved with a few lines of JS and CSS, no need for a big external library.
    -
    - -
    -
    - -
    - -

    - UX tip for external links -

    -

    - - UX - - Code - -

    -
    -
    Clicking links going to an external site can be annoying if you aren't prepared for that. To improve the user experience you should show some kind of indicator for external links.
    -
    - -
    - - - - - - - - diff --git a/dist/categories/code/index.xml b/dist/categories/code/index.xml deleted file mode 100644 index 80275af..0000000 --- a/dist/categories/code/index.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - Code on bjornar.dev - https://bjornar.dev/categories/code/ - Recent content in Code on bjornar.dev - Hugo -- gohugo.io - en - Thu, 06 May 2021 14:25:01 +0000 - - How to add line numbers to pre tags - https://bjornar.dev/entries/2021/05/06/pre-line-numbers/ - Thu, 06 May 2021 14:25:01 +0000 - - https://bjornar.dev/entries/2021/05/06/pre-line-numbers/ - <p>Reading code is easier when you have line numbers, but how can you show line numbers in a <pre> tag? This can easily be solved with a few lines of JS and CSS, no need for a big external library.</p> - - - - - UX tip for external links - https://bjornar.dev/entries/2021/04/28/links/ - Wed, 28 Apr 2021 20:08:47 +0000 - - https://bjornar.dev/entries/2021/04/28/links/ - Clicking links going to an external site can be annoying if you aren&rsquo;t prepared for that. To improve the user experience you should show some kind of indicator for external links. - - - - Useful commands - https://bjornar.dev/entries/commands/ - Thu, 28 Jan 2021 20:08:47 +0000 - - https://bjornar.dev/entries/commands/ - Lists of commands I use often, but also forget often. - - - - diff --git a/dist/categories/economy/index.html b/dist/categories/economy/index.html deleted file mode 100644 index 8826c58..0000000 --- a/dist/categories/economy/index.html +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - - - - Economy | Bjørnar Hagen - - - - - - - - - - - - - - - - - - - - - - -
    - - -
    -
    -
    -
    -
    - -
    -
    -

    Posts / Economy

    -
    -
    -

    Posts / Economy

    -
    -
    -

    - Photo by Kenshi Kingami -

    -
    -
    -
    -
    - -
    -
    - -
    - -

    - Good money. -

    -

    - - Economy - - Opinion - -

    -
    -
    I don't believe we shall ever have a good money again before we take the thing out of the hands of government - F. A. Hayek
    -
    - -
    - - - - - - - - diff --git a/dist/categories/economy/index.xml b/dist/categories/economy/index.xml deleted file mode 100644 index e152594..0000000 --- a/dist/categories/economy/index.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - Economy on bjornar.dev - https://bjornar.dev/categories/economy/ - Recent content in Economy on bjornar.dev - Hugo -- gohugo.io - en - Tue, 15 Mar 2022 01:33:00 +0000 - - Good money. - https://bjornar.dev/entries/2022/03/15/good-money/ - Tue, 15 Mar 2022 01:33:00 +0000 - - https://bjornar.dev/entries/2022/03/15/good-money/ - I don&rsquo;t believe we shall ever have a good money again before we take the thing out of the hands of government - F. A. Hayek - - - - diff --git a/dist/categories/index.html b/dist/categories/index.html deleted file mode 100644 index 41df171..0000000 --- a/dist/categories/index.html +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - - - - Categories | Bjørnar Hagen - - - - - - - - - - - - - - - - - - - - - - -
    - - -
    -
    -
    -
    -
    - -
    -
    -

    Posts / Categories

    -
    -
    -

    Posts / Categories

    -
    -
    -

    - Photo by Kenshi Kingami -

    -
    -
    -
    -
    - -
    -
    - -

    - Opinion -

    -

    - -

    -
    -
    -
    - -
    -
    - -

    - Social -

    -

    - -

    -
    -
    -
    - -
    -
    - -

    - Economy -

    -

    - -

    -
    -
    -
    - -
    -
    - -

    - UX -

    -

    - -

    -
    -
    -
    - -
    -
    - -

    - Code -

    -

    - -

    -
    -
    -
    - -
    - - - - - - - - diff --git a/dist/categories/index.xml b/dist/categories/index.xml deleted file mode 100644 index 8cb34d5..0000000 --- a/dist/categories/index.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - - Categories on bjornar.dev - https://bjornar.dev/categories/ - Recent content in Categories on bjornar.dev - Hugo -- gohugo.io - en - Tue, 04 Jul 2023 13:35:00 +0000 - - Opinion - https://bjornar.dev/categories/opinion/ - Tue, 04 Jul 2023 13:35:00 +0000 - - https://bjornar.dev/categories/opinion/ - - - - - Social - https://bjornar.dev/categories/social/ - Tue, 04 Jul 2023 13:35:00 +0000 - - https://bjornar.dev/categories/social/ - - - - - Economy - https://bjornar.dev/categories/economy/ - Tue, 15 Mar 2022 01:33:00 +0000 - - https://bjornar.dev/categories/economy/ - - - - - UX - https://bjornar.dev/categories/ux/ - Thu, 08 Jul 2021 22:04:54 +0000 - - https://bjornar.dev/categories/ux/ - - - - - Code - https://bjornar.dev/categories/code/ - Thu, 06 May 2021 14:25:01 +0000 - - https://bjornar.dev/categories/code/ - - - - - diff --git a/dist/categories/opinion/index.html b/dist/categories/opinion/index.html deleted file mode 100644 index b2feeb4..0000000 --- a/dist/categories/opinion/index.html +++ /dev/null @@ -1,140 +0,0 @@ - - - - - - - - - Opinion | Bjørnar Hagen - - - - - - - - - - - - - - - - - - - - - - -
    - - -
    -
    -
    -
    -
    - -
    -
    -

    Posts / Opinion

    -
    -
    -

    Posts / Opinion

    -
    -
    -

    - Photo by Kenshi Kingami -

    -
    -
    -
    -
    - -
    -
    - -
    - -

    - Good money. -

    -

    - - Economy - - Opinion - -

    -
    -
    I don't believe we shall ever have a good money again before we take the thing out of the hands of government - F. A. Hayek
    -
    - -
    - -
    The number one priority for so many businesses these days seem to be to get your oh so precious consent in order track you with cookies, and don't you dare do anything on their website before you've given it!
    -
    - -
    - - - - - - - - diff --git a/dist/categories/opinion/index.xml b/dist/categories/opinion/index.xml deleted file mode 100644 index 576bd3e..0000000 --- a/dist/categories/opinion/index.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - Opinion on bjornar.dev - https://bjornar.dev/categories/opinion/ - Recent content in Opinion on bjornar.dev - Hugo -- gohugo.io - en - Tue, 04 Jul 2023 13:35:00 +0000 - - - Good money. - https://bjornar.dev/entries/2022/03/15/good-money/ - Tue, 15 Mar 2022 01:33:00 +0000 - - https://bjornar.dev/entries/2022/03/15/good-money/ - I don&rsquo;t believe we shall ever have a good money again before we take the thing out of the hands of government - F. A. Hayek - - - - Are cookies really the most important thing for your business? - https://bjornar.dev/entries/2021/07/08/are-cookies-really-the-most-important-thing-for-your-business/ - Thu, 08 Jul 2021 22:04:54 +0000 - - https://bjornar.dev/entries/2021/07/08/are-cookies-really-the-most-important-thing-for-your-business/ - The number one priority for so many businesses these days seem to be to get your oh so precious consent in order track you with cookies, and don&rsquo;t you dare do anything on their website before you&rsquo;ve given it! - - - - diff --git a/dist/categories/social/index.html b/dist/categories/social/index.html deleted file mode 100644 index 02dffe0..0000000 --- a/dist/categories/social/index.html +++ /dev/null @@ -1,102 +0,0 @@ - - - - - - - - - Social | Bjørnar Hagen - - - - - - - - - - - - - - - - - - - - - - -
    - - -
    -
    -
    -
    -
    - -
    -
    -

    Posts / Social

    -
    -
    -

    Posts / Social

    -
    -
    -

    - Photo by Kenshi Kingami -

    -
    -
    -
    -
    - -
    - - - - - - - - diff --git a/dist/categories/social/index.xml b/dist/categories/social/index.xml deleted file mode 100644 index e04c377..0000000 --- a/dist/categories/social/index.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - Social on bjornar.dev - https://bjornar.dev/categories/social/ - Recent content in Social on bjornar.dev - Hugo -- gohugo.io - en - Tue, 04 Jul 2023 13:35:00 +0000 - - diff --git a/dist/categories/ux/index.html b/dist/categories/ux/index.html deleted file mode 100644 index fa93283..0000000 --- a/dist/categories/ux/index.html +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - - - - UX | Bjørnar Hagen - - - - - - - - - - - - - - - - - - - - - - -
    - - -
    -
    -
    -
    -
    - -
    -
    -

    Posts / UX

    -
    -
    -

    Posts / UX

    -
    -
    -

    - Photo by Kenshi Kingami -

    -
    -
    -
    -
    - -
    - -
    The number one priority for so many businesses these days seem to be to get your oh so precious consent in order track you with cookies, and don't you dare do anything on their website before you've given it!
    -
    - -
    -
    - -
    - -

    - How to add line numbers to pre tags -

    -

    - - UX - - Code - -

    -
    -
    Reading code is easier when you have line numbers, but how can you show line numbers in a <pre> tag? This can easily be solved with a few lines of JS and CSS, no need for a big external library.
    -
    - -
    -
    - -
    - -

    - UX tip for external links -

    -

    - - UX - - Code - -

    -
    -
    Clicking links going to an external site can be annoying if you aren't prepared for that. To improve the user experience you should show some kind of indicator for external links.
    -
    - -
    - - - - - - - - diff --git a/dist/categories/ux/index.xml b/dist/categories/ux/index.xml deleted file mode 100644 index f6111fd..0000000 --- a/dist/categories/ux/index.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - UX on bjornar.dev - https://bjornar.dev/categories/ux/ - Recent content in UX on bjornar.dev - Hugo -- gohugo.io - en - Thu, 08 Jul 2021 22:04:54 +0000 - - Are cookies really the most important thing for your business? - https://bjornar.dev/entries/2021/07/08/are-cookies-really-the-most-important-thing-for-your-business/ - Thu, 08 Jul 2021 22:04:54 +0000 - - https://bjornar.dev/entries/2021/07/08/are-cookies-really-the-most-important-thing-for-your-business/ - The number one priority for so many businesses these days seem to be to get your oh so precious consent in order track you with cookies, and don&rsquo;t you dare do anything on their website before you&rsquo;ve given it! - - - - How to add line numbers to pre tags - https://bjornar.dev/entries/2021/05/06/pre-line-numbers/ - Thu, 06 May 2021 14:25:01 +0000 - - https://bjornar.dev/entries/2021/05/06/pre-line-numbers/ - <p>Reading code is easier when you have line numbers, but how can you show line numbers in a <pre> tag? This can easily be solved with a few lines of JS and CSS, no need for a big external library.</p> - - - - - UX tip for external links - https://bjornar.dev/entries/2021/04/28/links/ - Wed, 28 Apr 2021 20:08:47 +0000 - - https://bjornar.dev/entries/2021/04/28/links/ - Clicking links going to an external site can be annoying if you aren&rsquo;t prepared for that. To improve the user experience you should show some kind of indicator for external links. - - - - diff --git a/dist/cookies/index.html b/dist/cookies/index.html deleted file mode 100644 index 4c088b9..0000000 --- a/dist/cookies/index.html +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - - - - bjornar.dev - - - - - - - - - - - - - - - - - - - - - - -
    - - -
    - -
    -
    -
    - -
    - -
    - -
    -

    Photo by Photo by [Erol Ahmed](https://unsplash.com/@erol)

    -
    - -
    -
    -
    - -
    -
    -
    - 🍪 -

    Cookies

    -

    This website uses cookies, but only the good kind :)

    -
    -
    -

    What does that mean?

    -

    No tracking of any kind. The website only use cookies for functionality.

    -

    What kind of functionality?

    -

    Only for remembering your selection for dark/light mode, and only if you have selected it at all by clicking the button in the footer. Otherwise dark/light mode is based on the time of day.

    -

    I want to delete my cookies.

    - - - - -
    -
    -
    - - - - - - - - diff --git a/dist/en/index.html b/dist/en/index.html deleted file mode 100644 index 9fafbd4..0000000 --- a/dist/en/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - https://bjornar.dev/ - - - - - - diff --git a/dist/en/sitemap.xml b/dist/en/sitemap.xml deleted file mode 100644 index 93af06d..0000000 --- a/dist/en/sitemap.xml +++ /dev/null @@ -1,286 +0,0 @@ - - - - https://bjornar.dev/ - 2023-07-04T13:35:00+00:00 - - - - https://bjornar.dev/categories/ - 2023-07-04T13:35:00+00:00 - - - - https://bjornar.dev/categories/opinion/ - 2023-07-04T13:35:00+00:00 - - - - https://bjornar.dev/categories/social/ - 2023-07-04T13:35:00+00:00 - - https://bjornar.dev/entries/ - 2023-04-27T01:00:39+02:00 - - - - https://bjornar.dev/categories/economy/ - 2022-03-15T01:33:00+00:00 - - - - https://bjornar.dev/entries/2022/03/15/good-money/ - 2022-03-15T01:33:00+00:00 - - - - https://bjornar.dev/entries/2021/07/08/are-cookies-really-the-most-important-thing-for-your-business/ - 2021-07-08T22:04:54+00:00 - - - - https://bjornar.dev/categories/ux/ - 2021-07-08T22:04:54+00:00 - - - - https://bjornar.dev/categories/code/ - 2021-05-06T14:25:01+00:00 - - - - https://bjornar.dev/entries/2021/05/06/pre-line-numbers/ - 2021-05-06T14:25:01+00:00 - - - - https://bjornar.dev/entries/2021/04/28/links/ - 2021-04-28T20:08:47+00:00 - - - - https://bjornar.dev/entries/commands/ - 2021-01-28T20:08:47+00:00 - - https://bjornar.dev/cookies/ - - - - https://bjornar.dev/entries/drafts/ - - - - https://bjornar.dev/index/section-2-2/ - - - - https://bjornar.dev/ipsum/ - - - - https://bjornar.dev/now/ - - - - https://bjornar.dev/webring/ - - - - https://bjornar.dev/menu/ - - - - https://bjornar.dev/index/section-2-1/ - - - - https://bjornar.dev/index/ - - - - https://bjornar.dev/index/section-1/ - - - - https://bjornar.dev/tags/ - - - - diff --git a/dist/entries/2021/04/28/header.jpg b/dist/entries/2021/04/28/header.jpg deleted file mode 100644 index c5645ba..0000000 Binary files a/dist/entries/2021/04/28/header.jpg and /dev/null differ diff --git a/dist/entries/2021/04/28/links/index.html b/dist/entries/2021/04/28/links/index.html deleted file mode 100644 index bb9bcfe..0000000 --- a/dist/entries/2021/04/28/links/index.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - - - UX tip for external links | Bjørnar Hagen - - - - - - - - - - - - - - - - - - - - - - - - -
    - - -
    - -
    -
    -
    -

    UX tip for external links

    -
    -
    - -

    - Author: - Bjørnar Hagen -

    - -

    - Date published: - 2021-04-28T20:08:47Z -

    - -
    -
    - -
    -
    - UX tip for external links -
    - -
    -

    Photo by <a href="https://unsplash.com/@christopher__burns">Christopher Burns</a>

    -
    - -
    - -
    - -

    Clicking on a link going to an external site can be annoying if you aren’t prepared for that. To improve the user experience you should show some kind of indicator for external links.

    -

    On this website I have made such an indicator. The following link is an example: -Example link.

    -

    If you are on desktop, when you hover the link it will show you an indicator. On mobile it should always show, although somewhat subtle to avoid beeing distracting.

    -

    The following code is how I implemented this indicator.

    -

    HTML:

    -
    1<a href="//example.com" target="_blank" rel="noopener">Example link</a>
    -

    CSS:

    -
     1a[target='_blank'] {
    - 2  position: relative;
    - 3}
    - 4
    - 5a::after {
    - 6  content: '\\2197';
    - 7  position: absolute;
    - 8  top: -0.5em;
    - 9  right: -0.5em;
    -10  opacity: 0.5;
    -11}
    -12
    -13/* Desktop */
    -14@media (min-width: 60em) {
    -15  a::after {
    -16    opacity: 0;
    -17  }
    -18
    -19  a:focus::after,
    -20  a:hover::after {
    -21    opacity: 1;
    -22  }
    -23}
    -

    One drawback of my implementation is that it relies on target="_blank". Which you may not always want to add. So an alternative way to set this up would be to use some JavaScript that finds all external links and adds a CSS class to the elements.

    -

    If you are willing to put down the effort, an even better example can be seen on web.mit.edu/contact. If you hover over the “Alumni Association” link, it will show you the domain of the external site in a tooltip. Unfortunately they have no indicator for mobile users.

    -

    That’s it! Really short and sweet tip on how to improve the UX of your external links.

    -
    -
    - - - - - - - - - - diff --git a/dist/entries/2021/05/06/header.jpg b/dist/entries/2021/05/06/header.jpg deleted file mode 100644 index 68e941d..0000000 Binary files a/dist/entries/2021/05/06/header.jpg and /dev/null differ diff --git a/dist/entries/2021/05/06/pre-line-numbers/index.html b/dist/entries/2021/05/06/pre-line-numbers/index.html deleted file mode 100644 index 33af83a..0000000 --- a/dist/entries/2021/05/06/pre-line-numbers/index.html +++ /dev/null @@ -1,177 +0,0 @@ - - - - - - - - - How to add line numbers to pre tags | Bjørnar Hagen - - - - - - - - - - - - - - - - - - - - - - - - -
    - - -
    - -
    -
    -
    -

    How to add line numbers to pre tags

    -
    -
    - -

    - Author: - Bjørnar Hagen -

    - -

    - Date published: - 2021-05-06T14:25:01Z -

    - -
    -
    - -
    -
    - How to add line numbers to pre tags -
    - -
    -

    Photo by <a href="https://unsplash.com/@adigold1">Adi Goldstein</a>

    -
    - -
    - -
    - -

    Reading code is easier when you have line numbers, but how can you show line numbers in a <pre> tag? -This can easily be solved with a few lines of JS and CSS, no need for a big external library.

    -

    JS:

    -
     1function addLineNumbersToPres() {
    - 2  const pres = document.querySelectorAll('pre')
    - 3  pres.forEach((pre) => {
    - 4    const lineNumberWrapper = document.createElement('span')
    - 5    lineNumberWrapper.classList.add('pre-line-numbers')
    - 6
    - 7    const preLines = pre.textContent.split('\\n').length
    - 8    for (let i = 0; i < preLines - 1; i++) {
    - 9      const span = document.createElement('span')
    -10      span.appendChild(document.createTextNode(i))
    -11      lineNumberWrapper.appendChild(span)
    -12    }
    -13
    -14    pre.insertBefore(lineNumberWrapper, pre.firstChild)
    -15  })
    -16}
    -

    This changes the HTML for the <pre> tag to look something like this:

    -
     1<pre>
    - 2  <span class="pre-line-numbers">
    - 3    <span>0</span>
    - 4    <span>1</span>
    - 5    <span>2</span>
    - 6    <span>3</span>
    - 7    <span>4</span>
    - 8    <span>5</span>
    - 9  </span>
    -10  <code>
    -11    // Code comes here
    -12  </code>
    -13<pre>
    -

    Now for the styling.

    -

    CSS:

    -
     1pre {
    - 2  position: relative;
    - 3  width: 100%;
    - 4  overflow: auto;
    - 5  display: grid;
    - 6  grid-template-columns: min-content max-content;
    - 7}
    - 8
    - 9pre .pre-line-numbers {
    -10  display: flex;
    -11  flex-direction: column;
    -12  height: 100%;
    -13  text-align: right;
    -14  user-select: none;
    -15}
    -

    Extra: -According to caniuse.com user-select without prefixes is only supported by 50-70% of browsers at the time of writing, so here’s the prefixed properties if you want to add them:

    -
    1pre .pre-line-numbers {
    -2  -webkit-user-select: none;
    -3  -khtml-user-select: none;
    -4  -moz-user-select: none;
    -5  -ms-user-select: none;
    -6}
    -

    What about syntax highlighting?

    -

    Syntax highlighting is much more complicated to solve, but maybe I’ll make a post about it one day. For now my <pre> tags remain black and white.

    -

    Update: I’ve added syntax highlighting to my page, it’s setup via Hugo.

    -
    -
    - - - - - - - - - - diff --git a/dist/entries/2021/07/08/aftenposten.png b/dist/entries/2021/07/08/aftenposten.png deleted file mode 100644 index 372b024..0000000 Binary files a/dist/entries/2021/07/08/aftenposten.png and /dev/null differ diff --git a/dist/entries/2021/07/08/altibox.png b/dist/entries/2021/07/08/altibox.png deleted file mode 100644 index 96343bf..0000000 Binary files a/dist/entries/2021/07/08/altibox.png and /dev/null differ diff --git a/dist/entries/2021/07/08/are-cookies-really-the-most-important-thing-for-your-business/index.html b/dist/entries/2021/07/08/are-cookies-really-the-most-important-thing-for-your-business/index.html deleted file mode 100644 index cd234d8..0000000 --- a/dist/entries/2021/07/08/are-cookies-really-the-most-important-thing-for-your-business/index.html +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - - - - Are cookies really the most important thing for your business? | Bjørnar Hagen - - - - - - - - - - - - - - - - - - - - - - - - -
    - - -
    - -
    -
    -
    -

    Are cookies really the most important thing for your business?

    -
    -
    - -

    - Author: - Bjørnar Hagen -

    - -

    - Date published: - 2021-07-08T22:04:54Z -

    - -
    -
    - -
    -
    - Are cookies really the most important thing for your business? -
    - -
    -

    Photo by <a href="https://unsplash.com/@lianhao">Lianhao Qu</a>

    -
    - -
    - -
    - -

    Priorities

    -

    The number one priority for so many businesses these days seem to be to get your oh so precious consent in order track you with cookies, and don’t you dare do anything on their website before you’ve given it!

    -

    I’m actually somewhat flabbergasted at what many websites have become, it seems businesses need to sit down and think about what the point of their website is.

    -

    Let’s look at an example:

    -

    Telenor mandatory cookie consent screen -Welcome to Telenor! We use cookies to track you! It’s very important for us that you allow us to track you, please.

    -
    -

    Ok great, no thanks Telenor. I’ll just head over to Altibox instead

    -
    -

    Altibox mandatory cookie consent screen

    -
    -

    Ah … maybe not after all.

    -
    -

    Let’s look at how it can (and should) be done, shall we?

    -

    Aftenposten.no website -The cookie consent pop-up on Aftenposten.no is out of the way, allowing you to actually consume the news.

    -

    netonnet.no website

    -

    And can you believe it? A websites in EU with no cookie consent pop-up? How can this be?

    - -

    This part is pretty complex and technical, so bear with me here. -Here is an exhaustive list outlining how you can make your website without a cookie consent:

    -
      -
    1. Don’t spy on people
    2. -
    -

    No but really, how?

    -

    Really, just don’t use tracking software.

    -

    Make it your business’ number one priority to sell your products/services and de-prioritized spying on people.

    -

    It’s actually possible to make a good product/service without spying on people.

    -
    -
    - - - - - - - - - - diff --git a/dist/entries/2021/07/08/header.jpg b/dist/entries/2021/07/08/header.jpg deleted file mode 100644 index 7131e07..0000000 Binary files a/dist/entries/2021/07/08/header.jpg and /dev/null differ diff --git a/dist/entries/2021/07/08/net-on-net.png b/dist/entries/2021/07/08/net-on-net.png deleted file mode 100644 index 45888f3..0000000 Binary files a/dist/entries/2021/07/08/net-on-net.png and /dev/null differ diff --git a/dist/entries/2021/07/08/telenor.png b/dist/entries/2021/07/08/telenor.png deleted file mode 100644 index 6b41c7c..0000000 Binary files a/dist/entries/2021/07/08/telenor.png and /dev/null differ diff --git a/dist/entries/2022/03/15/good-money/index.html b/dist/entries/2022/03/15/good-money/index.html deleted file mode 100644 index 756d8e4..0000000 --- a/dist/entries/2022/03/15/good-money/index.html +++ /dev/null @@ -1,139 +0,0 @@ - - - - - - - - - Good money. | Bjørnar Hagen - - - - - - - - - - - - - - - - - - - - - - - - -
    - - -
    - -
    -
    -
    -

    Good money.

    -
    -
    - -

    - Author: - Bjørnar Hagen -

    - -

    - Date published: - 2022-03-15T01:33:00Z -

    - -
    -
    - -
    -
    - Good money. -
    - -
    - -
    - -

    The system is broken.

    -

    I believe our system for money is broken.

    -

    How can it be that I can exchange my time and energy for some amount of money today. Then 20 years in the future this money is worth but a fraction of it’s original value. I don’t think that is a good system, it’s certainly not a system I would want to save my money in.

    -

    Don’t take my word for it. The following quote is by F. A. Hayek, winner of the 1974 Nobel Prize in Economic Sciences

    -
    -

    "I don’t believe we shall ever have a good money again before we take the thing out of the hands of government, that is, we can’t take them violently out of the hands of government, all we can do is by some sly roundabout way introduce something that they can’t stop."

    -
    -

    The solution?

    -

    You might have heard of Bitcoin, but what is it, and who controls it?

    -

    Bitcoin is:

    -
      -
    • an unstoppable decentralized technology that can store value.
    • -
    • controlled by the laws of mathematics.
    • -
    • protected by the laws of physics.
    • -
    -

    One could say that it’s a system for money that can be forced upon the governments of the world in a "sly roundabout way".

    -

    First it will only be used by nerds in the fringes of the internet,\ -then it will only be used by small groups of people,\ -then it will only be used by small businesses,\ -then it will only be used by small countries.

    -

    Is it a better system?

    -

    Let’s go back to the original problem I outlined. If I exchange my time and energy today for some amount of Bitcoin. Can I be sure that 20 years in the future, it will have kept it’s value?

    -

    Yes.

    -

    The reason why is due to the fact that in order to make X amount of Bitcoin, you need to spend energy, however the amount of energy necessary to produce that X amount of Bitcoin is forever increasing.

    -
    -

    To summarize, 1₿ = 1₿.

    -

    Read more: Bitcoin whitepaper.

    -
    -
    - - - - - - - - - - diff --git a/dist/entries/2022/03/15/header.jpg b/dist/entries/2022/03/15/header.jpg deleted file mode 100644 index 02eac9f..0000000 Binary files a/dist/entries/2022/03/15/header.jpg and /dev/null differ diff --git a/dist/entries/commands/index.html b/dist/entries/commands/index.html deleted file mode 100644 index 1516f41..0000000 --- a/dist/entries/commands/index.html +++ /dev/null @@ -1,527 +0,0 @@ - - - - - - - - - Useful commands | Bjørnar Hagen - - - - - - - - - - - - - - - - - - - - - - -
    - - -
    -
    -
    -
    - -
    - -

    Useful commands

    - Lists of commands I use often, but also forget often. -
    - -
    -
    -
    -
    -
    -
    - 🔐 -

    Security & privacy

    - -
    -
    - -
    - - -
    - - -
    -
    Make a password encrypted backup of a directory
    - -
    - - -
    -
    Decrypt an encrypted directory
    - - -
    - -
    - -
    -
    -
    - -

    Kubernetes

    - -
    -
    - -
    - - -
    - -
    -
    Make a Dockerfile run forever so you can debug it
    - -
    - - -
    -
    k8s manifest example - certificate
    - -
    - - -
    -
    k8s manifest example - deployment
    - -
    - - -
    -
    k8s manifest example - ingress with a private /admin space
    - -
    - - -
    -
    k8s manifest example - service
    - - -
    - -
    - -
    -
    -
    - 🐧 -

    Linux

    - -
    -
    - -
    - - -
    -
    - -
    -
    Add user to www-data
    - -
    - -
    -
    set www-data to owner of folder
    - -
    - -
    -
    Change folder permissions
    - -
    - -
    -
    Change file permissions
    - -
    - - -
    -
    Create symbolic link between sites-available and sites-enabled
    - -
    - - -
    -
    Backup folder to AWS S3 using the AWS cli
    - -
    - - -
    -
    Cron job schedule for backups
    -
    - - -
    - -
    - -
    -
    -
    - 👨‍💻 -

    Web dev & DevOps

    - -
    -
    - -
    - - -
    -
    - -
    -
    Create self-signed certificate for local use
    - -
    - -
    -
    Port forward a remote port to a local one
    -
    Very handy for using local software with remote data
    -
    - MySQL example: - ssh user@server -L 3307:localhost:3306 -
    -
    - localhost:3307 now works locally as localhost:3306 works on the server
    - -
    - - -
    -
    XMLHttpRequest for formdata
    -
    - - -
    - -
    - -
    -
    -
    - 🪟 -

    Windows

    - -
    -
    - -
    - - -
    -
    - -
    -
    Create a self-signed certificate
    -
    -NOTE: Requires admin
    -
    - -
    -
    Install Chocolatey
    -
    -NOTE: Requires admin
    -
    - - -
    - -
    - - - - - - - -
    -
    - - - - - - - - diff --git a/dist/entries/drafts/index.html b/dist/entries/drafts/index.html deleted file mode 100644 index 52b0a00..0000000 --- a/dist/entries/drafts/index.html +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - - - - bjornar.dev - - - - - - - - - - - - - - - - - - - - - - - - -
    - - -
    - -

    2021/05/11/simple-captcha

    -

    2021/05/11/pfsense-local-networking

    -

    2021/05/11/k8-paas-at-home

    -

    2021/04/28/obs-ninja

    -
    -
    - - - - - - - - - - diff --git a/dist/entries/index.html b/dist/entries/index.html deleted file mode 100644 index 1b0a24b..0000000 --- a/dist/entries/index.html +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - - - - Posts | Bjørnar Hagen - - - - - - - - - - - - - - - - - - - - - - -
    - - -
    -
    -
    -
    -
    - -
    -
    -

    Posts

    -
    -
    -

    Posts

    -
    -
    -

    - Photo by Kenshi Kingami -

    -
    -
    -
    -
    - -
    -
    - -
    - -

    - Good money. -

    -

    - - Economy - - Opinion - -

    -
    -
    I don't believe we shall ever have a good money again before we take the thing out of the hands of government - F. A. Hayek
    -
    - -
    - -
    The number one priority for so many businesses these days seem to be to get your oh so precious consent in order track you with cookies, and don't you dare do anything on their website before you've given it!
    -
    - -
    -
    - -
    - -

    - How to add line numbers to pre tags -

    -

    - - UX - - Code - -

    -
    -
    Reading code is easier when you have line numbers, but how can you show line numbers in a <pre> tag? This can easily be solved with a few lines of JS and CSS, no need for a big external library.
    -
    - -
    -
    - -
    - -

    - UX tip for external links -

    -

    - - UX - - Code - -

    -
    -
    Clicking links going to an external site can be annoying if you aren't prepared for that. To improve the user experience you should show some kind of indicator for external links.
    -
    - -
    - - - - - - - - diff --git a/dist/entries/index.xml b/dist/entries/index.xml deleted file mode 100644 index 2264876..0000000 --- a/dist/entries/index.xml +++ /dev/null @@ -1,70 +0,0 @@ - - - - Posts on bjornar.dev - https://bjornar.dev/entries/ - Recent content in Posts on bjornar.dev - Hugo -- gohugo.io - en - Thu, 27 Apr 2023 01:00:39 +0200 - - - Good money. - https://bjornar.dev/entries/2022/03/15/good-money/ - Tue, 15 Mar 2022 01:33:00 +0000 - - https://bjornar.dev/entries/2022/03/15/good-money/ - I don&rsquo;t believe we shall ever have a good money again before we take the thing out of the hands of government - F. A. Hayek - - - - Are cookies really the most important thing for your business? - https://bjornar.dev/entries/2021/07/08/are-cookies-really-the-most-important-thing-for-your-business/ - Thu, 08 Jul 2021 22:04:54 +0000 - - https://bjornar.dev/entries/2021/07/08/are-cookies-really-the-most-important-thing-for-your-business/ - The number one priority for so many businesses these days seem to be to get your oh so precious consent in order track you with cookies, and don&rsquo;t you dare do anything on their website before you&rsquo;ve given it! - - - - How to add line numbers to pre tags - https://bjornar.dev/entries/2021/05/06/pre-line-numbers/ - Thu, 06 May 2021 14:25:01 +0000 - - https://bjornar.dev/entries/2021/05/06/pre-line-numbers/ - <p>Reading code is easier when you have line numbers, but how can you show line numbers in a <pre> tag? This can easily be solved with a few lines of JS and CSS, no need for a big external library.</p> - - - - - UX tip for external links - https://bjornar.dev/entries/2021/04/28/links/ - Wed, 28 Apr 2021 20:08:47 +0000 - - https://bjornar.dev/entries/2021/04/28/links/ - Clicking links going to an external site can be annoying if you aren&rsquo;t prepared for that. To improve the user experience you should show some kind of indicator for external links. - - - - Useful commands - https://bjornar.dev/entries/commands/ - Thu, 28 Jan 2021 20:08:47 +0000 - - https://bjornar.dev/entries/commands/ - Lists of commands I use often, but also forget often. - - - - - https://bjornar.dev/entries/drafts/ - Mon, 01 Jan 0001 00:00:00 +0000 - - https://bjornar.dev/entries/drafts/ - 2021/05/11/simple-captcha -2021/05/11/pfsense-local-networking -2021/05/11/k8-paas-at-home -2021/04/28/obs-ninja - - - - diff --git a/dist/favicon-16x16.png b/dist/favicon-16x16.png deleted file mode 100644 index 08d90b1..0000000 Binary files a/dist/favicon-16x16.png and /dev/null differ diff --git a/dist/favicon-32x32.png b/dist/favicon-32x32.png deleted file mode 100644 index f410aa3..0000000 Binary files a/dist/favicon-32x32.png and /dev/null differ diff --git a/dist/favicon.ico b/dist/favicon.ico deleted file mode 100644 index 8da3e89..0000000 Binary files a/dist/favicon.ico and /dev/null differ diff --git a/dist/fonts/eb-garamond/eb-garamond.css b/dist/fonts/eb-garamond/eb-garamond.css deleted file mode 100644 index 84c6854..0000000 --- a/dist/fonts/eb-garamond/eb-garamond.css +++ /dev/null @@ -1,19 +0,0 @@ -@font-face { - font-family: 'EB Garamond'; - font-style: normal; - font-weight: 400; - font-display: swap; - src: url(/fonts/eb-garamond/eb-garamond.woff2) format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, - U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} - -@font-face { - font-family: 'EB Garamond'; - font-style: normal; - font-weight: 700; - font-display: swap; - src: url(/fonts/eb-garamond/eb-garamond.woff2) format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, - U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} diff --git a/dist/fonts/eb-garamond/eb-garamond.woff2 b/dist/fonts/eb-garamond/eb-garamond.woff2 deleted file mode 100644 index bea240c..0000000 Binary files a/dist/fonts/eb-garamond/eb-garamond.woff2 and /dev/null differ diff --git a/dist/fonts/fira-code/fira-code.css b/dist/fonts/fira-code/fira-code.css deleted file mode 100644 index 4d9d108..0000000 --- a/dist/fonts/fira-code/fira-code.css +++ /dev/null @@ -1,29 +0,0 @@ -@font-face { - font-family: 'Fira Code'; - font-style: normal; - font-weight: 300; - font-display: swap; - src: url(/fonts/fira-code/fira-code.woff2) format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, - U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} - -@font-face { - font-family: 'Fira Code'; - font-style: normal; - font-weight: 400; - font-display: swap; - src: url(/fonts/fira-code/fira-code.woff2) format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, - U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} - -@font-face { - font-family: 'Fira Code'; - font-style: normal; - font-weight: 700; - font-display: swap; - src: url(/fonts/fira-code/fira-code.woff2) format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, - U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} diff --git a/dist/fonts/fira-code/fira-code.woff2 b/dist/fonts/fira-code/fira-code.woff2 deleted file mode 100644 index be2f730..0000000 Binary files a/dist/fonts/fira-code/fira-code.woff2 and /dev/null differ diff --git a/dist/images/brand/logo/emblem.svg b/dist/images/brand/logo/emblem.svg deleted file mode 100644 index 6a26bba..0000000 --- a/dist/images/brand/logo/emblem.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/dist/images/brand/logo/logo-black.png b/dist/images/brand/logo/logo-black.png deleted file mode 100644 index af27fcf..0000000 Binary files a/dist/images/brand/logo/logo-black.png and /dev/null differ diff --git a/dist/images/brand/logo/logo-dark.svg b/dist/images/brand/logo/logo-dark.svg deleted file mode 100644 index 539ce9a..0000000 --- a/dist/images/brand/logo/logo-dark.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - diff --git a/dist/images/brand/logo/logo-light.svg b/dist/images/brand/logo/logo-light.svg deleted file mode 100644 index 7aa1644..0000000 --- a/dist/images/brand/logo/logo-light.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - diff --git a/dist/images/brand/logo/logo-white.png b/dist/images/brand/logo/logo-white.png deleted file mode 100644 index d195ae1..0000000 Binary files a/dist/images/brand/logo/logo-white.png and /dev/null differ diff --git a/dist/images/brand/logo/workmark.svg b/dist/images/brand/logo/workmark.svg deleted file mode 100644 index 9c92f03..0000000 --- a/dist/images/brand/logo/workmark.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/dist/images/entries/index.jpg b/dist/images/entries/index.jpg deleted file mode 100644 index 4dc722d..0000000 Binary files a/dist/images/entries/index.jpg and /dev/null differ diff --git a/dist/images/entries/index@0,5x.jpg b/dist/images/entries/index@0,5x.jpg deleted file mode 100644 index fa32578..0000000 Binary files a/dist/images/entries/index@0,5x.jpg and /dev/null differ diff --git a/dist/images/graphics/bjornar-hagen/bg.jpg b/dist/images/graphics/bjornar-hagen/bg.jpg deleted file mode 100644 index fa46577..0000000 Binary files a/dist/images/graphics/bjornar-hagen/bg.jpg and /dev/null differ diff --git a/dist/images/graphics/bjornar-hagen/bg@0,5x.jpg b/dist/images/graphics/bjornar-hagen/bg@0,5x.jpg deleted file mode 100644 index 199cde4..0000000 Binary files a/dist/images/graphics/bjornar-hagen/bg@0,5x.jpg and /dev/null differ diff --git a/dist/images/graphics/bjornar-hagen/fg.png b/dist/images/graphics/bjornar-hagen/fg.png deleted file mode 100644 index ec5a3e3..0000000 Binary files a/dist/images/graphics/bjornar-hagen/fg.png and /dev/null differ diff --git a/dist/images/graphics/bjornar-hagen/fg@0,5x.png b/dist/images/graphics/bjornar-hagen/fg@0,5x.png deleted file mode 100644 index 95fe269..0000000 Binary files a/dist/images/graphics/bjornar-hagen/fg@0,5x.png and /dev/null differ diff --git a/dist/images/graphics/cookies.jpg b/dist/images/graphics/cookies.jpg deleted file mode 100644 index f915e56..0000000 Binary files a/dist/images/graphics/cookies.jpg and /dev/null differ diff --git a/dist/images/graphics/cookies@0,5x.jpg b/dist/images/graphics/cookies@0,5x.jpg deleted file mode 100644 index 2ce1553..0000000 Binary files a/dist/images/graphics/cookies@0,5x.jpg and /dev/null differ diff --git a/dist/images/loading-dark.svg b/dist/images/loading-dark.svg deleted file mode 100644 index 6d021e9..0000000 --- a/dist/images/loading-dark.svg +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/dist/images/loading-light.svg b/dist/images/loading-light.svg deleted file mode 100644 index bc3ab97..0000000 --- a/dist/images/loading-light.svg +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/dist/index.html b/dist/index.html deleted file mode 100644 index 6d8b105..0000000 --- a/dist/index.html +++ /dev/null @@ -1,192 +0,0 @@ - - - - - - - - - - bjornar.dev - - - - - - - - - - - - - - - - - - - - - - -
    - - -
    -
    -
    -
    -
    - - -
    -
    -

    - Hi👋 - - I'm - Bjørnar - Hagen, - designer & engineer. -

    -
    -
    -
    -
    -
    - -
    -
    - 01 -

    Personal

    -
    -
    -
    -

    Born and raised in Larvik, Norway. Currently living in Sandefjord with my lovely wife and our cute dog.

    -

    I’ve always loved building and taking things apart, so when I at a young age was introduced to computers, it -didn’t take very long before I was taking them apart and learning about how they worked. When I was 14 I saved -up scholarship money originally ment for school equipment to instead buy computer parts so I could build my -first desktop computer. Once I had built the computer I started learning about code and software. I was -instantly facinated with the web technologies and building websites. Since then I’ve learnt more and more -about programming and different software techologies.

    -

    When I’m not in front of the computer I love hiking, gaming and losing money on stocks and crypto :)

    -
    -
    -
    -
    - -
    -
    - 02 -

    Career

    -
    -
    -
    -

    I learnt HTML, CSS, JS and PHP through self study and got a few gigs through some close friends. Later on I -got my first real job as an apprentice at Optimale Systemer in Larvik. Around the same time I met my now wife, -we started the company Datahjelpen together so we could take on extra jobs outside of work and school.

    -

    After 2 years at Optimale Systemer I had learned a lot and considered myself a full-stack web developer, -though still very much a junior. I then moved to Halden to start my Bachelor of Science in Computer -Engineering at Østfold College University.

    -

    3 years later I got my degree and moved to Sandefjord. I started working full-time in Datahjelpen. After about -a year, Covid hit and I had to find a more stable job as no one was really willing to start new projects at -the time. That is how I ended up at Adstate, where I currently work. I still run Datahjelpen, though it’s more -of a hobby as of right now.

    -
    -
    -
    -

    Work experience

    -
      -
    • -

      Adstate

      -

      Full-stack developer

      -

      2020 ⟶ present

      -
    • -
    • -

      Datahjelpen

      -

      CEO, developer & designer

      -

      2016 ⟶ present

      -
    • -
    • -

      Optimale Systemer

      -

      Developer

      -

      2014 ⟶ 2016

      -
    • -
    -
    -

    Devloper experience

    -
      -
    • HTML
    • -
    • CSS, SASS
    • -
    • JS, ES6, NodeJS
    • -
    • React, Vue, Angular
    • -
    • PHP, Wordpress, Laravel
    • -
    • MySQL
    • -
    • Git
    • -
    • Docker, k8s, Helm
    • -
    -

    Other experience

    -
      -
    • Figma
    • -
    • Photoshop
    • -
    - -
    -
    -
    - - - - - - - - diff --git a/dist/index.xml b/dist/index.xml deleted file mode 100644 index de5ed77..0000000 --- a/dist/index.xml +++ /dev/null @@ -1,158 +0,0 @@ - - - - bjornar.dev - https://bjornar.dev/ - Recent content on bjornar.dev - Hugo -- gohugo.io - en - Tue, 04 Jul 2023 13:35:00 +0000 - - - Good money. - https://bjornar.dev/entries/2022/03/15/good-money/ - Tue, 15 Mar 2022 01:33:00 +0000 - - https://bjornar.dev/entries/2022/03/15/good-money/ - I don&rsquo;t believe we shall ever have a good money again before we take the thing out of the hands of government - F. A. Hayek - - - - Are cookies really the most important thing for your business? - https://bjornar.dev/entries/2021/07/08/are-cookies-really-the-most-important-thing-for-your-business/ - Thu, 08 Jul 2021 22:04:54 +0000 - - https://bjornar.dev/entries/2021/07/08/are-cookies-really-the-most-important-thing-for-your-business/ - The number one priority for so many businesses these days seem to be to get your oh so precious consent in order track you with cookies, and don&rsquo;t you dare do anything on their website before you&rsquo;ve given it! - - - - How to add line numbers to pre tags - https://bjornar.dev/entries/2021/05/06/pre-line-numbers/ - Thu, 06 May 2021 14:25:01 +0000 - - https://bjornar.dev/entries/2021/05/06/pre-line-numbers/ - <p>Reading code is easier when you have line numbers, but how can you show line numbers in a <pre> tag? This can easily be solved with a few lines of JS and CSS, no need for a big external library.</p> - - - - - UX tip for external links - https://bjornar.dev/entries/2021/04/28/links/ - Wed, 28 Apr 2021 20:08:47 +0000 - - https://bjornar.dev/entries/2021/04/28/links/ - Clicking links going to an external site can be annoying if you aren&rsquo;t prepared for that. To improve the user experience you should show some kind of indicator for external links. - - - - Useful commands - https://bjornar.dev/entries/commands/ - Thu, 28 Jan 2021 20:08:47 +0000 - - https://bjornar.dev/entries/commands/ - Lists of commands I use often, but also forget often. - - - - - https://bjornar.dev/cookies/ - Mon, 01 Jan 0001 00:00:00 +0000 - - https://bjornar.dev/cookies/ - What does that mean? No tracking of any kind. The website only use cookies for functionality. -What kind of functionality? Only for remembering your selection for dark/light mode, and only if you have selected it at all by clicking the button in the footer. Otherwise dark/light mode is based on the time of day. -I want to delete my cookies. Clear cookies - - - - - https://bjornar.dev/entries/drafts/ - Mon, 01 Jan 0001 00:00:00 +0000 - - https://bjornar.dev/entries/drafts/ - 2021/05/11/simple-captcha -2021/05/11/pfsense-local-networking -2021/05/11/k8-paas-at-home -2021/04/28/obs-ninja - - - - - https://bjornar.dev/index/section-2-2/ - Mon, 01 Jan 0001 00:00:00 +0000 - - https://bjornar.dev/index/section-2-2/ - Work experience Adstate Full-stack developer -2020 ⟶ present -Datahjelpen CEO, developer &amp; designer -2016 ⟶ present -Optimale Systemer Developer -2014 ⟶ 2016 -Devloper experience HTML CSS, SASS JS, ES6, NodeJS React, Vue, Angular PHP, Wordpress, Laravel MySQL Git Docker, k8s, Helm Other experience Figma Photoshop - - - - - https://bjornar.dev/ipsum/ - Mon, 01 Jan 0001 00:00:00 +0000 - - https://bjornar.dev/ipsum/ - &lt;h1&gt;Didn't melt fairer keepsakes since Fellowship elsewhere.&lt;/h1&gt; &lt;p&gt;Woodlands payment Osgiliath tightening. Barad-dur follow belly comforts tender tough bell? Many that live deserve death. Some that die deserve life. Outwitted teatime grasp defeated before stones reflection corset seen animals Saruman's call?&lt;/p&gt; &lt;h2&gt;Tad survive ensnare joy mistake courtesy Bagshot Row.&lt;/h2&gt; &lt;p&gt;Ligulas step drops both? You shall not pass! Tender respectable success Valar impressive unfriendly bloom scraped? Branch hey-diddle-diddle pony trouble'll sleeping during jump Narsil. - - - - - https://bjornar.dev/now/ - Mon, 01 Jan 0001 00:00:00 +0000 - - https://bjornar.dev/now/ - 👨‍💻 Next.js 13, MUI &amp; Hugo Learning Next.js and MUI to build components and web apps at work. Then I&rsquo;m learning Hugo to rebuild some old sites (including this one). -📖 Fraudcoin Reading this book by Rune Østgård -🍄 The Last of Us Currently watching this show -🥃 Yushan - Sherry Cask Drinking this - - - - - https://bjornar.dev/webring/ - Mon, 01 Jan 0001 00:00:00 +0000 - - https://bjornar.dev/webring/ - https://webring.xxiivv.com/ -https://🕸💍.ws/ -https://digdeeper.neocities.org/ -https://spyware.neocities.org/ - - - - ᎒᎒᎒ Menu - https://bjornar.dev/menu/ - Mon, 01 Jan 0001 00:00:00 +0000 - - https://bjornar.dev/menu/ - Pages Index /now Posts Portfolio Cookies Webring Social profiles Github LinkedIn Dribbble Tools &amp; services /_/startpage /_/editor _/calendars /entries/commands Extra /menu (This page) - - - - Career - https://bjornar.dev/index/section-2-1/ - Mon, 01 Jan 0001 00:00:00 +0000 - - https://bjornar.dev/index/section-2-1/ - I learnt HTML, CSS, JS and PHP through self study and got a few gigs through some close friends. Later on I got my first real job as an apprentice at Optimale Systemer in Larvik. Around the same time I met my now wife, we started the company Datahjelpen together so we could take on extra jobs outside of work and school. -After 2 years at Optimale Systemer I had learned a lot and considered myself a full-stack web developer, though still very much a junior. - - - - Personal - https://bjornar.dev/index/section-1/ - Mon, 01 Jan 0001 00:00:00 +0000 - - https://bjornar.dev/index/section-1/ - Born and raised in Larvik, Norway. Currently living in Sandefjord with my lovely wife and our cute dog. -I&rsquo;ve always loved building and taking things apart, so when I at a young age was introduced to computers, it didn&rsquo;t take very long before I was taking them apart and learning about how they worked. When I was 14 I saved up scholarship money originally ment for school equipment to instead buy computer parts so I could build my first desktop computer. - - - - diff --git a/dist/index/index.html b/dist/index/index.html deleted file mode 100644 index 49d4154..0000000 --- a/dist/index/index.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - - - indices | Bjørnar Hagen - - - - - - - - - - - - - - - - - - - - - - -
    - - -
    -
    -
    -
    -
    - -
    -
    -

    Posts

    -
    -
    -

    Posts

    -
    -
    -

    - Photo by Kenshi Kingami -

    -
    -
    -
    -
    - -
    -
    - -

    - Career -

    -

    - -

    -
    -
    -
    - -
    -
    - -

    - Personal -

    -

    - -

    -
    -
    -
    - -
    - - - - - - - - diff --git a/dist/index/index.xml b/dist/index/index.xml deleted file mode 100644 index ed106b4..0000000 --- a/dist/index/index.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - indices on bjornar.dev - https://bjornar.dev/index/ - Recent content in indices on bjornar.dev - Hugo -- gohugo.io - en - - - https://bjornar.dev/index/section-2-2/ - Mon, 01 Jan 0001 00:00:00 +0000 - - https://bjornar.dev/index/section-2-2/ - Work experience Adstate Full-stack developer -2020 ⟶ present -Datahjelpen CEO, developer &amp; designer -2016 ⟶ present -Optimale Systemer Developer -2014 ⟶ 2016 -Devloper experience HTML CSS, SASS JS, ES6, NodeJS React, Vue, Angular PHP, Wordpress, Laravel MySQL Git Docker, k8s, Helm Other experience Figma Photoshop - - - - Career - https://bjornar.dev/index/section-2-1/ - Mon, 01 Jan 0001 00:00:00 +0000 - - https://bjornar.dev/index/section-2-1/ - I learnt HTML, CSS, JS and PHP through self study and got a few gigs through some close friends. Later on I got my first real job as an apprentice at Optimale Systemer in Larvik. Around the same time I met my now wife, we started the company Datahjelpen together so we could take on extra jobs outside of work and school. -After 2 years at Optimale Systemer I had learned a lot and considered myself a full-stack web developer, though still very much a junior. - - - - Personal - https://bjornar.dev/index/section-1/ - Mon, 01 Jan 0001 00:00:00 +0000 - - https://bjornar.dev/index/section-1/ - Born and raised in Larvik, Norway. Currently living in Sandefjord with my lovely wife and our cute dog. -I&rsquo;ve always loved building and taking things apart, so when I at a young age was introduced to computers, it didn&rsquo;t take very long before I was taking them apart and learning about how they worked. When I was 14 I saved up scholarship money originally ment for school equipment to instead buy computer parts so I could build my first desktop computer. - - - - diff --git a/dist/index/section-1/index.html b/dist/index/section-1/index.html deleted file mode 100644 index 1865a95..0000000 --- a/dist/index/section-1/index.html +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - - - - Personal | Bjørnar Hagen - - - - - - - - - - - - - - - - - - - - - - - - -
    - - -
    - -
    -
    -
    -

    Personal

    -
    -
    - -
    -
    - -
    - -

    Born and raised in Larvik, Norway. Currently living in Sandefjord with my lovely wife and our cute dog.

    -

    I’ve always loved building and taking things apart, so when I at a young age was introduced to computers, it -didn’t take very long before I was taking them apart and learning about how they worked. When I was 14 I saved -up scholarship money originally ment for school equipment to instead buy computer parts so I could build my -first desktop computer. Once I had built the computer I started learning about code and software. I was -instantly facinated with the web technologies and building websites. Since then I’ve learnt more and more -about programming and different software techologies.

    -

    When I’m not in front of the computer I love hiking, gaming and losing money on stocks and crypto :)

    -
    -
    - - - - - - - - - - diff --git a/dist/index/section-2-1/index.html b/dist/index/section-2-1/index.html deleted file mode 100644 index 01f7209..0000000 --- a/dist/index/section-2-1/index.html +++ /dev/null @@ -1,105 +0,0 @@ - - - - - - - - - Career | Bjørnar Hagen - - - - - - - - - - - - - - - - - - - - - - - - -
    - - -
    - -
    -
    -
    -

    Career

    -
    -
    - -
    -
    - -
    - -

    I learnt HTML, CSS, JS and PHP through self study and got a few gigs through some close friends. Later on I -got my first real job as an apprentice at Optimale Systemer in Larvik. Around the same time I met my now wife, -we started the company Datahjelpen together so we could take on extra jobs outside of work and school.

    -

    After 2 years at Optimale Systemer I had learned a lot and considered myself a full-stack web developer, -though still very much a junior. I then moved to Halden to start my Bachelor of Science in Computer -Engineering at Østfold College University.

    -

    3 years later I got my degree and moved to Sandefjord. I started working full-time in Datahjelpen. After about -a year, Covid hit and I had to find a more stable job as no one was really willing to start new projects at -the time. That is how I ended up at Adstate, where I currently work. I still run Datahjelpen, though it’s more -of a hobby as of right now.

    -
    -
    - - - - - - - - - - diff --git a/dist/index/section-2-2/index.html b/dist/index/section-2-2/index.html deleted file mode 100644 index 2aa0ecb..0000000 --- a/dist/index/section-2-2/index.html +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - - - - bjornar.dev - - - - - - - - - - - - - - - - - - - - - - - - -
    - - -
    - -

    Work experience

    -
      -
    • -

      Adstate

      -

      Full-stack developer

      -

      2020 ⟶ present

      -
    • -
    • -

      Datahjelpen

      -

      CEO, developer & designer

      -

      2016 ⟶ present

      -
    • -
    • -

      Optimale Systemer

      -

      Developer

      -

      2014 ⟶ 2016

      -
    • -
    -
    -

    Devloper experience

    -
      -
    • HTML
    • -
    • CSS, SASS
    • -
    • JS, ES6, NodeJS
    • -
    • React, Vue, Angular
    • -
    • PHP, Wordpress, Laravel
    • -
    • MySQL
    • -
    • Git
    • -
    • Docker, k8s, Helm
    • -
    -

    Other experience

    -
      -
    • Figma
    • -
    • Photoshop
    • -
    -
    -
    - - - - - - - - - - diff --git a/dist/ipsum/index.html b/dist/ipsum/index.html deleted file mode 100644 index 72728d9..0000000 --- a/dist/ipsum/index.html +++ /dev/null @@ -1,335 +0,0 @@ - - - - - - - - - bjornar.dev - - - - - - - - - - - - - - - - - - - - - - -
    - - -
    -
    -
    -
    - -
    -
    -
    -
    <h1>Didn't melt fairer keepsakes since Fellowship elsewhere.</h1>
    -<p>Woodlands payment Osgiliath tightening. Barad-dur follow belly comforts tender tough bell? Many that live deserve death. Some that die deserve life. Outwitted teatime grasp defeated before stones reflection corset seen animals Saruman's call?</p>
    -<h2>Tad survive ensnare joy mistake courtesy Bagshot Row.</h2>
    -<p>Ligulas step drops both? You shall not pass! Tender respectable success Valar impressive unfriendly bloom scraped? Branch hey-diddle-diddle pony trouble'll sleeping during jump Narsil.</p>
    -<h3>North valor overflowing sort Iáve mister kingly money?</h3>
    -<p>Curse you and all the halflings! Deserted anytime Lake-town burned caves balls. Smoked lthilien forbids Thrain?</p>
    -<ul>
    -  <li>Adamant.</li>
    -  <li>Southfarthing!</li>
    -  <li>Witch-king.</li>
    -  <li>Precious.</li>
    -  <li>Gaffer's!</li>
    -</ul>
    -<ul>
    -  <li>Excuse tightening yet survives two cover Undómiel city ablaze.</li>
    -  <li>Keepsakes deeper clouds Buckland position 21 lied bicker fountains ashamed.</li>
    -  <li>Women rippling cold steps rules Thengel finer.</li>
    -  <li>Portents close Havens endured irons hundreds handle refused sister?</li>
    -  <li>Harbor Grubbs fellas riddles afar!</li>
    -</ul>
    -<img src="/entries/index@0,5x.jpg" alt="">
    -<h3>Narsil enjoying shattered bigger leaderless retrieve dreamed dwarf.</h3>
    -<p>Ravens wonder wanted runs me crawl gaining lots faster! Khazad-dum surprise baby season ranks. I bid you all a very fond farewell.</p>
    -<ol>
    -  <li>Narsil.</li>
    -  <li>Elros.</li>
    -  <li>Arwen Evenstar.</li>
    -  <li>Maggot's?</li>
    -  <li>Bagginses?</li>
    -</ol>
    -<ol>
    -  <li>Concerning Hobbits l golf air fifth bell prolonging camp.</li>
    -  <li>Grond humble rods nearest mangler.</li>
    -  <li>Enormity Lórien merry gravy stayed move.</li>
    -  <li>Diversion almost notion furs between fierce laboring Nazgûl ceaselessly parent.</li>
    -  <li>Agree ruling um wasteland Bagshot Row expect sleep.</li>
    -</ol>
    -<h3>Ere answering track forests shards roof!</h3>
    -<p>Delay freezes Gollum. Let the Ring-bearer decide. Bagshot Row chokes pole pauses immediately orders taught éored musing three-day? Disease rune repel source fire Goblinses already?</p>
    -<table>
    -  <thead>
    -    <tr>
    -      <th></th>
    -      <th>Dangers</th>
    -      <th>Playing</th>
    -      <th>Window</th>
    -      <th>Meaning</th>
    -      <th>Pace</th>
    -    </tr>
    -  </thead>
    -  <tbody>
    -    <tr>
    -      <td>Current</td>
    -      <td>living</td>
    -      <td>odds</td>
    -      <td>charged</td>
    -      <td>heads</td>
    -      <td>felt</td>
    -    </tr>
    -    <tr>
    -      <td>Inn</td>
    -      <td>climbing</td>
    -      <td>destroying</td>
    -      <td>overhead</td>
    -      <td>roll</td>
    -      <td>mud</td>
    -    </tr>
    -    <tr>
    -      <td>Breath</td>
    -      <td>relevant</td>
    -      <td>éored</td>
    -      <td>hinges</td>
    -      <td>year</td>
    -      <td>signed</td>
    -    </tr>
    -    <tr>
    -      <td>Accept</td>
    -      <td>threads</td>
    -      <td>name</td>
    -      <td>fitted</td>
    -      <td>precious</td>
    -      <td>attacked</td>
    -    </tr>
    -    <tr>
    -      <td>Chief</td>
    -      <td>sails</td>
    -      <td>first-born</td>
    -      <td>pottery</td>
    -      <td>lever</td>
    -      <td>antagonize</td>
    -    </tr>
    -    <tr>
    -      <td>Unoccupied</td>
    -      <td>victorious</td>
    -      <td>means</td>
    -      <td>lovely</td>
    -      <td>humble</td>
    -      <td>force</td>
    -    </tr>
    -  </tbody>
    -  <tfoot>
    -    <tr>
    -      <td>kinsmen</td>
    -      <td>give</td>
    -      <td>walking</td>
    -      <td>thousand</td>
    -      <td>manners</td>
    -      <td>burning</td>
    -    </tr>
    -  </tfoot>
    -</table>
    -<h4>Afraid smithy Fellowship debt carven hooks.</h4>
    -<p>What about second breakfast? Nags runt near Lindir lock discover level? Andûril breathe waited flatten union.</p>
    -<blockquote>
    -  <p>You shall be the Fellowship of the Ring.</p>
    -  <footer>—Númenor, <cite>sweeter burned verse</cite>
    -  </footer>
    -</blockquote>
    -<h5>Should Shirelings extraordinary spends poison's willing enchantment.</h5>
    -<p>I think we should get off the road. Penalty sight splintered Misty Mountain mithril? Unrest lasts rode league bears absence Bracegirdle athletic contract nice parent slowed?</p>
    -<pre>Pardon Concerning Hobbits rune goblins? Twitching figure including rightful Thorin's level! Worth tubers threats Hornburg deadliest? Unfold thumping shh wants Homely!</pre>
    -
    -
    Improve drops absolutely tight deceit potent Treebeard startled!
    -

    J.R.R. Tolkien 3000 uttered veins roaring winds moaning flaming. Meddle measure pure Samwise Gamgee business! Lied mistake Proudfoots pon. Instance 80 morbid ceremonial plunge Anor mad. Questions shells hangs noble Proudfoots throws. Rampart damage questions Chubbs 3000 conjurer? Single tempt peasants Bolg Athelas Mordor Wraiths Azog Undómiel mangler? Nori Giants Undómiel Rivendell spike posts took. Fool's Underhill boarded vanishing twilight unheard-of. Presence Dunland lamb lair. Barricade didn't feelings purring vine Morgoth. Distract Giants nearing champion T. Clothing titles quick bother Arod Gloin Beren troop? Balls crashing bastards arrives precisely rascal stubbornness Snowbourn. Hobbitses rose barren strengths tested mirrors moonlight password center? Remade free filthy breaking respect amuse Arod? Vengeance Elessar Wolves posts remain doorway said! fight Merry hungers locked yelp.

    -
    -
    -
    Abandon
    -
    Tact flies disturber thinking hospitality Elros act vest handy ranks.
    -
    Devil
    -
    Boneses spilled Caradhras hungry pace lanterns glory haunted shone forging.
    -
    Unprotected Beorn's fireworks dream journey beacon dwells gnaws key.
    -
    Happened
    -
    Known wanna fifth Bill hell knew she scale.
    -
    Missing vanish taken colleague sway voice tricks 13 Grimbold.
    -
    Thereof skills kingsfoil innocent riding light Thorin Oakenshield won.
    -
    -
    -
    - Blind kitchen -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    -
    - Chasm mountains mountainside -
    - - -
    -
    - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - - - -
    -
    - - -
    -
    - -
    -
    - -
    -
    - -
    - -
    - - -
    -
    -
    -
    -
    - - - - - - - - diff --git a/dist/js/clear-cookies.js b/dist/js/clear-cookies.js deleted file mode 100644 index e30aa41..0000000 --- a/dist/js/clear-cookies.js +++ /dev/null @@ -1,16 +0,0 @@ -;(function () { - const button = document.querySelector('#cookies-page-clear-button') - const statusDisplay = document.createElement('p') - button.parentNode.appendChild(statusDisplay) - - button.addEventListener('click', function () { - Cookies.clear() - Cookies.remove('') - - statusDisplay.textContent = 'Done!' - - setTimeout(function () { - statusDisplay.textContent = '' - }, 3000) - }) -})() diff --git a/dist/js/entries.js b/dist/js/entries.js deleted file mode 100644 index 0aea390..0000000 --- a/dist/js/entries.js +++ /dev/null @@ -1,77 +0,0 @@ -;(function () { - try { - tryToFindJsonFile('/entries/index.json').then((r) => { - updateEntries(r.entries) - - const entries = [] - r.entries.forEach((entry, i) => { - tryToFindJsonFile('/entries/' + entry.path + '.json').then((entryData) => { - entry.data = entryData - if (!entry.data.summary) { - try { - const text = entry.data.content[0].text - entry.data.summary = text.substr(0, 200).trim() - - if (text.length > 200) { - entry.data.summary += '...' - } - } catch (e) {} - } - entries[i] = entry - }) - }) - - let interval = setInterval(() => { - if (entries.length === r.entries.length) { - updateEntries(entries) - clearInterval(interval) - interval = null - } - }, 100) - setTimeout(() => { - if (interval) { - clearInterval(interval) - showError() - } - }, 1000) - }) - } catch (error) { - console.error(error) - showError() - } -})() - -function tryToFindJsonFile(path) { - return new Promise((resolve, reject) => { - fetch(path) - .then((r) => r.json()) - .then((r) => { - resolve(r) - }) - .catch((e) => reject(e)) - }) -} - -function showError() { - const entries = [ - { - data: { - title: 'Something went wrong', - categories: [], - content: [{ text: 'Posts could not be loaded. Please try again later.' }], - }, - }, - ] - - updateEntries(entries) -} - -function updateEntries(entries) { - window.dispatchEvent( - new CustomEvent('entries-load', { - detail: { - entries, - }, - }) - ) -} diff --git a/dist/js/entry.js b/dist/js/entry.js deleted file mode 100644 index 5dbbde9..0000000 --- a/dist/js/entry.js +++ /dev/null @@ -1,149 +0,0 @@ -; (function () { - const path = window.location.pathname - const splitPath = path.split('/entries/') - - if (splitPath.length === 2) { - tryToFindPost(splitPath[1]) - .then((r) => { - const entry = { ...r } - entry.content = [] - r.content.forEach((contentItem) => { - contentItem.text = marked(contentItem.text) - entry.content.push(contentItem) - }) - - if (entry.posterImage) { - const image = new Image() - image.src = entry.posterImage - image.addEventListener('load', () => { - updateEntry({ ...entry, posterImage: image.src }) - }) - - const loadingImageTheme = window.theme === 'dark' ? 'light' : 'dark' - entry.posterImage = '/images/loading-' + loadingImageTheme + '.svg' - } - - updateEntry(entry) - }) - .catch((e) => { - _404() - }) - } -})() - -function tryToFindPost(path) { - return new Promise((resolve, reject) => { - fetch('/entries/' + path + '.json') - .then((r) => r.json()) - .then((r) => { - resolve(r) - }) - .catch((e) => reject(e)) - }) -} - -function _404() { - const entry = { - title: '404 — Not found', - posterImage: '/entries/index.jpg', - } - updateEntry(entry) -} - -function updateEntry(entry) { - const event = new CustomEvent('entry-load', { - detail: { - entry, - }, - }) - window.dispatchEvent(event) - - try { - updateSEO(entry) - - setTimeout(() => { - // addLineNumbersToPres() - addTargetBlankToExternalLinks() - }, 10) - } catch (error) { - console.error(error) - } -} - -function addLineNumbersToPres() { - const pres = document.querySelectorAll('pre') - pres.forEach((pre) => { - if (!pre.hasLineNumbers) { - pre.hasLineNumbers = true - const lineNumberWrapper = document.createElement('span') - lineNumberWrapper.classList.add('pre-line-numbers') - - const preLines = pre.textContent.split('\n').length - - for (let i = 0; i < preLines - 1; i++) { - const span = document.createElement('span') - span.appendChild(document.createTextNode(i)) - lineNumberWrapper.appendChild(span) - } - - pre.insertBefore(lineNumberWrapper, pre.firstChild) - } - }) -} - -// Add target="_blank" and rel="noopener" to external links -function addTargetBlankToExternalLinks() { - let internalDomain = location.host.replace('www.', '') - internalDomain = new RegExp(internalDomain, 'i') - - const links = document.getElementsByTagName('a') - for (let i = 0; i < links.length; i++) { - const link = links[i] - - if (!internalDomain.test(link.host)) { - link.setAttribute('target', '_blank') - link.setAttribute('rel', 'noopener') - } - } -} - -function updateSEO(entry) { - // Title - const titleElement = document.querySelector('head title') - if (titleElement.innerHTML.indexOf(entry.title) === -1) { - titleElement.innerHTML = titleElement.innerHTML.replace('Post | ', entry.title + ' | ') - } - - // Open Graph title - const metaTitle = document.querySelector('head meta[property="og:title"]') - if (metaTitle.getAttribute('content').indexOf(entry.title) === -1) { - metaTitle.setAttribute('content', metaTitle.getAttribute('content').replace('Post | ', entry.title + ' | ')) - } - - // Meta description and Open Graph description - const metaDescriptions = [ - document.querySelector('head meta[name="description"]'), - document.querySelector('head meta[property="og:description"]'), - ] - metaDescriptions.forEach((metaDescription) => metaDescription.setAttribute('content', entry.summary)) - - // Open Graph image - const metaImage = document.querySelector('head meta[property="og:image"]') - metaImage.setAttribute('content', entry.posterImage) - - // Open Graph type - const metaType = document.querySelector('head meta[property="og:type"]') - metaType.setAttribute('content', 'article') - - // Open Graph URL - const metaUrl = document.querySelector('head meta[property="og:url"]') - if (metaUrl.getAttribute('content').indexOf(window.location.pathname) === -1) { - metaUrl.setAttribute('content', metaUrl.getAttribute('content') + window.location.pathname) - } - - // Open Graph URL - const linkCanonical = document.querySelector('head link[rel="canonical"]') - if (linkCanonical.getAttribute('href').indexOf(window.location.pathname) === -1) { - linkCanonical.setAttribute('href', linkCanonical.getAttribute('href') + window.location.pathname) - } -} diff --git a/dist/js/index.js b/dist/js/index.js deleted file mode 100644 index d9851a0..0000000 --- a/dist/js/index.js +++ /dev/null @@ -1,206 +0,0 @@ -;(function () { - let dayTimeNameMorning = '' - let dayTimeNameAfternoon = '' - let dayTimeNameEvening = '' - - const getDayTimeName = (currentTime = new Date()) => { - const currentHour = currentTime.getHours() - const splitMorning = 5 - const splitAfternoon = 12 - const splitEvening = 18 - - if (currentHour >= splitAfternoon && currentHour < splitEvening) { - // Between 12 and 18 - return dayTimeNameAfternoon - } else if (currentHour >= splitEvening || currentHour < splitMorning) { - // Between 18 and 00, or between 00 and 05 - return dayTimeNameEvening - } - // Between 05 and 12 - return dayTimeNameMorning - } - - function setupTheme() { - window.theme = 'dark' - const themeFromCookie = Cookies.get('theme') - - if (themeFromCookie && window.theme !== themeFromCookie) { - themeToggleClick() - } else if (!themeFromCookie) { - const dayTimeName = getDayTimeName() - if (window.theme === 'dark' && (dayTimeName === dayTimeNameAfternoon || dayTimeName === dayTimeNameMorning)) { - toggleTheme() - } - } - - const footerEl = document.querySelector('#footer') - if (!footerEl) { - return false - } - - const setThemeDarkEl = footerEl.querySelector('a[href="#dark"]') - const setThemeLightEl = footerEl.querySelector('a[href="#light"]') - if (!setThemeDarkEl || !setThemeLightEl) { - return false - } - - setThemeDarkEl.addEventListener('click', themeToggleClick) - setThemeLightEl.addEventListener('click', themeToggleClick) - - function themeToggleClick(event) { - if (event) { - event.preventDefault() - } - - toggleTheme() - Cookies.set('theme', window.theme) - } - - function setThemeClasses(oldTheme, newTheme) { - document.documentElement.classList.remove('theme-' + oldTheme) - document.documentElement.classList.add('theme-' + newTheme) - } - - function setThemeLogo(oldTheme, newTheme) { - const logoEl = document.querySelector('#nav .logo') - if (!logoEl) { - return false - } - - logoEl.src = logoEl.src.replace(newTheme, oldTheme) - } - - function toggleTheme() { - const oldTheme = window.theme - let newTheme = 'dark' - - if (oldTheme === 'dark') { - newTheme = 'light' - } - - window.theme = newTheme - - setThemeClasses(oldTheme, newTheme) - setThemeLogo(oldTheme, newTheme) - } - } - - function initDayTimeNames() { - const greetingEl = document.querySelector('#greeting') - - if (!greetingEl) { - return false - } - - dayTimeNameMorning = greetingEl.dataset.daytimenamemorning - dayTimeNameAfternoon = greetingEl.dataset.daytimenameafternoon - dayTimeNameEvening = greetingEl.dataset.daytimenameevening - } - - function setupGreeting() { - const greetingEl = document.querySelector('#greeting') - - if (!greetingEl) { - return false - } - - const dayTimeName = getDayTimeName() - greetingEl.innerText = dayTimeName - } - - /*! https://github.com/js-cookie/js-cookie | js-cookie v2.2.1 | MIT */ - !(function (a) { - var b - if ( - ('function' == typeof define && define.amd && (define(a), (b = !0)), - 'object' == typeof exports && ((module.exports = a()), (b = !0)), - !b) - ) { - var c = window.Cookies, - d = (window.Cookies = a()) - d.noConflict = function () { - return (window.Cookies = c), d - } - } - })(function () { - function a() { - for (var a = 0, b = {}; a < arguments.length; a++) { - var c = arguments[a] - for (var d in c) b[d] = c[d] - } - return b - } - function b(a) { - return a.replace(/(%[0-9A-Z]{2})+/g, decodeURIComponent) - } - function c(d) { - function e() {} - function f(b, c, f) { - if ('undefined' != typeof document) { - ;(f = a({ path: '/' }, e.defaults, f)), - 'number' == typeof f.expires && (f.expires = new Date(1 * new Date() + 864e5 * f.expires)), - (f.expires = f.expires ? f.expires.toUTCString() : '') - try { - var g = JSON.stringify(c) - ;/^[\{\[]/.test(g) && (c = g) - } catch (j) {} - ;(c = d.write - ? d.write(c, b) - : encodeURIComponent(c + '').replace( - /%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, - decodeURIComponent - )), - (b = encodeURIComponent(b + '') - .replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent) - .replace(/[\(\)]/g, escape)) - var h = '' - for (var i in f) f[i] && ((h += '; ' + i), !0 !== f[i] && (h += '=' + f[i].split(';')[0])) - return (document.cookie = b + '=' + c + h) - } - } - function g(a, c) { - if ('undefined' != typeof document) { - for (var e = {}, f = document.cookie ? document.cookie.split('; ') : [], g = 0; g < f.length; g++) { - var h = f[g].split('='), - i = h.slice(1).join('=') - c || '"' !== i.charAt(0) || (i = i.slice(1, -1)) - try { - var j = b(h[0]) - if (((i = (d.read || d)(i, j) || b(i)), c)) - try { - i = JSON.parse(i) - } catch (k) {} - if (((e[j] = i), a === j)) break - } catch (k) {} - } - return a ? e[a] : e - } - } - return ( - (e.set = f), - (e.get = function (a) { - return g(a, !1) - }), - (e.getJSON = function (a) { - return g(a, !0) - }), - (e.remove = function (b, c) { - f(b, '', a(c, { expires: -1 })) - }), - (e.defaults = {}), - (e.withConverter = c), - (e.clear = function () { - document.cookie.split(';').forEach(function (c) { - document.cookie = c.replace(/^ +/, '').replace(/=.*/, '=;expires=' + new Date().toUTCString() + ';path=/') - }) - }), - e - ) - } - return c(function () {}) - }) - - initDayTimeNames() - setupTheme() - setupGreeting() -})() diff --git a/dist/js/libraries/alpine.js b/dist/js/libraries/alpine.js deleted file mode 100644 index 6f8d766..0000000 --- a/dist/js/libraries/alpine.js +++ /dev/null @@ -1,8 +0,0 @@ -/** - * Minified by jsDelivr using Terser v5.3.5. - * Original file: /gh/alpinejs/alpine@2.8.2/dist/alpine.js - * - * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files - */ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).Alpine=t()}(this,(function(){"use strict";function e(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function t(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function n(n){for(var i=1;i tags. See https://github.com/alpinejs/alpine#${t}`):1!==e.content.childElementCount&&console.warn(`Alpine: