From 01d060cf5f4cf743f4e842d8b311121357ccd153 Mon Sep 17 00:00:00 2001 From: Paul Brinkmeier Date: Fri, 18 Aug 2023 16:26:21 +0200 Subject: [PATCH 01/18] Remove old entry stuff --- jon/entry.py | 44 ----------- jon/templates/entry/edit-item-data.html | 56 -------------- jon/templates/entry/select-snack-entry.html | 83 --------------------- 3 files changed, 183 deletions(-) delete mode 100644 jon/templates/entry/edit-item-data.html delete mode 100644 jon/templates/entry/select-snack-entry.html diff --git a/jon/entry.py b/jon/entry.py index d97c423..1c94b8d 100644 --- a/jon/entry.py +++ b/jon/entry.py @@ -13,47 +13,3 @@ bp = Blueprint("entry", __name__, url_prefix="/entry") @bp.get("/") def index(): return render_template("entry/index.html") - - -@bp.route("/edit-item-data", methods=["GET", "POST"]) -def edit_item_data(): - if "entry" not in session: - session["entry"] = dict() - - if request.method == "POST": - session["entry"] = { - "item_bought": datetime.datetime.strptime(request.form.get("item_bought"), "%Y-%m-%d"), - "item_barcode": request.form.get("item_barcode"), - "item_name": request.form.get("item_name"), - "item_group_id": int(request.form.get("item_group")), - "item_net_unit_price": float(request.form.get("item_net_unit_price")), - "item_tax_group_id": int(request.form.get("item_tax_group")), - "item_amount": int(request.form.get("item_amount")), - "item_location_id": int(request.form.get("item_location")) - } - - return redirect("/entry/select-snack-entry") - - groups = db.run_query("get_groups.sql").fetchall() - locations = db.run_query("get_locations.sql").fetchall() - - return render_template("entry/edit-item-data.html", **{ - "groups": groups, - "locations": locations, - "entry": session["entry"] - }) - - -@bp.route("/select-snack-entry", methods=["GET", "POST"]) -def edit_snack_data(): - if "entry" not in session: - return redirect("/entry/edit-item-data") - - snacks = db.run_query("get_snacks_by_barcode.sql", { - "snack_barcode": session["entry"]["item_barcode"] - }).fetchall() - - return render_template("entry/select-snack-entry.html", **{ - "entry": session["entry"], - "snacks": snacks - }) diff --git a/jon/templates/entry/edit-item-data.html b/jon/templates/entry/edit-item-data.html deleted file mode 100644 index 37a7f54..0000000 --- a/jon/templates/entry/edit-item-data.html +++ /dev/null @@ -1,56 +0,0 @@ -{% extends "base.html" %} - -{% block content %} -
{{ entry }}
- -
- Neuer Inventareintrag - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - - - - -
-
- - -
-
- - -
- -
-
-{% endblock %} diff --git a/jon/templates/entry/select-snack-entry.html b/jon/templates/entry/select-snack-entry.html deleted file mode 100644 index 3edf71a..0000000 --- a/jon/templates/entry/select-snack-entry.html +++ /dev/null @@ -1,83 +0,0 @@ -{% extends "base.html" %} - -{% block content %} -
{{ entry }}
- -
- Neuer Inventareintrag - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ID{{ entry.item_id }}
Barcode{{ entry.item_barcode }}
Name{{ entry.item_name }}
Einkaufspreis (Netto){{ format_currency(entry.item_net_unit_price) }}
Empfohlener Garfield-Verkaufspreis{{ format_currency(get_garfield_price(entry.item_net_unit_price, entry.item_tax_group_id)) }}
Kaufdatum{{ format_date(entry.item_bought) }}
Gruppe{{ entry.item_group_name }} ({{ entry.item_group_id }})
Anzahl{{ entry.item_amount }}
Raum{{ entry.item_location_name }} ({{ entry.item_location_id }})
-
- -
- Snackeinträge mit Barcode {{ entry.item_barcode }} - - - - - - - - - - - - - - {% for snack in snacks %} - - - - - - - - - - - - {% endfor %} -
IDBarcodeNameVerkaufspreis (Brutto)EintragedatumSteuersatzRaumAktiv?Aktionen
{{ snack.snack_id }}{{ snack.snack_barcode }}{{ snack.snack_name }}{{ format_currency(snack.snack_price) }}{{ format_date(snack.snack_timestamp) }}{{ snack.description }} ({{ snack.tax_group_id }}){{ snack.location_name }} ({{ snack.location_id }}){{ format_bool(snack.snack_available) }} -
- - -
-
-
-{% endblock %} From be86248cce82e543d2d8d2d2437f6044f068c375 Mon Sep 17 00:00:00 2001 From: Paul Brinkmeier Date: Sat, 19 Aug 2023 03:44:56 +0200 Subject: [PATCH 02/18] First draft of elm frontend This will probably be scrapped or rewritten --- README.md | 1 + elm.json | 28 + frontend/Entry.elm | 292 + jon/db/{ => entry}/get_groups.sql | 4 +- jon/db/entry/get_locations.sql | 4 + jon/db/entry/get_tax_groups.sql | 9 + jon/db/search_items.sql | 18 + jon/entry.py | 37 +- jon/static/entry.js | 12011 ++++++++++++++++++++++++++++ jon/template_utils.py | 17 +- jon/templates/entry/index.html | 13 +- 11 files changed, 12412 insertions(+), 22 deletions(-) create mode 100644 elm.json create mode 100644 frontend/Entry.elm rename jon/db/{ => entry}/get_groups.sql (63%) create mode 100644 jon/db/entry/get_locations.sql create mode 100644 jon/db/entry/get_tax_groups.sql create mode 100644 jon/db/search_items.sql create mode 100644 jon/static/entry.js diff --git a/README.md b/README.md index 92511f2..06f33ae 100644 --- a/README.md +++ b/README.md @@ -38,3 +38,4 @@ ssh -nNTvL 5432:fsmi-db.fsmi.org:5432 fsmi-login.fsmi.uni-karlsruhe.de - [ ] Fix unsafe client-side sessions, either: - [ ] Use `flask-session` for file-backed sessions - [ ] Use `flask-login` with a single user stored in memory +- [ ] Improve project structure diff --git a/elm.json b/elm.json new file mode 100644 index 0000000..48ea476 --- /dev/null +++ b/elm.json @@ -0,0 +1,28 @@ +{ + "type": "application", + "source-directories": [ + "frontend" + ], + "elm-version": "0.19.1", + "dependencies": { + "direct": { + "NoRedInk/elm-json-decode-pipeline": "1.0.1", + "elm/browser": "1.0.2", + "elm/core": "1.0.5", + "elm/html": "1.0.0", + "elm/http": "2.0.0", + "elm/json": "1.1.3" + }, + "indirect": { + "elm/bytes": "1.0.8", + "elm/file": "1.0.5", + "elm/time": "1.0.0", + "elm/url": "1.0.0", + "elm/virtual-dom": "1.0.3" + } + }, + "test-dependencies": { + "direct": {}, + "indirect": {} + } +} diff --git a/frontend/Entry.elm b/frontend/Entry.elm new file mode 100644 index 0000000..300da94 --- /dev/null +++ b/frontend/Entry.elm @@ -0,0 +1,292 @@ +module Entry exposing (main) + +import Browser +import Http + +import Json.Decode as D +import Json.Decode.Pipeline as P + +import Html exposing (..) +import Html.Attributes exposing (..) +import Html.Events exposing (..) + +main = Browser.element + { init = \globals -> + ( Context globals <| ItemSearch { searchTerm = "", searchResults = [] } + , Cmd.none + ) + , subscriptions = \_ -> Sub.none + , update = update + , view = view + } + +-- Data types + +type alias SearchResult = + { barcode : String + , name : String + , netUnitPrice : Float + , bought : String + , salesUnits : Int + , available : Bool + , locationName : String + , locationId : Int + , groupName : String + , groupId : Int + , taxGroupId : Int + } + +searchResultDecoder = + D.succeed SearchResult + |> P.required "item_barcode" D.string + |> P.required "name" D.string + |> P.required "unit_price" D.float + |> P.required "bought" D.string + |> P.required "sales_units" D.int + |> P.required "available" D.bool + |> P.required "location_name" D.string + |> P.required "location_id" D.int + |> P.required "group_name" D.string + |> P.required "group_id" D.int + |> P.required "tax_group_id" D.int + +type alias Location = + { id : Int + , name : String + } + +type alias Group = + { id : Int + , name : String + } + +type alias TaxGroup = + { id : Int + , description : String + , percentage : Float + } + +type alias Context = + { globals : Globals + , state : State + } + +type alias Globals = + { locations : List Location + , groups : List Group + , taxGroups : List TaxGroup + } + +type State + = ItemSearch + { searchTerm : String + , searchResults : List SearchResult + } + | ItemEditor + { barcode : String + , name : String + , salesUnits : Int + , netUnitPrice : Float + , groupId : Int + , locationId : Int + , taxGroupId : Int + } + +type Msg + = SetSearchTerm String + | SubmitSearch + | ReceiveSearchResults (Result Http.Error (List SearchResult)) + | GotoItemEditor SearchResult + | SetNetUnitPrice String + | SetGroupId String + | SetLocationId String + | SetTaxGroupId String + | SetBarcode String + | SetName String + | SetSalesUnits String + +-- Update logic: State machine etc. + +update msg { globals, state } = + let + (state_, cmd) = updateState msg globals state + in + ({ globals = globals, state = state_ }, cmd) + +updateState msg globals state = case state of + ItemSearch model -> case msg of + SetSearchTerm searchTerm -> + (ItemSearch { model | searchTerm = searchTerm }, Cmd.none) + SubmitSearch -> + ( state + , Http.get + { url = "/entry/api/search-items?search-term=" ++ model.searchTerm + , expect = Http.expectJson ReceiveSearchResults <| D.list searchResultDecoder + } + ) + ReceiveSearchResults (Ok searchResults) -> + (ItemSearch { model | searchResults = searchResults }, Cmd.none) + GotoItemEditor searchResult -> + ( ItemEditor + { barcode = searchResult.barcode + , groupId = searchResult.groupId + , locationId = searchResult.locationId + , name = searchResult.name + , netUnitPrice = searchResult.netUnitPrice + , salesUnits = searchResult.salesUnits + , taxGroupId = searchResult.taxGroupId + } + , Cmd.none + ) + _ -> + (state, Cmd.none) + ItemEditor model -> case msg of + SetNetUnitPrice netUnitPriceStr -> case String.toFloat netUnitPriceStr of + Nothing -> (state, Cmd.none) + Just netUnitPrice -> (ItemEditor { model | netUnitPrice = netUnitPrice }, Cmd.none) + SetGroupId groupIdStr -> case String.toInt groupIdStr of + Nothing -> (state, Cmd.none) + Just groupId -> (ItemEditor { model | groupId = groupId }, Cmd.none) + SetLocationId locationIdStr -> case String.toInt locationIdStr of + Nothing -> (state, Cmd.none) + Just locationId -> (ItemEditor { model | locationId = locationId }, Cmd.none) + SetTaxGroupId taxGroupIdStr -> case String.toInt taxGroupIdStr of + Nothing -> (state, Cmd.none) + Just taxGroupId -> (ItemEditor { model | taxGroupId = taxGroupId }, Cmd.none) + SetBarcode barcode -> + (ItemEditor { model | barcode = barcode }, Cmd.none) + SetName name -> + (ItemEditor { model | name = name }, Cmd.none) + SetSalesUnits salesUnitsStr -> case String.toInt salesUnitsStr of + Nothing -> (state, Cmd.none) + Just salesUnits -> (ItemEditor { model | salesUnits = salesUnits }, Cmd.none) + _ -> + (state, Cmd.none) + +-- View stuff + +view { globals, state } = case state of + ItemSearch model -> + fieldset [] + [ legend [] [ text "Vorlage für neuen Inventareintrag" ] + , Html.form [ onSubmit SubmitSearch ] + [ div [ class "form-input" ] + [ label [ for "search-term", title "Barcode oder Name" ] [ text "Suchbegriff" ] + , input [ onInput SetSearchTerm, value model.searchTerm, id "search-term" ] [] + ] + , table [] <| searchResultHeaders :: List.map viewSearchResult model.searchResults + ] + ] + ItemEditor model -> case find (\tg -> tg.id == model.taxGroupId) globals.taxGroups of + Nothing -> div [] [ text "index error, this should never happen" ] + Just selectedTaxGroup -> + Html.form [] + [ fieldset [] + [ legend [] [ text "Neuer Inventareintrag" ] + , div [ class "form-input" ] + [ label [ for "barcode" ] [ text "Barcode" ] + , input [ onInput SetBarcode, value model.barcode, disabled True, id "barcode" ] [] + ] + , div [ class "form-input" ] + [ label [ for "name" ] [ text "Name" ] + , input [ onInput SetName, value model.name, id "name" ] [] + ] + , div [ class "form-input" ] + [ label [ for "sales-units" ] [ text "Stückzahl" ] + , input [ onInput SetSalesUnits, value <| String.fromInt model.salesUnits, id "sales-units", type_ "number" ] [] + ] + , div [ class "form-input" ] + [ label [ for "group" ] [ text "Gruppe" ] + , viewSelect + [ onInput SetGroupId, id "group" ] + String.fromInt .id .name model.groupId globals.groups + ] + , div [ class "form-input" ] + [ label [ for "location" ] [ text "Raum" ] + , viewSelect + [ onInput SetLocationId, id "location" ] + String.fromInt .id .name model.locationId globals.locations + ] + , div [ class "form-input" ] + [ label [ for "net-unit-price" ] [ text "Stückpreis (Netto)" ] + , input + [ value <| String.fromFloat model.netUnitPrice + , onInput SetNetUnitPrice + , type_ "number" + , id "net-unit-price" + , step "0.01" + ] + [] + ] + , div [ class "form-input" ] + [ label [ for "tax-group" ] [ text "Steuergruppe" ] + , viewSelect + [ onInput SetTaxGroupId, id "tax-group" ] + String.fromInt .id .description model.taxGroupId globals.taxGroups + ] + ] + , fieldset [] + [ legend [] [ text "Neuer Snackeintrag" ] + , div [ class "form-input" ] + [ label [ for "snack-name" ] [ text "Name" ] + , input [ value model.name, disabled True, id "snack-name" ] [] + ] + , div [ class "form-input" ] + [ label [ for "gross-unit-price" ] + [ text <| "Stückpreis (Brutto), Vorschlag: " ++ String.fromFloat (calculateGarfieldPrice model.netUnitPrice selectedTaxGroup.percentage) + ] + , input [ value <| String.fromFloat <| Maybe.withDefault (calculateGarfieldPrice model.netUnitPrice selectedTaxGroup.percentage) Nothing, id "gross-unit-price", type_ "number", step "0.01" ] [] + ] + ] + ] + +viewSelect selectAttributes showValue getValue getLabel selectedValue xs = + let + viewOption x = + option + [ value <| showValue <| getValue x + , selected <| getValue x == selectedValue + ] + [ text <| getLabel x + ] + in + select selectAttributes <| List.map viewOption xs + +searchResultHeaders = + tr [] + [ th [] [ text "Barcode" ] + , th [] [ text "Name" ] + , th [] [ text "Gruppe" ] + , th [] [ text "Stückpreis (Netto)" ] + , th [] [ text "Eingekauft" ] + , th [] [ text "Kaufdatum" ] + , th [] [ text "Raum" ] + , th [] [ text "Aktiv?" ] + , th [] [] + ] + +viewSearchResult model = + tr [] + [ td [] [ code [] [ text model.barcode ] ] + , td [] [ text model.name ] + , td [] [ text model.groupName ] + , td [] [ text <| String.fromFloat model.netUnitPrice ] + , td [] [ text <| String.fromInt model.salesUnits ] + , td [] [ text model.bought ] + , td [] [ text model.locationName ] + , td [] [ text <| showBool model.available ] + , td [] + [ button [ onClick <| GotoItemEditor model ] [ text "Als Vorlage verwenden" ] + ] + ] + +calculateGarfieldPrice netUnitPrice taxPercentage = + roundTo 2 <| netUnitPrice * (1 + taxPercentage) + 0.01 + +roundTo places x = toFloat (round <| x * 10 ^ places) / 10 ^ places + +showBool b = case b of + True -> "✅" + False -> "❌" + +find pred xs = List.head <| List.filter pred xs diff --git a/jon/db/get_groups.sql b/jon/db/entry/get_groups.sql similarity index 63% rename from jon/db/get_groups.sql rename to jon/db/entry/get_groups.sql index 33d5233..e83ff5c 100644 --- a/jon/db/get_groups.sql +++ b/jon/db/entry/get_groups.sql @@ -1,6 +1,6 @@ SELECT - group_id, - group_name + group_id AS id, + group_name AS name FROM garfield.inventory_item_groups ORDER BY group_name ASC diff --git a/jon/db/entry/get_locations.sql b/jon/db/entry/get_locations.sql new file mode 100644 index 0000000..d199363 --- /dev/null +++ b/jon/db/entry/get_locations.sql @@ -0,0 +1,4 @@ +SELECT + location_id AS id, + location_name AS name +FROM garfield.locations diff --git a/jon/db/entry/get_tax_groups.sql b/jon/db/entry/get_tax_groups.sql new file mode 100644 index 0000000..a2156f9 --- /dev/null +++ b/jon/db/entry/get_tax_groups.sql @@ -0,0 +1,9 @@ +SELECT + tax_group_id AS id, + description, + tax_percentage :: float AS percentage, + tax_description AS description +FROM garfield.tax_groups, + LATERAL garfield.tax_find(tax_group_id, NOW() :: date) AS tax_id +LEFT JOIN garfield.taxes USING (tax_id) +WHERE active diff --git a/jon/db/search_items.sql b/jon/db/search_items.sql new file mode 100644 index 0000000..62a8216 --- /dev/null +++ b/jon/db/search_items.sql @@ -0,0 +1,18 @@ +SELECT + item_barcode, + name, + unit_price :: float, + TO_CHAR(bought, 'YYYY-MM-DD') AS bought, + sales_units, + available, + location_name, + location_id, + group_name, + item_group AS group_id, + tax_group AS tax_group_id +FROM garfield.inventory_items +LEFT JOIN garfield.locations ON location = location_id +LEFT JOIN garfield.inventory_item_groups ON item_group = group_id +WHERE (%(location_id)s IS NULL OR location = %(location_id)s) + AND (name ILIKE CONCAT('%%', %(search_term)s, '%%') OR item_barcode = %(search_term)s) +ORDER BY bought DESC diff --git a/jon/entry.py b/jon/entry.py index 1c94b8d..4ab298b 100644 --- a/jon/entry.py +++ b/jon/entry.py @@ -1,9 +1,6 @@ -import datetime -import zoneinfo - - from flask import Blueprint, redirect, render_template, request, session + from . import db @@ -12,4 +9,34 @@ bp = Blueprint("entry", __name__, url_prefix="/entry") @bp.get("/") def index(): - return render_template("entry/index.html") + with db.run_query("entry/get_groups.sql") as cursor: + groups = cursor.fetchall() + + with db.run_query("entry/get_locations.sql") as cursor: + locations = cursor.fetchall() + + with db.run_query("entry/get_tax_groups.sql") as cursor: + tax_groups = cursor.fetchall() + + return render_template("entry/index.html", **{ + "locations": locations, + "groups": groups, + "tax_groups": tax_groups + }) + +@bp.get("/api/search-items") +def api_search_items(): + try: + search_term = request.args["search-term"] + except: + return {"error": "Missing query parameter `search-term`"}, 400 + + location = session.get("location", None) + + with db.run_query("search_items.sql", { + "location_id": None if location is None else location["location_id"], + "search_term": search_term + }) as cursor: + items = cursor.fetchall() + + return items diff --git a/jon/static/entry.js b/jon/static/entry.js new file mode 100644 index 0000000..3538c73 --- /dev/null +++ b/jon/static/entry.js @@ -0,0 +1,12011 @@ +(function(scope){ +'use strict'; + +function F(arity, fun, wrapper) { + wrapper.a = arity; + wrapper.f = fun; + return wrapper; +} + +function F2(fun) { + return F(2, fun, function(a) { return function(b) { return fun(a,b); }; }) +} +function F3(fun) { + return F(3, fun, function(a) { + return function(b) { return function(c) { return fun(a, b, c); }; }; + }); +} +function F4(fun) { + return F(4, fun, function(a) { return function(b) { return function(c) { + return function(d) { return fun(a, b, c, d); }; }; }; + }); +} +function F5(fun) { + return F(5, fun, function(a) { return function(b) { return function(c) { + return function(d) { return function(e) { return fun(a, b, c, d, e); }; }; }; }; + }); +} +function F6(fun) { + return F(6, fun, function(a) { return function(b) { return function(c) { + return function(d) { return function(e) { return function(f) { + return fun(a, b, c, d, e, f); }; }; }; }; }; + }); +} +function F7(fun) { + return F(7, fun, function(a) { return function(b) { return function(c) { + return function(d) { return function(e) { return function(f) { + return function(g) { return fun(a, b, c, d, e, f, g); }; }; }; }; }; }; + }); +} +function F8(fun) { + return F(8, fun, function(a) { return function(b) { return function(c) { + return function(d) { return function(e) { return function(f) { + return function(g) { return function(h) { + return fun(a, b, c, d, e, f, g, h); }; }; }; }; }; }; }; + }); +} +function F9(fun) { + return F(9, fun, function(a) { return function(b) { return function(c) { + return function(d) { return function(e) { return function(f) { + return function(g) { return function(h) { return function(i) { + return fun(a, b, c, d, e, f, g, h, i); }; }; }; }; }; }; }; }; + }); +} + +function A2(fun, a, b) { + return fun.a === 2 ? fun.f(a, b) : fun(a)(b); +} +function A3(fun, a, b, c) { + return fun.a === 3 ? fun.f(a, b, c) : fun(a)(b)(c); +} +function A4(fun, a, b, c, d) { + return fun.a === 4 ? fun.f(a, b, c, d) : fun(a)(b)(c)(d); +} +function A5(fun, a, b, c, d, e) { + return fun.a === 5 ? fun.f(a, b, c, d, e) : fun(a)(b)(c)(d)(e); +} +function A6(fun, a, b, c, d, e, f) { + return fun.a === 6 ? fun.f(a, b, c, d, e, f) : fun(a)(b)(c)(d)(e)(f); +} +function A7(fun, a, b, c, d, e, f, g) { + return fun.a === 7 ? fun.f(a, b, c, d, e, f, g) : fun(a)(b)(c)(d)(e)(f)(g); +} +function A8(fun, a, b, c, d, e, f, g, h) { + return fun.a === 8 ? fun.f(a, b, c, d, e, f, g, h) : fun(a)(b)(c)(d)(e)(f)(g)(h); +} +function A9(fun, a, b, c, d, e, f, g, h, i) { + return fun.a === 9 ? fun.f(a, b, c, d, e, f, g, h, i) : fun(a)(b)(c)(d)(e)(f)(g)(h)(i); +} + +console.warn('Compiled in DEBUG mode. Follow the advice at https://elm-lang.org/0.19.1/optimize for better performance and smaller assets.'); + + +var _JsArray_empty = []; + +function _JsArray_singleton(value) +{ + return [value]; +} + +function _JsArray_length(array) +{ + return array.length; +} + +var _JsArray_initialize = F3(function(size, offset, func) +{ + var result = new Array(size); + + for (var i = 0; i < size; i++) + { + result[i] = func(offset + i); + } + + return result; +}); + +var _JsArray_initializeFromList = F2(function (max, ls) +{ + var result = new Array(max); + + for (var i = 0; i < max && ls.b; i++) + { + result[i] = ls.a; + ls = ls.b; + } + + result.length = i; + return _Utils_Tuple2(result, ls); +}); + +var _JsArray_unsafeGet = F2(function(index, array) +{ + return array[index]; +}); + +var _JsArray_unsafeSet = F3(function(index, value, array) +{ + var length = array.length; + var result = new Array(length); + + for (var i = 0; i < length; i++) + { + result[i] = array[i]; + } + + result[index] = value; + return result; +}); + +var _JsArray_push = F2(function(value, array) +{ + var length = array.length; + var result = new Array(length + 1); + + for (var i = 0; i < length; i++) + { + result[i] = array[i]; + } + + result[length] = value; + return result; +}); + +var _JsArray_foldl = F3(function(func, acc, array) +{ + var length = array.length; + + for (var i = 0; i < length; i++) + { + acc = A2(func, array[i], acc); + } + + return acc; +}); + +var _JsArray_foldr = F3(function(func, acc, array) +{ + for (var i = array.length - 1; i >= 0; i--) + { + acc = A2(func, array[i], acc); + } + + return acc; +}); + +var _JsArray_map = F2(function(func, array) +{ + var length = array.length; + var result = new Array(length); + + for (var i = 0; i < length; i++) + { + result[i] = func(array[i]); + } + + return result; +}); + +var _JsArray_indexedMap = F3(function(func, offset, array) +{ + var length = array.length; + var result = new Array(length); + + for (var i = 0; i < length; i++) + { + result[i] = A2(func, offset + i, array[i]); + } + + return result; +}); + +var _JsArray_slice = F3(function(from, to, array) +{ + return array.slice(from, to); +}); + +var _JsArray_appendN = F3(function(n, dest, source) +{ + var destLen = dest.length; + var itemsToCopy = n - destLen; + + if (itemsToCopy > source.length) + { + itemsToCopy = source.length; + } + + var size = destLen + itemsToCopy; + var result = new Array(size); + + for (var i = 0; i < destLen; i++) + { + result[i] = dest[i]; + } + + for (var i = 0; i < itemsToCopy; i++) + { + result[i + destLen] = source[i]; + } + + return result; +}); + + + +// LOG + +var _Debug_log_UNUSED = F2(function(tag, value) +{ + return value; +}); + +var _Debug_log = F2(function(tag, value) +{ + console.log(tag + ': ' + _Debug_toString(value)); + return value; +}); + + +// TODOS + +function _Debug_todo(moduleName, region) +{ + return function(message) { + _Debug_crash(8, moduleName, region, message); + }; +} + +function _Debug_todoCase(moduleName, region, value) +{ + return function(message) { + _Debug_crash(9, moduleName, region, value, message); + }; +} + + +// TO STRING + +function _Debug_toString_UNUSED(value) +{ + return ''; +} + +function _Debug_toString(value) +{ + return _Debug_toAnsiString(false, value); +} + +function _Debug_toAnsiString(ansi, value) +{ + if (typeof value === 'function') + { + return _Debug_internalColor(ansi, ''); + } + + if (typeof value === 'boolean') + { + return _Debug_ctorColor(ansi, value ? 'True' : 'False'); + } + + if (typeof value === 'number') + { + return _Debug_numberColor(ansi, value + ''); + } + + if (value instanceof String) + { + return _Debug_charColor(ansi, "'" + _Debug_addSlashes(value, true) + "'"); + } + + if (typeof value === 'string') + { + return _Debug_stringColor(ansi, '"' + _Debug_addSlashes(value, false) + '"'); + } + + if (typeof value === 'object' && '$' in value) + { + var tag = value.$; + + if (typeof tag === 'number') + { + return _Debug_internalColor(ansi, ''); + } + + if (tag[0] === '#') + { + var output = []; + for (var k in value) + { + if (k === '$') continue; + output.push(_Debug_toAnsiString(ansi, value[k])); + } + return '(' + output.join(',') + ')'; + } + + if (tag === 'Set_elm_builtin') + { + return _Debug_ctorColor(ansi, 'Set') + + _Debug_fadeColor(ansi, '.fromList') + ' ' + + _Debug_toAnsiString(ansi, $elm$core$Set$toList(value)); + } + + if (tag === 'RBNode_elm_builtin' || tag === 'RBEmpty_elm_builtin') + { + return _Debug_ctorColor(ansi, 'Dict') + + _Debug_fadeColor(ansi, '.fromList') + ' ' + + _Debug_toAnsiString(ansi, $elm$core$Dict$toList(value)); + } + + if (tag === 'Array_elm_builtin') + { + return _Debug_ctorColor(ansi, 'Array') + + _Debug_fadeColor(ansi, '.fromList') + ' ' + + _Debug_toAnsiString(ansi, $elm$core$Array$toList(value)); + } + + if (tag === '::' || tag === '[]') + { + var output = '['; + + value.b && (output += _Debug_toAnsiString(ansi, value.a), value = value.b) + + for (; value.b; value = value.b) // WHILE_CONS + { + output += ',' + _Debug_toAnsiString(ansi, value.a); + } + return output + ']'; + } + + var output = ''; + for (var i in value) + { + if (i === '$') continue; + var str = _Debug_toAnsiString(ansi, value[i]); + var c0 = str[0]; + var parenless = c0 === '{' || c0 === '(' || c0 === '[' || c0 === '<' || c0 === '"' || str.indexOf(' ') < 0; + output += ' ' + (parenless ? str : '(' + str + ')'); + } + return _Debug_ctorColor(ansi, tag) + output; + } + + if (typeof DataView === 'function' && value instanceof DataView) + { + return _Debug_stringColor(ansi, '<' + value.byteLength + ' bytes>'); + } + + if (typeof File !== 'undefined' && value instanceof File) + { + return _Debug_internalColor(ansi, '<' + value.name + '>'); + } + + if (typeof value === 'object') + { + var output = []; + for (var key in value) + { + var field = key[0] === '_' ? key.slice(1) : key; + output.push(_Debug_fadeColor(ansi, field) + ' = ' + _Debug_toAnsiString(ansi, value[key])); + } + if (output.length === 0) + { + return '{}'; + } + return '{ ' + output.join(', ') + ' }'; + } + + return _Debug_internalColor(ansi, ''); +} + +function _Debug_addSlashes(str, isChar) +{ + var s = str + .replace(/\\/g, '\\\\') + .replace(/\n/g, '\\n') + .replace(/\t/g, '\\t') + .replace(/\r/g, '\\r') + .replace(/\v/g, '\\v') + .replace(/\0/g, '\\0'); + + if (isChar) + { + return s.replace(/\'/g, '\\\''); + } + else + { + return s.replace(/\"/g, '\\"'); + } +} + +function _Debug_ctorColor(ansi, string) +{ + return ansi ? '\x1b[96m' + string + '\x1b[0m' : string; +} + +function _Debug_numberColor(ansi, string) +{ + return ansi ? '\x1b[95m' + string + '\x1b[0m' : string; +} + +function _Debug_stringColor(ansi, string) +{ + return ansi ? '\x1b[93m' + string + '\x1b[0m' : string; +} + +function _Debug_charColor(ansi, string) +{ + return ansi ? '\x1b[92m' + string + '\x1b[0m' : string; +} + +function _Debug_fadeColor(ansi, string) +{ + return ansi ? '\x1b[37m' + string + '\x1b[0m' : string; +} + +function _Debug_internalColor(ansi, string) +{ + return ansi ? '\x1b[36m' + string + '\x1b[0m' : string; +} + +function _Debug_toHexDigit(n) +{ + return String.fromCharCode(n < 10 ? 48 + n : 55 + n); +} + + +// CRASH + + +function _Debug_crash_UNUSED(identifier) +{ + throw new Error('https://github.com/elm/core/blob/1.0.0/hints/' + identifier + '.md'); +} + + +function _Debug_crash(identifier, fact1, fact2, fact3, fact4) +{ + switch(identifier) + { + case 0: + throw new Error('What node should I take over? In JavaScript I need something like:\n\n Elm.Main.init({\n node: document.getElementById("elm-node")\n })\n\nYou need to do this with any Browser.sandbox or Browser.element program.'); + + case 1: + throw new Error('Browser.application programs cannot handle URLs like this:\n\n ' + document.location.href + '\n\nWhat is the root? The root of your file system? Try looking at this program with `elm reactor` or some other server.'); + + case 2: + var jsonErrorString = fact1; + throw new Error('Problem with the flags given to your Elm program on initialization.\n\n' + jsonErrorString); + + case 3: + var portName = fact1; + throw new Error('There can only be one port named `' + portName + '`, but your program has multiple.'); + + case 4: + var portName = fact1; + var problem = fact2; + throw new Error('Trying to send an unexpected type of value through port `' + portName + '`:\n' + problem); + + case 5: + throw new Error('Trying to use `(==)` on functions.\nThere is no way to know if functions are "the same" in the Elm sense.\nRead more about this at https://package.elm-lang.org/packages/elm/core/latest/Basics#== which describes why it is this way and what the better version will look like.'); + + case 6: + var moduleName = fact1; + throw new Error('Your page is loading multiple Elm scripts with a module named ' + moduleName + '. Maybe a duplicate script is getting loaded accidentally? If not, rename one of them so I know which is which!'); + + case 8: + var moduleName = fact1; + var region = fact2; + var message = fact3; + throw new Error('TODO in module `' + moduleName + '` ' + _Debug_regionToString(region) + '\n\n' + message); + + case 9: + var moduleName = fact1; + var region = fact2; + var value = fact3; + var message = fact4; + throw new Error( + 'TODO in module `' + moduleName + '` from the `case` expression ' + + _Debug_regionToString(region) + '\n\nIt received the following value:\n\n ' + + _Debug_toString(value).replace('\n', '\n ') + + '\n\nBut the branch that handles it says:\n\n ' + message.replace('\n', '\n ') + ); + + case 10: + throw new Error('Bug in https://github.com/elm/virtual-dom/issues'); + + case 11: + throw new Error('Cannot perform mod 0. Division by zero error.'); + } +} + +function _Debug_regionToString(region) +{ + if (region.start.line === region.end.line) + { + return 'on line ' + region.start.line; + } + return 'on lines ' + region.start.line + ' through ' + region.end.line; +} + + + +// EQUALITY + +function _Utils_eq(x, y) +{ + for ( + var pair, stack = [], isEqual = _Utils_eqHelp(x, y, 0, stack); + isEqual && (pair = stack.pop()); + isEqual = _Utils_eqHelp(pair.a, pair.b, 0, stack) + ) + {} + + return isEqual; +} + +function _Utils_eqHelp(x, y, depth, stack) +{ + if (x === y) + { + return true; + } + + if (typeof x !== 'object' || x === null || y === null) + { + typeof x === 'function' && _Debug_crash(5); + return false; + } + + if (depth > 100) + { + stack.push(_Utils_Tuple2(x,y)); + return true; + } + + /**/ + if (x.$ === 'Set_elm_builtin') + { + x = $elm$core$Set$toList(x); + y = $elm$core$Set$toList(y); + } + if (x.$ === 'RBNode_elm_builtin' || x.$ === 'RBEmpty_elm_builtin') + { + x = $elm$core$Dict$toList(x); + y = $elm$core$Dict$toList(y); + } + //*/ + + /**_UNUSED/ + if (x.$ < 0) + { + x = $elm$core$Dict$toList(x); + y = $elm$core$Dict$toList(y); + } + //*/ + + for (var key in x) + { + if (!_Utils_eqHelp(x[key], y[key], depth + 1, stack)) + { + return false; + } + } + return true; +} + +var _Utils_equal = F2(_Utils_eq); +var _Utils_notEqual = F2(function(a, b) { return !_Utils_eq(a,b); }); + + + +// COMPARISONS + +// Code in Generate/JavaScript.hs, Basics.js, and List.js depends on +// the particular integer values assigned to LT, EQ, and GT. + +function _Utils_cmp(x, y, ord) +{ + if (typeof x !== 'object') + { + return x === y ? /*EQ*/ 0 : x < y ? /*LT*/ -1 : /*GT*/ 1; + } + + /**/ + if (x instanceof String) + { + var a = x.valueOf(); + var b = y.valueOf(); + return a === b ? 0 : a < b ? -1 : 1; + } + //*/ + + /**_UNUSED/ + if (typeof x.$ === 'undefined') + //*/ + /**/ + if (x.$[0] === '#') + //*/ + { + return (ord = _Utils_cmp(x.a, y.a)) + ? ord + : (ord = _Utils_cmp(x.b, y.b)) + ? ord + : _Utils_cmp(x.c, y.c); + } + + // traverse conses until end of a list or a mismatch + for (; x.b && y.b && !(ord = _Utils_cmp(x.a, y.a)); x = x.b, y = y.b) {} // WHILE_CONSES + return ord || (x.b ? /*GT*/ 1 : y.b ? /*LT*/ -1 : /*EQ*/ 0); +} + +var _Utils_lt = F2(function(a, b) { return _Utils_cmp(a, b) < 0; }); +var _Utils_le = F2(function(a, b) { return _Utils_cmp(a, b) < 1; }); +var _Utils_gt = F2(function(a, b) { return _Utils_cmp(a, b) > 0; }); +var _Utils_ge = F2(function(a, b) { return _Utils_cmp(a, b) >= 0; }); + +var _Utils_compare = F2(function(x, y) +{ + var n = _Utils_cmp(x, y); + return n < 0 ? $elm$core$Basics$LT : n ? $elm$core$Basics$GT : $elm$core$Basics$EQ; +}); + + +// COMMON VALUES + +var _Utils_Tuple0_UNUSED = 0; +var _Utils_Tuple0 = { $: '#0' }; + +function _Utils_Tuple2_UNUSED(a, b) { return { a: a, b: b }; } +function _Utils_Tuple2(a, b) { return { $: '#2', a: a, b: b }; } + +function _Utils_Tuple3_UNUSED(a, b, c) { return { a: a, b: b, c: c }; } +function _Utils_Tuple3(a, b, c) { return { $: '#3', a: a, b: b, c: c }; } + +function _Utils_chr_UNUSED(c) { return c; } +function _Utils_chr(c) { return new String(c); } + + +// RECORDS + +function _Utils_update(oldRecord, updatedFields) +{ + var newRecord = {}; + + for (var key in oldRecord) + { + newRecord[key] = oldRecord[key]; + } + + for (var key in updatedFields) + { + newRecord[key] = updatedFields[key]; + } + + return newRecord; +} + + +// APPEND + +var _Utils_append = F2(_Utils_ap); + +function _Utils_ap(xs, ys) +{ + // append Strings + if (typeof xs === 'string') + { + return xs + ys; + } + + // append Lists + if (!xs.b) + { + return ys; + } + var root = _List_Cons(xs.a, ys); + xs = xs.b + for (var curr = root; xs.b; xs = xs.b) // WHILE_CONS + { + curr = curr.b = _List_Cons(xs.a, ys); + } + return root; +} + + + +var _List_Nil_UNUSED = { $: 0 }; +var _List_Nil = { $: '[]' }; + +function _List_Cons_UNUSED(hd, tl) { return { $: 1, a: hd, b: tl }; } +function _List_Cons(hd, tl) { return { $: '::', a: hd, b: tl }; } + + +var _List_cons = F2(_List_Cons); + +function _List_fromArray(arr) +{ + var out = _List_Nil; + for (var i = arr.length; i--; ) + { + out = _List_Cons(arr[i], out); + } + return out; +} + +function _List_toArray(xs) +{ + for (var out = []; xs.b; xs = xs.b) // WHILE_CONS + { + out.push(xs.a); + } + return out; +} + +var _List_map2 = F3(function(f, xs, ys) +{ + for (var arr = []; xs.b && ys.b; xs = xs.b, ys = ys.b) // WHILE_CONSES + { + arr.push(A2(f, xs.a, ys.a)); + } + return _List_fromArray(arr); +}); + +var _List_map3 = F4(function(f, xs, ys, zs) +{ + for (var arr = []; xs.b && ys.b && zs.b; xs = xs.b, ys = ys.b, zs = zs.b) // WHILE_CONSES + { + arr.push(A3(f, xs.a, ys.a, zs.a)); + } + return _List_fromArray(arr); +}); + +var _List_map4 = F5(function(f, ws, xs, ys, zs) +{ + for (var arr = []; ws.b && xs.b && ys.b && zs.b; ws = ws.b, xs = xs.b, ys = ys.b, zs = zs.b) // WHILE_CONSES + { + arr.push(A4(f, ws.a, xs.a, ys.a, zs.a)); + } + return _List_fromArray(arr); +}); + +var _List_map5 = F6(function(f, vs, ws, xs, ys, zs) +{ + for (var arr = []; vs.b && ws.b && xs.b && ys.b && zs.b; vs = vs.b, ws = ws.b, xs = xs.b, ys = ys.b, zs = zs.b) // WHILE_CONSES + { + arr.push(A5(f, vs.a, ws.a, xs.a, ys.a, zs.a)); + } + return _List_fromArray(arr); +}); + +var _List_sortBy = F2(function(f, xs) +{ + return _List_fromArray(_List_toArray(xs).sort(function(a, b) { + return _Utils_cmp(f(a), f(b)); + })); +}); + +var _List_sortWith = F2(function(f, xs) +{ + return _List_fromArray(_List_toArray(xs).sort(function(a, b) { + var ord = A2(f, a, b); + return ord === $elm$core$Basics$EQ ? 0 : ord === $elm$core$Basics$LT ? -1 : 1; + })); +}); + + + +// MATH + +var _Basics_add = F2(function(a, b) { return a + b; }); +var _Basics_sub = F2(function(a, b) { return a - b; }); +var _Basics_mul = F2(function(a, b) { return a * b; }); +var _Basics_fdiv = F2(function(a, b) { return a / b; }); +var _Basics_idiv = F2(function(a, b) { return (a / b) | 0; }); +var _Basics_pow = F2(Math.pow); + +var _Basics_remainderBy = F2(function(b, a) { return a % b; }); + +// https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/divmodnote-letter.pdf +var _Basics_modBy = F2(function(modulus, x) +{ + var answer = x % modulus; + return modulus === 0 + ? _Debug_crash(11) + : + ((answer > 0 && modulus < 0) || (answer < 0 && modulus > 0)) + ? answer + modulus + : answer; +}); + + +// TRIGONOMETRY + +var _Basics_pi = Math.PI; +var _Basics_e = Math.E; +var _Basics_cos = Math.cos; +var _Basics_sin = Math.sin; +var _Basics_tan = Math.tan; +var _Basics_acos = Math.acos; +var _Basics_asin = Math.asin; +var _Basics_atan = Math.atan; +var _Basics_atan2 = F2(Math.atan2); + + +// MORE MATH + +function _Basics_toFloat(x) { return x; } +function _Basics_truncate(n) { return n | 0; } +function _Basics_isInfinite(n) { return n === Infinity || n === -Infinity; } + +var _Basics_ceiling = Math.ceil; +var _Basics_floor = Math.floor; +var _Basics_round = Math.round; +var _Basics_sqrt = Math.sqrt; +var _Basics_log = Math.log; +var _Basics_isNaN = isNaN; + + +// BOOLEANS + +function _Basics_not(bool) { return !bool; } +var _Basics_and = F2(function(a, b) { return a && b; }); +var _Basics_or = F2(function(a, b) { return a || b; }); +var _Basics_xor = F2(function(a, b) { return a !== b; }); + + + +var _String_cons = F2(function(chr, str) +{ + return chr + str; +}); + +function _String_uncons(string) +{ + var word = string.charCodeAt(0); + return !isNaN(word) + ? $elm$core$Maybe$Just( + 0xD800 <= word && word <= 0xDBFF + ? _Utils_Tuple2(_Utils_chr(string[0] + string[1]), string.slice(2)) + : _Utils_Tuple2(_Utils_chr(string[0]), string.slice(1)) + ) + : $elm$core$Maybe$Nothing; +} + +var _String_append = F2(function(a, b) +{ + return a + b; +}); + +function _String_length(str) +{ + return str.length; +} + +var _String_map = F2(function(func, string) +{ + var len = string.length; + var array = new Array(len); + var i = 0; + while (i < len) + { + var word = string.charCodeAt(i); + if (0xD800 <= word && word <= 0xDBFF) + { + array[i] = func(_Utils_chr(string[i] + string[i+1])); + i += 2; + continue; + } + array[i] = func(_Utils_chr(string[i])); + i++; + } + return array.join(''); +}); + +var _String_filter = F2(function(isGood, str) +{ + var arr = []; + var len = str.length; + var i = 0; + while (i < len) + { + var char = str[i]; + var word = str.charCodeAt(i); + i++; + if (0xD800 <= word && word <= 0xDBFF) + { + char += str[i]; + i++; + } + + if (isGood(_Utils_chr(char))) + { + arr.push(char); + } + } + return arr.join(''); +}); + +function _String_reverse(str) +{ + var len = str.length; + var arr = new Array(len); + var i = 0; + while (i < len) + { + var word = str.charCodeAt(i); + if (0xD800 <= word && word <= 0xDBFF) + { + arr[len - i] = str[i + 1]; + i++; + arr[len - i] = str[i - 1]; + i++; + } + else + { + arr[len - i] = str[i]; + i++; + } + } + return arr.join(''); +} + +var _String_foldl = F3(function(func, state, string) +{ + var len = string.length; + var i = 0; + while (i < len) + { + var char = string[i]; + var word = string.charCodeAt(i); + i++; + if (0xD800 <= word && word <= 0xDBFF) + { + char += string[i]; + i++; + } + state = A2(func, _Utils_chr(char), state); + } + return state; +}); + +var _String_foldr = F3(function(func, state, string) +{ + var i = string.length; + while (i--) + { + var char = string[i]; + var word = string.charCodeAt(i); + if (0xDC00 <= word && word <= 0xDFFF) + { + i--; + char = string[i] + char; + } + state = A2(func, _Utils_chr(char), state); + } + return state; +}); + +var _String_split = F2(function(sep, str) +{ + return str.split(sep); +}); + +var _String_join = F2(function(sep, strs) +{ + return strs.join(sep); +}); + +var _String_slice = F3(function(start, end, str) { + return str.slice(start, end); +}); + +function _String_trim(str) +{ + return str.trim(); +} + +function _String_trimLeft(str) +{ + return str.replace(/^\s+/, ''); +} + +function _String_trimRight(str) +{ + return str.replace(/\s+$/, ''); +} + +function _String_words(str) +{ + return _List_fromArray(str.trim().split(/\s+/g)); +} + +function _String_lines(str) +{ + return _List_fromArray(str.split(/\r\n|\r|\n/g)); +} + +function _String_toUpper(str) +{ + return str.toUpperCase(); +} + +function _String_toLower(str) +{ + return str.toLowerCase(); +} + +var _String_any = F2(function(isGood, string) +{ + var i = string.length; + while (i--) + { + var char = string[i]; + var word = string.charCodeAt(i); + if (0xDC00 <= word && word <= 0xDFFF) + { + i--; + char = string[i] + char; + } + if (isGood(_Utils_chr(char))) + { + return true; + } + } + return false; +}); + +var _String_all = F2(function(isGood, string) +{ + var i = string.length; + while (i--) + { + var char = string[i]; + var word = string.charCodeAt(i); + if (0xDC00 <= word && word <= 0xDFFF) + { + i--; + char = string[i] + char; + } + if (!isGood(_Utils_chr(char))) + { + return false; + } + } + return true; +}); + +var _String_contains = F2(function(sub, str) +{ + return str.indexOf(sub) > -1; +}); + +var _String_startsWith = F2(function(sub, str) +{ + return str.indexOf(sub) === 0; +}); + +var _String_endsWith = F2(function(sub, str) +{ + return str.length >= sub.length && + str.lastIndexOf(sub) === str.length - sub.length; +}); + +var _String_indexes = F2(function(sub, str) +{ + var subLen = sub.length; + + if (subLen < 1) + { + return _List_Nil; + } + + var i = 0; + var is = []; + + while ((i = str.indexOf(sub, i)) > -1) + { + is.push(i); + i = i + subLen; + } + + return _List_fromArray(is); +}); + + +// TO STRING + +function _String_fromNumber(number) +{ + return number + ''; +} + + +// INT CONVERSIONS + +function _String_toInt(str) +{ + var total = 0; + var code0 = str.charCodeAt(0); + var start = code0 == 0x2B /* + */ || code0 == 0x2D /* - */ ? 1 : 0; + + for (var i = start; i < str.length; ++i) + { + var code = str.charCodeAt(i); + if (code < 0x30 || 0x39 < code) + { + return $elm$core$Maybe$Nothing; + } + total = 10 * total + code - 0x30; + } + + return i == start + ? $elm$core$Maybe$Nothing + : $elm$core$Maybe$Just(code0 == 0x2D ? -total : total); +} + + +// FLOAT CONVERSIONS + +function _String_toFloat(s) +{ + // check if it is a hex, octal, or binary number + if (s.length === 0 || /[\sxbo]/.test(s)) + { + return $elm$core$Maybe$Nothing; + } + var n = +s; + // faster isNaN check + return n === n ? $elm$core$Maybe$Just(n) : $elm$core$Maybe$Nothing; +} + +function _String_fromList(chars) +{ + return _List_toArray(chars).join(''); +} + + + + +function _Char_toCode(char) +{ + var code = char.charCodeAt(0); + if (0xD800 <= code && code <= 0xDBFF) + { + return (code - 0xD800) * 0x400 + char.charCodeAt(1) - 0xDC00 + 0x10000 + } + return code; +} + +function _Char_fromCode(code) +{ + return _Utils_chr( + (code < 0 || 0x10FFFF < code) + ? '\uFFFD' + : + (code <= 0xFFFF) + ? String.fromCharCode(code) + : + (code -= 0x10000, + String.fromCharCode(Math.floor(code / 0x400) + 0xD800, code % 0x400 + 0xDC00) + ) + ); +} + +function _Char_toUpper(char) +{ + return _Utils_chr(char.toUpperCase()); +} + +function _Char_toLower(char) +{ + return _Utils_chr(char.toLowerCase()); +} + +function _Char_toLocaleUpper(char) +{ + return _Utils_chr(char.toLocaleUpperCase()); +} + +function _Char_toLocaleLower(char) +{ + return _Utils_chr(char.toLocaleLowerCase()); +} + + + +/**/ +function _Json_errorToString(error) +{ + return $elm$json$Json$Decode$errorToString(error); +} +//*/ + + +// CORE DECODERS + +function _Json_succeed(msg) +{ + return { + $: 0, + a: msg + }; +} + +function _Json_fail(msg) +{ + return { + $: 1, + a: msg + }; +} + +function _Json_decodePrim(decoder) +{ + return { $: 2, b: decoder }; +} + +var _Json_decodeInt = _Json_decodePrim(function(value) { + return (typeof value !== 'number') + ? _Json_expecting('an INT', value) + : + (-2147483647 < value && value < 2147483647 && (value | 0) === value) + ? $elm$core$Result$Ok(value) + : + (isFinite(value) && !(value % 1)) + ? $elm$core$Result$Ok(value) + : _Json_expecting('an INT', value); +}); + +var _Json_decodeBool = _Json_decodePrim(function(value) { + return (typeof value === 'boolean') + ? $elm$core$Result$Ok(value) + : _Json_expecting('a BOOL', value); +}); + +var _Json_decodeFloat = _Json_decodePrim(function(value) { + return (typeof value === 'number') + ? $elm$core$Result$Ok(value) + : _Json_expecting('a FLOAT', value); +}); + +var _Json_decodeValue = _Json_decodePrim(function(value) { + return $elm$core$Result$Ok(_Json_wrap(value)); +}); + +var _Json_decodeString = _Json_decodePrim(function(value) { + return (typeof value === 'string') + ? $elm$core$Result$Ok(value) + : (value instanceof String) + ? $elm$core$Result$Ok(value + '') + : _Json_expecting('a STRING', value); +}); + +function _Json_decodeList(decoder) { return { $: 3, b: decoder }; } +function _Json_decodeArray(decoder) { return { $: 4, b: decoder }; } + +function _Json_decodeNull(value) { return { $: 5, c: value }; } + +var _Json_decodeField = F2(function(field, decoder) +{ + return { + $: 6, + d: field, + b: decoder + }; +}); + +var _Json_decodeIndex = F2(function(index, decoder) +{ + return { + $: 7, + e: index, + b: decoder + }; +}); + +function _Json_decodeKeyValuePairs(decoder) +{ + return { + $: 8, + b: decoder + }; +} + +function _Json_mapMany(f, decoders) +{ + return { + $: 9, + f: f, + g: decoders + }; +} + +var _Json_andThen = F2(function(callback, decoder) +{ + return { + $: 10, + b: decoder, + h: callback + }; +}); + +function _Json_oneOf(decoders) +{ + return { + $: 11, + g: decoders + }; +} + + +// DECODING OBJECTS + +var _Json_map1 = F2(function(f, d1) +{ + return _Json_mapMany(f, [d1]); +}); + +var _Json_map2 = F3(function(f, d1, d2) +{ + return _Json_mapMany(f, [d1, d2]); +}); + +var _Json_map3 = F4(function(f, d1, d2, d3) +{ + return _Json_mapMany(f, [d1, d2, d3]); +}); + +var _Json_map4 = F5(function(f, d1, d2, d3, d4) +{ + return _Json_mapMany(f, [d1, d2, d3, d4]); +}); + +var _Json_map5 = F6(function(f, d1, d2, d3, d4, d5) +{ + return _Json_mapMany(f, [d1, d2, d3, d4, d5]); +}); + +var _Json_map6 = F7(function(f, d1, d2, d3, d4, d5, d6) +{ + return _Json_mapMany(f, [d1, d2, d3, d4, d5, d6]); +}); + +var _Json_map7 = F8(function(f, d1, d2, d3, d4, d5, d6, d7) +{ + return _Json_mapMany(f, [d1, d2, d3, d4, d5, d6, d7]); +}); + +var _Json_map8 = F9(function(f, d1, d2, d3, d4, d5, d6, d7, d8) +{ + return _Json_mapMany(f, [d1, d2, d3, d4, d5, d6, d7, d8]); +}); + + +// DECODE + +var _Json_runOnString = F2(function(decoder, string) +{ + try + { + var value = JSON.parse(string); + return _Json_runHelp(decoder, value); + } + catch (e) + { + return $elm$core$Result$Err(A2($elm$json$Json$Decode$Failure, 'This is not valid JSON! ' + e.message, _Json_wrap(string))); + } +}); + +var _Json_run = F2(function(decoder, value) +{ + return _Json_runHelp(decoder, _Json_unwrap(value)); +}); + +function _Json_runHelp(decoder, value) +{ + switch (decoder.$) + { + case 2: + return decoder.b(value); + + case 5: + return (value === null) + ? $elm$core$Result$Ok(decoder.c) + : _Json_expecting('null', value); + + case 3: + if (!_Json_isArray(value)) + { + return _Json_expecting('a LIST', value); + } + return _Json_runArrayDecoder(decoder.b, value, _List_fromArray); + + case 4: + if (!_Json_isArray(value)) + { + return _Json_expecting('an ARRAY', value); + } + return _Json_runArrayDecoder(decoder.b, value, _Json_toElmArray); + + case 6: + var field = decoder.d; + if (typeof value !== 'object' || value === null || !(field in value)) + { + return _Json_expecting('an OBJECT with a field named `' + field + '`', value); + } + var result = _Json_runHelp(decoder.b, value[field]); + return ($elm$core$Result$isOk(result)) ? result : $elm$core$Result$Err(A2($elm$json$Json$Decode$Field, field, result.a)); + + case 7: + var index = decoder.e; + if (!_Json_isArray(value)) + { + return _Json_expecting('an ARRAY', value); + } + if (index >= value.length) + { + return _Json_expecting('a LONGER array. Need index ' + index + ' but only see ' + value.length + ' entries', value); + } + var result = _Json_runHelp(decoder.b, value[index]); + return ($elm$core$Result$isOk(result)) ? result : $elm$core$Result$Err(A2($elm$json$Json$Decode$Index, index, result.a)); + + case 8: + if (typeof value !== 'object' || value === null || _Json_isArray(value)) + { + return _Json_expecting('an OBJECT', value); + } + + var keyValuePairs = _List_Nil; + // TODO test perf of Object.keys and switch when support is good enough + for (var key in value) + { + if (value.hasOwnProperty(key)) + { + var result = _Json_runHelp(decoder.b, value[key]); + if (!$elm$core$Result$isOk(result)) + { + return $elm$core$Result$Err(A2($elm$json$Json$Decode$Field, key, result.a)); + } + keyValuePairs = _List_Cons(_Utils_Tuple2(key, result.a), keyValuePairs); + } + } + return $elm$core$Result$Ok($elm$core$List$reverse(keyValuePairs)); + + case 9: + var answer = decoder.f; + var decoders = decoder.g; + for (var i = 0; i < decoders.length; i++) + { + var result = _Json_runHelp(decoders[i], value); + if (!$elm$core$Result$isOk(result)) + { + return result; + } + answer = answer(result.a); + } + return $elm$core$Result$Ok(answer); + + case 10: + var result = _Json_runHelp(decoder.b, value); + return (!$elm$core$Result$isOk(result)) + ? result + : _Json_runHelp(decoder.h(result.a), value); + + case 11: + var errors = _List_Nil; + for (var temp = decoder.g; temp.b; temp = temp.b) // WHILE_CONS + { + var result = _Json_runHelp(temp.a, value); + if ($elm$core$Result$isOk(result)) + { + return result; + } + errors = _List_Cons(result.a, errors); + } + return $elm$core$Result$Err($elm$json$Json$Decode$OneOf($elm$core$List$reverse(errors))); + + case 1: + return $elm$core$Result$Err(A2($elm$json$Json$Decode$Failure, decoder.a, _Json_wrap(value))); + + case 0: + return $elm$core$Result$Ok(decoder.a); + } +} + +function _Json_runArrayDecoder(decoder, value, toElmValue) +{ + var len = value.length; + var array = new Array(len); + for (var i = 0; i < len; i++) + { + var result = _Json_runHelp(decoder, value[i]); + if (!$elm$core$Result$isOk(result)) + { + return $elm$core$Result$Err(A2($elm$json$Json$Decode$Index, i, result.a)); + } + array[i] = result.a; + } + return $elm$core$Result$Ok(toElmValue(array)); +} + +function _Json_isArray(value) +{ + return Array.isArray(value) || (typeof FileList !== 'undefined' && value instanceof FileList); +} + +function _Json_toElmArray(array) +{ + return A2($elm$core$Array$initialize, array.length, function(i) { return array[i]; }); +} + +function _Json_expecting(type, value) +{ + return $elm$core$Result$Err(A2($elm$json$Json$Decode$Failure, 'Expecting ' + type, _Json_wrap(value))); +} + + +// EQUALITY + +function _Json_equality(x, y) +{ + if (x === y) + { + return true; + } + + if (x.$ !== y.$) + { + return false; + } + + switch (x.$) + { + case 0: + case 1: + return x.a === y.a; + + case 2: + return x.b === y.b; + + case 5: + return x.c === y.c; + + case 3: + case 4: + case 8: + return _Json_equality(x.b, y.b); + + case 6: + return x.d === y.d && _Json_equality(x.b, y.b); + + case 7: + return x.e === y.e && _Json_equality(x.b, y.b); + + case 9: + return x.f === y.f && _Json_listEquality(x.g, y.g); + + case 10: + return x.h === y.h && _Json_equality(x.b, y.b); + + case 11: + return _Json_listEquality(x.g, y.g); + } +} + +function _Json_listEquality(aDecoders, bDecoders) +{ + var len = aDecoders.length; + if (len !== bDecoders.length) + { + return false; + } + for (var i = 0; i < len; i++) + { + if (!_Json_equality(aDecoders[i], bDecoders[i])) + { + return false; + } + } + return true; +} + + +// ENCODE + +var _Json_encode = F2(function(indentLevel, value) +{ + return JSON.stringify(_Json_unwrap(value), null, indentLevel) + ''; +}); + +function _Json_wrap(value) { return { $: 0, a: value }; } +function _Json_unwrap(value) { return value.a; } + +function _Json_wrap_UNUSED(value) { return value; } +function _Json_unwrap_UNUSED(value) { return value; } + +function _Json_emptyArray() { return []; } +function _Json_emptyObject() { return {}; } + +var _Json_addField = F3(function(key, value, object) +{ + object[key] = _Json_unwrap(value); + return object; +}); + +function _Json_addEntry(func) +{ + return F2(function(entry, array) + { + array.push(_Json_unwrap(func(entry))); + return array; + }); +} + +var _Json_encodeNull = _Json_wrap(null); + + + +// TASKS + +function _Scheduler_succeed(value) +{ + return { + $: 0, + a: value + }; +} + +function _Scheduler_fail(error) +{ + return { + $: 1, + a: error + }; +} + +function _Scheduler_binding(callback) +{ + return { + $: 2, + b: callback, + c: null + }; +} + +var _Scheduler_andThen = F2(function(callback, task) +{ + return { + $: 3, + b: callback, + d: task + }; +}); + +var _Scheduler_onError = F2(function(callback, task) +{ + return { + $: 4, + b: callback, + d: task + }; +}); + +function _Scheduler_receive(callback) +{ + return { + $: 5, + b: callback + }; +} + + +// PROCESSES + +var _Scheduler_guid = 0; + +function _Scheduler_rawSpawn(task) +{ + var proc = { + $: 0, + e: _Scheduler_guid++, + f: task, + g: null, + h: [] + }; + + _Scheduler_enqueue(proc); + + return proc; +} + +function _Scheduler_spawn(task) +{ + return _Scheduler_binding(function(callback) { + callback(_Scheduler_succeed(_Scheduler_rawSpawn(task))); + }); +} + +function _Scheduler_rawSend(proc, msg) +{ + proc.h.push(msg); + _Scheduler_enqueue(proc); +} + +var _Scheduler_send = F2(function(proc, msg) +{ + return _Scheduler_binding(function(callback) { + _Scheduler_rawSend(proc, msg); + callback(_Scheduler_succeed(_Utils_Tuple0)); + }); +}); + +function _Scheduler_kill(proc) +{ + return _Scheduler_binding(function(callback) { + var task = proc.f; + if (task.$ === 2 && task.c) + { + task.c(); + } + + proc.f = null; + + callback(_Scheduler_succeed(_Utils_Tuple0)); + }); +} + + +/* STEP PROCESSES + +type alias Process = + { $ : tag + , id : unique_id + , root : Task + , stack : null | { $: SUCCEED | FAIL, a: callback, b: stack } + , mailbox : [msg] + } + +*/ + + +var _Scheduler_working = false; +var _Scheduler_queue = []; + + +function _Scheduler_enqueue(proc) +{ + _Scheduler_queue.push(proc); + if (_Scheduler_working) + { + return; + } + _Scheduler_working = true; + while (proc = _Scheduler_queue.shift()) + { + _Scheduler_step(proc); + } + _Scheduler_working = false; +} + + +function _Scheduler_step(proc) +{ + while (proc.f) + { + var rootTag = proc.f.$; + if (rootTag === 0 || rootTag === 1) + { + while (proc.g && proc.g.$ !== rootTag) + { + proc.g = proc.g.i; + } + if (!proc.g) + { + return; + } + proc.f = proc.g.b(proc.f.a); + proc.g = proc.g.i; + } + else if (rootTag === 2) + { + proc.f.c = proc.f.b(function(newRoot) { + proc.f = newRoot; + _Scheduler_enqueue(proc); + }); + return; + } + else if (rootTag === 5) + { + if (proc.h.length === 0) + { + return; + } + proc.f = proc.f.b(proc.h.shift()); + } + else // if (rootTag === 3 || rootTag === 4) + { + proc.g = { + $: rootTag === 3 ? 0 : 1, + b: proc.f.b, + i: proc.g + }; + proc.f = proc.f.d; + } + } +} + + + +function _Process_sleep(time) +{ + return _Scheduler_binding(function(callback) { + var id = setTimeout(function() { + callback(_Scheduler_succeed(_Utils_Tuple0)); + }, time); + + return function() { clearTimeout(id); }; + }); +} + + + + +// PROGRAMS + + +var _Platform_worker = F4(function(impl, flagDecoder, debugMetadata, args) +{ + return _Platform_initialize( + flagDecoder, + args, + impl.init, + impl.update, + impl.subscriptions, + function() { return function() {} } + ); +}); + + + +// INITIALIZE A PROGRAM + + +function _Platform_initialize(flagDecoder, args, init, update, subscriptions, stepperBuilder) +{ + var result = A2(_Json_run, flagDecoder, _Json_wrap(args ? args['flags'] : undefined)); + $elm$core$Result$isOk(result) || _Debug_crash(2 /**/, _Json_errorToString(result.a) /**/); + var managers = {}; + var initPair = init(result.a); + var model = initPair.a; + var stepper = stepperBuilder(sendToApp, model); + var ports = _Platform_setupEffects(managers, sendToApp); + + function sendToApp(msg, viewMetadata) + { + var pair = A2(update, msg, model); + stepper(model = pair.a, viewMetadata); + _Platform_enqueueEffects(managers, pair.b, subscriptions(model)); + } + + _Platform_enqueueEffects(managers, initPair.b, subscriptions(model)); + + return ports ? { ports: ports } : {}; +} + + + +// TRACK PRELOADS +// +// This is used by code in elm/browser and elm/http +// to register any HTTP requests that are triggered by init. +// + + +var _Platform_preload; + + +function _Platform_registerPreload(url) +{ + _Platform_preload.add(url); +} + + + +// EFFECT MANAGERS + + +var _Platform_effectManagers = {}; + + +function _Platform_setupEffects(managers, sendToApp) +{ + var ports; + + // setup all necessary effect managers + for (var key in _Platform_effectManagers) + { + var manager = _Platform_effectManagers[key]; + + if (manager.a) + { + ports = ports || {}; + ports[key] = manager.a(key, sendToApp); + } + + managers[key] = _Platform_instantiateManager(manager, sendToApp); + } + + return ports; +} + + +function _Platform_createManager(init, onEffects, onSelfMsg, cmdMap, subMap) +{ + return { + b: init, + c: onEffects, + d: onSelfMsg, + e: cmdMap, + f: subMap + }; +} + + +function _Platform_instantiateManager(info, sendToApp) +{ + var router = { + g: sendToApp, + h: undefined + }; + + var onEffects = info.c; + var onSelfMsg = info.d; + var cmdMap = info.e; + var subMap = info.f; + + function loop(state) + { + return A2(_Scheduler_andThen, loop, _Scheduler_receive(function(msg) + { + var value = msg.a; + + if (msg.$ === 0) + { + return A3(onSelfMsg, router, value, state); + } + + return cmdMap && subMap + ? A4(onEffects, router, value.i, value.j, state) + : A3(onEffects, router, cmdMap ? value.i : value.j, state); + })); + } + + return router.h = _Scheduler_rawSpawn(A2(_Scheduler_andThen, loop, info.b)); +} + + + +// ROUTING + + +var _Platform_sendToApp = F2(function(router, msg) +{ + return _Scheduler_binding(function(callback) + { + router.g(msg); + callback(_Scheduler_succeed(_Utils_Tuple0)); + }); +}); + + +var _Platform_sendToSelf = F2(function(router, msg) +{ + return A2(_Scheduler_send, router.h, { + $: 0, + a: msg + }); +}); + + + +// BAGS + + +function _Platform_leaf(home) +{ + return function(value) + { + return { + $: 1, + k: home, + l: value + }; + }; +} + + +function _Platform_batch(list) +{ + return { + $: 2, + m: list + }; +} + + +var _Platform_map = F2(function(tagger, bag) +{ + return { + $: 3, + n: tagger, + o: bag + } +}); + + + +// PIPE BAGS INTO EFFECT MANAGERS +// +// Effects must be queued! +// +// Say your init contains a synchronous command, like Time.now or Time.here +// +// - This will produce a batch of effects (FX_1) +// - The synchronous task triggers the subsequent `update` call +// - This will produce a batch of effects (FX_2) +// +// If we just start dispatching FX_2, subscriptions from FX_2 can be processed +// before subscriptions from FX_1. No good! Earlier versions of this code had +// this problem, leading to these reports: +// +// https://github.com/elm/core/issues/980 +// https://github.com/elm/core/pull/981 +// https://github.com/elm/compiler/issues/1776 +// +// The queue is necessary to avoid ordering issues for synchronous commands. + + +// Why use true/false here? Why not just check the length of the queue? +// The goal is to detect "are we currently dispatching effects?" If we +// are, we need to bail and let the ongoing while loop handle things. +// +// Now say the queue has 1 element. When we dequeue the final element, +// the queue will be empty, but we are still actively dispatching effects. +// So you could get queue jumping in a really tricky category of cases. +// +var _Platform_effectsQueue = []; +var _Platform_effectsActive = false; + + +function _Platform_enqueueEffects(managers, cmdBag, subBag) +{ + _Platform_effectsQueue.push({ p: managers, q: cmdBag, r: subBag }); + + if (_Platform_effectsActive) return; + + _Platform_effectsActive = true; + for (var fx; fx = _Platform_effectsQueue.shift(); ) + { + _Platform_dispatchEffects(fx.p, fx.q, fx.r); + } + _Platform_effectsActive = false; +} + + +function _Platform_dispatchEffects(managers, cmdBag, subBag) +{ + var effectsDict = {}; + _Platform_gatherEffects(true, cmdBag, effectsDict, null); + _Platform_gatherEffects(false, subBag, effectsDict, null); + + for (var home in managers) + { + _Scheduler_rawSend(managers[home], { + $: 'fx', + a: effectsDict[home] || { i: _List_Nil, j: _List_Nil } + }); + } +} + + +function _Platform_gatherEffects(isCmd, bag, effectsDict, taggers) +{ + switch (bag.$) + { + case 1: + var home = bag.k; + var effect = _Platform_toEffect(isCmd, home, taggers, bag.l); + effectsDict[home] = _Platform_insert(isCmd, effect, effectsDict[home]); + return; + + case 2: + for (var list = bag.m; list.b; list = list.b) // WHILE_CONS + { + _Platform_gatherEffects(isCmd, list.a, effectsDict, taggers); + } + return; + + case 3: + _Platform_gatherEffects(isCmd, bag.o, effectsDict, { + s: bag.n, + t: taggers + }); + return; + } +} + + +function _Platform_toEffect(isCmd, home, taggers, value) +{ + function applyTaggers(x) + { + for (var temp = taggers; temp; temp = temp.t) + { + x = temp.s(x); + } + return x; + } + + var map = isCmd + ? _Platform_effectManagers[home].e + : _Platform_effectManagers[home].f; + + return A2(map, applyTaggers, value) +} + + +function _Platform_insert(isCmd, newEffect, effects) +{ + effects = effects || { i: _List_Nil, j: _List_Nil }; + + isCmd + ? (effects.i = _List_Cons(newEffect, effects.i)) + : (effects.j = _List_Cons(newEffect, effects.j)); + + return effects; +} + + + +// PORTS + + +function _Platform_checkPortName(name) +{ + if (_Platform_effectManagers[name]) + { + _Debug_crash(3, name) + } +} + + + +// OUTGOING PORTS + + +function _Platform_outgoingPort(name, converter) +{ + _Platform_checkPortName(name); + _Platform_effectManagers[name] = { + e: _Platform_outgoingPortMap, + u: converter, + a: _Platform_setupOutgoingPort + }; + return _Platform_leaf(name); +} + + +var _Platform_outgoingPortMap = F2(function(tagger, value) { return value; }); + + +function _Platform_setupOutgoingPort(name) +{ + var subs = []; + var converter = _Platform_effectManagers[name].u; + + // CREATE MANAGER + + var init = _Process_sleep(0); + + _Platform_effectManagers[name].b = init; + _Platform_effectManagers[name].c = F3(function(router, cmdList, state) + { + for ( ; cmdList.b; cmdList = cmdList.b) // WHILE_CONS + { + // grab a separate reference to subs in case unsubscribe is called + var currentSubs = subs; + var value = _Json_unwrap(converter(cmdList.a)); + for (var i = 0; i < currentSubs.length; i++) + { + currentSubs[i](value); + } + } + return init; + }); + + // PUBLIC API + + function subscribe(callback) + { + subs.push(callback); + } + + function unsubscribe(callback) + { + // copy subs into a new array in case unsubscribe is called within a + // subscribed callback + subs = subs.slice(); + var index = subs.indexOf(callback); + if (index >= 0) + { + subs.splice(index, 1); + } + } + + return { + subscribe: subscribe, + unsubscribe: unsubscribe + }; +} + + + +// INCOMING PORTS + + +function _Platform_incomingPort(name, converter) +{ + _Platform_checkPortName(name); + _Platform_effectManagers[name] = { + f: _Platform_incomingPortMap, + u: converter, + a: _Platform_setupIncomingPort + }; + return _Platform_leaf(name); +} + + +var _Platform_incomingPortMap = F2(function(tagger, finalTagger) +{ + return function(value) + { + return tagger(finalTagger(value)); + }; +}); + + +function _Platform_setupIncomingPort(name, sendToApp) +{ + var subs = _List_Nil; + var converter = _Platform_effectManagers[name].u; + + // CREATE MANAGER + + var init = _Scheduler_succeed(null); + + _Platform_effectManagers[name].b = init; + _Platform_effectManagers[name].c = F3(function(router, subList, state) + { + subs = subList; + return init; + }); + + // PUBLIC API + + function send(incomingValue) + { + var result = A2(_Json_run, converter, _Json_wrap(incomingValue)); + + $elm$core$Result$isOk(result) || _Debug_crash(4, name, result.a); + + var value = result.a; + for (var temp = subs; temp.b; temp = temp.b) // WHILE_CONS + { + sendToApp(temp.a(value)); + } + } + + return { send: send }; +} + + + +// EXPORT ELM MODULES +// +// Have DEBUG and PROD versions so that we can (1) give nicer errors in +// debug mode and (2) not pay for the bits needed for that in prod mode. +// + + +function _Platform_export_UNUSED(exports) +{ + scope['Elm'] + ? _Platform_mergeExportsProd(scope['Elm'], exports) + : scope['Elm'] = exports; +} + + +function _Platform_mergeExportsProd(obj, exports) +{ + for (var name in exports) + { + (name in obj) + ? (name == 'init') + ? _Debug_crash(6) + : _Platform_mergeExportsProd(obj[name], exports[name]) + : (obj[name] = exports[name]); + } +} + + +function _Platform_export(exports) +{ + scope['Elm'] + ? _Platform_mergeExportsDebug('Elm', scope['Elm'], exports) + : scope['Elm'] = exports; +} + + +function _Platform_mergeExportsDebug(moduleName, obj, exports) +{ + for (var name in exports) + { + (name in obj) + ? (name == 'init') + ? _Debug_crash(6, moduleName) + : _Platform_mergeExportsDebug(moduleName + '.' + name, obj[name], exports[name]) + : (obj[name] = exports[name]); + } +} + + + + +// HELPERS + + +var _VirtualDom_divertHrefToApp; + +var _VirtualDom_doc = typeof document !== 'undefined' ? document : {}; + + +function _VirtualDom_appendChild(parent, child) +{ + parent.appendChild(child); +} + +var _VirtualDom_init = F4(function(virtualNode, flagDecoder, debugMetadata, args) +{ + // NOTE: this function needs _Platform_export available to work + + /**_UNUSED/ + var node = args['node']; + //*/ + /**/ + var node = args && args['node'] ? args['node'] : _Debug_crash(0); + //*/ + + node.parentNode.replaceChild( + _VirtualDom_render(virtualNode, function() {}), + node + ); + + return {}; +}); + + + +// TEXT + + +function _VirtualDom_text(string) +{ + return { + $: 0, + a: string + }; +} + + + +// NODE + + +var _VirtualDom_nodeNS = F2(function(namespace, tag) +{ + return F2(function(factList, kidList) + { + for (var kids = [], descendantsCount = 0; kidList.b; kidList = kidList.b) // WHILE_CONS + { + var kid = kidList.a; + descendantsCount += (kid.b || 0); + kids.push(kid); + } + descendantsCount += kids.length; + + return { + $: 1, + c: tag, + d: _VirtualDom_organizeFacts(factList), + e: kids, + f: namespace, + b: descendantsCount + }; + }); +}); + + +var _VirtualDom_node = _VirtualDom_nodeNS(undefined); + + + +// KEYED NODE + + +var _VirtualDom_keyedNodeNS = F2(function(namespace, tag) +{ + return F2(function(factList, kidList) + { + for (var kids = [], descendantsCount = 0; kidList.b; kidList = kidList.b) // WHILE_CONS + { + var kid = kidList.a; + descendantsCount += (kid.b.b || 0); + kids.push(kid); + } + descendantsCount += kids.length; + + return { + $: 2, + c: tag, + d: _VirtualDom_organizeFacts(factList), + e: kids, + f: namespace, + b: descendantsCount + }; + }); +}); + + +var _VirtualDom_keyedNode = _VirtualDom_keyedNodeNS(undefined); + + + +// CUSTOM + + +function _VirtualDom_custom(factList, model, render, diff) +{ + return { + $: 3, + d: _VirtualDom_organizeFacts(factList), + g: model, + h: render, + i: diff + }; +} + + + +// MAP + + +var _VirtualDom_map = F2(function(tagger, node) +{ + return { + $: 4, + j: tagger, + k: node, + b: 1 + (node.b || 0) + }; +}); + + + +// LAZY + + +function _VirtualDom_thunk(refs, thunk) +{ + return { + $: 5, + l: refs, + m: thunk, + k: undefined + }; +} + +var _VirtualDom_lazy = F2(function(func, a) +{ + return _VirtualDom_thunk([func, a], function() { + return func(a); + }); +}); + +var _VirtualDom_lazy2 = F3(function(func, a, b) +{ + return _VirtualDom_thunk([func, a, b], function() { + return A2(func, a, b); + }); +}); + +var _VirtualDom_lazy3 = F4(function(func, a, b, c) +{ + return _VirtualDom_thunk([func, a, b, c], function() { + return A3(func, a, b, c); + }); +}); + +var _VirtualDom_lazy4 = F5(function(func, a, b, c, d) +{ + return _VirtualDom_thunk([func, a, b, c, d], function() { + return A4(func, a, b, c, d); + }); +}); + +var _VirtualDom_lazy5 = F6(function(func, a, b, c, d, e) +{ + return _VirtualDom_thunk([func, a, b, c, d, e], function() { + return A5(func, a, b, c, d, e); + }); +}); + +var _VirtualDom_lazy6 = F7(function(func, a, b, c, d, e, f) +{ + return _VirtualDom_thunk([func, a, b, c, d, e, f], function() { + return A6(func, a, b, c, d, e, f); + }); +}); + +var _VirtualDom_lazy7 = F8(function(func, a, b, c, d, e, f, g) +{ + return _VirtualDom_thunk([func, a, b, c, d, e, f, g], function() { + return A7(func, a, b, c, d, e, f, g); + }); +}); + +var _VirtualDom_lazy8 = F9(function(func, a, b, c, d, e, f, g, h) +{ + return _VirtualDom_thunk([func, a, b, c, d, e, f, g, h], function() { + return A8(func, a, b, c, d, e, f, g, h); + }); +}); + + + +// FACTS + + +var _VirtualDom_on = F2(function(key, handler) +{ + return { + $: 'a0', + n: key, + o: handler + }; +}); +var _VirtualDom_style = F2(function(key, value) +{ + return { + $: 'a1', + n: key, + o: value + }; +}); +var _VirtualDom_property = F2(function(key, value) +{ + return { + $: 'a2', + n: key, + o: value + }; +}); +var _VirtualDom_attribute = F2(function(key, value) +{ + return { + $: 'a3', + n: key, + o: value + }; +}); +var _VirtualDom_attributeNS = F3(function(namespace, key, value) +{ + return { + $: 'a4', + n: key, + o: { f: namespace, o: value } + }; +}); + + + +// XSS ATTACK VECTOR CHECKS +// +// For some reason, tabs can appear in href protocols and it still works. +// So '\tjava\tSCRIPT:alert("!!!")' and 'javascript:alert("!!!")' are the same +// in practice. That is why _VirtualDom_RE_js and _VirtualDom_RE_js_html look +// so freaky. +// +// Pulling the regular expressions out to the top level gives a slight speed +// boost in small benchmarks (4-10%) but hoisting values to reduce allocation +// can be unpredictable in large programs where JIT may have a harder time with +// functions are not fully self-contained. The benefit is more that the js and +// js_html ones are so weird that I prefer to see them near each other. + + +var _VirtualDom_RE_script = /^script$/i; +var _VirtualDom_RE_on_formAction = /^(on|formAction$)/i; +var _VirtualDom_RE_js = /^\s*j\s*a\s*v\s*a\s*s\s*c\s*r\s*i\s*p\s*t\s*:/i; +var _VirtualDom_RE_js_html = /^\s*(j\s*a\s*v\s*a\s*s\s*c\s*r\s*i\s*p\s*t\s*:|d\s*a\s*t\s*a\s*:\s*t\s*e\s*x\s*t\s*\/\s*h\s*t\s*m\s*l\s*(,|;))/i; + + +function _VirtualDom_noScript(tag) +{ + return _VirtualDom_RE_script.test(tag) ? 'p' : tag; +} + +function _VirtualDom_noOnOrFormAction(key) +{ + return _VirtualDom_RE_on_formAction.test(key) ? 'data-' + key : key; +} + +function _VirtualDom_noInnerHtmlOrFormAction(key) +{ + return key == 'innerHTML' || key == 'formAction' ? 'data-' + key : key; +} + +function _VirtualDom_noJavaScriptUri(value) +{ + return _VirtualDom_RE_js.test(value) + ? /**_UNUSED/''//*//**/'javascript:alert("This is an XSS vector. Please use ports or web components instead.")'//*/ + : value; +} + +function _VirtualDom_noJavaScriptOrHtmlUri(value) +{ + return _VirtualDom_RE_js_html.test(value) + ? /**_UNUSED/''//*//**/'javascript:alert("This is an XSS vector. Please use ports or web components instead.")'//*/ + : value; +} + +function _VirtualDom_noJavaScriptOrHtmlJson(value) +{ + return (typeof _Json_unwrap(value) === 'string' && _VirtualDom_RE_js_html.test(_Json_unwrap(value))) + ? _Json_wrap( + /**_UNUSED/''//*//**/'javascript:alert("This is an XSS vector. Please use ports or web components instead.")'//*/ + ) : value; +} + + + +// MAP FACTS + + +var _VirtualDom_mapAttribute = F2(function(func, attr) +{ + return (attr.$ === 'a0') + ? A2(_VirtualDom_on, attr.n, _VirtualDom_mapHandler(func, attr.o)) + : attr; +}); + +function _VirtualDom_mapHandler(func, handler) +{ + var tag = $elm$virtual_dom$VirtualDom$toHandlerInt(handler); + + // 0 = Normal + // 1 = MayStopPropagation + // 2 = MayPreventDefault + // 3 = Custom + + return { + $: handler.$, + a: + !tag + ? A2($elm$json$Json$Decode$map, func, handler.a) + : + A3($elm$json$Json$Decode$map2, + tag < 3 + ? _VirtualDom_mapEventTuple + : _VirtualDom_mapEventRecord, + $elm$json$Json$Decode$succeed(func), + handler.a + ) + }; +} + +var _VirtualDom_mapEventTuple = F2(function(func, tuple) +{ + return _Utils_Tuple2(func(tuple.a), tuple.b); +}); + +var _VirtualDom_mapEventRecord = F2(function(func, record) +{ + return { + message: func(record.message), + stopPropagation: record.stopPropagation, + preventDefault: record.preventDefault + } +}); + + + +// ORGANIZE FACTS + + +function _VirtualDom_organizeFacts(factList) +{ + for (var facts = {}; factList.b; factList = factList.b) // WHILE_CONS + { + var entry = factList.a; + + var tag = entry.$; + var key = entry.n; + var value = entry.o; + + if (tag === 'a2') + { + (key === 'className') + ? _VirtualDom_addClass(facts, key, _Json_unwrap(value)) + : facts[key] = _Json_unwrap(value); + + continue; + } + + var subFacts = facts[tag] || (facts[tag] = {}); + (tag === 'a3' && key === 'class') + ? _VirtualDom_addClass(subFacts, key, value) + : subFacts[key] = value; + } + + return facts; +} + +function _VirtualDom_addClass(object, key, newClass) +{ + var classes = object[key]; + object[key] = classes ? classes + ' ' + newClass : newClass; +} + + + +// RENDER + + +function _VirtualDom_render(vNode, eventNode) +{ + var tag = vNode.$; + + if (tag === 5) + { + return _VirtualDom_render(vNode.k || (vNode.k = vNode.m()), eventNode); + } + + if (tag === 0) + { + return _VirtualDom_doc.createTextNode(vNode.a); + } + + if (tag === 4) + { + var subNode = vNode.k; + var tagger = vNode.j; + + while (subNode.$ === 4) + { + typeof tagger !== 'object' + ? tagger = [tagger, subNode.j] + : tagger.push(subNode.j); + + subNode = subNode.k; + } + + var subEventRoot = { j: tagger, p: eventNode }; + var domNode = _VirtualDom_render(subNode, subEventRoot); + domNode.elm_event_node_ref = subEventRoot; + return domNode; + } + + if (tag === 3) + { + var domNode = vNode.h(vNode.g); + _VirtualDom_applyFacts(domNode, eventNode, vNode.d); + return domNode; + } + + // at this point `tag` must be 1 or 2 + + var domNode = vNode.f + ? _VirtualDom_doc.createElementNS(vNode.f, vNode.c) + : _VirtualDom_doc.createElement(vNode.c); + + if (_VirtualDom_divertHrefToApp && vNode.c == 'a') + { + domNode.addEventListener('click', _VirtualDom_divertHrefToApp(domNode)); + } + + _VirtualDom_applyFacts(domNode, eventNode, vNode.d); + + for (var kids = vNode.e, i = 0; i < kids.length; i++) + { + _VirtualDom_appendChild(domNode, _VirtualDom_render(tag === 1 ? kids[i] : kids[i].b, eventNode)); + } + + return domNode; +} + + + +// APPLY FACTS + + +function _VirtualDom_applyFacts(domNode, eventNode, facts) +{ + for (var key in facts) + { + var value = facts[key]; + + key === 'a1' + ? _VirtualDom_applyStyles(domNode, value) + : + key === 'a0' + ? _VirtualDom_applyEvents(domNode, eventNode, value) + : + key === 'a3' + ? _VirtualDom_applyAttrs(domNode, value) + : + key === 'a4' + ? _VirtualDom_applyAttrsNS(domNode, value) + : + ((key !== 'value' && key !== 'checked') || domNode[key] !== value) && (domNode[key] = value); + } +} + + + +// APPLY STYLES + + +function _VirtualDom_applyStyles(domNode, styles) +{ + var domNodeStyle = domNode.style; + + for (var key in styles) + { + domNodeStyle[key] = styles[key]; + } +} + + + +// APPLY ATTRS + + +function _VirtualDom_applyAttrs(domNode, attrs) +{ + for (var key in attrs) + { + var value = attrs[key]; + typeof value !== 'undefined' + ? domNode.setAttribute(key, value) + : domNode.removeAttribute(key); + } +} + + + +// APPLY NAMESPACED ATTRS + + +function _VirtualDom_applyAttrsNS(domNode, nsAttrs) +{ + for (var key in nsAttrs) + { + var pair = nsAttrs[key]; + var namespace = pair.f; + var value = pair.o; + + typeof value !== 'undefined' + ? domNode.setAttributeNS(namespace, key, value) + : domNode.removeAttributeNS(namespace, key); + } +} + + + +// APPLY EVENTS + + +function _VirtualDom_applyEvents(domNode, eventNode, events) +{ + var allCallbacks = domNode.elmFs || (domNode.elmFs = {}); + + for (var key in events) + { + var newHandler = events[key]; + var oldCallback = allCallbacks[key]; + + if (!newHandler) + { + domNode.removeEventListener(key, oldCallback); + allCallbacks[key] = undefined; + continue; + } + + if (oldCallback) + { + var oldHandler = oldCallback.q; + if (oldHandler.$ === newHandler.$) + { + oldCallback.q = newHandler; + continue; + } + domNode.removeEventListener(key, oldCallback); + } + + oldCallback = _VirtualDom_makeCallback(eventNode, newHandler); + domNode.addEventListener(key, oldCallback, + _VirtualDom_passiveSupported + && { passive: $elm$virtual_dom$VirtualDom$toHandlerInt(newHandler) < 2 } + ); + allCallbacks[key] = oldCallback; + } +} + + + +// PASSIVE EVENTS + + +var _VirtualDom_passiveSupported; + +try +{ + window.addEventListener('t', null, Object.defineProperty({}, 'passive', { + get: function() { _VirtualDom_passiveSupported = true; } + })); +} +catch(e) {} + + + +// EVENT HANDLERS + + +function _VirtualDom_makeCallback(eventNode, initialHandler) +{ + function callback(event) + { + var handler = callback.q; + var result = _Json_runHelp(handler.a, event); + + if (!$elm$core$Result$isOk(result)) + { + return; + } + + var tag = $elm$virtual_dom$VirtualDom$toHandlerInt(handler); + + // 0 = Normal + // 1 = MayStopPropagation + // 2 = MayPreventDefault + // 3 = Custom + + var value = result.a; + var message = !tag ? value : tag < 3 ? value.a : value.message; + var stopPropagation = tag == 1 ? value.b : tag == 3 && value.stopPropagation; + var currentEventNode = ( + stopPropagation && event.stopPropagation(), + (tag == 2 ? value.b : tag == 3 && value.preventDefault) && event.preventDefault(), + eventNode + ); + var tagger; + var i; + while (tagger = currentEventNode.j) + { + if (typeof tagger == 'function') + { + message = tagger(message); + } + else + { + for (var i = tagger.length; i--; ) + { + message = tagger[i](message); + } + } + currentEventNode = currentEventNode.p; + } + currentEventNode(message, stopPropagation); // stopPropagation implies isSync + } + + callback.q = initialHandler; + + return callback; +} + +function _VirtualDom_equalEvents(x, y) +{ + return x.$ == y.$ && _Json_equality(x.a, y.a); +} + + + +// DIFF + + +// TODO: Should we do patches like in iOS? +// +// type Patch +// = At Int Patch +// | Batch (List Patch) +// | Change ... +// +// How could it not be better? +// +function _VirtualDom_diff(x, y) +{ + var patches = []; + _VirtualDom_diffHelp(x, y, patches, 0); + return patches; +} + + +function _VirtualDom_pushPatch(patches, type, index, data) +{ + var patch = { + $: type, + r: index, + s: data, + t: undefined, + u: undefined + }; + patches.push(patch); + return patch; +} + + +function _VirtualDom_diffHelp(x, y, patches, index) +{ + if (x === y) + { + return; + } + + var xType = x.$; + var yType = y.$; + + // Bail if you run into different types of nodes. Implies that the + // structure has changed significantly and it's not worth a diff. + if (xType !== yType) + { + if (xType === 1 && yType === 2) + { + y = _VirtualDom_dekey(y); + yType = 1; + } + else + { + _VirtualDom_pushPatch(patches, 0, index, y); + return; + } + } + + // Now we know that both nodes are the same $. + switch (yType) + { + case 5: + var xRefs = x.l; + var yRefs = y.l; + var i = xRefs.length; + var same = i === yRefs.length; + while (same && i--) + { + same = xRefs[i] === yRefs[i]; + } + if (same) + { + y.k = x.k; + return; + } + y.k = y.m(); + var subPatches = []; + _VirtualDom_diffHelp(x.k, y.k, subPatches, 0); + subPatches.length > 0 && _VirtualDom_pushPatch(patches, 1, index, subPatches); + return; + + case 4: + // gather nested taggers + var xTaggers = x.j; + var yTaggers = y.j; + var nesting = false; + + var xSubNode = x.k; + while (xSubNode.$ === 4) + { + nesting = true; + + typeof xTaggers !== 'object' + ? xTaggers = [xTaggers, xSubNode.j] + : xTaggers.push(xSubNode.j); + + xSubNode = xSubNode.k; + } + + var ySubNode = y.k; + while (ySubNode.$ === 4) + { + nesting = true; + + typeof yTaggers !== 'object' + ? yTaggers = [yTaggers, ySubNode.j] + : yTaggers.push(ySubNode.j); + + ySubNode = ySubNode.k; + } + + // Just bail if different numbers of taggers. This implies the + // structure of the virtual DOM has changed. + if (nesting && xTaggers.length !== yTaggers.length) + { + _VirtualDom_pushPatch(patches, 0, index, y); + return; + } + + // check if taggers are "the same" + if (nesting ? !_VirtualDom_pairwiseRefEqual(xTaggers, yTaggers) : xTaggers !== yTaggers) + { + _VirtualDom_pushPatch(patches, 2, index, yTaggers); + } + + // diff everything below the taggers + _VirtualDom_diffHelp(xSubNode, ySubNode, patches, index + 1); + return; + + case 0: + if (x.a !== y.a) + { + _VirtualDom_pushPatch(patches, 3, index, y.a); + } + return; + + case 1: + _VirtualDom_diffNodes(x, y, patches, index, _VirtualDom_diffKids); + return; + + case 2: + _VirtualDom_diffNodes(x, y, patches, index, _VirtualDom_diffKeyedKids); + return; + + case 3: + if (x.h !== y.h) + { + _VirtualDom_pushPatch(patches, 0, index, y); + return; + } + + var factsDiff = _VirtualDom_diffFacts(x.d, y.d); + factsDiff && _VirtualDom_pushPatch(patches, 4, index, factsDiff); + + var patch = y.i(x.g, y.g); + patch && _VirtualDom_pushPatch(patches, 5, index, patch); + + return; + } +} + +// assumes the incoming arrays are the same length +function _VirtualDom_pairwiseRefEqual(as, bs) +{ + for (var i = 0; i < as.length; i++) + { + if (as[i] !== bs[i]) + { + return false; + } + } + + return true; +} + +function _VirtualDom_diffNodes(x, y, patches, index, diffKids) +{ + // Bail if obvious indicators have changed. Implies more serious + // structural changes such that it's not worth it to diff. + if (x.c !== y.c || x.f !== y.f) + { + _VirtualDom_pushPatch(patches, 0, index, y); + return; + } + + var factsDiff = _VirtualDom_diffFacts(x.d, y.d); + factsDiff && _VirtualDom_pushPatch(patches, 4, index, factsDiff); + + diffKids(x, y, patches, index); +} + + + +// DIFF FACTS + + +// TODO Instead of creating a new diff object, it's possible to just test if +// there *is* a diff. During the actual patch, do the diff again and make the +// modifications directly. This way, there's no new allocations. Worth it? +function _VirtualDom_diffFacts(x, y, category) +{ + var diff; + + // look for changes and removals + for (var xKey in x) + { + if (xKey === 'a1' || xKey === 'a0' || xKey === 'a3' || xKey === 'a4') + { + var subDiff = _VirtualDom_diffFacts(x[xKey], y[xKey] || {}, xKey); + if (subDiff) + { + diff = diff || {}; + diff[xKey] = subDiff; + } + continue; + } + + // remove if not in the new facts + if (!(xKey in y)) + { + diff = diff || {}; + diff[xKey] = + !category + ? (typeof x[xKey] === 'string' ? '' : null) + : + (category === 'a1') + ? '' + : + (category === 'a0' || category === 'a3') + ? undefined + : + { f: x[xKey].f, o: undefined }; + + continue; + } + + var xValue = x[xKey]; + var yValue = y[xKey]; + + // reference equal, so don't worry about it + if (xValue === yValue && xKey !== 'value' && xKey !== 'checked' + || category === 'a0' && _VirtualDom_equalEvents(xValue, yValue)) + { + continue; + } + + diff = diff || {}; + diff[xKey] = yValue; + } + + // add new stuff + for (var yKey in y) + { + if (!(yKey in x)) + { + diff = diff || {}; + diff[yKey] = y[yKey]; + } + } + + return diff; +} + + + +// DIFF KIDS + + +function _VirtualDom_diffKids(xParent, yParent, patches, index) +{ + var xKids = xParent.e; + var yKids = yParent.e; + + var xLen = xKids.length; + var yLen = yKids.length; + + // FIGURE OUT IF THERE ARE INSERTS OR REMOVALS + + if (xLen > yLen) + { + _VirtualDom_pushPatch(patches, 6, index, { + v: yLen, + i: xLen - yLen + }); + } + else if (xLen < yLen) + { + _VirtualDom_pushPatch(patches, 7, index, { + v: xLen, + e: yKids + }); + } + + // PAIRWISE DIFF EVERYTHING ELSE + + for (var minLen = xLen < yLen ? xLen : yLen, i = 0; i < minLen; i++) + { + var xKid = xKids[i]; + _VirtualDom_diffHelp(xKid, yKids[i], patches, ++index); + index += xKid.b || 0; + } +} + + + +// KEYED DIFF + + +function _VirtualDom_diffKeyedKids(xParent, yParent, patches, rootIndex) +{ + var localPatches = []; + + var changes = {}; // Dict String Entry + var inserts = []; // Array { index : Int, entry : Entry } + // type Entry = { tag : String, vnode : VNode, index : Int, data : _ } + + var xKids = xParent.e; + var yKids = yParent.e; + var xLen = xKids.length; + var yLen = yKids.length; + var xIndex = 0; + var yIndex = 0; + + var index = rootIndex; + + while (xIndex < xLen && yIndex < yLen) + { + var x = xKids[xIndex]; + var y = yKids[yIndex]; + + var xKey = x.a; + var yKey = y.a; + var xNode = x.b; + var yNode = y.b; + + var newMatch = undefined; + var oldMatch = undefined; + + // check if keys match + + if (xKey === yKey) + { + index++; + _VirtualDom_diffHelp(xNode, yNode, localPatches, index); + index += xNode.b || 0; + + xIndex++; + yIndex++; + continue; + } + + // look ahead 1 to detect insertions and removals. + + var xNext = xKids[xIndex + 1]; + var yNext = yKids[yIndex + 1]; + + if (xNext) + { + var xNextKey = xNext.a; + var xNextNode = xNext.b; + oldMatch = yKey === xNextKey; + } + + if (yNext) + { + var yNextKey = yNext.a; + var yNextNode = yNext.b; + newMatch = xKey === yNextKey; + } + + + // swap x and y + if (newMatch && oldMatch) + { + index++; + _VirtualDom_diffHelp(xNode, yNextNode, localPatches, index); + _VirtualDom_insertNode(changes, localPatches, xKey, yNode, yIndex, inserts); + index += xNode.b || 0; + + index++; + _VirtualDom_removeNode(changes, localPatches, xKey, xNextNode, index); + index += xNextNode.b || 0; + + xIndex += 2; + yIndex += 2; + continue; + } + + // insert y + if (newMatch) + { + index++; + _VirtualDom_insertNode(changes, localPatches, yKey, yNode, yIndex, inserts); + _VirtualDom_diffHelp(xNode, yNextNode, localPatches, index); + index += xNode.b || 0; + + xIndex += 1; + yIndex += 2; + continue; + } + + // remove x + if (oldMatch) + { + index++; + _VirtualDom_removeNode(changes, localPatches, xKey, xNode, index); + index += xNode.b || 0; + + index++; + _VirtualDom_diffHelp(xNextNode, yNode, localPatches, index); + index += xNextNode.b || 0; + + xIndex += 2; + yIndex += 1; + continue; + } + + // remove x, insert y + if (xNext && xNextKey === yNextKey) + { + index++; + _VirtualDom_removeNode(changes, localPatches, xKey, xNode, index); + _VirtualDom_insertNode(changes, localPatches, yKey, yNode, yIndex, inserts); + index += xNode.b || 0; + + index++; + _VirtualDom_diffHelp(xNextNode, yNextNode, localPatches, index); + index += xNextNode.b || 0; + + xIndex += 2; + yIndex += 2; + continue; + } + + break; + } + + // eat up any remaining nodes with removeNode and insertNode + + while (xIndex < xLen) + { + index++; + var x = xKids[xIndex]; + var xNode = x.b; + _VirtualDom_removeNode(changes, localPatches, x.a, xNode, index); + index += xNode.b || 0; + xIndex++; + } + + while (yIndex < yLen) + { + var endInserts = endInserts || []; + var y = yKids[yIndex]; + _VirtualDom_insertNode(changes, localPatches, y.a, y.b, undefined, endInserts); + yIndex++; + } + + if (localPatches.length > 0 || inserts.length > 0 || endInserts) + { + _VirtualDom_pushPatch(patches, 8, rootIndex, { + w: localPatches, + x: inserts, + y: endInserts + }); + } +} + + + +// CHANGES FROM KEYED DIFF + + +var _VirtualDom_POSTFIX = '_elmW6BL'; + + +function _VirtualDom_insertNode(changes, localPatches, key, vnode, yIndex, inserts) +{ + var entry = changes[key]; + + // never seen this key before + if (!entry) + { + entry = { + c: 0, + z: vnode, + r: yIndex, + s: undefined + }; + + inserts.push({ r: yIndex, A: entry }); + changes[key] = entry; + + return; + } + + // this key was removed earlier, a match! + if (entry.c === 1) + { + inserts.push({ r: yIndex, A: entry }); + + entry.c = 2; + var subPatches = []; + _VirtualDom_diffHelp(entry.z, vnode, subPatches, entry.r); + entry.r = yIndex; + entry.s.s = { + w: subPatches, + A: entry + }; + + return; + } + + // this key has already been inserted or moved, a duplicate! + _VirtualDom_insertNode(changes, localPatches, key + _VirtualDom_POSTFIX, vnode, yIndex, inserts); +} + + +function _VirtualDom_removeNode(changes, localPatches, key, vnode, index) +{ + var entry = changes[key]; + + // never seen this key before + if (!entry) + { + var patch = _VirtualDom_pushPatch(localPatches, 9, index, undefined); + + changes[key] = { + c: 1, + z: vnode, + r: index, + s: patch + }; + + return; + } + + // this key was inserted earlier, a match! + if (entry.c === 0) + { + entry.c = 2; + var subPatches = []; + _VirtualDom_diffHelp(vnode, entry.z, subPatches, index); + + _VirtualDom_pushPatch(localPatches, 9, index, { + w: subPatches, + A: entry + }); + + return; + } + + // this key has already been removed or moved, a duplicate! + _VirtualDom_removeNode(changes, localPatches, key + _VirtualDom_POSTFIX, vnode, index); +} + + + +// ADD DOM NODES +// +// Each DOM node has an "index" assigned in order of traversal. It is important +// to minimize our crawl over the actual DOM, so these indexes (along with the +// descendantsCount of virtual nodes) let us skip touching entire subtrees of +// the DOM if we know there are no patches there. + + +function _VirtualDom_addDomNodes(domNode, vNode, patches, eventNode) +{ + _VirtualDom_addDomNodesHelp(domNode, vNode, patches, 0, 0, vNode.b, eventNode); +} + + +// assumes `patches` is non-empty and indexes increase monotonically. +function _VirtualDom_addDomNodesHelp(domNode, vNode, patches, i, low, high, eventNode) +{ + var patch = patches[i]; + var index = patch.r; + + while (index === low) + { + var patchType = patch.$; + + if (patchType === 1) + { + _VirtualDom_addDomNodes(domNode, vNode.k, patch.s, eventNode); + } + else if (patchType === 8) + { + patch.t = domNode; + patch.u = eventNode; + + var subPatches = patch.s.w; + if (subPatches.length > 0) + { + _VirtualDom_addDomNodesHelp(domNode, vNode, subPatches, 0, low, high, eventNode); + } + } + else if (patchType === 9) + { + patch.t = domNode; + patch.u = eventNode; + + var data = patch.s; + if (data) + { + data.A.s = domNode; + var subPatches = data.w; + if (subPatches.length > 0) + { + _VirtualDom_addDomNodesHelp(domNode, vNode, subPatches, 0, low, high, eventNode); + } + } + } + else + { + patch.t = domNode; + patch.u = eventNode; + } + + i++; + + if (!(patch = patches[i]) || (index = patch.r) > high) + { + return i; + } + } + + var tag = vNode.$; + + if (tag === 4) + { + var subNode = vNode.k; + + while (subNode.$ === 4) + { + subNode = subNode.k; + } + + return _VirtualDom_addDomNodesHelp(domNode, subNode, patches, i, low + 1, high, domNode.elm_event_node_ref); + } + + // tag must be 1 or 2 at this point + + var vKids = vNode.e; + var childNodes = domNode.childNodes; + for (var j = 0; j < vKids.length; j++) + { + low++; + var vKid = tag === 1 ? vKids[j] : vKids[j].b; + var nextLow = low + (vKid.b || 0); + if (low <= index && index <= nextLow) + { + i = _VirtualDom_addDomNodesHelp(childNodes[j], vKid, patches, i, low, nextLow, eventNode); + if (!(patch = patches[i]) || (index = patch.r) > high) + { + return i; + } + } + low = nextLow; + } + return i; +} + + + +// APPLY PATCHES + + +function _VirtualDom_applyPatches(rootDomNode, oldVirtualNode, patches, eventNode) +{ + if (patches.length === 0) + { + return rootDomNode; + } + + _VirtualDom_addDomNodes(rootDomNode, oldVirtualNode, patches, eventNode); + return _VirtualDom_applyPatchesHelp(rootDomNode, patches); +} + +function _VirtualDom_applyPatchesHelp(rootDomNode, patches) +{ + for (var i = 0; i < patches.length; i++) + { + var patch = patches[i]; + var localDomNode = patch.t + var newNode = _VirtualDom_applyPatch(localDomNode, patch); + if (localDomNode === rootDomNode) + { + rootDomNode = newNode; + } + } + return rootDomNode; +} + +function _VirtualDom_applyPatch(domNode, patch) +{ + switch (patch.$) + { + case 0: + return _VirtualDom_applyPatchRedraw(domNode, patch.s, patch.u); + + case 4: + _VirtualDom_applyFacts(domNode, patch.u, patch.s); + return domNode; + + case 3: + domNode.replaceData(0, domNode.length, patch.s); + return domNode; + + case 1: + return _VirtualDom_applyPatchesHelp(domNode, patch.s); + + case 2: + if (domNode.elm_event_node_ref) + { + domNode.elm_event_node_ref.j = patch.s; + } + else + { + domNode.elm_event_node_ref = { j: patch.s, p: patch.u }; + } + return domNode; + + case 6: + var data = patch.s; + for (var i = 0; i < data.i; i++) + { + domNode.removeChild(domNode.childNodes[data.v]); + } + return domNode; + + case 7: + var data = patch.s; + var kids = data.e; + var i = data.v; + var theEnd = domNode.childNodes[i]; + for (; i < kids.length; i++) + { + domNode.insertBefore(_VirtualDom_render(kids[i], patch.u), theEnd); + } + return domNode; + + case 9: + var data = patch.s; + if (!data) + { + domNode.parentNode.removeChild(domNode); + return domNode; + } + var entry = data.A; + if (typeof entry.r !== 'undefined') + { + domNode.parentNode.removeChild(domNode); + } + entry.s = _VirtualDom_applyPatchesHelp(domNode, data.w); + return domNode; + + case 8: + return _VirtualDom_applyPatchReorder(domNode, patch); + + case 5: + return patch.s(domNode); + + default: + _Debug_crash(10); // 'Ran into an unknown patch!' + } +} + + +function _VirtualDom_applyPatchRedraw(domNode, vNode, eventNode) +{ + var parentNode = domNode.parentNode; + var newNode = _VirtualDom_render(vNode, eventNode); + + if (!newNode.elm_event_node_ref) + { + newNode.elm_event_node_ref = domNode.elm_event_node_ref; + } + + if (parentNode && newNode !== domNode) + { + parentNode.replaceChild(newNode, domNode); + } + return newNode; +} + + +function _VirtualDom_applyPatchReorder(domNode, patch) +{ + var data = patch.s; + + // remove end inserts + var frag = _VirtualDom_applyPatchReorderEndInsertsHelp(data.y, patch); + + // removals + domNode = _VirtualDom_applyPatchesHelp(domNode, data.w); + + // inserts + var inserts = data.x; + for (var i = 0; i < inserts.length; i++) + { + var insert = inserts[i]; + var entry = insert.A; + var node = entry.c === 2 + ? entry.s + : _VirtualDom_render(entry.z, patch.u); + domNode.insertBefore(node, domNode.childNodes[insert.r]); + } + + // add end inserts + if (frag) + { + _VirtualDom_appendChild(domNode, frag); + } + + return domNode; +} + + +function _VirtualDom_applyPatchReorderEndInsertsHelp(endInserts, patch) +{ + if (!endInserts) + { + return; + } + + var frag = _VirtualDom_doc.createDocumentFragment(); + for (var i = 0; i < endInserts.length; i++) + { + var insert = endInserts[i]; + var entry = insert.A; + _VirtualDom_appendChild(frag, entry.c === 2 + ? entry.s + : _VirtualDom_render(entry.z, patch.u) + ); + } + return frag; +} + + +function _VirtualDom_virtualize(node) +{ + // TEXT NODES + + if (node.nodeType === 3) + { + return _VirtualDom_text(node.textContent); + } + + + // WEIRD NODES + + if (node.nodeType !== 1) + { + return _VirtualDom_text(''); + } + + + // ELEMENT NODES + + var attrList = _List_Nil; + var attrs = node.attributes; + for (var i = attrs.length; i--; ) + { + var attr = attrs[i]; + var name = attr.name; + var value = attr.value; + attrList = _List_Cons( A2(_VirtualDom_attribute, name, value), attrList ); + } + + var tag = node.tagName.toLowerCase(); + var kidList = _List_Nil; + var kids = node.childNodes; + + for (var i = kids.length; i--; ) + { + kidList = _List_Cons(_VirtualDom_virtualize(kids[i]), kidList); + } + return A3(_VirtualDom_node, tag, attrList, kidList); +} + +function _VirtualDom_dekey(keyedNode) +{ + var keyedKids = keyedNode.e; + var len = keyedKids.length; + var kids = new Array(len); + for (var i = 0; i < len; i++) + { + kids[i] = keyedKids[i].b; + } + + return { + $: 1, + c: keyedNode.c, + d: keyedNode.d, + e: kids, + f: keyedNode.f, + b: keyedNode.b + }; +} + + + +var _Bitwise_and = F2(function(a, b) +{ + return a & b; +}); + +var _Bitwise_or = F2(function(a, b) +{ + return a | b; +}); + +var _Bitwise_xor = F2(function(a, b) +{ + return a ^ b; +}); + +function _Bitwise_complement(a) +{ + return ~a; +}; + +var _Bitwise_shiftLeftBy = F2(function(offset, a) +{ + return a << offset; +}); + +var _Bitwise_shiftRightBy = F2(function(offset, a) +{ + return a >> offset; +}); + +var _Bitwise_shiftRightZfBy = F2(function(offset, a) +{ + return a >>> offset; +}); + + + + +// HELPERS + + +function _Debugger_unsafeCoerce(value) +{ + return value; +} + + + +// PROGRAMS + + +var _Debugger_element = F4(function(impl, flagDecoder, debugMetadata, args) +{ + return _Platform_initialize( + flagDecoder, + args, + A3($elm$browser$Debugger$Main$wrapInit, _Json_wrap(debugMetadata), _Debugger_popout(), impl.init), + $elm$browser$Debugger$Main$wrapUpdate(impl.update), + $elm$browser$Debugger$Main$wrapSubs(impl.subscriptions), + function(sendToApp, initialModel) + { + var view = impl.view; + var title = _VirtualDom_doc.title; + var domNode = args && args['node'] ? args['node'] : _Debug_crash(0); + var currNode = _VirtualDom_virtualize(domNode); + var currBlocker = $elm$browser$Debugger$Main$toBlockerType(initialModel); + var currPopout; + + var cornerNode = _VirtualDom_doc.createElement('div'); + domNode.parentNode.insertBefore(cornerNode, domNode.nextSibling); + var cornerCurr = _VirtualDom_virtualize(cornerNode); + + initialModel.popout.a = sendToApp; + + return _Browser_makeAnimator(initialModel, function(model) + { + var nextNode = A2(_VirtualDom_map, $elm$browser$Debugger$Main$UserMsg, view($elm$browser$Debugger$Main$getUserModel(model))); + var patches = _VirtualDom_diff(currNode, nextNode); + domNode = _VirtualDom_applyPatches(domNode, currNode, patches, sendToApp); + currNode = nextNode; + + // update blocker + + var nextBlocker = $elm$browser$Debugger$Main$toBlockerType(model); + _Debugger_updateBlocker(currBlocker, nextBlocker); + currBlocker = nextBlocker; + + // view corner + + var cornerNext = $elm$browser$Debugger$Main$cornerView(model); + var cornerPatches = _VirtualDom_diff(cornerCurr, cornerNext); + cornerNode = _VirtualDom_applyPatches(cornerNode, cornerCurr, cornerPatches, sendToApp); + cornerCurr = cornerNext; + + if (!model.popout.b) + { + currPopout = undefined; + return; + } + + // view popout + + _VirtualDom_doc = model.popout.b; // SWITCH TO POPOUT DOC + currPopout || (currPopout = _VirtualDom_virtualize(model.popout.b)); + var nextPopout = $elm$browser$Debugger$Main$popoutView(model); + var popoutPatches = _VirtualDom_diff(currPopout, nextPopout); + _VirtualDom_applyPatches(model.popout.b.body, currPopout, popoutPatches, sendToApp); + currPopout = nextPopout; + _VirtualDom_doc = document; // SWITCH BACK TO NORMAL DOC + }); + } + ); +}); + + +var _Debugger_document = F4(function(impl, flagDecoder, debugMetadata, args) +{ + return _Platform_initialize( + flagDecoder, + args, + A3($elm$browser$Debugger$Main$wrapInit, _Json_wrap(debugMetadata), _Debugger_popout(), impl.init), + $elm$browser$Debugger$Main$wrapUpdate(impl.update), + $elm$browser$Debugger$Main$wrapSubs(impl.subscriptions), + function(sendToApp, initialModel) + { + var divertHrefToApp = impl.setup && impl.setup(function(x) { return sendToApp($elm$browser$Debugger$Main$UserMsg(x)); }); + var view = impl.view; + var title = _VirtualDom_doc.title; + var bodyNode = _VirtualDom_doc.body; + var currNode = _VirtualDom_virtualize(bodyNode); + var currBlocker = $elm$browser$Debugger$Main$toBlockerType(initialModel); + var currPopout; + + initialModel.popout.a = sendToApp; + + return _Browser_makeAnimator(initialModel, function(model) + { + _VirtualDom_divertHrefToApp = divertHrefToApp; + var doc = view($elm$browser$Debugger$Main$getUserModel(model)); + var nextNode = _VirtualDom_node('body')(_List_Nil)( + _Utils_ap( + A2($elm$core$List$map, _VirtualDom_map($elm$browser$Debugger$Main$UserMsg), doc.body), + _List_Cons($elm$browser$Debugger$Main$cornerView(model), _List_Nil) + ) + ); + var patches = _VirtualDom_diff(currNode, nextNode); + bodyNode = _VirtualDom_applyPatches(bodyNode, currNode, patches, sendToApp); + currNode = nextNode; + _VirtualDom_divertHrefToApp = 0; + (title !== doc.title) && (_VirtualDom_doc.title = title = doc.title); + + // update blocker + + var nextBlocker = $elm$browser$Debugger$Main$toBlockerType(model); + _Debugger_updateBlocker(currBlocker, nextBlocker); + currBlocker = nextBlocker; + + // view popout + + if (!model.popout.b) { currPopout = undefined; return; } + + _VirtualDom_doc = model.popout.b; // SWITCH TO POPOUT DOC + currPopout || (currPopout = _VirtualDom_virtualize(model.popout.b)); + var nextPopout = $elm$browser$Debugger$Main$popoutView(model); + var popoutPatches = _VirtualDom_diff(currPopout, nextPopout); + _VirtualDom_applyPatches(model.popout.b.body, currPopout, popoutPatches, sendToApp); + currPopout = nextPopout; + _VirtualDom_doc = document; // SWITCH BACK TO NORMAL DOC + }); + } + ); +}); + + +function _Debugger_popout() +{ + return { + b: undefined, + a: undefined + }; +} + +function _Debugger_isOpen(popout) +{ + return !!popout.b; +} + +function _Debugger_open(popout) +{ + return _Scheduler_binding(function(callback) + { + _Debugger_openWindow(popout); + callback(_Scheduler_succeed(_Utils_Tuple0)); + }); +} + +function _Debugger_openWindow(popout) +{ + var w = $elm$browser$Debugger$Main$initialWindowWidth, + h = $elm$browser$Debugger$Main$initialWindowHeight, + x = screen.width - w, + y = screen.height - h; + + var debuggerWindow = window.open('', '', 'width=' + w + ',height=' + h + ',left=' + x + ',top=' + y); + var doc = debuggerWindow.document; + doc.title = 'Elm Debugger'; + + // handle arrow keys + doc.addEventListener('keydown', function(event) { + event.metaKey && event.which === 82 && window.location.reload(); + event.key === 'ArrowUp' && (popout.a($elm$browser$Debugger$Main$Up ), event.preventDefault()); + event.key === 'ArrowDown' && (popout.a($elm$browser$Debugger$Main$Down), event.preventDefault()); + }); + + // handle window close + window.addEventListener('unload', close); + debuggerWindow.addEventListener('unload', function() { + popout.b = undefined; + popout.a($elm$browser$Debugger$Main$NoOp); + window.removeEventListener('unload', close); + }); + + function close() { + popout.b = undefined; + popout.a($elm$browser$Debugger$Main$NoOp); + debuggerWindow.close(); + } + + // register new window + popout.b = doc; +} + + + +// SCROLL + + +function _Debugger_scroll(popout) +{ + return _Scheduler_binding(function(callback) + { + if (popout.b) + { + var msgs = popout.b.getElementById('elm-debugger-sidebar'); + if (msgs && msgs.scrollTop !== 0) + { + msgs.scrollTop = 0; + } + } + callback(_Scheduler_succeed(_Utils_Tuple0)); + }); +} + + +var _Debugger_scrollTo = F2(function(id, popout) +{ + return _Scheduler_binding(function(callback) + { + if (popout.b) + { + var msg = popout.b.getElementById(id); + if (msg) + { + msg.scrollIntoView(false); + } + } + callback(_Scheduler_succeed(_Utils_Tuple0)); + }); +}); + + + +// UPLOAD + + +function _Debugger_upload(popout) +{ + return _Scheduler_binding(function(callback) + { + var doc = popout.b || document; + var element = doc.createElement('input'); + element.setAttribute('type', 'file'); + element.setAttribute('accept', 'text/json'); + element.style.display = 'none'; + element.addEventListener('change', function(event) + { + var fileReader = new FileReader(); + fileReader.onload = function(e) + { + callback(_Scheduler_succeed(e.target.result)); + }; + fileReader.readAsText(event.target.files[0]); + doc.body.removeChild(element); + }); + doc.body.appendChild(element); + element.click(); + }); +} + + + +// DOWNLOAD + + +var _Debugger_download = F2(function(historyLength, json) +{ + return _Scheduler_binding(function(callback) + { + var fileName = 'history-' + historyLength + '.txt'; + var jsonString = JSON.stringify(json); + var mime = 'text/plain;charset=utf-8'; + var done = _Scheduler_succeed(_Utils_Tuple0); + + // for IE10+ + if (navigator.msSaveBlob) + { + navigator.msSaveBlob(new Blob([jsonString], {type: mime}), fileName); + return callback(done); + } + + // for HTML5 + var element = document.createElement('a'); + element.setAttribute('href', 'data:' + mime + ',' + encodeURIComponent(jsonString)); + element.setAttribute('download', fileName); + element.style.display = 'none'; + document.body.appendChild(element); + element.click(); + document.body.removeChild(element); + callback(done); + }); +}); + + + +// POPOUT CONTENT + + +function _Debugger_messageToString(value) +{ + if (typeof value === 'boolean') + { + return value ? 'True' : 'False'; + } + + if (typeof value === 'number') + { + return value + ''; + } + + if (typeof value === 'string') + { + return '"' + _Debugger_addSlashes(value, false) + '"'; + } + + if (value instanceof String) + { + return "'" + _Debugger_addSlashes(value, true) + "'"; + } + + if (typeof value !== 'object' || value === null || !('$' in value)) + { + return '…'; + } + + if (typeof value.$ === 'number') + { + return '…'; + } + + var code = value.$.charCodeAt(0); + if (code === 0x23 /* # */ || /* a */ 0x61 <= code && code <= 0x7A /* z */) + { + return '…'; + } + + if (['Array_elm_builtin', 'Set_elm_builtin', 'RBNode_elm_builtin', 'RBEmpty_elm_builtin'].indexOf(value.$) >= 0) + { + return '…'; + } + + var keys = Object.keys(value); + switch (keys.length) + { + case 1: + return value.$; + case 2: + return value.$ + ' ' + _Debugger_messageToString(value.a); + default: + return value.$ + ' … ' + _Debugger_messageToString(value[keys[keys.length - 1]]); + } +} + + +function _Debugger_init(value) +{ + if (typeof value === 'boolean') + { + return A3($elm$browser$Debugger$Expando$Constructor, $elm$core$Maybe$Just(value ? 'True' : 'False'), true, _List_Nil); + } + + if (typeof value === 'number') + { + return $elm$browser$Debugger$Expando$Primitive(value + ''); + } + + if (typeof value === 'string') + { + return $elm$browser$Debugger$Expando$S('"' + _Debugger_addSlashes(value, false) + '"'); + } + + if (value instanceof String) + { + return $elm$browser$Debugger$Expando$S("'" + _Debugger_addSlashes(value, true) + "'"); + } + + if (typeof value === 'object' && '$' in value) + { + var tag = value.$; + + if (tag === '::' || tag === '[]') + { + return A3($elm$browser$Debugger$Expando$Sequence, $elm$browser$Debugger$Expando$ListSeq, true, + A2($elm$core$List$map, _Debugger_init, value) + ); + } + + if (tag === 'Set_elm_builtin') + { + return A3($elm$browser$Debugger$Expando$Sequence, $elm$browser$Debugger$Expando$SetSeq, true, + A3($elm$core$Set$foldr, _Debugger_initCons, _List_Nil, value) + ); + } + + if (tag === 'RBNode_elm_builtin' || tag == 'RBEmpty_elm_builtin') + { + return A2($elm$browser$Debugger$Expando$Dictionary, true, + A3($elm$core$Dict$foldr, _Debugger_initKeyValueCons, _List_Nil, value) + ); + } + + if (tag === 'Array_elm_builtin') + { + return A3($elm$browser$Debugger$Expando$Sequence, $elm$browser$Debugger$Expando$ArraySeq, true, + A3($elm$core$Array$foldr, _Debugger_initCons, _List_Nil, value) + ); + } + + if (typeof tag === 'number') + { + return $elm$browser$Debugger$Expando$Primitive(''); + } + + var char = tag.charCodeAt(0); + if (char === 35 || 65 <= char && char <= 90) + { + var list = _List_Nil; + for (var i in value) + { + if (i === '$') continue; + list = _List_Cons(_Debugger_init(value[i]), list); + } + return A3($elm$browser$Debugger$Expando$Constructor, char === 35 ? $elm$core$Maybe$Nothing : $elm$core$Maybe$Just(tag), true, $elm$core$List$reverse(list)); + } + + return $elm$browser$Debugger$Expando$Primitive(''); + } + + if (typeof value === 'object') + { + var dict = $elm$core$Dict$empty; + for (var i in value) + { + dict = A3($elm$core$Dict$insert, i, _Debugger_init(value[i]), dict); + } + return A2($elm$browser$Debugger$Expando$Record, true, dict); + } + + return $elm$browser$Debugger$Expando$Primitive(''); +} + +var _Debugger_initCons = F2(function initConsHelp(value, list) +{ + return _List_Cons(_Debugger_init(value), list); +}); + +var _Debugger_initKeyValueCons = F3(function(key, value, list) +{ + return _List_Cons( + _Utils_Tuple2(_Debugger_init(key), _Debugger_init(value)), + list + ); +}); + +function _Debugger_addSlashes(str, isChar) +{ + var s = str + .replace(/\\/g, '\\\\') + .replace(/\n/g, '\\n') + .replace(/\t/g, '\\t') + .replace(/\r/g, '\\r') + .replace(/\v/g, '\\v') + .replace(/\0/g, '\\0'); + if (isChar) + { + return s.replace(/\'/g, '\\\''); + } + else + { + return s.replace(/\"/g, '\\"'); + } +} + + + +// BLOCK EVENTS + + +function _Debugger_updateBlocker(oldBlocker, newBlocker) +{ + if (oldBlocker === newBlocker) return; + + var oldEvents = _Debugger_blockerToEvents(oldBlocker); + var newEvents = _Debugger_blockerToEvents(newBlocker); + + // remove old blockers + for (var i = 0; i < oldEvents.length; i++) + { + document.removeEventListener(oldEvents[i], _Debugger_blocker, true); + } + + // add new blockers + for (var i = 0; i < newEvents.length; i++) + { + document.addEventListener(newEvents[i], _Debugger_blocker, true); + } +} + + +function _Debugger_blocker(event) +{ + if (event.type === 'keydown' && event.metaKey && event.which === 82) + { + return; + } + + var isScroll = event.type === 'scroll' || event.type === 'wheel'; + for (var node = event.target; node; node = node.parentNode) + { + if (isScroll ? node.id === 'elm-debugger-details' : node.id === 'elm-debugger-overlay') + { + return; + } + } + + event.stopPropagation(); + event.preventDefault(); +} + +function _Debugger_blockerToEvents(blocker) +{ + return blocker === $elm$browser$Debugger$Overlay$BlockNone + ? [] + : blocker === $elm$browser$Debugger$Overlay$BlockMost + ? _Debugger_mostEvents + : _Debugger_allEvents; +} + +var _Debugger_mostEvents = [ + 'click', 'dblclick', 'mousemove', + 'mouseup', 'mousedown', 'mouseenter', 'mouseleave', + 'touchstart', 'touchend', 'touchcancel', 'touchmove', + 'pointerdown', 'pointerup', 'pointerover', 'pointerout', + 'pointerenter', 'pointerleave', 'pointermove', 'pointercancel', + 'dragstart', 'drag', 'dragend', 'dragenter', 'dragover', 'dragleave', 'drop', + 'keyup', 'keydown', 'keypress', + 'input', 'change', + 'focus', 'blur' +]; + +var _Debugger_allEvents = _Debugger_mostEvents.concat('wheel', 'scroll'); + + + + +// ELEMENT + + +var _Debugger_element; + +var _Browser_element = _Debugger_element || F4(function(impl, flagDecoder, debugMetadata, args) +{ + return _Platform_initialize( + flagDecoder, + args, + impl.init, + impl.update, + impl.subscriptions, + function(sendToApp, initialModel) { + var view = impl.view; + /**_UNUSED/ + var domNode = args['node']; + //*/ + /**/ + var domNode = args && args['node'] ? args['node'] : _Debug_crash(0); + //*/ + var currNode = _VirtualDom_virtualize(domNode); + + return _Browser_makeAnimator(initialModel, function(model) + { + var nextNode = view(model); + var patches = _VirtualDom_diff(currNode, nextNode); + domNode = _VirtualDom_applyPatches(domNode, currNode, patches, sendToApp); + currNode = nextNode; + }); + } + ); +}); + + + +// DOCUMENT + + +var _Debugger_document; + +var _Browser_document = _Debugger_document || F4(function(impl, flagDecoder, debugMetadata, args) +{ + return _Platform_initialize( + flagDecoder, + args, + impl.init, + impl.update, + impl.subscriptions, + function(sendToApp, initialModel) { + var divertHrefToApp = impl.setup && impl.setup(sendToApp) + var view = impl.view; + var title = _VirtualDom_doc.title; + var bodyNode = _VirtualDom_doc.body; + var currNode = _VirtualDom_virtualize(bodyNode); + return _Browser_makeAnimator(initialModel, function(model) + { + _VirtualDom_divertHrefToApp = divertHrefToApp; + var doc = view(model); + var nextNode = _VirtualDom_node('body')(_List_Nil)(doc.body); + var patches = _VirtualDom_diff(currNode, nextNode); + bodyNode = _VirtualDom_applyPatches(bodyNode, currNode, patches, sendToApp); + currNode = nextNode; + _VirtualDom_divertHrefToApp = 0; + (title !== doc.title) && (_VirtualDom_doc.title = title = doc.title); + }); + } + ); +}); + + + +// ANIMATION + + +var _Browser_cancelAnimationFrame = + typeof cancelAnimationFrame !== 'undefined' + ? cancelAnimationFrame + : function(id) { clearTimeout(id); }; + +var _Browser_requestAnimationFrame = + typeof requestAnimationFrame !== 'undefined' + ? requestAnimationFrame + : function(callback) { return setTimeout(callback, 1000 / 60); }; + + +function _Browser_makeAnimator(model, draw) +{ + draw(model); + + var state = 0; + + function updateIfNeeded() + { + state = state === 1 + ? 0 + : ( _Browser_requestAnimationFrame(updateIfNeeded), draw(model), 1 ); + } + + return function(nextModel, isSync) + { + model = nextModel; + + isSync + ? ( draw(model), + state === 2 && (state = 1) + ) + : ( state === 0 && _Browser_requestAnimationFrame(updateIfNeeded), + state = 2 + ); + }; +} + + + +// APPLICATION + + +function _Browser_application(impl) +{ + var onUrlChange = impl.onUrlChange; + var onUrlRequest = impl.onUrlRequest; + var key = function() { key.a(onUrlChange(_Browser_getUrl())); }; + + return _Browser_document({ + setup: function(sendToApp) + { + key.a = sendToApp; + _Browser_window.addEventListener('popstate', key); + _Browser_window.navigator.userAgent.indexOf('Trident') < 0 || _Browser_window.addEventListener('hashchange', key); + + return F2(function(domNode, event) + { + if (!event.ctrlKey && !event.metaKey && !event.shiftKey && event.button < 1 && !domNode.target && !domNode.hasAttribute('download')) + { + event.preventDefault(); + var href = domNode.href; + var curr = _Browser_getUrl(); + var next = $elm$url$Url$fromString(href).a; + sendToApp(onUrlRequest( + (next + && curr.protocol === next.protocol + && curr.host === next.host + && curr.port_.a === next.port_.a + ) + ? $elm$browser$Browser$Internal(next) + : $elm$browser$Browser$External(href) + )); + } + }); + }, + init: function(flags) + { + return A3(impl.init, flags, _Browser_getUrl(), key); + }, + view: impl.view, + update: impl.update, + subscriptions: impl.subscriptions + }); +} + +function _Browser_getUrl() +{ + return $elm$url$Url$fromString(_VirtualDom_doc.location.href).a || _Debug_crash(1); +} + +var _Browser_go = F2(function(key, n) +{ + return A2($elm$core$Task$perform, $elm$core$Basics$never, _Scheduler_binding(function() { + n && history.go(n); + key(); + })); +}); + +var _Browser_pushUrl = F2(function(key, url) +{ + return A2($elm$core$Task$perform, $elm$core$Basics$never, _Scheduler_binding(function() { + history.pushState({}, '', url); + key(); + })); +}); + +var _Browser_replaceUrl = F2(function(key, url) +{ + return A2($elm$core$Task$perform, $elm$core$Basics$never, _Scheduler_binding(function() { + history.replaceState({}, '', url); + key(); + })); +}); + + + +// GLOBAL EVENTS + + +var _Browser_fakeNode = { addEventListener: function() {}, removeEventListener: function() {} }; +var _Browser_doc = typeof document !== 'undefined' ? document : _Browser_fakeNode; +var _Browser_window = typeof window !== 'undefined' ? window : _Browser_fakeNode; + +var _Browser_on = F3(function(node, eventName, sendToSelf) +{ + return _Scheduler_spawn(_Scheduler_binding(function(callback) + { + function handler(event) { _Scheduler_rawSpawn(sendToSelf(event)); } + node.addEventListener(eventName, handler, _VirtualDom_passiveSupported && { passive: true }); + return function() { node.removeEventListener(eventName, handler); }; + })); +}); + +var _Browser_decodeEvent = F2(function(decoder, event) +{ + var result = _Json_runHelp(decoder, event); + return $elm$core$Result$isOk(result) ? $elm$core$Maybe$Just(result.a) : $elm$core$Maybe$Nothing; +}); + + + +// PAGE VISIBILITY + + +function _Browser_visibilityInfo() +{ + return (typeof _VirtualDom_doc.hidden !== 'undefined') + ? { hidden: 'hidden', change: 'visibilitychange' } + : + (typeof _VirtualDom_doc.mozHidden !== 'undefined') + ? { hidden: 'mozHidden', change: 'mozvisibilitychange' } + : + (typeof _VirtualDom_doc.msHidden !== 'undefined') + ? { hidden: 'msHidden', change: 'msvisibilitychange' } + : + (typeof _VirtualDom_doc.webkitHidden !== 'undefined') + ? { hidden: 'webkitHidden', change: 'webkitvisibilitychange' } + : { hidden: 'hidden', change: 'visibilitychange' }; +} + + + +// ANIMATION FRAMES + + +function _Browser_rAF() +{ + return _Scheduler_binding(function(callback) + { + var id = _Browser_requestAnimationFrame(function() { + callback(_Scheduler_succeed(Date.now())); + }); + + return function() { + _Browser_cancelAnimationFrame(id); + }; + }); +} + + +function _Browser_now() +{ + return _Scheduler_binding(function(callback) + { + callback(_Scheduler_succeed(Date.now())); + }); +} + + + +// DOM STUFF + + +function _Browser_withNode(id, doStuff) +{ + return _Scheduler_binding(function(callback) + { + _Browser_requestAnimationFrame(function() { + var node = document.getElementById(id); + callback(node + ? _Scheduler_succeed(doStuff(node)) + : _Scheduler_fail($elm$browser$Browser$Dom$NotFound(id)) + ); + }); + }); +} + + +function _Browser_withWindow(doStuff) +{ + return _Scheduler_binding(function(callback) + { + _Browser_requestAnimationFrame(function() { + callback(_Scheduler_succeed(doStuff())); + }); + }); +} + + +// FOCUS and BLUR + + +var _Browser_call = F2(function(functionName, id) +{ + return _Browser_withNode(id, function(node) { + node[functionName](); + return _Utils_Tuple0; + }); +}); + + + +// WINDOW VIEWPORT + + +function _Browser_getViewport() +{ + return { + scene: _Browser_getScene(), + viewport: { + x: _Browser_window.pageXOffset, + y: _Browser_window.pageYOffset, + width: _Browser_doc.documentElement.clientWidth, + height: _Browser_doc.documentElement.clientHeight + } + }; +} + +function _Browser_getScene() +{ + var body = _Browser_doc.body; + var elem = _Browser_doc.documentElement; + return { + width: Math.max(body.scrollWidth, body.offsetWidth, elem.scrollWidth, elem.offsetWidth, elem.clientWidth), + height: Math.max(body.scrollHeight, body.offsetHeight, elem.scrollHeight, elem.offsetHeight, elem.clientHeight) + }; +} + +var _Browser_setViewport = F2(function(x, y) +{ + return _Browser_withWindow(function() + { + _Browser_window.scroll(x, y); + return _Utils_Tuple0; + }); +}); + + + +// ELEMENT VIEWPORT + + +function _Browser_getViewportOf(id) +{ + return _Browser_withNode(id, function(node) + { + return { + scene: { + width: node.scrollWidth, + height: node.scrollHeight + }, + viewport: { + x: node.scrollLeft, + y: node.scrollTop, + width: node.clientWidth, + height: node.clientHeight + } + }; + }); +} + + +var _Browser_setViewportOf = F3(function(id, x, y) +{ + return _Browser_withNode(id, function(node) + { + node.scrollLeft = x; + node.scrollTop = y; + return _Utils_Tuple0; + }); +}); + + + +// ELEMENT + + +function _Browser_getElement(id) +{ + return _Browser_withNode(id, function(node) + { + var rect = node.getBoundingClientRect(); + var x = _Browser_window.pageXOffset; + var y = _Browser_window.pageYOffset; + return { + scene: _Browser_getScene(), + viewport: { + x: x, + y: y, + width: _Browser_doc.documentElement.clientWidth, + height: _Browser_doc.documentElement.clientHeight + }, + element: { + x: x + rect.left, + y: y + rect.top, + width: rect.width, + height: rect.height + } + }; + }); +} + + + +// LOAD and RELOAD + + +function _Browser_reload(skipCache) +{ + return A2($elm$core$Task$perform, $elm$core$Basics$never, _Scheduler_binding(function(callback) + { + _VirtualDom_doc.location.reload(skipCache); + })); +} + +function _Browser_load(url) +{ + return A2($elm$core$Task$perform, $elm$core$Basics$never, _Scheduler_binding(function(callback) + { + try + { + _Browser_window.location = url; + } + catch(err) + { + // Only Firefox can throw a NS_ERROR_MALFORMED_URI exception here. + // Other browsers reload the page, so let's be consistent about that. + _VirtualDom_doc.location.reload(false); + } + })); +} + + + +// SEND REQUEST + +var _Http_toTask = F3(function(router, toTask, request) +{ + return _Scheduler_binding(function(callback) + { + function done(response) { + callback(toTask(request.expect.a(response))); + } + + var xhr = new XMLHttpRequest(); + xhr.addEventListener('error', function() { done($elm$http$Http$NetworkError_); }); + xhr.addEventListener('timeout', function() { done($elm$http$Http$Timeout_); }); + xhr.addEventListener('load', function() { done(_Http_toResponse(request.expect.b, xhr)); }); + $elm$core$Maybe$isJust(request.tracker) && _Http_track(router, xhr, request.tracker.a); + + try { + xhr.open(request.method, request.url, true); + } catch (e) { + return done($elm$http$Http$BadUrl_(request.url)); + } + + _Http_configureRequest(xhr, request); + + request.body.a && xhr.setRequestHeader('Content-Type', request.body.a); + xhr.send(request.body.b); + + return function() { xhr.c = true; xhr.abort(); }; + }); +}); + + +// CONFIGURE + +function _Http_configureRequest(xhr, request) +{ + for (var headers = request.headers; headers.b; headers = headers.b) // WHILE_CONS + { + xhr.setRequestHeader(headers.a.a, headers.a.b); + } + xhr.timeout = request.timeout.a || 0; + xhr.responseType = request.expect.d; + xhr.withCredentials = request.allowCookiesFromOtherDomains; +} + + +// RESPONSES + +function _Http_toResponse(toBody, xhr) +{ + return A2( + 200 <= xhr.status && xhr.status < 300 ? $elm$http$Http$GoodStatus_ : $elm$http$Http$BadStatus_, + _Http_toMetadata(xhr), + toBody(xhr.response) + ); +} + + +// METADATA + +function _Http_toMetadata(xhr) +{ + return { + url: xhr.responseURL, + statusCode: xhr.status, + statusText: xhr.statusText, + headers: _Http_parseHeaders(xhr.getAllResponseHeaders()) + }; +} + + +// HEADERS + +function _Http_parseHeaders(rawHeaders) +{ + if (!rawHeaders) + { + return $elm$core$Dict$empty; + } + + var headers = $elm$core$Dict$empty; + var headerPairs = rawHeaders.split('\r\n'); + for (var i = headerPairs.length; i--; ) + { + var headerPair = headerPairs[i]; + var index = headerPair.indexOf(': '); + if (index > 0) + { + var key = headerPair.substring(0, index); + var value = headerPair.substring(index + 2); + + headers = A3($elm$core$Dict$update, key, function(oldValue) { + return $elm$core$Maybe$Just($elm$core$Maybe$isJust(oldValue) + ? value + ', ' + oldValue.a + : value + ); + }, headers); + } + } + return headers; +} + + +// EXPECT + +var _Http_expect = F3(function(type, toBody, toValue) +{ + return { + $: 0, + d: type, + b: toBody, + a: toValue + }; +}); + +var _Http_mapExpect = F2(function(func, expect) +{ + return { + $: 0, + d: expect.d, + b: expect.b, + a: function(x) { return func(expect.a(x)); } + }; +}); + +function _Http_toDataView(arrayBuffer) +{ + return new DataView(arrayBuffer); +} + + +// BODY and PARTS + +var _Http_emptyBody = { $: 0 }; +var _Http_pair = F2(function(a, b) { return { $: 0, a: a, b: b }; }); + +function _Http_toFormData(parts) +{ + for (var formData = new FormData(); parts.b; parts = parts.b) // WHILE_CONS + { + var part = parts.a; + formData.append(part.a, part.b); + } + return formData; +} + +var _Http_bytesToBlob = F2(function(mime, bytes) +{ + return new Blob([bytes], { type: mime }); +}); + + +// PROGRESS + +function _Http_track(router, xhr, tracker) +{ + // TODO check out lengthComputable on loadstart event + + xhr.upload.addEventListener('progress', function(event) { + if (xhr.c) { return; } + _Scheduler_rawSpawn(A2($elm$core$Platform$sendToSelf, router, _Utils_Tuple2(tracker, $elm$http$Http$Sending({ + sent: event.loaded, + size: event.total + })))); + }); + xhr.addEventListener('progress', function(event) { + if (xhr.c) { return; } + _Scheduler_rawSpawn(A2($elm$core$Platform$sendToSelf, router, _Utils_Tuple2(tracker, $elm$http$Http$Receiving({ + received: event.loaded, + size: event.lengthComputable ? $elm$core$Maybe$Just(event.total) : $elm$core$Maybe$Nothing + })))); + }); +}var $elm$core$List$cons = _List_cons; +var $elm$core$Elm$JsArray$foldr = _JsArray_foldr; +var $elm$core$Array$foldr = F3( + function (func, baseCase, _v0) { + var tree = _v0.c; + var tail = _v0.d; + var helper = F2( + function (node, acc) { + if (node.$ === 'SubTree') { + var subTree = node.a; + return A3($elm$core$Elm$JsArray$foldr, helper, acc, subTree); + } else { + var values = node.a; + return A3($elm$core$Elm$JsArray$foldr, func, acc, values); + } + }); + return A3( + $elm$core$Elm$JsArray$foldr, + helper, + A3($elm$core$Elm$JsArray$foldr, func, baseCase, tail), + tree); + }); +var $elm$core$Array$toList = function (array) { + return A3($elm$core$Array$foldr, $elm$core$List$cons, _List_Nil, array); +}; +var $elm$core$Dict$foldr = F3( + function (func, acc, t) { + foldr: + while (true) { + if (t.$ === 'RBEmpty_elm_builtin') { + return acc; + } else { + var key = t.b; + var value = t.c; + var left = t.d; + var right = t.e; + var $temp$func = func, + $temp$acc = A3( + func, + key, + value, + A3($elm$core$Dict$foldr, func, acc, right)), + $temp$t = left; + func = $temp$func; + acc = $temp$acc; + t = $temp$t; + continue foldr; + } + } + }); +var $elm$core$Dict$toList = function (dict) { + return A3( + $elm$core$Dict$foldr, + F3( + function (key, value, list) { + return A2( + $elm$core$List$cons, + _Utils_Tuple2(key, value), + list); + }), + _List_Nil, + dict); +}; +var $elm$core$Dict$keys = function (dict) { + return A3( + $elm$core$Dict$foldr, + F3( + function (key, value, keyList) { + return A2($elm$core$List$cons, key, keyList); + }), + _List_Nil, + dict); +}; +var $elm$core$Set$toList = function (_v0) { + var dict = _v0.a; + return $elm$core$Dict$keys(dict); +}; +var $elm$core$Basics$EQ = {$: 'EQ'}; +var $elm$core$Basics$GT = {$: 'GT'}; +var $elm$core$Basics$LT = {$: 'LT'}; +var $author$project$Entry$Context = F2( + function (globals, state) { + return {globals: globals, state: state}; + }); +var $author$project$Entry$ItemSearch = function (a) { + return {$: 'ItemSearch', a: a}; +}; +var $elm$core$Result$Err = function (a) { + return {$: 'Err', a: a}; +}; +var $elm$json$Json$Decode$Failure = F2( + function (a, b) { + return {$: 'Failure', a: a, b: b}; + }); +var $elm$json$Json$Decode$Field = F2( + function (a, b) { + return {$: 'Field', a: a, b: b}; + }); +var $elm$json$Json$Decode$Index = F2( + function (a, b) { + return {$: 'Index', a: a, b: b}; + }); +var $elm$core$Result$Ok = function (a) { + return {$: 'Ok', a: a}; +}; +var $elm$json$Json$Decode$OneOf = function (a) { + return {$: 'OneOf', a: a}; +}; +var $elm$core$Basics$False = {$: 'False'}; +var $elm$core$Basics$add = _Basics_add; +var $elm$core$Maybe$Just = function (a) { + return {$: 'Just', a: a}; +}; +var $elm$core$Maybe$Nothing = {$: 'Nothing'}; +var $elm$core$String$all = _String_all; +var $elm$core$Basics$and = _Basics_and; +var $elm$core$Basics$append = _Utils_append; +var $elm$json$Json$Encode$encode = _Json_encode; +var $elm$core$String$fromInt = _String_fromNumber; +var $elm$core$String$join = F2( + function (sep, chunks) { + return A2( + _String_join, + sep, + _List_toArray(chunks)); + }); +var $elm$core$String$split = F2( + function (sep, string) { + return _List_fromArray( + A2(_String_split, sep, string)); + }); +var $elm$json$Json$Decode$indent = function (str) { + return A2( + $elm$core$String$join, + '\n ', + A2($elm$core$String$split, '\n', str)); +}; +var $elm$core$List$foldl = F3( + function (func, acc, list) { + foldl: + while (true) { + if (!list.b) { + return acc; + } else { + var x = list.a; + var xs = list.b; + var $temp$func = func, + $temp$acc = A2(func, x, acc), + $temp$list = xs; + func = $temp$func; + acc = $temp$acc; + list = $temp$list; + continue foldl; + } + } + }); +var $elm$core$List$length = function (xs) { + return A3( + $elm$core$List$foldl, + F2( + function (_v0, i) { + return i + 1; + }), + 0, + xs); +}; +var $elm$core$List$map2 = _List_map2; +var $elm$core$Basics$le = _Utils_le; +var $elm$core$Basics$sub = _Basics_sub; +var $elm$core$List$rangeHelp = F3( + function (lo, hi, list) { + rangeHelp: + while (true) { + if (_Utils_cmp(lo, hi) < 1) { + var $temp$lo = lo, + $temp$hi = hi - 1, + $temp$list = A2($elm$core$List$cons, hi, list); + lo = $temp$lo; + hi = $temp$hi; + list = $temp$list; + continue rangeHelp; + } else { + return list; + } + } + }); +var $elm$core$List$range = F2( + function (lo, hi) { + return A3($elm$core$List$rangeHelp, lo, hi, _List_Nil); + }); +var $elm$core$List$indexedMap = F2( + function (f, xs) { + return A3( + $elm$core$List$map2, + f, + A2( + $elm$core$List$range, + 0, + $elm$core$List$length(xs) - 1), + xs); + }); +var $elm$core$Char$toCode = _Char_toCode; +var $elm$core$Char$isLower = function (_char) { + var code = $elm$core$Char$toCode(_char); + return (97 <= code) && (code <= 122); +}; +var $elm$core$Char$isUpper = function (_char) { + var code = $elm$core$Char$toCode(_char); + return (code <= 90) && (65 <= code); +}; +var $elm$core$Basics$or = _Basics_or; +var $elm$core$Char$isAlpha = function (_char) { + return $elm$core$Char$isLower(_char) || $elm$core$Char$isUpper(_char); +}; +var $elm$core$Char$isDigit = function (_char) { + var code = $elm$core$Char$toCode(_char); + return (code <= 57) && (48 <= code); +}; +var $elm$core$Char$isAlphaNum = function (_char) { + return $elm$core$Char$isLower(_char) || ($elm$core$Char$isUpper(_char) || $elm$core$Char$isDigit(_char)); +}; +var $elm$core$List$reverse = function (list) { + return A3($elm$core$List$foldl, $elm$core$List$cons, _List_Nil, list); +}; +var $elm$core$String$uncons = _String_uncons; +var $elm$json$Json$Decode$errorOneOf = F2( + function (i, error) { + return '\n\n(' + ($elm$core$String$fromInt(i + 1) + (') ' + $elm$json$Json$Decode$indent( + $elm$json$Json$Decode$errorToString(error)))); + }); +var $elm$json$Json$Decode$errorToString = function (error) { + return A2($elm$json$Json$Decode$errorToStringHelp, error, _List_Nil); +}; +var $elm$json$Json$Decode$errorToStringHelp = F2( + function (error, context) { + errorToStringHelp: + while (true) { + switch (error.$) { + case 'Field': + var f = error.a; + var err = error.b; + var isSimple = function () { + var _v1 = $elm$core$String$uncons(f); + if (_v1.$ === 'Nothing') { + return false; + } else { + var _v2 = _v1.a; + var _char = _v2.a; + var rest = _v2.b; + return $elm$core$Char$isAlpha(_char) && A2($elm$core$String$all, $elm$core$Char$isAlphaNum, rest); + } + }(); + var fieldName = isSimple ? ('.' + f) : ('[\'' + (f + '\']')); + var $temp$error = err, + $temp$context = A2($elm$core$List$cons, fieldName, context); + error = $temp$error; + context = $temp$context; + continue errorToStringHelp; + case 'Index': + var i = error.a; + var err = error.b; + var indexName = '[' + ($elm$core$String$fromInt(i) + ']'); + var $temp$error = err, + $temp$context = A2($elm$core$List$cons, indexName, context); + error = $temp$error; + context = $temp$context; + continue errorToStringHelp; + case 'OneOf': + var errors = error.a; + if (!errors.b) { + return 'Ran into a Json.Decode.oneOf with no possibilities' + function () { + if (!context.b) { + return '!'; + } else { + return ' at json' + A2( + $elm$core$String$join, + '', + $elm$core$List$reverse(context)); + } + }(); + } else { + if (!errors.b.b) { + var err = errors.a; + var $temp$error = err, + $temp$context = context; + error = $temp$error; + context = $temp$context; + continue errorToStringHelp; + } else { + var starter = function () { + if (!context.b) { + return 'Json.Decode.oneOf'; + } else { + return 'The Json.Decode.oneOf at json' + A2( + $elm$core$String$join, + '', + $elm$core$List$reverse(context)); + } + }(); + var introduction = starter + (' failed in the following ' + ($elm$core$String$fromInt( + $elm$core$List$length(errors)) + ' ways:')); + return A2( + $elm$core$String$join, + '\n\n', + A2( + $elm$core$List$cons, + introduction, + A2($elm$core$List$indexedMap, $elm$json$Json$Decode$errorOneOf, errors))); + } + } + default: + var msg = error.a; + var json = error.b; + var introduction = function () { + if (!context.b) { + return 'Problem with the given value:\n\n'; + } else { + return 'Problem with the value at json' + (A2( + $elm$core$String$join, + '', + $elm$core$List$reverse(context)) + ':\n\n '); + } + }(); + return introduction + ($elm$json$Json$Decode$indent( + A2($elm$json$Json$Encode$encode, 4, json)) + ('\n\n' + msg)); + } + } + }); +var $elm$core$Array$branchFactor = 32; +var $elm$core$Array$Array_elm_builtin = F4( + function (a, b, c, d) { + return {$: 'Array_elm_builtin', a: a, b: b, c: c, d: d}; + }); +var $elm$core$Elm$JsArray$empty = _JsArray_empty; +var $elm$core$Basics$ceiling = _Basics_ceiling; +var $elm$core$Basics$fdiv = _Basics_fdiv; +var $elm$core$Basics$logBase = F2( + function (base, number) { + return _Basics_log(number) / _Basics_log(base); + }); +var $elm$core$Basics$toFloat = _Basics_toFloat; +var $elm$core$Array$shiftStep = $elm$core$Basics$ceiling( + A2($elm$core$Basics$logBase, 2, $elm$core$Array$branchFactor)); +var $elm$core$Array$empty = A4($elm$core$Array$Array_elm_builtin, 0, $elm$core$Array$shiftStep, $elm$core$Elm$JsArray$empty, $elm$core$Elm$JsArray$empty); +var $elm$core$Elm$JsArray$initialize = _JsArray_initialize; +var $elm$core$Array$Leaf = function (a) { + return {$: 'Leaf', a: a}; +}; +var $elm$core$Basics$apL = F2( + function (f, x) { + return f(x); + }); +var $elm$core$Basics$apR = F2( + function (x, f) { + return f(x); + }); +var $elm$core$Basics$eq = _Utils_equal; +var $elm$core$Basics$floor = _Basics_floor; +var $elm$core$Elm$JsArray$length = _JsArray_length; +var $elm$core$Basics$gt = _Utils_gt; +var $elm$core$Basics$max = F2( + function (x, y) { + return (_Utils_cmp(x, y) > 0) ? x : y; + }); +var $elm$core$Basics$mul = _Basics_mul; +var $elm$core$Array$SubTree = function (a) { + return {$: 'SubTree', a: a}; +}; +var $elm$core$Elm$JsArray$initializeFromList = _JsArray_initializeFromList; +var $elm$core$Array$compressNodes = F2( + function (nodes, acc) { + compressNodes: + while (true) { + var _v0 = A2($elm$core$Elm$JsArray$initializeFromList, $elm$core$Array$branchFactor, nodes); + var node = _v0.a; + var remainingNodes = _v0.b; + var newAcc = A2( + $elm$core$List$cons, + $elm$core$Array$SubTree(node), + acc); + if (!remainingNodes.b) { + return $elm$core$List$reverse(newAcc); + } else { + var $temp$nodes = remainingNodes, + $temp$acc = newAcc; + nodes = $temp$nodes; + acc = $temp$acc; + continue compressNodes; + } + } + }); +var $elm$core$Tuple$first = function (_v0) { + var x = _v0.a; + return x; +}; +var $elm$core$Array$treeFromBuilder = F2( + function (nodeList, nodeListSize) { + treeFromBuilder: + while (true) { + var newNodeSize = $elm$core$Basics$ceiling(nodeListSize / $elm$core$Array$branchFactor); + if (newNodeSize === 1) { + return A2($elm$core$Elm$JsArray$initializeFromList, $elm$core$Array$branchFactor, nodeList).a; + } else { + var $temp$nodeList = A2($elm$core$Array$compressNodes, nodeList, _List_Nil), + $temp$nodeListSize = newNodeSize; + nodeList = $temp$nodeList; + nodeListSize = $temp$nodeListSize; + continue treeFromBuilder; + } + } + }); +var $elm$core$Array$builderToArray = F2( + function (reverseNodeList, builder) { + if (!builder.nodeListSize) { + return A4( + $elm$core$Array$Array_elm_builtin, + $elm$core$Elm$JsArray$length(builder.tail), + $elm$core$Array$shiftStep, + $elm$core$Elm$JsArray$empty, + builder.tail); + } else { + var treeLen = builder.nodeListSize * $elm$core$Array$branchFactor; + var depth = $elm$core$Basics$floor( + A2($elm$core$Basics$logBase, $elm$core$Array$branchFactor, treeLen - 1)); + var correctNodeList = reverseNodeList ? $elm$core$List$reverse(builder.nodeList) : builder.nodeList; + var tree = A2($elm$core$Array$treeFromBuilder, correctNodeList, builder.nodeListSize); + return A4( + $elm$core$Array$Array_elm_builtin, + $elm$core$Elm$JsArray$length(builder.tail) + treeLen, + A2($elm$core$Basics$max, 5, depth * $elm$core$Array$shiftStep), + tree, + builder.tail); + } + }); +var $elm$core$Basics$idiv = _Basics_idiv; +var $elm$core$Basics$lt = _Utils_lt; +var $elm$core$Array$initializeHelp = F5( + function (fn, fromIndex, len, nodeList, tail) { + initializeHelp: + while (true) { + if (fromIndex < 0) { + return A2( + $elm$core$Array$builderToArray, + false, + {nodeList: nodeList, nodeListSize: (len / $elm$core$Array$branchFactor) | 0, tail: tail}); + } else { + var leaf = $elm$core$Array$Leaf( + A3($elm$core$Elm$JsArray$initialize, $elm$core$Array$branchFactor, fromIndex, fn)); + var $temp$fn = fn, + $temp$fromIndex = fromIndex - $elm$core$Array$branchFactor, + $temp$len = len, + $temp$nodeList = A2($elm$core$List$cons, leaf, nodeList), + $temp$tail = tail; + fn = $temp$fn; + fromIndex = $temp$fromIndex; + len = $temp$len; + nodeList = $temp$nodeList; + tail = $temp$tail; + continue initializeHelp; + } + } + }); +var $elm$core$Basics$remainderBy = _Basics_remainderBy; +var $elm$core$Array$initialize = F2( + function (len, fn) { + if (len <= 0) { + return $elm$core$Array$empty; + } else { + var tailLen = len % $elm$core$Array$branchFactor; + var tail = A3($elm$core$Elm$JsArray$initialize, tailLen, len - tailLen, fn); + var initialFromIndex = (len - tailLen) - $elm$core$Array$branchFactor; + return A5($elm$core$Array$initializeHelp, fn, initialFromIndex, len, _List_Nil, tail); + } + }); +var $elm$core$Basics$True = {$: 'True'}; +var $elm$core$Result$isOk = function (result) { + if (result.$ === 'Ok') { + return true; + } else { + return false; + } +}; +var $elm$json$Json$Decode$andThen = _Json_andThen; +var $elm$json$Json$Decode$map = _Json_map1; +var $elm$json$Json$Decode$map2 = _Json_map2; +var $elm$json$Json$Decode$succeed = _Json_succeed; +var $elm$virtual_dom$VirtualDom$toHandlerInt = function (handler) { + switch (handler.$) { + case 'Normal': + return 0; + case 'MayStopPropagation': + return 1; + case 'MayPreventDefault': + return 2; + default: + return 3; + } +}; +var $elm$browser$Debugger$Expando$ArraySeq = {$: 'ArraySeq'}; +var $elm$browser$Debugger$Overlay$BlockMost = {$: 'BlockMost'}; +var $elm$browser$Debugger$Overlay$BlockNone = {$: 'BlockNone'}; +var $elm$browser$Debugger$Expando$Constructor = F3( + function (a, b, c) { + return {$: 'Constructor', a: a, b: b, c: c}; + }); +var $elm$browser$Debugger$Expando$Dictionary = F2( + function (a, b) { + return {$: 'Dictionary', a: a, b: b}; + }); +var $elm$browser$Debugger$Main$Down = {$: 'Down'}; +var $elm$browser$Debugger$Expando$ListSeq = {$: 'ListSeq'}; +var $elm$browser$Debugger$Main$NoOp = {$: 'NoOp'}; +var $elm$browser$Debugger$Expando$Primitive = function (a) { + return {$: 'Primitive', a: a}; +}; +var $elm$browser$Debugger$Expando$Record = F2( + function (a, b) { + return {$: 'Record', a: a, b: b}; + }); +var $elm$browser$Debugger$Expando$S = function (a) { + return {$: 'S', a: a}; +}; +var $elm$browser$Debugger$Expando$Sequence = F3( + function (a, b, c) { + return {$: 'Sequence', a: a, b: b, c: c}; + }); +var $elm$browser$Debugger$Expando$SetSeq = {$: 'SetSeq'}; +var $elm$browser$Debugger$Main$Up = {$: 'Up'}; +var $elm$browser$Debugger$Main$UserMsg = function (a) { + return {$: 'UserMsg', a: a}; +}; +var $elm$browser$Debugger$Main$Export = {$: 'Export'}; +var $elm$browser$Debugger$Main$Import = {$: 'Import'}; +var $elm$browser$Debugger$Main$Open = {$: 'Open'}; +var $elm$browser$Debugger$Main$OverlayMsg = function (a) { + return {$: 'OverlayMsg', a: a}; +}; +var $elm$browser$Debugger$Main$Resume = {$: 'Resume'}; +var $elm$browser$Debugger$Main$isPaused = function (state) { + if (state.$ === 'Running') { + return false; + } else { + return true; + } +}; +var $elm$browser$Debugger$History$size = function (history) { + return history.numMessages; +}; +var $elm$browser$Debugger$Overlay$Accept = function (a) { + return {$: 'Accept', a: a}; +}; +var $elm$browser$Debugger$Overlay$Choose = F2( + function (a, b) { + return {$: 'Choose', a: a, b: b}; + }); +var $elm$html$Html$div = _VirtualDom_node('div'); +var $elm$json$Json$Encode$string = _Json_wrap; +var $elm$html$Html$Attributes$stringProperty = F2( + function (key, string) { + return A2( + _VirtualDom_property, + key, + $elm$json$Json$Encode$string(string)); + }); +var $elm$html$Html$Attributes$id = $elm$html$Html$Attributes$stringProperty('id'); +var $elm$virtual_dom$VirtualDom$Normal = function (a) { + return {$: 'Normal', a: a}; +}; +var $elm$virtual_dom$VirtualDom$on = _VirtualDom_on; +var $elm$html$Html$Events$on = F2( + function (event, decoder) { + return A2( + $elm$virtual_dom$VirtualDom$on, + event, + $elm$virtual_dom$VirtualDom$Normal(decoder)); + }); +var $elm$html$Html$Events$onClick = function (msg) { + return A2( + $elm$html$Html$Events$on, + 'click', + $elm$json$Json$Decode$succeed(msg)); +}; +var $elm$html$Html$span = _VirtualDom_node('span'); +var $elm$virtual_dom$VirtualDom$style = _VirtualDom_style; +var $elm$html$Html$Attributes$style = $elm$virtual_dom$VirtualDom$style; +var $elm$virtual_dom$VirtualDom$text = _VirtualDom_text; +var $elm$html$Html$text = $elm$virtual_dom$VirtualDom$text; +var $elm$html$Html$a = _VirtualDom_node('a'); +var $elm$browser$Debugger$Overlay$goodNews1 = '\nThe good news is that having values like this in your message type is not\nso great in the long run. You are better off using simpler data, like\n'; +var $elm$browser$Debugger$Overlay$goodNews2 = '\nfunction can pattern match on that data and call whatever functions, JSON\ndecoders, etc. you need. This makes the code much more explicit and easy to\nfollow for other readers (or you in a few months!)\n'; +var $elm$html$Html$Attributes$href = function (url) { + return A2( + $elm$html$Html$Attributes$stringProperty, + 'href', + _VirtualDom_noJavaScriptUri(url)); +}; +var $elm$core$List$foldrHelper = F4( + function (fn, acc, ctr, ls) { + if (!ls.b) { + return acc; + } else { + var a = ls.a; + var r1 = ls.b; + if (!r1.b) { + return A2(fn, a, acc); + } else { + var b = r1.a; + var r2 = r1.b; + if (!r2.b) { + return A2( + fn, + a, + A2(fn, b, acc)); + } else { + var c = r2.a; + var r3 = r2.b; + if (!r3.b) { + return A2( + fn, + a, + A2( + fn, + b, + A2(fn, c, acc))); + } else { + var d = r3.a; + var r4 = r3.b; + var res = (ctr > 500) ? A3( + $elm$core$List$foldl, + fn, + acc, + $elm$core$List$reverse(r4)) : A4($elm$core$List$foldrHelper, fn, acc, ctr + 1, r4); + return A2( + fn, + a, + A2( + fn, + b, + A2( + fn, + c, + A2(fn, d, res)))); + } + } + } + } + }); +var $elm$core$List$foldr = F3( + function (fn, acc, ls) { + return A4($elm$core$List$foldrHelper, fn, acc, 0, ls); + }); +var $elm$core$List$map = F2( + function (f, xs) { + return A3( + $elm$core$List$foldr, + F2( + function (x, acc) { + return A2( + $elm$core$List$cons, + f(x), + acc); + }), + _List_Nil, + xs); + }); +var $elm$html$Html$p = _VirtualDom_node('p'); +var $elm$html$Html$ul = _VirtualDom_node('ul'); +var $elm$html$Html$code = _VirtualDom_node('code'); +var $elm$browser$Debugger$Overlay$viewCode = function (name) { + return A2( + $elm$html$Html$code, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text(name) + ])); +}; +var $elm$browser$Debugger$Overlay$addCommas = function (items) { + if (!items.b) { + return ''; + } else { + if (!items.b.b) { + var item = items.a; + return item; + } else { + if (!items.b.b.b) { + var item1 = items.a; + var _v1 = items.b; + var item2 = _v1.a; + return item1 + (' and ' + item2); + } else { + var lastItem = items.a; + var otherItems = items.b; + return A2( + $elm$core$String$join, + ', ', + _Utils_ap( + otherItems, + _List_fromArray( + [' and ' + lastItem]))); + } + } + } +}; +var $elm$html$Html$li = _VirtualDom_node('li'); +var $elm$browser$Debugger$Overlay$problemToString = function (problem) { + switch (problem.$) { + case 'Function': + return 'functions'; + case 'Decoder': + return 'JSON decoders'; + case 'Task': + return 'tasks'; + case 'Process': + return 'processes'; + case 'Socket': + return 'web sockets'; + case 'Request': + return 'HTTP requests'; + case 'Program': + return 'programs'; + default: + return 'virtual DOM values'; + } +}; +var $elm$browser$Debugger$Overlay$viewProblemType = function (_v0) { + var name = _v0.name; + var problems = _v0.problems; + return A2( + $elm$html$Html$li, + _List_Nil, + _List_fromArray( + [ + $elm$browser$Debugger$Overlay$viewCode(name), + $elm$html$Html$text( + ' can contain ' + ($elm$browser$Debugger$Overlay$addCommas( + A2($elm$core$List$map, $elm$browser$Debugger$Overlay$problemToString, problems)) + '.')) + ])); +}; +var $elm$browser$Debugger$Overlay$viewBadMetadata = function (_v0) { + var message = _v0.message; + var problems = _v0.problems; + return _List_fromArray( + [ + A2( + $elm$html$Html$p, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text('The '), + $elm$browser$Debugger$Overlay$viewCode(message), + $elm$html$Html$text(' type of your program cannot be reliably serialized for history files.') + ])), + A2( + $elm$html$Html$p, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text('Functions cannot be serialized, nor can values that contain functions. This is a problem in these places:') + ])), + A2( + $elm$html$Html$ul, + _List_Nil, + A2($elm$core$List$map, $elm$browser$Debugger$Overlay$viewProblemType, problems)), + A2( + $elm$html$Html$p, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text($elm$browser$Debugger$Overlay$goodNews1), + A2( + $elm$html$Html$a, + _List_fromArray( + [ + $elm$html$Html$Attributes$href('https://guide.elm-lang.org/types/custom_types.html') + ]), + _List_fromArray( + [ + $elm$html$Html$text('custom types') + ])), + $elm$html$Html$text(', in your messages. From there, your '), + $elm$browser$Debugger$Overlay$viewCode('update'), + $elm$html$Html$text($elm$browser$Debugger$Overlay$goodNews2) + ])) + ]); +}; +var $elm$virtual_dom$VirtualDom$map = _VirtualDom_map; +var $elm$html$Html$map = $elm$virtual_dom$VirtualDom$map; +var $elm$browser$Debugger$Overlay$Cancel = {$: 'Cancel'}; +var $elm$browser$Debugger$Overlay$Proceed = {$: 'Proceed'}; +var $elm$html$Html$button = _VirtualDom_node('button'); +var $elm$browser$Debugger$Overlay$viewButtons = function (buttons) { + var btn = F2( + function (msg, string) { + return A2( + $elm$html$Html$button, + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'margin-right', '20px'), + $elm$html$Html$Events$onClick(msg) + ]), + _List_fromArray( + [ + $elm$html$Html$text(string) + ])); + }); + var buttonNodes = function () { + if (buttons.$ === 'Accept') { + var proceed = buttons.a; + return _List_fromArray( + [ + A2(btn, $elm$browser$Debugger$Overlay$Proceed, proceed) + ]); + } else { + var cancel = buttons.a; + var proceed = buttons.b; + return _List_fromArray( + [ + A2(btn, $elm$browser$Debugger$Overlay$Cancel, cancel), + A2(btn, $elm$browser$Debugger$Overlay$Proceed, proceed) + ]); + } + }(); + return A2( + $elm$html$Html$div, + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'height', '60px'), + A2($elm$html$Html$Attributes$style, 'line-height', '60px'), + A2($elm$html$Html$Attributes$style, 'text-align', 'right'), + A2($elm$html$Html$Attributes$style, 'background-color', 'rgb(50, 50, 50)') + ]), + buttonNodes); +}; +var $elm$browser$Debugger$Overlay$viewMessage = F4( + function (config, title, details, buttons) { + return A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$id('elm-debugger-overlay'), + A2($elm$html$Html$Attributes$style, 'position', 'fixed'), + A2($elm$html$Html$Attributes$style, 'top', '0'), + A2($elm$html$Html$Attributes$style, 'left', '0'), + A2($elm$html$Html$Attributes$style, 'width', '100vw'), + A2($elm$html$Html$Attributes$style, 'height', '100vh'), + A2($elm$html$Html$Attributes$style, 'color', 'white'), + A2($elm$html$Html$Attributes$style, 'pointer-events', 'none'), + A2($elm$html$Html$Attributes$style, 'font-family', '\'Trebuchet MS\', \'Lucida Grande\', \'Bitstream Vera Sans\', \'Helvetica Neue\', sans-serif'), + A2($elm$html$Html$Attributes$style, 'z-index', '2147483647') + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$div, + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'position', 'absolute'), + A2($elm$html$Html$Attributes$style, 'width', '600px'), + A2($elm$html$Html$Attributes$style, 'height', '100vh'), + A2($elm$html$Html$Attributes$style, 'padding-left', 'calc(50% - 300px)'), + A2($elm$html$Html$Attributes$style, 'padding-right', 'calc(50% - 300px)'), + A2($elm$html$Html$Attributes$style, 'background-color', 'rgba(200, 200, 200, 0.7)'), + A2($elm$html$Html$Attributes$style, 'pointer-events', 'auto') + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$div, + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'font-size', '36px'), + A2($elm$html$Html$Attributes$style, 'height', '80px'), + A2($elm$html$Html$Attributes$style, 'background-color', 'rgb(50, 50, 50)'), + A2($elm$html$Html$Attributes$style, 'padding-left', '22px'), + A2($elm$html$Html$Attributes$style, 'vertical-align', 'middle'), + A2($elm$html$Html$Attributes$style, 'line-height', '80px') + ]), + _List_fromArray( + [ + $elm$html$Html$text(title) + ])), + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$id('elm-debugger-details'), + A2($elm$html$Html$Attributes$style, 'padding', ' 8px 20px'), + A2($elm$html$Html$Attributes$style, 'overflow-y', 'auto'), + A2($elm$html$Html$Attributes$style, 'max-height', 'calc(100vh - 156px)'), + A2($elm$html$Html$Attributes$style, 'background-color', 'rgb(61, 61, 61)') + ]), + details), + A2( + $elm$html$Html$map, + config.wrap, + $elm$browser$Debugger$Overlay$viewButtons(buttons)) + ])) + ])); + }); +var $elm$virtual_dom$VirtualDom$attribute = F2( + function (key, value) { + return A2( + _VirtualDom_attribute, + _VirtualDom_noOnOrFormAction(key), + _VirtualDom_noJavaScriptOrHtmlUri(value)); + }); +var $elm$core$Basics$negate = function (n) { + return -n; +}; +var $elm$virtual_dom$VirtualDom$nodeNS = F2( + function (namespace, tag) { + return A2( + _VirtualDom_nodeNS, + namespace, + _VirtualDom_noScript(tag)); + }); +var $elm$core$String$fromFloat = _String_fromNumber; +var $elm$browser$Debugger$Overlay$viewShape = F4( + function (x, y, angle, coordinates) { + return A4( + $elm$virtual_dom$VirtualDom$nodeNS, + 'http://www.w3.org/2000/svg', + 'polygon', + _List_fromArray( + [ + A2($elm$virtual_dom$VirtualDom$attribute, 'points', coordinates), + A2( + $elm$virtual_dom$VirtualDom$attribute, + 'transform', + 'translate(' + ($elm$core$String$fromFloat(x) + (' ' + ($elm$core$String$fromFloat(y) + (') rotate(' + ($elm$core$String$fromFloat(-angle) + ')')))))) + ]), + _List_Nil); + }); +var $elm$browser$Debugger$Overlay$elmLogo = A4( + $elm$virtual_dom$VirtualDom$nodeNS, + 'http://www.w3.org/2000/svg', + 'svg', + _List_fromArray( + [ + A2($elm$virtual_dom$VirtualDom$attribute, 'viewBox', '-300 -300 600 600'), + A2($elm$virtual_dom$VirtualDom$attribute, 'xmlns', 'http://www.w3.org/2000/svg'), + A2($elm$virtual_dom$VirtualDom$attribute, 'fill', 'currentColor'), + A2($elm$virtual_dom$VirtualDom$attribute, 'width', '24px'), + A2($elm$virtual_dom$VirtualDom$attribute, 'height', '24px') + ]), + _List_fromArray( + [ + A4( + $elm$virtual_dom$VirtualDom$nodeNS, + 'http://www.w3.org/2000/svg', + 'g', + _List_fromArray( + [ + A2($elm$virtual_dom$VirtualDom$attribute, 'transform', 'scale(1 -1)') + ]), + _List_fromArray( + [ + A4($elm$browser$Debugger$Overlay$viewShape, 0, -210, 0, '-280,-90 0,190 280,-90'), + A4($elm$browser$Debugger$Overlay$viewShape, -210, 0, 90, '-280,-90 0,190 280,-90'), + A4($elm$browser$Debugger$Overlay$viewShape, 207, 207, 45, '-198,-66 0,132 198,-66'), + A4($elm$browser$Debugger$Overlay$viewShape, 150, 0, 0, '-130,0 0,-130 130,0 0,130'), + A4($elm$browser$Debugger$Overlay$viewShape, -89, 239, 0, '-191,61 69,61 191,-61 -69,-61'), + A4($elm$browser$Debugger$Overlay$viewShape, 0, 106, 180, '-130,-44 0,86 130,-44'), + A4($elm$browser$Debugger$Overlay$viewShape, 256, -150, 270, '-130,-44 0,86 130,-44') + ])) + ])); +var $elm$core$String$length = _String_length; +var $elm$browser$Debugger$Overlay$viewMiniControls = F2( + function (config, numMsgs) { + var string = $elm$core$String$fromInt(numMsgs); + var width = $elm$core$String$fromInt( + 2 + $elm$core$String$length(string)); + return A2( + $elm$html$Html$div, + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'position', 'fixed'), + A2($elm$html$Html$Attributes$style, 'bottom', '2em'), + A2($elm$html$Html$Attributes$style, 'right', '2em'), + A2($elm$html$Html$Attributes$style, 'width', 'calc(42px + ' + (width + 'ch)')), + A2($elm$html$Html$Attributes$style, 'height', '36px'), + A2($elm$html$Html$Attributes$style, 'background-color', '#1293D8'), + A2($elm$html$Html$Attributes$style, 'color', 'white'), + A2($elm$html$Html$Attributes$style, 'font-family', 'monospace'), + A2($elm$html$Html$Attributes$style, 'pointer-events', 'auto'), + A2($elm$html$Html$Attributes$style, 'z-index', '2147483647'), + A2($elm$html$Html$Attributes$style, 'display', 'flex'), + A2($elm$html$Html$Attributes$style, 'justify-content', 'center'), + A2($elm$html$Html$Attributes$style, 'align-items', 'center'), + A2($elm$html$Html$Attributes$style, 'cursor', 'pointer'), + $elm$html$Html$Events$onClick(config.open) + ]), + _List_fromArray( + [ + $elm$browser$Debugger$Overlay$elmLogo, + A2( + $elm$html$Html$span, + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'padding-left', 'calc(1ch + 6px)'), + A2($elm$html$Html$Attributes$style, 'padding-right', '1ch') + ]), + _List_fromArray( + [ + $elm$html$Html$text(string) + ])) + ])); + }); +var $elm$browser$Debugger$Overlay$explanationBad = '\nThe messages in this history do not match the messages handled by your\nprogram. I noticed changes in the following types:\n'; +var $elm$browser$Debugger$Overlay$explanationRisky = '\nThis history seems old. It will work with this program, but some\nmessages have been added since the history was created:\n'; +var $elm$core$List$intersperse = F2( + function (sep, xs) { + if (!xs.b) { + return _List_Nil; + } else { + var hd = xs.a; + var tl = xs.b; + var step = F2( + function (x, rest) { + return A2( + $elm$core$List$cons, + sep, + A2($elm$core$List$cons, x, rest)); + }); + var spersed = A3($elm$core$List$foldr, step, _List_Nil, tl); + return A2($elm$core$List$cons, hd, spersed); + } + }); +var $elm$browser$Debugger$Overlay$viewMention = F2( + function (tags, verbed) { + var _v0 = A2( + $elm$core$List$map, + $elm$browser$Debugger$Overlay$viewCode, + $elm$core$List$reverse(tags)); + if (!_v0.b) { + return $elm$html$Html$text(''); + } else { + if (!_v0.b.b) { + var tag = _v0.a; + return A2( + $elm$html$Html$li, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text(verbed), + tag, + $elm$html$Html$text('.') + ])); + } else { + if (!_v0.b.b.b) { + var tag2 = _v0.a; + var _v1 = _v0.b; + var tag1 = _v1.a; + return A2( + $elm$html$Html$li, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text(verbed), + tag1, + $elm$html$Html$text(' and '), + tag2, + $elm$html$Html$text('.') + ])); + } else { + var lastTag = _v0.a; + var otherTags = _v0.b; + return A2( + $elm$html$Html$li, + _List_Nil, + A2( + $elm$core$List$cons, + $elm$html$Html$text(verbed), + _Utils_ap( + A2( + $elm$core$List$intersperse, + $elm$html$Html$text(', '), + $elm$core$List$reverse(otherTags)), + _List_fromArray( + [ + $elm$html$Html$text(', and '), + lastTag, + $elm$html$Html$text('.') + ])))); + } + } + } + }); +var $elm$browser$Debugger$Overlay$viewChange = function (change) { + return A2( + $elm$html$Html$li, + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'margin', '8px 0') + ]), + function () { + if (change.$ === 'AliasChange') { + var name = change.a; + return _List_fromArray( + [ + A2( + $elm$html$Html$span, + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'font-size', '1.5em') + ]), + _List_fromArray( + [ + $elm$browser$Debugger$Overlay$viewCode(name) + ])) + ]); + } else { + var name = change.a; + var removed = change.b.removed; + var changed = change.b.changed; + var added = change.b.added; + var argsMatch = change.b.argsMatch; + return _List_fromArray( + [ + A2( + $elm$html$Html$span, + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'font-size', '1.5em') + ]), + _List_fromArray( + [ + $elm$browser$Debugger$Overlay$viewCode(name) + ])), + A2( + $elm$html$Html$ul, + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'list-style-type', 'disc'), + A2($elm$html$Html$Attributes$style, 'padding-left', '2em') + ]), + _List_fromArray( + [ + A2($elm$browser$Debugger$Overlay$viewMention, removed, 'Removed '), + A2($elm$browser$Debugger$Overlay$viewMention, changed, 'Changed '), + A2($elm$browser$Debugger$Overlay$viewMention, added, 'Added ') + ])), + argsMatch ? $elm$html$Html$text('') : $elm$html$Html$text('This may be due to the fact that the type variable names changed.') + ]); + } + }()); +}; +var $elm$browser$Debugger$Overlay$viewReport = F2( + function (isBad, report) { + switch (report.$) { + case 'CorruptHistory': + return _List_fromArray( + [ + $elm$html$Html$text('Looks like this history file is corrupt. I cannot understand it.') + ]); + case 'VersionChanged': + var old = report.a; + var _new = report.b; + return _List_fromArray( + [ + $elm$html$Html$text('This history was created with Elm ' + (old + (', but you are using Elm ' + (_new + ' right now.')))) + ]); + case 'MessageChanged': + var old = report.a; + var _new = report.b; + return _List_fromArray( + [ + $elm$html$Html$text('To import some other history, the overall message type must' + ' be the same. The old history has '), + $elm$browser$Debugger$Overlay$viewCode(old), + $elm$html$Html$text(' messages, but the new program works with '), + $elm$browser$Debugger$Overlay$viewCode(_new), + $elm$html$Html$text(' messages.') + ]); + default: + var changes = report.a; + return _List_fromArray( + [ + A2( + $elm$html$Html$p, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text( + isBad ? $elm$browser$Debugger$Overlay$explanationBad : $elm$browser$Debugger$Overlay$explanationRisky) + ])), + A2( + $elm$html$Html$ul, + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'list-style-type', 'none'), + A2($elm$html$Html$Attributes$style, 'padding-left', '20px') + ]), + A2($elm$core$List$map, $elm$browser$Debugger$Overlay$viewChange, changes)) + ]); + } + }); +var $elm$browser$Debugger$Overlay$view = F5( + function (config, isPaused, isOpen, numMsgs, state) { + switch (state.$) { + case 'None': + return isOpen ? $elm$html$Html$text('') : (isPaused ? A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$id('elm-debugger-overlay'), + A2($elm$html$Html$Attributes$style, 'position', 'fixed'), + A2($elm$html$Html$Attributes$style, 'top', '0'), + A2($elm$html$Html$Attributes$style, 'left', '0'), + A2($elm$html$Html$Attributes$style, 'width', '100vw'), + A2($elm$html$Html$Attributes$style, 'height', '100vh'), + A2($elm$html$Html$Attributes$style, 'cursor', 'pointer'), + A2($elm$html$Html$Attributes$style, 'display', 'flex'), + A2($elm$html$Html$Attributes$style, 'align-items', 'center'), + A2($elm$html$Html$Attributes$style, 'justify-content', 'center'), + A2($elm$html$Html$Attributes$style, 'pointer-events', 'auto'), + A2($elm$html$Html$Attributes$style, 'background-color', 'rgba(200, 200, 200, 0.7)'), + A2($elm$html$Html$Attributes$style, 'color', 'white'), + A2($elm$html$Html$Attributes$style, 'font-family', '\'Trebuchet MS\', \'Lucida Grande\', \'Bitstream Vera Sans\', \'Helvetica Neue\', sans-serif'), + A2($elm$html$Html$Attributes$style, 'z-index', '2147483646'), + $elm$html$Html$Events$onClick(config.resume) + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$span, + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'font-size', '80px') + ]), + _List_fromArray( + [ + $elm$html$Html$text('Click to Resume') + ])), + A2($elm$browser$Debugger$Overlay$viewMiniControls, config, numMsgs) + ])) : A2($elm$browser$Debugger$Overlay$viewMiniControls, config, numMsgs)); + case 'BadMetadata': + var badMetadata_ = state.a; + return A4( + $elm$browser$Debugger$Overlay$viewMessage, + config, + 'Cannot use Import or Export', + $elm$browser$Debugger$Overlay$viewBadMetadata(badMetadata_), + $elm$browser$Debugger$Overlay$Accept('Ok')); + case 'BadImport': + var report = state.a; + return A4( + $elm$browser$Debugger$Overlay$viewMessage, + config, + 'Cannot Import History', + A2($elm$browser$Debugger$Overlay$viewReport, true, report), + $elm$browser$Debugger$Overlay$Accept('Ok')); + default: + var report = state.a; + return A4( + $elm$browser$Debugger$Overlay$viewMessage, + config, + 'Warning', + A2($elm$browser$Debugger$Overlay$viewReport, false, report), + A2($elm$browser$Debugger$Overlay$Choose, 'Cancel', 'Import Anyway')); + } + }); +var $elm$browser$Debugger$Main$cornerView = function (model) { + return A5( + $elm$browser$Debugger$Overlay$view, + {exportHistory: $elm$browser$Debugger$Main$Export, importHistory: $elm$browser$Debugger$Main$Import, open: $elm$browser$Debugger$Main$Open, resume: $elm$browser$Debugger$Main$Resume, wrap: $elm$browser$Debugger$Main$OverlayMsg}, + $elm$browser$Debugger$Main$isPaused(model.state), + _Debugger_isOpen(model.popout), + $elm$browser$Debugger$History$size(model.history), + model.overlay); +}; +var $elm$core$Dict$RBEmpty_elm_builtin = {$: 'RBEmpty_elm_builtin'}; +var $elm$core$Dict$empty = $elm$core$Dict$RBEmpty_elm_builtin; +var $elm$core$Set$foldr = F3( + function (func, initialState, _v0) { + var dict = _v0.a; + return A3( + $elm$core$Dict$foldr, + F3( + function (key, _v1, state) { + return A2(func, key, state); + }), + initialState, + dict); + }); +var $elm$browser$Debugger$Main$getCurrentModel = function (state) { + if (state.$ === 'Running') { + var model = state.a; + return model; + } else { + var model = state.b; + return model; + } +}; +var $elm$browser$Debugger$Main$getUserModel = function (model) { + return $elm$browser$Debugger$Main$getCurrentModel(model.state); +}; +var $elm$browser$Debugger$Main$initialWindowHeight = 420; +var $elm$browser$Debugger$Main$initialWindowWidth = 900; +var $elm$core$Dict$Black = {$: 'Black'}; +var $elm$core$Dict$RBNode_elm_builtin = F5( + function (a, b, c, d, e) { + return {$: 'RBNode_elm_builtin', a: a, b: b, c: c, d: d, e: e}; + }); +var $elm$core$Dict$Red = {$: 'Red'}; +var $elm$core$Dict$balance = F5( + function (color, key, value, left, right) { + if ((right.$ === 'RBNode_elm_builtin') && (right.a.$ === 'Red')) { + var _v1 = right.a; + var rK = right.b; + var rV = right.c; + var rLeft = right.d; + var rRight = right.e; + if ((left.$ === 'RBNode_elm_builtin') && (left.a.$ === 'Red')) { + var _v3 = left.a; + var lK = left.b; + var lV = left.c; + var lLeft = left.d; + var lRight = left.e; + return A5( + $elm$core$Dict$RBNode_elm_builtin, + $elm$core$Dict$Red, + key, + value, + A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Black, lK, lV, lLeft, lRight), + A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Black, rK, rV, rLeft, rRight)); + } else { + return A5( + $elm$core$Dict$RBNode_elm_builtin, + color, + rK, + rV, + A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, key, value, left, rLeft), + rRight); + } + } else { + if ((((left.$ === 'RBNode_elm_builtin') && (left.a.$ === 'Red')) && (left.d.$ === 'RBNode_elm_builtin')) && (left.d.a.$ === 'Red')) { + var _v5 = left.a; + var lK = left.b; + var lV = left.c; + var _v6 = left.d; + var _v7 = _v6.a; + var llK = _v6.b; + var llV = _v6.c; + var llLeft = _v6.d; + var llRight = _v6.e; + var lRight = left.e; + return A5( + $elm$core$Dict$RBNode_elm_builtin, + $elm$core$Dict$Red, + lK, + lV, + A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Black, llK, llV, llLeft, llRight), + A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Black, key, value, lRight, right)); + } else { + return A5($elm$core$Dict$RBNode_elm_builtin, color, key, value, left, right); + } + } + }); +var $elm$core$Basics$compare = _Utils_compare; +var $elm$core$Dict$insertHelp = F3( + function (key, value, dict) { + if (dict.$ === 'RBEmpty_elm_builtin') { + return A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, key, value, $elm$core$Dict$RBEmpty_elm_builtin, $elm$core$Dict$RBEmpty_elm_builtin); + } else { + var nColor = dict.a; + var nKey = dict.b; + var nValue = dict.c; + var nLeft = dict.d; + var nRight = dict.e; + var _v1 = A2($elm$core$Basics$compare, key, nKey); + switch (_v1.$) { + case 'LT': + return A5( + $elm$core$Dict$balance, + nColor, + nKey, + nValue, + A3($elm$core$Dict$insertHelp, key, value, nLeft), + nRight); + case 'EQ': + return A5($elm$core$Dict$RBNode_elm_builtin, nColor, nKey, value, nLeft, nRight); + default: + return A5( + $elm$core$Dict$balance, + nColor, + nKey, + nValue, + nLeft, + A3($elm$core$Dict$insertHelp, key, value, nRight)); + } + } + }); +var $elm$core$Dict$insert = F3( + function (key, value, dict) { + var _v0 = A3($elm$core$Dict$insertHelp, key, value, dict); + if ((_v0.$ === 'RBNode_elm_builtin') && (_v0.a.$ === 'Red')) { + var _v1 = _v0.a; + var k = _v0.b; + var v = _v0.c; + var l = _v0.d; + var r = _v0.e; + return A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Black, k, v, l, r); + } else { + var x = _v0; + return x; + } + }); +var $elm$browser$Debugger$Main$cachedHistory = function (model) { + var _v0 = model.state; + if (_v0.$ === 'Running') { + return model.history; + } else { + var history = _v0.e; + return history; + } +}; +var $elm$virtual_dom$VirtualDom$node = function (tag) { + return _VirtualDom_node( + _VirtualDom_noScript(tag)); +}; +var $elm$html$Html$node = $elm$virtual_dom$VirtualDom$node; +var $elm$browser$Debugger$Main$DragEnd = {$: 'DragEnd'}; +var $elm$browser$Debugger$Main$getDragStatus = function (layout) { + if (layout.$ === 'Horizontal') { + var status = layout.a; + return status; + } else { + var status = layout.a; + return status; + } +}; +var $elm$browser$Debugger$Main$Drag = function (a) { + return {$: 'Drag', a: a}; +}; +var $elm$browser$Debugger$Main$DragInfo = F5( + function (x, y, down, width, height) { + return {down: down, height: height, width: width, x: x, y: y}; + }); +var $elm$json$Json$Decode$field = _Json_decodeField; +var $elm$json$Json$Decode$at = F2( + function (fields, decoder) { + return A3($elm$core$List$foldr, $elm$json$Json$Decode$field, decoder, fields); + }); +var $elm$json$Json$Decode$float = _Json_decodeFloat; +var $elm$browser$Debugger$Main$decodeDimension = function (field) { + return A2( + $elm$json$Json$Decode$at, + _List_fromArray( + ['currentTarget', 'ownerDocument', 'defaultView', field]), + $elm$json$Json$Decode$float); +}; +var $elm$json$Json$Decode$int = _Json_decodeInt; +var $elm$json$Json$Decode$map5 = _Json_map5; +var $elm$browser$Debugger$Main$onMouseMove = A2( + $elm$html$Html$Events$on, + 'mousemove', + A2( + $elm$json$Json$Decode$map, + $elm$browser$Debugger$Main$Drag, + A6( + $elm$json$Json$Decode$map5, + $elm$browser$Debugger$Main$DragInfo, + A2($elm$json$Json$Decode$field, 'pageX', $elm$json$Json$Decode$float), + A2($elm$json$Json$Decode$field, 'pageY', $elm$json$Json$Decode$float), + A2( + $elm$json$Json$Decode$field, + 'buttons', + A2( + $elm$json$Json$Decode$map, + function (v) { + return v === 1; + }, + $elm$json$Json$Decode$int)), + $elm$browser$Debugger$Main$decodeDimension('innerWidth'), + $elm$browser$Debugger$Main$decodeDimension('innerHeight')))); +var $elm$html$Html$Events$onMouseUp = function (msg) { + return A2( + $elm$html$Html$Events$on, + 'mouseup', + $elm$json$Json$Decode$succeed(msg)); +}; +var $elm$browser$Debugger$Main$toDragListeners = function (layout) { + var _v0 = $elm$browser$Debugger$Main$getDragStatus(layout); + if (_v0.$ === 'Static') { + return _List_Nil; + } else { + return _List_fromArray( + [ + $elm$browser$Debugger$Main$onMouseMove, + $elm$html$Html$Events$onMouseUp($elm$browser$Debugger$Main$DragEnd) + ]); + } +}; +var $elm$browser$Debugger$Main$toFlexDirection = function (layout) { + if (layout.$ === 'Horizontal') { + return 'row'; + } else { + return 'column-reverse'; + } +}; +var $elm$browser$Debugger$Main$DragStart = {$: 'DragStart'}; +var $elm$html$Html$Events$onMouseDown = function (msg) { + return A2( + $elm$html$Html$Events$on, + 'mousedown', + $elm$json$Json$Decode$succeed(msg)); +}; +var $elm$browser$Debugger$Main$toPercent = function (fraction) { + return $elm$core$String$fromFloat(100 * fraction) + '%'; +}; +var $elm$browser$Debugger$Main$viewDragZone = function (layout) { + if (layout.$ === 'Horizontal') { + var x = layout.b; + return A2( + $elm$html$Html$div, + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'position', 'absolute'), + A2($elm$html$Html$Attributes$style, 'top', '0'), + A2( + $elm$html$Html$Attributes$style, + 'left', + $elm$browser$Debugger$Main$toPercent(x)), + A2($elm$html$Html$Attributes$style, 'margin-left', '-5px'), + A2($elm$html$Html$Attributes$style, 'width', '10px'), + A2($elm$html$Html$Attributes$style, 'height', '100%'), + A2($elm$html$Html$Attributes$style, 'cursor', 'col-resize'), + $elm$html$Html$Events$onMouseDown($elm$browser$Debugger$Main$DragStart) + ]), + _List_Nil); + } else { + var y = layout.c; + return A2( + $elm$html$Html$div, + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'position', 'absolute'), + A2( + $elm$html$Html$Attributes$style, + 'top', + $elm$browser$Debugger$Main$toPercent(y)), + A2($elm$html$Html$Attributes$style, 'left', '0'), + A2($elm$html$Html$Attributes$style, 'margin-top', '-5px'), + A2($elm$html$Html$Attributes$style, 'width', '100%'), + A2($elm$html$Html$Attributes$style, 'height', '10px'), + A2($elm$html$Html$Attributes$style, 'cursor', 'row-resize'), + $elm$html$Html$Events$onMouseDown($elm$browser$Debugger$Main$DragStart) + ]), + _List_Nil); + } +}; +var $elm$browser$Debugger$Main$TweakExpandoModel = function (a) { + return {$: 'TweakExpandoModel', a: a}; +}; +var $elm$browser$Debugger$Main$TweakExpandoMsg = function (a) { + return {$: 'TweakExpandoMsg', a: a}; +}; +var $elm$browser$Debugger$Main$toExpandoPercents = function (layout) { + if (layout.$ === 'Horizontal') { + var x = layout.b; + return _Utils_Tuple2( + $elm$browser$Debugger$Main$toPercent(1 - x), + '100%'); + } else { + var y = layout.c; + return _Utils_Tuple2( + '100%', + $elm$browser$Debugger$Main$toPercent(y)); + } +}; +var $elm$browser$Debugger$Main$toMouseBlocker = function (layout) { + var _v0 = $elm$browser$Debugger$Main$getDragStatus(layout); + if (_v0.$ === 'Static') { + return 'auto'; + } else { + return 'none'; + } +}; +var $elm$browser$Debugger$Expando$Field = F2( + function (a, b) { + return {$: 'Field', a: a, b: b}; + }); +var $elm$browser$Debugger$Expando$Index = F3( + function (a, b, c) { + return {$: 'Index', a: a, b: b, c: c}; + }); +var $elm$browser$Debugger$Expando$Key = {$: 'Key'}; +var $elm$browser$Debugger$Expando$None = {$: 'None'}; +var $elm$browser$Debugger$Expando$Toggle = {$: 'Toggle'}; +var $elm$browser$Debugger$Expando$Value = {$: 'Value'}; +var $elm$browser$Debugger$Expando$blue = A2($elm$html$Html$Attributes$style, 'color', 'rgb(28, 0, 207)'); +var $elm$core$Basics$composeL = F3( + function (g, f, x) { + return g( + f(x)); + }); +var $elm$browser$Debugger$Expando$leftPad = function (maybeKey) { + if (maybeKey.$ === 'Nothing') { + return _List_Nil; + } else { + return _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'padding-left', '4ch') + ]); + } +}; +var $elm$browser$Debugger$Expando$makeArrow = function (arrow) { + return A2( + $elm$html$Html$span, + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'color', '#777'), + A2($elm$html$Html$Attributes$style, 'padding-left', '2ch'), + A2($elm$html$Html$Attributes$style, 'width', '2ch'), + A2($elm$html$Html$Attributes$style, 'display', 'inline-block') + ]), + _List_fromArray( + [ + $elm$html$Html$text(arrow) + ])); +}; +var $elm$browser$Debugger$Expando$purple = A2($elm$html$Html$Attributes$style, 'color', 'rgb(136, 19, 145)'); +var $elm$browser$Debugger$Expando$lineStarter = F3( + function (maybeKey, maybeIsClosed, description) { + var arrow = function () { + if (maybeIsClosed.$ === 'Nothing') { + return $elm$browser$Debugger$Expando$makeArrow(''); + } else { + if (maybeIsClosed.a) { + return $elm$browser$Debugger$Expando$makeArrow('▸'); + } else { + return $elm$browser$Debugger$Expando$makeArrow('▾'); + } + } + }(); + if (maybeKey.$ === 'Nothing') { + return A2($elm$core$List$cons, arrow, description); + } else { + var key = maybeKey.a; + return A2( + $elm$core$List$cons, + arrow, + A2( + $elm$core$List$cons, + A2( + $elm$html$Html$span, + _List_fromArray( + [$elm$browser$Debugger$Expando$purple]), + _List_fromArray( + [ + $elm$html$Html$text(key) + ])), + A2( + $elm$core$List$cons, + $elm$html$Html$text(' = '), + description))); + } + }); +var $elm$browser$Debugger$Expando$red = A2($elm$html$Html$Attributes$style, 'color', 'rgb(196, 26, 22)'); +var $elm$core$Tuple$second = function (_v0) { + var y = _v0.b; + return y; +}; +var $elm$browser$Debugger$Expando$seqTypeToString = F2( + function (n, seqType) { + switch (seqType.$) { + case 'ListSeq': + return 'List(' + ($elm$core$String$fromInt(n) + ')'); + case 'SetSeq': + return 'Set(' + ($elm$core$String$fromInt(n) + ')'); + default: + return 'Array(' + ($elm$core$String$fromInt(n) + ')'); + } + }); +var $elm$core$String$slice = _String_slice; +var $elm$core$String$left = F2( + function (n, string) { + return (n < 1) ? '' : A3($elm$core$String$slice, 0, n, string); + }); +var $elm$core$String$right = F2( + function (n, string) { + return (n < 1) ? '' : A3( + $elm$core$String$slice, + -n, + $elm$core$String$length(string), + string); + }); +var $elm$browser$Debugger$Expando$elideMiddle = function (str) { + return ($elm$core$String$length(str) <= 18) ? str : (A2($elm$core$String$left, 8, str) + ('...' + A2($elm$core$String$right, 8, str))); +}; +var $elm$core$Dict$isEmpty = function (dict) { + if (dict.$ === 'RBEmpty_elm_builtin') { + return true; + } else { + return false; + } +}; +var $elm$browser$Debugger$Expando$viewExtraTinyRecord = F3( + function (length, starter, entries) { + if (!entries.b) { + return _Utils_Tuple2( + length + 1, + _List_fromArray( + [ + $elm$html$Html$text('}') + ])); + } else { + var field = entries.a; + var rest = entries.b; + var nextLength = (length + $elm$core$String$length(field)) + 1; + if (nextLength > 18) { + return _Utils_Tuple2( + length + 2, + _List_fromArray( + [ + $elm$html$Html$text('…}') + ])); + } else { + var _v1 = A3($elm$browser$Debugger$Expando$viewExtraTinyRecord, nextLength, ',', rest); + var finalLength = _v1.a; + var otherHtmls = _v1.b; + return _Utils_Tuple2( + finalLength, + A2( + $elm$core$List$cons, + $elm$html$Html$text(starter), + A2( + $elm$core$List$cons, + A2( + $elm$html$Html$span, + _List_fromArray( + [$elm$browser$Debugger$Expando$purple]), + _List_fromArray( + [ + $elm$html$Html$text(field) + ])), + otherHtmls))); + } + } + }); +var $elm$browser$Debugger$Expando$viewTinyHelp = function (str) { + return _Utils_Tuple2( + $elm$core$String$length(str), + _List_fromArray( + [ + $elm$html$Html$text(str) + ])); +}; +var $elm$core$Maybe$withDefault = F2( + function (_default, maybe) { + if (maybe.$ === 'Just') { + var value = maybe.a; + return value; + } else { + return _default; + } + }); +var $elm$browser$Debugger$Expando$viewExtraTiny = function (value) { + if (value.$ === 'Record') { + var record = value.b; + return A3( + $elm$browser$Debugger$Expando$viewExtraTinyRecord, + 0, + '{', + $elm$core$Dict$keys(record)); + } else { + return $elm$browser$Debugger$Expando$viewTiny(value); + } +}; +var $elm$browser$Debugger$Expando$viewTiny = function (value) { + switch (value.$) { + case 'S': + var stringRep = value.a; + var str = $elm$browser$Debugger$Expando$elideMiddle(stringRep); + return _Utils_Tuple2( + $elm$core$String$length(str), + _List_fromArray( + [ + A2( + $elm$html$Html$span, + _List_fromArray( + [$elm$browser$Debugger$Expando$red]), + _List_fromArray( + [ + $elm$html$Html$text(str) + ])) + ])); + case 'Primitive': + var stringRep = value.a; + return _Utils_Tuple2( + $elm$core$String$length(stringRep), + _List_fromArray( + [ + A2( + $elm$html$Html$span, + _List_fromArray( + [$elm$browser$Debugger$Expando$blue]), + _List_fromArray( + [ + $elm$html$Html$text(stringRep) + ])) + ])); + case 'Sequence': + var seqType = value.a; + var valueList = value.c; + return $elm$browser$Debugger$Expando$viewTinyHelp( + A2( + $elm$browser$Debugger$Expando$seqTypeToString, + $elm$core$List$length(valueList), + seqType)); + case 'Dictionary': + var keyValuePairs = value.b; + return $elm$browser$Debugger$Expando$viewTinyHelp( + 'Dict(' + ($elm$core$String$fromInt( + $elm$core$List$length(keyValuePairs)) + ')')); + case 'Record': + var record = value.b; + return $elm$browser$Debugger$Expando$viewTinyRecord(record); + default: + if (!value.c.b) { + var maybeName = value.a; + return $elm$browser$Debugger$Expando$viewTinyHelp( + A2($elm$core$Maybe$withDefault, 'Unit', maybeName)); + } else { + var maybeName = value.a; + var valueList = value.c; + return $elm$browser$Debugger$Expando$viewTinyHelp( + function () { + if (maybeName.$ === 'Nothing') { + return 'Tuple(' + ($elm$core$String$fromInt( + $elm$core$List$length(valueList)) + ')'); + } else { + var name = maybeName.a; + return name + ' …'; + } + }()); + } + } +}; +var $elm$browser$Debugger$Expando$viewTinyRecord = function (record) { + return $elm$core$Dict$isEmpty(record) ? _Utils_Tuple2( + 2, + _List_fromArray( + [ + $elm$html$Html$text('{}') + ])) : A3( + $elm$browser$Debugger$Expando$viewTinyRecordHelp, + 0, + '{ ', + $elm$core$Dict$toList(record)); +}; +var $elm$browser$Debugger$Expando$viewTinyRecordHelp = F3( + function (length, starter, entries) { + if (!entries.b) { + return _Utils_Tuple2( + length + 2, + _List_fromArray( + [ + $elm$html$Html$text(' }') + ])); + } else { + var _v1 = entries.a; + var field = _v1.a; + var value = _v1.b; + var rest = entries.b; + var fieldLen = $elm$core$String$length(field); + var _v2 = $elm$browser$Debugger$Expando$viewExtraTiny(value); + var valueLen = _v2.a; + var valueHtmls = _v2.b; + var newLength = ((length + fieldLen) + valueLen) + 5; + if (newLength > 60) { + return _Utils_Tuple2( + length + 4, + _List_fromArray( + [ + $elm$html$Html$text(', … }') + ])); + } else { + var _v3 = A3($elm$browser$Debugger$Expando$viewTinyRecordHelp, newLength, ', ', rest); + var finalLength = _v3.a; + var otherHtmls = _v3.b; + return _Utils_Tuple2( + finalLength, + A2( + $elm$core$List$cons, + $elm$html$Html$text(starter), + A2( + $elm$core$List$cons, + A2( + $elm$html$Html$span, + _List_fromArray( + [$elm$browser$Debugger$Expando$purple]), + _List_fromArray( + [ + $elm$html$Html$text(field) + ])), + A2( + $elm$core$List$cons, + $elm$html$Html$text(' = '), + A2( + $elm$core$List$cons, + A2($elm$html$Html$span, _List_Nil, valueHtmls), + otherHtmls))))); + } + } + }); +var $elm$browser$Debugger$Expando$view = F2( + function (maybeKey, expando) { + switch (expando.$) { + case 'S': + var stringRep = expando.a; + return A2( + $elm$html$Html$div, + $elm$browser$Debugger$Expando$leftPad(maybeKey), + A3( + $elm$browser$Debugger$Expando$lineStarter, + maybeKey, + $elm$core$Maybe$Nothing, + _List_fromArray( + [ + A2( + $elm$html$Html$span, + _List_fromArray( + [$elm$browser$Debugger$Expando$red]), + _List_fromArray( + [ + $elm$html$Html$text(stringRep) + ])) + ]))); + case 'Primitive': + var stringRep = expando.a; + return A2( + $elm$html$Html$div, + $elm$browser$Debugger$Expando$leftPad(maybeKey), + A3( + $elm$browser$Debugger$Expando$lineStarter, + maybeKey, + $elm$core$Maybe$Nothing, + _List_fromArray( + [ + A2( + $elm$html$Html$span, + _List_fromArray( + [$elm$browser$Debugger$Expando$blue]), + _List_fromArray( + [ + $elm$html$Html$text(stringRep) + ])) + ]))); + case 'Sequence': + var seqType = expando.a; + var isClosed = expando.b; + var valueList = expando.c; + return A4($elm$browser$Debugger$Expando$viewSequence, maybeKey, seqType, isClosed, valueList); + case 'Dictionary': + var isClosed = expando.a; + var keyValuePairs = expando.b; + return A3($elm$browser$Debugger$Expando$viewDictionary, maybeKey, isClosed, keyValuePairs); + case 'Record': + var isClosed = expando.a; + var valueDict = expando.b; + return A3($elm$browser$Debugger$Expando$viewRecord, maybeKey, isClosed, valueDict); + default: + var maybeName = expando.a; + var isClosed = expando.b; + var valueList = expando.c; + return A4($elm$browser$Debugger$Expando$viewConstructor, maybeKey, maybeName, isClosed, valueList); + } + }); +var $elm$browser$Debugger$Expando$viewConstructor = F4( + function (maybeKey, maybeName, isClosed, valueList) { + var tinyArgs = A2( + $elm$core$List$map, + A2($elm$core$Basics$composeL, $elm$core$Tuple$second, $elm$browser$Debugger$Expando$viewExtraTiny), + valueList); + var description = function () { + var _v7 = _Utils_Tuple2(maybeName, tinyArgs); + if (_v7.a.$ === 'Nothing') { + if (!_v7.b.b) { + var _v8 = _v7.a; + return _List_fromArray( + [ + $elm$html$Html$text('()') + ]); + } else { + var _v9 = _v7.a; + var _v10 = _v7.b; + var x = _v10.a; + var xs = _v10.b; + return A2( + $elm$core$List$cons, + $elm$html$Html$text('( '), + A2( + $elm$core$List$cons, + A2($elm$html$Html$span, _List_Nil, x), + A3( + $elm$core$List$foldr, + F2( + function (args, rest) { + return A2( + $elm$core$List$cons, + $elm$html$Html$text(', '), + A2( + $elm$core$List$cons, + A2($elm$html$Html$span, _List_Nil, args), + rest)); + }), + _List_fromArray( + [ + $elm$html$Html$text(' )') + ]), + xs))); + } + } else { + if (!_v7.b.b) { + var name = _v7.a.a; + return _List_fromArray( + [ + $elm$html$Html$text(name) + ]); + } else { + var name = _v7.a.a; + var _v11 = _v7.b; + var x = _v11.a; + var xs = _v11.b; + return A2( + $elm$core$List$cons, + $elm$html$Html$text(name + ' '), + A2( + $elm$core$List$cons, + A2($elm$html$Html$span, _List_Nil, x), + A3( + $elm$core$List$foldr, + F2( + function (args, rest) { + return A2( + $elm$core$List$cons, + $elm$html$Html$text(' '), + A2( + $elm$core$List$cons, + A2($elm$html$Html$span, _List_Nil, args), + rest)); + }), + _List_Nil, + xs))); + } + } + }(); + var _v4 = function () { + if (!valueList.b) { + return _Utils_Tuple2( + $elm$core$Maybe$Nothing, + A2($elm$html$Html$div, _List_Nil, _List_Nil)); + } else { + if (!valueList.b.b) { + var entry = valueList.a; + switch (entry.$) { + case 'S': + return _Utils_Tuple2( + $elm$core$Maybe$Nothing, + A2($elm$html$Html$div, _List_Nil, _List_Nil)); + case 'Primitive': + return _Utils_Tuple2( + $elm$core$Maybe$Nothing, + A2($elm$html$Html$div, _List_Nil, _List_Nil)); + case 'Sequence': + var subValueList = entry.c; + return _Utils_Tuple2( + $elm$core$Maybe$Just(isClosed), + isClosed ? A2($elm$html$Html$div, _List_Nil, _List_Nil) : A2( + $elm$html$Html$map, + A2($elm$browser$Debugger$Expando$Index, $elm$browser$Debugger$Expando$None, 0), + $elm$browser$Debugger$Expando$viewSequenceOpen(subValueList))); + case 'Dictionary': + var keyValuePairs = entry.b; + return _Utils_Tuple2( + $elm$core$Maybe$Just(isClosed), + isClosed ? A2($elm$html$Html$div, _List_Nil, _List_Nil) : A2( + $elm$html$Html$map, + A2($elm$browser$Debugger$Expando$Index, $elm$browser$Debugger$Expando$None, 0), + $elm$browser$Debugger$Expando$viewDictionaryOpen(keyValuePairs))); + case 'Record': + var record = entry.b; + return _Utils_Tuple2( + $elm$core$Maybe$Just(isClosed), + isClosed ? A2($elm$html$Html$div, _List_Nil, _List_Nil) : A2( + $elm$html$Html$map, + A2($elm$browser$Debugger$Expando$Index, $elm$browser$Debugger$Expando$None, 0), + $elm$browser$Debugger$Expando$viewRecordOpen(record))); + default: + var subValueList = entry.c; + return _Utils_Tuple2( + $elm$core$Maybe$Just(isClosed), + isClosed ? A2($elm$html$Html$div, _List_Nil, _List_Nil) : A2( + $elm$html$Html$map, + A2($elm$browser$Debugger$Expando$Index, $elm$browser$Debugger$Expando$None, 0), + $elm$browser$Debugger$Expando$viewConstructorOpen(subValueList))); + } + } else { + return _Utils_Tuple2( + $elm$core$Maybe$Just(isClosed), + isClosed ? A2($elm$html$Html$div, _List_Nil, _List_Nil) : $elm$browser$Debugger$Expando$viewConstructorOpen(valueList)); + } + } + }(); + var maybeIsClosed = _v4.a; + var openHtml = _v4.b; + return A2( + $elm$html$Html$div, + $elm$browser$Debugger$Expando$leftPad(maybeKey), + _List_fromArray( + [ + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Events$onClick($elm$browser$Debugger$Expando$Toggle) + ]), + A3($elm$browser$Debugger$Expando$lineStarter, maybeKey, maybeIsClosed, description)), + openHtml + ])); + }); +var $elm$browser$Debugger$Expando$viewConstructorEntry = F2( + function (index, value) { + return A2( + $elm$html$Html$map, + A2($elm$browser$Debugger$Expando$Index, $elm$browser$Debugger$Expando$None, index), + A2( + $elm$browser$Debugger$Expando$view, + $elm$core$Maybe$Just( + $elm$core$String$fromInt(index)), + value)); + }); +var $elm$browser$Debugger$Expando$viewConstructorOpen = function (valueList) { + return A2( + $elm$html$Html$div, + _List_Nil, + A2($elm$core$List$indexedMap, $elm$browser$Debugger$Expando$viewConstructorEntry, valueList)); +}; +var $elm$browser$Debugger$Expando$viewDictionary = F3( + function (maybeKey, isClosed, keyValuePairs) { + var starter = 'Dict(' + ($elm$core$String$fromInt( + $elm$core$List$length(keyValuePairs)) + ')'); + return A2( + $elm$html$Html$div, + $elm$browser$Debugger$Expando$leftPad(maybeKey), + _List_fromArray( + [ + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Events$onClick($elm$browser$Debugger$Expando$Toggle) + ]), + A3( + $elm$browser$Debugger$Expando$lineStarter, + maybeKey, + $elm$core$Maybe$Just(isClosed), + _List_fromArray( + [ + $elm$html$Html$text(starter) + ]))), + isClosed ? $elm$html$Html$text('') : $elm$browser$Debugger$Expando$viewDictionaryOpen(keyValuePairs) + ])); + }); +var $elm$browser$Debugger$Expando$viewDictionaryEntry = F2( + function (index, _v2) { + var key = _v2.a; + var value = _v2.b; + switch (key.$) { + case 'S': + var stringRep = key.a; + return A2( + $elm$html$Html$map, + A2($elm$browser$Debugger$Expando$Index, $elm$browser$Debugger$Expando$Value, index), + A2( + $elm$browser$Debugger$Expando$view, + $elm$core$Maybe$Just(stringRep), + value)); + case 'Primitive': + var stringRep = key.a; + return A2( + $elm$html$Html$map, + A2($elm$browser$Debugger$Expando$Index, $elm$browser$Debugger$Expando$Value, index), + A2( + $elm$browser$Debugger$Expando$view, + $elm$core$Maybe$Just(stringRep), + value)); + default: + return A2( + $elm$html$Html$div, + _List_Nil, + _List_fromArray( + [ + A2( + $elm$html$Html$map, + A2($elm$browser$Debugger$Expando$Index, $elm$browser$Debugger$Expando$Key, index), + A2( + $elm$browser$Debugger$Expando$view, + $elm$core$Maybe$Just('key'), + key)), + A2( + $elm$html$Html$map, + A2($elm$browser$Debugger$Expando$Index, $elm$browser$Debugger$Expando$Value, index), + A2( + $elm$browser$Debugger$Expando$view, + $elm$core$Maybe$Just('value'), + value)) + ])); + } + }); +var $elm$browser$Debugger$Expando$viewDictionaryOpen = function (keyValuePairs) { + return A2( + $elm$html$Html$div, + _List_Nil, + A2($elm$core$List$indexedMap, $elm$browser$Debugger$Expando$viewDictionaryEntry, keyValuePairs)); +}; +var $elm$browser$Debugger$Expando$viewRecord = F3( + function (maybeKey, isClosed, record) { + var _v1 = isClosed ? _Utils_Tuple3( + $elm$browser$Debugger$Expando$viewTinyRecord(record).b, + $elm$html$Html$text(''), + $elm$html$Html$text('')) : _Utils_Tuple3( + _List_fromArray( + [ + $elm$html$Html$text('{') + ]), + $elm$browser$Debugger$Expando$viewRecordOpen(record), + A2( + $elm$html$Html$div, + $elm$browser$Debugger$Expando$leftPad( + $elm$core$Maybe$Just(_Utils_Tuple0)), + _List_fromArray( + [ + $elm$html$Html$text('}') + ]))); + var start = _v1.a; + var middle = _v1.b; + var end = _v1.c; + return A2( + $elm$html$Html$div, + $elm$browser$Debugger$Expando$leftPad(maybeKey), + _List_fromArray( + [ + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Events$onClick($elm$browser$Debugger$Expando$Toggle) + ]), + A3( + $elm$browser$Debugger$Expando$lineStarter, + maybeKey, + $elm$core$Maybe$Just(isClosed), + start)), + middle, + end + ])); + }); +var $elm$browser$Debugger$Expando$viewRecordEntry = function (_v0) { + var field = _v0.a; + var value = _v0.b; + return A2( + $elm$html$Html$map, + $elm$browser$Debugger$Expando$Field(field), + A2( + $elm$browser$Debugger$Expando$view, + $elm$core$Maybe$Just(field), + value)); +}; +var $elm$browser$Debugger$Expando$viewRecordOpen = function (record) { + return A2( + $elm$html$Html$div, + _List_Nil, + A2( + $elm$core$List$map, + $elm$browser$Debugger$Expando$viewRecordEntry, + $elm$core$Dict$toList(record))); +}; +var $elm$browser$Debugger$Expando$viewSequence = F4( + function (maybeKey, seqType, isClosed, valueList) { + var starter = A2( + $elm$browser$Debugger$Expando$seqTypeToString, + $elm$core$List$length(valueList), + seqType); + return A2( + $elm$html$Html$div, + $elm$browser$Debugger$Expando$leftPad(maybeKey), + _List_fromArray( + [ + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Events$onClick($elm$browser$Debugger$Expando$Toggle) + ]), + A3( + $elm$browser$Debugger$Expando$lineStarter, + maybeKey, + $elm$core$Maybe$Just(isClosed), + _List_fromArray( + [ + $elm$html$Html$text(starter) + ]))), + isClosed ? $elm$html$Html$text('') : $elm$browser$Debugger$Expando$viewSequenceOpen(valueList) + ])); + }); +var $elm$browser$Debugger$Expando$viewSequenceOpen = function (values) { + return A2( + $elm$html$Html$div, + _List_Nil, + A2($elm$core$List$indexedMap, $elm$browser$Debugger$Expando$viewConstructorEntry, values)); +}; +var $elm$browser$Debugger$Main$viewExpando = F3( + function (expandoMsg, expandoModel, layout) { + var block = $elm$browser$Debugger$Main$toMouseBlocker(layout); + var _v0 = $elm$browser$Debugger$Main$toExpandoPercents(layout); + var w = _v0.a; + var h = _v0.b; + return A2( + $elm$html$Html$div, + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'display', 'block'), + A2($elm$html$Html$Attributes$style, 'width', 'calc(' + (w + ' - 4em)')), + A2($elm$html$Html$Attributes$style, 'height', 'calc(' + (h + ' - 4em)')), + A2($elm$html$Html$Attributes$style, 'padding', '2em'), + A2($elm$html$Html$Attributes$style, 'margin', '0'), + A2($elm$html$Html$Attributes$style, 'overflow', 'auto'), + A2($elm$html$Html$Attributes$style, 'pointer-events', block), + A2($elm$html$Html$Attributes$style, '-webkit-user-select', block), + A2($elm$html$Html$Attributes$style, '-moz-user-select', block), + A2($elm$html$Html$Attributes$style, '-ms-user-select', block), + A2($elm$html$Html$Attributes$style, 'user-select', block) + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$div, + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'color', '#ccc'), + A2($elm$html$Html$Attributes$style, 'padding', '0 0 1em 0') + ]), + _List_fromArray( + [ + $elm$html$Html$text('-- MESSAGE') + ])), + A2( + $elm$html$Html$map, + $elm$browser$Debugger$Main$TweakExpandoMsg, + A2($elm$browser$Debugger$Expando$view, $elm$core$Maybe$Nothing, expandoMsg)), + A2( + $elm$html$Html$div, + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'color', '#ccc'), + A2($elm$html$Html$Attributes$style, 'padding', '1em 0') + ]), + _List_fromArray( + [ + $elm$html$Html$text('-- MODEL') + ])), + A2( + $elm$html$Html$map, + $elm$browser$Debugger$Main$TweakExpandoModel, + A2($elm$browser$Debugger$Expando$view, $elm$core$Maybe$Nothing, expandoModel)) + ])); + }); +var $elm$browser$Debugger$Main$Jump = function (a) { + return {$: 'Jump', a: a}; +}; +var $elm$virtual_dom$VirtualDom$lazy = _VirtualDom_lazy; +var $elm$html$Html$Lazy$lazy = $elm$virtual_dom$VirtualDom$lazy; +var $elm$browser$Debugger$Main$toHistoryPercents = function (layout) { + if (layout.$ === 'Horizontal') { + var x = layout.b; + return _Utils_Tuple2( + $elm$browser$Debugger$Main$toPercent(x), + '100%'); + } else { + var y = layout.c; + return _Utils_Tuple2( + '100%', + $elm$browser$Debugger$Main$toPercent(1 - y)); + } +}; +var $elm$virtual_dom$VirtualDom$lazy3 = _VirtualDom_lazy3; +var $elm$html$Html$Lazy$lazy3 = $elm$virtual_dom$VirtualDom$lazy3; +var $elm$html$Html$Attributes$class = $elm$html$Html$Attributes$stringProperty('className'); +var $elm$browser$Debugger$History$idForMessageIndex = function (index) { + return 'msg-' + $elm$core$String$fromInt(index); +}; +var $elm$html$Html$Attributes$title = $elm$html$Html$Attributes$stringProperty('title'); +var $elm$browser$Debugger$History$viewMessage = F3( + function (currentIndex, index, msg) { + var messageName = _Debugger_messageToString(msg); + var className = _Utils_eq(currentIndex, index) ? 'elm-debugger-entry elm-debugger-entry-selected' : 'elm-debugger-entry'; + return A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$id( + $elm$browser$Debugger$History$idForMessageIndex(index)), + $elm$html$Html$Attributes$class(className), + $elm$html$Html$Events$onClick(index) + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$span, + _List_fromArray( + [ + $elm$html$Html$Attributes$title(messageName), + $elm$html$Html$Attributes$class('elm-debugger-entry-content') + ]), + _List_fromArray( + [ + $elm$html$Html$text(messageName) + ])), + A2( + $elm$html$Html$span, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('elm-debugger-entry-index') + ]), + _List_fromArray( + [ + $elm$html$Html$text( + $elm$core$String$fromInt(index)) + ])) + ])); + }); +var $elm$browser$Debugger$History$consMsg = F3( + function (currentIndex, msg, _v0) { + var index = _v0.a; + var rest = _v0.b; + return _Utils_Tuple2( + index + 1, + A2( + $elm$core$List$cons, + _Utils_Tuple2( + $elm$core$String$fromInt(index), + A4($elm$html$Html$Lazy$lazy3, $elm$browser$Debugger$History$viewMessage, currentIndex, index, msg)), + rest)); + }); +var $elm$core$Array$length = function (_v0) { + var len = _v0.a; + return len; +}; +var $elm$core$Basics$neq = _Utils_notEqual; +var $elm$virtual_dom$VirtualDom$keyedNode = function (tag) { + return _VirtualDom_keyedNode( + _VirtualDom_noScript(tag)); +}; +var $elm$html$Html$Keyed$node = $elm$virtual_dom$VirtualDom$keyedNode; +var $elm$browser$Debugger$History$maxSnapshotSize = 31; +var $elm$browser$Debugger$History$showMoreButton = function (numMessages) { + var nextIndex = (numMessages - 1) - ($elm$browser$Debugger$History$maxSnapshotSize * 2); + var labelText = 'View more messages'; + return A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('elm-debugger-entry'), + $elm$html$Html$Events$onClick(nextIndex) + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$span, + _List_fromArray( + [ + $elm$html$Html$Attributes$title(labelText), + $elm$html$Html$Attributes$class('elm-debugger-entry-content') + ]), + _List_fromArray( + [ + $elm$html$Html$text(labelText) + ])), + A2( + $elm$html$Html$span, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('elm-debugger-entry-index') + ]), + _List_Nil) + ])); +}; +var $elm$browser$Debugger$History$styles = A3( + $elm$html$Html$node, + 'style', + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text('\n\n.elm-debugger-entry {\n cursor: pointer;\n width: 100%;\n box-sizing: border-box;\n padding: 8px;\n}\n\n.elm-debugger-entry:hover {\n background-color: rgb(41, 41, 41);\n}\n\n.elm-debugger-entry-selected, .elm-debugger-entry-selected:hover {\n background-color: rgb(10, 10, 10);\n}\n\n.elm-debugger-entry-content {\n width: calc(100% - 40px);\n padding: 0 5px;\n box-sizing: border-box;\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n display: inline-block;\n}\n\n.elm-debugger-entry-index {\n color: #666;\n width: 40px;\n text-align: right;\n display: block;\n float: right;\n}\n\n') + ])); +var $elm$core$Basics$ge = _Utils_ge; +var $elm$browser$Debugger$History$viewSnapshot = F3( + function (selectedIndex, index, _v0) { + var messages = _v0.messages; + return A3( + $elm$html$Html$Keyed$node, + 'div', + _List_Nil, + A3( + $elm$core$Array$foldr, + $elm$browser$Debugger$History$consMsg(selectedIndex), + _Utils_Tuple2(index, _List_Nil), + messages).b); + }); +var $elm$browser$Debugger$History$consSnapshot = F3( + function (selectedIndex, snapshot, _v0) { + var index = _v0.a; + var rest = _v0.b; + var nextIndex = index + $elm$core$Array$length(snapshot.messages); + var selectedIndexHelp = ((_Utils_cmp(nextIndex, selectedIndex) > 0) && (_Utils_cmp(selectedIndex, index) > -1)) ? selectedIndex : (-1); + return _Utils_Tuple2( + nextIndex, + A2( + $elm$core$List$cons, + A4($elm$html$Html$Lazy$lazy3, $elm$browser$Debugger$History$viewSnapshot, selectedIndexHelp, index, snapshot), + rest)); + }); +var $elm$core$Elm$JsArray$foldl = _JsArray_foldl; +var $elm$core$Array$foldl = F3( + function (func, baseCase, _v0) { + var tree = _v0.c; + var tail = _v0.d; + var helper = F2( + function (node, acc) { + if (node.$ === 'SubTree') { + var subTree = node.a; + return A3($elm$core$Elm$JsArray$foldl, helper, acc, subTree); + } else { + var values = node.a; + return A3($elm$core$Elm$JsArray$foldl, func, acc, values); + } + }); + return A3( + $elm$core$Elm$JsArray$foldl, + func, + A3($elm$core$Elm$JsArray$foldl, helper, baseCase, tree), + tail); + }); +var $elm$browser$Debugger$History$viewAllSnapshots = F3( + function (selectedIndex, startIndex, snapshots) { + return A2( + $elm$html$Html$div, + _List_Nil, + A3( + $elm$core$Array$foldl, + $elm$browser$Debugger$History$consSnapshot(selectedIndex), + _Utils_Tuple2(startIndex, _List_Nil), + snapshots).b); + }); +var $elm$core$Array$fromListHelp = F3( + function (list, nodeList, nodeListSize) { + fromListHelp: + while (true) { + var _v0 = A2($elm$core$Elm$JsArray$initializeFromList, $elm$core$Array$branchFactor, list); + var jsArray = _v0.a; + var remainingItems = _v0.b; + if (_Utils_cmp( + $elm$core$Elm$JsArray$length(jsArray), + $elm$core$Array$branchFactor) < 0) { + return A2( + $elm$core$Array$builderToArray, + true, + {nodeList: nodeList, nodeListSize: nodeListSize, tail: jsArray}); + } else { + var $temp$list = remainingItems, + $temp$nodeList = A2( + $elm$core$List$cons, + $elm$core$Array$Leaf(jsArray), + nodeList), + $temp$nodeListSize = nodeListSize + 1; + list = $temp$list; + nodeList = $temp$nodeList; + nodeListSize = $temp$nodeListSize; + continue fromListHelp; + } + } + }); +var $elm$core$Array$fromList = function (list) { + if (!list.b) { + return $elm$core$Array$empty; + } else { + return A3($elm$core$Array$fromListHelp, list, _List_Nil, 0); + } +}; +var $elm$core$Bitwise$and = _Bitwise_and; +var $elm$core$Bitwise$shiftRightZfBy = _Bitwise_shiftRightZfBy; +var $elm$core$Array$bitMask = 4294967295 >>> (32 - $elm$core$Array$shiftStep); +var $elm$core$Elm$JsArray$unsafeGet = _JsArray_unsafeGet; +var $elm$core$Array$getHelp = F3( + function (shift, index, tree) { + getHelp: + while (true) { + var pos = $elm$core$Array$bitMask & (index >>> shift); + var _v0 = A2($elm$core$Elm$JsArray$unsafeGet, pos, tree); + if (_v0.$ === 'SubTree') { + var subTree = _v0.a; + var $temp$shift = shift - $elm$core$Array$shiftStep, + $temp$index = index, + $temp$tree = subTree; + shift = $temp$shift; + index = $temp$index; + tree = $temp$tree; + continue getHelp; + } else { + var values = _v0.a; + return A2($elm$core$Elm$JsArray$unsafeGet, $elm$core$Array$bitMask & index, values); + } + } + }); +var $elm$core$Bitwise$shiftLeftBy = _Bitwise_shiftLeftBy; +var $elm$core$Array$tailIndex = function (len) { + return (len >>> 5) << 5; +}; +var $elm$core$Array$get = F2( + function (index, _v0) { + var len = _v0.a; + var startShift = _v0.b; + var tree = _v0.c; + var tail = _v0.d; + return ((index < 0) || (_Utils_cmp(index, len) > -1)) ? $elm$core$Maybe$Nothing : ((_Utils_cmp( + index, + $elm$core$Array$tailIndex(len)) > -1) ? $elm$core$Maybe$Just( + A2($elm$core$Elm$JsArray$unsafeGet, $elm$core$Array$bitMask & index, tail)) : $elm$core$Maybe$Just( + A3($elm$core$Array$getHelp, startShift, index, tree))); + }); +var $elm$core$Elm$JsArray$appendN = _JsArray_appendN; +var $elm$core$Elm$JsArray$slice = _JsArray_slice; +var $elm$core$Array$appendHelpBuilder = F2( + function (tail, builder) { + var tailLen = $elm$core$Elm$JsArray$length(tail); + var notAppended = ($elm$core$Array$branchFactor - $elm$core$Elm$JsArray$length(builder.tail)) - tailLen; + var appended = A3($elm$core$Elm$JsArray$appendN, $elm$core$Array$branchFactor, builder.tail, tail); + return (notAppended < 0) ? { + nodeList: A2( + $elm$core$List$cons, + $elm$core$Array$Leaf(appended), + builder.nodeList), + nodeListSize: builder.nodeListSize + 1, + tail: A3($elm$core$Elm$JsArray$slice, notAppended, tailLen, tail) + } : ((!notAppended) ? { + nodeList: A2( + $elm$core$List$cons, + $elm$core$Array$Leaf(appended), + builder.nodeList), + nodeListSize: builder.nodeListSize + 1, + tail: $elm$core$Elm$JsArray$empty + } : {nodeList: builder.nodeList, nodeListSize: builder.nodeListSize, tail: appended}); + }); +var $elm$core$List$drop = F2( + function (n, list) { + drop: + while (true) { + if (n <= 0) { + return list; + } else { + if (!list.b) { + return list; + } else { + var x = list.a; + var xs = list.b; + var $temp$n = n - 1, + $temp$list = xs; + n = $temp$n; + list = $temp$list; + continue drop; + } + } + } + }); +var $elm$core$Array$sliceLeft = F2( + function (from, array) { + var len = array.a; + var tree = array.c; + var tail = array.d; + if (!from) { + return array; + } else { + if (_Utils_cmp( + from, + $elm$core$Array$tailIndex(len)) > -1) { + return A4( + $elm$core$Array$Array_elm_builtin, + len - from, + $elm$core$Array$shiftStep, + $elm$core$Elm$JsArray$empty, + A3( + $elm$core$Elm$JsArray$slice, + from - $elm$core$Array$tailIndex(len), + $elm$core$Elm$JsArray$length(tail), + tail)); + } else { + var skipNodes = (from / $elm$core$Array$branchFactor) | 0; + var helper = F2( + function (node, acc) { + if (node.$ === 'SubTree') { + var subTree = node.a; + return A3($elm$core$Elm$JsArray$foldr, helper, acc, subTree); + } else { + var leaf = node.a; + return A2($elm$core$List$cons, leaf, acc); + } + }); + var leafNodes = A3( + $elm$core$Elm$JsArray$foldr, + helper, + _List_fromArray( + [tail]), + tree); + var nodesToInsert = A2($elm$core$List$drop, skipNodes, leafNodes); + if (!nodesToInsert.b) { + return $elm$core$Array$empty; + } else { + var head = nodesToInsert.a; + var rest = nodesToInsert.b; + var firstSlice = from - (skipNodes * $elm$core$Array$branchFactor); + var initialBuilder = { + nodeList: _List_Nil, + nodeListSize: 0, + tail: A3( + $elm$core$Elm$JsArray$slice, + firstSlice, + $elm$core$Elm$JsArray$length(head), + head) + }; + return A2( + $elm$core$Array$builderToArray, + true, + A3($elm$core$List$foldl, $elm$core$Array$appendHelpBuilder, initialBuilder, rest)); + } + } + } + }); +var $elm$core$Array$fetchNewTail = F4( + function (shift, end, treeEnd, tree) { + fetchNewTail: + while (true) { + var pos = $elm$core$Array$bitMask & (treeEnd >>> shift); + var _v0 = A2($elm$core$Elm$JsArray$unsafeGet, pos, tree); + if (_v0.$ === 'SubTree') { + var sub = _v0.a; + var $temp$shift = shift - $elm$core$Array$shiftStep, + $temp$end = end, + $temp$treeEnd = treeEnd, + $temp$tree = sub; + shift = $temp$shift; + end = $temp$end; + treeEnd = $temp$treeEnd; + tree = $temp$tree; + continue fetchNewTail; + } else { + var values = _v0.a; + return A3($elm$core$Elm$JsArray$slice, 0, $elm$core$Array$bitMask & end, values); + } + } + }); +var $elm$core$Array$hoistTree = F3( + function (oldShift, newShift, tree) { + hoistTree: + while (true) { + if ((_Utils_cmp(oldShift, newShift) < 1) || (!$elm$core$Elm$JsArray$length(tree))) { + return tree; + } else { + var _v0 = A2($elm$core$Elm$JsArray$unsafeGet, 0, tree); + if (_v0.$ === 'SubTree') { + var sub = _v0.a; + var $temp$oldShift = oldShift - $elm$core$Array$shiftStep, + $temp$newShift = newShift, + $temp$tree = sub; + oldShift = $temp$oldShift; + newShift = $temp$newShift; + tree = $temp$tree; + continue hoistTree; + } else { + return tree; + } + } + } + }); +var $elm$core$Elm$JsArray$unsafeSet = _JsArray_unsafeSet; +var $elm$core$Array$sliceTree = F3( + function (shift, endIdx, tree) { + var lastPos = $elm$core$Array$bitMask & (endIdx >>> shift); + var _v0 = A2($elm$core$Elm$JsArray$unsafeGet, lastPos, tree); + if (_v0.$ === 'SubTree') { + var sub = _v0.a; + var newSub = A3($elm$core$Array$sliceTree, shift - $elm$core$Array$shiftStep, endIdx, sub); + return (!$elm$core$Elm$JsArray$length(newSub)) ? A3($elm$core$Elm$JsArray$slice, 0, lastPos, tree) : A3( + $elm$core$Elm$JsArray$unsafeSet, + lastPos, + $elm$core$Array$SubTree(newSub), + A3($elm$core$Elm$JsArray$slice, 0, lastPos + 1, tree)); + } else { + return A3($elm$core$Elm$JsArray$slice, 0, lastPos, tree); + } + }); +var $elm$core$Array$sliceRight = F2( + function (end, array) { + var len = array.a; + var startShift = array.b; + var tree = array.c; + var tail = array.d; + if (_Utils_eq(end, len)) { + return array; + } else { + if (_Utils_cmp( + end, + $elm$core$Array$tailIndex(len)) > -1) { + return A4( + $elm$core$Array$Array_elm_builtin, + end, + startShift, + tree, + A3($elm$core$Elm$JsArray$slice, 0, $elm$core$Array$bitMask & end, tail)); + } else { + var endIdx = $elm$core$Array$tailIndex(end); + var depth = $elm$core$Basics$floor( + A2( + $elm$core$Basics$logBase, + $elm$core$Array$branchFactor, + A2($elm$core$Basics$max, 1, endIdx - 1))); + var newShift = A2($elm$core$Basics$max, 5, depth * $elm$core$Array$shiftStep); + return A4( + $elm$core$Array$Array_elm_builtin, + end, + newShift, + A3( + $elm$core$Array$hoistTree, + startShift, + newShift, + A3($elm$core$Array$sliceTree, startShift, endIdx, tree)), + A4($elm$core$Array$fetchNewTail, startShift, end, endIdx, tree)); + } + } + }); +var $elm$core$Array$translateIndex = F2( + function (index, _v0) { + var len = _v0.a; + var posIndex = (index < 0) ? (len + index) : index; + return (posIndex < 0) ? 0 : ((_Utils_cmp(posIndex, len) > 0) ? len : posIndex); + }); +var $elm$core$Array$slice = F3( + function (from, to, array) { + var correctTo = A2($elm$core$Array$translateIndex, to, array); + var correctFrom = A2($elm$core$Array$translateIndex, from, array); + return (_Utils_cmp(correctFrom, correctTo) > 0) ? $elm$core$Array$empty : A2( + $elm$core$Array$sliceLeft, + correctFrom, + A2($elm$core$Array$sliceRight, correctTo, array)); + }); +var $elm$browser$Debugger$History$viewRecentSnapshots = F3( + function (selectedIndex, recentMessagesNum, snapshots) { + var messagesToFill = $elm$browser$Debugger$History$maxSnapshotSize - recentMessagesNum; + var arrayLength = $elm$core$Array$length(snapshots); + var snapshotsToRender = function () { + var _v0 = _Utils_Tuple2( + A2($elm$core$Array$get, arrayLength - 2, snapshots), + A2($elm$core$Array$get, arrayLength - 1, snapshots)); + if ((_v0.a.$ === 'Just') && (_v0.b.$ === 'Just')) { + var fillerSnapshot = _v0.a.a; + var recentSnapshot = _v0.b.a; + return $elm$core$Array$fromList( + _List_fromArray( + [ + { + messages: A3($elm$core$Array$slice, 0, messagesToFill, fillerSnapshot.messages), + model: fillerSnapshot.model + }, + recentSnapshot + ])); + } else { + return snapshots; + } + }(); + var startingIndex = ((arrayLength * $elm$browser$Debugger$History$maxSnapshotSize) - $elm$browser$Debugger$History$maxSnapshotSize) - messagesToFill; + return A3($elm$browser$Debugger$History$viewAllSnapshots, selectedIndex, startingIndex, snapshotsToRender); + }); +var $elm$browser$Debugger$History$view = F2( + function (maybeIndex, _v0) { + var snapshots = _v0.snapshots; + var recent = _v0.recent; + var numMessages = _v0.numMessages; + var recentMessageStartIndex = numMessages - recent.numMessages; + var index = A2($elm$core$Maybe$withDefault, -1, maybeIndex); + var newStuff = A3( + $elm$html$Html$Keyed$node, + 'div', + _List_Nil, + A3( + $elm$core$List$foldr, + $elm$browser$Debugger$History$consMsg(index), + _Utils_Tuple2(recentMessageStartIndex, _List_Nil), + recent.messages).b); + var onlyRenderRecentMessages = (!_Utils_eq(index, -1)) || ($elm$core$Array$length(snapshots) < 2); + var oldStuff = onlyRenderRecentMessages ? A4($elm$html$Html$Lazy$lazy3, $elm$browser$Debugger$History$viewAllSnapshots, index, 0, snapshots) : A4($elm$html$Html$Lazy$lazy3, $elm$browser$Debugger$History$viewRecentSnapshots, index, recent.numMessages, snapshots); + return A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$id('elm-debugger-sidebar'), + A2($elm$html$Html$Attributes$style, 'width', '100%'), + A2($elm$html$Html$Attributes$style, 'overflow-y', 'auto'), + A2($elm$html$Html$Attributes$style, 'height', 'calc(100% - 72px)') + ]), + A2( + $elm$core$List$cons, + $elm$browser$Debugger$History$styles, + A2( + $elm$core$List$cons, + newStuff, + A2( + $elm$core$List$cons, + oldStuff, + onlyRenderRecentMessages ? _List_Nil : _List_fromArray( + [ + $elm$browser$Debugger$History$showMoreButton(numMessages) + ]))))); + }); +var $elm$browser$Debugger$Main$SwapLayout = {$: 'SwapLayout'}; +var $elm$browser$Debugger$Main$toHistoryIcon = function (layout) { + if (layout.$ === 'Horizontal') { + return 'M13 1a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3h-10a3 3 0 0 1-3-3v-8a3 3 0 0 1 3-3z M13 3h-10a1 1 0 0 0-1 1v5h12v-5a1 1 0 0 0-1-1z M14 10h-12v2a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1z'; + } else { + return 'M0 4a3 3 0 0 1 3-3h10a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3h-10a3 3 0 0 1-3-3z M2 4v8a1 1 0 0 0 1 1h2v-10h-2a1 1 0 0 0-1 1z M6 3v10h7a1 1 0 0 0 1-1v-8a1 1 0 0 0-1-1z'; + } +}; +var $elm$browser$Debugger$Main$icon = function (path) { + return A4( + $elm$virtual_dom$VirtualDom$nodeNS, + 'http://www.w3.org/2000/svg', + 'svg', + _List_fromArray( + [ + A2($elm$virtual_dom$VirtualDom$attribute, 'viewBox', '0 0 16 16'), + A2($elm$virtual_dom$VirtualDom$attribute, 'xmlns', 'http://www.w3.org/2000/svg'), + A2($elm$virtual_dom$VirtualDom$attribute, 'fill', 'currentColor'), + A2($elm$virtual_dom$VirtualDom$attribute, 'width', '16px'), + A2($elm$virtual_dom$VirtualDom$attribute, 'height', '16px') + ]), + _List_fromArray( + [ + A4( + $elm$virtual_dom$VirtualDom$nodeNS, + 'http://www.w3.org/2000/svg', + 'path', + _List_fromArray( + [ + A2($elm$virtual_dom$VirtualDom$attribute, 'd', path) + ]), + _List_Nil) + ])); +}; +var $elm$browser$Debugger$Main$viewHistoryButton = F3( + function (label, msg, path) { + return A2( + $elm$html$Html$button, + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'display', 'flex'), + A2($elm$html$Html$Attributes$style, 'flex-direction', 'row'), + A2($elm$html$Html$Attributes$style, 'align-items', 'center'), + A2($elm$html$Html$Attributes$style, 'background', 'none'), + A2($elm$html$Html$Attributes$style, 'border', 'none'), + A2($elm$html$Html$Attributes$style, 'color', 'inherit'), + A2($elm$html$Html$Attributes$style, 'cursor', 'pointer'), + $elm$html$Html$Events$onClick(msg) + ]), + _List_fromArray( + [ + $elm$browser$Debugger$Main$icon(path), + A2( + $elm$html$Html$span, + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'padding-left', '6px') + ]), + _List_fromArray( + [ + $elm$html$Html$text(label) + ])) + ])); + }); +var $elm$browser$Debugger$Main$viewHistoryOptions = function (layout) { + return A2( + $elm$html$Html$div, + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'width', '100%'), + A2($elm$html$Html$Attributes$style, 'height', '36px'), + A2($elm$html$Html$Attributes$style, 'display', 'flex'), + A2($elm$html$Html$Attributes$style, 'flex-direction', 'row'), + A2($elm$html$Html$Attributes$style, 'align-items', 'center'), + A2($elm$html$Html$Attributes$style, 'justify-content', 'space-between'), + A2($elm$html$Html$Attributes$style, 'background-color', 'rgb(50, 50, 50)') + ]), + _List_fromArray( + [ + A3( + $elm$browser$Debugger$Main$viewHistoryButton, + 'Swap Layout', + $elm$browser$Debugger$Main$SwapLayout, + $elm$browser$Debugger$Main$toHistoryIcon(layout)), + A2( + $elm$html$Html$div, + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'display', 'flex'), + A2($elm$html$Html$Attributes$style, 'flex-direction', 'row'), + A2($elm$html$Html$Attributes$style, 'align-items', 'center'), + A2($elm$html$Html$Attributes$style, 'justify-content', 'space-between') + ]), + _List_fromArray( + [ + A3($elm$browser$Debugger$Main$viewHistoryButton, 'Import', $elm$browser$Debugger$Main$Import, 'M5 1a1 1 0 0 1 0 2h-2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1a1 1 0 0 1 2 0a3 3 0 0 1-3 3h-10a3 3 0 0 1-3-3v-8a3 3 0 0 1 3-3z M10 2a1 1 0 0 0 -2 0v6a1 1 0 0 0 1 1h6a1 1 0 0 0 0-2h-3.586l4.293-4.293a1 1 0 0 0-1.414-1.414l-4.293 4.293z'), + A3($elm$browser$Debugger$Main$viewHistoryButton, 'Export', $elm$browser$Debugger$Main$Export, 'M5 1a1 1 0 0 1 0 2h-2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1 a1 1 0 0 1 2 0a3 3 0 0 1-3 3h-10a3 3 0 0 1-3-3v-8a3 3 0 0 1 3-3z M9 3a1 1 0 1 1 0-2h6a1 1 0 0 1 1 1v6a1 1 0 1 1-2 0v-3.586l-5.293 5.293 a1 1 0 0 1-1.414-1.414l5.293 -5.293z') + ])) + ])); +}; +var $elm$browser$Debugger$Main$SliderJump = function (a) { + return {$: 'SliderJump', a: a}; +}; +var $elm$core$Basics$composeR = F3( + function (f, g, x) { + return g( + f(x)); + }); +var $elm$html$Html$input = _VirtualDom_node('input'); +var $elm$browser$Debugger$Main$isPlaying = function (maybeIndex) { + if (maybeIndex.$ === 'Nothing') { + return true; + } else { + return false; + } +}; +var $elm$html$Html$Attributes$max = $elm$html$Html$Attributes$stringProperty('max'); +var $elm$html$Html$Attributes$min = $elm$html$Html$Attributes$stringProperty('min'); +var $elm$html$Html$Events$alwaysStop = function (x) { + return _Utils_Tuple2(x, true); +}; +var $elm$virtual_dom$VirtualDom$MayStopPropagation = function (a) { + return {$: 'MayStopPropagation', a: a}; +}; +var $elm$html$Html$Events$stopPropagationOn = F2( + function (event, decoder) { + return A2( + $elm$virtual_dom$VirtualDom$on, + event, + $elm$virtual_dom$VirtualDom$MayStopPropagation(decoder)); + }); +var $elm$json$Json$Decode$string = _Json_decodeString; +var $elm$html$Html$Events$targetValue = A2( + $elm$json$Json$Decode$at, + _List_fromArray( + ['target', 'value']), + $elm$json$Json$Decode$string); +var $elm$html$Html$Events$onInput = function (tagger) { + return A2( + $elm$html$Html$Events$stopPropagationOn, + 'input', + A2( + $elm$json$Json$Decode$map, + $elm$html$Html$Events$alwaysStop, + A2($elm$json$Json$Decode$map, tagger, $elm$html$Html$Events$targetValue))); +}; +var $elm$core$String$toInt = _String_toInt; +var $elm$html$Html$Attributes$type_ = $elm$html$Html$Attributes$stringProperty('type'); +var $elm$html$Html$Attributes$value = $elm$html$Html$Attributes$stringProperty('value'); +var $elm$browser$Debugger$Main$viewPlayButton = function (playing) { + return A2( + $elm$html$Html$button, + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'background', '#1293D8'), + A2($elm$html$Html$Attributes$style, 'border', 'none'), + A2($elm$html$Html$Attributes$style, 'color', 'white'), + A2($elm$html$Html$Attributes$style, 'cursor', 'pointer'), + A2($elm$html$Html$Attributes$style, 'width', '36px'), + A2($elm$html$Html$Attributes$style, 'height', '36px'), + $elm$html$Html$Events$onClick($elm$browser$Debugger$Main$Resume) + ]), + _List_fromArray( + [ + playing ? $elm$browser$Debugger$Main$icon('M2 2h4v12h-4v-12z M10 2h4v12h-4v-12z') : $elm$browser$Debugger$Main$icon('M2 2l12 7l-12 7z') + ])); +}; +var $elm$browser$Debugger$Main$viewHistorySlider = F2( + function (history, maybeIndex) { + var lastIndex = $elm$browser$Debugger$History$size(history) - 1; + var selectedIndex = A2($elm$core$Maybe$withDefault, lastIndex, maybeIndex); + return A2( + $elm$html$Html$div, + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'display', 'flex'), + A2($elm$html$Html$Attributes$style, 'flex-direction', 'row'), + A2($elm$html$Html$Attributes$style, 'align-items', 'center'), + A2($elm$html$Html$Attributes$style, 'width', '100%'), + A2($elm$html$Html$Attributes$style, 'height', '36px'), + A2($elm$html$Html$Attributes$style, 'background-color', 'rgb(50, 50, 50)') + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$Lazy$lazy, + $elm$browser$Debugger$Main$viewPlayButton, + $elm$browser$Debugger$Main$isPlaying(maybeIndex)), + A2( + $elm$html$Html$input, + _List_fromArray( + [ + $elm$html$Html$Attributes$type_('range'), + A2($elm$html$Html$Attributes$style, 'width', 'calc(100% - 56px)'), + A2($elm$html$Html$Attributes$style, 'height', '36px'), + A2($elm$html$Html$Attributes$style, 'margin', '0 10px'), + $elm$html$Html$Attributes$min('0'), + $elm$html$Html$Attributes$max( + $elm$core$String$fromInt(lastIndex)), + $elm$html$Html$Attributes$value( + $elm$core$String$fromInt(selectedIndex)), + $elm$html$Html$Events$onInput( + A2( + $elm$core$Basics$composeR, + $elm$core$String$toInt, + A2( + $elm$core$Basics$composeR, + $elm$core$Maybe$withDefault(lastIndex), + $elm$browser$Debugger$Main$SliderJump))) + ]), + _List_Nil) + ])); + }); +var $elm$browser$Debugger$Main$viewHistory = F3( + function (maybeIndex, history, layout) { + var block = $elm$browser$Debugger$Main$toMouseBlocker(layout); + var _v0 = $elm$browser$Debugger$Main$toHistoryPercents(layout); + var w = _v0.a; + var h = _v0.b; + return A2( + $elm$html$Html$div, + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'width', w), + A2($elm$html$Html$Attributes$style, 'height', h), + A2($elm$html$Html$Attributes$style, 'display', 'flex'), + A2($elm$html$Html$Attributes$style, 'flex-direction', 'column'), + A2($elm$html$Html$Attributes$style, 'color', '#DDDDDD'), + A2($elm$html$Html$Attributes$style, 'background-color', 'rgb(61, 61, 61)'), + A2($elm$html$Html$Attributes$style, 'pointer-events', block), + A2($elm$html$Html$Attributes$style, 'user-select', block) + ]), + _List_fromArray( + [ + A2($elm$browser$Debugger$Main$viewHistorySlider, history, maybeIndex), + A2( + $elm$html$Html$map, + $elm$browser$Debugger$Main$Jump, + A2($elm$browser$Debugger$History$view, maybeIndex, history)), + A2($elm$html$Html$Lazy$lazy, $elm$browser$Debugger$Main$viewHistoryOptions, layout) + ])); + }); +var $elm$browser$Debugger$Main$popoutView = function (model) { + var maybeIndex = function () { + var _v0 = model.state; + if (_v0.$ === 'Running') { + return $elm$core$Maybe$Nothing; + } else { + var index = _v0.a; + return $elm$core$Maybe$Just(index); + } + }(); + var historyToRender = $elm$browser$Debugger$Main$cachedHistory(model); + return A3( + $elm$html$Html$node, + 'body', + _Utils_ap( + $elm$browser$Debugger$Main$toDragListeners(model.layout), + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'margin', '0'), + A2($elm$html$Html$Attributes$style, 'padding', '0'), + A2($elm$html$Html$Attributes$style, 'width', '100%'), + A2($elm$html$Html$Attributes$style, 'height', '100%'), + A2($elm$html$Html$Attributes$style, 'font-family', 'monospace'), + A2($elm$html$Html$Attributes$style, 'display', 'flex'), + A2( + $elm$html$Html$Attributes$style, + 'flex-direction', + $elm$browser$Debugger$Main$toFlexDirection(model.layout)) + ])), + _List_fromArray( + [ + A3($elm$browser$Debugger$Main$viewHistory, maybeIndex, historyToRender, model.layout), + $elm$browser$Debugger$Main$viewDragZone(model.layout), + A3($elm$browser$Debugger$Main$viewExpando, model.expandoMsg, model.expandoModel, model.layout) + ])); +}; +var $elm$browser$Debugger$Overlay$BlockAll = {$: 'BlockAll'}; +var $elm$browser$Debugger$Overlay$toBlockerType = F2( + function (isPaused, state) { + switch (state.$) { + case 'None': + return isPaused ? $elm$browser$Debugger$Overlay$BlockAll : $elm$browser$Debugger$Overlay$BlockNone; + case 'BadMetadata': + return $elm$browser$Debugger$Overlay$BlockMost; + case 'BadImport': + return $elm$browser$Debugger$Overlay$BlockMost; + default: + return $elm$browser$Debugger$Overlay$BlockMost; + } + }); +var $elm$browser$Debugger$Main$toBlockerType = function (model) { + return A2( + $elm$browser$Debugger$Overlay$toBlockerType, + $elm$browser$Debugger$Main$isPaused(model.state), + model.overlay); +}; +var $elm$browser$Debugger$Main$Horizontal = F3( + function (a, b, c) { + return {$: 'Horizontal', a: a, b: b, c: c}; + }); +var $elm$browser$Debugger$Main$Running = function (a) { + return {$: 'Running', a: a}; +}; +var $elm$browser$Debugger$Main$Static = {$: 'Static'}; +var $elm$browser$Debugger$Metadata$Error = F2( + function (message, problems) { + return {message: message, problems: problems}; + }); +var $elm$json$Json$Decode$decodeValue = _Json_run; +var $elm$browser$Debugger$Metadata$Metadata = F2( + function (versions, types) { + return {types: types, versions: versions}; + }); +var $elm$browser$Debugger$Metadata$Types = F3( + function (message, aliases, unions) { + return {aliases: aliases, message: message, unions: unions}; + }); +var $elm$browser$Debugger$Metadata$Alias = F2( + function (args, tipe) { + return {args: args, tipe: tipe}; + }); +var $elm$json$Json$Decode$list = _Json_decodeList; +var $elm$browser$Debugger$Metadata$decodeAlias = A3( + $elm$json$Json$Decode$map2, + $elm$browser$Debugger$Metadata$Alias, + A2( + $elm$json$Json$Decode$field, + 'args', + $elm$json$Json$Decode$list($elm$json$Json$Decode$string)), + A2($elm$json$Json$Decode$field, 'type', $elm$json$Json$Decode$string)); +var $elm$browser$Debugger$Metadata$Union = F2( + function (args, tags) { + return {args: args, tags: tags}; + }); +var $elm$core$Dict$fromList = function (assocs) { + return A3( + $elm$core$List$foldl, + F2( + function (_v0, dict) { + var key = _v0.a; + var value = _v0.b; + return A3($elm$core$Dict$insert, key, value, dict); + }), + $elm$core$Dict$empty, + assocs); +}; +var $elm$json$Json$Decode$keyValuePairs = _Json_decodeKeyValuePairs; +var $elm$json$Json$Decode$dict = function (decoder) { + return A2( + $elm$json$Json$Decode$map, + $elm$core$Dict$fromList, + $elm$json$Json$Decode$keyValuePairs(decoder)); +}; +var $elm$browser$Debugger$Metadata$decodeUnion = A3( + $elm$json$Json$Decode$map2, + $elm$browser$Debugger$Metadata$Union, + A2( + $elm$json$Json$Decode$field, + 'args', + $elm$json$Json$Decode$list($elm$json$Json$Decode$string)), + A2( + $elm$json$Json$Decode$field, + 'tags', + $elm$json$Json$Decode$dict( + $elm$json$Json$Decode$list($elm$json$Json$Decode$string)))); +var $elm$json$Json$Decode$map3 = _Json_map3; +var $elm$browser$Debugger$Metadata$decodeTypes = A4( + $elm$json$Json$Decode$map3, + $elm$browser$Debugger$Metadata$Types, + A2($elm$json$Json$Decode$field, 'message', $elm$json$Json$Decode$string), + A2( + $elm$json$Json$Decode$field, + 'aliases', + $elm$json$Json$Decode$dict($elm$browser$Debugger$Metadata$decodeAlias)), + A2( + $elm$json$Json$Decode$field, + 'unions', + $elm$json$Json$Decode$dict($elm$browser$Debugger$Metadata$decodeUnion))); +var $elm$browser$Debugger$Metadata$Versions = function (elm) { + return {elm: elm}; +}; +var $elm$browser$Debugger$Metadata$decodeVersions = A2( + $elm$json$Json$Decode$map, + $elm$browser$Debugger$Metadata$Versions, + A2($elm$json$Json$Decode$field, 'elm', $elm$json$Json$Decode$string)); +var $elm$browser$Debugger$Metadata$decoder = A3( + $elm$json$Json$Decode$map2, + $elm$browser$Debugger$Metadata$Metadata, + A2($elm$json$Json$Decode$field, 'versions', $elm$browser$Debugger$Metadata$decodeVersions), + A2($elm$json$Json$Decode$field, 'types', $elm$browser$Debugger$Metadata$decodeTypes)); +var $elm$browser$Debugger$Metadata$ProblemType = F2( + function (name, problems) { + return {name: name, problems: problems}; + }); +var $elm$core$List$maybeCons = F3( + function (f, mx, xs) { + var _v0 = f(mx); + if (_v0.$ === 'Just') { + var x = _v0.a; + return A2($elm$core$List$cons, x, xs); + } else { + return xs; + } + }); +var $elm$core$List$filterMap = F2( + function (f, xs) { + return A3( + $elm$core$List$foldr, + $elm$core$List$maybeCons(f), + _List_Nil, + xs); + }); +var $elm$core$String$contains = _String_contains; +var $elm$browser$Debugger$Metadata$hasProblem = F2( + function (tipe, _v0) { + var problem = _v0.a; + var token = _v0.b; + return A2($elm$core$String$contains, token, tipe) ? $elm$core$Maybe$Just(problem) : $elm$core$Maybe$Nothing; + }); +var $elm$browser$Debugger$Metadata$Decoder = {$: 'Decoder'}; +var $elm$browser$Debugger$Metadata$Function = {$: 'Function'}; +var $elm$browser$Debugger$Metadata$Process = {$: 'Process'}; +var $elm$browser$Debugger$Metadata$Program = {$: 'Program'}; +var $elm$browser$Debugger$Metadata$Request = {$: 'Request'}; +var $elm$browser$Debugger$Metadata$Socket = {$: 'Socket'}; +var $elm$browser$Debugger$Metadata$Task = {$: 'Task'}; +var $elm$browser$Debugger$Metadata$VirtualDom = {$: 'VirtualDom'}; +var $elm$browser$Debugger$Metadata$problemTable = _List_fromArray( + [ + _Utils_Tuple2($elm$browser$Debugger$Metadata$Function, '->'), + _Utils_Tuple2($elm$browser$Debugger$Metadata$Decoder, 'Json.Decode.Decoder'), + _Utils_Tuple2($elm$browser$Debugger$Metadata$Task, 'Task.Task'), + _Utils_Tuple2($elm$browser$Debugger$Metadata$Process, 'Process.Id'), + _Utils_Tuple2($elm$browser$Debugger$Metadata$Socket, 'WebSocket.LowLevel.WebSocket'), + _Utils_Tuple2($elm$browser$Debugger$Metadata$Request, 'Http.Request'), + _Utils_Tuple2($elm$browser$Debugger$Metadata$Program, 'Platform.Program'), + _Utils_Tuple2($elm$browser$Debugger$Metadata$VirtualDom, 'VirtualDom.Node'), + _Utils_Tuple2($elm$browser$Debugger$Metadata$VirtualDom, 'VirtualDom.Attribute') + ]); +var $elm$browser$Debugger$Metadata$findProblems = function (tipe) { + return A2( + $elm$core$List$filterMap, + $elm$browser$Debugger$Metadata$hasProblem(tipe), + $elm$browser$Debugger$Metadata$problemTable); +}; +var $elm$browser$Debugger$Metadata$collectBadAliases = F3( + function (name, _v0, list) { + var tipe = _v0.tipe; + var _v1 = $elm$browser$Debugger$Metadata$findProblems(tipe); + if (!_v1.b) { + return list; + } else { + var problems = _v1; + return A2( + $elm$core$List$cons, + A2($elm$browser$Debugger$Metadata$ProblemType, name, problems), + list); + } + }); +var $elm$core$List$append = F2( + function (xs, ys) { + if (!ys.b) { + return xs; + } else { + return A3($elm$core$List$foldr, $elm$core$List$cons, ys, xs); + } + }); +var $elm$core$List$concat = function (lists) { + return A3($elm$core$List$foldr, $elm$core$List$append, _List_Nil, lists); +}; +var $elm$core$List$concatMap = F2( + function (f, list) { + return $elm$core$List$concat( + A2($elm$core$List$map, f, list)); + }); +var $elm$core$Dict$values = function (dict) { + return A3( + $elm$core$Dict$foldr, + F3( + function (key, value, valueList) { + return A2($elm$core$List$cons, value, valueList); + }), + _List_Nil, + dict); +}; +var $elm$browser$Debugger$Metadata$collectBadUnions = F3( + function (name, _v0, list) { + var tags = _v0.tags; + var _v1 = A2( + $elm$core$List$concatMap, + $elm$browser$Debugger$Metadata$findProblems, + $elm$core$List$concat( + $elm$core$Dict$values(tags))); + if (!_v1.b) { + return list; + } else { + var problems = _v1; + return A2( + $elm$core$List$cons, + A2($elm$browser$Debugger$Metadata$ProblemType, name, problems), + list); + } + }); +var $elm$core$Dict$foldl = F3( + function (func, acc, dict) { + foldl: + while (true) { + if (dict.$ === 'RBEmpty_elm_builtin') { + return acc; + } else { + var key = dict.b; + var value = dict.c; + var left = dict.d; + var right = dict.e; + var $temp$func = func, + $temp$acc = A3( + func, + key, + value, + A3($elm$core$Dict$foldl, func, acc, left)), + $temp$dict = right; + func = $temp$func; + acc = $temp$acc; + dict = $temp$dict; + continue foldl; + } + } + }); +var $elm$browser$Debugger$Metadata$isPortable = function (_v0) { + var types = _v0.types; + var badAliases = A3($elm$core$Dict$foldl, $elm$browser$Debugger$Metadata$collectBadAliases, _List_Nil, types.aliases); + var _v1 = A3($elm$core$Dict$foldl, $elm$browser$Debugger$Metadata$collectBadUnions, badAliases, types.unions); + if (!_v1.b) { + return $elm$core$Maybe$Nothing; + } else { + var problems = _v1; + return $elm$core$Maybe$Just( + A2($elm$browser$Debugger$Metadata$Error, types.message, problems)); + } +}; +var $elm$browser$Debugger$Metadata$decode = function (value) { + var _v0 = A2($elm$json$Json$Decode$decodeValue, $elm$browser$Debugger$Metadata$decoder, value); + if (_v0.$ === 'Err') { + return $elm$core$Result$Err( + A2($elm$browser$Debugger$Metadata$Error, 'The compiler is generating bad metadata. This is a compiler bug!', _List_Nil)); + } else { + var metadata = _v0.a; + var _v1 = $elm$browser$Debugger$Metadata$isPortable(metadata); + if (_v1.$ === 'Nothing') { + return $elm$core$Result$Ok(metadata); + } else { + var error = _v1.a; + return $elm$core$Result$Err(error); + } + } +}; +var $elm$browser$Debugger$History$History = F3( + function (snapshots, recent, numMessages) { + return {numMessages: numMessages, recent: recent, snapshots: snapshots}; + }); +var $elm$browser$Debugger$History$RecentHistory = F3( + function (model, messages, numMessages) { + return {messages: messages, model: model, numMessages: numMessages}; + }); +var $elm$browser$Debugger$History$empty = function (model) { + return A3( + $elm$browser$Debugger$History$History, + $elm$core$Array$empty, + A3($elm$browser$Debugger$History$RecentHistory, model, _List_Nil, 0), + 0); +}; +var $elm$core$Dict$map = F2( + function (func, dict) { + if (dict.$ === 'RBEmpty_elm_builtin') { + return $elm$core$Dict$RBEmpty_elm_builtin; + } else { + var color = dict.a; + var key = dict.b; + var value = dict.c; + var left = dict.d; + var right = dict.e; + return A5( + $elm$core$Dict$RBNode_elm_builtin, + color, + key, + A2(func, key, value), + A2($elm$core$Dict$map, func, left), + A2($elm$core$Dict$map, func, right)); + } + }); +var $elm$core$Dict$sizeHelp = F2( + function (n, dict) { + sizeHelp: + while (true) { + if (dict.$ === 'RBEmpty_elm_builtin') { + return n; + } else { + var left = dict.d; + var right = dict.e; + var $temp$n = A2($elm$core$Dict$sizeHelp, n + 1, right), + $temp$dict = left; + n = $temp$n; + dict = $temp$dict; + continue sizeHelp; + } + } + }); +var $elm$core$Dict$size = function (dict) { + return A2($elm$core$Dict$sizeHelp, 0, dict); +}; +var $elm$browser$Debugger$Expando$initHelp = F2( + function (isOuter, expando) { + switch (expando.$) { + case 'S': + return expando; + case 'Primitive': + return expando; + case 'Sequence': + var seqType = expando.a; + var isClosed = expando.b; + var items = expando.c; + return isOuter ? A3( + $elm$browser$Debugger$Expando$Sequence, + seqType, + false, + A2( + $elm$core$List$map, + $elm$browser$Debugger$Expando$initHelp(false), + items)) : (($elm$core$List$length(items) <= 8) ? A3($elm$browser$Debugger$Expando$Sequence, seqType, false, items) : expando); + case 'Dictionary': + var isClosed = expando.a; + var keyValuePairs = expando.b; + return isOuter ? A2( + $elm$browser$Debugger$Expando$Dictionary, + false, + A2( + $elm$core$List$map, + function (_v1) { + var k = _v1.a; + var v = _v1.b; + return _Utils_Tuple2( + k, + A2($elm$browser$Debugger$Expando$initHelp, false, v)); + }, + keyValuePairs)) : (($elm$core$List$length(keyValuePairs) <= 8) ? A2($elm$browser$Debugger$Expando$Dictionary, false, keyValuePairs) : expando); + case 'Record': + var isClosed = expando.a; + var entries = expando.b; + return isOuter ? A2( + $elm$browser$Debugger$Expando$Record, + false, + A2( + $elm$core$Dict$map, + F2( + function (_v2, v) { + return A2($elm$browser$Debugger$Expando$initHelp, false, v); + }), + entries)) : (($elm$core$Dict$size(entries) <= 4) ? A2($elm$browser$Debugger$Expando$Record, false, entries) : expando); + default: + var maybeName = expando.a; + var isClosed = expando.b; + var args = expando.c; + return isOuter ? A3( + $elm$browser$Debugger$Expando$Constructor, + maybeName, + false, + A2( + $elm$core$List$map, + $elm$browser$Debugger$Expando$initHelp(false), + args)) : (($elm$core$List$length(args) <= 4) ? A3($elm$browser$Debugger$Expando$Constructor, maybeName, false, args) : expando); + } + }); +var $elm$browser$Debugger$Expando$init = function (value) { + return A2( + $elm$browser$Debugger$Expando$initHelp, + true, + _Debugger_init(value)); +}; +var $elm$core$Platform$Cmd$map = _Platform_map; +var $elm$browser$Debugger$Overlay$None = {$: 'None'}; +var $elm$browser$Debugger$Overlay$none = $elm$browser$Debugger$Overlay$None; +var $elm$browser$Debugger$Main$wrapInit = F4( + function (metadata, popout, init, flags) { + var _v0 = init(flags); + var userModel = _v0.a; + var userCommands = _v0.b; + return _Utils_Tuple2( + { + expandoModel: $elm$browser$Debugger$Expando$init(userModel), + expandoMsg: $elm$browser$Debugger$Expando$init(_Utils_Tuple0), + history: $elm$browser$Debugger$History$empty(userModel), + layout: A3($elm$browser$Debugger$Main$Horizontal, $elm$browser$Debugger$Main$Static, 0.3, 0.5), + metadata: $elm$browser$Debugger$Metadata$decode(metadata), + overlay: $elm$browser$Debugger$Overlay$none, + popout: popout, + state: $elm$browser$Debugger$Main$Running(userModel) + }, + A2($elm$core$Platform$Cmd$map, $elm$browser$Debugger$Main$UserMsg, userCommands)); + }); +var $elm$browser$Debugger$Main$getLatestModel = function (state) { + if (state.$ === 'Running') { + var model = state.a; + return model; + } else { + var model = state.c; + return model; + } +}; +var $elm$core$Platform$Sub$map = _Platform_map; +var $elm$browser$Debugger$Main$wrapSubs = F2( + function (subscriptions, model) { + return A2( + $elm$core$Platform$Sub$map, + $elm$browser$Debugger$Main$UserMsg, + subscriptions( + $elm$browser$Debugger$Main$getLatestModel(model.state))); + }); +var $elm$browser$Debugger$Main$Moving = {$: 'Moving'}; +var $elm$browser$Debugger$Main$Paused = F5( + function (a, b, c, d, e) { + return {$: 'Paused', a: a, b: b, c: c, d: d, e: e}; + }); +var $elm$browser$Debugger$History$Snapshot = F2( + function (model, messages) { + return {messages: messages, model: model}; + }); +var $elm$browser$Debugger$History$addRecent = F3( + function (msg, newModel, _v0) { + var model = _v0.model; + var messages = _v0.messages; + var numMessages = _v0.numMessages; + return _Utils_eq(numMessages, $elm$browser$Debugger$History$maxSnapshotSize) ? _Utils_Tuple2( + $elm$core$Maybe$Just( + A2( + $elm$browser$Debugger$History$Snapshot, + model, + $elm$core$Array$fromList(messages))), + A3( + $elm$browser$Debugger$History$RecentHistory, + newModel, + _List_fromArray( + [msg]), + 1)) : _Utils_Tuple2( + $elm$core$Maybe$Nothing, + A3( + $elm$browser$Debugger$History$RecentHistory, + model, + A2($elm$core$List$cons, msg, messages), + numMessages + 1)); + }); +var $elm$core$Elm$JsArray$push = _JsArray_push; +var $elm$core$Elm$JsArray$singleton = _JsArray_singleton; +var $elm$core$Array$insertTailInTree = F4( + function (shift, index, tail, tree) { + var pos = $elm$core$Array$bitMask & (index >>> shift); + if (_Utils_cmp( + pos, + $elm$core$Elm$JsArray$length(tree)) > -1) { + if (shift === 5) { + return A2( + $elm$core$Elm$JsArray$push, + $elm$core$Array$Leaf(tail), + tree); + } else { + var newSub = $elm$core$Array$SubTree( + A4($elm$core$Array$insertTailInTree, shift - $elm$core$Array$shiftStep, index, tail, $elm$core$Elm$JsArray$empty)); + return A2($elm$core$Elm$JsArray$push, newSub, tree); + } + } else { + var value = A2($elm$core$Elm$JsArray$unsafeGet, pos, tree); + if (value.$ === 'SubTree') { + var subTree = value.a; + var newSub = $elm$core$Array$SubTree( + A4($elm$core$Array$insertTailInTree, shift - $elm$core$Array$shiftStep, index, tail, subTree)); + return A3($elm$core$Elm$JsArray$unsafeSet, pos, newSub, tree); + } else { + var newSub = $elm$core$Array$SubTree( + A4( + $elm$core$Array$insertTailInTree, + shift - $elm$core$Array$shiftStep, + index, + tail, + $elm$core$Elm$JsArray$singleton(value))); + return A3($elm$core$Elm$JsArray$unsafeSet, pos, newSub, tree); + } + } + }); +var $elm$core$Array$unsafeReplaceTail = F2( + function (newTail, _v0) { + var len = _v0.a; + var startShift = _v0.b; + var tree = _v0.c; + var tail = _v0.d; + var originalTailLen = $elm$core$Elm$JsArray$length(tail); + var newTailLen = $elm$core$Elm$JsArray$length(newTail); + var newArrayLen = len + (newTailLen - originalTailLen); + if (_Utils_eq(newTailLen, $elm$core$Array$branchFactor)) { + var overflow = _Utils_cmp(newArrayLen >>> $elm$core$Array$shiftStep, 1 << startShift) > 0; + if (overflow) { + var newShift = startShift + $elm$core$Array$shiftStep; + var newTree = A4( + $elm$core$Array$insertTailInTree, + newShift, + len, + newTail, + $elm$core$Elm$JsArray$singleton( + $elm$core$Array$SubTree(tree))); + return A4($elm$core$Array$Array_elm_builtin, newArrayLen, newShift, newTree, $elm$core$Elm$JsArray$empty); + } else { + return A4( + $elm$core$Array$Array_elm_builtin, + newArrayLen, + startShift, + A4($elm$core$Array$insertTailInTree, startShift, len, newTail, tree), + $elm$core$Elm$JsArray$empty); + } + } else { + return A4($elm$core$Array$Array_elm_builtin, newArrayLen, startShift, tree, newTail); + } + }); +var $elm$core$Array$push = F2( + function (a, array) { + var tail = array.d; + return A2( + $elm$core$Array$unsafeReplaceTail, + A2($elm$core$Elm$JsArray$push, a, tail), + array); + }); +var $elm$browser$Debugger$History$add = F3( + function (msg, model, _v0) { + var snapshots = _v0.snapshots; + var recent = _v0.recent; + var numMessages = _v0.numMessages; + var _v1 = A3($elm$browser$Debugger$History$addRecent, msg, model, recent); + if (_v1.a.$ === 'Just') { + var snapshot = _v1.a.a; + var newRecent = _v1.b; + return A3( + $elm$browser$Debugger$History$History, + A2($elm$core$Array$push, snapshot, snapshots), + newRecent, + numMessages + 1); + } else { + var _v2 = _v1.a; + var newRecent = _v1.b; + return A3($elm$browser$Debugger$History$History, snapshots, newRecent, numMessages + 1); + } + }); +var $elm$core$Basics$always = F2( + function (a, _v0) { + return a; + }); +var $elm$browser$Debugger$Overlay$BadImport = function (a) { + return {$: 'BadImport', a: a}; +}; +var $elm$browser$Debugger$Overlay$RiskyImport = F2( + function (a, b) { + return {$: 'RiskyImport', a: a, b: b}; + }); +var $elm$browser$Debugger$Report$VersionChanged = F2( + function (a, b) { + return {$: 'VersionChanged', a: a, b: b}; + }); +var $elm$browser$Debugger$Report$MessageChanged = F2( + function (a, b) { + return {$: 'MessageChanged', a: a, b: b}; + }); +var $elm$browser$Debugger$Report$SomethingChanged = function (a) { + return {$: 'SomethingChanged', a: a}; +}; +var $elm$browser$Debugger$Report$AliasChange = function (a) { + return {$: 'AliasChange', a: a}; +}; +var $elm$browser$Debugger$Metadata$checkAlias = F4( + function (name, old, _new, changes) { + return (_Utils_eq(old.tipe, _new.tipe) && _Utils_eq(old.args, _new.args)) ? changes : A2( + $elm$core$List$cons, + $elm$browser$Debugger$Report$AliasChange(name), + changes); + }); +var $elm$browser$Debugger$Report$UnionChange = F2( + function (a, b) { + return {$: 'UnionChange', a: a, b: b}; + }); +var $elm$browser$Debugger$Metadata$addTag = F3( + function (tag, _v0, changes) { + return _Utils_update( + changes, + { + added: A2($elm$core$List$cons, tag, changes.added) + }); + }); +var $elm$browser$Debugger$Metadata$checkTag = F4( + function (tag, old, _new, changes) { + return _Utils_eq(old, _new) ? changes : _Utils_update( + changes, + { + changed: A2($elm$core$List$cons, tag, changes.changed) + }); + }); +var $elm$browser$Debugger$Report$TagChanges = F4( + function (removed, changed, added, argsMatch) { + return {added: added, argsMatch: argsMatch, changed: changed, removed: removed}; + }); +var $elm$browser$Debugger$Report$emptyTagChanges = function (argsMatch) { + return A4($elm$browser$Debugger$Report$TagChanges, _List_Nil, _List_Nil, _List_Nil, argsMatch); +}; +var $elm$browser$Debugger$Report$hasTagChanges = function (tagChanges) { + return _Utils_eq( + tagChanges, + A4($elm$browser$Debugger$Report$TagChanges, _List_Nil, _List_Nil, _List_Nil, true)); +}; +var $elm$core$Dict$merge = F6( + function (leftStep, bothStep, rightStep, leftDict, rightDict, initialResult) { + var stepState = F3( + function (rKey, rValue, _v0) { + stepState: + while (true) { + var list = _v0.a; + var result = _v0.b; + if (!list.b) { + return _Utils_Tuple2( + list, + A3(rightStep, rKey, rValue, result)); + } else { + var _v2 = list.a; + var lKey = _v2.a; + var lValue = _v2.b; + var rest = list.b; + if (_Utils_cmp(lKey, rKey) < 0) { + var $temp$rKey = rKey, + $temp$rValue = rValue, + $temp$_v0 = _Utils_Tuple2( + rest, + A3(leftStep, lKey, lValue, result)); + rKey = $temp$rKey; + rValue = $temp$rValue; + _v0 = $temp$_v0; + continue stepState; + } else { + if (_Utils_cmp(lKey, rKey) > 0) { + return _Utils_Tuple2( + list, + A3(rightStep, rKey, rValue, result)); + } else { + return _Utils_Tuple2( + rest, + A4(bothStep, lKey, lValue, rValue, result)); + } + } + } + } + }); + var _v3 = A3( + $elm$core$Dict$foldl, + stepState, + _Utils_Tuple2( + $elm$core$Dict$toList(leftDict), + initialResult), + rightDict); + var leftovers = _v3.a; + var intermediateResult = _v3.b; + return A3( + $elm$core$List$foldl, + F2( + function (_v4, result) { + var k = _v4.a; + var v = _v4.b; + return A3(leftStep, k, v, result); + }), + intermediateResult, + leftovers); + }); +var $elm$browser$Debugger$Metadata$removeTag = F3( + function (tag, _v0, changes) { + return _Utils_update( + changes, + { + removed: A2($elm$core$List$cons, tag, changes.removed) + }); + }); +var $elm$browser$Debugger$Metadata$checkUnion = F4( + function (name, old, _new, changes) { + var tagChanges = A6( + $elm$core$Dict$merge, + $elm$browser$Debugger$Metadata$removeTag, + $elm$browser$Debugger$Metadata$checkTag, + $elm$browser$Debugger$Metadata$addTag, + old.tags, + _new.tags, + $elm$browser$Debugger$Report$emptyTagChanges( + _Utils_eq(old.args, _new.args))); + return $elm$browser$Debugger$Report$hasTagChanges(tagChanges) ? changes : A2( + $elm$core$List$cons, + A2($elm$browser$Debugger$Report$UnionChange, name, tagChanges), + changes); + }); +var $elm$browser$Debugger$Metadata$ignore = F3( + function (key, value, report) { + return report; + }); +var $elm$browser$Debugger$Metadata$checkTypes = F2( + function (old, _new) { + return (!_Utils_eq(old.message, _new.message)) ? A2($elm$browser$Debugger$Report$MessageChanged, old.message, _new.message) : $elm$browser$Debugger$Report$SomethingChanged( + A6( + $elm$core$Dict$merge, + $elm$browser$Debugger$Metadata$ignore, + $elm$browser$Debugger$Metadata$checkUnion, + $elm$browser$Debugger$Metadata$ignore, + old.unions, + _new.unions, + A6($elm$core$Dict$merge, $elm$browser$Debugger$Metadata$ignore, $elm$browser$Debugger$Metadata$checkAlias, $elm$browser$Debugger$Metadata$ignore, old.aliases, _new.aliases, _List_Nil))); + }); +var $elm$browser$Debugger$Metadata$check = F2( + function (old, _new) { + return (!_Utils_eq(old.versions.elm, _new.versions.elm)) ? A2($elm$browser$Debugger$Report$VersionChanged, old.versions.elm, _new.versions.elm) : A2($elm$browser$Debugger$Metadata$checkTypes, old.types, _new.types); + }); +var $elm$browser$Debugger$Report$CorruptHistory = {$: 'CorruptHistory'}; +var $elm$browser$Debugger$Overlay$corruptImport = $elm$browser$Debugger$Overlay$BadImport($elm$browser$Debugger$Report$CorruptHistory); +var $elm$json$Json$Decode$decodeString = _Json_runOnString; +var $elm$browser$Debugger$Report$Fine = {$: 'Fine'}; +var $elm$browser$Debugger$Report$Impossible = {$: 'Impossible'}; +var $elm$browser$Debugger$Report$Risky = {$: 'Risky'}; +var $elm$core$Basics$not = _Basics_not; +var $elm$core$List$isEmpty = function (xs) { + if (!xs.b) { + return true; + } else { + return false; + } +}; +var $elm$browser$Debugger$Report$some = function (list) { + return !$elm$core$List$isEmpty(list); +}; +var $elm$browser$Debugger$Report$evaluateChange = function (change) { + if (change.$ === 'AliasChange') { + return $elm$browser$Debugger$Report$Impossible; + } else { + var removed = change.b.removed; + var changed = change.b.changed; + var added = change.b.added; + var argsMatch = change.b.argsMatch; + return ((!argsMatch) || ($elm$browser$Debugger$Report$some(changed) || $elm$browser$Debugger$Report$some(removed))) ? $elm$browser$Debugger$Report$Impossible : ($elm$browser$Debugger$Report$some(added) ? $elm$browser$Debugger$Report$Risky : $elm$browser$Debugger$Report$Fine); + } +}; +var $elm$browser$Debugger$Report$worstCase = F2( + function (status, statusList) { + worstCase: + while (true) { + if (!statusList.b) { + return status; + } else { + switch (statusList.a.$) { + case 'Impossible': + var _v1 = statusList.a; + return $elm$browser$Debugger$Report$Impossible; + case 'Risky': + var _v2 = statusList.a; + var rest = statusList.b; + var $temp$status = $elm$browser$Debugger$Report$Risky, + $temp$statusList = rest; + status = $temp$status; + statusList = $temp$statusList; + continue worstCase; + default: + var _v3 = statusList.a; + var rest = statusList.b; + var $temp$status = status, + $temp$statusList = rest; + status = $temp$status; + statusList = $temp$statusList; + continue worstCase; + } + } + } + }); +var $elm$browser$Debugger$Report$evaluate = function (report) { + switch (report.$) { + case 'CorruptHistory': + return $elm$browser$Debugger$Report$Impossible; + case 'VersionChanged': + return $elm$browser$Debugger$Report$Impossible; + case 'MessageChanged': + return $elm$browser$Debugger$Report$Impossible; + default: + var changes = report.a; + return A2( + $elm$browser$Debugger$Report$worstCase, + $elm$browser$Debugger$Report$Fine, + A2($elm$core$List$map, $elm$browser$Debugger$Report$evaluateChange, changes)); + } +}; +var $elm$json$Json$Decode$value = _Json_decodeValue; +var $elm$browser$Debugger$Overlay$uploadDecoder = A3( + $elm$json$Json$Decode$map2, + F2( + function (x, y) { + return _Utils_Tuple2(x, y); + }), + A2($elm$json$Json$Decode$field, 'metadata', $elm$browser$Debugger$Metadata$decoder), + A2($elm$json$Json$Decode$field, 'history', $elm$json$Json$Decode$value)); +var $elm$browser$Debugger$Overlay$assessImport = F2( + function (metadata, jsonString) { + var _v0 = A2($elm$json$Json$Decode$decodeString, $elm$browser$Debugger$Overlay$uploadDecoder, jsonString); + if (_v0.$ === 'Err') { + return $elm$core$Result$Err($elm$browser$Debugger$Overlay$corruptImport); + } else { + var _v1 = _v0.a; + var foreignMetadata = _v1.a; + var rawHistory = _v1.b; + var report = A2($elm$browser$Debugger$Metadata$check, foreignMetadata, metadata); + var _v2 = $elm$browser$Debugger$Report$evaluate(report); + switch (_v2.$) { + case 'Impossible': + return $elm$core$Result$Err( + $elm$browser$Debugger$Overlay$BadImport(report)); + case 'Risky': + return $elm$core$Result$Err( + A2($elm$browser$Debugger$Overlay$RiskyImport, report, rawHistory)); + default: + return $elm$core$Result$Ok(rawHistory); + } + } + }); +var $elm$core$Platform$Cmd$batch = _Platform_batch; +var $elm$browser$Debugger$Overlay$close = F2( + function (msg, state) { + switch (state.$) { + case 'None': + return $elm$core$Maybe$Nothing; + case 'BadMetadata': + return $elm$core$Maybe$Nothing; + case 'BadImport': + return $elm$core$Maybe$Nothing; + default: + var rawHistory = state.b; + if (msg.$ === 'Cancel') { + return $elm$core$Maybe$Nothing; + } else { + return $elm$core$Maybe$Just(rawHistory); + } + } + }); +var $elm$browser$Debugger$History$elmToJs = A2($elm$core$Basics$composeR, _Json_wrap, _Debugger_unsafeCoerce); +var $elm$browser$Debugger$History$encodeHelp = F2( + function (snapshot, allMessages) { + return A3($elm$core$Array$foldl, $elm$core$List$cons, allMessages, snapshot.messages); + }); +var $elm$json$Json$Encode$list = F2( + function (func, entries) { + return _Json_wrap( + A3( + $elm$core$List$foldl, + _Json_addEntry(func), + _Json_emptyArray(_Utils_Tuple0), + entries)); + }); +var $elm$browser$Debugger$History$encode = function (_v0) { + var snapshots = _v0.snapshots; + var recent = _v0.recent; + return A2( + $elm$json$Json$Encode$list, + $elm$browser$Debugger$History$elmToJs, + A3( + $elm$core$Array$foldr, + $elm$browser$Debugger$History$encodeHelp, + $elm$core$List$reverse(recent.messages), + snapshots)); +}; +var $elm$json$Json$Encode$object = function (pairs) { + return _Json_wrap( + A3( + $elm$core$List$foldl, + F2( + function (_v0, obj) { + var k = _v0.a; + var v = _v0.b; + return A3(_Json_addField, k, v, obj); + }), + _Json_emptyObject(_Utils_Tuple0), + pairs)); +}; +var $elm$browser$Debugger$Metadata$encodeAlias = function (_v0) { + var args = _v0.args; + var tipe = _v0.tipe; + return $elm$json$Json$Encode$object( + _List_fromArray( + [ + _Utils_Tuple2( + 'args', + A2($elm$json$Json$Encode$list, $elm$json$Json$Encode$string, args)), + _Utils_Tuple2( + 'type', + $elm$json$Json$Encode$string(tipe)) + ])); +}; +var $elm$browser$Debugger$Metadata$encodeDict = F2( + function (f, dict) { + return $elm$json$Json$Encode$object( + $elm$core$Dict$toList( + A2( + $elm$core$Dict$map, + F2( + function (key, value) { + return f(value); + }), + dict))); + }); +var $elm$browser$Debugger$Metadata$encodeUnion = function (_v0) { + var args = _v0.args; + var tags = _v0.tags; + return $elm$json$Json$Encode$object( + _List_fromArray( + [ + _Utils_Tuple2( + 'args', + A2($elm$json$Json$Encode$list, $elm$json$Json$Encode$string, args)), + _Utils_Tuple2( + 'tags', + A2( + $elm$browser$Debugger$Metadata$encodeDict, + $elm$json$Json$Encode$list($elm$json$Json$Encode$string), + tags)) + ])); +}; +var $elm$browser$Debugger$Metadata$encodeTypes = function (_v0) { + var message = _v0.message; + var unions = _v0.unions; + var aliases = _v0.aliases; + return $elm$json$Json$Encode$object( + _List_fromArray( + [ + _Utils_Tuple2( + 'message', + $elm$json$Json$Encode$string(message)), + _Utils_Tuple2( + 'aliases', + A2($elm$browser$Debugger$Metadata$encodeDict, $elm$browser$Debugger$Metadata$encodeAlias, aliases)), + _Utils_Tuple2( + 'unions', + A2($elm$browser$Debugger$Metadata$encodeDict, $elm$browser$Debugger$Metadata$encodeUnion, unions)) + ])); +}; +var $elm$browser$Debugger$Metadata$encodeVersions = function (_v0) { + var elm = _v0.elm; + return $elm$json$Json$Encode$object( + _List_fromArray( + [ + _Utils_Tuple2( + 'elm', + $elm$json$Json$Encode$string(elm)) + ])); +}; +var $elm$browser$Debugger$Metadata$encode = function (_v0) { + var versions = _v0.versions; + var types = _v0.types; + return $elm$json$Json$Encode$object( + _List_fromArray( + [ + _Utils_Tuple2( + 'versions', + $elm$browser$Debugger$Metadata$encodeVersions(versions)), + _Utils_Tuple2( + 'types', + $elm$browser$Debugger$Metadata$encodeTypes(types)) + ])); +}; +var $elm$core$Basics$identity = function (x) { + return x; +}; +var $elm$core$Task$Perform = function (a) { + return {$: 'Perform', a: a}; +}; +var $elm$core$Task$succeed = _Scheduler_succeed; +var $elm$core$Task$init = $elm$core$Task$succeed(_Utils_Tuple0); +var $elm$core$Task$andThen = _Scheduler_andThen; +var $elm$core$Task$map = F2( + function (func, taskA) { + return A2( + $elm$core$Task$andThen, + function (a) { + return $elm$core$Task$succeed( + func(a)); + }, + taskA); + }); +var $elm$core$Task$map2 = F3( + function (func, taskA, taskB) { + return A2( + $elm$core$Task$andThen, + function (a) { + return A2( + $elm$core$Task$andThen, + function (b) { + return $elm$core$Task$succeed( + A2(func, a, b)); + }, + taskB); + }, + taskA); + }); +var $elm$core$Task$sequence = function (tasks) { + return A3( + $elm$core$List$foldr, + $elm$core$Task$map2($elm$core$List$cons), + $elm$core$Task$succeed(_List_Nil), + tasks); +}; +var $elm$core$Platform$sendToApp = _Platform_sendToApp; +var $elm$core$Task$spawnCmd = F2( + function (router, _v0) { + var task = _v0.a; + return _Scheduler_spawn( + A2( + $elm$core$Task$andThen, + $elm$core$Platform$sendToApp(router), + task)); + }); +var $elm$core$Task$onEffects = F3( + function (router, commands, state) { + return A2( + $elm$core$Task$map, + function (_v0) { + return _Utils_Tuple0; + }, + $elm$core$Task$sequence( + A2( + $elm$core$List$map, + $elm$core$Task$spawnCmd(router), + commands))); + }); +var $elm$core$Task$onSelfMsg = F3( + function (_v0, _v1, _v2) { + return $elm$core$Task$succeed(_Utils_Tuple0); + }); +var $elm$core$Task$cmdMap = F2( + function (tagger, _v0) { + var task = _v0.a; + return $elm$core$Task$Perform( + A2($elm$core$Task$map, tagger, task)); + }); +_Platform_effectManagers['Task'] = _Platform_createManager($elm$core$Task$init, $elm$core$Task$onEffects, $elm$core$Task$onSelfMsg, $elm$core$Task$cmdMap); +var $elm$core$Task$command = _Platform_leaf('Task'); +var $elm$core$Task$perform = F2( + function (toMessage, task) { + return $elm$core$Task$command( + $elm$core$Task$Perform( + A2($elm$core$Task$map, toMessage, task))); + }); +var $elm$browser$Debugger$Main$download = F2( + function (metadata, history) { + var historyLength = $elm$browser$Debugger$History$size(history); + return A2( + $elm$core$Task$perform, + function (_v0) { + return $elm$browser$Debugger$Main$NoOp; + }, + A2( + _Debugger_download, + historyLength, + _Json_unwrap( + $elm$json$Json$Encode$object( + _List_fromArray( + [ + _Utils_Tuple2( + 'metadata', + $elm$browser$Debugger$Metadata$encode(metadata)), + _Utils_Tuple2( + 'history', + $elm$browser$Debugger$History$encode(history)) + ]))))); + }); +var $elm$browser$Debugger$Main$Vertical = F3( + function (a, b, c) { + return {$: 'Vertical', a: a, b: b, c: c}; + }); +var $elm$browser$Debugger$Main$drag = F2( + function (info, layout) { + if (layout.$ === 'Horizontal') { + var status = layout.a; + var y = layout.c; + return A3($elm$browser$Debugger$Main$Horizontal, status, info.x / info.width, y); + } else { + var status = layout.a; + var x = layout.b; + return A3($elm$browser$Debugger$Main$Vertical, status, x, info.y / info.height); + } + }); +var $elm$browser$Debugger$History$Stepping = F2( + function (a, b) { + return {$: 'Stepping', a: a, b: b}; + }); +var $elm$browser$Debugger$History$Done = F2( + function (a, b) { + return {$: 'Done', a: a, b: b}; + }); +var $elm$browser$Debugger$History$getHelp = F3( + function (update, msg, getResult) { + if (getResult.$ === 'Done') { + return getResult; + } else { + var n = getResult.a; + var model = getResult.b; + return (!n) ? A2( + $elm$browser$Debugger$History$Done, + msg, + A2(update, msg, model).a) : A2( + $elm$browser$Debugger$History$Stepping, + n - 1, + A2(update, msg, model).a); + } + }); +var $elm$browser$Debugger$History$undone = function (getResult) { + undone: + while (true) { + if (getResult.$ === 'Done') { + var msg = getResult.a; + var model = getResult.b; + return _Utils_Tuple2(model, msg); + } else { + var $temp$getResult = getResult; + getResult = $temp$getResult; + continue undone; + } + } +}; +var $elm$browser$Debugger$History$get = F3( + function (update, index, history) { + get: + while (true) { + var recent = history.recent; + var snapshotMax = history.numMessages - recent.numMessages; + if (_Utils_cmp(index, snapshotMax) > -1) { + return $elm$browser$Debugger$History$undone( + A3( + $elm$core$List$foldr, + $elm$browser$Debugger$History$getHelp(update), + A2($elm$browser$Debugger$History$Stepping, index - snapshotMax, recent.model), + recent.messages)); + } else { + var _v0 = A2($elm$core$Array$get, (index / $elm$browser$Debugger$History$maxSnapshotSize) | 0, history.snapshots); + if (_v0.$ === 'Nothing') { + var $temp$update = update, + $temp$index = index, + $temp$history = history; + update = $temp$update; + index = $temp$index; + history = $temp$history; + continue get; + } else { + var model = _v0.a.model; + var messages = _v0.a.messages; + return $elm$browser$Debugger$History$undone( + A3( + $elm$core$Array$foldr, + $elm$browser$Debugger$History$getHelp(update), + A2($elm$browser$Debugger$History$Stepping, index % $elm$browser$Debugger$History$maxSnapshotSize, model), + messages)); + } + } + } + }); +var $elm$browser$Debugger$History$getRecentMsg = function (history) { + getRecentMsg: + while (true) { + var _v0 = history.recent.messages; + if (!_v0.b) { + var $temp$history = history; + history = $temp$history; + continue getRecentMsg; + } else { + var first = _v0.a; + return first; + } + } +}; +var $elm$core$Dict$get = F2( + function (targetKey, dict) { + get: + while (true) { + if (dict.$ === 'RBEmpty_elm_builtin') { + return $elm$core$Maybe$Nothing; + } else { + var key = dict.b; + var value = dict.c; + var left = dict.d; + var right = dict.e; + var _v1 = A2($elm$core$Basics$compare, targetKey, key); + switch (_v1.$) { + case 'LT': + var $temp$targetKey = targetKey, + $temp$dict = left; + targetKey = $temp$targetKey; + dict = $temp$dict; + continue get; + case 'EQ': + return $elm$core$Maybe$Just(value); + default: + var $temp$targetKey = targetKey, + $temp$dict = right; + targetKey = $temp$targetKey; + dict = $temp$dict; + continue get; + } + } + } + }); +var $elm$browser$Debugger$Expando$mergeDictHelp = F3( + function (oldDict, key, value) { + var _v12 = A2($elm$core$Dict$get, key, oldDict); + if (_v12.$ === 'Nothing') { + return value; + } else { + var oldValue = _v12.a; + return A2($elm$browser$Debugger$Expando$mergeHelp, oldValue, value); + } + }); +var $elm$browser$Debugger$Expando$mergeHelp = F2( + function (old, _new) { + var _v3 = _Utils_Tuple2(old, _new); + _v3$6: + while (true) { + switch (_v3.b.$) { + case 'S': + return _new; + case 'Primitive': + return _new; + case 'Sequence': + if (_v3.a.$ === 'Sequence') { + var _v4 = _v3.a; + var isClosed = _v4.b; + var oldValues = _v4.c; + var _v5 = _v3.b; + var seqType = _v5.a; + var newValues = _v5.c; + return A3( + $elm$browser$Debugger$Expando$Sequence, + seqType, + isClosed, + A2($elm$browser$Debugger$Expando$mergeListHelp, oldValues, newValues)); + } else { + break _v3$6; + } + case 'Dictionary': + if (_v3.a.$ === 'Dictionary') { + var _v6 = _v3.a; + var isClosed = _v6.a; + var _v7 = _v3.b; + var keyValuePairs = _v7.b; + return A2($elm$browser$Debugger$Expando$Dictionary, isClosed, keyValuePairs); + } else { + break _v3$6; + } + case 'Record': + if (_v3.a.$ === 'Record') { + var _v8 = _v3.a; + var isClosed = _v8.a; + var oldDict = _v8.b; + var _v9 = _v3.b; + var newDict = _v9.b; + return A2( + $elm$browser$Debugger$Expando$Record, + isClosed, + A2( + $elm$core$Dict$map, + $elm$browser$Debugger$Expando$mergeDictHelp(oldDict), + newDict)); + } else { + break _v3$6; + } + default: + if (_v3.a.$ === 'Constructor') { + var _v10 = _v3.a; + var isClosed = _v10.b; + var oldValues = _v10.c; + var _v11 = _v3.b; + var maybeName = _v11.a; + var newValues = _v11.c; + return A3( + $elm$browser$Debugger$Expando$Constructor, + maybeName, + isClosed, + A2($elm$browser$Debugger$Expando$mergeListHelp, oldValues, newValues)); + } else { + break _v3$6; + } + } + } + return _new; + }); +var $elm$browser$Debugger$Expando$mergeListHelp = F2( + function (olds, news) { + var _v0 = _Utils_Tuple2(olds, news); + if (!_v0.a.b) { + return news; + } else { + if (!_v0.b.b) { + return news; + } else { + var _v1 = _v0.a; + var x = _v1.a; + var xs = _v1.b; + var _v2 = _v0.b; + var y = _v2.a; + var ys = _v2.b; + return A2( + $elm$core$List$cons, + A2($elm$browser$Debugger$Expando$mergeHelp, x, y), + A2($elm$browser$Debugger$Expando$mergeListHelp, xs, ys)); + } + } + }); +var $elm$browser$Debugger$Expando$merge = F2( + function (value, expando) { + return A2( + $elm$browser$Debugger$Expando$mergeHelp, + expando, + _Debugger_init(value)); + }); +var $elm$browser$Debugger$Main$jumpUpdate = F3( + function (update, index, model) { + var history = $elm$browser$Debugger$Main$cachedHistory(model); + var currentMsg = $elm$browser$Debugger$History$getRecentMsg(history); + var currentModel = $elm$browser$Debugger$Main$getLatestModel(model.state); + var _v0 = A3($elm$browser$Debugger$History$get, update, index, history); + var indexModel = _v0.a; + var indexMsg = _v0.b; + return _Utils_update( + model, + { + expandoModel: A2($elm$browser$Debugger$Expando$merge, indexModel, model.expandoModel), + expandoMsg: A2($elm$browser$Debugger$Expando$merge, indexMsg, model.expandoMsg), + state: A5($elm$browser$Debugger$Main$Paused, index, indexModel, currentModel, currentMsg, history) + }); + }); +var $elm$browser$Debugger$History$jsToElm = A2($elm$core$Basics$composeR, _Json_unwrap, _Debugger_unsafeCoerce); +var $elm$browser$Debugger$History$decoder = F2( + function (initialModel, update) { + var addMessage = F2( + function (rawMsg, _v0) { + var model = _v0.a; + var history = _v0.b; + var msg = $elm$browser$Debugger$History$jsToElm(rawMsg); + return _Utils_Tuple2( + A2(update, msg, model), + A3($elm$browser$Debugger$History$add, msg, model, history)); + }); + var updateModel = function (rawMsgs) { + return A3( + $elm$core$List$foldl, + addMessage, + _Utils_Tuple2( + initialModel, + $elm$browser$Debugger$History$empty(initialModel)), + rawMsgs); + }; + return A2( + $elm$json$Json$Decode$map, + updateModel, + $elm$json$Json$Decode$list($elm$json$Json$Decode$value)); + }); +var $elm$browser$Debugger$History$getInitialModel = function (_v0) { + var snapshots = _v0.snapshots; + var recent = _v0.recent; + var _v1 = A2($elm$core$Array$get, 0, snapshots); + if (_v1.$ === 'Just') { + var model = _v1.a.model; + return model; + } else { + return recent.model; + } +}; +var $elm$core$Platform$Cmd$none = $elm$core$Platform$Cmd$batch(_List_Nil); +var $elm$browser$Debugger$Main$loadNewHistory = F3( + function (rawHistory, update, model) { + var pureUserUpdate = F2( + function (msg, userModel) { + return A2(update, msg, userModel).a; + }); + var initialUserModel = $elm$browser$Debugger$History$getInitialModel(model.history); + var decoder = A2($elm$browser$Debugger$History$decoder, initialUserModel, pureUserUpdate); + var _v0 = A2($elm$json$Json$Decode$decodeValue, decoder, rawHistory); + if (_v0.$ === 'Err') { + return _Utils_Tuple2( + _Utils_update( + model, + {overlay: $elm$browser$Debugger$Overlay$corruptImport}), + $elm$core$Platform$Cmd$none); + } else { + var _v1 = _v0.a; + var latestUserModel = _v1.a; + var newHistory = _v1.b; + return _Utils_Tuple2( + _Utils_update( + model, + { + expandoModel: $elm$browser$Debugger$Expando$init(latestUserModel), + expandoMsg: $elm$browser$Debugger$Expando$init( + $elm$browser$Debugger$History$getRecentMsg(newHistory)), + history: newHistory, + overlay: $elm$browser$Debugger$Overlay$none, + state: $elm$browser$Debugger$Main$Running(latestUserModel) + }), + $elm$core$Platform$Cmd$none); + } + }); +var $elm$browser$Debugger$Main$scroll = function (popout) { + return A2( + $elm$core$Task$perform, + $elm$core$Basics$always($elm$browser$Debugger$Main$NoOp), + _Debugger_scroll(popout)); +}; +var $elm$browser$Debugger$Main$scrollTo = F2( + function (id, popout) { + return A2( + $elm$core$Task$perform, + $elm$core$Basics$always($elm$browser$Debugger$Main$NoOp), + A2(_Debugger_scrollTo, id, popout)); + }); +var $elm$browser$Debugger$Main$setDragStatus = F2( + function (status, layout) { + if (layout.$ === 'Horizontal') { + var x = layout.b; + var y = layout.c; + return A3($elm$browser$Debugger$Main$Horizontal, status, x, y); + } else { + var x = layout.b; + var y = layout.c; + return A3($elm$browser$Debugger$Main$Vertical, status, x, y); + } + }); +var $elm$browser$Debugger$Main$swapLayout = function (layout) { + if (layout.$ === 'Horizontal') { + var s = layout.a; + var x = layout.b; + var y = layout.c; + return A3($elm$browser$Debugger$Main$Vertical, s, x, y); + } else { + var s = layout.a; + var x = layout.b; + var y = layout.c; + return A3($elm$browser$Debugger$Main$Horizontal, s, x, y); + } +}; +var $elm$core$Dict$getMin = function (dict) { + getMin: + while (true) { + if ((dict.$ === 'RBNode_elm_builtin') && (dict.d.$ === 'RBNode_elm_builtin')) { + var left = dict.d; + var $temp$dict = left; + dict = $temp$dict; + continue getMin; + } else { + return dict; + } + } +}; +var $elm$core$Dict$moveRedLeft = function (dict) { + if (((dict.$ === 'RBNode_elm_builtin') && (dict.d.$ === 'RBNode_elm_builtin')) && (dict.e.$ === 'RBNode_elm_builtin')) { + if ((dict.e.d.$ === 'RBNode_elm_builtin') && (dict.e.d.a.$ === 'Red')) { + var clr = dict.a; + var k = dict.b; + var v = dict.c; + var _v1 = dict.d; + var lClr = _v1.a; + var lK = _v1.b; + var lV = _v1.c; + var lLeft = _v1.d; + var lRight = _v1.e; + var _v2 = dict.e; + var rClr = _v2.a; + var rK = _v2.b; + var rV = _v2.c; + var rLeft = _v2.d; + var _v3 = rLeft.a; + var rlK = rLeft.b; + var rlV = rLeft.c; + var rlL = rLeft.d; + var rlR = rLeft.e; + var rRight = _v2.e; + return A5( + $elm$core$Dict$RBNode_elm_builtin, + $elm$core$Dict$Red, + rlK, + rlV, + A5( + $elm$core$Dict$RBNode_elm_builtin, + $elm$core$Dict$Black, + k, + v, + A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, lK, lV, lLeft, lRight), + rlL), + A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Black, rK, rV, rlR, rRight)); + } else { + var clr = dict.a; + var k = dict.b; + var v = dict.c; + var _v4 = dict.d; + var lClr = _v4.a; + var lK = _v4.b; + var lV = _v4.c; + var lLeft = _v4.d; + var lRight = _v4.e; + var _v5 = dict.e; + var rClr = _v5.a; + var rK = _v5.b; + var rV = _v5.c; + var rLeft = _v5.d; + var rRight = _v5.e; + if (clr.$ === 'Black') { + return A5( + $elm$core$Dict$RBNode_elm_builtin, + $elm$core$Dict$Black, + k, + v, + A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, lK, lV, lLeft, lRight), + A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, rK, rV, rLeft, rRight)); + } else { + return A5( + $elm$core$Dict$RBNode_elm_builtin, + $elm$core$Dict$Black, + k, + v, + A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, lK, lV, lLeft, lRight), + A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, rK, rV, rLeft, rRight)); + } + } + } else { + return dict; + } +}; +var $elm$core$Dict$moveRedRight = function (dict) { + if (((dict.$ === 'RBNode_elm_builtin') && (dict.d.$ === 'RBNode_elm_builtin')) && (dict.e.$ === 'RBNode_elm_builtin')) { + if ((dict.d.d.$ === 'RBNode_elm_builtin') && (dict.d.d.a.$ === 'Red')) { + var clr = dict.a; + var k = dict.b; + var v = dict.c; + var _v1 = dict.d; + var lClr = _v1.a; + var lK = _v1.b; + var lV = _v1.c; + var _v2 = _v1.d; + var _v3 = _v2.a; + var llK = _v2.b; + var llV = _v2.c; + var llLeft = _v2.d; + var llRight = _v2.e; + var lRight = _v1.e; + var _v4 = dict.e; + var rClr = _v4.a; + var rK = _v4.b; + var rV = _v4.c; + var rLeft = _v4.d; + var rRight = _v4.e; + return A5( + $elm$core$Dict$RBNode_elm_builtin, + $elm$core$Dict$Red, + lK, + lV, + A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Black, llK, llV, llLeft, llRight), + A5( + $elm$core$Dict$RBNode_elm_builtin, + $elm$core$Dict$Black, + k, + v, + lRight, + A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, rK, rV, rLeft, rRight))); + } else { + var clr = dict.a; + var k = dict.b; + var v = dict.c; + var _v5 = dict.d; + var lClr = _v5.a; + var lK = _v5.b; + var lV = _v5.c; + var lLeft = _v5.d; + var lRight = _v5.e; + var _v6 = dict.e; + var rClr = _v6.a; + var rK = _v6.b; + var rV = _v6.c; + var rLeft = _v6.d; + var rRight = _v6.e; + if (clr.$ === 'Black') { + return A5( + $elm$core$Dict$RBNode_elm_builtin, + $elm$core$Dict$Black, + k, + v, + A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, lK, lV, lLeft, lRight), + A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, rK, rV, rLeft, rRight)); + } else { + return A5( + $elm$core$Dict$RBNode_elm_builtin, + $elm$core$Dict$Black, + k, + v, + A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, lK, lV, lLeft, lRight), + A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, rK, rV, rLeft, rRight)); + } + } + } else { + return dict; + } +}; +var $elm$core$Dict$removeHelpPrepEQGT = F7( + function (targetKey, dict, color, key, value, left, right) { + if ((left.$ === 'RBNode_elm_builtin') && (left.a.$ === 'Red')) { + var _v1 = left.a; + var lK = left.b; + var lV = left.c; + var lLeft = left.d; + var lRight = left.e; + return A5( + $elm$core$Dict$RBNode_elm_builtin, + color, + lK, + lV, + lLeft, + A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, key, value, lRight, right)); + } else { + _v2$2: + while (true) { + if ((right.$ === 'RBNode_elm_builtin') && (right.a.$ === 'Black')) { + if (right.d.$ === 'RBNode_elm_builtin') { + if (right.d.a.$ === 'Black') { + var _v3 = right.a; + var _v4 = right.d; + var _v5 = _v4.a; + return $elm$core$Dict$moveRedRight(dict); + } else { + break _v2$2; + } + } else { + var _v6 = right.a; + var _v7 = right.d; + return $elm$core$Dict$moveRedRight(dict); + } + } else { + break _v2$2; + } + } + return dict; + } + }); +var $elm$core$Dict$removeMin = function (dict) { + if ((dict.$ === 'RBNode_elm_builtin') && (dict.d.$ === 'RBNode_elm_builtin')) { + var color = dict.a; + var key = dict.b; + var value = dict.c; + var left = dict.d; + var lColor = left.a; + var lLeft = left.d; + var right = dict.e; + if (lColor.$ === 'Black') { + if ((lLeft.$ === 'RBNode_elm_builtin') && (lLeft.a.$ === 'Red')) { + var _v3 = lLeft.a; + return A5( + $elm$core$Dict$RBNode_elm_builtin, + color, + key, + value, + $elm$core$Dict$removeMin(left), + right); + } else { + var _v4 = $elm$core$Dict$moveRedLeft(dict); + if (_v4.$ === 'RBNode_elm_builtin') { + var nColor = _v4.a; + var nKey = _v4.b; + var nValue = _v4.c; + var nLeft = _v4.d; + var nRight = _v4.e; + return A5( + $elm$core$Dict$balance, + nColor, + nKey, + nValue, + $elm$core$Dict$removeMin(nLeft), + nRight); + } else { + return $elm$core$Dict$RBEmpty_elm_builtin; + } + } + } else { + return A5( + $elm$core$Dict$RBNode_elm_builtin, + color, + key, + value, + $elm$core$Dict$removeMin(left), + right); + } + } else { + return $elm$core$Dict$RBEmpty_elm_builtin; + } +}; +var $elm$core$Dict$removeHelp = F2( + function (targetKey, dict) { + if (dict.$ === 'RBEmpty_elm_builtin') { + return $elm$core$Dict$RBEmpty_elm_builtin; + } else { + var color = dict.a; + var key = dict.b; + var value = dict.c; + var left = dict.d; + var right = dict.e; + if (_Utils_cmp(targetKey, key) < 0) { + if ((left.$ === 'RBNode_elm_builtin') && (left.a.$ === 'Black')) { + var _v4 = left.a; + var lLeft = left.d; + if ((lLeft.$ === 'RBNode_elm_builtin') && (lLeft.a.$ === 'Red')) { + var _v6 = lLeft.a; + return A5( + $elm$core$Dict$RBNode_elm_builtin, + color, + key, + value, + A2($elm$core$Dict$removeHelp, targetKey, left), + right); + } else { + var _v7 = $elm$core$Dict$moveRedLeft(dict); + if (_v7.$ === 'RBNode_elm_builtin') { + var nColor = _v7.a; + var nKey = _v7.b; + var nValue = _v7.c; + var nLeft = _v7.d; + var nRight = _v7.e; + return A5( + $elm$core$Dict$balance, + nColor, + nKey, + nValue, + A2($elm$core$Dict$removeHelp, targetKey, nLeft), + nRight); + } else { + return $elm$core$Dict$RBEmpty_elm_builtin; + } + } + } else { + return A5( + $elm$core$Dict$RBNode_elm_builtin, + color, + key, + value, + A2($elm$core$Dict$removeHelp, targetKey, left), + right); + } + } else { + return A2( + $elm$core$Dict$removeHelpEQGT, + targetKey, + A7($elm$core$Dict$removeHelpPrepEQGT, targetKey, dict, color, key, value, left, right)); + } + } + }); +var $elm$core$Dict$removeHelpEQGT = F2( + function (targetKey, dict) { + if (dict.$ === 'RBNode_elm_builtin') { + var color = dict.a; + var key = dict.b; + var value = dict.c; + var left = dict.d; + var right = dict.e; + if (_Utils_eq(targetKey, key)) { + var _v1 = $elm$core$Dict$getMin(right); + if (_v1.$ === 'RBNode_elm_builtin') { + var minKey = _v1.b; + var minValue = _v1.c; + return A5( + $elm$core$Dict$balance, + color, + minKey, + minValue, + left, + $elm$core$Dict$removeMin(right)); + } else { + return $elm$core$Dict$RBEmpty_elm_builtin; + } + } else { + return A5( + $elm$core$Dict$balance, + color, + key, + value, + left, + A2($elm$core$Dict$removeHelp, targetKey, right)); + } + } else { + return $elm$core$Dict$RBEmpty_elm_builtin; + } + }); +var $elm$core$Dict$remove = F2( + function (key, dict) { + var _v0 = A2($elm$core$Dict$removeHelp, key, dict); + if ((_v0.$ === 'RBNode_elm_builtin') && (_v0.a.$ === 'Red')) { + var _v1 = _v0.a; + var k = _v0.b; + var v = _v0.c; + var l = _v0.d; + var r = _v0.e; + return A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Black, k, v, l, r); + } else { + var x = _v0; + return x; + } + }); +var $elm$core$Dict$update = F3( + function (targetKey, alter, dictionary) { + var _v0 = alter( + A2($elm$core$Dict$get, targetKey, dictionary)); + if (_v0.$ === 'Just') { + var value = _v0.a; + return A3($elm$core$Dict$insert, targetKey, value, dictionary); + } else { + return A2($elm$core$Dict$remove, targetKey, dictionary); + } + }); +var $elm$browser$Debugger$Expando$updateIndex = F3( + function (n, func, list) { + if (!list.b) { + return _List_Nil; + } else { + var x = list.a; + var xs = list.b; + return (n <= 0) ? A2( + $elm$core$List$cons, + func(x), + xs) : A2( + $elm$core$List$cons, + x, + A3($elm$browser$Debugger$Expando$updateIndex, n - 1, func, xs)); + } + }); +var $elm$browser$Debugger$Expando$update = F2( + function (msg, value) { + switch (value.$) { + case 'S': + return value; + case 'Primitive': + return value; + case 'Sequence': + var seqType = value.a; + var isClosed = value.b; + var valueList = value.c; + switch (msg.$) { + case 'Toggle': + return A3($elm$browser$Debugger$Expando$Sequence, seqType, !isClosed, valueList); + case 'Index': + if (msg.a.$ === 'None') { + var _v3 = msg.a; + var index = msg.b; + var subMsg = msg.c; + return A3( + $elm$browser$Debugger$Expando$Sequence, + seqType, + isClosed, + A3( + $elm$browser$Debugger$Expando$updateIndex, + index, + $elm$browser$Debugger$Expando$update(subMsg), + valueList)); + } else { + return value; + } + default: + return value; + } + case 'Dictionary': + var isClosed = value.a; + var keyValuePairs = value.b; + switch (msg.$) { + case 'Toggle': + return A2($elm$browser$Debugger$Expando$Dictionary, !isClosed, keyValuePairs); + case 'Index': + var redirect = msg.a; + var index = msg.b; + var subMsg = msg.c; + switch (redirect.$) { + case 'None': + return value; + case 'Key': + return A2( + $elm$browser$Debugger$Expando$Dictionary, + isClosed, + A3( + $elm$browser$Debugger$Expando$updateIndex, + index, + function (_v6) { + var k = _v6.a; + var v = _v6.b; + return _Utils_Tuple2( + A2($elm$browser$Debugger$Expando$update, subMsg, k), + v); + }, + keyValuePairs)); + default: + return A2( + $elm$browser$Debugger$Expando$Dictionary, + isClosed, + A3( + $elm$browser$Debugger$Expando$updateIndex, + index, + function (_v7) { + var k = _v7.a; + var v = _v7.b; + return _Utils_Tuple2( + k, + A2($elm$browser$Debugger$Expando$update, subMsg, v)); + }, + keyValuePairs)); + } + default: + return value; + } + case 'Record': + var isClosed = value.a; + var valueDict = value.b; + switch (msg.$) { + case 'Toggle': + return A2($elm$browser$Debugger$Expando$Record, !isClosed, valueDict); + case 'Index': + return value; + default: + var field = msg.a; + var subMsg = msg.b; + return A2( + $elm$browser$Debugger$Expando$Record, + isClosed, + A3( + $elm$core$Dict$update, + field, + $elm$browser$Debugger$Expando$updateField(subMsg), + valueDict)); + } + default: + var maybeName = value.a; + var isClosed = value.b; + var valueList = value.c; + switch (msg.$) { + case 'Toggle': + return A3($elm$browser$Debugger$Expando$Constructor, maybeName, !isClosed, valueList); + case 'Index': + if (msg.a.$ === 'None') { + var _v10 = msg.a; + var index = msg.b; + var subMsg = msg.c; + return A3( + $elm$browser$Debugger$Expando$Constructor, + maybeName, + isClosed, + A3( + $elm$browser$Debugger$Expando$updateIndex, + index, + $elm$browser$Debugger$Expando$update(subMsg), + valueList)); + } else { + return value; + } + default: + return value; + } + } + }); +var $elm$browser$Debugger$Expando$updateField = F2( + function (msg, maybeExpando) { + if (maybeExpando.$ === 'Nothing') { + return maybeExpando; + } else { + var expando = maybeExpando.a; + return $elm$core$Maybe$Just( + A2($elm$browser$Debugger$Expando$update, msg, expando)); + } + }); +var $elm$browser$Debugger$Main$Upload = function (a) { + return {$: 'Upload', a: a}; +}; +var $elm$browser$Debugger$Main$upload = function (popout) { + return A2( + $elm$core$Task$perform, + $elm$browser$Debugger$Main$Upload, + _Debugger_upload(popout)); +}; +var $elm$browser$Debugger$Overlay$BadMetadata = function (a) { + return {$: 'BadMetadata', a: a}; +}; +var $elm$browser$Debugger$Overlay$badMetadata = $elm$browser$Debugger$Overlay$BadMetadata; +var $elm$browser$Debugger$Main$withGoodMetadata = F2( + function (model, func) { + var _v0 = model.metadata; + if (_v0.$ === 'Ok') { + var metadata = _v0.a; + return func(metadata); + } else { + var error = _v0.a; + return _Utils_Tuple2( + _Utils_update( + model, + { + overlay: $elm$browser$Debugger$Overlay$badMetadata(error) + }), + $elm$core$Platform$Cmd$none); + } + }); +var $elm$browser$Debugger$Main$wrapUpdate = F3( + function (update, msg, model) { + wrapUpdate: + while (true) { + switch (msg.$) { + case 'NoOp': + return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none); + case 'UserMsg': + var userMsg = msg.a; + var userModel = $elm$browser$Debugger$Main$getLatestModel(model.state); + var newHistory = A3($elm$browser$Debugger$History$add, userMsg, userModel, model.history); + var _v1 = A2(update, userMsg, userModel); + var newUserModel = _v1.a; + var userCmds = _v1.b; + var commands = A2($elm$core$Platform$Cmd$map, $elm$browser$Debugger$Main$UserMsg, userCmds); + var _v2 = model.state; + if (_v2.$ === 'Running') { + return _Utils_Tuple2( + _Utils_update( + model, + { + expandoModel: A2($elm$browser$Debugger$Expando$merge, newUserModel, model.expandoModel), + expandoMsg: A2($elm$browser$Debugger$Expando$merge, userMsg, model.expandoMsg), + history: newHistory, + state: $elm$browser$Debugger$Main$Running(newUserModel) + }), + $elm$core$Platform$Cmd$batch( + _List_fromArray( + [ + commands, + $elm$browser$Debugger$Main$scroll(model.popout) + ]))); + } else { + var index = _v2.a; + var indexModel = _v2.b; + var history = _v2.e; + return _Utils_Tuple2( + _Utils_update( + model, + { + history: newHistory, + state: A5($elm$browser$Debugger$Main$Paused, index, indexModel, newUserModel, userMsg, history) + }), + commands); + } + case 'TweakExpandoMsg': + var eMsg = msg.a; + return _Utils_Tuple2( + _Utils_update( + model, + { + expandoMsg: A2($elm$browser$Debugger$Expando$update, eMsg, model.expandoMsg) + }), + $elm$core$Platform$Cmd$none); + case 'TweakExpandoModel': + var eMsg = msg.a; + return _Utils_Tuple2( + _Utils_update( + model, + { + expandoModel: A2($elm$browser$Debugger$Expando$update, eMsg, model.expandoModel) + }), + $elm$core$Platform$Cmd$none); + case 'Resume': + var _v3 = model.state; + if (_v3.$ === 'Running') { + return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none); + } else { + var userModel = _v3.c; + var userMsg = _v3.d; + return _Utils_Tuple2( + _Utils_update( + model, + { + expandoModel: A2($elm$browser$Debugger$Expando$merge, userModel, model.expandoModel), + expandoMsg: A2($elm$browser$Debugger$Expando$merge, userMsg, model.expandoMsg), + state: $elm$browser$Debugger$Main$Running(userModel) + }), + $elm$browser$Debugger$Main$scroll(model.popout)); + } + case 'Jump': + var index = msg.a; + return _Utils_Tuple2( + A3($elm$browser$Debugger$Main$jumpUpdate, update, index, model), + $elm$core$Platform$Cmd$none); + case 'SliderJump': + var index = msg.a; + return _Utils_Tuple2( + A3($elm$browser$Debugger$Main$jumpUpdate, update, index, model), + A2( + $elm$browser$Debugger$Main$scrollTo, + $elm$browser$Debugger$History$idForMessageIndex(index), + model.popout)); + case 'Open': + return _Utils_Tuple2( + model, + A2( + $elm$core$Task$perform, + $elm$core$Basics$always($elm$browser$Debugger$Main$NoOp), + _Debugger_open(model.popout))); + case 'Up': + var _v4 = model.state; + if (_v4.$ === 'Running') { + return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none); + } else { + var i = _v4.a; + var history = _v4.e; + var targetIndex = i + 1; + if (_Utils_cmp( + targetIndex, + $elm$browser$Debugger$History$size(history)) < 0) { + var $temp$update = update, + $temp$msg = $elm$browser$Debugger$Main$SliderJump(targetIndex), + $temp$model = model; + update = $temp$update; + msg = $temp$msg; + model = $temp$model; + continue wrapUpdate; + } else { + var $temp$update = update, + $temp$msg = $elm$browser$Debugger$Main$Resume, + $temp$model = model; + update = $temp$update; + msg = $temp$msg; + model = $temp$model; + continue wrapUpdate; + } + } + case 'Down': + var _v5 = model.state; + if (_v5.$ === 'Running') { + var $temp$update = update, + $temp$msg = $elm$browser$Debugger$Main$Jump( + $elm$browser$Debugger$History$size(model.history) - 1), + $temp$model = model; + update = $temp$update; + msg = $temp$msg; + model = $temp$model; + continue wrapUpdate; + } else { + var index = _v5.a; + if (index > 0) { + var $temp$update = update, + $temp$msg = $elm$browser$Debugger$Main$SliderJump(index - 1), + $temp$model = model; + update = $temp$update; + msg = $temp$msg; + model = $temp$model; + continue wrapUpdate; + } else { + return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none); + } + } + case 'Import': + return A2( + $elm$browser$Debugger$Main$withGoodMetadata, + model, + function (_v6) { + return _Utils_Tuple2( + model, + $elm$browser$Debugger$Main$upload(model.popout)); + }); + case 'Export': + return A2( + $elm$browser$Debugger$Main$withGoodMetadata, + model, + function (metadata) { + return _Utils_Tuple2( + model, + A2($elm$browser$Debugger$Main$download, metadata, model.history)); + }); + case 'Upload': + var jsonString = msg.a; + return A2( + $elm$browser$Debugger$Main$withGoodMetadata, + model, + function (metadata) { + var _v7 = A2($elm$browser$Debugger$Overlay$assessImport, metadata, jsonString); + if (_v7.$ === 'Err') { + var newOverlay = _v7.a; + return _Utils_Tuple2( + _Utils_update( + model, + {overlay: newOverlay}), + $elm$core$Platform$Cmd$none); + } else { + var rawHistory = _v7.a; + return A3($elm$browser$Debugger$Main$loadNewHistory, rawHistory, update, model); + } + }); + case 'OverlayMsg': + var overlayMsg = msg.a; + var _v8 = A2($elm$browser$Debugger$Overlay$close, overlayMsg, model.overlay); + if (_v8.$ === 'Nothing') { + return _Utils_Tuple2( + _Utils_update( + model, + {overlay: $elm$browser$Debugger$Overlay$none}), + $elm$core$Platform$Cmd$none); + } else { + var rawHistory = _v8.a; + return A3($elm$browser$Debugger$Main$loadNewHistory, rawHistory, update, model); + } + case 'SwapLayout': + return _Utils_Tuple2( + _Utils_update( + model, + { + layout: $elm$browser$Debugger$Main$swapLayout(model.layout) + }), + $elm$core$Platform$Cmd$none); + case 'DragStart': + return _Utils_Tuple2( + _Utils_update( + model, + { + layout: A2($elm$browser$Debugger$Main$setDragStatus, $elm$browser$Debugger$Main$Moving, model.layout) + }), + $elm$core$Platform$Cmd$none); + case 'Drag': + var info = msg.a; + return _Utils_Tuple2( + _Utils_update( + model, + { + layout: A2($elm$browser$Debugger$Main$drag, info, model.layout) + }), + $elm$core$Platform$Cmd$none); + default: + return _Utils_Tuple2( + _Utils_update( + model, + { + layout: A2($elm$browser$Debugger$Main$setDragStatus, $elm$browser$Debugger$Main$Static, model.layout) + }), + $elm$core$Platform$Cmd$none); + } + } + }); +var $elm$browser$Browser$External = function (a) { + return {$: 'External', a: a}; +}; +var $elm$browser$Browser$Internal = function (a) { + return {$: 'Internal', a: a}; +}; +var $elm$browser$Browser$Dom$NotFound = function (a) { + return {$: 'NotFound', a: a}; +}; +var $elm$url$Url$Http = {$: 'Http'}; +var $elm$url$Url$Https = {$: 'Https'}; +var $elm$url$Url$Url = F6( + function (protocol, host, port_, path, query, fragment) { + return {fragment: fragment, host: host, path: path, port_: port_, protocol: protocol, query: query}; + }); +var $elm$core$String$dropLeft = F2( + function (n, string) { + return (n < 1) ? string : A3( + $elm$core$String$slice, + n, + $elm$core$String$length(string), + string); + }); +var $elm$core$String$indexes = _String_indexes; +var $elm$core$String$isEmpty = function (string) { + return string === ''; +}; +var $elm$url$Url$chompBeforePath = F5( + function (protocol, path, params, frag, str) { + if ($elm$core$String$isEmpty(str) || A2($elm$core$String$contains, '@', str)) { + return $elm$core$Maybe$Nothing; + } else { + var _v0 = A2($elm$core$String$indexes, ':', str); + if (!_v0.b) { + return $elm$core$Maybe$Just( + A6($elm$url$Url$Url, protocol, str, $elm$core$Maybe$Nothing, path, params, frag)); + } else { + if (!_v0.b.b) { + var i = _v0.a; + var _v1 = $elm$core$String$toInt( + A2($elm$core$String$dropLeft, i + 1, str)); + if (_v1.$ === 'Nothing') { + return $elm$core$Maybe$Nothing; + } else { + var port_ = _v1; + return $elm$core$Maybe$Just( + A6( + $elm$url$Url$Url, + protocol, + A2($elm$core$String$left, i, str), + port_, + path, + params, + frag)); + } + } else { + return $elm$core$Maybe$Nothing; + } + } + } + }); +var $elm$url$Url$chompBeforeQuery = F4( + function (protocol, params, frag, str) { + if ($elm$core$String$isEmpty(str)) { + return $elm$core$Maybe$Nothing; + } else { + var _v0 = A2($elm$core$String$indexes, '/', str); + if (!_v0.b) { + return A5($elm$url$Url$chompBeforePath, protocol, '/', params, frag, str); + } else { + var i = _v0.a; + return A5( + $elm$url$Url$chompBeforePath, + protocol, + A2($elm$core$String$dropLeft, i, str), + params, + frag, + A2($elm$core$String$left, i, str)); + } + } + }); +var $elm$url$Url$chompBeforeFragment = F3( + function (protocol, frag, str) { + if ($elm$core$String$isEmpty(str)) { + return $elm$core$Maybe$Nothing; + } else { + var _v0 = A2($elm$core$String$indexes, '?', str); + if (!_v0.b) { + return A4($elm$url$Url$chompBeforeQuery, protocol, $elm$core$Maybe$Nothing, frag, str); + } else { + var i = _v0.a; + return A4( + $elm$url$Url$chompBeforeQuery, + protocol, + $elm$core$Maybe$Just( + A2($elm$core$String$dropLeft, i + 1, str)), + frag, + A2($elm$core$String$left, i, str)); + } + } + }); +var $elm$url$Url$chompAfterProtocol = F2( + function (protocol, str) { + if ($elm$core$String$isEmpty(str)) { + return $elm$core$Maybe$Nothing; + } else { + var _v0 = A2($elm$core$String$indexes, '#', str); + if (!_v0.b) { + return A3($elm$url$Url$chompBeforeFragment, protocol, $elm$core$Maybe$Nothing, str); + } else { + var i = _v0.a; + return A3( + $elm$url$Url$chompBeforeFragment, + protocol, + $elm$core$Maybe$Just( + A2($elm$core$String$dropLeft, i + 1, str)), + A2($elm$core$String$left, i, str)); + } + } + }); +var $elm$core$String$startsWith = _String_startsWith; +var $elm$url$Url$fromString = function (str) { + return A2($elm$core$String$startsWith, 'http://', str) ? A2( + $elm$url$Url$chompAfterProtocol, + $elm$url$Url$Http, + A2($elm$core$String$dropLeft, 7, str)) : (A2($elm$core$String$startsWith, 'https://', str) ? A2( + $elm$url$Url$chompAfterProtocol, + $elm$url$Url$Https, + A2($elm$core$String$dropLeft, 8, str)) : $elm$core$Maybe$Nothing); +}; +var $elm$core$Basics$never = function (_v0) { + never: + while (true) { + var nvr = _v0.a; + var $temp$_v0 = nvr; + _v0 = $temp$_v0; + continue never; + } +}; +var $elm$browser$Browser$element = _Browser_element; +var $elm$core$Platform$Sub$batch = _Platform_batch; +var $elm$core$Platform$Sub$none = $elm$core$Platform$Sub$batch(_List_Nil); +var $author$project$Entry$ItemEditor = function (a) { + return {$: 'ItemEditor', a: a}; +}; +var $author$project$Entry$ReceiveSearchResults = function (a) { + return {$: 'ReceiveSearchResults', a: a}; +}; +var $elm$http$Http$BadStatus_ = F2( + function (a, b) { + return {$: 'BadStatus_', a: a, b: b}; + }); +var $elm$http$Http$BadUrl_ = function (a) { + return {$: 'BadUrl_', a: a}; +}; +var $elm$http$Http$GoodStatus_ = F2( + function (a, b) { + return {$: 'GoodStatus_', a: a, b: b}; + }); +var $elm$http$Http$NetworkError_ = {$: 'NetworkError_'}; +var $elm$http$Http$Receiving = function (a) { + return {$: 'Receiving', a: a}; +}; +var $elm$http$Http$Sending = function (a) { + return {$: 'Sending', a: a}; +}; +var $elm$http$Http$Timeout_ = {$: 'Timeout_'}; +var $elm$core$Maybe$isJust = function (maybe) { + if (maybe.$ === 'Just') { + return true; + } else { + return false; + } +}; +var $elm$core$Platform$sendToSelf = _Platform_sendToSelf; +var $elm$http$Http$expectStringResponse = F2( + function (toMsg, toResult) { + return A3( + _Http_expect, + '', + $elm$core$Basics$identity, + A2($elm$core$Basics$composeR, toResult, toMsg)); + }); +var $elm$core$Result$mapError = F2( + function (f, result) { + if (result.$ === 'Ok') { + var v = result.a; + return $elm$core$Result$Ok(v); + } else { + var e = result.a; + return $elm$core$Result$Err( + f(e)); + } + }); +var $elm$http$Http$BadBody = function (a) { + return {$: 'BadBody', a: a}; +}; +var $elm$http$Http$BadStatus = function (a) { + return {$: 'BadStatus', a: a}; +}; +var $elm$http$Http$BadUrl = function (a) { + return {$: 'BadUrl', a: a}; +}; +var $elm$http$Http$NetworkError = {$: 'NetworkError'}; +var $elm$http$Http$Timeout = {$: 'Timeout'}; +var $elm$http$Http$resolve = F2( + function (toResult, response) { + switch (response.$) { + case 'BadUrl_': + var url = response.a; + return $elm$core$Result$Err( + $elm$http$Http$BadUrl(url)); + case 'Timeout_': + return $elm$core$Result$Err($elm$http$Http$Timeout); + case 'NetworkError_': + return $elm$core$Result$Err($elm$http$Http$NetworkError); + case 'BadStatus_': + var metadata = response.a; + return $elm$core$Result$Err( + $elm$http$Http$BadStatus(metadata.statusCode)); + default: + var body = response.b; + return A2( + $elm$core$Result$mapError, + $elm$http$Http$BadBody, + toResult(body)); + } + }); +var $elm$http$Http$expectJson = F2( + function (toMsg, decoder) { + return A2( + $elm$http$Http$expectStringResponse, + toMsg, + $elm$http$Http$resolve( + function (string) { + return A2( + $elm$core$Result$mapError, + $elm$json$Json$Decode$errorToString, + A2($elm$json$Json$Decode$decodeString, decoder, string)); + })); + }); +var $elm$http$Http$emptyBody = _Http_emptyBody; +var $elm$http$Http$Request = function (a) { + return {$: 'Request', a: a}; +}; +var $elm$http$Http$State = F2( + function (reqs, subs) { + return {reqs: reqs, subs: subs}; + }); +var $elm$http$Http$init = $elm$core$Task$succeed( + A2($elm$http$Http$State, $elm$core$Dict$empty, _List_Nil)); +var $elm$core$Process$kill = _Scheduler_kill; +var $elm$core$Process$spawn = _Scheduler_spawn; +var $elm$http$Http$updateReqs = F3( + function (router, cmds, reqs) { + updateReqs: + while (true) { + if (!cmds.b) { + return $elm$core$Task$succeed(reqs); + } else { + var cmd = cmds.a; + var otherCmds = cmds.b; + if (cmd.$ === 'Cancel') { + var tracker = cmd.a; + var _v2 = A2($elm$core$Dict$get, tracker, reqs); + if (_v2.$ === 'Nothing') { + var $temp$router = router, + $temp$cmds = otherCmds, + $temp$reqs = reqs; + router = $temp$router; + cmds = $temp$cmds; + reqs = $temp$reqs; + continue updateReqs; + } else { + var pid = _v2.a; + return A2( + $elm$core$Task$andThen, + function (_v3) { + return A3( + $elm$http$Http$updateReqs, + router, + otherCmds, + A2($elm$core$Dict$remove, tracker, reqs)); + }, + $elm$core$Process$kill(pid)); + } + } else { + var req = cmd.a; + return A2( + $elm$core$Task$andThen, + function (pid) { + var _v4 = req.tracker; + if (_v4.$ === 'Nothing') { + return A3($elm$http$Http$updateReqs, router, otherCmds, reqs); + } else { + var tracker = _v4.a; + return A3( + $elm$http$Http$updateReqs, + router, + otherCmds, + A3($elm$core$Dict$insert, tracker, pid, reqs)); + } + }, + $elm$core$Process$spawn( + A3( + _Http_toTask, + router, + $elm$core$Platform$sendToApp(router), + req))); + } + } + } + }); +var $elm$http$Http$onEffects = F4( + function (router, cmds, subs, state) { + return A2( + $elm$core$Task$andThen, + function (reqs) { + return $elm$core$Task$succeed( + A2($elm$http$Http$State, reqs, subs)); + }, + A3($elm$http$Http$updateReqs, router, cmds, state.reqs)); + }); +var $elm$http$Http$maybeSend = F4( + function (router, desiredTracker, progress, _v0) { + var actualTracker = _v0.a; + var toMsg = _v0.b; + return _Utils_eq(desiredTracker, actualTracker) ? $elm$core$Maybe$Just( + A2( + $elm$core$Platform$sendToApp, + router, + toMsg(progress))) : $elm$core$Maybe$Nothing; + }); +var $elm$http$Http$onSelfMsg = F3( + function (router, _v0, state) { + var tracker = _v0.a; + var progress = _v0.b; + return A2( + $elm$core$Task$andThen, + function (_v1) { + return $elm$core$Task$succeed(state); + }, + $elm$core$Task$sequence( + A2( + $elm$core$List$filterMap, + A3($elm$http$Http$maybeSend, router, tracker, progress), + state.subs))); + }); +var $elm$http$Http$Cancel = function (a) { + return {$: 'Cancel', a: a}; +}; +var $elm$http$Http$cmdMap = F2( + function (func, cmd) { + if (cmd.$ === 'Cancel') { + var tracker = cmd.a; + return $elm$http$Http$Cancel(tracker); + } else { + var r = cmd.a; + return $elm$http$Http$Request( + { + allowCookiesFromOtherDomains: r.allowCookiesFromOtherDomains, + body: r.body, + expect: A2(_Http_mapExpect, func, r.expect), + headers: r.headers, + method: r.method, + timeout: r.timeout, + tracker: r.tracker, + url: r.url + }); + } + }); +var $elm$http$Http$MySub = F2( + function (a, b) { + return {$: 'MySub', a: a, b: b}; + }); +var $elm$http$Http$subMap = F2( + function (func, _v0) { + var tracker = _v0.a; + var toMsg = _v0.b; + return A2( + $elm$http$Http$MySub, + tracker, + A2($elm$core$Basics$composeR, toMsg, func)); + }); +_Platform_effectManagers['Http'] = _Platform_createManager($elm$http$Http$init, $elm$http$Http$onEffects, $elm$http$Http$onSelfMsg, $elm$http$Http$cmdMap, $elm$http$Http$subMap); +var $elm$http$Http$command = _Platform_leaf('Http'); +var $elm$http$Http$subscription = _Platform_leaf('Http'); +var $elm$http$Http$request = function (r) { + return $elm$http$Http$command( + $elm$http$Http$Request( + {allowCookiesFromOtherDomains: false, body: r.body, expect: r.expect, headers: r.headers, method: r.method, timeout: r.timeout, tracker: r.tracker, url: r.url})); +}; +var $elm$http$Http$get = function (r) { + return $elm$http$Http$request( + {body: $elm$http$Http$emptyBody, expect: r.expect, headers: _List_Nil, method: 'GET', timeout: $elm$core$Maybe$Nothing, tracker: $elm$core$Maybe$Nothing, url: r.url}); +}; +var $author$project$Entry$SearchResult = function (barcode) { + return function (name) { + return function (netUnitPrice) { + return function (bought) { + return function (salesUnits) { + return function (available) { + return function (locationName) { + return function (locationId) { + return function (groupName) { + return function (groupId) { + return function (taxGroupId) { + return {available: available, barcode: barcode, bought: bought, groupId: groupId, groupName: groupName, locationId: locationId, locationName: locationName, name: name, netUnitPrice: netUnitPrice, salesUnits: salesUnits, taxGroupId: taxGroupId}; + }; + }; + }; + }; + }; + }; + }; + }; + }; + }; +}; +var $elm$json$Json$Decode$bool = _Json_decodeBool; +var $NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$custom = $elm$json$Json$Decode$map2($elm$core$Basics$apR); +var $NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required = F3( + function (key, valDecoder, decoder) { + return A2( + $NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$custom, + A2($elm$json$Json$Decode$field, key, valDecoder), + decoder); + }); +var $author$project$Entry$searchResultDecoder = A3( + $NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required, + 'tax_group_id', + $elm$json$Json$Decode$int, + A3( + $NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required, + 'group_id', + $elm$json$Json$Decode$int, + A3( + $NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required, + 'group_name', + $elm$json$Json$Decode$string, + A3( + $NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required, + 'location_id', + $elm$json$Json$Decode$int, + A3( + $NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required, + 'location_name', + $elm$json$Json$Decode$string, + A3( + $NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required, + 'available', + $elm$json$Json$Decode$bool, + A3( + $NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required, + 'sales_units', + $elm$json$Json$Decode$int, + A3( + $NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required, + 'bought', + $elm$json$Json$Decode$string, + A3( + $NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required, + 'unit_price', + $elm$json$Json$Decode$float, + A3( + $NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required, + 'name', + $elm$json$Json$Decode$string, + A3( + $NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required, + 'item_barcode', + $elm$json$Json$Decode$string, + $elm$json$Json$Decode$succeed($author$project$Entry$SearchResult)))))))))))); +var $elm$core$String$toFloat = _String_toFloat; +var $author$project$Entry$updateState = F3( + function (msg, globals, state) { + if (state.$ === 'ItemSearch') { + var model = state.a; + _v1$4: + while (true) { + switch (msg.$) { + case 'SetSearchTerm': + var searchTerm = msg.a; + return _Utils_Tuple2( + $author$project$Entry$ItemSearch( + _Utils_update( + model, + {searchTerm: searchTerm})), + $elm$core$Platform$Cmd$none); + case 'SubmitSearch': + return _Utils_Tuple2( + state, + $elm$http$Http$get( + { + expect: A2( + $elm$http$Http$expectJson, + $author$project$Entry$ReceiveSearchResults, + $elm$json$Json$Decode$list($author$project$Entry$searchResultDecoder)), + url: '/entry/api/search-items?search-term=' + model.searchTerm + })); + case 'ReceiveSearchResults': + if (msg.a.$ === 'Ok') { + var searchResults = msg.a.a; + return _Utils_Tuple2( + $author$project$Entry$ItemSearch( + _Utils_update( + model, + {searchResults: searchResults})), + $elm$core$Platform$Cmd$none); + } else { + break _v1$4; + } + case 'GotoItemEditor': + var searchResult = msg.a; + return _Utils_Tuple2( + $author$project$Entry$ItemEditor( + {barcode: searchResult.barcode, groupId: searchResult.groupId, locationId: searchResult.locationId, name: searchResult.name, netUnitPrice: searchResult.netUnitPrice, salesUnits: searchResult.salesUnits, taxGroupId: searchResult.taxGroupId}), + $elm$core$Platform$Cmd$none); + default: + break _v1$4; + } + } + return _Utils_Tuple2(state, $elm$core$Platform$Cmd$none); + } else { + var model = state.a; + switch (msg.$) { + case 'SetNetUnitPrice': + var netUnitPriceStr = msg.a; + var _v3 = $elm$core$String$toFloat(netUnitPriceStr); + if (_v3.$ === 'Nothing') { + return _Utils_Tuple2(state, $elm$core$Platform$Cmd$none); + } else { + var netUnitPrice = _v3.a; + return _Utils_Tuple2( + $author$project$Entry$ItemEditor( + _Utils_update( + model, + {netUnitPrice: netUnitPrice})), + $elm$core$Platform$Cmd$none); + } + case 'SetGroupId': + var groupIdStr = msg.a; + var _v4 = $elm$core$String$toInt(groupIdStr); + if (_v4.$ === 'Nothing') { + return _Utils_Tuple2(state, $elm$core$Platform$Cmd$none); + } else { + var groupId = _v4.a; + return _Utils_Tuple2( + $author$project$Entry$ItemEditor( + _Utils_update( + model, + {groupId: groupId})), + $elm$core$Platform$Cmd$none); + } + case 'SetLocationId': + var locationIdStr = msg.a; + var _v5 = $elm$core$String$toInt(locationIdStr); + if (_v5.$ === 'Nothing') { + return _Utils_Tuple2(state, $elm$core$Platform$Cmd$none); + } else { + var locationId = _v5.a; + return _Utils_Tuple2( + $author$project$Entry$ItemEditor( + _Utils_update( + model, + {locationId: locationId})), + $elm$core$Platform$Cmd$none); + } + case 'SetTaxGroupId': + var taxGroupIdStr = msg.a; + var _v6 = $elm$core$String$toInt(taxGroupIdStr); + if (_v6.$ === 'Nothing') { + return _Utils_Tuple2(state, $elm$core$Platform$Cmd$none); + } else { + var taxGroupId = _v6.a; + return _Utils_Tuple2( + $author$project$Entry$ItemEditor( + _Utils_update( + model, + {taxGroupId: taxGroupId})), + $elm$core$Platform$Cmd$none); + } + case 'SetBarcode': + var barcode = msg.a; + return _Utils_Tuple2( + $author$project$Entry$ItemEditor( + _Utils_update( + model, + {barcode: barcode})), + $elm$core$Platform$Cmd$none); + case 'SetName': + var name = msg.a; + return _Utils_Tuple2( + $author$project$Entry$ItemEditor( + _Utils_update( + model, + {name: name})), + $elm$core$Platform$Cmd$none); + case 'SetSalesUnits': + var salesUnitsStr = msg.a; + var _v7 = $elm$core$String$toInt(salesUnitsStr); + if (_v7.$ === 'Nothing') { + return _Utils_Tuple2(state, $elm$core$Platform$Cmd$none); + } else { + var salesUnits = _v7.a; + return _Utils_Tuple2( + $author$project$Entry$ItemEditor( + _Utils_update( + model, + {salesUnits: salesUnits})), + $elm$core$Platform$Cmd$none); + } + default: + return _Utils_Tuple2(state, $elm$core$Platform$Cmd$none); + } + } + }); +var $author$project$Entry$update = F2( + function (msg, _v0) { + var globals = _v0.globals; + var state = _v0.state; + var _v1 = A3($author$project$Entry$updateState, msg, globals, state); + var state_ = _v1.a; + var cmd = _v1.b; + return _Utils_Tuple2( + {globals: globals, state: state_}, + cmd); + }); +var $author$project$Entry$SetBarcode = function (a) { + return {$: 'SetBarcode', a: a}; +}; +var $author$project$Entry$SetGroupId = function (a) { + return {$: 'SetGroupId', a: a}; +}; +var $author$project$Entry$SetLocationId = function (a) { + return {$: 'SetLocationId', a: a}; +}; +var $author$project$Entry$SetName = function (a) { + return {$: 'SetName', a: a}; +}; +var $author$project$Entry$SetNetUnitPrice = function (a) { + return {$: 'SetNetUnitPrice', a: a}; +}; +var $author$project$Entry$SetSalesUnits = function (a) { + return {$: 'SetSalesUnits', a: a}; +}; +var $author$project$Entry$SetSearchTerm = function (a) { + return {$: 'SetSearchTerm', a: a}; +}; +var $author$project$Entry$SetTaxGroupId = function (a) { + return {$: 'SetTaxGroupId', a: a}; +}; +var $author$project$Entry$SubmitSearch = {$: 'SubmitSearch'}; +var $elm$core$Basics$pow = _Basics_pow; +var $elm$core$Basics$round = _Basics_round; +var $author$project$Entry$roundTo = F2( + function (places, x) { + return $elm$core$Basics$round( + x * A2($elm$core$Basics$pow, 10, places)) / A2($elm$core$Basics$pow, 10, places); + }); +var $author$project$Entry$calculateGarfieldPrice = F2( + function (netUnitPrice, taxPercentage) { + return A2($author$project$Entry$roundTo, 2, (netUnitPrice * (1 + taxPercentage)) + 0.01); + }); +var $elm$json$Json$Encode$bool = _Json_wrap; +var $elm$html$Html$Attributes$boolProperty = F2( + function (key, bool) { + return A2( + _VirtualDom_property, + key, + $elm$json$Json$Encode$bool(bool)); + }); +var $elm$html$Html$Attributes$disabled = $elm$html$Html$Attributes$boolProperty('disabled'); +var $elm$html$Html$fieldset = _VirtualDom_node('fieldset'); +var $elm$core$List$filter = F2( + function (isGood, list) { + return A3( + $elm$core$List$foldr, + F2( + function (x, xs) { + return isGood(x) ? A2($elm$core$List$cons, x, xs) : xs; + }), + _List_Nil, + list); + }); +var $elm$core$List$head = function (list) { + if (list.b) { + var x = list.a; + var xs = list.b; + return $elm$core$Maybe$Just(x); + } else { + return $elm$core$Maybe$Nothing; + } +}; +var $author$project$Entry$find = F2( + function (pred, xs) { + return $elm$core$List$head( + A2($elm$core$List$filter, pred, xs)); + }); +var $elm$html$Html$Attributes$for = $elm$html$Html$Attributes$stringProperty('htmlFor'); +var $elm$html$Html$form = _VirtualDom_node('form'); +var $elm$html$Html$label = _VirtualDom_node('label'); +var $elm$html$Html$legend = _VirtualDom_node('legend'); +var $elm$html$Html$Events$alwaysPreventDefault = function (msg) { + return _Utils_Tuple2(msg, true); +}; +var $elm$virtual_dom$VirtualDom$MayPreventDefault = function (a) { + return {$: 'MayPreventDefault', a: a}; +}; +var $elm$html$Html$Events$preventDefaultOn = F2( + function (event, decoder) { + return A2( + $elm$virtual_dom$VirtualDom$on, + event, + $elm$virtual_dom$VirtualDom$MayPreventDefault(decoder)); + }); +var $elm$html$Html$Events$onSubmit = function (msg) { + return A2( + $elm$html$Html$Events$preventDefaultOn, + 'submit', + A2( + $elm$json$Json$Decode$map, + $elm$html$Html$Events$alwaysPreventDefault, + $elm$json$Json$Decode$succeed(msg))); +}; +var $elm$html$Html$th = _VirtualDom_node('th'); +var $elm$html$Html$tr = _VirtualDom_node('tr'); +var $author$project$Entry$searchResultHeaders = A2( + $elm$html$Html$tr, + _List_Nil, + _List_fromArray( + [ + A2( + $elm$html$Html$th, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text('Barcode') + ])), + A2( + $elm$html$Html$th, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text('Name') + ])), + A2( + $elm$html$Html$th, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text('Gruppe') + ])), + A2( + $elm$html$Html$th, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text('Stückpreis (Netto)') + ])), + A2( + $elm$html$Html$th, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text('Eingekauft') + ])), + A2( + $elm$html$Html$th, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text('Kaufdatum') + ])), + A2( + $elm$html$Html$th, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text('Raum') + ])), + A2( + $elm$html$Html$th, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text('Aktiv?') + ])), + A2($elm$html$Html$th, _List_Nil, _List_Nil) + ])); +var $elm$html$Html$Attributes$step = function (n) { + return A2($elm$html$Html$Attributes$stringProperty, 'step', n); +}; +var $elm$html$Html$table = _VirtualDom_node('table'); +var $author$project$Entry$GotoItemEditor = function (a) { + return {$: 'GotoItemEditor', a: a}; +}; +var $author$project$Entry$showBool = function (b) { + if (b) { + return '✅'; + } else { + return '❌'; + } +}; +var $elm$html$Html$td = _VirtualDom_node('td'); +var $author$project$Entry$viewSearchResult = function (model) { + return A2( + $elm$html$Html$tr, + _List_Nil, + _List_fromArray( + [ + A2( + $elm$html$Html$td, + _List_Nil, + _List_fromArray( + [ + A2( + $elm$html$Html$code, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text(model.barcode) + ])) + ])), + A2( + $elm$html$Html$td, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text(model.name) + ])), + A2( + $elm$html$Html$td, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text(model.groupName) + ])), + A2( + $elm$html$Html$td, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text( + $elm$core$String$fromFloat(model.netUnitPrice)) + ])), + A2( + $elm$html$Html$td, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text( + $elm$core$String$fromInt(model.salesUnits)) + ])), + A2( + $elm$html$Html$td, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text(model.bought) + ])), + A2( + $elm$html$Html$td, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text(model.locationName) + ])), + A2( + $elm$html$Html$td, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text( + $author$project$Entry$showBool(model.available)) + ])), + A2( + $elm$html$Html$td, + _List_Nil, + _List_fromArray( + [ + A2( + $elm$html$Html$button, + _List_fromArray( + [ + $elm$html$Html$Events$onClick( + $author$project$Entry$GotoItemEditor(model)) + ]), + _List_fromArray( + [ + $elm$html$Html$text('Als Vorlage verwenden') + ])) + ])) + ])); +}; +var $elm$html$Html$option = _VirtualDom_node('option'); +var $elm$html$Html$select = _VirtualDom_node('select'); +var $elm$html$Html$Attributes$selected = $elm$html$Html$Attributes$boolProperty('selected'); +var $author$project$Entry$viewSelect = F6( + function (selectAttributes, showValue, getValue, getLabel, selectedValue, xs) { + var viewOption = function (x) { + return A2( + $elm$html$Html$option, + _List_fromArray( + [ + $elm$html$Html$Attributes$value( + showValue( + getValue(x))), + $elm$html$Html$Attributes$selected( + _Utils_eq( + getValue(x), + selectedValue)) + ]), + _List_fromArray( + [ + $elm$html$Html$text( + getLabel(x)) + ])); + }; + return A2( + $elm$html$Html$select, + selectAttributes, + A2($elm$core$List$map, viewOption, xs)); + }); +var $author$project$Entry$view = function (_v0) { + var globals = _v0.globals; + var state = _v0.state; + if (state.$ === 'ItemSearch') { + var model = state.a; + return A2( + $elm$html$Html$fieldset, + _List_Nil, + _List_fromArray( + [ + A2( + $elm$html$Html$legend, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text('Vorlage für neuen Inventareintrag') + ])), + A2( + $elm$html$Html$form, + _List_fromArray( + [ + $elm$html$Html$Events$onSubmit($author$project$Entry$SubmitSearch) + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('form-input') + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$label, + _List_fromArray( + [ + $elm$html$Html$Attributes$for('search-term'), + $elm$html$Html$Attributes$title('Barcode oder Name') + ]), + _List_fromArray( + [ + $elm$html$Html$text('Suchbegriff') + ])), + A2( + $elm$html$Html$input, + _List_fromArray( + [ + $elm$html$Html$Events$onInput($author$project$Entry$SetSearchTerm), + $elm$html$Html$Attributes$value(model.searchTerm), + $elm$html$Html$Attributes$id('search-term') + ]), + _List_Nil) + ])), + A2( + $elm$html$Html$table, + _List_Nil, + A2( + $elm$core$List$cons, + $author$project$Entry$searchResultHeaders, + A2($elm$core$List$map, $author$project$Entry$viewSearchResult, model.searchResults))) + ])) + ])); + } else { + var model = state.a; + var _v2 = A2( + $author$project$Entry$find, + function (tg) { + return _Utils_eq(tg.id, model.taxGroupId); + }, + globals.taxGroups); + if (_v2.$ === 'Nothing') { + return A2( + $elm$html$Html$div, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text('index error, this should never happen') + ])); + } else { + var selectedTaxGroup = _v2.a; + return A2( + $elm$html$Html$form, + _List_Nil, + _List_fromArray( + [ + A2( + $elm$html$Html$fieldset, + _List_Nil, + _List_fromArray( + [ + A2( + $elm$html$Html$legend, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text('Neuer Inventareintrag') + ])), + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('form-input') + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$label, + _List_fromArray( + [ + $elm$html$Html$Attributes$for('barcode') + ]), + _List_fromArray( + [ + $elm$html$Html$text('Barcode') + ])), + A2( + $elm$html$Html$input, + _List_fromArray( + [ + $elm$html$Html$Events$onInput($author$project$Entry$SetBarcode), + $elm$html$Html$Attributes$value(model.barcode), + $elm$html$Html$Attributes$disabled(true), + $elm$html$Html$Attributes$id('barcode') + ]), + _List_Nil) + ])), + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('form-input') + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$label, + _List_fromArray( + [ + $elm$html$Html$Attributes$for('name') + ]), + _List_fromArray( + [ + $elm$html$Html$text('Name') + ])), + A2( + $elm$html$Html$input, + _List_fromArray( + [ + $elm$html$Html$Events$onInput($author$project$Entry$SetName), + $elm$html$Html$Attributes$value(model.name), + $elm$html$Html$Attributes$id('name') + ]), + _List_Nil) + ])), + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('form-input') + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$label, + _List_fromArray( + [ + $elm$html$Html$Attributes$for('sales-units') + ]), + _List_fromArray( + [ + $elm$html$Html$text('Stückzahl') + ])), + A2( + $elm$html$Html$input, + _List_fromArray( + [ + $elm$html$Html$Events$onInput($author$project$Entry$SetSalesUnits), + $elm$html$Html$Attributes$value( + $elm$core$String$fromInt(model.salesUnits)), + $elm$html$Html$Attributes$id('sales-units'), + $elm$html$Html$Attributes$type_('number') + ]), + _List_Nil) + ])), + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('form-input') + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$label, + _List_fromArray( + [ + $elm$html$Html$Attributes$for('group') + ]), + _List_fromArray( + [ + $elm$html$Html$text('Gruppe') + ])), + A6( + $author$project$Entry$viewSelect, + _List_fromArray( + [ + $elm$html$Html$Events$onInput($author$project$Entry$SetGroupId), + $elm$html$Html$Attributes$id('group') + ]), + $elm$core$String$fromInt, + function ($) { + return $.id; + }, + function ($) { + return $.name; + }, + model.groupId, + globals.groups) + ])), + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('form-input') + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$label, + _List_fromArray( + [ + $elm$html$Html$Attributes$for('location') + ]), + _List_fromArray( + [ + $elm$html$Html$text('Raum') + ])), + A6( + $author$project$Entry$viewSelect, + _List_fromArray( + [ + $elm$html$Html$Events$onInput($author$project$Entry$SetLocationId), + $elm$html$Html$Attributes$id('location') + ]), + $elm$core$String$fromInt, + function ($) { + return $.id; + }, + function ($) { + return $.name; + }, + model.locationId, + globals.locations) + ])), + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('form-input') + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$label, + _List_fromArray( + [ + $elm$html$Html$Attributes$for('net-unit-price') + ]), + _List_fromArray( + [ + $elm$html$Html$text('Stückpreis (Netto)') + ])), + A2( + $elm$html$Html$input, + _List_fromArray( + [ + $elm$html$Html$Attributes$value( + $elm$core$String$fromFloat(model.netUnitPrice)), + $elm$html$Html$Events$onInput($author$project$Entry$SetNetUnitPrice), + $elm$html$Html$Attributes$type_('number'), + $elm$html$Html$Attributes$id('net-unit-price'), + $elm$html$Html$Attributes$step('0.01') + ]), + _List_Nil) + ])), + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('form-input') + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$label, + _List_fromArray( + [ + $elm$html$Html$Attributes$for('tax-group') + ]), + _List_fromArray( + [ + $elm$html$Html$text('Steuergruppe') + ])), + A6( + $author$project$Entry$viewSelect, + _List_fromArray( + [ + $elm$html$Html$Events$onInput($author$project$Entry$SetTaxGroupId), + $elm$html$Html$Attributes$id('tax-group') + ]), + $elm$core$String$fromInt, + function ($) { + return $.id; + }, + function ($) { + return $.description; + }, + model.taxGroupId, + globals.taxGroups) + ])) + ])), + A2( + $elm$html$Html$fieldset, + _List_Nil, + _List_fromArray( + [ + A2( + $elm$html$Html$legend, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text('Neuer Snackeintrag') + ])), + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('form-input') + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$label, + _List_fromArray( + [ + $elm$html$Html$Attributes$for('snack-name') + ]), + _List_fromArray( + [ + $elm$html$Html$text('Name') + ])), + A2( + $elm$html$Html$input, + _List_fromArray( + [ + $elm$html$Html$Attributes$value(model.name), + $elm$html$Html$Attributes$disabled(true), + $elm$html$Html$Attributes$id('snack-name') + ]), + _List_Nil) + ])), + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('form-input') + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$label, + _List_fromArray( + [ + $elm$html$Html$Attributes$for('gross-unit-price') + ]), + _List_fromArray( + [ + $elm$html$Html$text( + 'Stückpreis (Brutto), Vorschlag: ' + $elm$core$String$fromFloat( + A2($author$project$Entry$calculateGarfieldPrice, model.netUnitPrice, selectedTaxGroup.percentage))) + ])), + A2( + $elm$html$Html$input, + _List_fromArray( + [ + $elm$html$Html$Attributes$value( + $elm$core$String$fromFloat( + A2( + $elm$core$Maybe$withDefault, + A2($author$project$Entry$calculateGarfieldPrice, model.netUnitPrice, selectedTaxGroup.percentage), + $elm$core$Maybe$Nothing))), + $elm$html$Html$Attributes$id('gross-unit-price'), + $elm$html$Html$Attributes$type_('number'), + $elm$html$Html$Attributes$step('0.01') + ]), + _List_Nil) + ])) + ])) + ])); + } + } +}; +var $author$project$Entry$main = $elm$browser$Browser$element( + { + init: function (globals) { + return _Utils_Tuple2( + A2( + $author$project$Entry$Context, + globals, + $author$project$Entry$ItemSearch( + {searchResults: _List_Nil, searchTerm: ''})), + $elm$core$Platform$Cmd$none); + }, + subscriptions: function (_v0) { + return $elm$core$Platform$Sub$none; + }, + update: $author$project$Entry$update, + view: $author$project$Entry$view + }); +_Platform_export({'Entry':{'init':$author$project$Entry$main( + A2( + $elm$json$Json$Decode$andThen, + function (taxGroups) { + return A2( + $elm$json$Json$Decode$andThen, + function (locations) { + return A2( + $elm$json$Json$Decode$andThen, + function (groups) { + return $elm$json$Json$Decode$succeed( + {groups: groups, locations: locations, taxGroups: taxGroups}); + }, + A2( + $elm$json$Json$Decode$field, + 'groups', + $elm$json$Json$Decode$list( + A2( + $elm$json$Json$Decode$andThen, + function (name) { + return A2( + $elm$json$Json$Decode$andThen, + function (id) { + return $elm$json$Json$Decode$succeed( + {id: id, name: name}); + }, + A2($elm$json$Json$Decode$field, 'id', $elm$json$Json$Decode$int)); + }, + A2($elm$json$Json$Decode$field, 'name', $elm$json$Json$Decode$string))))); + }, + A2( + $elm$json$Json$Decode$field, + 'locations', + $elm$json$Json$Decode$list( + A2( + $elm$json$Json$Decode$andThen, + function (name) { + return A2( + $elm$json$Json$Decode$andThen, + function (id) { + return $elm$json$Json$Decode$succeed( + {id: id, name: name}); + }, + A2($elm$json$Json$Decode$field, 'id', $elm$json$Json$Decode$int)); + }, + A2($elm$json$Json$Decode$field, 'name', $elm$json$Json$Decode$string))))); + }, + A2( + $elm$json$Json$Decode$field, + 'taxGroups', + $elm$json$Json$Decode$list( + A2( + $elm$json$Json$Decode$andThen, + function (percentage) { + return A2( + $elm$json$Json$Decode$andThen, + function (id) { + return A2( + $elm$json$Json$Decode$andThen, + function (description) { + return $elm$json$Json$Decode$succeed( + {description: description, id: id, percentage: percentage}); + }, + A2($elm$json$Json$Decode$field, 'description', $elm$json$Json$Decode$string)); + }, + A2($elm$json$Json$Decode$field, 'id', $elm$json$Json$Decode$int)); + }, + A2($elm$json$Json$Decode$field, 'percentage', $elm$json$Json$Decode$float))))))({"versions":{"elm":"0.19.1"},"types":{"message":"Entry.Msg","aliases":{"Entry.SearchResult":{"args":[],"type":"{ barcode : String.String, name : String.String, netUnitPrice : Basics.Float, bought : String.String, salesUnits : Basics.Int, available : Basics.Bool, locationName : String.String, locationId : Basics.Int, groupName : String.String, groupId : Basics.Int, taxGroupId : Basics.Int }"}},"unions":{"Entry.Msg":{"args":[],"tags":{"SetSearchTerm":["String.String"],"SubmitSearch":[],"ReceiveSearchResults":["Result.Result Http.Error (List.List Entry.SearchResult)"],"GotoItemEditor":["Entry.SearchResult"],"SetNetUnitPrice":["String.String"],"SetGroupId":["String.String"],"SetLocationId":["String.String"],"SetTaxGroupId":["String.String"],"SetBarcode":["String.String"],"SetName":["String.String"],"SetSalesUnits":["String.String"]}},"Basics.Bool":{"args":[],"tags":{"True":[],"False":[]}},"Http.Error":{"args":[],"tags":{"BadUrl":["String.String"],"Timeout":[],"NetworkError":[],"BadStatus":["Basics.Int"],"BadBody":["String.String"]}},"Basics.Float":{"args":[],"tags":{"Float":[]}},"Basics.Int":{"args":[],"tags":{"Int":[]}},"List.List":{"args":["a"],"tags":{}},"Result.Result":{"args":["error","value"],"tags":{"Ok":["value"],"Err":["error"]}},"String.String":{"args":[],"tags":{"String":[]}}}}})}});}(this)); \ No newline at end of file diff --git a/jon/template_utils.py b/jon/template_utils.py index b192b04..a862abb 100644 --- a/jon/template_utils.py +++ b/jon/template_utils.py @@ -1,4 +1,4 @@ -import datetime +import json def format_currency(x): @@ -15,16 +15,5 @@ def format_bool(x): return "✅" if x else "❌" -def now(): - return datetime.datetime.now() - - -def get_garfield_price(net_unit_price, tax_group_id): - if tax_group_id == 1: - tax_factor = 1.19 - elif tax_group_id == 2: - tax_factor = 1.07 - else: - raise Error("Unknown tax group ID") - - return net_unit_price * tax_factor + 0.01 +def to_json(x): + return json.dumps(x) diff --git a/jon/templates/entry/index.html b/jon/templates/entry/index.html index 587c3cb..b986866 100644 --- a/jon/templates/entry/index.html +++ b/jon/templates/entry/index.html @@ -1,5 +1,16 @@ {% extends "base.html" %} {% block content %} -Neuer Eintrag +
+ + {% endblock %} From 0f9be13e3187caec3366121bed64a3881e204332 Mon Sep 17 00:00:00 2001 From: Paul Brinkmeier Date: Sat, 19 Aug 2023 05:55:27 +0200 Subject: [PATCH 03/18] Refactor fronted somewhat --- frontend/Entry.elm | 203 ++++---- frontend/NumberInput.elm | 25 + frontend/Select.elm | 36 ++ jon/static/entry.js | 1031 ++++++++++++++++++++------------------ 4 files changed, 711 insertions(+), 584 deletions(-) create mode 100644 frontend/NumberInput.elm create mode 100644 frontend/Select.elm diff --git a/frontend/Entry.elm b/frontend/Entry.elm index 300da94..34358b2 100644 --- a/frontend/Entry.elm +++ b/frontend/Entry.elm @@ -10,6 +10,9 @@ import Html exposing (..) import Html.Attributes exposing (..) import Html.Events exposing (..) +import NumberInput +import Select + main = Browser.element { init = \globals -> ( Context globals <| ItemSearch { searchTerm = "", searchResults = [] } @@ -85,11 +88,12 @@ type State | ItemEditor { barcode : String , name : String - , salesUnits : Int - , netUnitPrice : Float - , groupId : Int - , locationId : Int - , taxGroupId : Int + , salesUnits : NumberInput.Model Int + , netUnitPrice : NumberInput.Model Float + , grossUnitPrice : NumberInput.Model Float + , group : Select.Model Group + , location : Select.Model Location + , taxGroup : Select.Model TaxGroup } type Msg @@ -97,13 +101,14 @@ type Msg | SubmitSearch | ReceiveSearchResults (Result Http.Error (List SearchResult)) | GotoItemEditor SearchResult - | SetNetUnitPrice String - | SetGroupId String - | SetLocationId String - | SetTaxGroupId String | SetBarcode String | SetName String | SetSalesUnits String + | SetNetUnitPrice String + | SetGrossUnitPrice String + | SetGroup String + | SetLocation String + | SetTaxGroup String -- Update logic: State machine etc. @@ -127,42 +132,52 @@ updateState msg globals state = case state of ReceiveSearchResults (Ok searchResults) -> (ItemSearch { model | searchResults = searchResults }, Cmd.none) GotoItemEditor searchResult -> - ( ItemEditor - { barcode = searchResult.barcode - , groupId = searchResult.groupId - , locationId = searchResult.locationId - , name = searchResult.name - , netUnitPrice = searchResult.netUnitPrice - , salesUnits = searchResult.salesUnits - , taxGroupId = searchResult.taxGroupId - } - , Cmd.none - ) + case find (\tg -> tg.id == searchResult.taxGroupId) globals.taxGroups of + Nothing -> (state, Cmd.none) + Just taxGroup -> + ( ItemEditor + { barcode = searchResult.barcode + , name = searchResult.name + , netUnitPrice = NumberInput.fromFloat searchResult.netUnitPrice + , grossUnitPrice = NumberInput.fromFloat <| calculateGarfieldPrice searchResult.netUnitPrice taxGroup.percentage + , salesUnits = NumberInput.fromInt searchResult.salesUnits + , group = Select.init (.id >> String.fromInt) (.name) { id = searchResult.groupId, name = searchResult.groupName } globals.groups + , location = Select.init (.id >> String.fromInt) (.name) { id = searchResult.locationId, name = searchResult.locationName } globals.locations + , taxGroup = Select.init (.id >> String.fromInt) (.description) taxGroup globals.taxGroups + } + , Cmd.none + ) _ -> (state, Cmd.none) ItemEditor model -> case msg of - SetNetUnitPrice netUnitPriceStr -> case String.toFloat netUnitPriceStr of - Nothing -> (state, Cmd.none) - Just netUnitPrice -> (ItemEditor { model | netUnitPrice = netUnitPrice }, Cmd.none) - SetGroupId groupIdStr -> case String.toInt groupIdStr of - Nothing -> (state, Cmd.none) - Just groupId -> (ItemEditor { model | groupId = groupId }, Cmd.none) - SetLocationId locationIdStr -> case String.toInt locationIdStr of - Nothing -> (state, Cmd.none) - Just locationId -> (ItemEditor { model | locationId = locationId }, Cmd.none) - SetTaxGroupId taxGroupIdStr -> case String.toInt taxGroupIdStr of - Nothing -> (state, Cmd.none) - Just taxGroupId -> (ItemEditor { model | taxGroupId = taxGroupId }, Cmd.none) SetBarcode barcode -> (ItemEditor { model | barcode = barcode }, Cmd.none) SetName name -> (ItemEditor { model | name = name }, Cmd.none) - SetSalesUnits salesUnitsStr -> case String.toInt salesUnitsStr of - Nothing -> (state, Cmd.none) - Just salesUnits -> (ItemEditor { model | salesUnits = salesUnits }, Cmd.none) + SetSalesUnits str -> + (ItemEditor { model | salesUnits = NumberInput.update str model.salesUnits }, Cmd.none) + SetNetUnitPrice str -> + ( ItemEditor <| updateGrossUnitPrice { model | netUnitPrice = NumberInput.update str model.netUnitPrice } + , Cmd.none + ) + SetGrossUnitPrice str -> + (ItemEditor { model | grossUnitPrice = NumberInput.update str model.grossUnitPrice }, Cmd.none) + SetGroup key -> + (ItemEditor { model | group = Select.update key model.group }, Cmd.none) + SetLocation key -> + (ItemEditor { model | location = Select.update key model.location }, Cmd.none) + SetTaxGroup key -> + ( ItemEditor <| updateGrossUnitPrice { model | taxGroup = Select.update key model.taxGroup } + , Cmd.none + ) _ -> (state, Cmd.none) +updateGrossUnitPrice model = + { model + | grossUnitPrice = NumberInput.fromFloat <| calculateGarfieldPrice (NumberInput.get model.netUnitPrice) (Select.get model.taxGroup).percentage + } + -- View stuff view { globals, state } = case state of @@ -177,80 +192,60 @@ view { globals, state } = case state of , table [] <| searchResultHeaders :: List.map viewSearchResult model.searchResults ] ] - ItemEditor model -> case find (\tg -> tg.id == model.taxGroupId) globals.taxGroups of - Nothing -> div [] [ text "index error, this should never happen" ] - Just selectedTaxGroup -> - Html.form [] - [ fieldset [] - [ legend [] [ text "Neuer Inventareintrag" ] - , div [ class "form-input" ] - [ label [ for "barcode" ] [ text "Barcode" ] - , input [ onInput SetBarcode, value model.barcode, disabled True, id "barcode" ] [] - ] - , div [ class "form-input" ] - [ label [ for "name" ] [ text "Name" ] - , input [ onInput SetName, value model.name, id "name" ] [] - ] - , div [ class "form-input" ] - [ label [ for "sales-units" ] [ text "Stückzahl" ] - , input [ onInput SetSalesUnits, value <| String.fromInt model.salesUnits, id "sales-units", type_ "number" ] [] - ] - , div [ class "form-input" ] - [ label [ for "group" ] [ text "Gruppe" ] - , viewSelect - [ onInput SetGroupId, id "group" ] - String.fromInt .id .name model.groupId globals.groups - ] - , div [ class "form-input" ] - [ label [ for "location" ] [ text "Raum" ] - , viewSelect - [ onInput SetLocationId, id "location" ] - String.fromInt .id .name model.locationId globals.locations - ] - , div [ class "form-input" ] - [ label [ for "net-unit-price" ] [ text "Stückpreis (Netto)" ] - , input - [ value <| String.fromFloat model.netUnitPrice - , onInput SetNetUnitPrice - , type_ "number" - , id "net-unit-price" - , step "0.01" - ] - [] - ] - , div [ class "form-input" ] - [ label [ for "tax-group" ] [ text "Steuergruppe" ] - , viewSelect - [ onInput SetTaxGroupId, id "tax-group" ] - String.fromInt .id .description model.taxGroupId globals.taxGroups - ] + ItemEditor model -> + Html.form [] + [ fieldset [] + [ legend [] [ text "Neuer Inventareintrag" ] + , div [ class "form-input" ] + [ label [ for "barcode" ] [ text "Barcode" ] + , input [ onInput SetBarcode, value model.barcode, disabled True, id "barcode" ] [] ] - , fieldset [] - [ legend [] [ text "Neuer Snackeintrag" ] - , div [ class "form-input" ] - [ label [ for "snack-name" ] [ text "Name" ] - , input [ value model.name, disabled True, id "snack-name" ] [] - ] - , div [ class "form-input" ] - [ label [ for "gross-unit-price" ] - [ text <| "Stückpreis (Brutto), Vorschlag: " ++ String.fromFloat (calculateGarfieldPrice model.netUnitPrice selectedTaxGroup.percentage) - ] - , input [ value <| String.fromFloat <| Maybe.withDefault (calculateGarfieldPrice model.netUnitPrice selectedTaxGroup.percentage) Nothing, id "gross-unit-price", type_ "number", step "0.01" ] [] + , div [ class "form-input" ] + [ label [ for "name" ] [ text "Name" ] + , input [ onInput SetName, value model.name, id "name" ] [] + ] + , div [ class "form-input" ] + [ label [ for "sales-units" ] [ text "Stückzahl" ] + , input [ onInput SetSalesUnits, value <| NumberInput.show model.salesUnits, id "sales-units", type_ "number" ] [] + ] + , div [ class "form-input" ] + [ label [ for "group" ] [ text "Gruppe" ] + , Select.view SetGroup model.group + ] + , div [ class "form-input" ] + [ label [ for "location" ] [ text "Raum" ] + , Select.view SetLocation model.location + ] + , div [ class "form-input" ] + [ label [ for "net-unit-price" ] [ text "Stückpreis (Netto)" ] + , input + [ value <| NumberInput.show model.netUnitPrice + , onInput SetNetUnitPrice + , type_ "number" + , id "net-unit-price" + , step "0.01" ] + [] + ] + , div [ class "form-input" ] + [ label [ for "tax-group" ] [ text "Steuergruppe" ] + , Select.view SetTaxGroup model.taxGroup ] ] - -viewSelect selectAttributes showValue getValue getLabel selectedValue xs = - let - viewOption x = - option - [ value <| showValue <| getValue x - , selected <| getValue x == selectedValue + , fieldset [] + [ legend [] [ text "Neuer Snackeintrag" ] + , div [ class "form-input" ] + [ label [ for "snack-name" ] [ text "Name" ] + , input [ value model.name, disabled True, id "snack-name" ] [] + ] + , div [ class "form-input" ] + [ label [ for "gross-unit-price" ] + [ text <| "Stückpreis (Brutto), Vorschlag: " ++ String.fromFloat (calculateGarfieldPrice (NumberInput.get model.netUnitPrice) (Select.get model.taxGroup).percentage) + ] + , input [ onInput SetGrossUnitPrice, value <| NumberInput.show model.grossUnitPrice, id "gross-unit-price", type_ "number", step "0.01" ] [] + ] ] - [ text <| getLabel x - ] - in - select selectAttributes <| List.map viewOption xs + ] searchResultHeaders = tr [] diff --git a/frontend/NumberInput.elm b/frontend/NumberInput.elm new file mode 100644 index 0000000..6ffab83 --- /dev/null +++ b/frontend/NumberInput.elm @@ -0,0 +1,25 @@ +module NumberInput exposing (..) + +type alias Model a = + { value : a + , original : String + , convert : String -> Maybe a + } + +fromFloat : Float -> Model Float +fromFloat x = Model x (String.fromFloat x) String.toFloat + +fromInt : Int -> Model Int +fromInt x = Model x (String.fromInt x) String.toInt + +get : Model a -> a +get = .value + +update : String -> Model a -> Model a +update str model = + case model.convert str of + Nothing -> model + Just value -> { model | value = value, original = str } + +show : Model a -> String +show = .original diff --git a/frontend/Select.elm b/frontend/Select.elm new file mode 100644 index 0000000..495f86d --- /dev/null +++ b/frontend/Select.elm @@ -0,0 +1,36 @@ +module Select exposing (..) + +import Html exposing (Html, option, select, text) +import Html.Attributes exposing (selected, value) +import Html.Events exposing (onInput) + +type alias Model a = + { identify : a -> String + , show : a -> String + , selected : a + , options : List a + } + +init : (a -> String) -> (a -> String) -> a -> List a -> Model a +init = Model + +update : String -> Model a -> Model a +update key model = + case find (\x -> key == model.identify x) model.options of + Nothing -> model + Just x -> { model | selected = x } + +view : (String -> m) -> Model a -> Html m +view msg model = + let + viewOption x = + option + [ selected <| model.identify model.selected == model.identify x, value <| model.identify x ] + [ text <| model.show x ] + in + select [ onInput msg ] <| List.map viewOption model.options + +get : Model a -> a +get = .selected + +find pred xs = List.head <| List.filter pred xs diff --git a/jon/static/entry.js b/jon/static/entry.js index 3538c73..696f436 100644 --- a/jon/static/entry.js +++ b/jon/static/entry.js @@ -10745,6 +10745,17 @@ var $author$project$Entry$ItemEditor = function (a) { var $author$project$Entry$ReceiveSearchResults = function (a) { return {$: 'ReceiveSearchResults', a: a}; }; +var $elm$core$Basics$pow = _Basics_pow; +var $elm$core$Basics$round = _Basics_round; +var $author$project$Entry$roundTo = F2( + function (places, x) { + return $elm$core$Basics$round( + x * A2($elm$core$Basics$pow, 10, places)) / A2($elm$core$Basics$pow, 10, places); + }); +var $author$project$Entry$calculateGarfieldPrice = F2( + function (netUnitPrice, taxPercentage) { + return A2($author$project$Entry$roundTo, 2, (netUnitPrice * (1 + taxPercentage)) + 0.01); + }); var $elm$http$Http$BadStatus_ = F2( function (a, b) { return {$: 'BadStatus_', a: a, b: b}; @@ -10838,6 +10849,50 @@ var $elm$http$Http$expectJson = F2( A2($elm$json$Json$Decode$decodeString, decoder, string)); })); }); +var $elm$core$List$filter = F2( + function (isGood, list) { + return A3( + $elm$core$List$foldr, + F2( + function (x, xs) { + return isGood(x) ? A2($elm$core$List$cons, x, xs) : xs; + }), + _List_Nil, + list); + }); +var $elm$core$List$head = function (list) { + if (list.b) { + var x = list.a; + var xs = list.b; + return $elm$core$Maybe$Just(x); + } else { + return $elm$core$Maybe$Nothing; + } +}; +var $author$project$Entry$find = F2( + function (pred, xs) { + return $elm$core$List$head( + A2($elm$core$List$filter, pred, xs)); + }); +var $author$project$NumberInput$Model = F3( + function (value, original, convert) { + return {convert: convert, original: original, value: value}; + }); +var $elm$core$String$toFloat = _String_toFloat; +var $author$project$NumberInput$fromFloat = function (x) { + return A3( + $author$project$NumberInput$Model, + x, + $elm$core$String$fromFloat(x), + $elm$core$String$toFloat); +}; +var $author$project$NumberInput$fromInt = function (x) { + return A3( + $author$project$NumberInput$Model, + x, + $elm$core$String$fromInt(x), + $elm$core$String$toInt); +}; var $elm$http$Http$emptyBody = _Http_emptyBody; var $elm$http$Http$Request = function (a) { return {$: 'Request', a: a}; @@ -10993,6 +11048,11 @@ var $elm$http$Http$get = function (r) { return $elm$http$Http$request( {body: $elm$http$Http$emptyBody, expect: r.expect, headers: _List_Nil, method: 'GET', timeout: $elm$core$Maybe$Nothing, tracker: $elm$core$Maybe$Nothing, url: r.url}); }; +var $author$project$Select$Model = F4( + function (identify, show, selected, options) { + return {identify: identify, options: options, selected: selected, show: show}; + }); +var $author$project$Select$init = $author$project$Select$Model; var $author$project$Entry$SearchResult = function (barcode) { return function (name) { return function (netUnitPrice) { @@ -11070,7 +11130,59 @@ var $author$project$Entry$searchResultDecoder = A3( 'item_barcode', $elm$json$Json$Decode$string, $elm$json$Json$Decode$succeed($author$project$Entry$SearchResult)))))))))))); -var $elm$core$String$toFloat = _String_toFloat; +var $author$project$NumberInput$update = F2( + function (str, model) { + var _v0 = model.convert(str); + if (_v0.$ === 'Nothing') { + return model; + } else { + var value = _v0.a; + return _Utils_update( + model, + {original: str, value: value}); + } + }); +var $author$project$Select$find = F2( + function (pred, xs) { + return $elm$core$List$head( + A2($elm$core$List$filter, pred, xs)); + }); +var $author$project$Select$update = F2( + function (key, model) { + var _v0 = A2( + $author$project$Select$find, + function (x) { + return _Utils_eq( + key, + model.identify(x)); + }, + model.options); + if (_v0.$ === 'Nothing') { + return model; + } else { + var x = _v0.a; + return _Utils_update( + model, + {selected: x}); + } + }); +var $author$project$NumberInput$get = function ($) { + return $.value; +}; +var $author$project$Select$get = function ($) { + return $.selected; +}; +var $author$project$Entry$updateGrossUnitPrice = function (model) { + return _Utils_update( + model, + { + grossUnitPrice: $author$project$NumberInput$fromFloat( + A2( + $author$project$Entry$calculateGarfieldPrice, + $author$project$NumberInput$get(model.netUnitPrice), + $author$project$Select$get(model.taxGroup).percentage)) + }); +}; var $author$project$Entry$updateState = F3( function (msg, globals, state) { if (state.$ === 'ItemSearch') { @@ -11111,10 +11223,67 @@ var $author$project$Entry$updateState = F3( } case 'GotoItemEditor': var searchResult = msg.a; - return _Utils_Tuple2( - $author$project$Entry$ItemEditor( - {barcode: searchResult.barcode, groupId: searchResult.groupId, locationId: searchResult.locationId, name: searchResult.name, netUnitPrice: searchResult.netUnitPrice, salesUnits: searchResult.salesUnits, taxGroupId: searchResult.taxGroupId}), - $elm$core$Platform$Cmd$none); + var _v2 = A2( + $author$project$Entry$find, + function (tg) { + return _Utils_eq(tg.id, searchResult.taxGroupId); + }, + globals.taxGroups); + if (_v2.$ === 'Nothing') { + return _Utils_Tuple2(state, $elm$core$Platform$Cmd$none); + } else { + var taxGroup = _v2.a; + return _Utils_Tuple2( + $author$project$Entry$ItemEditor( + { + barcode: searchResult.barcode, + grossUnitPrice: $author$project$NumberInput$fromFloat( + A2($author$project$Entry$calculateGarfieldPrice, searchResult.netUnitPrice, taxGroup.percentage)), + group: A4( + $author$project$Select$init, + A2( + $elm$core$Basics$composeR, + function ($) { + return $.id; + }, + $elm$core$String$fromInt), + function ($) { + return $.name; + }, + {id: searchResult.groupId, name: searchResult.groupName}, + globals.groups), + location: A4( + $author$project$Select$init, + A2( + $elm$core$Basics$composeR, + function ($) { + return $.id; + }, + $elm$core$String$fromInt), + function ($) { + return $.name; + }, + {id: searchResult.locationId, name: searchResult.locationName}, + globals.locations), + name: searchResult.name, + netUnitPrice: $author$project$NumberInput$fromFloat(searchResult.netUnitPrice), + salesUnits: $author$project$NumberInput$fromInt(searchResult.salesUnits), + taxGroup: A4( + $author$project$Select$init, + A2( + $elm$core$Basics$composeR, + function ($) { + return $.id; + }, + $elm$core$String$fromInt), + function ($) { + return $.description; + }, + taxGroup, + globals.taxGroups) + }), + $elm$core$Platform$Cmd$none); + } default: break _v1$4; } @@ -11123,62 +11292,6 @@ var $author$project$Entry$updateState = F3( } else { var model = state.a; switch (msg.$) { - case 'SetNetUnitPrice': - var netUnitPriceStr = msg.a; - var _v3 = $elm$core$String$toFloat(netUnitPriceStr); - if (_v3.$ === 'Nothing') { - return _Utils_Tuple2(state, $elm$core$Platform$Cmd$none); - } else { - var netUnitPrice = _v3.a; - return _Utils_Tuple2( - $author$project$Entry$ItemEditor( - _Utils_update( - model, - {netUnitPrice: netUnitPrice})), - $elm$core$Platform$Cmd$none); - } - case 'SetGroupId': - var groupIdStr = msg.a; - var _v4 = $elm$core$String$toInt(groupIdStr); - if (_v4.$ === 'Nothing') { - return _Utils_Tuple2(state, $elm$core$Platform$Cmd$none); - } else { - var groupId = _v4.a; - return _Utils_Tuple2( - $author$project$Entry$ItemEditor( - _Utils_update( - model, - {groupId: groupId})), - $elm$core$Platform$Cmd$none); - } - case 'SetLocationId': - var locationIdStr = msg.a; - var _v5 = $elm$core$String$toInt(locationIdStr); - if (_v5.$ === 'Nothing') { - return _Utils_Tuple2(state, $elm$core$Platform$Cmd$none); - } else { - var locationId = _v5.a; - return _Utils_Tuple2( - $author$project$Entry$ItemEditor( - _Utils_update( - model, - {locationId: locationId})), - $elm$core$Platform$Cmd$none); - } - case 'SetTaxGroupId': - var taxGroupIdStr = msg.a; - var _v6 = $elm$core$String$toInt(taxGroupIdStr); - if (_v6.$ === 'Nothing') { - return _Utils_Tuple2(state, $elm$core$Platform$Cmd$none); - } else { - var taxGroupId = _v6.a; - return _Utils_Tuple2( - $author$project$Entry$ItemEditor( - _Utils_update( - model, - {taxGroupId: taxGroupId})), - $elm$core$Platform$Cmd$none); - } case 'SetBarcode': var barcode = msg.a; return _Utils_Tuple2( @@ -11196,19 +11309,67 @@ var $author$project$Entry$updateState = F3( {name: name})), $elm$core$Platform$Cmd$none); case 'SetSalesUnits': - var salesUnitsStr = msg.a; - var _v7 = $elm$core$String$toInt(salesUnitsStr); - if (_v7.$ === 'Nothing') { - return _Utils_Tuple2(state, $elm$core$Platform$Cmd$none); - } else { - var salesUnits = _v7.a; - return _Utils_Tuple2( - $author$project$Entry$ItemEditor( + var str = msg.a; + return _Utils_Tuple2( + $author$project$Entry$ItemEditor( + _Utils_update( + model, + { + salesUnits: A2($author$project$NumberInput$update, str, model.salesUnits) + })), + $elm$core$Platform$Cmd$none); + case 'SetNetUnitPrice': + var str = msg.a; + return _Utils_Tuple2( + $author$project$Entry$ItemEditor( + $author$project$Entry$updateGrossUnitPrice( _Utils_update( model, - {salesUnits: salesUnits})), - $elm$core$Platform$Cmd$none); - } + { + netUnitPrice: A2($author$project$NumberInput$update, str, model.netUnitPrice) + }))), + $elm$core$Platform$Cmd$none); + case 'SetGrossUnitPrice': + var str = msg.a; + return _Utils_Tuple2( + $author$project$Entry$ItemEditor( + _Utils_update( + model, + { + grossUnitPrice: A2($author$project$NumberInput$update, str, model.grossUnitPrice) + })), + $elm$core$Platform$Cmd$none); + case 'SetGroup': + var key = msg.a; + return _Utils_Tuple2( + $author$project$Entry$ItemEditor( + _Utils_update( + model, + { + group: A2($author$project$Select$update, key, model.group) + })), + $elm$core$Platform$Cmd$none); + case 'SetLocation': + var key = msg.a; + return _Utils_Tuple2( + $author$project$Entry$ItemEditor( + _Utils_update( + model, + { + location: A2($author$project$Select$update, key, model.location) + })), + $elm$core$Platform$Cmd$none); + case 'SetTaxGroup': + var key = msg.a; + return _Utils_Tuple2( + $author$project$Entry$ItemEditor( + $author$project$Entry$updateGrossUnitPrice( + _Utils_update( + model, + { + taxGroup: A2($author$project$Select$update, key, model.taxGroup) + }))), + $elm$core$Platform$Cmd$none); default: return _Utils_Tuple2(state, $elm$core$Platform$Cmd$none); } @@ -11228,11 +11389,14 @@ var $author$project$Entry$update = F2( var $author$project$Entry$SetBarcode = function (a) { return {$: 'SetBarcode', a: a}; }; -var $author$project$Entry$SetGroupId = function (a) { - return {$: 'SetGroupId', a: a}; +var $author$project$Entry$SetGrossUnitPrice = function (a) { + return {$: 'SetGrossUnitPrice', a: a}; }; -var $author$project$Entry$SetLocationId = function (a) { - return {$: 'SetLocationId', a: a}; +var $author$project$Entry$SetGroup = function (a) { + return {$: 'SetGroup', a: a}; +}; +var $author$project$Entry$SetLocation = function (a) { + return {$: 'SetLocation', a: a}; }; var $author$project$Entry$SetName = function (a) { return {$: 'SetName', a: a}; @@ -11246,21 +11410,10 @@ var $author$project$Entry$SetSalesUnits = function (a) { var $author$project$Entry$SetSearchTerm = function (a) { return {$: 'SetSearchTerm', a: a}; }; -var $author$project$Entry$SetTaxGroupId = function (a) { - return {$: 'SetTaxGroupId', a: a}; +var $author$project$Entry$SetTaxGroup = function (a) { + return {$: 'SetTaxGroup', a: a}; }; var $author$project$Entry$SubmitSearch = {$: 'SubmitSearch'}; -var $elm$core$Basics$pow = _Basics_pow; -var $elm$core$Basics$round = _Basics_round; -var $author$project$Entry$roundTo = F2( - function (places, x) { - return $elm$core$Basics$round( - x * A2($elm$core$Basics$pow, 10, places)) / A2($elm$core$Basics$pow, 10, places); - }); -var $author$project$Entry$calculateGarfieldPrice = F2( - function (netUnitPrice, taxPercentage) { - return A2($author$project$Entry$roundTo, 2, (netUnitPrice * (1 + taxPercentage)) + 0.01); - }); var $elm$json$Json$Encode$bool = _Json_wrap; var $elm$html$Html$Attributes$boolProperty = F2( function (key, bool) { @@ -11271,31 +11424,6 @@ var $elm$html$Html$Attributes$boolProperty = F2( }); var $elm$html$Html$Attributes$disabled = $elm$html$Html$Attributes$boolProperty('disabled'); var $elm$html$Html$fieldset = _VirtualDom_node('fieldset'); -var $elm$core$List$filter = F2( - function (isGood, list) { - return A3( - $elm$core$List$foldr, - F2( - function (x, xs) { - return isGood(x) ? A2($elm$core$List$cons, x, xs) : xs; - }), - _List_Nil, - list); - }); -var $elm$core$List$head = function (list) { - if (list.b) { - var x = list.a; - var xs = list.b; - return $elm$core$Maybe$Just(x); - } else { - return $elm$core$Maybe$Nothing; - } -}; -var $author$project$Entry$find = F2( - function (pred, xs) { - return $elm$core$List$head( - A2($elm$core$List$filter, pred, xs)); - }); var $elm$html$Html$Attributes$for = $elm$html$Html$Attributes$stringProperty('htmlFor'); var $elm$html$Html$form = _VirtualDom_node('form'); var $elm$html$Html$label = _VirtualDom_node('label'); @@ -11387,10 +11515,44 @@ var $author$project$Entry$searchResultHeaders = A2( ])), A2($elm$html$Html$th, _List_Nil, _List_Nil) ])); +var $author$project$NumberInput$show = function ($) { + return $.original; +}; var $elm$html$Html$Attributes$step = function (n) { return A2($elm$html$Html$Attributes$stringProperty, 'step', n); }; var $elm$html$Html$table = _VirtualDom_node('table'); +var $elm$html$Html$option = _VirtualDom_node('option'); +var $elm$html$Html$select = _VirtualDom_node('select'); +var $elm$html$Html$Attributes$selected = $elm$html$Html$Attributes$boolProperty('selected'); +var $author$project$Select$view = F2( + function (msg, model) { + var viewOption = function (x) { + return A2( + $elm$html$Html$option, + _List_fromArray( + [ + $elm$html$Html$Attributes$selected( + _Utils_eq( + model.identify(model.selected), + model.identify(x))), + $elm$html$Html$Attributes$value( + model.identify(x)) + ]), + _List_fromArray( + [ + $elm$html$Html$text( + model.show(x)) + ])); + }; + return A2( + $elm$html$Html$select, + _List_fromArray( + [ + $elm$html$Html$Events$onInput(msg) + ]), + A2($elm$core$List$map, viewOption, model.options)); + }); var $author$project$Entry$GotoItemEditor = function (a) { return {$: 'GotoItemEditor', a: a}; }; @@ -11492,35 +11654,6 @@ var $author$project$Entry$viewSearchResult = function (model) { ])) ])); }; -var $elm$html$Html$option = _VirtualDom_node('option'); -var $elm$html$Html$select = _VirtualDom_node('select'); -var $elm$html$Html$Attributes$selected = $elm$html$Html$Attributes$boolProperty('selected'); -var $author$project$Entry$viewSelect = F6( - function (selectAttributes, showValue, getValue, getLabel, selectedValue, xs) { - var viewOption = function (x) { - return A2( - $elm$html$Html$option, - _List_fromArray( - [ - $elm$html$Html$Attributes$value( - showValue( - getValue(x))), - $elm$html$Html$Attributes$selected( - _Utils_eq( - getValue(x), - selectedValue)) - ]), - _List_fromArray( - [ - $elm$html$Html$text( - getLabel(x)) - ])); - }; - return A2( - $elm$html$Html$select, - selectAttributes, - A2($elm$core$List$map, viewOption, xs)); - }); var $author$project$Entry$view = function (_v0) { var globals = _v0.globals; var state = _v0.state; @@ -11586,342 +11719,280 @@ var $author$project$Entry$view = function (_v0) { ])); } else { var model = state.a; - var _v2 = A2( - $author$project$Entry$find, - function (tg) { - return _Utils_eq(tg.id, model.taxGroupId); - }, - globals.taxGroups); - if (_v2.$ === 'Nothing') { - return A2( - $elm$html$Html$div, - _List_Nil, - _List_fromArray( - [ - $elm$html$Html$text('index error, this should never happen') - ])); - } else { - var selectedTaxGroup = _v2.a; - return A2( - $elm$html$Html$form, - _List_Nil, - _List_fromArray( - [ - A2( - $elm$html$Html$fieldset, - _List_Nil, - _List_fromArray( - [ - A2( - $elm$html$Html$legend, - _List_Nil, - _List_fromArray( - [ - $elm$html$Html$text('Neuer Inventareintrag') - ])), - A2( - $elm$html$Html$div, - _List_fromArray( - [ - $elm$html$Html$Attributes$class('form-input') - ]), - _List_fromArray( - [ - A2( - $elm$html$Html$label, - _List_fromArray( - [ - $elm$html$Html$Attributes$for('barcode') - ]), - _List_fromArray( - [ - $elm$html$Html$text('Barcode') - ])), - A2( - $elm$html$Html$input, - _List_fromArray( - [ - $elm$html$Html$Events$onInput($author$project$Entry$SetBarcode), - $elm$html$Html$Attributes$value(model.barcode), - $elm$html$Html$Attributes$disabled(true), - $elm$html$Html$Attributes$id('barcode') - ]), - _List_Nil) - ])), - A2( - $elm$html$Html$div, - _List_fromArray( - [ - $elm$html$Html$Attributes$class('form-input') - ]), - _List_fromArray( - [ - A2( - $elm$html$Html$label, - _List_fromArray( - [ - $elm$html$Html$Attributes$for('name') - ]), - _List_fromArray( - [ - $elm$html$Html$text('Name') - ])), - A2( - $elm$html$Html$input, - _List_fromArray( - [ - $elm$html$Html$Events$onInput($author$project$Entry$SetName), - $elm$html$Html$Attributes$value(model.name), - $elm$html$Html$Attributes$id('name') - ]), - _List_Nil) - ])), - A2( - $elm$html$Html$div, - _List_fromArray( - [ - $elm$html$Html$Attributes$class('form-input') - ]), - _List_fromArray( - [ - A2( - $elm$html$Html$label, - _List_fromArray( - [ - $elm$html$Html$Attributes$for('sales-units') - ]), - _List_fromArray( - [ - $elm$html$Html$text('Stückzahl') - ])), - A2( - $elm$html$Html$input, - _List_fromArray( - [ - $elm$html$Html$Events$onInput($author$project$Entry$SetSalesUnits), - $elm$html$Html$Attributes$value( - $elm$core$String$fromInt(model.salesUnits)), - $elm$html$Html$Attributes$id('sales-units'), - $elm$html$Html$Attributes$type_('number') - ]), - _List_Nil) - ])), - A2( - $elm$html$Html$div, - _List_fromArray( - [ - $elm$html$Html$Attributes$class('form-input') - ]), - _List_fromArray( - [ - A2( - $elm$html$Html$label, - _List_fromArray( - [ - $elm$html$Html$Attributes$for('group') - ]), - _List_fromArray( - [ - $elm$html$Html$text('Gruppe') - ])), - A6( - $author$project$Entry$viewSelect, - _List_fromArray( - [ - $elm$html$Html$Events$onInput($author$project$Entry$SetGroupId), - $elm$html$Html$Attributes$id('group') - ]), - $elm$core$String$fromInt, - function ($) { - return $.id; - }, - function ($) { - return $.name; - }, - model.groupId, - globals.groups) - ])), - A2( - $elm$html$Html$div, - _List_fromArray( - [ - $elm$html$Html$Attributes$class('form-input') - ]), - _List_fromArray( - [ - A2( - $elm$html$Html$label, - _List_fromArray( - [ - $elm$html$Html$Attributes$for('location') - ]), - _List_fromArray( - [ - $elm$html$Html$text('Raum') - ])), - A6( - $author$project$Entry$viewSelect, - _List_fromArray( - [ - $elm$html$Html$Events$onInput($author$project$Entry$SetLocationId), - $elm$html$Html$Attributes$id('location') - ]), - $elm$core$String$fromInt, - function ($) { - return $.id; - }, - function ($) { - return $.name; - }, - model.locationId, - globals.locations) - ])), - A2( - $elm$html$Html$div, - _List_fromArray( - [ - $elm$html$Html$Attributes$class('form-input') - ]), - _List_fromArray( - [ - A2( - $elm$html$Html$label, - _List_fromArray( - [ - $elm$html$Html$Attributes$for('net-unit-price') - ]), - _List_fromArray( - [ - $elm$html$Html$text('Stückpreis (Netto)') - ])), - A2( - $elm$html$Html$input, - _List_fromArray( - [ - $elm$html$Html$Attributes$value( - $elm$core$String$fromFloat(model.netUnitPrice)), - $elm$html$Html$Events$onInput($author$project$Entry$SetNetUnitPrice), - $elm$html$Html$Attributes$type_('number'), - $elm$html$Html$Attributes$id('net-unit-price'), - $elm$html$Html$Attributes$step('0.01') - ]), - _List_Nil) - ])), - A2( - $elm$html$Html$div, - _List_fromArray( - [ - $elm$html$Html$Attributes$class('form-input') - ]), - _List_fromArray( - [ - A2( - $elm$html$Html$label, - _List_fromArray( - [ - $elm$html$Html$Attributes$for('tax-group') - ]), - _List_fromArray( - [ - $elm$html$Html$text('Steuergruppe') - ])), - A6( - $author$project$Entry$viewSelect, - _List_fromArray( - [ - $elm$html$Html$Events$onInput($author$project$Entry$SetTaxGroupId), - $elm$html$Html$Attributes$id('tax-group') - ]), - $elm$core$String$fromInt, - function ($) { - return $.id; - }, - function ($) { - return $.description; - }, - model.taxGroupId, - globals.taxGroups) - ])) - ])), - A2( - $elm$html$Html$fieldset, - _List_Nil, - _List_fromArray( - [ - A2( - $elm$html$Html$legend, - _List_Nil, - _List_fromArray( - [ - $elm$html$Html$text('Neuer Snackeintrag') - ])), - A2( - $elm$html$Html$div, - _List_fromArray( - [ - $elm$html$Html$Attributes$class('form-input') - ]), - _List_fromArray( - [ - A2( - $elm$html$Html$label, - _List_fromArray( - [ - $elm$html$Html$Attributes$for('snack-name') - ]), - _List_fromArray( - [ - $elm$html$Html$text('Name') - ])), - A2( - $elm$html$Html$input, - _List_fromArray( - [ - $elm$html$Html$Attributes$value(model.name), - $elm$html$Html$Attributes$disabled(true), - $elm$html$Html$Attributes$id('snack-name') - ]), - _List_Nil) - ])), - A2( - $elm$html$Html$div, - _List_fromArray( - [ - $elm$html$Html$Attributes$class('form-input') - ]), - _List_fromArray( - [ - A2( - $elm$html$Html$label, - _List_fromArray( - [ - $elm$html$Html$Attributes$for('gross-unit-price') - ]), - _List_fromArray( - [ - $elm$html$Html$text( - 'Stückpreis (Brutto), Vorschlag: ' + $elm$core$String$fromFloat( - A2($author$project$Entry$calculateGarfieldPrice, model.netUnitPrice, selectedTaxGroup.percentage))) - ])), - A2( - $elm$html$Html$input, - _List_fromArray( - [ - $elm$html$Html$Attributes$value( - $elm$core$String$fromFloat( - A2( - $elm$core$Maybe$withDefault, - A2($author$project$Entry$calculateGarfieldPrice, model.netUnitPrice, selectedTaxGroup.percentage), - $elm$core$Maybe$Nothing))), - $elm$html$Html$Attributes$id('gross-unit-price'), - $elm$html$Html$Attributes$type_('number'), - $elm$html$Html$Attributes$step('0.01') - ]), - _List_Nil) - ])) - ])) - ])); - } + return A2( + $elm$html$Html$form, + _List_Nil, + _List_fromArray( + [ + A2( + $elm$html$Html$fieldset, + _List_Nil, + _List_fromArray( + [ + A2( + $elm$html$Html$legend, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text('Neuer Inventareintrag') + ])), + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('form-input') + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$label, + _List_fromArray( + [ + $elm$html$Html$Attributes$for('barcode') + ]), + _List_fromArray( + [ + $elm$html$Html$text('Barcode') + ])), + A2( + $elm$html$Html$input, + _List_fromArray( + [ + $elm$html$Html$Events$onInput($author$project$Entry$SetBarcode), + $elm$html$Html$Attributes$value(model.barcode), + $elm$html$Html$Attributes$disabled(true), + $elm$html$Html$Attributes$id('barcode') + ]), + _List_Nil) + ])), + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('form-input') + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$label, + _List_fromArray( + [ + $elm$html$Html$Attributes$for('name') + ]), + _List_fromArray( + [ + $elm$html$Html$text('Name') + ])), + A2( + $elm$html$Html$input, + _List_fromArray( + [ + $elm$html$Html$Events$onInput($author$project$Entry$SetName), + $elm$html$Html$Attributes$value(model.name), + $elm$html$Html$Attributes$id('name') + ]), + _List_Nil) + ])), + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('form-input') + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$label, + _List_fromArray( + [ + $elm$html$Html$Attributes$for('sales-units') + ]), + _List_fromArray( + [ + $elm$html$Html$text('Stückzahl') + ])), + A2( + $elm$html$Html$input, + _List_fromArray( + [ + $elm$html$Html$Events$onInput($author$project$Entry$SetSalesUnits), + $elm$html$Html$Attributes$value( + $author$project$NumberInput$show(model.salesUnits)), + $elm$html$Html$Attributes$id('sales-units'), + $elm$html$Html$Attributes$type_('number') + ]), + _List_Nil) + ])), + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('form-input') + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$label, + _List_fromArray( + [ + $elm$html$Html$Attributes$for('group') + ]), + _List_fromArray( + [ + $elm$html$Html$text('Gruppe') + ])), + A2($author$project$Select$view, $author$project$Entry$SetGroup, model.group) + ])), + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('form-input') + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$label, + _List_fromArray( + [ + $elm$html$Html$Attributes$for('location') + ]), + _List_fromArray( + [ + $elm$html$Html$text('Raum') + ])), + A2($author$project$Select$view, $author$project$Entry$SetLocation, model.location) + ])), + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('form-input') + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$label, + _List_fromArray( + [ + $elm$html$Html$Attributes$for('net-unit-price') + ]), + _List_fromArray( + [ + $elm$html$Html$text('Stückpreis (Netto)') + ])), + A2( + $elm$html$Html$input, + _List_fromArray( + [ + $elm$html$Html$Attributes$value( + $author$project$NumberInput$show(model.netUnitPrice)), + $elm$html$Html$Events$onInput($author$project$Entry$SetNetUnitPrice), + $elm$html$Html$Attributes$type_('number'), + $elm$html$Html$Attributes$id('net-unit-price'), + $elm$html$Html$Attributes$step('0.01') + ]), + _List_Nil) + ])), + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('form-input') + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$label, + _List_fromArray( + [ + $elm$html$Html$Attributes$for('tax-group') + ]), + _List_fromArray( + [ + $elm$html$Html$text('Steuergruppe') + ])), + A2($author$project$Select$view, $author$project$Entry$SetTaxGroup, model.taxGroup) + ])) + ])), + A2( + $elm$html$Html$fieldset, + _List_Nil, + _List_fromArray( + [ + A2( + $elm$html$Html$legend, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text('Neuer Snackeintrag') + ])), + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('form-input') + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$label, + _List_fromArray( + [ + $elm$html$Html$Attributes$for('snack-name') + ]), + _List_fromArray( + [ + $elm$html$Html$text('Name') + ])), + A2( + $elm$html$Html$input, + _List_fromArray( + [ + $elm$html$Html$Attributes$value(model.name), + $elm$html$Html$Attributes$disabled(true), + $elm$html$Html$Attributes$id('snack-name') + ]), + _List_Nil) + ])), + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('form-input') + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$label, + _List_fromArray( + [ + $elm$html$Html$Attributes$for('gross-unit-price') + ]), + _List_fromArray( + [ + $elm$html$Html$text( + 'Stückpreis (Brutto), Vorschlag: ' + $elm$core$String$fromFloat( + A2( + $author$project$Entry$calculateGarfieldPrice, + $author$project$NumberInput$get(model.netUnitPrice), + $author$project$Select$get(model.taxGroup).percentage))) + ])), + A2( + $elm$html$Html$input, + _List_fromArray( + [ + $elm$html$Html$Events$onInput($author$project$Entry$SetGrossUnitPrice), + $elm$html$Html$Attributes$value( + $author$project$NumberInput$show(model.grossUnitPrice)), + $elm$html$Html$Attributes$id('gross-unit-price'), + $elm$html$Html$Attributes$type_('number'), + $elm$html$Html$Attributes$step('0.01') + ]), + _List_Nil) + ])) + ])) + ])); } }; var $author$project$Entry$main = $elm$browser$Browser$element( @@ -12008,4 +12079,4 @@ _Platform_export({'Entry':{'init':$author$project$Entry$main( }, A2($elm$json$Json$Decode$field, 'id', $elm$json$Json$Decode$int)); }, - A2($elm$json$Json$Decode$field, 'percentage', $elm$json$Json$Decode$float))))))({"versions":{"elm":"0.19.1"},"types":{"message":"Entry.Msg","aliases":{"Entry.SearchResult":{"args":[],"type":"{ barcode : String.String, name : String.String, netUnitPrice : Basics.Float, bought : String.String, salesUnits : Basics.Int, available : Basics.Bool, locationName : String.String, locationId : Basics.Int, groupName : String.String, groupId : Basics.Int, taxGroupId : Basics.Int }"}},"unions":{"Entry.Msg":{"args":[],"tags":{"SetSearchTerm":["String.String"],"SubmitSearch":[],"ReceiveSearchResults":["Result.Result Http.Error (List.List Entry.SearchResult)"],"GotoItemEditor":["Entry.SearchResult"],"SetNetUnitPrice":["String.String"],"SetGroupId":["String.String"],"SetLocationId":["String.String"],"SetTaxGroupId":["String.String"],"SetBarcode":["String.String"],"SetName":["String.String"],"SetSalesUnits":["String.String"]}},"Basics.Bool":{"args":[],"tags":{"True":[],"False":[]}},"Http.Error":{"args":[],"tags":{"BadUrl":["String.String"],"Timeout":[],"NetworkError":[],"BadStatus":["Basics.Int"],"BadBody":["String.String"]}},"Basics.Float":{"args":[],"tags":{"Float":[]}},"Basics.Int":{"args":[],"tags":{"Int":[]}},"List.List":{"args":["a"],"tags":{}},"Result.Result":{"args":["error","value"],"tags":{"Ok":["value"],"Err":["error"]}},"String.String":{"args":[],"tags":{"String":[]}}}}})}});}(this)); \ No newline at end of file + A2($elm$json$Json$Decode$field, 'percentage', $elm$json$Json$Decode$float))))))({"versions":{"elm":"0.19.1"},"types":{"message":"Entry.Msg","aliases":{"Entry.SearchResult":{"args":[],"type":"{ barcode : String.String, name : String.String, netUnitPrice : Basics.Float, bought : String.String, salesUnits : Basics.Int, available : Basics.Bool, locationName : String.String, locationId : Basics.Int, groupName : String.String, groupId : Basics.Int, taxGroupId : Basics.Int }"}},"unions":{"Entry.Msg":{"args":[],"tags":{"SetSearchTerm":["String.String"],"SubmitSearch":[],"ReceiveSearchResults":["Result.Result Http.Error (List.List Entry.SearchResult)"],"GotoItemEditor":["Entry.SearchResult"],"SetBarcode":["String.String"],"SetName":["String.String"],"SetSalesUnits":["String.String"],"SetNetUnitPrice":["String.String"],"SetGrossUnitPrice":["String.String"],"SetGroup":["String.String"],"SetLocation":["String.String"],"SetTaxGroup":["String.String"]}},"Basics.Bool":{"args":[],"tags":{"True":[],"False":[]}},"Http.Error":{"args":[],"tags":{"BadUrl":["String.String"],"Timeout":[],"NetworkError":[],"BadStatus":["Basics.Int"],"BadBody":["String.String"]}},"Basics.Float":{"args":[],"tags":{"Float":[]}},"Basics.Int":{"args":[],"tags":{"Int":[]}},"List.List":{"args":["a"],"tags":{}},"Result.Result":{"args":["error","value"],"tags":{"Ok":["value"],"Err":["error"]}},"String.String":{"args":[],"tags":{"String":[]}}}}})}});}(this)); \ No newline at end of file From 3d6bd7bac51a4d39bca39cdf2af063938c9974dd Mon Sep 17 00:00:00 2001 From: Paul Brinkmeier Date: Sun, 20 Aug 2023 10:53:33 +0200 Subject: [PATCH 04/18] Rewrite some of the grossUnitPrice stuff --- frontend/Entry.elm | 32 ++++-- frontend/NumberInput.elm | 18 +-- jon/static/entry.js | 235 +++++++++++++++++++++------------------ 3 files changed, 161 insertions(+), 124 deletions(-) diff --git a/frontend/Entry.elm b/frontend/Entry.elm index 34358b2..b410caa 100644 --- a/frontend/Entry.elm +++ b/frontend/Entry.elm @@ -135,11 +135,11 @@ updateState msg globals state = case state of case find (\tg -> tg.id == searchResult.taxGroupId) globals.taxGroups of Nothing -> (state, Cmd.none) Just taxGroup -> - ( ItemEditor + ( ItemEditor <| updateGrossUnitPrice { barcode = searchResult.barcode , name = searchResult.name , netUnitPrice = NumberInput.fromFloat searchResult.netUnitPrice - , grossUnitPrice = NumberInput.fromFloat <| calculateGarfieldPrice searchResult.netUnitPrice taxGroup.percentage + , grossUnitPrice = NumberInput.fromFloat 0 , salesUnits = NumberInput.fromInt searchResult.salesUnits , group = Select.init (.id >> String.fromInt) (.name) { id = searchResult.groupId, name = searchResult.groupName } globals.groups , location = Select.init (.id >> String.fromInt) (.name) { id = searchResult.locationId, name = searchResult.locationName } globals.locations @@ -175,7 +175,7 @@ updateState msg globals state = case state of updateGrossUnitPrice model = { model - | grossUnitPrice = NumberInput.fromFloat <| calculateGarfieldPrice (NumberInput.get model.netUnitPrice) (Select.get model.taxGroup).percentage + | grossUnitPrice = Maybe.withDefault model.grossUnitPrice <| Maybe.map NumberInput.fromFloat <| calculateGarfieldPrice model } -- View stuff @@ -238,15 +238,23 @@ view { globals, state } = case state of [ label [ for "snack-name" ] [ text "Name" ] , input [ value model.name, disabled True, id "snack-name" ] [] ] - , div [ class "form-input" ] - [ label [ for "gross-unit-price" ] - [ text <| "Stückpreis (Brutto), Vorschlag: " ++ String.fromFloat (calculateGarfieldPrice (NumberInput.get model.netUnitPrice) (Select.get model.taxGroup).percentage) - ] - , input [ onInput SetGrossUnitPrice, value <| NumberInput.show model.grossUnitPrice, id "gross-unit-price", type_ "number", step "0.01" ] [] - ] + , viewGrossUnitPriceInput model ] ] +viewGrossUnitPriceInput model = + let + suggestedPriceStr = case calculateGarfieldPrice model of + Nothing -> "?" + Just suggestedPrice -> String.fromFloat suggestedPrice + in + div [ class "form-input" ] + [ label [ for "gross-unit-price" ] + [ text <| "Stückpreis (Brutto), Vorschlag: " ++ suggestedPriceStr + ] + , input [ onInput SetGrossUnitPrice, value <| NumberInput.show model.grossUnitPrice, id "gross-unit-price", type_ "number", step "0.01" ] [] + ] + searchResultHeaders = tr [] [ th [] [ text "Barcode" ] @@ -275,8 +283,10 @@ viewSearchResult model = ] ] -calculateGarfieldPrice netUnitPrice taxPercentage = - roundTo 2 <| netUnitPrice * (1 + taxPercentage) + 0.01 +calculateGarfieldPrice model = + NumberInput.get model.netUnitPrice |> Maybe.map (\netUnitPrice -> + roundTo 2 <| netUnitPrice * (1 + (Select.get model.taxGroup).percentage) + 0.01 + ) roundTo places x = toFloat (round <| x * 10 ^ places) / 10 ^ places diff --git a/frontend/NumberInput.elm b/frontend/NumberInput.elm index 6ffab83..f209dec 100644 --- a/frontend/NumberInput.elm +++ b/frontend/NumberInput.elm @@ -1,25 +1,29 @@ module NumberInput exposing (..) type alias Model a = - { value : a + { value : Maybe a , original : String , convert : String -> Maybe a } fromFloat : Float -> Model Float -fromFloat x = Model x (String.fromFloat x) String.toFloat +fromFloat x = Model (Just x) (String.fromFloat x) String.toFloat fromInt : Int -> Model Int -fromInt x = Model x (String.fromInt x) String.toInt +fromInt x = Model (Just x) (String.fromInt x) String.toInt -get : Model a -> a +get : Model a -> Maybe a get = .value +withDefault : a -> Model a -> a +withDefault d = Maybe.withDefault d << get + +isValid : Model a -> Bool +isValid model = model.value /= Nothing + update : String -> Model a -> Model a update str model = - case model.convert str of - Nothing -> model - Just value -> { model | value = value, original = str } + { model | value = model.convert str, original = str } show : Model a -> String show = .original diff --git a/jon/static/entry.js b/jon/static/entry.js index 696f436..16b7f6b 100644 --- a/jon/static/entry.js +++ b/jon/static/entry.js @@ -10745,17 +10745,6 @@ var $author$project$Entry$ItemEditor = function (a) { var $author$project$Entry$ReceiveSearchResults = function (a) { return {$: 'ReceiveSearchResults', a: a}; }; -var $elm$core$Basics$pow = _Basics_pow; -var $elm$core$Basics$round = _Basics_round; -var $author$project$Entry$roundTo = F2( - function (places, x) { - return $elm$core$Basics$round( - x * A2($elm$core$Basics$pow, 10, places)) / A2($elm$core$Basics$pow, 10, places); - }); -var $author$project$Entry$calculateGarfieldPrice = F2( - function (netUnitPrice, taxPercentage) { - return A2($author$project$Entry$roundTo, 2, (netUnitPrice * (1 + taxPercentage)) + 0.01); - }); var $elm$http$Http$BadStatus_ = F2( function (a, b) { return {$: 'BadStatus_', a: a, b: b}; @@ -10882,14 +10871,14 @@ var $elm$core$String$toFloat = _String_toFloat; var $author$project$NumberInput$fromFloat = function (x) { return A3( $author$project$NumberInput$Model, - x, + $elm$core$Maybe$Just(x), $elm$core$String$fromFloat(x), $elm$core$String$toFloat); }; var $author$project$NumberInput$fromInt = function (x) { return A3( $author$project$NumberInput$Model, - x, + $elm$core$Maybe$Just(x), $elm$core$String$fromInt(x), $elm$core$String$toInt); }; @@ -11132,15 +11121,12 @@ var $author$project$Entry$searchResultDecoder = A3( $elm$json$Json$Decode$succeed($author$project$Entry$SearchResult)))))))))))); var $author$project$NumberInput$update = F2( function (str, model) { - var _v0 = model.convert(str); - if (_v0.$ === 'Nothing') { - return model; - } else { - var value = _v0.a; - return _Utils_update( - model, - {original: str, value: value}); - } + return _Utils_update( + model, + { + original: str, + value: model.convert(str) + }); }); var $author$project$Select$find = F2( function (pred, xs) { @@ -11172,15 +11158,45 @@ var $author$project$NumberInput$get = function ($) { var $author$project$Select$get = function ($) { return $.selected; }; +var $elm$core$Maybe$map = F2( + function (f, maybe) { + if (maybe.$ === 'Just') { + var value = maybe.a; + return $elm$core$Maybe$Just( + f(value)); + } else { + return $elm$core$Maybe$Nothing; + } + }); +var $elm$core$Basics$pow = _Basics_pow; +var $elm$core$Basics$round = _Basics_round; +var $author$project$Entry$roundTo = F2( + function (places, x) { + return $elm$core$Basics$round( + x * A2($elm$core$Basics$pow, 10, places)) / A2($elm$core$Basics$pow, 10, places); + }); +var $author$project$Entry$calculateGarfieldPrice = function (model) { + return A2( + $elm$core$Maybe$map, + function (netUnitPrice) { + return A2( + $author$project$Entry$roundTo, + 2, + (netUnitPrice * (1 + $author$project$Select$get(model.taxGroup).percentage)) + 0.01); + }, + $author$project$NumberInput$get(model.netUnitPrice)); +}; var $author$project$Entry$updateGrossUnitPrice = function (model) { return _Utils_update( model, { - grossUnitPrice: $author$project$NumberInput$fromFloat( + grossUnitPrice: A2( + $elm$core$Maybe$withDefault, + model.grossUnitPrice, A2( - $author$project$Entry$calculateGarfieldPrice, - $author$project$NumberInput$get(model.netUnitPrice), - $author$project$Select$get(model.taxGroup).percentage)) + $elm$core$Maybe$map, + $author$project$NumberInput$fromFloat, + $author$project$Entry$calculateGarfieldPrice(model))) }); }; var $author$project$Entry$updateState = F3( @@ -11235,53 +11251,53 @@ var $author$project$Entry$updateState = F3( var taxGroup = _v2.a; return _Utils_Tuple2( $author$project$Entry$ItemEditor( - { - barcode: searchResult.barcode, - grossUnitPrice: $author$project$NumberInput$fromFloat( - A2($author$project$Entry$calculateGarfieldPrice, searchResult.netUnitPrice, taxGroup.percentage)), - group: A4( - $author$project$Select$init, - A2( - $elm$core$Basics$composeR, + $author$project$Entry$updateGrossUnitPrice( + { + barcode: searchResult.barcode, + grossUnitPrice: $author$project$NumberInput$fromFloat(0), + group: A4( + $author$project$Select$init, + A2( + $elm$core$Basics$composeR, + function ($) { + return $.id; + }, + $elm$core$String$fromInt), function ($) { - return $.id; + return $.name; }, - $elm$core$String$fromInt), - function ($) { - return $.name; - }, - {id: searchResult.groupId, name: searchResult.groupName}, - globals.groups), - location: A4( - $author$project$Select$init, - A2( - $elm$core$Basics$composeR, + {id: searchResult.groupId, name: searchResult.groupName}, + globals.groups), + location: A4( + $author$project$Select$init, + A2( + $elm$core$Basics$composeR, + function ($) { + return $.id; + }, + $elm$core$String$fromInt), function ($) { - return $.id; + return $.name; }, - $elm$core$String$fromInt), - function ($) { - return $.name; - }, - {id: searchResult.locationId, name: searchResult.locationName}, - globals.locations), - name: searchResult.name, - netUnitPrice: $author$project$NumberInput$fromFloat(searchResult.netUnitPrice), - salesUnits: $author$project$NumberInput$fromInt(searchResult.salesUnits), - taxGroup: A4( - $author$project$Select$init, - A2( - $elm$core$Basics$composeR, + {id: searchResult.locationId, name: searchResult.locationName}, + globals.locations), + name: searchResult.name, + netUnitPrice: $author$project$NumberInput$fromFloat(searchResult.netUnitPrice), + salesUnits: $author$project$NumberInput$fromInt(searchResult.salesUnits), + taxGroup: A4( + $author$project$Select$init, + A2( + $elm$core$Basics$composeR, + function ($) { + return $.id; + }, + $elm$core$String$fromInt), function ($) { - return $.id; + return $.description; }, - $elm$core$String$fromInt), - function ($) { - return $.description; - }, - taxGroup, - globals.taxGroups) - }), + taxGroup, + globals.taxGroups) + })), $elm$core$Platform$Cmd$none); } default: @@ -11389,9 +11405,6 @@ var $author$project$Entry$update = F2( var $author$project$Entry$SetBarcode = function (a) { return {$: 'SetBarcode', a: a}; }; -var $author$project$Entry$SetGrossUnitPrice = function (a) { - return {$: 'SetGrossUnitPrice', a: a}; -}; var $author$project$Entry$SetGroup = function (a) { return {$: 'SetGroup', a: a}; }; @@ -11553,6 +11566,51 @@ var $author$project$Select$view = F2( ]), A2($elm$core$List$map, viewOption, model.options)); }); +var $author$project$Entry$SetGrossUnitPrice = function (a) { + return {$: 'SetGrossUnitPrice', a: a}; +}; +var $author$project$Entry$viewGrossUnitPriceInput = function (model) { + var suggestedPriceStr = function () { + var _v0 = $author$project$Entry$calculateGarfieldPrice(model); + if (_v0.$ === 'Nothing') { + return '?'; + } else { + var suggestedPrice = _v0.a; + return $elm$core$String$fromFloat(suggestedPrice); + } + }(); + return A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('form-input') + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$label, + _List_fromArray( + [ + $elm$html$Html$Attributes$for('gross-unit-price') + ]), + _List_fromArray( + [ + $elm$html$Html$text('Stückpreis (Brutto), Vorschlag: ' + suggestedPriceStr) + ])), + A2( + $elm$html$Html$input, + _List_fromArray( + [ + $elm$html$Html$Events$onInput($author$project$Entry$SetGrossUnitPrice), + $elm$html$Html$Attributes$value( + $author$project$NumberInput$show(model.grossUnitPrice)), + $elm$html$Html$Attributes$id('gross-unit-price'), + $elm$html$Html$Attributes$type_('number'), + $elm$html$Html$Attributes$step('0.01') + ]), + _List_Nil) + ])); +}; var $author$project$Entry$GotoItemEditor = function (a) { return {$: 'GotoItemEditor', a: a}; }; @@ -11955,42 +12013,7 @@ var $author$project$Entry$view = function (_v0) { ]), _List_Nil) ])), - A2( - $elm$html$Html$div, - _List_fromArray( - [ - $elm$html$Html$Attributes$class('form-input') - ]), - _List_fromArray( - [ - A2( - $elm$html$Html$label, - _List_fromArray( - [ - $elm$html$Html$Attributes$for('gross-unit-price') - ]), - _List_fromArray( - [ - $elm$html$Html$text( - 'Stückpreis (Brutto), Vorschlag: ' + $elm$core$String$fromFloat( - A2( - $author$project$Entry$calculateGarfieldPrice, - $author$project$NumberInput$get(model.netUnitPrice), - $author$project$Select$get(model.taxGroup).percentage))) - ])), - A2( - $elm$html$Html$input, - _List_fromArray( - [ - $elm$html$Html$Events$onInput($author$project$Entry$SetGrossUnitPrice), - $elm$html$Html$Attributes$value( - $author$project$NumberInput$show(model.grossUnitPrice)), - $elm$html$Html$Attributes$id('gross-unit-price'), - $elm$html$Html$Attributes$type_('number'), - $elm$html$Html$Attributes$step('0.01') - ]), - _List_Nil) - ])) + $author$project$Entry$viewGrossUnitPriceInput(model) ])) ])); } From 69dba202d0756d3fc6ff5c6d1f7c2544229ea5b7 Mon Sep 17 00:00:00 2001 From: Paul Brinkmeier Date: Sun, 20 Aug 2023 17:35:53 +0200 Subject: [PATCH 05/18] Move around gross unit price input --- frontend/Entry.elm | 74 +++++++----- jon/static/entry.js | 285 ++++++++++++++++++-------------------------- 2 files changed, 164 insertions(+), 195 deletions(-) diff --git a/frontend/Entry.elm b/frontend/Entry.elm index b410caa..c4c91a5 100644 --- a/frontend/Entry.elm +++ b/frontend/Entry.elm @@ -69,6 +69,16 @@ type alias TaxGroup = , percentage : Float } +type alias NewItem = + { barcode : String + , name : String + , salesUnits : Int + , group : Group + , location : Location + , netUnitPrice : Float + , taxGroup : TaxGroup + } + type alias Context = { globals : Globals , state : State @@ -135,11 +145,12 @@ updateState msg globals state = case state of case find (\tg -> tg.id == searchResult.taxGroupId) globals.taxGroups of Nothing -> (state, Cmd.none) Just taxGroup -> - ( ItemEditor <| updateGrossUnitPrice + ( ItemEditor { barcode = searchResult.barcode , name = searchResult.name , netUnitPrice = NumberInput.fromFloat searchResult.netUnitPrice - , grossUnitPrice = NumberInput.fromFloat 0 + , grossUnitPrice = NumberInput.fromFloat + (suggestedGrossPrice searchResult.netUnitPrice taxGroup.percentage) , salesUnits = NumberInput.fromInt searchResult.salesUnits , group = Select.init (.id >> String.fromInt) (.name) { id = searchResult.groupId, name = searchResult.groupName } globals.groups , location = Select.init (.id >> String.fromInt) (.name) { id = searchResult.locationId, name = searchResult.locationName } globals.locations @@ -157,26 +168,26 @@ updateState msg globals state = case state of SetSalesUnits str -> (ItemEditor { model | salesUnits = NumberInput.update str model.salesUnits }, Cmd.none) SetNetUnitPrice str -> - ( ItemEditor <| updateGrossUnitPrice { model | netUnitPrice = NumberInput.update str model.netUnitPrice } + ( ItemEditor { model | netUnitPrice = NumberInput.update str model.netUnitPrice } , Cmd.none ) SetGrossUnitPrice str -> - (ItemEditor { model | grossUnitPrice = NumberInput.update str model.grossUnitPrice }, Cmd.none) + ( ItemEditor { model | grossUnitPrice = NumberInput.update str model.grossUnitPrice } + , Cmd.none + ) SetGroup key -> (ItemEditor { model | group = Select.update key model.group }, Cmd.none) SetLocation key -> (ItemEditor { model | location = Select.update key model.location }, Cmd.none) SetTaxGroup key -> - ( ItemEditor <| updateGrossUnitPrice { model | taxGroup = Select.update key model.taxGroup } + ( ItemEditor { model | taxGroup = Select.update key model.taxGroup } , Cmd.none ) _ -> (state, Cmd.none) -updateGrossUnitPrice model = - { model - | grossUnitPrice = Maybe.withDefault model.grossUnitPrice <| Maybe.map NumberInput.fromFloat <| calculateGarfieldPrice model - } +suggestedGrossPrice netPrice percentage = + roundTo 2 <| netPrice * (1 + percentage) + 0.01 -- View stuff @@ -217,7 +228,7 @@ view { globals, state } = case state of , Select.view SetLocation model.location ] , div [ class "form-input" ] - [ label [ for "net-unit-price" ] [ text "Stückpreis (Netto)" ] + [ label [ for "net-unit-price" ] [ text "Einkaufspreis (Netto)" ] , input [ value <| NumberInput.show model.netUnitPrice , onInput SetNetUnitPrice @@ -231,29 +242,36 @@ view { globals, state } = case state of [ label [ for "tax-group" ] [ text "Steuergruppe" ] , Select.view SetTaxGroup model.taxGroup ] - ] - , fieldset [] - [ legend [] [ text "Neuer Snackeintrag" ] , div [ class "form-input" ] - [ label [ for "snack-name" ] [ text "Name" ] - , input [ value model.name, disabled True, id "snack-name" ] [] + [ label [ for "gross-unit-price" ] [ text "Verkaufspreis (Brutto)" ] + , input + [ value <| NumberInput.show model.grossUnitPrice + , onInput SetGrossUnitPrice + , type_ "number" + , id "gross-unit-price" + , step "0.01" + ] + [] + , viewSetSuggestedPriceButton model ] - , viewGrossUnitPriceInput model ] ] -viewGrossUnitPriceInput model = - let - suggestedPriceStr = case calculateGarfieldPrice model of - Nothing -> "?" - Just suggestedPrice -> String.fromFloat suggestedPrice - in - div [ class "form-input" ] - [ label [ for "gross-unit-price" ] - [ text <| "Stückpreis (Brutto), Vorschlag: " ++ suggestedPriceStr - ] - , input [ onInput SetGrossUnitPrice, value <| NumberInput.show model.grossUnitPrice, id "gross-unit-price", type_ "number", step "0.01" ] [] - ] +viewSetSuggestedPriceButton model = + case NumberInput.get model.netUnitPrice of + Nothing -> + button [ disabled True ] [ text "Auf ? setzen" ] + Just netUnitPrice -> + let + grossUnitPrice = suggestedGrossPrice netUnitPrice (Select.get model.taxGroup).percentage + in + button + [ onClick <| SetGrossUnitPrice <| String.fromFloat grossUnitPrice + -- Prevent submitting the form + , type_ "button" + ] + [ text <| "Auf " ++ String.fromFloat grossUnitPrice ++ " setzen" + ] searchResultHeaders = tr [] diff --git a/jon/static/entry.js b/jon/static/entry.js index 16b7f6b..fd6e49f 100644 --- a/jon/static/entry.js +++ b/jon/static/entry.js @@ -11119,6 +11119,17 @@ var $author$project$Entry$searchResultDecoder = A3( 'item_barcode', $elm$json$Json$Decode$string, $elm$json$Json$Decode$succeed($author$project$Entry$SearchResult)))))))))))); +var $elm$core$Basics$pow = _Basics_pow; +var $elm$core$Basics$round = _Basics_round; +var $author$project$Entry$roundTo = F2( + function (places, x) { + return $elm$core$Basics$round( + x * A2($elm$core$Basics$pow, 10, places)) / A2($elm$core$Basics$pow, 10, places); + }); +var $author$project$Entry$suggestedGrossPrice = F2( + function (netPrice, percentage) { + return A2($author$project$Entry$roundTo, 2, (netPrice * (1 + percentage)) + 0.01); + }); var $author$project$NumberInput$update = F2( function (str, model) { return _Utils_update( @@ -11152,53 +11163,6 @@ var $author$project$Select$update = F2( {selected: x}); } }); -var $author$project$NumberInput$get = function ($) { - return $.value; -}; -var $author$project$Select$get = function ($) { - return $.selected; -}; -var $elm$core$Maybe$map = F2( - function (f, maybe) { - if (maybe.$ === 'Just') { - var value = maybe.a; - return $elm$core$Maybe$Just( - f(value)); - } else { - return $elm$core$Maybe$Nothing; - } - }); -var $elm$core$Basics$pow = _Basics_pow; -var $elm$core$Basics$round = _Basics_round; -var $author$project$Entry$roundTo = F2( - function (places, x) { - return $elm$core$Basics$round( - x * A2($elm$core$Basics$pow, 10, places)) / A2($elm$core$Basics$pow, 10, places); - }); -var $author$project$Entry$calculateGarfieldPrice = function (model) { - return A2( - $elm$core$Maybe$map, - function (netUnitPrice) { - return A2( - $author$project$Entry$roundTo, - 2, - (netUnitPrice * (1 + $author$project$Select$get(model.taxGroup).percentage)) + 0.01); - }, - $author$project$NumberInput$get(model.netUnitPrice)); -}; -var $author$project$Entry$updateGrossUnitPrice = function (model) { - return _Utils_update( - model, - { - grossUnitPrice: A2( - $elm$core$Maybe$withDefault, - model.grossUnitPrice, - A2( - $elm$core$Maybe$map, - $author$project$NumberInput$fromFloat, - $author$project$Entry$calculateGarfieldPrice(model))) - }); -}; var $author$project$Entry$updateState = F3( function (msg, globals, state) { if (state.$ === 'ItemSearch') { @@ -11251,53 +11215,53 @@ var $author$project$Entry$updateState = F3( var taxGroup = _v2.a; return _Utils_Tuple2( $author$project$Entry$ItemEditor( - $author$project$Entry$updateGrossUnitPrice( - { - barcode: searchResult.barcode, - grossUnitPrice: $author$project$NumberInput$fromFloat(0), - group: A4( - $author$project$Select$init, - A2( - $elm$core$Basics$composeR, - function ($) { - return $.id; - }, - $elm$core$String$fromInt), + { + barcode: searchResult.barcode, + grossUnitPrice: $author$project$NumberInput$fromFloat( + A2($author$project$Entry$suggestedGrossPrice, searchResult.netUnitPrice, taxGroup.percentage)), + group: A4( + $author$project$Select$init, + A2( + $elm$core$Basics$composeR, function ($) { - return $.name; + return $.id; }, - {id: searchResult.groupId, name: searchResult.groupName}, - globals.groups), - location: A4( - $author$project$Select$init, - A2( - $elm$core$Basics$composeR, - function ($) { - return $.id; - }, - $elm$core$String$fromInt), + $elm$core$String$fromInt), + function ($) { + return $.name; + }, + {id: searchResult.groupId, name: searchResult.groupName}, + globals.groups), + location: A4( + $author$project$Select$init, + A2( + $elm$core$Basics$composeR, function ($) { - return $.name; + return $.id; }, - {id: searchResult.locationId, name: searchResult.locationName}, - globals.locations), - name: searchResult.name, - netUnitPrice: $author$project$NumberInput$fromFloat(searchResult.netUnitPrice), - salesUnits: $author$project$NumberInput$fromInt(searchResult.salesUnits), - taxGroup: A4( - $author$project$Select$init, - A2( - $elm$core$Basics$composeR, - function ($) { - return $.id; - }, - $elm$core$String$fromInt), + $elm$core$String$fromInt), + function ($) { + return $.name; + }, + {id: searchResult.locationId, name: searchResult.locationName}, + globals.locations), + name: searchResult.name, + netUnitPrice: $author$project$NumberInput$fromFloat(searchResult.netUnitPrice), + salesUnits: $author$project$NumberInput$fromInt(searchResult.salesUnits), + taxGroup: A4( + $author$project$Select$init, + A2( + $elm$core$Basics$composeR, function ($) { - return $.description; + return $.id; }, - taxGroup, - globals.taxGroups) - })), + $elm$core$String$fromInt), + function ($) { + return $.description; + }, + taxGroup, + globals.taxGroups) + }), $elm$core$Platform$Cmd$none); } default: @@ -11338,12 +11302,11 @@ var $author$project$Entry$updateState = F3( var str = msg.a; return _Utils_Tuple2( $author$project$Entry$ItemEditor( - $author$project$Entry$updateGrossUnitPrice( - _Utils_update( - model, - { - netUnitPrice: A2($author$project$NumberInput$update, str, model.netUnitPrice) - }))), + _Utils_update( + model, + { + netUnitPrice: A2($author$project$NumberInput$update, str, model.netUnitPrice) + })), $elm$core$Platform$Cmd$none); case 'SetGrossUnitPrice': var str = msg.a; @@ -11379,12 +11342,11 @@ var $author$project$Entry$updateState = F3( var key = msg.a; return _Utils_Tuple2( $author$project$Entry$ItemEditor( - $author$project$Entry$updateGrossUnitPrice( - _Utils_update( - model, - { - taxGroup: A2($author$project$Select$update, key, model.taxGroup) - }))), + _Utils_update( + model, + { + taxGroup: A2($author$project$Select$update, key, model.taxGroup) + })), $elm$core$Platform$Cmd$none); default: return _Utils_Tuple2(state, $elm$core$Platform$Cmd$none); @@ -11405,6 +11367,9 @@ var $author$project$Entry$update = F2( var $author$project$Entry$SetBarcode = function (a) { return {$: 'SetBarcode', a: a}; }; +var $author$project$Entry$SetGrossUnitPrice = function (a) { + return {$: 'SetGrossUnitPrice', a: a}; +}; var $author$project$Entry$SetGroup = function (a) { return {$: 'SetGroup', a: a}; }; @@ -11566,51 +11531,6 @@ var $author$project$Select$view = F2( ]), A2($elm$core$List$map, viewOption, model.options)); }); -var $author$project$Entry$SetGrossUnitPrice = function (a) { - return {$: 'SetGrossUnitPrice', a: a}; -}; -var $author$project$Entry$viewGrossUnitPriceInput = function (model) { - var suggestedPriceStr = function () { - var _v0 = $author$project$Entry$calculateGarfieldPrice(model); - if (_v0.$ === 'Nothing') { - return '?'; - } else { - var suggestedPrice = _v0.a; - return $elm$core$String$fromFloat(suggestedPrice); - } - }(); - return A2( - $elm$html$Html$div, - _List_fromArray( - [ - $elm$html$Html$Attributes$class('form-input') - ]), - _List_fromArray( - [ - A2( - $elm$html$Html$label, - _List_fromArray( - [ - $elm$html$Html$Attributes$for('gross-unit-price') - ]), - _List_fromArray( - [ - $elm$html$Html$text('Stückpreis (Brutto), Vorschlag: ' + suggestedPriceStr) - ])), - A2( - $elm$html$Html$input, - _List_fromArray( - [ - $elm$html$Html$Events$onInput($author$project$Entry$SetGrossUnitPrice), - $elm$html$Html$Attributes$value( - $author$project$NumberInput$show(model.grossUnitPrice)), - $elm$html$Html$Attributes$id('gross-unit-price'), - $elm$html$Html$Attributes$type_('number'), - $elm$html$Html$Attributes$step('0.01') - ]), - _List_Nil) - ])); -}; var $author$project$Entry$GotoItemEditor = function (a) { return {$: 'GotoItemEditor', a: a}; }; @@ -11712,6 +11632,47 @@ var $author$project$Entry$viewSearchResult = function (model) { ])) ])); }; +var $author$project$NumberInput$get = function ($) { + return $.value; +}; +var $author$project$Select$get = function ($) { + return $.selected; +}; +var $author$project$Entry$viewSetSuggestedPriceButton = function (model) { + var _v0 = $author$project$NumberInput$get(model.netUnitPrice); + if (_v0.$ === 'Nothing') { + return A2( + $elm$html$Html$button, + _List_fromArray( + [ + $elm$html$Html$Attributes$disabled(true) + ]), + _List_fromArray( + [ + $elm$html$Html$text('Auf ? setzen') + ])); + } else { + var netUnitPrice = _v0.a; + var grossUnitPrice = A2( + $author$project$Entry$suggestedGrossPrice, + netUnitPrice, + $author$project$Select$get(model.taxGroup).percentage); + return A2( + $elm$html$Html$button, + _List_fromArray( + [ + $elm$html$Html$Events$onClick( + $author$project$Entry$SetGrossUnitPrice( + $elm$core$String$fromFloat(grossUnitPrice))), + $elm$html$Html$Attributes$type_('button') + ]), + _List_fromArray( + [ + $elm$html$Html$text( + 'Auf ' + ($elm$core$String$fromFloat(grossUnitPrice) + ' setzen')) + ])); + } +}; var $author$project$Entry$view = function (_v0) { var globals = _v0.globals; var state = _v0.state; @@ -11937,7 +11898,7 @@ var $author$project$Entry$view = function (_v0) { ]), _List_fromArray( [ - $elm$html$Html$text('Stückpreis (Netto)') + $elm$html$Html$text('Einkaufspreis (Netto)') ])), A2( $elm$html$Html$input, @@ -11971,19 +11932,6 @@ var $author$project$Entry$view = function (_v0) { $elm$html$Html$text('Steuergruppe') ])), A2($author$project$Select$view, $author$project$Entry$SetTaxGroup, model.taxGroup) - ])) - ])), - A2( - $elm$html$Html$fieldset, - _List_Nil, - _List_fromArray( - [ - A2( - $elm$html$Html$legend, - _List_Nil, - _List_fromArray( - [ - $elm$html$Html$text('Neuer Snackeintrag') ])), A2( $elm$html$Html$div, @@ -11997,23 +11945,26 @@ var $author$project$Entry$view = function (_v0) { $elm$html$Html$label, _List_fromArray( [ - $elm$html$Html$Attributes$for('snack-name') + $elm$html$Html$Attributes$for('gross-unit-price') ]), _List_fromArray( [ - $elm$html$Html$text('Name') + $elm$html$Html$text('Verkaufspreis (Brutto)') ])), A2( $elm$html$Html$input, _List_fromArray( [ - $elm$html$Html$Attributes$value(model.name), - $elm$html$Html$Attributes$disabled(true), - $elm$html$Html$Attributes$id('snack-name') + $elm$html$Html$Attributes$value( + $author$project$NumberInput$show(model.grossUnitPrice)), + $elm$html$Html$Events$onInput($author$project$Entry$SetGrossUnitPrice), + $elm$html$Html$Attributes$type_('number'), + $elm$html$Html$Attributes$id('gross-unit-price'), + $elm$html$Html$Attributes$step('0.01') ]), - _List_Nil) - ])), - $author$project$Entry$viewGrossUnitPriceInput(model) + _List_Nil), + $author$project$Entry$viewSetSuggestedPriceButton(model) + ])) ])) ])); } From f7dd572fe1cb00ca8a364887b68ac8e8214c50a2 Mon Sep 17 00:00:00 2001 From: Paul Brinkmeier Date: Sun, 20 Aug 2023 17:36:52 +0200 Subject: [PATCH 06/18] Add note about entry.js to readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 06f33ae..85db926 100644 --- a/README.md +++ b/README.md @@ -39,3 +39,4 @@ ssh -nNTvL 5432:fsmi-db.fsmi.org:5432 fsmi-login.fsmi.uni-karlsruhe.de - [ ] Use `flask-session` for file-backed sessions - [ ] Use `flask-login` with a single user stored in memory - [ ] Improve project structure +- [ ] Figure out/Add documentation about building `entry.js` From 208cc54e530bf90834f7d161757e53c4d9ad1f27 Mon Sep 17 00:00:00 2001 From: Paul Brinkmeier Date: Sun, 20 Aug 2023 18:26:39 +0200 Subject: [PATCH 07/18] Implement price calculator --- frontend/Entry.elm | 123 +++++++++++++++++- jon/static/entry.js | 307 ++++++++++++++++++++++++++++++++++++++++---- jon/static/jon.css | 3 + 3 files changed, 402 insertions(+), 31 deletions(-) diff --git a/frontend/Entry.elm b/frontend/Entry.elm index c4c91a5..e0a40fe 100644 --- a/frontend/Entry.elm +++ b/frontend/Entry.elm @@ -90,6 +90,35 @@ type alias Globals = , taxGroups : List TaxGroup } +type CalculatorTax = Net | Gross + +ctToInt ct = case ct of + Gross -> 0 + Net -> 1 + +ctShow ct = case ct of + Gross -> "Brutto" + Net -> "Netto" + +type alias CalculatorModel = + { tax : Select.Model CalculatorTax + , bundlePrice : NumberInput.Model Float + , bundleSize : NumberInput.Model Int + } + +type CalculatorMsg + = SetTax String + | SetBundlePrice String + | SetBundleSize String + +updateCalculator msg model = case msg of + SetTax key -> + { model | tax = Select.update key model.tax } + SetBundlePrice str -> + { model | bundlePrice = NumberInput.update str model.bundlePrice } + SetBundleSize str -> + { model | bundleSize = NumberInput.update str model.bundleSize } + type State = ItemSearch { searchTerm : String @@ -99,6 +128,7 @@ type State { barcode : String , name : String , salesUnits : NumberInput.Model Int + , calculator : CalculatorModel , netUnitPrice : NumberInput.Model Float , grossUnitPrice : NumberInput.Model Float , group : Select.Model Group @@ -114,6 +144,7 @@ type Msg | SetBarcode String | SetName String | SetSalesUnits String + | CalculatorMsg CalculatorMsg | SetNetUnitPrice String | SetGrossUnitPrice String | SetGroup String @@ -148,6 +179,11 @@ updateState msg globals state = case state of ( ItemEditor { barcode = searchResult.barcode , name = searchResult.name + , calculator = + { tax = Select.init ctShow ctShow Net [Net, Gross] + , bundlePrice = NumberInput.fromFloat searchResult.netUnitPrice + , bundleSize = NumberInput.fromInt 1 + } , netUnitPrice = NumberInput.fromFloat searchResult.netUnitPrice , grossUnitPrice = NumberInput.fromFloat (suggestedGrossPrice searchResult.netUnitPrice taxGroup.percentage) @@ -167,6 +203,8 @@ updateState msg globals state = case state of (ItemEditor { model | name = name }, Cmd.none) SetSalesUnits str -> (ItemEditor { model | salesUnits = NumberInput.update str model.salesUnits }, Cmd.none) + CalculatorMsg msg_ -> + (ItemEditor { model | calculator = updateCalculator msg_ model.calculator }, Cmd.none) SetNetUnitPrice str -> ( ItemEditor { model | netUnitPrice = NumberInput.update str model.netUnitPrice } , Cmd.none @@ -227,6 +265,11 @@ view { globals, state } = case state of [ label [ for "location" ] [ text "Raum" ] , Select.view SetLocation model.location ] + , div [ class "form-input" ] + [ label [ for "tax-group" ] [ text "Steuergruppe" ] + , Select.view SetTaxGroup model.taxGroup + ] + , Html.map CalculatorMsg <| viewCalculator model.calculator (Select.get model.taxGroup) , div [ class "form-input" ] [ label [ for "net-unit-price" ] [ text "Einkaufspreis (Netto)" ] , input @@ -237,10 +280,7 @@ view { globals, state } = case state of , step "0.01" ] [] - ] - , div [ class "form-input" ] - [ label [ for "tax-group" ] [ text "Steuergruppe" ] - , Select.view SetTaxGroup model.taxGroup + , viewSetCalculatedPriceButton model ] , div [ class "form-input" ] [ label [ for "gross-unit-price" ] [ text "Verkaufspreis (Brutto)" ] @@ -257,6 +297,81 @@ view { globals, state } = case state of ] ] +viewCalculator model taxGroup = + let + mainPart = + [ text "(" + , input + [ class "formula-input", placeholder "Gebindepreis" + , value <| NumberInput.show model.bundlePrice + , onInput SetBundlePrice + ] + [] + , text " ÷ " + , input + [ class "formula-input", placeholder "Gebindegröße" + , value <| NumberInput.show model.bundleSize + , onInput SetBundleSize + ] + [] + , text ") " + ] + taxPart = + [ text " ÷ " + , input + [ class "formula-input" + , disabled True + , value <| String.fromFloat <| 1 + taxGroup.percentage + ] + [] + ] + resultPart = + [ text " = " + , input + [ class "formula-input" + , disabled True + , value <| Maybe.withDefault "?" <| Maybe.map String.fromFloat <| calculatorResult model taxGroup + ] + [] + ] + in + fieldset [] + [ legend [] [ text "Preisrechner" ] + , div [] <| List.concat <| List.filterMap identity + [ Just mainPart + , if Select.get model.tax == Gross then Just taxPart else Nothing + , Just resultPart + ] + , div [ class "form-input" ] + [ label [ for "calculator-tax" ] [ text "Gebindepreis ist" ] + , Select.view SetTax model.tax + ] + ] + +calculatorResult model taxGroup = + case (NumberInput.get model.bundlePrice, NumberInput.get model.bundleSize) of + (Just bundlePrice, Just bundleSize) -> + Just <| roundTo 2 <| + if Select.get model.tax == Gross then + (bundlePrice / toFloat bundleSize) / (1 + taxGroup.percentage) + else + bundlePrice / toFloat bundleSize + _ -> + Nothing + +viewSetCalculatedPriceButton model = + case calculatorResult model.calculator (Select.get model.taxGroup) of + Nothing -> + button [ disabled True ] [ text "Auf ? setzen" ] + Just calculatedPrice -> + button + [ onClick <| SetNetUnitPrice <| String.fromFloat calculatedPrice + -- Prevent submitting the form + , type_ "button" + ] + [ text <| "Auf " ++ String.fromFloat calculatedPrice ++ " setzen" + ] + viewSetSuggestedPriceButton model = case NumberInput.get model.netUnitPrice of Nothing -> diff --git a/jon/static/entry.js b/jon/static/entry.js index fd6e49f..f185616 100644 --- a/jon/static/entry.js +++ b/jon/static/entry.js @@ -10739,12 +10739,21 @@ var $elm$core$Basics$never = function (_v0) { var $elm$browser$Browser$element = _Browser_element; var $elm$core$Platform$Sub$batch = _Platform_batch; var $elm$core$Platform$Sub$none = $elm$core$Platform$Sub$batch(_List_Nil); +var $author$project$Entry$Gross = {$: 'Gross'}; var $author$project$Entry$ItemEditor = function (a) { return {$: 'ItemEditor', a: a}; }; +var $author$project$Entry$Net = {$: 'Net'}; var $author$project$Entry$ReceiveSearchResults = function (a) { return {$: 'ReceiveSearchResults', a: a}; }; +var $author$project$Entry$ctShow = function (ct) { + if (ct.$ === 'Gross') { + return 'Brutto'; + } else { + return 'Netto'; + } +}; var $elm$http$Http$BadStatus_ = F2( function (a, b) { return {$: 'BadStatus_', a: a, b: b}; @@ -11163,6 +11172,32 @@ var $author$project$Select$update = F2( {selected: x}); } }); +var $author$project$Entry$updateCalculator = F2( + function (msg, model) { + switch (msg.$) { + case 'SetTax': + var key = msg.a; + return _Utils_update( + model, + { + tax: A2($author$project$Select$update, key, model.tax) + }); + case 'SetBundlePrice': + var str = msg.a; + return _Utils_update( + model, + { + bundlePrice: A2($author$project$NumberInput$update, str, model.bundlePrice) + }); + default: + var str = msg.a; + return _Utils_update( + model, + { + bundleSize: A2($author$project$NumberInput$update, str, model.bundleSize) + }); + } + }); var $author$project$Entry$updateState = F3( function (msg, globals, state) { if (state.$ === 'ItemSearch') { @@ -11217,6 +11252,17 @@ var $author$project$Entry$updateState = F3( $author$project$Entry$ItemEditor( { barcode: searchResult.barcode, + calculator: { + bundlePrice: $author$project$NumberInput$fromFloat(searchResult.netUnitPrice), + bundleSize: $author$project$NumberInput$fromInt(1), + tax: A4( + $author$project$Select$init, + $author$project$Entry$ctShow, + $author$project$Entry$ctShow, + $author$project$Entry$Net, + _List_fromArray( + [$author$project$Entry$Net, $author$project$Entry$Gross])) + }, grossUnitPrice: $author$project$NumberInput$fromFloat( A2($author$project$Entry$suggestedGrossPrice, searchResult.netUnitPrice, taxGroup.percentage)), group: A4( @@ -11298,6 +11344,16 @@ var $author$project$Entry$updateState = F3( salesUnits: A2($author$project$NumberInput$update, str, model.salesUnits) })), $elm$core$Platform$Cmd$none); + case 'CalculatorMsg': + var msg_ = msg.a; + return _Utils_Tuple2( + $author$project$Entry$ItemEditor( + _Utils_update( + model, + { + calculator: A2($author$project$Entry$updateCalculator, msg_, model.calculator) + })), + $elm$core$Platform$Cmd$none); case 'SetNetUnitPrice': var str = msg.a; return _Utils_Tuple2( @@ -11364,6 +11420,9 @@ var $author$project$Entry$update = F2( {globals: globals, state: state_}, cmd); }); +var $author$project$Entry$CalculatorMsg = function (a) { + return {$: 'CalculatorMsg', a: a}; +}; var $author$project$Entry$SetBarcode = function (a) { return {$: 'SetBarcode', a: a}; }; @@ -11404,6 +11463,9 @@ var $elm$html$Html$Attributes$disabled = $elm$html$Html$Attributes$boolProperty( var $elm$html$Html$fieldset = _VirtualDom_node('fieldset'); var $elm$html$Html$Attributes$for = $elm$html$Html$Attributes$stringProperty('htmlFor'); var $elm$html$Html$form = _VirtualDom_node('form'); +var $author$project$Select$get = function ($) { + return $.selected; +}; var $elm$html$Html$label = _VirtualDom_node('label'); var $elm$html$Html$legend = _VirtualDom_node('legend'); var $elm$html$Html$Events$alwaysPreventDefault = function (msg) { @@ -11531,6 +11593,161 @@ var $author$project$Select$view = F2( ]), A2($elm$core$List$map, viewOption, model.options)); }); +var $author$project$Entry$SetBundlePrice = function (a) { + return {$: 'SetBundlePrice', a: a}; +}; +var $author$project$Entry$SetBundleSize = function (a) { + return {$: 'SetBundleSize', a: a}; +}; +var $author$project$Entry$SetTax = function (a) { + return {$: 'SetTax', a: a}; +}; +var $author$project$NumberInput$get = function ($) { + return $.value; +}; +var $author$project$Entry$calculatorResult = F2( + function (model, taxGroup) { + var _v0 = _Utils_Tuple2( + $author$project$NumberInput$get(model.bundlePrice), + $author$project$NumberInput$get(model.bundleSize)); + if ((_v0.a.$ === 'Just') && (_v0.b.$ === 'Just')) { + var bundlePrice = _v0.a.a; + var bundleSize = _v0.b.a; + return $elm$core$Maybe$Just( + A2( + $author$project$Entry$roundTo, + 2, + _Utils_eq( + $author$project$Select$get(model.tax), + $author$project$Entry$Gross) ? ((bundlePrice / bundleSize) / (1 + taxGroup.percentage)) : (bundlePrice / bundleSize))); + } else { + return $elm$core$Maybe$Nothing; + } + }); +var $elm$core$Maybe$map = F2( + function (f, maybe) { + if (maybe.$ === 'Just') { + var value = maybe.a; + return $elm$core$Maybe$Just( + f(value)); + } else { + return $elm$core$Maybe$Nothing; + } + }); +var $elm$html$Html$Attributes$placeholder = $elm$html$Html$Attributes$stringProperty('placeholder'); +var $author$project$Entry$viewCalculator = F2( + function (model, taxGroup) { + var taxPart = _List_fromArray( + [ + $elm$html$Html$text(' ÷ '), + A2( + $elm$html$Html$input, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('formula-input'), + $elm$html$Html$Attributes$disabled(true), + $elm$html$Html$Attributes$value( + $elm$core$String$fromFloat(1 + taxGroup.percentage)) + ]), + _List_Nil) + ]); + var resultPart = _List_fromArray( + [ + $elm$html$Html$text(' = '), + A2( + $elm$html$Html$input, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('formula-input'), + $elm$html$Html$Attributes$disabled(true), + $elm$html$Html$Attributes$value( + A2( + $elm$core$Maybe$withDefault, + '?', + A2( + $elm$core$Maybe$map, + $elm$core$String$fromFloat, + A2($author$project$Entry$calculatorResult, model, taxGroup)))) + ]), + _List_Nil) + ]); + var mainPart = _List_fromArray( + [ + $elm$html$Html$text('('), + A2( + $elm$html$Html$input, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('formula-input'), + $elm$html$Html$Attributes$placeholder('Gebindepreis'), + $elm$html$Html$Attributes$value( + $author$project$NumberInput$show(model.bundlePrice)), + $elm$html$Html$Events$onInput($author$project$Entry$SetBundlePrice) + ]), + _List_Nil), + $elm$html$Html$text(' ÷ '), + A2( + $elm$html$Html$input, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('formula-input'), + $elm$html$Html$Attributes$placeholder('Gebindegröße'), + $elm$html$Html$Attributes$value( + $author$project$NumberInput$show(model.bundleSize)), + $elm$html$Html$Events$onInput($author$project$Entry$SetBundleSize) + ]), + _List_Nil), + $elm$html$Html$text(') ') + ]); + return A2( + $elm$html$Html$fieldset, + _List_Nil, + _List_fromArray( + [ + A2( + $elm$html$Html$legend, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text('Preisrechner') + ])), + A2( + $elm$html$Html$div, + _List_Nil, + $elm$core$List$concat( + A2( + $elm$core$List$filterMap, + $elm$core$Basics$identity, + _List_fromArray( + [ + $elm$core$Maybe$Just(mainPart), + _Utils_eq( + $author$project$Select$get(model.tax), + $author$project$Entry$Gross) ? $elm$core$Maybe$Just(taxPart) : $elm$core$Maybe$Nothing, + $elm$core$Maybe$Just(resultPart) + ])))), + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('form-input') + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$label, + _List_fromArray( + [ + $elm$html$Html$Attributes$for('calculator-tax') + ]), + _List_fromArray( + [ + $elm$html$Html$text('Gebindepreis ist') + ])), + A2($author$project$Select$view, $author$project$Entry$SetTax, model.tax) + ])) + ])); + }); var $author$project$Entry$GotoItemEditor = function (a) { return {$: 'GotoItemEditor', a: a}; }; @@ -11632,11 +11849,39 @@ var $author$project$Entry$viewSearchResult = function (model) { ])) ])); }; -var $author$project$NumberInput$get = function ($) { - return $.value; -}; -var $author$project$Select$get = function ($) { - return $.selected; +var $author$project$Entry$viewSetCalculatedPriceButton = function (model) { + var _v0 = A2( + $author$project$Entry$calculatorResult, + model.calculator, + $author$project$Select$get(model.taxGroup)); + if (_v0.$ === 'Nothing') { + return A2( + $elm$html$Html$button, + _List_fromArray( + [ + $elm$html$Html$Attributes$disabled(true) + ]), + _List_fromArray( + [ + $elm$html$Html$text('Auf ? setzen') + ])); + } else { + var calculatedPrice = _v0.a; + return A2( + $elm$html$Html$button, + _List_fromArray( + [ + $elm$html$Html$Events$onClick( + $author$project$Entry$SetNetUnitPrice( + $elm$core$String$fromFloat(calculatedPrice))), + $elm$html$Html$Attributes$type_('button') + ]), + _List_fromArray( + [ + $elm$html$Html$text( + 'Auf ' + ($elm$core$String$fromFloat(calculatedPrice) + ' setzen')) + ])); + } }; var $author$project$Entry$viewSetSuggestedPriceButton = function (model) { var _v0 = $author$project$NumberInput$get(model.netUnitPrice); @@ -11884,6 +12129,33 @@ var $author$project$Entry$view = function (_v0) { ])), A2( $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('form-input') + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$label, + _List_fromArray( + [ + $elm$html$Html$Attributes$for('tax-group') + ]), + _List_fromArray( + [ + $elm$html$Html$text('Steuergruppe') + ])), + A2($author$project$Select$view, $author$project$Entry$SetTaxGroup, model.taxGroup) + ])), + A2( + $elm$html$Html$map, + $author$project$Entry$CalculatorMsg, + A2( + $author$project$Entry$viewCalculator, + model.calculator, + $author$project$Select$get(model.taxGroup))), + A2( + $elm$html$Html$div, _List_fromArray( [ $elm$html$Html$Attributes$class('form-input') @@ -11911,27 +12183,8 @@ var $author$project$Entry$view = function (_v0) { $elm$html$Html$Attributes$id('net-unit-price'), $elm$html$Html$Attributes$step('0.01') ]), - _List_Nil) - ])), - A2( - $elm$html$Html$div, - _List_fromArray( - [ - $elm$html$Html$Attributes$class('form-input') - ]), - _List_fromArray( - [ - A2( - $elm$html$Html$label, - _List_fromArray( - [ - $elm$html$Html$Attributes$for('tax-group') - ]), - _List_fromArray( - [ - $elm$html$Html$text('Steuergruppe') - ])), - A2($author$project$Select$view, $author$project$Entry$SetTaxGroup, model.taxGroup) + _List_Nil), + $author$project$Entry$viewSetCalculatedPriceButton(model) ])), A2( $elm$html$Html$div, @@ -12053,4 +12306,4 @@ _Platform_export({'Entry':{'init':$author$project$Entry$main( }, A2($elm$json$Json$Decode$field, 'id', $elm$json$Json$Decode$int)); }, - A2($elm$json$Json$Decode$field, 'percentage', $elm$json$Json$Decode$float))))))({"versions":{"elm":"0.19.1"},"types":{"message":"Entry.Msg","aliases":{"Entry.SearchResult":{"args":[],"type":"{ barcode : String.String, name : String.String, netUnitPrice : Basics.Float, bought : String.String, salesUnits : Basics.Int, available : Basics.Bool, locationName : String.String, locationId : Basics.Int, groupName : String.String, groupId : Basics.Int, taxGroupId : Basics.Int }"}},"unions":{"Entry.Msg":{"args":[],"tags":{"SetSearchTerm":["String.String"],"SubmitSearch":[],"ReceiveSearchResults":["Result.Result Http.Error (List.List Entry.SearchResult)"],"GotoItemEditor":["Entry.SearchResult"],"SetBarcode":["String.String"],"SetName":["String.String"],"SetSalesUnits":["String.String"],"SetNetUnitPrice":["String.String"],"SetGrossUnitPrice":["String.String"],"SetGroup":["String.String"],"SetLocation":["String.String"],"SetTaxGroup":["String.String"]}},"Basics.Bool":{"args":[],"tags":{"True":[],"False":[]}},"Http.Error":{"args":[],"tags":{"BadUrl":["String.String"],"Timeout":[],"NetworkError":[],"BadStatus":["Basics.Int"],"BadBody":["String.String"]}},"Basics.Float":{"args":[],"tags":{"Float":[]}},"Basics.Int":{"args":[],"tags":{"Int":[]}},"List.List":{"args":["a"],"tags":{}},"Result.Result":{"args":["error","value"],"tags":{"Ok":["value"],"Err":["error"]}},"String.String":{"args":[],"tags":{"String":[]}}}}})}});}(this)); \ No newline at end of file + A2($elm$json$Json$Decode$field, 'percentage', $elm$json$Json$Decode$float))))))({"versions":{"elm":"0.19.1"},"types":{"message":"Entry.Msg","aliases":{"Entry.SearchResult":{"args":[],"type":"{ barcode : String.String, name : String.String, netUnitPrice : Basics.Float, bought : String.String, salesUnits : Basics.Int, available : Basics.Bool, locationName : String.String, locationId : Basics.Int, groupName : String.String, groupId : Basics.Int, taxGroupId : Basics.Int }"}},"unions":{"Entry.Msg":{"args":[],"tags":{"SetSearchTerm":["String.String"],"SubmitSearch":[],"ReceiveSearchResults":["Result.Result Http.Error (List.List Entry.SearchResult)"],"GotoItemEditor":["Entry.SearchResult"],"SetBarcode":["String.String"],"SetName":["String.String"],"SetSalesUnits":["String.String"],"CalculatorMsg":["Entry.CalculatorMsg"],"SetNetUnitPrice":["String.String"],"SetGrossUnitPrice":["String.String"],"SetGroup":["String.String"],"SetLocation":["String.String"],"SetTaxGroup":["String.String"]}},"Basics.Bool":{"args":[],"tags":{"True":[],"False":[]}},"Entry.CalculatorMsg":{"args":[],"tags":{"SetTax":["String.String"],"SetBundlePrice":["String.String"],"SetBundleSize":["String.String"]}},"Http.Error":{"args":[],"tags":{"BadUrl":["String.String"],"Timeout":[],"NetworkError":[],"BadStatus":["Basics.Int"],"BadBody":["String.String"]}},"Basics.Float":{"args":[],"tags":{"Float":[]}},"Basics.Int":{"args":[],"tags":{"Int":[]}},"List.List":{"args":["a"],"tags":{}},"Result.Result":{"args":["error","value"],"tags":{"Ok":["value"],"Err":["error"]}},"String.String":{"args":[],"tags":{"String":[]}}}}})}});}(this)); \ No newline at end of file diff --git a/jon/static/jon.css b/jon/static/jon.css index 9897996..386c1fd 100644 --- a/jon/static/jon.css +++ b/jon/static/jon.css @@ -63,3 +63,6 @@ th { .form-input > select { display: block; } +.formula-input { + width: 10em; +} From ca2e2e2e4a9bc489e043e82c3cd36b3384df65ac Mon Sep 17 00:00:00 2001 From: Paul Brinkmeier Date: Sun, 20 Aug 2023 18:35:03 +0200 Subject: [PATCH 08/18] Refactor calculator into its own module --- frontend/Calculator.elm | 103 ++++++++++++++++++++++++++ frontend/Entry.elm | 108 ++------------------------- jon/static/entry.js | 158 +++++++++++++++++++++------------------- 3 files changed, 195 insertions(+), 174 deletions(-) create mode 100644 frontend/Calculator.elm diff --git a/frontend/Calculator.elm b/frontend/Calculator.elm new file mode 100644 index 0000000..71043ee --- /dev/null +++ b/frontend/Calculator.elm @@ -0,0 +1,103 @@ +module Calculator exposing (..) + +import Html exposing (..) +import Html.Attributes exposing (..) +import Html.Events exposing (..) + +import NumberInput +import Select + +type Tax = Net | Gross + +ctShow ct = case ct of + Gross -> "Brutto" + Net -> "Netto" + +type alias Model = + { tax : Select.Model Tax + , bundlePrice : NumberInput.Model Float + , bundleSize : NumberInput.Model Int + } + +init bundlePrice = Model + (Select.init ctShow ctShow Net [Net, Gross]) + (NumberInput.fromFloat bundlePrice) + (NumberInput.fromInt 1) + +getResult model taxGroup = + case (NumberInput.get model.bundlePrice, NumberInput.get model.bundleSize) of + (Just bundlePrice, Just bundleSize) -> + Just <| roundTo 2 <| + if Select.get model.tax == Gross then + (bundlePrice / toFloat bundleSize) / (1 + taxGroup.percentage) + else + bundlePrice / toFloat bundleSize + _ -> + Nothing + + +type Msg + = SetTax String + | SetBundlePrice String + | SetBundleSize String + +update msg model = case msg of + SetTax key -> + { model | tax = Select.update key model.tax } + SetBundlePrice str -> + { model | bundlePrice = NumberInput.update str model.bundlePrice } + SetBundleSize str -> + { model | bundleSize = NumberInput.update str model.bundleSize } + +view model taxGroup = + let + mainPart = + [ text "(" + , input + [ class "formula-input", placeholder "Gebindepreis" + , value <| NumberInput.show model.bundlePrice + , onInput SetBundlePrice + ] + [] + , text " ÷ " + , input + [ class "formula-input", placeholder "Gebindegröße" + , value <| NumberInput.show model.bundleSize + , onInput SetBundleSize + ] + [] + , text ") " + ] + taxPart = + [ text " ÷ " + , input + [ class "formula-input" + , disabled True + , value <| String.fromFloat <| 1 + taxGroup.percentage + ] + [] + ] + resultPart = + [ text " = " + , input + [ class "formula-input" + , disabled True + , value <| Maybe.withDefault "?" <| Maybe.map String.fromFloat <| getResult model taxGroup + ] + [] + ] + in + fieldset [] + [ legend [] [ text "Preisrechner" ] + , div [] <| List.concat <| List.filterMap identity + [ Just mainPart + , if Select.get model.tax == Gross then Just taxPart else Nothing + , Just resultPart + ] + , div [ class "form-input" ] + [ label [ for "calculator-tax" ] [ text "Gebindepreis ist" ] + , Select.view SetTax model.tax + ] + ] + +roundTo places x = toFloat (round <| x * 10 ^ places) / 10 ^ places diff --git a/frontend/Entry.elm b/frontend/Entry.elm index e0a40fe..d0e1bad 100644 --- a/frontend/Entry.elm +++ b/frontend/Entry.elm @@ -10,6 +10,7 @@ import Html exposing (..) import Html.Attributes exposing (..) import Html.Events exposing (..) +import Calculator import NumberInput import Select @@ -90,35 +91,6 @@ type alias Globals = , taxGroups : List TaxGroup } -type CalculatorTax = Net | Gross - -ctToInt ct = case ct of - Gross -> 0 - Net -> 1 - -ctShow ct = case ct of - Gross -> "Brutto" - Net -> "Netto" - -type alias CalculatorModel = - { tax : Select.Model CalculatorTax - , bundlePrice : NumberInput.Model Float - , bundleSize : NumberInput.Model Int - } - -type CalculatorMsg - = SetTax String - | SetBundlePrice String - | SetBundleSize String - -updateCalculator msg model = case msg of - SetTax key -> - { model | tax = Select.update key model.tax } - SetBundlePrice str -> - { model | bundlePrice = NumberInput.update str model.bundlePrice } - SetBundleSize str -> - { model | bundleSize = NumberInput.update str model.bundleSize } - type State = ItemSearch { searchTerm : String @@ -128,7 +100,7 @@ type State { barcode : String , name : String , salesUnits : NumberInput.Model Int - , calculator : CalculatorModel + , calculator : Calculator.Model , netUnitPrice : NumberInput.Model Float , grossUnitPrice : NumberInput.Model Float , group : Select.Model Group @@ -144,7 +116,7 @@ type Msg | SetBarcode String | SetName String | SetSalesUnits String - | CalculatorMsg CalculatorMsg + | CalculatorMsg Calculator.Msg | SetNetUnitPrice String | SetGrossUnitPrice String | SetGroup String @@ -179,11 +151,7 @@ updateState msg globals state = case state of ( ItemEditor { barcode = searchResult.barcode , name = searchResult.name - , calculator = - { tax = Select.init ctShow ctShow Net [Net, Gross] - , bundlePrice = NumberInput.fromFloat searchResult.netUnitPrice - , bundleSize = NumberInput.fromInt 1 - } + , calculator = Calculator.init searchResult.netUnitPrice , netUnitPrice = NumberInput.fromFloat searchResult.netUnitPrice , grossUnitPrice = NumberInput.fromFloat (suggestedGrossPrice searchResult.netUnitPrice taxGroup.percentage) @@ -204,7 +172,7 @@ updateState msg globals state = case state of SetSalesUnits str -> (ItemEditor { model | salesUnits = NumberInput.update str model.salesUnits }, Cmd.none) CalculatorMsg msg_ -> - (ItemEditor { model | calculator = updateCalculator msg_ model.calculator }, Cmd.none) + (ItemEditor { model | calculator = Calculator.update msg_ model.calculator }, Cmd.none) SetNetUnitPrice str -> ( ItemEditor { model | netUnitPrice = NumberInput.update str model.netUnitPrice } , Cmd.none @@ -269,7 +237,7 @@ view { globals, state } = case state of [ label [ for "tax-group" ] [ text "Steuergruppe" ] , Select.view SetTaxGroup model.taxGroup ] - , Html.map CalculatorMsg <| viewCalculator model.calculator (Select.get model.taxGroup) + , Html.map CalculatorMsg <| Calculator.view model.calculator (Select.get model.taxGroup) , div [ class "form-input" ] [ label [ for "net-unit-price" ] [ text "Einkaufspreis (Netto)" ] , input @@ -297,70 +265,8 @@ view { globals, state } = case state of ] ] -viewCalculator model taxGroup = - let - mainPart = - [ text "(" - , input - [ class "formula-input", placeholder "Gebindepreis" - , value <| NumberInput.show model.bundlePrice - , onInput SetBundlePrice - ] - [] - , text " ÷ " - , input - [ class "formula-input", placeholder "Gebindegröße" - , value <| NumberInput.show model.bundleSize - , onInput SetBundleSize - ] - [] - , text ") " - ] - taxPart = - [ text " ÷ " - , input - [ class "formula-input" - , disabled True - , value <| String.fromFloat <| 1 + taxGroup.percentage - ] - [] - ] - resultPart = - [ text " = " - , input - [ class "formula-input" - , disabled True - , value <| Maybe.withDefault "?" <| Maybe.map String.fromFloat <| calculatorResult model taxGroup - ] - [] - ] - in - fieldset [] - [ legend [] [ text "Preisrechner" ] - , div [] <| List.concat <| List.filterMap identity - [ Just mainPart - , if Select.get model.tax == Gross then Just taxPart else Nothing - , Just resultPart - ] - , div [ class "form-input" ] - [ label [ for "calculator-tax" ] [ text "Gebindepreis ist" ] - , Select.view SetTax model.tax - ] - ] - -calculatorResult model taxGroup = - case (NumberInput.get model.bundlePrice, NumberInput.get model.bundleSize) of - (Just bundlePrice, Just bundleSize) -> - Just <| roundTo 2 <| - if Select.get model.tax == Gross then - (bundlePrice / toFloat bundleSize) / (1 + taxGroup.percentage) - else - bundlePrice / toFloat bundleSize - _ -> - Nothing - viewSetCalculatedPriceButton model = - case calculatorResult model.calculator (Select.get model.taxGroup) of + case Calculator.getResult model.calculator (Select.get model.taxGroup) of Nothing -> button [ disabled True ] [ text "Auf ? setzen" ] Just calculatedPrice -> diff --git a/jon/static/entry.js b/jon/static/entry.js index f185616..0de63ed 100644 --- a/jon/static/entry.js +++ b/jon/static/entry.js @@ -10739,21 +10739,12 @@ var $elm$core$Basics$never = function (_v0) { var $elm$browser$Browser$element = _Browser_element; var $elm$core$Platform$Sub$batch = _Platform_batch; var $elm$core$Platform$Sub$none = $elm$core$Platform$Sub$batch(_List_Nil); -var $author$project$Entry$Gross = {$: 'Gross'}; var $author$project$Entry$ItemEditor = function (a) { return {$: 'ItemEditor', a: a}; }; -var $author$project$Entry$Net = {$: 'Net'}; var $author$project$Entry$ReceiveSearchResults = function (a) { return {$: 'ReceiveSearchResults', a: a}; }; -var $author$project$Entry$ctShow = function (ct) { - if (ct.$ === 'Gross') { - return 'Brutto'; - } else { - return 'Netto'; - } -}; var $elm$http$Http$BadStatus_ = F2( function (a, b) { return {$: 'BadStatus_', a: a, b: b}; @@ -11046,11 +11037,37 @@ var $elm$http$Http$get = function (r) { return $elm$http$Http$request( {body: $elm$http$Http$emptyBody, expect: r.expect, headers: _List_Nil, method: 'GET', timeout: $elm$core$Maybe$Nothing, tracker: $elm$core$Maybe$Nothing, url: r.url}); }; +var $author$project$Calculator$Gross = {$: 'Gross'}; +var $author$project$Calculator$Model = F3( + function (tax, bundlePrice, bundleSize) { + return {bundlePrice: bundlePrice, bundleSize: bundleSize, tax: tax}; + }); +var $author$project$Calculator$Net = {$: 'Net'}; +var $author$project$Calculator$ctShow = function (ct) { + if (ct.$ === 'Gross') { + return 'Brutto'; + } else { + return 'Netto'; + } +}; var $author$project$Select$Model = F4( function (identify, show, selected, options) { return {identify: identify, options: options, selected: selected, show: show}; }); var $author$project$Select$init = $author$project$Select$Model; +var $author$project$Calculator$init = function (bundlePrice) { + return A3( + $author$project$Calculator$Model, + A4( + $author$project$Select$init, + $author$project$Calculator$ctShow, + $author$project$Calculator$ctShow, + $author$project$Calculator$Net, + _List_fromArray( + [$author$project$Calculator$Net, $author$project$Calculator$Gross])), + $author$project$NumberInput$fromFloat(bundlePrice), + $author$project$NumberInput$fromInt(1)); +}; var $author$project$Entry$SearchResult = function (barcode) { return function (name) { return function (netUnitPrice) { @@ -11172,7 +11189,7 @@ var $author$project$Select$update = F2( {selected: x}); } }); -var $author$project$Entry$updateCalculator = F2( +var $author$project$Calculator$update = F2( function (msg, model) { switch (msg.$) { case 'SetTax': @@ -11252,17 +11269,7 @@ var $author$project$Entry$updateState = F3( $author$project$Entry$ItemEditor( { barcode: searchResult.barcode, - calculator: { - bundlePrice: $author$project$NumberInput$fromFloat(searchResult.netUnitPrice), - bundleSize: $author$project$NumberInput$fromInt(1), - tax: A4( - $author$project$Select$init, - $author$project$Entry$ctShow, - $author$project$Entry$ctShow, - $author$project$Entry$Net, - _List_fromArray( - [$author$project$Entry$Net, $author$project$Entry$Gross])) - }, + calculator: $author$project$Calculator$init(searchResult.netUnitPrice), grossUnitPrice: $author$project$NumberInput$fromFloat( A2($author$project$Entry$suggestedGrossPrice, searchResult.netUnitPrice, taxGroup.percentage)), group: A4( @@ -11351,7 +11358,7 @@ var $author$project$Entry$updateState = F3( _Utils_update( model, { - calculator: A2($author$project$Entry$updateCalculator, msg_, model.calculator) + calculator: A2($author$project$Calculator$update, msg_, model.calculator) })), $elm$core$Platform$Cmd$none); case 'SetNetUnitPrice': @@ -11562,6 +11569,53 @@ var $elm$html$Html$Attributes$step = function (n) { return A2($elm$html$Html$Attributes$stringProperty, 'step', n); }; var $elm$html$Html$table = _VirtualDom_node('table'); +var $author$project$Calculator$SetBundlePrice = function (a) { + return {$: 'SetBundlePrice', a: a}; +}; +var $author$project$Calculator$SetBundleSize = function (a) { + return {$: 'SetBundleSize', a: a}; +}; +var $author$project$Calculator$SetTax = function (a) { + return {$: 'SetTax', a: a}; +}; +var $author$project$NumberInput$get = function ($) { + return $.value; +}; +var $author$project$Calculator$roundTo = F2( + function (places, x) { + return $elm$core$Basics$round( + x * A2($elm$core$Basics$pow, 10, places)) / A2($elm$core$Basics$pow, 10, places); + }); +var $author$project$Calculator$getResult = F2( + function (model, taxGroup) { + var _v0 = _Utils_Tuple2( + $author$project$NumberInput$get(model.bundlePrice), + $author$project$NumberInput$get(model.bundleSize)); + if ((_v0.a.$ === 'Just') && (_v0.b.$ === 'Just')) { + var bundlePrice = _v0.a.a; + var bundleSize = _v0.b.a; + return $elm$core$Maybe$Just( + A2( + $author$project$Calculator$roundTo, + 2, + _Utils_eq( + $author$project$Select$get(model.tax), + $author$project$Calculator$Gross) ? ((bundlePrice / bundleSize) / (1 + taxGroup.percentage)) : (bundlePrice / bundleSize))); + } else { + return $elm$core$Maybe$Nothing; + } + }); +var $elm$core$Maybe$map = F2( + function (f, maybe) { + if (maybe.$ === 'Just') { + var value = maybe.a; + return $elm$core$Maybe$Just( + f(value)); + } else { + return $elm$core$Maybe$Nothing; + } + }); +var $elm$html$Html$Attributes$placeholder = $elm$html$Html$Attributes$stringProperty('placeholder'); var $elm$html$Html$option = _VirtualDom_node('option'); var $elm$html$Html$select = _VirtualDom_node('select'); var $elm$html$Html$Attributes$selected = $elm$html$Html$Attributes$boolProperty('selected'); @@ -11593,49 +11647,7 @@ var $author$project$Select$view = F2( ]), A2($elm$core$List$map, viewOption, model.options)); }); -var $author$project$Entry$SetBundlePrice = function (a) { - return {$: 'SetBundlePrice', a: a}; -}; -var $author$project$Entry$SetBundleSize = function (a) { - return {$: 'SetBundleSize', a: a}; -}; -var $author$project$Entry$SetTax = function (a) { - return {$: 'SetTax', a: a}; -}; -var $author$project$NumberInput$get = function ($) { - return $.value; -}; -var $author$project$Entry$calculatorResult = F2( - function (model, taxGroup) { - var _v0 = _Utils_Tuple2( - $author$project$NumberInput$get(model.bundlePrice), - $author$project$NumberInput$get(model.bundleSize)); - if ((_v0.a.$ === 'Just') && (_v0.b.$ === 'Just')) { - var bundlePrice = _v0.a.a; - var bundleSize = _v0.b.a; - return $elm$core$Maybe$Just( - A2( - $author$project$Entry$roundTo, - 2, - _Utils_eq( - $author$project$Select$get(model.tax), - $author$project$Entry$Gross) ? ((bundlePrice / bundleSize) / (1 + taxGroup.percentage)) : (bundlePrice / bundleSize))); - } else { - return $elm$core$Maybe$Nothing; - } - }); -var $elm$core$Maybe$map = F2( - function (f, maybe) { - if (maybe.$ === 'Just') { - var value = maybe.a; - return $elm$core$Maybe$Just( - f(value)); - } else { - return $elm$core$Maybe$Nothing; - } - }); -var $elm$html$Html$Attributes$placeholder = $elm$html$Html$Attributes$stringProperty('placeholder'); -var $author$project$Entry$viewCalculator = F2( +var $author$project$Calculator$view = F2( function (model, taxGroup) { var taxPart = _List_fromArray( [ @@ -11667,7 +11679,7 @@ var $author$project$Entry$viewCalculator = F2( A2( $elm$core$Maybe$map, $elm$core$String$fromFloat, - A2($author$project$Entry$calculatorResult, model, taxGroup)))) + A2($author$project$Calculator$getResult, model, taxGroup)))) ]), _List_Nil) ]); @@ -11682,7 +11694,7 @@ var $author$project$Entry$viewCalculator = F2( $elm$html$Html$Attributes$placeholder('Gebindepreis'), $elm$html$Html$Attributes$value( $author$project$NumberInput$show(model.bundlePrice)), - $elm$html$Html$Events$onInput($author$project$Entry$SetBundlePrice) + $elm$html$Html$Events$onInput($author$project$Calculator$SetBundlePrice) ]), _List_Nil), $elm$html$Html$text(' ÷ '), @@ -11694,7 +11706,7 @@ var $author$project$Entry$viewCalculator = F2( $elm$html$Html$Attributes$placeholder('Gebindegröße'), $elm$html$Html$Attributes$value( $author$project$NumberInput$show(model.bundleSize)), - $elm$html$Html$Events$onInput($author$project$Entry$SetBundleSize) + $elm$html$Html$Events$onInput($author$project$Calculator$SetBundleSize) ]), _List_Nil), $elm$html$Html$text(') ') @@ -11723,7 +11735,7 @@ var $author$project$Entry$viewCalculator = F2( $elm$core$Maybe$Just(mainPart), _Utils_eq( $author$project$Select$get(model.tax), - $author$project$Entry$Gross) ? $elm$core$Maybe$Just(taxPart) : $elm$core$Maybe$Nothing, + $author$project$Calculator$Gross) ? $elm$core$Maybe$Just(taxPart) : $elm$core$Maybe$Nothing, $elm$core$Maybe$Just(resultPart) ])))), A2( @@ -11744,7 +11756,7 @@ var $author$project$Entry$viewCalculator = F2( [ $elm$html$Html$text('Gebindepreis ist') ])), - A2($author$project$Select$view, $author$project$Entry$SetTax, model.tax) + A2($author$project$Select$view, $author$project$Calculator$SetTax, model.tax) ])) ])); }); @@ -11851,7 +11863,7 @@ var $author$project$Entry$viewSearchResult = function (model) { }; var $author$project$Entry$viewSetCalculatedPriceButton = function (model) { var _v0 = A2( - $author$project$Entry$calculatorResult, + $author$project$Calculator$getResult, model.calculator, $author$project$Select$get(model.taxGroup)); if (_v0.$ === 'Nothing') { @@ -12151,7 +12163,7 @@ var $author$project$Entry$view = function (_v0) { $elm$html$Html$map, $author$project$Entry$CalculatorMsg, A2( - $author$project$Entry$viewCalculator, + $author$project$Calculator$view, model.calculator, $author$project$Select$get(model.taxGroup))), A2( @@ -12306,4 +12318,4 @@ _Platform_export({'Entry':{'init':$author$project$Entry$main( }, A2($elm$json$Json$Decode$field, 'id', $elm$json$Json$Decode$int)); }, - A2($elm$json$Json$Decode$field, 'percentage', $elm$json$Json$Decode$float))))))({"versions":{"elm":"0.19.1"},"types":{"message":"Entry.Msg","aliases":{"Entry.SearchResult":{"args":[],"type":"{ barcode : String.String, name : String.String, netUnitPrice : Basics.Float, bought : String.String, salesUnits : Basics.Int, available : Basics.Bool, locationName : String.String, locationId : Basics.Int, groupName : String.String, groupId : Basics.Int, taxGroupId : Basics.Int }"}},"unions":{"Entry.Msg":{"args":[],"tags":{"SetSearchTerm":["String.String"],"SubmitSearch":[],"ReceiveSearchResults":["Result.Result Http.Error (List.List Entry.SearchResult)"],"GotoItemEditor":["Entry.SearchResult"],"SetBarcode":["String.String"],"SetName":["String.String"],"SetSalesUnits":["String.String"],"CalculatorMsg":["Entry.CalculatorMsg"],"SetNetUnitPrice":["String.String"],"SetGrossUnitPrice":["String.String"],"SetGroup":["String.String"],"SetLocation":["String.String"],"SetTaxGroup":["String.String"]}},"Basics.Bool":{"args":[],"tags":{"True":[],"False":[]}},"Entry.CalculatorMsg":{"args":[],"tags":{"SetTax":["String.String"],"SetBundlePrice":["String.String"],"SetBundleSize":["String.String"]}},"Http.Error":{"args":[],"tags":{"BadUrl":["String.String"],"Timeout":[],"NetworkError":[],"BadStatus":["Basics.Int"],"BadBody":["String.String"]}},"Basics.Float":{"args":[],"tags":{"Float":[]}},"Basics.Int":{"args":[],"tags":{"Int":[]}},"List.List":{"args":["a"],"tags":{}},"Result.Result":{"args":["error","value"],"tags":{"Ok":["value"],"Err":["error"]}},"String.String":{"args":[],"tags":{"String":[]}}}}})}});}(this)); \ No newline at end of file + A2($elm$json$Json$Decode$field, 'percentage', $elm$json$Json$Decode$float))))))({"versions":{"elm":"0.19.1"},"types":{"message":"Entry.Msg","aliases":{"Entry.SearchResult":{"args":[],"type":"{ barcode : String.String, name : String.String, netUnitPrice : Basics.Float, bought : String.String, salesUnits : Basics.Int, available : Basics.Bool, locationName : String.String, locationId : Basics.Int, groupName : String.String, groupId : Basics.Int, taxGroupId : Basics.Int }"}},"unions":{"Entry.Msg":{"args":[],"tags":{"SetSearchTerm":["String.String"],"SubmitSearch":[],"ReceiveSearchResults":["Result.Result Http.Error (List.List Entry.SearchResult)"],"GotoItemEditor":["Entry.SearchResult"],"SetBarcode":["String.String"],"SetName":["String.String"],"SetSalesUnits":["String.String"],"CalculatorMsg":["Calculator.Msg"],"SetNetUnitPrice":["String.String"],"SetGrossUnitPrice":["String.String"],"SetGroup":["String.String"],"SetLocation":["String.String"],"SetTaxGroup":["String.String"]}},"Basics.Bool":{"args":[],"tags":{"True":[],"False":[]}},"Http.Error":{"args":[],"tags":{"BadUrl":["String.String"],"Timeout":[],"NetworkError":[],"BadStatus":["Basics.Int"],"BadBody":["String.String"]}},"Basics.Float":{"args":[],"tags":{"Float":[]}},"Basics.Int":{"args":[],"tags":{"Int":[]}},"List.List":{"args":["a"],"tags":{}},"Calculator.Msg":{"args":[],"tags":{"SetTax":["String.String"],"SetBundlePrice":["String.String"],"SetBundleSize":["String.String"]}},"Result.Result":{"args":["error","value"],"tags":{"Ok":["value"],"Err":["error"]}},"String.String":{"args":[],"tags":{"String":[]}}}}})}});}(this)); \ No newline at end of file From 7707a9da6d51652030ca287ba1ad09065387bfeb Mon Sep 17 00:00:00 2001 From: Paul Brinkmeier Date: Sun, 20 Aug 2023 18:45:04 +0200 Subject: [PATCH 09/18] Make entry for submittable --- frontend/Calculator.elm | 2 +- frontend/Entry.elm | 17 ++++++---- frontend/Select.elm | 8 ++--- jon/static/entry.js | 72 ++++++++++++++++++++++++++++++++++------- 4 files changed, 76 insertions(+), 23 deletions(-) diff --git a/frontend/Calculator.elm b/frontend/Calculator.elm index 71043ee..3231ee8 100644 --- a/frontend/Calculator.elm +++ b/frontend/Calculator.elm @@ -96,7 +96,7 @@ view model taxGroup = ] , div [ class "form-input" ] [ label [ for "calculator-tax" ] [ text "Gebindepreis ist" ] - , Select.view SetTax model.tax + , Select.view [] SetTax model.tax ] ] diff --git a/frontend/Entry.elm b/frontend/Entry.elm index d0e1bad..b512f26 100644 --- a/frontend/Entry.elm +++ b/frontend/Entry.elm @@ -210,32 +210,32 @@ view { globals, state } = case state of ] ] ItemEditor model -> - Html.form [] + Html.form [ method "POST", action "/entry/add-to-cart" ] [ fieldset [] [ legend [] [ text "Neuer Inventareintrag" ] , div [ class "form-input" ] [ label [ for "barcode" ] [ text "Barcode" ] - , input [ onInput SetBarcode, value model.barcode, disabled True, id "barcode" ] [] + , input [ onInput SetBarcode, value model.barcode, disabled True, name "barcode", id "barcode" ] [] ] , div [ class "form-input" ] [ label [ for "name" ] [ text "Name" ] - , input [ onInput SetName, value model.name, id "name" ] [] + , input [ onInput SetName, value model.name, name "name", id "name" ] [] ] , div [ class "form-input" ] [ label [ for "sales-units" ] [ text "Stückzahl" ] - , input [ onInput SetSalesUnits, value <| NumberInput.show model.salesUnits, id "sales-units", type_ "number" ] [] + , input [ onInput SetSalesUnits, value <| NumberInput.show model.salesUnits, name "sales-units", id "sales-units", type_ "number" ] [] ] , div [ class "form-input" ] [ label [ for "group" ] [ text "Gruppe" ] - , Select.view SetGroup model.group + , Select.view [ name "group", id "group" ] SetGroup model.group ] , div [ class "form-input" ] [ label [ for "location" ] [ text "Raum" ] - , Select.view SetLocation model.location + , Select.view [ name "location", id "location" ] SetLocation model.location ] , div [ class "form-input" ] [ label [ for "tax-group" ] [ text "Steuergruppe" ] - , Select.view SetTaxGroup model.taxGroup + , Select.view [ name "tax-group", id "tax-group" ] SetTaxGroup model.taxGroup ] , Html.map CalculatorMsg <| Calculator.view model.calculator (Select.get model.taxGroup) , div [ class "form-input" ] @@ -244,6 +244,7 @@ view { globals, state } = case state of [ value <| NumberInput.show model.netUnitPrice , onInput SetNetUnitPrice , type_ "number" + , name "net-unit-price" , id "net-unit-price" , step "0.01" ] @@ -256,12 +257,14 @@ view { globals, state } = case state of [ value <| NumberInput.show model.grossUnitPrice , onInput SetGrossUnitPrice , type_ "number" + , name "gross-unit-price" , id "gross-unit-price" , step "0.01" ] [] , viewSetSuggestedPriceButton model ] + , button [] [ text "In den Warenkorb" ] ] ] diff --git a/frontend/Select.elm b/frontend/Select.elm index 495f86d..26bb473 100644 --- a/frontend/Select.elm +++ b/frontend/Select.elm @@ -1,6 +1,6 @@ module Select exposing (..) -import Html exposing (Html, option, select, text) +import Html exposing (Attribute, Html, option, select, text) import Html.Attributes exposing (selected, value) import Html.Events exposing (onInput) @@ -20,15 +20,15 @@ update key model = Nothing -> model Just x -> { model | selected = x } -view : (String -> m) -> Model a -> Html m -view msg model = +view : List (Attribute m) -> (String -> m) -> Model a -> Html m +view attributes msg model = let viewOption x = option [ selected <| model.identify model.selected == model.identify x, value <| model.identify x ] [ text <| model.show x ] in - select [ onInput msg ] <| List.map viewOption model.options + select ([ onInput msg ] ++ attributes) <| List.map viewOption model.options get : Model a -> a get = .selected diff --git a/jon/static/entry.js b/jon/static/entry.js index 0de63ed..f42209a 100644 --- a/jon/static/entry.js +++ b/jon/static/entry.js @@ -11458,6 +11458,12 @@ var $author$project$Entry$SetTaxGroup = function (a) { return {$: 'SetTaxGroup', a: a}; }; var $author$project$Entry$SubmitSearch = {$: 'SubmitSearch'}; +var $elm$html$Html$Attributes$action = function (uri) { + return A2( + $elm$html$Html$Attributes$stringProperty, + 'action', + _VirtualDom_noJavaScriptUri(uri)); +}; var $elm$json$Json$Encode$bool = _Json_wrap; var $elm$html$Html$Attributes$boolProperty = F2( function (key, bool) { @@ -11475,6 +11481,8 @@ var $author$project$Select$get = function ($) { }; var $elm$html$Html$label = _VirtualDom_node('label'); var $elm$html$Html$legend = _VirtualDom_node('legend'); +var $elm$html$Html$Attributes$method = $elm$html$Html$Attributes$stringProperty('method'); +var $elm$html$Html$Attributes$name = $elm$html$Html$Attributes$stringProperty('name'); var $elm$html$Html$Events$alwaysPreventDefault = function (msg) { return _Utils_Tuple2(msg, true); }; @@ -11619,8 +11627,8 @@ var $elm$html$Html$Attributes$placeholder = $elm$html$Html$Attributes$stringProp var $elm$html$Html$option = _VirtualDom_node('option'); var $elm$html$Html$select = _VirtualDom_node('select'); var $elm$html$Html$Attributes$selected = $elm$html$Html$Attributes$boolProperty('selected'); -var $author$project$Select$view = F2( - function (msg, model) { +var $author$project$Select$view = F3( + function (attributes, msg, model) { var viewOption = function (x) { return A2( $elm$html$Html$option, @@ -11641,10 +11649,12 @@ var $author$project$Select$view = F2( }; return A2( $elm$html$Html$select, - _List_fromArray( - [ - $elm$html$Html$Events$onInput(msg) - ]), + _Utils_ap( + _List_fromArray( + [ + $elm$html$Html$Events$onInput(msg) + ]), + attributes), A2($elm$core$List$map, viewOption, model.options)); }); var $author$project$Calculator$view = F2( @@ -11756,7 +11766,7 @@ var $author$project$Calculator$view = F2( [ $elm$html$Html$text('Gebindepreis ist') ])), - A2($author$project$Select$view, $author$project$Calculator$SetTax, model.tax) + A3($author$project$Select$view, _List_Nil, $author$project$Calculator$SetTax, model.tax) ])) ])); }); @@ -11997,7 +12007,11 @@ var $author$project$Entry$view = function (_v0) { var model = state.a; return A2( $elm$html$Html$form, - _List_Nil, + _List_fromArray( + [ + $elm$html$Html$Attributes$method('POST'), + $elm$html$Html$Attributes$action('/entry/add-to-cart') + ]), _List_fromArray( [ A2( @@ -12037,6 +12051,7 @@ var $author$project$Entry$view = function (_v0) { $elm$html$Html$Events$onInput($author$project$Entry$SetBarcode), $elm$html$Html$Attributes$value(model.barcode), $elm$html$Html$Attributes$disabled(true), + $elm$html$Html$Attributes$name('barcode'), $elm$html$Html$Attributes$id('barcode') ]), _List_Nil) @@ -12065,6 +12080,7 @@ var $author$project$Entry$view = function (_v0) { [ $elm$html$Html$Events$onInput($author$project$Entry$SetName), $elm$html$Html$Attributes$value(model.name), + $elm$html$Html$Attributes$name('name'), $elm$html$Html$Attributes$id('name') ]), _List_Nil) @@ -12094,6 +12110,7 @@ var $author$project$Entry$view = function (_v0) { $elm$html$Html$Events$onInput($author$project$Entry$SetSalesUnits), $elm$html$Html$Attributes$value( $author$project$NumberInput$show(model.salesUnits)), + $elm$html$Html$Attributes$name('sales-units'), $elm$html$Html$Attributes$id('sales-units'), $elm$html$Html$Attributes$type_('number') ]), @@ -12117,7 +12134,15 @@ var $author$project$Entry$view = function (_v0) { [ $elm$html$Html$text('Gruppe') ])), - A2($author$project$Select$view, $author$project$Entry$SetGroup, model.group) + A3( + $author$project$Select$view, + _List_fromArray( + [ + $elm$html$Html$Attributes$name('group'), + $elm$html$Html$Attributes$id('group') + ]), + $author$project$Entry$SetGroup, + model.group) ])), A2( $elm$html$Html$div, @@ -12137,7 +12162,15 @@ var $author$project$Entry$view = function (_v0) { [ $elm$html$Html$text('Raum') ])), - A2($author$project$Select$view, $author$project$Entry$SetLocation, model.location) + A3( + $author$project$Select$view, + _List_fromArray( + [ + $elm$html$Html$Attributes$name('location'), + $elm$html$Html$Attributes$id('location') + ]), + $author$project$Entry$SetLocation, + model.location) ])), A2( $elm$html$Html$div, @@ -12157,7 +12190,15 @@ var $author$project$Entry$view = function (_v0) { [ $elm$html$Html$text('Steuergruppe') ])), - A2($author$project$Select$view, $author$project$Entry$SetTaxGroup, model.taxGroup) + A3( + $author$project$Select$view, + _List_fromArray( + [ + $elm$html$Html$Attributes$name('tax-group'), + $elm$html$Html$Attributes$id('tax-group') + ]), + $author$project$Entry$SetTaxGroup, + model.taxGroup) ])), A2( $elm$html$Html$map, @@ -12192,6 +12233,7 @@ var $author$project$Entry$view = function (_v0) { $author$project$NumberInput$show(model.netUnitPrice)), $elm$html$Html$Events$onInput($author$project$Entry$SetNetUnitPrice), $elm$html$Html$Attributes$type_('number'), + $elm$html$Html$Attributes$name('net-unit-price'), $elm$html$Html$Attributes$id('net-unit-price'), $elm$html$Html$Attributes$step('0.01') ]), @@ -12224,11 +12266,19 @@ var $author$project$Entry$view = function (_v0) { $author$project$NumberInput$show(model.grossUnitPrice)), $elm$html$Html$Events$onInput($author$project$Entry$SetGrossUnitPrice), $elm$html$Html$Attributes$type_('number'), + $elm$html$Html$Attributes$name('gross-unit-price'), $elm$html$Html$Attributes$id('gross-unit-price'), $elm$html$Html$Attributes$step('0.01') ]), _List_Nil), $author$project$Entry$viewSetSuggestedPriceButton(model) + ])), + A2( + $elm$html$Html$button, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text('In den Warenkorb') ])) ])) ])); From e0aef726bda6c058eae9b0f02f08b31655762171 Mon Sep 17 00:00:00 2001 From: Paul Brinkmeier Date: Sun, 20 Aug 2023 19:54:49 +0200 Subject: [PATCH 10/18] Implement adding orders to the cart and viewing it --- frontend/Entry.elm | 8 ++--- jon/entry.py | 55 ++++++++++++++++++++++++++---- jon/static/entry.js | 32 +++++++---------- jon/templates/entry/index.html | 38 ++++++++++++++------- jon/templates/entry/new-order.html | 16 +++++++++ 5 files changed, 107 insertions(+), 42 deletions(-) create mode 100644 jon/templates/entry/new-order.html diff --git a/frontend/Entry.elm b/frontend/Entry.elm index b512f26..503fe4e 100644 --- a/frontend/Entry.elm +++ b/frontend/Entry.elm @@ -210,19 +210,19 @@ view { globals, state } = case state of ] ] ItemEditor model -> - Html.form [ method "POST", action "/entry/add-to-cart" ] + Html.form [ method "POST" ] [ fieldset [] [ legend [] [ text "Neuer Inventareintrag" ] , div [ class "form-input" ] [ label [ for "barcode" ] [ text "Barcode" ] - , input [ onInput SetBarcode, value model.barcode, disabled True, name "barcode", id "barcode" ] [] + , input [ onInput SetBarcode, value model.barcode, name "barcode", id "barcode" ] [] ] , div [ class "form-input" ] [ label [ for "name" ] [ text "Name" ] , input [ onInput SetName, value model.name, name "name", id "name" ] [] ] , div [ class "form-input" ] - [ label [ for "sales-units" ] [ text "Stückzahl" ] + [ label [ for "sales-units" ] [ text "Eingekauft" ] , input [ onInput SetSalesUnits, value <| NumberInput.show model.salesUnits, name "sales-units", id "sales-units", type_ "number" ] [] ] , div [ class "form-input" ] @@ -264,7 +264,7 @@ view { globals, state } = case state of [] , viewSetSuggestedPriceButton model ] - , button [] [ text "In den Warenkorb" ] + , button [] [ text "Auftrag anlegen" ] ] ] diff --git a/jon/entry.py b/jon/entry.py index 4ab298b..c3b6a8d 100644 --- a/jon/entry.py +++ b/jon/entry.py @@ -7,8 +7,45 @@ from . import db bp = Blueprint("entry", __name__, url_prefix="/entry") -@bp.get("/") +@bp.route("/", methods=["GET", "POST"]) def index(): + cart = session["cart"] + return render_template( + "entry/index.html", + cart=cart + ) + + +@bp.route("/new-order", methods=["GET", "POST"]) +def new_order(): + if request.method == "POST": + try: + barcode = request.form["barcode"] + name = request.form["name"] + sales_units = int(request.form["sales-units"]) + group_id = int(request.form["group"]) + location_id = int(request.form["location"]) + tax_group_id = int(request.form["tax-group"]) + net_unit_price = float(request.form["net-unit-price"]) + gross_unit_price = float(request.form["gross-unit-price"]) + except Exception as e: + return f"Incomplete or mistyped form", 400 + + cart = session.get("cart", default=[]) + print(cart) + cart.append({ + "barcode": barcode, + "name": name, + "sales_units": sales_units, + "group_id": group_id, + "location_id": location_id, + "tax_group_id": tax_group_id, + "net_unit_price": net_unit_price, + "gross_unit_price": gross_unit_price + }) + session["cart"] = cart + return redirect("/entry") + with db.run_query("entry/get_groups.sql") as cursor: groups = cursor.fetchall() @@ -18,11 +55,17 @@ def index(): with db.run_query("entry/get_tax_groups.sql") as cursor: tax_groups = cursor.fetchall() - return render_template("entry/index.html", **{ - "locations": locations, - "groups": groups, - "tax_groups": tax_groups - }) + return render_template( + "entry/new-order.html", + groups=groups, + locations=locations, + tax_groups=tax_groups + ) + + + +# API routes for interactive JS stuff + @bp.get("/api/search-items") def api_search_items(): diff --git a/jon/static/entry.js b/jon/static/entry.js index f42209a..f5720f3 100644 --- a/jon/static/entry.js +++ b/jon/static/entry.js @@ -11458,21 +11458,6 @@ var $author$project$Entry$SetTaxGroup = function (a) { return {$: 'SetTaxGroup', a: a}; }; var $author$project$Entry$SubmitSearch = {$: 'SubmitSearch'}; -var $elm$html$Html$Attributes$action = function (uri) { - return A2( - $elm$html$Html$Attributes$stringProperty, - 'action', - _VirtualDom_noJavaScriptUri(uri)); -}; -var $elm$json$Json$Encode$bool = _Json_wrap; -var $elm$html$Html$Attributes$boolProperty = F2( - function (key, bool) { - return A2( - _VirtualDom_property, - key, - $elm$json$Json$Encode$bool(bool)); - }); -var $elm$html$Html$Attributes$disabled = $elm$html$Html$Attributes$boolProperty('disabled'); var $elm$html$Html$fieldset = _VirtualDom_node('fieldset'); var $elm$html$Html$Attributes$for = $elm$html$Html$Attributes$stringProperty('htmlFor'); var $elm$html$Html$form = _VirtualDom_node('form'); @@ -11586,6 +11571,15 @@ var $author$project$Calculator$SetBundleSize = function (a) { var $author$project$Calculator$SetTax = function (a) { return {$: 'SetTax', a: a}; }; +var $elm$json$Json$Encode$bool = _Json_wrap; +var $elm$html$Html$Attributes$boolProperty = F2( + function (key, bool) { + return A2( + _VirtualDom_property, + key, + $elm$json$Json$Encode$bool(bool)); + }); +var $elm$html$Html$Attributes$disabled = $elm$html$Html$Attributes$boolProperty('disabled'); var $author$project$NumberInput$get = function ($) { return $.value; }; @@ -12009,8 +12003,7 @@ var $author$project$Entry$view = function (_v0) { $elm$html$Html$form, _List_fromArray( [ - $elm$html$Html$Attributes$method('POST'), - $elm$html$Html$Attributes$action('/entry/add-to-cart') + $elm$html$Html$Attributes$method('POST') ]), _List_fromArray( [ @@ -12050,7 +12043,6 @@ var $author$project$Entry$view = function (_v0) { [ $elm$html$Html$Events$onInput($author$project$Entry$SetBarcode), $elm$html$Html$Attributes$value(model.barcode), - $elm$html$Html$Attributes$disabled(true), $elm$html$Html$Attributes$name('barcode'), $elm$html$Html$Attributes$id('barcode') ]), @@ -12101,7 +12093,7 @@ var $author$project$Entry$view = function (_v0) { ]), _List_fromArray( [ - $elm$html$Html$text('Stückzahl') + $elm$html$Html$text('Eingekauft') ])), A2( $elm$html$Html$input, @@ -12278,7 +12270,7 @@ var $author$project$Entry$view = function (_v0) { _List_Nil, _List_fromArray( [ - $elm$html$Html$text('In den Warenkorb') + $elm$html$Html$text('Auftrag anlegen') ])) ])) ])); diff --git a/jon/templates/entry/index.html b/jon/templates/entry/index.html index b986866..6e9de2f 100644 --- a/jon/templates/entry/index.html +++ b/jon/templates/entry/index.html @@ -1,16 +1,30 @@ {% extends "base.html" %} {% block content %} -
- - +Neuer Auftrag +

Aufträge

+ + + + + + + + + + + + {% for cart_item in cart %} + + + + + + + + + + + {% endfor %} +
BarcodeNameEingekauftGruppen-IDRaum-IDSteuergruppen-IDEK-Preis (Netto)VK-Preis (Brutto)
{{ cart_item.barcode }}{{ cart_item.name }}{{ cart_item.sales_units }}{{ cart_item.group_id }}{{ cart_item.location_id }}{{ cart_item.tax_group_id }}{{ format_currency(cart_item.net_unit_price) }}{{ format_currency(cart_item.gross_unit_price) }}
{% endblock %} diff --git a/jon/templates/entry/new-order.html b/jon/templates/entry/new-order.html new file mode 100644 index 0000000..b986866 --- /dev/null +++ b/jon/templates/entry/new-order.html @@ -0,0 +1,16 @@ +{% extends "base.html" %} + +{% block content %} +
+ + +{% endblock %} From 7b95b69c7b003a0043d0d2cacf60b19521a7076c Mon Sep 17 00:00:00 2001 From: Paul Brinkmeier Date: Sun, 20 Aug 2023 20:08:24 +0200 Subject: [PATCH 11/18] Make it possible to delete orders from the cart --- frontend/Entry.elm | 2 +- jon/entry.py | 18 ++++++++++++++++-- jon/static/entry.js | 2 +- jon/templates/entry/index.html | 7 +++++++ 4 files changed, 25 insertions(+), 4 deletions(-) diff --git a/frontend/Entry.elm b/frontend/Entry.elm index 503fe4e..a8fc8e0 100644 --- a/frontend/Entry.elm +++ b/frontend/Entry.elm @@ -200,7 +200,7 @@ suggestedGrossPrice netPrice percentage = view { globals, state } = case state of ItemSearch model -> fieldset [] - [ legend [] [ text "Vorlage für neuen Inventareintrag" ] + [ legend [] [ text "Vorlage für Auftrag wählen" ] , Html.form [ onSubmit SubmitSearch ] [ div [ class "form-input" ] [ label [ for "search-term", title "Barcode oder Name" ] [ text "Suchbegriff" ] diff --git a/jon/entry.py b/jon/entry.py index c3b6a8d..dc5464c 100644 --- a/jon/entry.py +++ b/jon/entry.py @@ -9,13 +9,27 @@ bp = Blueprint("entry", __name__, url_prefix="/entry") @bp.route("/", methods=["GET", "POST"]) def index(): - cart = session["cart"] + cart = session.get("cart", default=[]) return render_template( "entry/index.html", cart=cart ) +@bp.post("/delete-order") +def delete_order(): + try: + order_index = int(request.form["order-index"]) + except: + return f"Incomplete or mistyped form", 400 + + cart = session.get("cart", default=[]) + del cart[order_index] + session["cart"] = cart + + return redirect(request.referrer) + + @bp.route("/new-order", methods=["GET", "POST"]) def new_order(): if request.method == "POST": @@ -28,7 +42,7 @@ def new_order(): tax_group_id = int(request.form["tax-group"]) net_unit_price = float(request.form["net-unit-price"]) gross_unit_price = float(request.form["gross-unit-price"]) - except Exception as e: + except: return f"Incomplete or mistyped form", 400 cart = session.get("cart", default=[]) diff --git a/jon/static/entry.js b/jon/static/entry.js index f5720f3..815a6ab 100644 --- a/jon/static/entry.js +++ b/jon/static/entry.js @@ -11949,7 +11949,7 @@ var $author$project$Entry$view = function (_v0) { _List_Nil, _List_fromArray( [ - $elm$html$Html$text('Vorlage für neuen Inventareintrag') + $elm$html$Html$text('Vorlage für Auftrag wählen') ])), A2( $elm$html$Html$form, diff --git a/jon/templates/entry/index.html b/jon/templates/entry/index.html index 6e9de2f..6956836 100644 --- a/jon/templates/entry/index.html +++ b/jon/templates/entry/index.html @@ -13,6 +13,7 @@ Steuergruppen-ID EK-Preis (Netto) VK-Preis (Brutto) + Aktionen {% for cart_item in cart %} @@ -24,6 +25,12 @@ {{ cart_item.tax_group_id }} {{ format_currency(cart_item.net_unit_price) }} {{ format_currency(cart_item.gross_unit_price) }} + +
+ + +
+ {% endfor %} From a82e75999bea7215a66ca55cb061c8b047302031 Mon Sep 17 00:00:00 2001 From: Paul Brinkmeier Date: Sun, 20 Aug 2023 20:24:16 +0200 Subject: [PATCH 12/18] Restyle calculator --- frontend/Calculator.elm | 54 ++++++++++------- jon/static/entry.js | 125 +++++++++++++++++++++++++++++----------- jon/static/jon.css | 9 ++- 3 files changed, 130 insertions(+), 58 deletions(-) diff --git a/frontend/Calculator.elm b/frontend/Calculator.elm index 3231ee8..4d6bcbd 100644 --- a/frontend/Calculator.elm +++ b/frontend/Calculator.elm @@ -53,38 +53,50 @@ view model taxGroup = let mainPart = [ text "(" - , input - [ class "formula-input", placeholder "Gebindepreis" - , value <| NumberInput.show model.bundlePrice - , onInput SetBundlePrice + , div [ class "form-input --inline" ] + [ label [ for "bundle-price" ] [ text "Gebindepreis" ] + , input + [ placeholder "Gebindepreis" + , value <| NumberInput.show model.bundlePrice + , onInput SetBundlePrice + , id "bundle-price" + , type_ "number" + , step "0.01" + ] + [] ] - [] , text " ÷ " - , input - [ class "formula-input", placeholder "Gebindegröße" - , value <| NumberInput.show model.bundleSize - , onInput SetBundleSize + , div [ class "form-input --inline" ] + [ label [ for "bundle-size" ] [ text "Gebindegröße" ] + , input + [ placeholder "Gebindegröße" + , value <| NumberInput.show model.bundleSize + , onInput SetBundleSize + , id "bundle-size" + , type_ "number" + , step "1" + ] + [] ] - [] , text ") " ] taxPart = [ text " ÷ " - , input - [ class "formula-input" - , disabled True - , value <| String.fromFloat <| 1 + taxGroup.percentage + , div [ class "form-input --inline" ] + [ label [ for "tax" ] [ text "Steuer" ] + , input + [ value <| String.fromFloat <| 1 + taxGroup.percentage + , id "tax" + , type_ "number" + , step "0.01" + , disabled True + ] + [] ] - [] ] resultPart = [ text " = " - , input - [ class "formula-input" - , disabled True - , value <| Maybe.withDefault "?" <| Maybe.map String.fromFloat <| getResult model taxGroup - ] - [] + , text <| Maybe.withDefault "?" <| Maybe.map String.fromFloat <| getResult model taxGroup ] in fieldset [] diff --git a/jon/static/entry.js b/jon/static/entry.js index 815a6ab..82b8e40 100644 --- a/jon/static/entry.js +++ b/jon/static/entry.js @@ -11657,62 +11657,117 @@ var $author$project$Calculator$view = F2( [ $elm$html$Html$text(' ÷ '), A2( - $elm$html$Html$input, + $elm$html$Html$div, _List_fromArray( [ - $elm$html$Html$Attributes$class('formula-input'), - $elm$html$Html$Attributes$disabled(true), - $elm$html$Html$Attributes$value( - $elm$core$String$fromFloat(1 + taxGroup.percentage)) + $elm$html$Html$Attributes$class('form-input --inline') ]), - _List_Nil) + _List_fromArray( + [ + A2( + $elm$html$Html$label, + _List_fromArray( + [ + $elm$html$Html$Attributes$for('tax') + ]), + _List_fromArray( + [ + $elm$html$Html$text('Steuer') + ])), + A2( + $elm$html$Html$input, + _List_fromArray( + [ + $elm$html$Html$Attributes$value( + $elm$core$String$fromFloat(1 + taxGroup.percentage)), + $elm$html$Html$Attributes$id('tax'), + $elm$html$Html$Attributes$type_('number'), + $elm$html$Html$Attributes$step('0.01'), + $elm$html$Html$Attributes$disabled(true) + ]), + _List_Nil) + ])) ]); var resultPart = _List_fromArray( [ $elm$html$Html$text(' = '), + $elm$html$Html$text( A2( - $elm$html$Html$input, - _List_fromArray( - [ - $elm$html$Html$Attributes$class('formula-input'), - $elm$html$Html$Attributes$disabled(true), - $elm$html$Html$Attributes$value( - A2( - $elm$core$Maybe$withDefault, - '?', - A2( - $elm$core$Maybe$map, - $elm$core$String$fromFloat, - A2($author$project$Calculator$getResult, model, taxGroup)))) - ]), - _List_Nil) + $elm$core$Maybe$withDefault, + '?', + A2( + $elm$core$Maybe$map, + $elm$core$String$fromFloat, + A2($author$project$Calculator$getResult, model, taxGroup)))) ]); var mainPart = _List_fromArray( [ $elm$html$Html$text('('), A2( - $elm$html$Html$input, + $elm$html$Html$div, _List_fromArray( [ - $elm$html$Html$Attributes$class('formula-input'), - $elm$html$Html$Attributes$placeholder('Gebindepreis'), - $elm$html$Html$Attributes$value( - $author$project$NumberInput$show(model.bundlePrice)), - $elm$html$Html$Events$onInput($author$project$Calculator$SetBundlePrice) + $elm$html$Html$Attributes$class('form-input --inline') ]), - _List_Nil), + _List_fromArray( + [ + A2( + $elm$html$Html$label, + _List_fromArray( + [ + $elm$html$Html$Attributes$for('bundle-price') + ]), + _List_fromArray( + [ + $elm$html$Html$text('Gebindepreis') + ])), + A2( + $elm$html$Html$input, + _List_fromArray( + [ + $elm$html$Html$Attributes$placeholder('Gebindepreis'), + $elm$html$Html$Attributes$value( + $author$project$NumberInput$show(model.bundlePrice)), + $elm$html$Html$Events$onInput($author$project$Calculator$SetBundlePrice), + $elm$html$Html$Attributes$id('bundle-price'), + $elm$html$Html$Attributes$type_('number'), + $elm$html$Html$Attributes$step('0.01') + ]), + _List_Nil) + ])), $elm$html$Html$text(' ÷ '), A2( - $elm$html$Html$input, + $elm$html$Html$div, _List_fromArray( [ - $elm$html$Html$Attributes$class('formula-input'), - $elm$html$Html$Attributes$placeholder('Gebindegröße'), - $elm$html$Html$Attributes$value( - $author$project$NumberInput$show(model.bundleSize)), - $elm$html$Html$Events$onInput($author$project$Calculator$SetBundleSize) + $elm$html$Html$Attributes$class('form-input --inline') ]), - _List_Nil), + _List_fromArray( + [ + A2( + $elm$html$Html$label, + _List_fromArray( + [ + $elm$html$Html$Attributes$for('bundle-size') + ]), + _List_fromArray( + [ + $elm$html$Html$text('Gebindegröße') + ])), + A2( + $elm$html$Html$input, + _List_fromArray( + [ + $elm$html$Html$Attributes$placeholder('Gebindegröße'), + $elm$html$Html$Attributes$value( + $author$project$NumberInput$show(model.bundleSize)), + $elm$html$Html$Events$onInput($author$project$Calculator$SetBundleSize), + $elm$html$Html$Attributes$id('bundle-size'), + $elm$html$Html$Attributes$type_('number'), + $elm$html$Html$Attributes$step('1') + ]), + _List_Nil) + ])), $elm$html$Html$text(') ') ]); return A2( diff --git a/jon/static/jon.css b/jon/static/jon.css index 386c1fd..0085d72 100644 --- a/jon/static/jon.css +++ b/jon/static/jon.css @@ -63,6 +63,11 @@ th { .form-input > select { display: block; } -.formula-input { - width: 10em; +.form-input.--inline { + display: inline-block; +} +.form-input.--inline > input:not([type=radio]), +.form-input.--inline > select { + display: block; + width: 8em; } From 1e4aadee06b19d2968520f813a59cd46293eb8e5 Mon Sep 17 00:00:00 2001 From: Paul Brinkmeier Date: Sun, 20 Aug 2023 23:27:39 +0200 Subject: [PATCH 13/18] Store location name, group name and tax group description in order Also delete compiled entry JS and add a Makefile --- .gitignore | 1 + Makefile | 6 + README.md | 13 + frontend/Entry.elm | 24 +- jon/entry.py | 15 +- jon/static/entry.js | 12418 ------------------------------- jon/templates/entry/index.html | 12 +- 7 files changed, 59 insertions(+), 12430 deletions(-) create mode 100644 Makefile delete mode 100644 jon/static/entry.js diff --git a/.gitignore b/.gitignore index 9a684f2..9051824 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ jon/config.json elm-stuff/ venv/ .venv/ +jon/static/*.js diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..afdf970 --- /dev/null +++ b/Makefile @@ -0,0 +1,6 @@ +.PHONY: frontend + +frontend: jon/static/entry.js + +jon/static/entry.js: $(shell find $(SOURCEDIR) -name '*.c') + elm make --optimize frontend/Entry.elm --output $@ diff --git a/README.md b/README.md index 85db926..729066c 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,19 @@ pip install -r requirements.txt You should probably use a virtualenv for that. I develop `jon` using Python 3.10 but it should work with older versions as well. +### Building Frontend JS + +Most of jon works without JS but there are some features that require it. +The frontend code lives in `./frontend` and is written using Elm, a functional language that compiles to JS. +To compile the Elm code to `.js` files, first make sure that the Elm compiler is installed: + +``` +elm --version +# 0.19.1 +``` + +Then run `make frontend`. + ## Running ``` diff --git a/frontend/Entry.elm b/frontend/Entry.elm index a8fc8e0..78b73c6 100644 --- a/frontend/Entry.elm +++ b/frontend/Entry.elm @@ -227,15 +227,33 @@ view { globals, state } = case state of ] , div [ class "form-input" ] [ label [ for "group" ] [ text "Gruppe" ] - , Select.view [ name "group", id "group" ] SetGroup model.group + , Select.view [ name "group-id", id "group" ] SetGroup model.group + , input + [ type_ "hidden" + , name "group-name" + , value <| (Select.get model.group).name + ] + [] ] , div [ class "form-input" ] [ label [ for "location" ] [ text "Raum" ] - , Select.view [ name "location", id "location" ] SetLocation model.location + , Select.view [ name "location-id", id "location" ] SetLocation model.location + , input + [ type_ "hidden" + , name "location-name" + , value <| (Select.get model.location).name + ] + [] ] , div [ class "form-input" ] [ label [ for "tax-group" ] [ text "Steuergruppe" ] - , Select.view [ name "tax-group", id "tax-group" ] SetTaxGroup model.taxGroup + , Select.view [ name "tax-group-id", id "tax-group" ] SetTaxGroup model.taxGroup + , input + [ type_ "hidden" + , name "tax-group-description" + , value <| (Select.get model.taxGroup).description + ] + [] ] , Html.map CalculatorMsg <| Calculator.view model.calculator (Select.get model.taxGroup) , div [ class "form-input" ] diff --git a/jon/entry.py b/jon/entry.py index dc5464c..9b067f5 100644 --- a/jon/entry.py +++ b/jon/entry.py @@ -37,9 +37,15 @@ def new_order(): barcode = request.form["barcode"] name = request.form["name"] sales_units = int(request.form["sales-units"]) - group_id = int(request.form["group"]) - location_id = int(request.form["location"]) - tax_group_id = int(request.form["tax-group"]) + group_id = int(request.form["group-id"]) + # group_name, location_name and tax_group_description are not + # necessarily needed here but storing them makes it easier to + # render the list of orders. + group_name = request.form["group-name"] + location_id = int(request.form["location-id"]) + location_name = request.form["location-name"] + tax_group_id = int(request.form["tax-group-id"]) + tax_group_description = request.form["tax-group-description"] net_unit_price = float(request.form["net-unit-price"]) gross_unit_price = float(request.form["gross-unit-price"]) except: @@ -52,8 +58,11 @@ def new_order(): "name": name, "sales_units": sales_units, "group_id": group_id, + "group_name": group_name, "location_id": location_id, + "location_name": location_name, "tax_group_id": tax_group_id, + "tax_group_description": tax_group_description, "net_unit_price": net_unit_price, "gross_unit_price": gross_unit_price }) diff --git a/jon/static/entry.js b/jon/static/entry.js deleted file mode 100644 index 82b8e40..0000000 --- a/jon/static/entry.js +++ /dev/null @@ -1,12418 +0,0 @@ -(function(scope){ -'use strict'; - -function F(arity, fun, wrapper) { - wrapper.a = arity; - wrapper.f = fun; - return wrapper; -} - -function F2(fun) { - return F(2, fun, function(a) { return function(b) { return fun(a,b); }; }) -} -function F3(fun) { - return F(3, fun, function(a) { - return function(b) { return function(c) { return fun(a, b, c); }; }; - }); -} -function F4(fun) { - return F(4, fun, function(a) { return function(b) { return function(c) { - return function(d) { return fun(a, b, c, d); }; }; }; - }); -} -function F5(fun) { - return F(5, fun, function(a) { return function(b) { return function(c) { - return function(d) { return function(e) { return fun(a, b, c, d, e); }; }; }; }; - }); -} -function F6(fun) { - return F(6, fun, function(a) { return function(b) { return function(c) { - return function(d) { return function(e) { return function(f) { - return fun(a, b, c, d, e, f); }; }; }; }; }; - }); -} -function F7(fun) { - return F(7, fun, function(a) { return function(b) { return function(c) { - return function(d) { return function(e) { return function(f) { - return function(g) { return fun(a, b, c, d, e, f, g); }; }; }; }; }; }; - }); -} -function F8(fun) { - return F(8, fun, function(a) { return function(b) { return function(c) { - return function(d) { return function(e) { return function(f) { - return function(g) { return function(h) { - return fun(a, b, c, d, e, f, g, h); }; }; }; }; }; }; }; - }); -} -function F9(fun) { - return F(9, fun, function(a) { return function(b) { return function(c) { - return function(d) { return function(e) { return function(f) { - return function(g) { return function(h) { return function(i) { - return fun(a, b, c, d, e, f, g, h, i); }; }; }; }; }; }; }; }; - }); -} - -function A2(fun, a, b) { - return fun.a === 2 ? fun.f(a, b) : fun(a)(b); -} -function A3(fun, a, b, c) { - return fun.a === 3 ? fun.f(a, b, c) : fun(a)(b)(c); -} -function A4(fun, a, b, c, d) { - return fun.a === 4 ? fun.f(a, b, c, d) : fun(a)(b)(c)(d); -} -function A5(fun, a, b, c, d, e) { - return fun.a === 5 ? fun.f(a, b, c, d, e) : fun(a)(b)(c)(d)(e); -} -function A6(fun, a, b, c, d, e, f) { - return fun.a === 6 ? fun.f(a, b, c, d, e, f) : fun(a)(b)(c)(d)(e)(f); -} -function A7(fun, a, b, c, d, e, f, g) { - return fun.a === 7 ? fun.f(a, b, c, d, e, f, g) : fun(a)(b)(c)(d)(e)(f)(g); -} -function A8(fun, a, b, c, d, e, f, g, h) { - return fun.a === 8 ? fun.f(a, b, c, d, e, f, g, h) : fun(a)(b)(c)(d)(e)(f)(g)(h); -} -function A9(fun, a, b, c, d, e, f, g, h, i) { - return fun.a === 9 ? fun.f(a, b, c, d, e, f, g, h, i) : fun(a)(b)(c)(d)(e)(f)(g)(h)(i); -} - -console.warn('Compiled in DEBUG mode. Follow the advice at https://elm-lang.org/0.19.1/optimize for better performance and smaller assets.'); - - -var _JsArray_empty = []; - -function _JsArray_singleton(value) -{ - return [value]; -} - -function _JsArray_length(array) -{ - return array.length; -} - -var _JsArray_initialize = F3(function(size, offset, func) -{ - var result = new Array(size); - - for (var i = 0; i < size; i++) - { - result[i] = func(offset + i); - } - - return result; -}); - -var _JsArray_initializeFromList = F2(function (max, ls) -{ - var result = new Array(max); - - for (var i = 0; i < max && ls.b; i++) - { - result[i] = ls.a; - ls = ls.b; - } - - result.length = i; - return _Utils_Tuple2(result, ls); -}); - -var _JsArray_unsafeGet = F2(function(index, array) -{ - return array[index]; -}); - -var _JsArray_unsafeSet = F3(function(index, value, array) -{ - var length = array.length; - var result = new Array(length); - - for (var i = 0; i < length; i++) - { - result[i] = array[i]; - } - - result[index] = value; - return result; -}); - -var _JsArray_push = F2(function(value, array) -{ - var length = array.length; - var result = new Array(length + 1); - - for (var i = 0; i < length; i++) - { - result[i] = array[i]; - } - - result[length] = value; - return result; -}); - -var _JsArray_foldl = F3(function(func, acc, array) -{ - var length = array.length; - - for (var i = 0; i < length; i++) - { - acc = A2(func, array[i], acc); - } - - return acc; -}); - -var _JsArray_foldr = F3(function(func, acc, array) -{ - for (var i = array.length - 1; i >= 0; i--) - { - acc = A2(func, array[i], acc); - } - - return acc; -}); - -var _JsArray_map = F2(function(func, array) -{ - var length = array.length; - var result = new Array(length); - - for (var i = 0; i < length; i++) - { - result[i] = func(array[i]); - } - - return result; -}); - -var _JsArray_indexedMap = F3(function(func, offset, array) -{ - var length = array.length; - var result = new Array(length); - - for (var i = 0; i < length; i++) - { - result[i] = A2(func, offset + i, array[i]); - } - - return result; -}); - -var _JsArray_slice = F3(function(from, to, array) -{ - return array.slice(from, to); -}); - -var _JsArray_appendN = F3(function(n, dest, source) -{ - var destLen = dest.length; - var itemsToCopy = n - destLen; - - if (itemsToCopy > source.length) - { - itemsToCopy = source.length; - } - - var size = destLen + itemsToCopy; - var result = new Array(size); - - for (var i = 0; i < destLen; i++) - { - result[i] = dest[i]; - } - - for (var i = 0; i < itemsToCopy; i++) - { - result[i + destLen] = source[i]; - } - - return result; -}); - - - -// LOG - -var _Debug_log_UNUSED = F2(function(tag, value) -{ - return value; -}); - -var _Debug_log = F2(function(tag, value) -{ - console.log(tag + ': ' + _Debug_toString(value)); - return value; -}); - - -// TODOS - -function _Debug_todo(moduleName, region) -{ - return function(message) { - _Debug_crash(8, moduleName, region, message); - }; -} - -function _Debug_todoCase(moduleName, region, value) -{ - return function(message) { - _Debug_crash(9, moduleName, region, value, message); - }; -} - - -// TO STRING - -function _Debug_toString_UNUSED(value) -{ - return ''; -} - -function _Debug_toString(value) -{ - return _Debug_toAnsiString(false, value); -} - -function _Debug_toAnsiString(ansi, value) -{ - if (typeof value === 'function') - { - return _Debug_internalColor(ansi, ''); - } - - if (typeof value === 'boolean') - { - return _Debug_ctorColor(ansi, value ? 'True' : 'False'); - } - - if (typeof value === 'number') - { - return _Debug_numberColor(ansi, value + ''); - } - - if (value instanceof String) - { - return _Debug_charColor(ansi, "'" + _Debug_addSlashes(value, true) + "'"); - } - - if (typeof value === 'string') - { - return _Debug_stringColor(ansi, '"' + _Debug_addSlashes(value, false) + '"'); - } - - if (typeof value === 'object' && '$' in value) - { - var tag = value.$; - - if (typeof tag === 'number') - { - return _Debug_internalColor(ansi, ''); - } - - if (tag[0] === '#') - { - var output = []; - for (var k in value) - { - if (k === '$') continue; - output.push(_Debug_toAnsiString(ansi, value[k])); - } - return '(' + output.join(',') + ')'; - } - - if (tag === 'Set_elm_builtin') - { - return _Debug_ctorColor(ansi, 'Set') - + _Debug_fadeColor(ansi, '.fromList') + ' ' - + _Debug_toAnsiString(ansi, $elm$core$Set$toList(value)); - } - - if (tag === 'RBNode_elm_builtin' || tag === 'RBEmpty_elm_builtin') - { - return _Debug_ctorColor(ansi, 'Dict') - + _Debug_fadeColor(ansi, '.fromList') + ' ' - + _Debug_toAnsiString(ansi, $elm$core$Dict$toList(value)); - } - - if (tag === 'Array_elm_builtin') - { - return _Debug_ctorColor(ansi, 'Array') - + _Debug_fadeColor(ansi, '.fromList') + ' ' - + _Debug_toAnsiString(ansi, $elm$core$Array$toList(value)); - } - - if (tag === '::' || tag === '[]') - { - var output = '['; - - value.b && (output += _Debug_toAnsiString(ansi, value.a), value = value.b) - - for (; value.b; value = value.b) // WHILE_CONS - { - output += ',' + _Debug_toAnsiString(ansi, value.a); - } - return output + ']'; - } - - var output = ''; - for (var i in value) - { - if (i === '$') continue; - var str = _Debug_toAnsiString(ansi, value[i]); - var c0 = str[0]; - var parenless = c0 === '{' || c0 === '(' || c0 === '[' || c0 === '<' || c0 === '"' || str.indexOf(' ') < 0; - output += ' ' + (parenless ? str : '(' + str + ')'); - } - return _Debug_ctorColor(ansi, tag) + output; - } - - if (typeof DataView === 'function' && value instanceof DataView) - { - return _Debug_stringColor(ansi, '<' + value.byteLength + ' bytes>'); - } - - if (typeof File !== 'undefined' && value instanceof File) - { - return _Debug_internalColor(ansi, '<' + value.name + '>'); - } - - if (typeof value === 'object') - { - var output = []; - for (var key in value) - { - var field = key[0] === '_' ? key.slice(1) : key; - output.push(_Debug_fadeColor(ansi, field) + ' = ' + _Debug_toAnsiString(ansi, value[key])); - } - if (output.length === 0) - { - return '{}'; - } - return '{ ' + output.join(', ') + ' }'; - } - - return _Debug_internalColor(ansi, ''); -} - -function _Debug_addSlashes(str, isChar) -{ - var s = str - .replace(/\\/g, '\\\\') - .replace(/\n/g, '\\n') - .replace(/\t/g, '\\t') - .replace(/\r/g, '\\r') - .replace(/\v/g, '\\v') - .replace(/\0/g, '\\0'); - - if (isChar) - { - return s.replace(/\'/g, '\\\''); - } - else - { - return s.replace(/\"/g, '\\"'); - } -} - -function _Debug_ctorColor(ansi, string) -{ - return ansi ? '\x1b[96m' + string + '\x1b[0m' : string; -} - -function _Debug_numberColor(ansi, string) -{ - return ansi ? '\x1b[95m' + string + '\x1b[0m' : string; -} - -function _Debug_stringColor(ansi, string) -{ - return ansi ? '\x1b[93m' + string + '\x1b[0m' : string; -} - -function _Debug_charColor(ansi, string) -{ - return ansi ? '\x1b[92m' + string + '\x1b[0m' : string; -} - -function _Debug_fadeColor(ansi, string) -{ - return ansi ? '\x1b[37m' + string + '\x1b[0m' : string; -} - -function _Debug_internalColor(ansi, string) -{ - return ansi ? '\x1b[36m' + string + '\x1b[0m' : string; -} - -function _Debug_toHexDigit(n) -{ - return String.fromCharCode(n < 10 ? 48 + n : 55 + n); -} - - -// CRASH - - -function _Debug_crash_UNUSED(identifier) -{ - throw new Error('https://github.com/elm/core/blob/1.0.0/hints/' + identifier + '.md'); -} - - -function _Debug_crash(identifier, fact1, fact2, fact3, fact4) -{ - switch(identifier) - { - case 0: - throw new Error('What node should I take over? In JavaScript I need something like:\n\n Elm.Main.init({\n node: document.getElementById("elm-node")\n })\n\nYou need to do this with any Browser.sandbox or Browser.element program.'); - - case 1: - throw new Error('Browser.application programs cannot handle URLs like this:\n\n ' + document.location.href + '\n\nWhat is the root? The root of your file system? Try looking at this program with `elm reactor` or some other server.'); - - case 2: - var jsonErrorString = fact1; - throw new Error('Problem with the flags given to your Elm program on initialization.\n\n' + jsonErrorString); - - case 3: - var portName = fact1; - throw new Error('There can only be one port named `' + portName + '`, but your program has multiple.'); - - case 4: - var portName = fact1; - var problem = fact2; - throw new Error('Trying to send an unexpected type of value through port `' + portName + '`:\n' + problem); - - case 5: - throw new Error('Trying to use `(==)` on functions.\nThere is no way to know if functions are "the same" in the Elm sense.\nRead more about this at https://package.elm-lang.org/packages/elm/core/latest/Basics#== which describes why it is this way and what the better version will look like.'); - - case 6: - var moduleName = fact1; - throw new Error('Your page is loading multiple Elm scripts with a module named ' + moduleName + '. Maybe a duplicate script is getting loaded accidentally? If not, rename one of them so I know which is which!'); - - case 8: - var moduleName = fact1; - var region = fact2; - var message = fact3; - throw new Error('TODO in module `' + moduleName + '` ' + _Debug_regionToString(region) + '\n\n' + message); - - case 9: - var moduleName = fact1; - var region = fact2; - var value = fact3; - var message = fact4; - throw new Error( - 'TODO in module `' + moduleName + '` from the `case` expression ' - + _Debug_regionToString(region) + '\n\nIt received the following value:\n\n ' - + _Debug_toString(value).replace('\n', '\n ') - + '\n\nBut the branch that handles it says:\n\n ' + message.replace('\n', '\n ') - ); - - case 10: - throw new Error('Bug in https://github.com/elm/virtual-dom/issues'); - - case 11: - throw new Error('Cannot perform mod 0. Division by zero error.'); - } -} - -function _Debug_regionToString(region) -{ - if (region.start.line === region.end.line) - { - return 'on line ' + region.start.line; - } - return 'on lines ' + region.start.line + ' through ' + region.end.line; -} - - - -// EQUALITY - -function _Utils_eq(x, y) -{ - for ( - var pair, stack = [], isEqual = _Utils_eqHelp(x, y, 0, stack); - isEqual && (pair = stack.pop()); - isEqual = _Utils_eqHelp(pair.a, pair.b, 0, stack) - ) - {} - - return isEqual; -} - -function _Utils_eqHelp(x, y, depth, stack) -{ - if (x === y) - { - return true; - } - - if (typeof x !== 'object' || x === null || y === null) - { - typeof x === 'function' && _Debug_crash(5); - return false; - } - - if (depth > 100) - { - stack.push(_Utils_Tuple2(x,y)); - return true; - } - - /**/ - if (x.$ === 'Set_elm_builtin') - { - x = $elm$core$Set$toList(x); - y = $elm$core$Set$toList(y); - } - if (x.$ === 'RBNode_elm_builtin' || x.$ === 'RBEmpty_elm_builtin') - { - x = $elm$core$Dict$toList(x); - y = $elm$core$Dict$toList(y); - } - //*/ - - /**_UNUSED/ - if (x.$ < 0) - { - x = $elm$core$Dict$toList(x); - y = $elm$core$Dict$toList(y); - } - //*/ - - for (var key in x) - { - if (!_Utils_eqHelp(x[key], y[key], depth + 1, stack)) - { - return false; - } - } - return true; -} - -var _Utils_equal = F2(_Utils_eq); -var _Utils_notEqual = F2(function(a, b) { return !_Utils_eq(a,b); }); - - - -// COMPARISONS - -// Code in Generate/JavaScript.hs, Basics.js, and List.js depends on -// the particular integer values assigned to LT, EQ, and GT. - -function _Utils_cmp(x, y, ord) -{ - if (typeof x !== 'object') - { - return x === y ? /*EQ*/ 0 : x < y ? /*LT*/ -1 : /*GT*/ 1; - } - - /**/ - if (x instanceof String) - { - var a = x.valueOf(); - var b = y.valueOf(); - return a === b ? 0 : a < b ? -1 : 1; - } - //*/ - - /**_UNUSED/ - if (typeof x.$ === 'undefined') - //*/ - /**/ - if (x.$[0] === '#') - //*/ - { - return (ord = _Utils_cmp(x.a, y.a)) - ? ord - : (ord = _Utils_cmp(x.b, y.b)) - ? ord - : _Utils_cmp(x.c, y.c); - } - - // traverse conses until end of a list or a mismatch - for (; x.b && y.b && !(ord = _Utils_cmp(x.a, y.a)); x = x.b, y = y.b) {} // WHILE_CONSES - return ord || (x.b ? /*GT*/ 1 : y.b ? /*LT*/ -1 : /*EQ*/ 0); -} - -var _Utils_lt = F2(function(a, b) { return _Utils_cmp(a, b) < 0; }); -var _Utils_le = F2(function(a, b) { return _Utils_cmp(a, b) < 1; }); -var _Utils_gt = F2(function(a, b) { return _Utils_cmp(a, b) > 0; }); -var _Utils_ge = F2(function(a, b) { return _Utils_cmp(a, b) >= 0; }); - -var _Utils_compare = F2(function(x, y) -{ - var n = _Utils_cmp(x, y); - return n < 0 ? $elm$core$Basics$LT : n ? $elm$core$Basics$GT : $elm$core$Basics$EQ; -}); - - -// COMMON VALUES - -var _Utils_Tuple0_UNUSED = 0; -var _Utils_Tuple0 = { $: '#0' }; - -function _Utils_Tuple2_UNUSED(a, b) { return { a: a, b: b }; } -function _Utils_Tuple2(a, b) { return { $: '#2', a: a, b: b }; } - -function _Utils_Tuple3_UNUSED(a, b, c) { return { a: a, b: b, c: c }; } -function _Utils_Tuple3(a, b, c) { return { $: '#3', a: a, b: b, c: c }; } - -function _Utils_chr_UNUSED(c) { return c; } -function _Utils_chr(c) { return new String(c); } - - -// RECORDS - -function _Utils_update(oldRecord, updatedFields) -{ - var newRecord = {}; - - for (var key in oldRecord) - { - newRecord[key] = oldRecord[key]; - } - - for (var key in updatedFields) - { - newRecord[key] = updatedFields[key]; - } - - return newRecord; -} - - -// APPEND - -var _Utils_append = F2(_Utils_ap); - -function _Utils_ap(xs, ys) -{ - // append Strings - if (typeof xs === 'string') - { - return xs + ys; - } - - // append Lists - if (!xs.b) - { - return ys; - } - var root = _List_Cons(xs.a, ys); - xs = xs.b - for (var curr = root; xs.b; xs = xs.b) // WHILE_CONS - { - curr = curr.b = _List_Cons(xs.a, ys); - } - return root; -} - - - -var _List_Nil_UNUSED = { $: 0 }; -var _List_Nil = { $: '[]' }; - -function _List_Cons_UNUSED(hd, tl) { return { $: 1, a: hd, b: tl }; } -function _List_Cons(hd, tl) { return { $: '::', a: hd, b: tl }; } - - -var _List_cons = F2(_List_Cons); - -function _List_fromArray(arr) -{ - var out = _List_Nil; - for (var i = arr.length; i--; ) - { - out = _List_Cons(arr[i], out); - } - return out; -} - -function _List_toArray(xs) -{ - for (var out = []; xs.b; xs = xs.b) // WHILE_CONS - { - out.push(xs.a); - } - return out; -} - -var _List_map2 = F3(function(f, xs, ys) -{ - for (var arr = []; xs.b && ys.b; xs = xs.b, ys = ys.b) // WHILE_CONSES - { - arr.push(A2(f, xs.a, ys.a)); - } - return _List_fromArray(arr); -}); - -var _List_map3 = F4(function(f, xs, ys, zs) -{ - for (var arr = []; xs.b && ys.b && zs.b; xs = xs.b, ys = ys.b, zs = zs.b) // WHILE_CONSES - { - arr.push(A3(f, xs.a, ys.a, zs.a)); - } - return _List_fromArray(arr); -}); - -var _List_map4 = F5(function(f, ws, xs, ys, zs) -{ - for (var arr = []; ws.b && xs.b && ys.b && zs.b; ws = ws.b, xs = xs.b, ys = ys.b, zs = zs.b) // WHILE_CONSES - { - arr.push(A4(f, ws.a, xs.a, ys.a, zs.a)); - } - return _List_fromArray(arr); -}); - -var _List_map5 = F6(function(f, vs, ws, xs, ys, zs) -{ - for (var arr = []; vs.b && ws.b && xs.b && ys.b && zs.b; vs = vs.b, ws = ws.b, xs = xs.b, ys = ys.b, zs = zs.b) // WHILE_CONSES - { - arr.push(A5(f, vs.a, ws.a, xs.a, ys.a, zs.a)); - } - return _List_fromArray(arr); -}); - -var _List_sortBy = F2(function(f, xs) -{ - return _List_fromArray(_List_toArray(xs).sort(function(a, b) { - return _Utils_cmp(f(a), f(b)); - })); -}); - -var _List_sortWith = F2(function(f, xs) -{ - return _List_fromArray(_List_toArray(xs).sort(function(a, b) { - var ord = A2(f, a, b); - return ord === $elm$core$Basics$EQ ? 0 : ord === $elm$core$Basics$LT ? -1 : 1; - })); -}); - - - -// MATH - -var _Basics_add = F2(function(a, b) { return a + b; }); -var _Basics_sub = F2(function(a, b) { return a - b; }); -var _Basics_mul = F2(function(a, b) { return a * b; }); -var _Basics_fdiv = F2(function(a, b) { return a / b; }); -var _Basics_idiv = F2(function(a, b) { return (a / b) | 0; }); -var _Basics_pow = F2(Math.pow); - -var _Basics_remainderBy = F2(function(b, a) { return a % b; }); - -// https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/divmodnote-letter.pdf -var _Basics_modBy = F2(function(modulus, x) -{ - var answer = x % modulus; - return modulus === 0 - ? _Debug_crash(11) - : - ((answer > 0 && modulus < 0) || (answer < 0 && modulus > 0)) - ? answer + modulus - : answer; -}); - - -// TRIGONOMETRY - -var _Basics_pi = Math.PI; -var _Basics_e = Math.E; -var _Basics_cos = Math.cos; -var _Basics_sin = Math.sin; -var _Basics_tan = Math.tan; -var _Basics_acos = Math.acos; -var _Basics_asin = Math.asin; -var _Basics_atan = Math.atan; -var _Basics_atan2 = F2(Math.atan2); - - -// MORE MATH - -function _Basics_toFloat(x) { return x; } -function _Basics_truncate(n) { return n | 0; } -function _Basics_isInfinite(n) { return n === Infinity || n === -Infinity; } - -var _Basics_ceiling = Math.ceil; -var _Basics_floor = Math.floor; -var _Basics_round = Math.round; -var _Basics_sqrt = Math.sqrt; -var _Basics_log = Math.log; -var _Basics_isNaN = isNaN; - - -// BOOLEANS - -function _Basics_not(bool) { return !bool; } -var _Basics_and = F2(function(a, b) { return a && b; }); -var _Basics_or = F2(function(a, b) { return a || b; }); -var _Basics_xor = F2(function(a, b) { return a !== b; }); - - - -var _String_cons = F2(function(chr, str) -{ - return chr + str; -}); - -function _String_uncons(string) -{ - var word = string.charCodeAt(0); - return !isNaN(word) - ? $elm$core$Maybe$Just( - 0xD800 <= word && word <= 0xDBFF - ? _Utils_Tuple2(_Utils_chr(string[0] + string[1]), string.slice(2)) - : _Utils_Tuple2(_Utils_chr(string[0]), string.slice(1)) - ) - : $elm$core$Maybe$Nothing; -} - -var _String_append = F2(function(a, b) -{ - return a + b; -}); - -function _String_length(str) -{ - return str.length; -} - -var _String_map = F2(function(func, string) -{ - var len = string.length; - var array = new Array(len); - var i = 0; - while (i < len) - { - var word = string.charCodeAt(i); - if (0xD800 <= word && word <= 0xDBFF) - { - array[i] = func(_Utils_chr(string[i] + string[i+1])); - i += 2; - continue; - } - array[i] = func(_Utils_chr(string[i])); - i++; - } - return array.join(''); -}); - -var _String_filter = F2(function(isGood, str) -{ - var arr = []; - var len = str.length; - var i = 0; - while (i < len) - { - var char = str[i]; - var word = str.charCodeAt(i); - i++; - if (0xD800 <= word && word <= 0xDBFF) - { - char += str[i]; - i++; - } - - if (isGood(_Utils_chr(char))) - { - arr.push(char); - } - } - return arr.join(''); -}); - -function _String_reverse(str) -{ - var len = str.length; - var arr = new Array(len); - var i = 0; - while (i < len) - { - var word = str.charCodeAt(i); - if (0xD800 <= word && word <= 0xDBFF) - { - arr[len - i] = str[i + 1]; - i++; - arr[len - i] = str[i - 1]; - i++; - } - else - { - arr[len - i] = str[i]; - i++; - } - } - return arr.join(''); -} - -var _String_foldl = F3(function(func, state, string) -{ - var len = string.length; - var i = 0; - while (i < len) - { - var char = string[i]; - var word = string.charCodeAt(i); - i++; - if (0xD800 <= word && word <= 0xDBFF) - { - char += string[i]; - i++; - } - state = A2(func, _Utils_chr(char), state); - } - return state; -}); - -var _String_foldr = F3(function(func, state, string) -{ - var i = string.length; - while (i--) - { - var char = string[i]; - var word = string.charCodeAt(i); - if (0xDC00 <= word && word <= 0xDFFF) - { - i--; - char = string[i] + char; - } - state = A2(func, _Utils_chr(char), state); - } - return state; -}); - -var _String_split = F2(function(sep, str) -{ - return str.split(sep); -}); - -var _String_join = F2(function(sep, strs) -{ - return strs.join(sep); -}); - -var _String_slice = F3(function(start, end, str) { - return str.slice(start, end); -}); - -function _String_trim(str) -{ - return str.trim(); -} - -function _String_trimLeft(str) -{ - return str.replace(/^\s+/, ''); -} - -function _String_trimRight(str) -{ - return str.replace(/\s+$/, ''); -} - -function _String_words(str) -{ - return _List_fromArray(str.trim().split(/\s+/g)); -} - -function _String_lines(str) -{ - return _List_fromArray(str.split(/\r\n|\r|\n/g)); -} - -function _String_toUpper(str) -{ - return str.toUpperCase(); -} - -function _String_toLower(str) -{ - return str.toLowerCase(); -} - -var _String_any = F2(function(isGood, string) -{ - var i = string.length; - while (i--) - { - var char = string[i]; - var word = string.charCodeAt(i); - if (0xDC00 <= word && word <= 0xDFFF) - { - i--; - char = string[i] + char; - } - if (isGood(_Utils_chr(char))) - { - return true; - } - } - return false; -}); - -var _String_all = F2(function(isGood, string) -{ - var i = string.length; - while (i--) - { - var char = string[i]; - var word = string.charCodeAt(i); - if (0xDC00 <= word && word <= 0xDFFF) - { - i--; - char = string[i] + char; - } - if (!isGood(_Utils_chr(char))) - { - return false; - } - } - return true; -}); - -var _String_contains = F2(function(sub, str) -{ - return str.indexOf(sub) > -1; -}); - -var _String_startsWith = F2(function(sub, str) -{ - return str.indexOf(sub) === 0; -}); - -var _String_endsWith = F2(function(sub, str) -{ - return str.length >= sub.length && - str.lastIndexOf(sub) === str.length - sub.length; -}); - -var _String_indexes = F2(function(sub, str) -{ - var subLen = sub.length; - - if (subLen < 1) - { - return _List_Nil; - } - - var i = 0; - var is = []; - - while ((i = str.indexOf(sub, i)) > -1) - { - is.push(i); - i = i + subLen; - } - - return _List_fromArray(is); -}); - - -// TO STRING - -function _String_fromNumber(number) -{ - return number + ''; -} - - -// INT CONVERSIONS - -function _String_toInt(str) -{ - var total = 0; - var code0 = str.charCodeAt(0); - var start = code0 == 0x2B /* + */ || code0 == 0x2D /* - */ ? 1 : 0; - - for (var i = start; i < str.length; ++i) - { - var code = str.charCodeAt(i); - if (code < 0x30 || 0x39 < code) - { - return $elm$core$Maybe$Nothing; - } - total = 10 * total + code - 0x30; - } - - return i == start - ? $elm$core$Maybe$Nothing - : $elm$core$Maybe$Just(code0 == 0x2D ? -total : total); -} - - -// FLOAT CONVERSIONS - -function _String_toFloat(s) -{ - // check if it is a hex, octal, or binary number - if (s.length === 0 || /[\sxbo]/.test(s)) - { - return $elm$core$Maybe$Nothing; - } - var n = +s; - // faster isNaN check - return n === n ? $elm$core$Maybe$Just(n) : $elm$core$Maybe$Nothing; -} - -function _String_fromList(chars) -{ - return _List_toArray(chars).join(''); -} - - - - -function _Char_toCode(char) -{ - var code = char.charCodeAt(0); - if (0xD800 <= code && code <= 0xDBFF) - { - return (code - 0xD800) * 0x400 + char.charCodeAt(1) - 0xDC00 + 0x10000 - } - return code; -} - -function _Char_fromCode(code) -{ - return _Utils_chr( - (code < 0 || 0x10FFFF < code) - ? '\uFFFD' - : - (code <= 0xFFFF) - ? String.fromCharCode(code) - : - (code -= 0x10000, - String.fromCharCode(Math.floor(code / 0x400) + 0xD800, code % 0x400 + 0xDC00) - ) - ); -} - -function _Char_toUpper(char) -{ - return _Utils_chr(char.toUpperCase()); -} - -function _Char_toLower(char) -{ - return _Utils_chr(char.toLowerCase()); -} - -function _Char_toLocaleUpper(char) -{ - return _Utils_chr(char.toLocaleUpperCase()); -} - -function _Char_toLocaleLower(char) -{ - return _Utils_chr(char.toLocaleLowerCase()); -} - - - -/**/ -function _Json_errorToString(error) -{ - return $elm$json$Json$Decode$errorToString(error); -} -//*/ - - -// CORE DECODERS - -function _Json_succeed(msg) -{ - return { - $: 0, - a: msg - }; -} - -function _Json_fail(msg) -{ - return { - $: 1, - a: msg - }; -} - -function _Json_decodePrim(decoder) -{ - return { $: 2, b: decoder }; -} - -var _Json_decodeInt = _Json_decodePrim(function(value) { - return (typeof value !== 'number') - ? _Json_expecting('an INT', value) - : - (-2147483647 < value && value < 2147483647 && (value | 0) === value) - ? $elm$core$Result$Ok(value) - : - (isFinite(value) && !(value % 1)) - ? $elm$core$Result$Ok(value) - : _Json_expecting('an INT', value); -}); - -var _Json_decodeBool = _Json_decodePrim(function(value) { - return (typeof value === 'boolean') - ? $elm$core$Result$Ok(value) - : _Json_expecting('a BOOL', value); -}); - -var _Json_decodeFloat = _Json_decodePrim(function(value) { - return (typeof value === 'number') - ? $elm$core$Result$Ok(value) - : _Json_expecting('a FLOAT', value); -}); - -var _Json_decodeValue = _Json_decodePrim(function(value) { - return $elm$core$Result$Ok(_Json_wrap(value)); -}); - -var _Json_decodeString = _Json_decodePrim(function(value) { - return (typeof value === 'string') - ? $elm$core$Result$Ok(value) - : (value instanceof String) - ? $elm$core$Result$Ok(value + '') - : _Json_expecting('a STRING', value); -}); - -function _Json_decodeList(decoder) { return { $: 3, b: decoder }; } -function _Json_decodeArray(decoder) { return { $: 4, b: decoder }; } - -function _Json_decodeNull(value) { return { $: 5, c: value }; } - -var _Json_decodeField = F2(function(field, decoder) -{ - return { - $: 6, - d: field, - b: decoder - }; -}); - -var _Json_decodeIndex = F2(function(index, decoder) -{ - return { - $: 7, - e: index, - b: decoder - }; -}); - -function _Json_decodeKeyValuePairs(decoder) -{ - return { - $: 8, - b: decoder - }; -} - -function _Json_mapMany(f, decoders) -{ - return { - $: 9, - f: f, - g: decoders - }; -} - -var _Json_andThen = F2(function(callback, decoder) -{ - return { - $: 10, - b: decoder, - h: callback - }; -}); - -function _Json_oneOf(decoders) -{ - return { - $: 11, - g: decoders - }; -} - - -// DECODING OBJECTS - -var _Json_map1 = F2(function(f, d1) -{ - return _Json_mapMany(f, [d1]); -}); - -var _Json_map2 = F3(function(f, d1, d2) -{ - return _Json_mapMany(f, [d1, d2]); -}); - -var _Json_map3 = F4(function(f, d1, d2, d3) -{ - return _Json_mapMany(f, [d1, d2, d3]); -}); - -var _Json_map4 = F5(function(f, d1, d2, d3, d4) -{ - return _Json_mapMany(f, [d1, d2, d3, d4]); -}); - -var _Json_map5 = F6(function(f, d1, d2, d3, d4, d5) -{ - return _Json_mapMany(f, [d1, d2, d3, d4, d5]); -}); - -var _Json_map6 = F7(function(f, d1, d2, d3, d4, d5, d6) -{ - return _Json_mapMany(f, [d1, d2, d3, d4, d5, d6]); -}); - -var _Json_map7 = F8(function(f, d1, d2, d3, d4, d5, d6, d7) -{ - return _Json_mapMany(f, [d1, d2, d3, d4, d5, d6, d7]); -}); - -var _Json_map8 = F9(function(f, d1, d2, d3, d4, d5, d6, d7, d8) -{ - return _Json_mapMany(f, [d1, d2, d3, d4, d5, d6, d7, d8]); -}); - - -// DECODE - -var _Json_runOnString = F2(function(decoder, string) -{ - try - { - var value = JSON.parse(string); - return _Json_runHelp(decoder, value); - } - catch (e) - { - return $elm$core$Result$Err(A2($elm$json$Json$Decode$Failure, 'This is not valid JSON! ' + e.message, _Json_wrap(string))); - } -}); - -var _Json_run = F2(function(decoder, value) -{ - return _Json_runHelp(decoder, _Json_unwrap(value)); -}); - -function _Json_runHelp(decoder, value) -{ - switch (decoder.$) - { - case 2: - return decoder.b(value); - - case 5: - return (value === null) - ? $elm$core$Result$Ok(decoder.c) - : _Json_expecting('null', value); - - case 3: - if (!_Json_isArray(value)) - { - return _Json_expecting('a LIST', value); - } - return _Json_runArrayDecoder(decoder.b, value, _List_fromArray); - - case 4: - if (!_Json_isArray(value)) - { - return _Json_expecting('an ARRAY', value); - } - return _Json_runArrayDecoder(decoder.b, value, _Json_toElmArray); - - case 6: - var field = decoder.d; - if (typeof value !== 'object' || value === null || !(field in value)) - { - return _Json_expecting('an OBJECT with a field named `' + field + '`', value); - } - var result = _Json_runHelp(decoder.b, value[field]); - return ($elm$core$Result$isOk(result)) ? result : $elm$core$Result$Err(A2($elm$json$Json$Decode$Field, field, result.a)); - - case 7: - var index = decoder.e; - if (!_Json_isArray(value)) - { - return _Json_expecting('an ARRAY', value); - } - if (index >= value.length) - { - return _Json_expecting('a LONGER array. Need index ' + index + ' but only see ' + value.length + ' entries', value); - } - var result = _Json_runHelp(decoder.b, value[index]); - return ($elm$core$Result$isOk(result)) ? result : $elm$core$Result$Err(A2($elm$json$Json$Decode$Index, index, result.a)); - - case 8: - if (typeof value !== 'object' || value === null || _Json_isArray(value)) - { - return _Json_expecting('an OBJECT', value); - } - - var keyValuePairs = _List_Nil; - // TODO test perf of Object.keys and switch when support is good enough - for (var key in value) - { - if (value.hasOwnProperty(key)) - { - var result = _Json_runHelp(decoder.b, value[key]); - if (!$elm$core$Result$isOk(result)) - { - return $elm$core$Result$Err(A2($elm$json$Json$Decode$Field, key, result.a)); - } - keyValuePairs = _List_Cons(_Utils_Tuple2(key, result.a), keyValuePairs); - } - } - return $elm$core$Result$Ok($elm$core$List$reverse(keyValuePairs)); - - case 9: - var answer = decoder.f; - var decoders = decoder.g; - for (var i = 0; i < decoders.length; i++) - { - var result = _Json_runHelp(decoders[i], value); - if (!$elm$core$Result$isOk(result)) - { - return result; - } - answer = answer(result.a); - } - return $elm$core$Result$Ok(answer); - - case 10: - var result = _Json_runHelp(decoder.b, value); - return (!$elm$core$Result$isOk(result)) - ? result - : _Json_runHelp(decoder.h(result.a), value); - - case 11: - var errors = _List_Nil; - for (var temp = decoder.g; temp.b; temp = temp.b) // WHILE_CONS - { - var result = _Json_runHelp(temp.a, value); - if ($elm$core$Result$isOk(result)) - { - return result; - } - errors = _List_Cons(result.a, errors); - } - return $elm$core$Result$Err($elm$json$Json$Decode$OneOf($elm$core$List$reverse(errors))); - - case 1: - return $elm$core$Result$Err(A2($elm$json$Json$Decode$Failure, decoder.a, _Json_wrap(value))); - - case 0: - return $elm$core$Result$Ok(decoder.a); - } -} - -function _Json_runArrayDecoder(decoder, value, toElmValue) -{ - var len = value.length; - var array = new Array(len); - for (var i = 0; i < len; i++) - { - var result = _Json_runHelp(decoder, value[i]); - if (!$elm$core$Result$isOk(result)) - { - return $elm$core$Result$Err(A2($elm$json$Json$Decode$Index, i, result.a)); - } - array[i] = result.a; - } - return $elm$core$Result$Ok(toElmValue(array)); -} - -function _Json_isArray(value) -{ - return Array.isArray(value) || (typeof FileList !== 'undefined' && value instanceof FileList); -} - -function _Json_toElmArray(array) -{ - return A2($elm$core$Array$initialize, array.length, function(i) { return array[i]; }); -} - -function _Json_expecting(type, value) -{ - return $elm$core$Result$Err(A2($elm$json$Json$Decode$Failure, 'Expecting ' + type, _Json_wrap(value))); -} - - -// EQUALITY - -function _Json_equality(x, y) -{ - if (x === y) - { - return true; - } - - if (x.$ !== y.$) - { - return false; - } - - switch (x.$) - { - case 0: - case 1: - return x.a === y.a; - - case 2: - return x.b === y.b; - - case 5: - return x.c === y.c; - - case 3: - case 4: - case 8: - return _Json_equality(x.b, y.b); - - case 6: - return x.d === y.d && _Json_equality(x.b, y.b); - - case 7: - return x.e === y.e && _Json_equality(x.b, y.b); - - case 9: - return x.f === y.f && _Json_listEquality(x.g, y.g); - - case 10: - return x.h === y.h && _Json_equality(x.b, y.b); - - case 11: - return _Json_listEquality(x.g, y.g); - } -} - -function _Json_listEquality(aDecoders, bDecoders) -{ - var len = aDecoders.length; - if (len !== bDecoders.length) - { - return false; - } - for (var i = 0; i < len; i++) - { - if (!_Json_equality(aDecoders[i], bDecoders[i])) - { - return false; - } - } - return true; -} - - -// ENCODE - -var _Json_encode = F2(function(indentLevel, value) -{ - return JSON.stringify(_Json_unwrap(value), null, indentLevel) + ''; -}); - -function _Json_wrap(value) { return { $: 0, a: value }; } -function _Json_unwrap(value) { return value.a; } - -function _Json_wrap_UNUSED(value) { return value; } -function _Json_unwrap_UNUSED(value) { return value; } - -function _Json_emptyArray() { return []; } -function _Json_emptyObject() { return {}; } - -var _Json_addField = F3(function(key, value, object) -{ - object[key] = _Json_unwrap(value); - return object; -}); - -function _Json_addEntry(func) -{ - return F2(function(entry, array) - { - array.push(_Json_unwrap(func(entry))); - return array; - }); -} - -var _Json_encodeNull = _Json_wrap(null); - - - -// TASKS - -function _Scheduler_succeed(value) -{ - return { - $: 0, - a: value - }; -} - -function _Scheduler_fail(error) -{ - return { - $: 1, - a: error - }; -} - -function _Scheduler_binding(callback) -{ - return { - $: 2, - b: callback, - c: null - }; -} - -var _Scheduler_andThen = F2(function(callback, task) -{ - return { - $: 3, - b: callback, - d: task - }; -}); - -var _Scheduler_onError = F2(function(callback, task) -{ - return { - $: 4, - b: callback, - d: task - }; -}); - -function _Scheduler_receive(callback) -{ - return { - $: 5, - b: callback - }; -} - - -// PROCESSES - -var _Scheduler_guid = 0; - -function _Scheduler_rawSpawn(task) -{ - var proc = { - $: 0, - e: _Scheduler_guid++, - f: task, - g: null, - h: [] - }; - - _Scheduler_enqueue(proc); - - return proc; -} - -function _Scheduler_spawn(task) -{ - return _Scheduler_binding(function(callback) { - callback(_Scheduler_succeed(_Scheduler_rawSpawn(task))); - }); -} - -function _Scheduler_rawSend(proc, msg) -{ - proc.h.push(msg); - _Scheduler_enqueue(proc); -} - -var _Scheduler_send = F2(function(proc, msg) -{ - return _Scheduler_binding(function(callback) { - _Scheduler_rawSend(proc, msg); - callback(_Scheduler_succeed(_Utils_Tuple0)); - }); -}); - -function _Scheduler_kill(proc) -{ - return _Scheduler_binding(function(callback) { - var task = proc.f; - if (task.$ === 2 && task.c) - { - task.c(); - } - - proc.f = null; - - callback(_Scheduler_succeed(_Utils_Tuple0)); - }); -} - - -/* STEP PROCESSES - -type alias Process = - { $ : tag - , id : unique_id - , root : Task - , stack : null | { $: SUCCEED | FAIL, a: callback, b: stack } - , mailbox : [msg] - } - -*/ - - -var _Scheduler_working = false; -var _Scheduler_queue = []; - - -function _Scheduler_enqueue(proc) -{ - _Scheduler_queue.push(proc); - if (_Scheduler_working) - { - return; - } - _Scheduler_working = true; - while (proc = _Scheduler_queue.shift()) - { - _Scheduler_step(proc); - } - _Scheduler_working = false; -} - - -function _Scheduler_step(proc) -{ - while (proc.f) - { - var rootTag = proc.f.$; - if (rootTag === 0 || rootTag === 1) - { - while (proc.g && proc.g.$ !== rootTag) - { - proc.g = proc.g.i; - } - if (!proc.g) - { - return; - } - proc.f = proc.g.b(proc.f.a); - proc.g = proc.g.i; - } - else if (rootTag === 2) - { - proc.f.c = proc.f.b(function(newRoot) { - proc.f = newRoot; - _Scheduler_enqueue(proc); - }); - return; - } - else if (rootTag === 5) - { - if (proc.h.length === 0) - { - return; - } - proc.f = proc.f.b(proc.h.shift()); - } - else // if (rootTag === 3 || rootTag === 4) - { - proc.g = { - $: rootTag === 3 ? 0 : 1, - b: proc.f.b, - i: proc.g - }; - proc.f = proc.f.d; - } - } -} - - - -function _Process_sleep(time) -{ - return _Scheduler_binding(function(callback) { - var id = setTimeout(function() { - callback(_Scheduler_succeed(_Utils_Tuple0)); - }, time); - - return function() { clearTimeout(id); }; - }); -} - - - - -// PROGRAMS - - -var _Platform_worker = F4(function(impl, flagDecoder, debugMetadata, args) -{ - return _Platform_initialize( - flagDecoder, - args, - impl.init, - impl.update, - impl.subscriptions, - function() { return function() {} } - ); -}); - - - -// INITIALIZE A PROGRAM - - -function _Platform_initialize(flagDecoder, args, init, update, subscriptions, stepperBuilder) -{ - var result = A2(_Json_run, flagDecoder, _Json_wrap(args ? args['flags'] : undefined)); - $elm$core$Result$isOk(result) || _Debug_crash(2 /**/, _Json_errorToString(result.a) /**/); - var managers = {}; - var initPair = init(result.a); - var model = initPair.a; - var stepper = stepperBuilder(sendToApp, model); - var ports = _Platform_setupEffects(managers, sendToApp); - - function sendToApp(msg, viewMetadata) - { - var pair = A2(update, msg, model); - stepper(model = pair.a, viewMetadata); - _Platform_enqueueEffects(managers, pair.b, subscriptions(model)); - } - - _Platform_enqueueEffects(managers, initPair.b, subscriptions(model)); - - return ports ? { ports: ports } : {}; -} - - - -// TRACK PRELOADS -// -// This is used by code in elm/browser and elm/http -// to register any HTTP requests that are triggered by init. -// - - -var _Platform_preload; - - -function _Platform_registerPreload(url) -{ - _Platform_preload.add(url); -} - - - -// EFFECT MANAGERS - - -var _Platform_effectManagers = {}; - - -function _Platform_setupEffects(managers, sendToApp) -{ - var ports; - - // setup all necessary effect managers - for (var key in _Platform_effectManagers) - { - var manager = _Platform_effectManagers[key]; - - if (manager.a) - { - ports = ports || {}; - ports[key] = manager.a(key, sendToApp); - } - - managers[key] = _Platform_instantiateManager(manager, sendToApp); - } - - return ports; -} - - -function _Platform_createManager(init, onEffects, onSelfMsg, cmdMap, subMap) -{ - return { - b: init, - c: onEffects, - d: onSelfMsg, - e: cmdMap, - f: subMap - }; -} - - -function _Platform_instantiateManager(info, sendToApp) -{ - var router = { - g: sendToApp, - h: undefined - }; - - var onEffects = info.c; - var onSelfMsg = info.d; - var cmdMap = info.e; - var subMap = info.f; - - function loop(state) - { - return A2(_Scheduler_andThen, loop, _Scheduler_receive(function(msg) - { - var value = msg.a; - - if (msg.$ === 0) - { - return A3(onSelfMsg, router, value, state); - } - - return cmdMap && subMap - ? A4(onEffects, router, value.i, value.j, state) - : A3(onEffects, router, cmdMap ? value.i : value.j, state); - })); - } - - return router.h = _Scheduler_rawSpawn(A2(_Scheduler_andThen, loop, info.b)); -} - - - -// ROUTING - - -var _Platform_sendToApp = F2(function(router, msg) -{ - return _Scheduler_binding(function(callback) - { - router.g(msg); - callback(_Scheduler_succeed(_Utils_Tuple0)); - }); -}); - - -var _Platform_sendToSelf = F2(function(router, msg) -{ - return A2(_Scheduler_send, router.h, { - $: 0, - a: msg - }); -}); - - - -// BAGS - - -function _Platform_leaf(home) -{ - return function(value) - { - return { - $: 1, - k: home, - l: value - }; - }; -} - - -function _Platform_batch(list) -{ - return { - $: 2, - m: list - }; -} - - -var _Platform_map = F2(function(tagger, bag) -{ - return { - $: 3, - n: tagger, - o: bag - } -}); - - - -// PIPE BAGS INTO EFFECT MANAGERS -// -// Effects must be queued! -// -// Say your init contains a synchronous command, like Time.now or Time.here -// -// - This will produce a batch of effects (FX_1) -// - The synchronous task triggers the subsequent `update` call -// - This will produce a batch of effects (FX_2) -// -// If we just start dispatching FX_2, subscriptions from FX_2 can be processed -// before subscriptions from FX_1. No good! Earlier versions of this code had -// this problem, leading to these reports: -// -// https://github.com/elm/core/issues/980 -// https://github.com/elm/core/pull/981 -// https://github.com/elm/compiler/issues/1776 -// -// The queue is necessary to avoid ordering issues for synchronous commands. - - -// Why use true/false here? Why not just check the length of the queue? -// The goal is to detect "are we currently dispatching effects?" If we -// are, we need to bail and let the ongoing while loop handle things. -// -// Now say the queue has 1 element. When we dequeue the final element, -// the queue will be empty, but we are still actively dispatching effects. -// So you could get queue jumping in a really tricky category of cases. -// -var _Platform_effectsQueue = []; -var _Platform_effectsActive = false; - - -function _Platform_enqueueEffects(managers, cmdBag, subBag) -{ - _Platform_effectsQueue.push({ p: managers, q: cmdBag, r: subBag }); - - if (_Platform_effectsActive) return; - - _Platform_effectsActive = true; - for (var fx; fx = _Platform_effectsQueue.shift(); ) - { - _Platform_dispatchEffects(fx.p, fx.q, fx.r); - } - _Platform_effectsActive = false; -} - - -function _Platform_dispatchEffects(managers, cmdBag, subBag) -{ - var effectsDict = {}; - _Platform_gatherEffects(true, cmdBag, effectsDict, null); - _Platform_gatherEffects(false, subBag, effectsDict, null); - - for (var home in managers) - { - _Scheduler_rawSend(managers[home], { - $: 'fx', - a: effectsDict[home] || { i: _List_Nil, j: _List_Nil } - }); - } -} - - -function _Platform_gatherEffects(isCmd, bag, effectsDict, taggers) -{ - switch (bag.$) - { - case 1: - var home = bag.k; - var effect = _Platform_toEffect(isCmd, home, taggers, bag.l); - effectsDict[home] = _Platform_insert(isCmd, effect, effectsDict[home]); - return; - - case 2: - for (var list = bag.m; list.b; list = list.b) // WHILE_CONS - { - _Platform_gatherEffects(isCmd, list.a, effectsDict, taggers); - } - return; - - case 3: - _Platform_gatherEffects(isCmd, bag.o, effectsDict, { - s: bag.n, - t: taggers - }); - return; - } -} - - -function _Platform_toEffect(isCmd, home, taggers, value) -{ - function applyTaggers(x) - { - for (var temp = taggers; temp; temp = temp.t) - { - x = temp.s(x); - } - return x; - } - - var map = isCmd - ? _Platform_effectManagers[home].e - : _Platform_effectManagers[home].f; - - return A2(map, applyTaggers, value) -} - - -function _Platform_insert(isCmd, newEffect, effects) -{ - effects = effects || { i: _List_Nil, j: _List_Nil }; - - isCmd - ? (effects.i = _List_Cons(newEffect, effects.i)) - : (effects.j = _List_Cons(newEffect, effects.j)); - - return effects; -} - - - -// PORTS - - -function _Platform_checkPortName(name) -{ - if (_Platform_effectManagers[name]) - { - _Debug_crash(3, name) - } -} - - - -// OUTGOING PORTS - - -function _Platform_outgoingPort(name, converter) -{ - _Platform_checkPortName(name); - _Platform_effectManagers[name] = { - e: _Platform_outgoingPortMap, - u: converter, - a: _Platform_setupOutgoingPort - }; - return _Platform_leaf(name); -} - - -var _Platform_outgoingPortMap = F2(function(tagger, value) { return value; }); - - -function _Platform_setupOutgoingPort(name) -{ - var subs = []; - var converter = _Platform_effectManagers[name].u; - - // CREATE MANAGER - - var init = _Process_sleep(0); - - _Platform_effectManagers[name].b = init; - _Platform_effectManagers[name].c = F3(function(router, cmdList, state) - { - for ( ; cmdList.b; cmdList = cmdList.b) // WHILE_CONS - { - // grab a separate reference to subs in case unsubscribe is called - var currentSubs = subs; - var value = _Json_unwrap(converter(cmdList.a)); - for (var i = 0; i < currentSubs.length; i++) - { - currentSubs[i](value); - } - } - return init; - }); - - // PUBLIC API - - function subscribe(callback) - { - subs.push(callback); - } - - function unsubscribe(callback) - { - // copy subs into a new array in case unsubscribe is called within a - // subscribed callback - subs = subs.slice(); - var index = subs.indexOf(callback); - if (index >= 0) - { - subs.splice(index, 1); - } - } - - return { - subscribe: subscribe, - unsubscribe: unsubscribe - }; -} - - - -// INCOMING PORTS - - -function _Platform_incomingPort(name, converter) -{ - _Platform_checkPortName(name); - _Platform_effectManagers[name] = { - f: _Platform_incomingPortMap, - u: converter, - a: _Platform_setupIncomingPort - }; - return _Platform_leaf(name); -} - - -var _Platform_incomingPortMap = F2(function(tagger, finalTagger) -{ - return function(value) - { - return tagger(finalTagger(value)); - }; -}); - - -function _Platform_setupIncomingPort(name, sendToApp) -{ - var subs = _List_Nil; - var converter = _Platform_effectManagers[name].u; - - // CREATE MANAGER - - var init = _Scheduler_succeed(null); - - _Platform_effectManagers[name].b = init; - _Platform_effectManagers[name].c = F3(function(router, subList, state) - { - subs = subList; - return init; - }); - - // PUBLIC API - - function send(incomingValue) - { - var result = A2(_Json_run, converter, _Json_wrap(incomingValue)); - - $elm$core$Result$isOk(result) || _Debug_crash(4, name, result.a); - - var value = result.a; - for (var temp = subs; temp.b; temp = temp.b) // WHILE_CONS - { - sendToApp(temp.a(value)); - } - } - - return { send: send }; -} - - - -// EXPORT ELM MODULES -// -// Have DEBUG and PROD versions so that we can (1) give nicer errors in -// debug mode and (2) not pay for the bits needed for that in prod mode. -// - - -function _Platform_export_UNUSED(exports) -{ - scope['Elm'] - ? _Platform_mergeExportsProd(scope['Elm'], exports) - : scope['Elm'] = exports; -} - - -function _Platform_mergeExportsProd(obj, exports) -{ - for (var name in exports) - { - (name in obj) - ? (name == 'init') - ? _Debug_crash(6) - : _Platform_mergeExportsProd(obj[name], exports[name]) - : (obj[name] = exports[name]); - } -} - - -function _Platform_export(exports) -{ - scope['Elm'] - ? _Platform_mergeExportsDebug('Elm', scope['Elm'], exports) - : scope['Elm'] = exports; -} - - -function _Platform_mergeExportsDebug(moduleName, obj, exports) -{ - for (var name in exports) - { - (name in obj) - ? (name == 'init') - ? _Debug_crash(6, moduleName) - : _Platform_mergeExportsDebug(moduleName + '.' + name, obj[name], exports[name]) - : (obj[name] = exports[name]); - } -} - - - - -// HELPERS - - -var _VirtualDom_divertHrefToApp; - -var _VirtualDom_doc = typeof document !== 'undefined' ? document : {}; - - -function _VirtualDom_appendChild(parent, child) -{ - parent.appendChild(child); -} - -var _VirtualDom_init = F4(function(virtualNode, flagDecoder, debugMetadata, args) -{ - // NOTE: this function needs _Platform_export available to work - - /**_UNUSED/ - var node = args['node']; - //*/ - /**/ - var node = args && args['node'] ? args['node'] : _Debug_crash(0); - //*/ - - node.parentNode.replaceChild( - _VirtualDom_render(virtualNode, function() {}), - node - ); - - return {}; -}); - - - -// TEXT - - -function _VirtualDom_text(string) -{ - return { - $: 0, - a: string - }; -} - - - -// NODE - - -var _VirtualDom_nodeNS = F2(function(namespace, tag) -{ - return F2(function(factList, kidList) - { - for (var kids = [], descendantsCount = 0; kidList.b; kidList = kidList.b) // WHILE_CONS - { - var kid = kidList.a; - descendantsCount += (kid.b || 0); - kids.push(kid); - } - descendantsCount += kids.length; - - return { - $: 1, - c: tag, - d: _VirtualDom_organizeFacts(factList), - e: kids, - f: namespace, - b: descendantsCount - }; - }); -}); - - -var _VirtualDom_node = _VirtualDom_nodeNS(undefined); - - - -// KEYED NODE - - -var _VirtualDom_keyedNodeNS = F2(function(namespace, tag) -{ - return F2(function(factList, kidList) - { - for (var kids = [], descendantsCount = 0; kidList.b; kidList = kidList.b) // WHILE_CONS - { - var kid = kidList.a; - descendantsCount += (kid.b.b || 0); - kids.push(kid); - } - descendantsCount += kids.length; - - return { - $: 2, - c: tag, - d: _VirtualDom_organizeFacts(factList), - e: kids, - f: namespace, - b: descendantsCount - }; - }); -}); - - -var _VirtualDom_keyedNode = _VirtualDom_keyedNodeNS(undefined); - - - -// CUSTOM - - -function _VirtualDom_custom(factList, model, render, diff) -{ - return { - $: 3, - d: _VirtualDom_organizeFacts(factList), - g: model, - h: render, - i: diff - }; -} - - - -// MAP - - -var _VirtualDom_map = F2(function(tagger, node) -{ - return { - $: 4, - j: tagger, - k: node, - b: 1 + (node.b || 0) - }; -}); - - - -// LAZY - - -function _VirtualDom_thunk(refs, thunk) -{ - return { - $: 5, - l: refs, - m: thunk, - k: undefined - }; -} - -var _VirtualDom_lazy = F2(function(func, a) -{ - return _VirtualDom_thunk([func, a], function() { - return func(a); - }); -}); - -var _VirtualDom_lazy2 = F3(function(func, a, b) -{ - return _VirtualDom_thunk([func, a, b], function() { - return A2(func, a, b); - }); -}); - -var _VirtualDom_lazy3 = F4(function(func, a, b, c) -{ - return _VirtualDom_thunk([func, a, b, c], function() { - return A3(func, a, b, c); - }); -}); - -var _VirtualDom_lazy4 = F5(function(func, a, b, c, d) -{ - return _VirtualDom_thunk([func, a, b, c, d], function() { - return A4(func, a, b, c, d); - }); -}); - -var _VirtualDom_lazy5 = F6(function(func, a, b, c, d, e) -{ - return _VirtualDom_thunk([func, a, b, c, d, e], function() { - return A5(func, a, b, c, d, e); - }); -}); - -var _VirtualDom_lazy6 = F7(function(func, a, b, c, d, e, f) -{ - return _VirtualDom_thunk([func, a, b, c, d, e, f], function() { - return A6(func, a, b, c, d, e, f); - }); -}); - -var _VirtualDom_lazy7 = F8(function(func, a, b, c, d, e, f, g) -{ - return _VirtualDom_thunk([func, a, b, c, d, e, f, g], function() { - return A7(func, a, b, c, d, e, f, g); - }); -}); - -var _VirtualDom_lazy8 = F9(function(func, a, b, c, d, e, f, g, h) -{ - return _VirtualDom_thunk([func, a, b, c, d, e, f, g, h], function() { - return A8(func, a, b, c, d, e, f, g, h); - }); -}); - - - -// FACTS - - -var _VirtualDom_on = F2(function(key, handler) -{ - return { - $: 'a0', - n: key, - o: handler - }; -}); -var _VirtualDom_style = F2(function(key, value) -{ - return { - $: 'a1', - n: key, - o: value - }; -}); -var _VirtualDom_property = F2(function(key, value) -{ - return { - $: 'a2', - n: key, - o: value - }; -}); -var _VirtualDom_attribute = F2(function(key, value) -{ - return { - $: 'a3', - n: key, - o: value - }; -}); -var _VirtualDom_attributeNS = F3(function(namespace, key, value) -{ - return { - $: 'a4', - n: key, - o: { f: namespace, o: value } - }; -}); - - - -// XSS ATTACK VECTOR CHECKS -// -// For some reason, tabs can appear in href protocols and it still works. -// So '\tjava\tSCRIPT:alert("!!!")' and 'javascript:alert("!!!")' are the same -// in practice. That is why _VirtualDom_RE_js and _VirtualDom_RE_js_html look -// so freaky. -// -// Pulling the regular expressions out to the top level gives a slight speed -// boost in small benchmarks (4-10%) but hoisting values to reduce allocation -// can be unpredictable in large programs where JIT may have a harder time with -// functions are not fully self-contained. The benefit is more that the js and -// js_html ones are so weird that I prefer to see them near each other. - - -var _VirtualDom_RE_script = /^script$/i; -var _VirtualDom_RE_on_formAction = /^(on|formAction$)/i; -var _VirtualDom_RE_js = /^\s*j\s*a\s*v\s*a\s*s\s*c\s*r\s*i\s*p\s*t\s*:/i; -var _VirtualDom_RE_js_html = /^\s*(j\s*a\s*v\s*a\s*s\s*c\s*r\s*i\s*p\s*t\s*:|d\s*a\s*t\s*a\s*:\s*t\s*e\s*x\s*t\s*\/\s*h\s*t\s*m\s*l\s*(,|;))/i; - - -function _VirtualDom_noScript(tag) -{ - return _VirtualDom_RE_script.test(tag) ? 'p' : tag; -} - -function _VirtualDom_noOnOrFormAction(key) -{ - return _VirtualDom_RE_on_formAction.test(key) ? 'data-' + key : key; -} - -function _VirtualDom_noInnerHtmlOrFormAction(key) -{ - return key == 'innerHTML' || key == 'formAction' ? 'data-' + key : key; -} - -function _VirtualDom_noJavaScriptUri(value) -{ - return _VirtualDom_RE_js.test(value) - ? /**_UNUSED/''//*//**/'javascript:alert("This is an XSS vector. Please use ports or web components instead.")'//*/ - : value; -} - -function _VirtualDom_noJavaScriptOrHtmlUri(value) -{ - return _VirtualDom_RE_js_html.test(value) - ? /**_UNUSED/''//*//**/'javascript:alert("This is an XSS vector. Please use ports or web components instead.")'//*/ - : value; -} - -function _VirtualDom_noJavaScriptOrHtmlJson(value) -{ - return (typeof _Json_unwrap(value) === 'string' && _VirtualDom_RE_js_html.test(_Json_unwrap(value))) - ? _Json_wrap( - /**_UNUSED/''//*//**/'javascript:alert("This is an XSS vector. Please use ports or web components instead.")'//*/ - ) : value; -} - - - -// MAP FACTS - - -var _VirtualDom_mapAttribute = F2(function(func, attr) -{ - return (attr.$ === 'a0') - ? A2(_VirtualDom_on, attr.n, _VirtualDom_mapHandler(func, attr.o)) - : attr; -}); - -function _VirtualDom_mapHandler(func, handler) -{ - var tag = $elm$virtual_dom$VirtualDom$toHandlerInt(handler); - - // 0 = Normal - // 1 = MayStopPropagation - // 2 = MayPreventDefault - // 3 = Custom - - return { - $: handler.$, - a: - !tag - ? A2($elm$json$Json$Decode$map, func, handler.a) - : - A3($elm$json$Json$Decode$map2, - tag < 3 - ? _VirtualDom_mapEventTuple - : _VirtualDom_mapEventRecord, - $elm$json$Json$Decode$succeed(func), - handler.a - ) - }; -} - -var _VirtualDom_mapEventTuple = F2(function(func, tuple) -{ - return _Utils_Tuple2(func(tuple.a), tuple.b); -}); - -var _VirtualDom_mapEventRecord = F2(function(func, record) -{ - return { - message: func(record.message), - stopPropagation: record.stopPropagation, - preventDefault: record.preventDefault - } -}); - - - -// ORGANIZE FACTS - - -function _VirtualDom_organizeFacts(factList) -{ - for (var facts = {}; factList.b; factList = factList.b) // WHILE_CONS - { - var entry = factList.a; - - var tag = entry.$; - var key = entry.n; - var value = entry.o; - - if (tag === 'a2') - { - (key === 'className') - ? _VirtualDom_addClass(facts, key, _Json_unwrap(value)) - : facts[key] = _Json_unwrap(value); - - continue; - } - - var subFacts = facts[tag] || (facts[tag] = {}); - (tag === 'a3' && key === 'class') - ? _VirtualDom_addClass(subFacts, key, value) - : subFacts[key] = value; - } - - return facts; -} - -function _VirtualDom_addClass(object, key, newClass) -{ - var classes = object[key]; - object[key] = classes ? classes + ' ' + newClass : newClass; -} - - - -// RENDER - - -function _VirtualDom_render(vNode, eventNode) -{ - var tag = vNode.$; - - if (tag === 5) - { - return _VirtualDom_render(vNode.k || (vNode.k = vNode.m()), eventNode); - } - - if (tag === 0) - { - return _VirtualDom_doc.createTextNode(vNode.a); - } - - if (tag === 4) - { - var subNode = vNode.k; - var tagger = vNode.j; - - while (subNode.$ === 4) - { - typeof tagger !== 'object' - ? tagger = [tagger, subNode.j] - : tagger.push(subNode.j); - - subNode = subNode.k; - } - - var subEventRoot = { j: tagger, p: eventNode }; - var domNode = _VirtualDom_render(subNode, subEventRoot); - domNode.elm_event_node_ref = subEventRoot; - return domNode; - } - - if (tag === 3) - { - var domNode = vNode.h(vNode.g); - _VirtualDom_applyFacts(domNode, eventNode, vNode.d); - return domNode; - } - - // at this point `tag` must be 1 or 2 - - var domNode = vNode.f - ? _VirtualDom_doc.createElementNS(vNode.f, vNode.c) - : _VirtualDom_doc.createElement(vNode.c); - - if (_VirtualDom_divertHrefToApp && vNode.c == 'a') - { - domNode.addEventListener('click', _VirtualDom_divertHrefToApp(domNode)); - } - - _VirtualDom_applyFacts(domNode, eventNode, vNode.d); - - for (var kids = vNode.e, i = 0; i < kids.length; i++) - { - _VirtualDom_appendChild(domNode, _VirtualDom_render(tag === 1 ? kids[i] : kids[i].b, eventNode)); - } - - return domNode; -} - - - -// APPLY FACTS - - -function _VirtualDom_applyFacts(domNode, eventNode, facts) -{ - for (var key in facts) - { - var value = facts[key]; - - key === 'a1' - ? _VirtualDom_applyStyles(domNode, value) - : - key === 'a0' - ? _VirtualDom_applyEvents(domNode, eventNode, value) - : - key === 'a3' - ? _VirtualDom_applyAttrs(domNode, value) - : - key === 'a4' - ? _VirtualDom_applyAttrsNS(domNode, value) - : - ((key !== 'value' && key !== 'checked') || domNode[key] !== value) && (domNode[key] = value); - } -} - - - -// APPLY STYLES - - -function _VirtualDom_applyStyles(domNode, styles) -{ - var domNodeStyle = domNode.style; - - for (var key in styles) - { - domNodeStyle[key] = styles[key]; - } -} - - - -// APPLY ATTRS - - -function _VirtualDom_applyAttrs(domNode, attrs) -{ - for (var key in attrs) - { - var value = attrs[key]; - typeof value !== 'undefined' - ? domNode.setAttribute(key, value) - : domNode.removeAttribute(key); - } -} - - - -// APPLY NAMESPACED ATTRS - - -function _VirtualDom_applyAttrsNS(domNode, nsAttrs) -{ - for (var key in nsAttrs) - { - var pair = nsAttrs[key]; - var namespace = pair.f; - var value = pair.o; - - typeof value !== 'undefined' - ? domNode.setAttributeNS(namespace, key, value) - : domNode.removeAttributeNS(namespace, key); - } -} - - - -// APPLY EVENTS - - -function _VirtualDom_applyEvents(domNode, eventNode, events) -{ - var allCallbacks = domNode.elmFs || (domNode.elmFs = {}); - - for (var key in events) - { - var newHandler = events[key]; - var oldCallback = allCallbacks[key]; - - if (!newHandler) - { - domNode.removeEventListener(key, oldCallback); - allCallbacks[key] = undefined; - continue; - } - - if (oldCallback) - { - var oldHandler = oldCallback.q; - if (oldHandler.$ === newHandler.$) - { - oldCallback.q = newHandler; - continue; - } - domNode.removeEventListener(key, oldCallback); - } - - oldCallback = _VirtualDom_makeCallback(eventNode, newHandler); - domNode.addEventListener(key, oldCallback, - _VirtualDom_passiveSupported - && { passive: $elm$virtual_dom$VirtualDom$toHandlerInt(newHandler) < 2 } - ); - allCallbacks[key] = oldCallback; - } -} - - - -// PASSIVE EVENTS - - -var _VirtualDom_passiveSupported; - -try -{ - window.addEventListener('t', null, Object.defineProperty({}, 'passive', { - get: function() { _VirtualDom_passiveSupported = true; } - })); -} -catch(e) {} - - - -// EVENT HANDLERS - - -function _VirtualDom_makeCallback(eventNode, initialHandler) -{ - function callback(event) - { - var handler = callback.q; - var result = _Json_runHelp(handler.a, event); - - if (!$elm$core$Result$isOk(result)) - { - return; - } - - var tag = $elm$virtual_dom$VirtualDom$toHandlerInt(handler); - - // 0 = Normal - // 1 = MayStopPropagation - // 2 = MayPreventDefault - // 3 = Custom - - var value = result.a; - var message = !tag ? value : tag < 3 ? value.a : value.message; - var stopPropagation = tag == 1 ? value.b : tag == 3 && value.stopPropagation; - var currentEventNode = ( - stopPropagation && event.stopPropagation(), - (tag == 2 ? value.b : tag == 3 && value.preventDefault) && event.preventDefault(), - eventNode - ); - var tagger; - var i; - while (tagger = currentEventNode.j) - { - if (typeof tagger == 'function') - { - message = tagger(message); - } - else - { - for (var i = tagger.length; i--; ) - { - message = tagger[i](message); - } - } - currentEventNode = currentEventNode.p; - } - currentEventNode(message, stopPropagation); // stopPropagation implies isSync - } - - callback.q = initialHandler; - - return callback; -} - -function _VirtualDom_equalEvents(x, y) -{ - return x.$ == y.$ && _Json_equality(x.a, y.a); -} - - - -// DIFF - - -// TODO: Should we do patches like in iOS? -// -// type Patch -// = At Int Patch -// | Batch (List Patch) -// | Change ... -// -// How could it not be better? -// -function _VirtualDom_diff(x, y) -{ - var patches = []; - _VirtualDom_diffHelp(x, y, patches, 0); - return patches; -} - - -function _VirtualDom_pushPatch(patches, type, index, data) -{ - var patch = { - $: type, - r: index, - s: data, - t: undefined, - u: undefined - }; - patches.push(patch); - return patch; -} - - -function _VirtualDom_diffHelp(x, y, patches, index) -{ - if (x === y) - { - return; - } - - var xType = x.$; - var yType = y.$; - - // Bail if you run into different types of nodes. Implies that the - // structure has changed significantly and it's not worth a diff. - if (xType !== yType) - { - if (xType === 1 && yType === 2) - { - y = _VirtualDom_dekey(y); - yType = 1; - } - else - { - _VirtualDom_pushPatch(patches, 0, index, y); - return; - } - } - - // Now we know that both nodes are the same $. - switch (yType) - { - case 5: - var xRefs = x.l; - var yRefs = y.l; - var i = xRefs.length; - var same = i === yRefs.length; - while (same && i--) - { - same = xRefs[i] === yRefs[i]; - } - if (same) - { - y.k = x.k; - return; - } - y.k = y.m(); - var subPatches = []; - _VirtualDom_diffHelp(x.k, y.k, subPatches, 0); - subPatches.length > 0 && _VirtualDom_pushPatch(patches, 1, index, subPatches); - return; - - case 4: - // gather nested taggers - var xTaggers = x.j; - var yTaggers = y.j; - var nesting = false; - - var xSubNode = x.k; - while (xSubNode.$ === 4) - { - nesting = true; - - typeof xTaggers !== 'object' - ? xTaggers = [xTaggers, xSubNode.j] - : xTaggers.push(xSubNode.j); - - xSubNode = xSubNode.k; - } - - var ySubNode = y.k; - while (ySubNode.$ === 4) - { - nesting = true; - - typeof yTaggers !== 'object' - ? yTaggers = [yTaggers, ySubNode.j] - : yTaggers.push(ySubNode.j); - - ySubNode = ySubNode.k; - } - - // Just bail if different numbers of taggers. This implies the - // structure of the virtual DOM has changed. - if (nesting && xTaggers.length !== yTaggers.length) - { - _VirtualDom_pushPatch(patches, 0, index, y); - return; - } - - // check if taggers are "the same" - if (nesting ? !_VirtualDom_pairwiseRefEqual(xTaggers, yTaggers) : xTaggers !== yTaggers) - { - _VirtualDom_pushPatch(patches, 2, index, yTaggers); - } - - // diff everything below the taggers - _VirtualDom_diffHelp(xSubNode, ySubNode, patches, index + 1); - return; - - case 0: - if (x.a !== y.a) - { - _VirtualDom_pushPatch(patches, 3, index, y.a); - } - return; - - case 1: - _VirtualDom_diffNodes(x, y, patches, index, _VirtualDom_diffKids); - return; - - case 2: - _VirtualDom_diffNodes(x, y, patches, index, _VirtualDom_diffKeyedKids); - return; - - case 3: - if (x.h !== y.h) - { - _VirtualDom_pushPatch(patches, 0, index, y); - return; - } - - var factsDiff = _VirtualDom_diffFacts(x.d, y.d); - factsDiff && _VirtualDom_pushPatch(patches, 4, index, factsDiff); - - var patch = y.i(x.g, y.g); - patch && _VirtualDom_pushPatch(patches, 5, index, patch); - - return; - } -} - -// assumes the incoming arrays are the same length -function _VirtualDom_pairwiseRefEqual(as, bs) -{ - for (var i = 0; i < as.length; i++) - { - if (as[i] !== bs[i]) - { - return false; - } - } - - return true; -} - -function _VirtualDom_diffNodes(x, y, patches, index, diffKids) -{ - // Bail if obvious indicators have changed. Implies more serious - // structural changes such that it's not worth it to diff. - if (x.c !== y.c || x.f !== y.f) - { - _VirtualDom_pushPatch(patches, 0, index, y); - return; - } - - var factsDiff = _VirtualDom_diffFacts(x.d, y.d); - factsDiff && _VirtualDom_pushPatch(patches, 4, index, factsDiff); - - diffKids(x, y, patches, index); -} - - - -// DIFF FACTS - - -// TODO Instead of creating a new diff object, it's possible to just test if -// there *is* a diff. During the actual patch, do the diff again and make the -// modifications directly. This way, there's no new allocations. Worth it? -function _VirtualDom_diffFacts(x, y, category) -{ - var diff; - - // look for changes and removals - for (var xKey in x) - { - if (xKey === 'a1' || xKey === 'a0' || xKey === 'a3' || xKey === 'a4') - { - var subDiff = _VirtualDom_diffFacts(x[xKey], y[xKey] || {}, xKey); - if (subDiff) - { - diff = diff || {}; - diff[xKey] = subDiff; - } - continue; - } - - // remove if not in the new facts - if (!(xKey in y)) - { - diff = diff || {}; - diff[xKey] = - !category - ? (typeof x[xKey] === 'string' ? '' : null) - : - (category === 'a1') - ? '' - : - (category === 'a0' || category === 'a3') - ? undefined - : - { f: x[xKey].f, o: undefined }; - - continue; - } - - var xValue = x[xKey]; - var yValue = y[xKey]; - - // reference equal, so don't worry about it - if (xValue === yValue && xKey !== 'value' && xKey !== 'checked' - || category === 'a0' && _VirtualDom_equalEvents(xValue, yValue)) - { - continue; - } - - diff = diff || {}; - diff[xKey] = yValue; - } - - // add new stuff - for (var yKey in y) - { - if (!(yKey in x)) - { - diff = diff || {}; - diff[yKey] = y[yKey]; - } - } - - return diff; -} - - - -// DIFF KIDS - - -function _VirtualDom_diffKids(xParent, yParent, patches, index) -{ - var xKids = xParent.e; - var yKids = yParent.e; - - var xLen = xKids.length; - var yLen = yKids.length; - - // FIGURE OUT IF THERE ARE INSERTS OR REMOVALS - - if (xLen > yLen) - { - _VirtualDom_pushPatch(patches, 6, index, { - v: yLen, - i: xLen - yLen - }); - } - else if (xLen < yLen) - { - _VirtualDom_pushPatch(patches, 7, index, { - v: xLen, - e: yKids - }); - } - - // PAIRWISE DIFF EVERYTHING ELSE - - for (var minLen = xLen < yLen ? xLen : yLen, i = 0; i < minLen; i++) - { - var xKid = xKids[i]; - _VirtualDom_diffHelp(xKid, yKids[i], patches, ++index); - index += xKid.b || 0; - } -} - - - -// KEYED DIFF - - -function _VirtualDom_diffKeyedKids(xParent, yParent, patches, rootIndex) -{ - var localPatches = []; - - var changes = {}; // Dict String Entry - var inserts = []; // Array { index : Int, entry : Entry } - // type Entry = { tag : String, vnode : VNode, index : Int, data : _ } - - var xKids = xParent.e; - var yKids = yParent.e; - var xLen = xKids.length; - var yLen = yKids.length; - var xIndex = 0; - var yIndex = 0; - - var index = rootIndex; - - while (xIndex < xLen && yIndex < yLen) - { - var x = xKids[xIndex]; - var y = yKids[yIndex]; - - var xKey = x.a; - var yKey = y.a; - var xNode = x.b; - var yNode = y.b; - - var newMatch = undefined; - var oldMatch = undefined; - - // check if keys match - - if (xKey === yKey) - { - index++; - _VirtualDom_diffHelp(xNode, yNode, localPatches, index); - index += xNode.b || 0; - - xIndex++; - yIndex++; - continue; - } - - // look ahead 1 to detect insertions and removals. - - var xNext = xKids[xIndex + 1]; - var yNext = yKids[yIndex + 1]; - - if (xNext) - { - var xNextKey = xNext.a; - var xNextNode = xNext.b; - oldMatch = yKey === xNextKey; - } - - if (yNext) - { - var yNextKey = yNext.a; - var yNextNode = yNext.b; - newMatch = xKey === yNextKey; - } - - - // swap x and y - if (newMatch && oldMatch) - { - index++; - _VirtualDom_diffHelp(xNode, yNextNode, localPatches, index); - _VirtualDom_insertNode(changes, localPatches, xKey, yNode, yIndex, inserts); - index += xNode.b || 0; - - index++; - _VirtualDom_removeNode(changes, localPatches, xKey, xNextNode, index); - index += xNextNode.b || 0; - - xIndex += 2; - yIndex += 2; - continue; - } - - // insert y - if (newMatch) - { - index++; - _VirtualDom_insertNode(changes, localPatches, yKey, yNode, yIndex, inserts); - _VirtualDom_diffHelp(xNode, yNextNode, localPatches, index); - index += xNode.b || 0; - - xIndex += 1; - yIndex += 2; - continue; - } - - // remove x - if (oldMatch) - { - index++; - _VirtualDom_removeNode(changes, localPatches, xKey, xNode, index); - index += xNode.b || 0; - - index++; - _VirtualDom_diffHelp(xNextNode, yNode, localPatches, index); - index += xNextNode.b || 0; - - xIndex += 2; - yIndex += 1; - continue; - } - - // remove x, insert y - if (xNext && xNextKey === yNextKey) - { - index++; - _VirtualDom_removeNode(changes, localPatches, xKey, xNode, index); - _VirtualDom_insertNode(changes, localPatches, yKey, yNode, yIndex, inserts); - index += xNode.b || 0; - - index++; - _VirtualDom_diffHelp(xNextNode, yNextNode, localPatches, index); - index += xNextNode.b || 0; - - xIndex += 2; - yIndex += 2; - continue; - } - - break; - } - - // eat up any remaining nodes with removeNode and insertNode - - while (xIndex < xLen) - { - index++; - var x = xKids[xIndex]; - var xNode = x.b; - _VirtualDom_removeNode(changes, localPatches, x.a, xNode, index); - index += xNode.b || 0; - xIndex++; - } - - while (yIndex < yLen) - { - var endInserts = endInserts || []; - var y = yKids[yIndex]; - _VirtualDom_insertNode(changes, localPatches, y.a, y.b, undefined, endInserts); - yIndex++; - } - - if (localPatches.length > 0 || inserts.length > 0 || endInserts) - { - _VirtualDom_pushPatch(patches, 8, rootIndex, { - w: localPatches, - x: inserts, - y: endInserts - }); - } -} - - - -// CHANGES FROM KEYED DIFF - - -var _VirtualDom_POSTFIX = '_elmW6BL'; - - -function _VirtualDom_insertNode(changes, localPatches, key, vnode, yIndex, inserts) -{ - var entry = changes[key]; - - // never seen this key before - if (!entry) - { - entry = { - c: 0, - z: vnode, - r: yIndex, - s: undefined - }; - - inserts.push({ r: yIndex, A: entry }); - changes[key] = entry; - - return; - } - - // this key was removed earlier, a match! - if (entry.c === 1) - { - inserts.push({ r: yIndex, A: entry }); - - entry.c = 2; - var subPatches = []; - _VirtualDom_diffHelp(entry.z, vnode, subPatches, entry.r); - entry.r = yIndex; - entry.s.s = { - w: subPatches, - A: entry - }; - - return; - } - - // this key has already been inserted or moved, a duplicate! - _VirtualDom_insertNode(changes, localPatches, key + _VirtualDom_POSTFIX, vnode, yIndex, inserts); -} - - -function _VirtualDom_removeNode(changes, localPatches, key, vnode, index) -{ - var entry = changes[key]; - - // never seen this key before - if (!entry) - { - var patch = _VirtualDom_pushPatch(localPatches, 9, index, undefined); - - changes[key] = { - c: 1, - z: vnode, - r: index, - s: patch - }; - - return; - } - - // this key was inserted earlier, a match! - if (entry.c === 0) - { - entry.c = 2; - var subPatches = []; - _VirtualDom_diffHelp(vnode, entry.z, subPatches, index); - - _VirtualDom_pushPatch(localPatches, 9, index, { - w: subPatches, - A: entry - }); - - return; - } - - // this key has already been removed or moved, a duplicate! - _VirtualDom_removeNode(changes, localPatches, key + _VirtualDom_POSTFIX, vnode, index); -} - - - -// ADD DOM NODES -// -// Each DOM node has an "index" assigned in order of traversal. It is important -// to minimize our crawl over the actual DOM, so these indexes (along with the -// descendantsCount of virtual nodes) let us skip touching entire subtrees of -// the DOM if we know there are no patches there. - - -function _VirtualDom_addDomNodes(domNode, vNode, patches, eventNode) -{ - _VirtualDom_addDomNodesHelp(domNode, vNode, patches, 0, 0, vNode.b, eventNode); -} - - -// assumes `patches` is non-empty and indexes increase monotonically. -function _VirtualDom_addDomNodesHelp(domNode, vNode, patches, i, low, high, eventNode) -{ - var patch = patches[i]; - var index = patch.r; - - while (index === low) - { - var patchType = patch.$; - - if (patchType === 1) - { - _VirtualDom_addDomNodes(domNode, vNode.k, patch.s, eventNode); - } - else if (patchType === 8) - { - patch.t = domNode; - patch.u = eventNode; - - var subPatches = patch.s.w; - if (subPatches.length > 0) - { - _VirtualDom_addDomNodesHelp(domNode, vNode, subPatches, 0, low, high, eventNode); - } - } - else if (patchType === 9) - { - patch.t = domNode; - patch.u = eventNode; - - var data = patch.s; - if (data) - { - data.A.s = domNode; - var subPatches = data.w; - if (subPatches.length > 0) - { - _VirtualDom_addDomNodesHelp(domNode, vNode, subPatches, 0, low, high, eventNode); - } - } - } - else - { - patch.t = domNode; - patch.u = eventNode; - } - - i++; - - if (!(patch = patches[i]) || (index = patch.r) > high) - { - return i; - } - } - - var tag = vNode.$; - - if (tag === 4) - { - var subNode = vNode.k; - - while (subNode.$ === 4) - { - subNode = subNode.k; - } - - return _VirtualDom_addDomNodesHelp(domNode, subNode, patches, i, low + 1, high, domNode.elm_event_node_ref); - } - - // tag must be 1 or 2 at this point - - var vKids = vNode.e; - var childNodes = domNode.childNodes; - for (var j = 0; j < vKids.length; j++) - { - low++; - var vKid = tag === 1 ? vKids[j] : vKids[j].b; - var nextLow = low + (vKid.b || 0); - if (low <= index && index <= nextLow) - { - i = _VirtualDom_addDomNodesHelp(childNodes[j], vKid, patches, i, low, nextLow, eventNode); - if (!(patch = patches[i]) || (index = patch.r) > high) - { - return i; - } - } - low = nextLow; - } - return i; -} - - - -// APPLY PATCHES - - -function _VirtualDom_applyPatches(rootDomNode, oldVirtualNode, patches, eventNode) -{ - if (patches.length === 0) - { - return rootDomNode; - } - - _VirtualDom_addDomNodes(rootDomNode, oldVirtualNode, patches, eventNode); - return _VirtualDom_applyPatchesHelp(rootDomNode, patches); -} - -function _VirtualDom_applyPatchesHelp(rootDomNode, patches) -{ - for (var i = 0; i < patches.length; i++) - { - var patch = patches[i]; - var localDomNode = patch.t - var newNode = _VirtualDom_applyPatch(localDomNode, patch); - if (localDomNode === rootDomNode) - { - rootDomNode = newNode; - } - } - return rootDomNode; -} - -function _VirtualDom_applyPatch(domNode, patch) -{ - switch (patch.$) - { - case 0: - return _VirtualDom_applyPatchRedraw(domNode, patch.s, patch.u); - - case 4: - _VirtualDom_applyFacts(domNode, patch.u, patch.s); - return domNode; - - case 3: - domNode.replaceData(0, domNode.length, patch.s); - return domNode; - - case 1: - return _VirtualDom_applyPatchesHelp(domNode, patch.s); - - case 2: - if (domNode.elm_event_node_ref) - { - domNode.elm_event_node_ref.j = patch.s; - } - else - { - domNode.elm_event_node_ref = { j: patch.s, p: patch.u }; - } - return domNode; - - case 6: - var data = patch.s; - for (var i = 0; i < data.i; i++) - { - domNode.removeChild(domNode.childNodes[data.v]); - } - return domNode; - - case 7: - var data = patch.s; - var kids = data.e; - var i = data.v; - var theEnd = domNode.childNodes[i]; - for (; i < kids.length; i++) - { - domNode.insertBefore(_VirtualDom_render(kids[i], patch.u), theEnd); - } - return domNode; - - case 9: - var data = patch.s; - if (!data) - { - domNode.parentNode.removeChild(domNode); - return domNode; - } - var entry = data.A; - if (typeof entry.r !== 'undefined') - { - domNode.parentNode.removeChild(domNode); - } - entry.s = _VirtualDom_applyPatchesHelp(domNode, data.w); - return domNode; - - case 8: - return _VirtualDom_applyPatchReorder(domNode, patch); - - case 5: - return patch.s(domNode); - - default: - _Debug_crash(10); // 'Ran into an unknown patch!' - } -} - - -function _VirtualDom_applyPatchRedraw(domNode, vNode, eventNode) -{ - var parentNode = domNode.parentNode; - var newNode = _VirtualDom_render(vNode, eventNode); - - if (!newNode.elm_event_node_ref) - { - newNode.elm_event_node_ref = domNode.elm_event_node_ref; - } - - if (parentNode && newNode !== domNode) - { - parentNode.replaceChild(newNode, domNode); - } - return newNode; -} - - -function _VirtualDom_applyPatchReorder(domNode, patch) -{ - var data = patch.s; - - // remove end inserts - var frag = _VirtualDom_applyPatchReorderEndInsertsHelp(data.y, patch); - - // removals - domNode = _VirtualDom_applyPatchesHelp(domNode, data.w); - - // inserts - var inserts = data.x; - for (var i = 0; i < inserts.length; i++) - { - var insert = inserts[i]; - var entry = insert.A; - var node = entry.c === 2 - ? entry.s - : _VirtualDom_render(entry.z, patch.u); - domNode.insertBefore(node, domNode.childNodes[insert.r]); - } - - // add end inserts - if (frag) - { - _VirtualDom_appendChild(domNode, frag); - } - - return domNode; -} - - -function _VirtualDom_applyPatchReorderEndInsertsHelp(endInserts, patch) -{ - if (!endInserts) - { - return; - } - - var frag = _VirtualDom_doc.createDocumentFragment(); - for (var i = 0; i < endInserts.length; i++) - { - var insert = endInserts[i]; - var entry = insert.A; - _VirtualDom_appendChild(frag, entry.c === 2 - ? entry.s - : _VirtualDom_render(entry.z, patch.u) - ); - } - return frag; -} - - -function _VirtualDom_virtualize(node) -{ - // TEXT NODES - - if (node.nodeType === 3) - { - return _VirtualDom_text(node.textContent); - } - - - // WEIRD NODES - - if (node.nodeType !== 1) - { - return _VirtualDom_text(''); - } - - - // ELEMENT NODES - - var attrList = _List_Nil; - var attrs = node.attributes; - for (var i = attrs.length; i--; ) - { - var attr = attrs[i]; - var name = attr.name; - var value = attr.value; - attrList = _List_Cons( A2(_VirtualDom_attribute, name, value), attrList ); - } - - var tag = node.tagName.toLowerCase(); - var kidList = _List_Nil; - var kids = node.childNodes; - - for (var i = kids.length; i--; ) - { - kidList = _List_Cons(_VirtualDom_virtualize(kids[i]), kidList); - } - return A3(_VirtualDom_node, tag, attrList, kidList); -} - -function _VirtualDom_dekey(keyedNode) -{ - var keyedKids = keyedNode.e; - var len = keyedKids.length; - var kids = new Array(len); - for (var i = 0; i < len; i++) - { - kids[i] = keyedKids[i].b; - } - - return { - $: 1, - c: keyedNode.c, - d: keyedNode.d, - e: kids, - f: keyedNode.f, - b: keyedNode.b - }; -} - - - -var _Bitwise_and = F2(function(a, b) -{ - return a & b; -}); - -var _Bitwise_or = F2(function(a, b) -{ - return a | b; -}); - -var _Bitwise_xor = F2(function(a, b) -{ - return a ^ b; -}); - -function _Bitwise_complement(a) -{ - return ~a; -}; - -var _Bitwise_shiftLeftBy = F2(function(offset, a) -{ - return a << offset; -}); - -var _Bitwise_shiftRightBy = F2(function(offset, a) -{ - return a >> offset; -}); - -var _Bitwise_shiftRightZfBy = F2(function(offset, a) -{ - return a >>> offset; -}); - - - - -// HELPERS - - -function _Debugger_unsafeCoerce(value) -{ - return value; -} - - - -// PROGRAMS - - -var _Debugger_element = F4(function(impl, flagDecoder, debugMetadata, args) -{ - return _Platform_initialize( - flagDecoder, - args, - A3($elm$browser$Debugger$Main$wrapInit, _Json_wrap(debugMetadata), _Debugger_popout(), impl.init), - $elm$browser$Debugger$Main$wrapUpdate(impl.update), - $elm$browser$Debugger$Main$wrapSubs(impl.subscriptions), - function(sendToApp, initialModel) - { - var view = impl.view; - var title = _VirtualDom_doc.title; - var domNode = args && args['node'] ? args['node'] : _Debug_crash(0); - var currNode = _VirtualDom_virtualize(domNode); - var currBlocker = $elm$browser$Debugger$Main$toBlockerType(initialModel); - var currPopout; - - var cornerNode = _VirtualDom_doc.createElement('div'); - domNode.parentNode.insertBefore(cornerNode, domNode.nextSibling); - var cornerCurr = _VirtualDom_virtualize(cornerNode); - - initialModel.popout.a = sendToApp; - - return _Browser_makeAnimator(initialModel, function(model) - { - var nextNode = A2(_VirtualDom_map, $elm$browser$Debugger$Main$UserMsg, view($elm$browser$Debugger$Main$getUserModel(model))); - var patches = _VirtualDom_diff(currNode, nextNode); - domNode = _VirtualDom_applyPatches(domNode, currNode, patches, sendToApp); - currNode = nextNode; - - // update blocker - - var nextBlocker = $elm$browser$Debugger$Main$toBlockerType(model); - _Debugger_updateBlocker(currBlocker, nextBlocker); - currBlocker = nextBlocker; - - // view corner - - var cornerNext = $elm$browser$Debugger$Main$cornerView(model); - var cornerPatches = _VirtualDom_diff(cornerCurr, cornerNext); - cornerNode = _VirtualDom_applyPatches(cornerNode, cornerCurr, cornerPatches, sendToApp); - cornerCurr = cornerNext; - - if (!model.popout.b) - { - currPopout = undefined; - return; - } - - // view popout - - _VirtualDom_doc = model.popout.b; // SWITCH TO POPOUT DOC - currPopout || (currPopout = _VirtualDom_virtualize(model.popout.b)); - var nextPopout = $elm$browser$Debugger$Main$popoutView(model); - var popoutPatches = _VirtualDom_diff(currPopout, nextPopout); - _VirtualDom_applyPatches(model.popout.b.body, currPopout, popoutPatches, sendToApp); - currPopout = nextPopout; - _VirtualDom_doc = document; // SWITCH BACK TO NORMAL DOC - }); - } - ); -}); - - -var _Debugger_document = F4(function(impl, flagDecoder, debugMetadata, args) -{ - return _Platform_initialize( - flagDecoder, - args, - A3($elm$browser$Debugger$Main$wrapInit, _Json_wrap(debugMetadata), _Debugger_popout(), impl.init), - $elm$browser$Debugger$Main$wrapUpdate(impl.update), - $elm$browser$Debugger$Main$wrapSubs(impl.subscriptions), - function(sendToApp, initialModel) - { - var divertHrefToApp = impl.setup && impl.setup(function(x) { return sendToApp($elm$browser$Debugger$Main$UserMsg(x)); }); - var view = impl.view; - var title = _VirtualDom_doc.title; - var bodyNode = _VirtualDom_doc.body; - var currNode = _VirtualDom_virtualize(bodyNode); - var currBlocker = $elm$browser$Debugger$Main$toBlockerType(initialModel); - var currPopout; - - initialModel.popout.a = sendToApp; - - return _Browser_makeAnimator(initialModel, function(model) - { - _VirtualDom_divertHrefToApp = divertHrefToApp; - var doc = view($elm$browser$Debugger$Main$getUserModel(model)); - var nextNode = _VirtualDom_node('body')(_List_Nil)( - _Utils_ap( - A2($elm$core$List$map, _VirtualDom_map($elm$browser$Debugger$Main$UserMsg), doc.body), - _List_Cons($elm$browser$Debugger$Main$cornerView(model), _List_Nil) - ) - ); - var patches = _VirtualDom_diff(currNode, nextNode); - bodyNode = _VirtualDom_applyPatches(bodyNode, currNode, patches, sendToApp); - currNode = nextNode; - _VirtualDom_divertHrefToApp = 0; - (title !== doc.title) && (_VirtualDom_doc.title = title = doc.title); - - // update blocker - - var nextBlocker = $elm$browser$Debugger$Main$toBlockerType(model); - _Debugger_updateBlocker(currBlocker, nextBlocker); - currBlocker = nextBlocker; - - // view popout - - if (!model.popout.b) { currPopout = undefined; return; } - - _VirtualDom_doc = model.popout.b; // SWITCH TO POPOUT DOC - currPopout || (currPopout = _VirtualDom_virtualize(model.popout.b)); - var nextPopout = $elm$browser$Debugger$Main$popoutView(model); - var popoutPatches = _VirtualDom_diff(currPopout, nextPopout); - _VirtualDom_applyPatches(model.popout.b.body, currPopout, popoutPatches, sendToApp); - currPopout = nextPopout; - _VirtualDom_doc = document; // SWITCH BACK TO NORMAL DOC - }); - } - ); -}); - - -function _Debugger_popout() -{ - return { - b: undefined, - a: undefined - }; -} - -function _Debugger_isOpen(popout) -{ - return !!popout.b; -} - -function _Debugger_open(popout) -{ - return _Scheduler_binding(function(callback) - { - _Debugger_openWindow(popout); - callback(_Scheduler_succeed(_Utils_Tuple0)); - }); -} - -function _Debugger_openWindow(popout) -{ - var w = $elm$browser$Debugger$Main$initialWindowWidth, - h = $elm$browser$Debugger$Main$initialWindowHeight, - x = screen.width - w, - y = screen.height - h; - - var debuggerWindow = window.open('', '', 'width=' + w + ',height=' + h + ',left=' + x + ',top=' + y); - var doc = debuggerWindow.document; - doc.title = 'Elm Debugger'; - - // handle arrow keys - doc.addEventListener('keydown', function(event) { - event.metaKey && event.which === 82 && window.location.reload(); - event.key === 'ArrowUp' && (popout.a($elm$browser$Debugger$Main$Up ), event.preventDefault()); - event.key === 'ArrowDown' && (popout.a($elm$browser$Debugger$Main$Down), event.preventDefault()); - }); - - // handle window close - window.addEventListener('unload', close); - debuggerWindow.addEventListener('unload', function() { - popout.b = undefined; - popout.a($elm$browser$Debugger$Main$NoOp); - window.removeEventListener('unload', close); - }); - - function close() { - popout.b = undefined; - popout.a($elm$browser$Debugger$Main$NoOp); - debuggerWindow.close(); - } - - // register new window - popout.b = doc; -} - - - -// SCROLL - - -function _Debugger_scroll(popout) -{ - return _Scheduler_binding(function(callback) - { - if (popout.b) - { - var msgs = popout.b.getElementById('elm-debugger-sidebar'); - if (msgs && msgs.scrollTop !== 0) - { - msgs.scrollTop = 0; - } - } - callback(_Scheduler_succeed(_Utils_Tuple0)); - }); -} - - -var _Debugger_scrollTo = F2(function(id, popout) -{ - return _Scheduler_binding(function(callback) - { - if (popout.b) - { - var msg = popout.b.getElementById(id); - if (msg) - { - msg.scrollIntoView(false); - } - } - callback(_Scheduler_succeed(_Utils_Tuple0)); - }); -}); - - - -// UPLOAD - - -function _Debugger_upload(popout) -{ - return _Scheduler_binding(function(callback) - { - var doc = popout.b || document; - var element = doc.createElement('input'); - element.setAttribute('type', 'file'); - element.setAttribute('accept', 'text/json'); - element.style.display = 'none'; - element.addEventListener('change', function(event) - { - var fileReader = new FileReader(); - fileReader.onload = function(e) - { - callback(_Scheduler_succeed(e.target.result)); - }; - fileReader.readAsText(event.target.files[0]); - doc.body.removeChild(element); - }); - doc.body.appendChild(element); - element.click(); - }); -} - - - -// DOWNLOAD - - -var _Debugger_download = F2(function(historyLength, json) -{ - return _Scheduler_binding(function(callback) - { - var fileName = 'history-' + historyLength + '.txt'; - var jsonString = JSON.stringify(json); - var mime = 'text/plain;charset=utf-8'; - var done = _Scheduler_succeed(_Utils_Tuple0); - - // for IE10+ - if (navigator.msSaveBlob) - { - navigator.msSaveBlob(new Blob([jsonString], {type: mime}), fileName); - return callback(done); - } - - // for HTML5 - var element = document.createElement('a'); - element.setAttribute('href', 'data:' + mime + ',' + encodeURIComponent(jsonString)); - element.setAttribute('download', fileName); - element.style.display = 'none'; - document.body.appendChild(element); - element.click(); - document.body.removeChild(element); - callback(done); - }); -}); - - - -// POPOUT CONTENT - - -function _Debugger_messageToString(value) -{ - if (typeof value === 'boolean') - { - return value ? 'True' : 'False'; - } - - if (typeof value === 'number') - { - return value + ''; - } - - if (typeof value === 'string') - { - return '"' + _Debugger_addSlashes(value, false) + '"'; - } - - if (value instanceof String) - { - return "'" + _Debugger_addSlashes(value, true) + "'"; - } - - if (typeof value !== 'object' || value === null || !('$' in value)) - { - return '…'; - } - - if (typeof value.$ === 'number') - { - return '…'; - } - - var code = value.$.charCodeAt(0); - if (code === 0x23 /* # */ || /* a */ 0x61 <= code && code <= 0x7A /* z */) - { - return '…'; - } - - if (['Array_elm_builtin', 'Set_elm_builtin', 'RBNode_elm_builtin', 'RBEmpty_elm_builtin'].indexOf(value.$) >= 0) - { - return '…'; - } - - var keys = Object.keys(value); - switch (keys.length) - { - case 1: - return value.$; - case 2: - return value.$ + ' ' + _Debugger_messageToString(value.a); - default: - return value.$ + ' … ' + _Debugger_messageToString(value[keys[keys.length - 1]]); - } -} - - -function _Debugger_init(value) -{ - if (typeof value === 'boolean') - { - return A3($elm$browser$Debugger$Expando$Constructor, $elm$core$Maybe$Just(value ? 'True' : 'False'), true, _List_Nil); - } - - if (typeof value === 'number') - { - return $elm$browser$Debugger$Expando$Primitive(value + ''); - } - - if (typeof value === 'string') - { - return $elm$browser$Debugger$Expando$S('"' + _Debugger_addSlashes(value, false) + '"'); - } - - if (value instanceof String) - { - return $elm$browser$Debugger$Expando$S("'" + _Debugger_addSlashes(value, true) + "'"); - } - - if (typeof value === 'object' && '$' in value) - { - var tag = value.$; - - if (tag === '::' || tag === '[]') - { - return A3($elm$browser$Debugger$Expando$Sequence, $elm$browser$Debugger$Expando$ListSeq, true, - A2($elm$core$List$map, _Debugger_init, value) - ); - } - - if (tag === 'Set_elm_builtin') - { - return A3($elm$browser$Debugger$Expando$Sequence, $elm$browser$Debugger$Expando$SetSeq, true, - A3($elm$core$Set$foldr, _Debugger_initCons, _List_Nil, value) - ); - } - - if (tag === 'RBNode_elm_builtin' || tag == 'RBEmpty_elm_builtin') - { - return A2($elm$browser$Debugger$Expando$Dictionary, true, - A3($elm$core$Dict$foldr, _Debugger_initKeyValueCons, _List_Nil, value) - ); - } - - if (tag === 'Array_elm_builtin') - { - return A3($elm$browser$Debugger$Expando$Sequence, $elm$browser$Debugger$Expando$ArraySeq, true, - A3($elm$core$Array$foldr, _Debugger_initCons, _List_Nil, value) - ); - } - - if (typeof tag === 'number') - { - return $elm$browser$Debugger$Expando$Primitive(''); - } - - var char = tag.charCodeAt(0); - if (char === 35 || 65 <= char && char <= 90) - { - var list = _List_Nil; - for (var i in value) - { - if (i === '$') continue; - list = _List_Cons(_Debugger_init(value[i]), list); - } - return A3($elm$browser$Debugger$Expando$Constructor, char === 35 ? $elm$core$Maybe$Nothing : $elm$core$Maybe$Just(tag), true, $elm$core$List$reverse(list)); - } - - return $elm$browser$Debugger$Expando$Primitive(''); - } - - if (typeof value === 'object') - { - var dict = $elm$core$Dict$empty; - for (var i in value) - { - dict = A3($elm$core$Dict$insert, i, _Debugger_init(value[i]), dict); - } - return A2($elm$browser$Debugger$Expando$Record, true, dict); - } - - return $elm$browser$Debugger$Expando$Primitive(''); -} - -var _Debugger_initCons = F2(function initConsHelp(value, list) -{ - return _List_Cons(_Debugger_init(value), list); -}); - -var _Debugger_initKeyValueCons = F3(function(key, value, list) -{ - return _List_Cons( - _Utils_Tuple2(_Debugger_init(key), _Debugger_init(value)), - list - ); -}); - -function _Debugger_addSlashes(str, isChar) -{ - var s = str - .replace(/\\/g, '\\\\') - .replace(/\n/g, '\\n') - .replace(/\t/g, '\\t') - .replace(/\r/g, '\\r') - .replace(/\v/g, '\\v') - .replace(/\0/g, '\\0'); - if (isChar) - { - return s.replace(/\'/g, '\\\''); - } - else - { - return s.replace(/\"/g, '\\"'); - } -} - - - -// BLOCK EVENTS - - -function _Debugger_updateBlocker(oldBlocker, newBlocker) -{ - if (oldBlocker === newBlocker) return; - - var oldEvents = _Debugger_blockerToEvents(oldBlocker); - var newEvents = _Debugger_blockerToEvents(newBlocker); - - // remove old blockers - for (var i = 0; i < oldEvents.length; i++) - { - document.removeEventListener(oldEvents[i], _Debugger_blocker, true); - } - - // add new blockers - for (var i = 0; i < newEvents.length; i++) - { - document.addEventListener(newEvents[i], _Debugger_blocker, true); - } -} - - -function _Debugger_blocker(event) -{ - if (event.type === 'keydown' && event.metaKey && event.which === 82) - { - return; - } - - var isScroll = event.type === 'scroll' || event.type === 'wheel'; - for (var node = event.target; node; node = node.parentNode) - { - if (isScroll ? node.id === 'elm-debugger-details' : node.id === 'elm-debugger-overlay') - { - return; - } - } - - event.stopPropagation(); - event.preventDefault(); -} - -function _Debugger_blockerToEvents(blocker) -{ - return blocker === $elm$browser$Debugger$Overlay$BlockNone - ? [] - : blocker === $elm$browser$Debugger$Overlay$BlockMost - ? _Debugger_mostEvents - : _Debugger_allEvents; -} - -var _Debugger_mostEvents = [ - 'click', 'dblclick', 'mousemove', - 'mouseup', 'mousedown', 'mouseenter', 'mouseleave', - 'touchstart', 'touchend', 'touchcancel', 'touchmove', - 'pointerdown', 'pointerup', 'pointerover', 'pointerout', - 'pointerenter', 'pointerleave', 'pointermove', 'pointercancel', - 'dragstart', 'drag', 'dragend', 'dragenter', 'dragover', 'dragleave', 'drop', - 'keyup', 'keydown', 'keypress', - 'input', 'change', - 'focus', 'blur' -]; - -var _Debugger_allEvents = _Debugger_mostEvents.concat('wheel', 'scroll'); - - - - -// ELEMENT - - -var _Debugger_element; - -var _Browser_element = _Debugger_element || F4(function(impl, flagDecoder, debugMetadata, args) -{ - return _Platform_initialize( - flagDecoder, - args, - impl.init, - impl.update, - impl.subscriptions, - function(sendToApp, initialModel) { - var view = impl.view; - /**_UNUSED/ - var domNode = args['node']; - //*/ - /**/ - var domNode = args && args['node'] ? args['node'] : _Debug_crash(0); - //*/ - var currNode = _VirtualDom_virtualize(domNode); - - return _Browser_makeAnimator(initialModel, function(model) - { - var nextNode = view(model); - var patches = _VirtualDom_diff(currNode, nextNode); - domNode = _VirtualDom_applyPatches(domNode, currNode, patches, sendToApp); - currNode = nextNode; - }); - } - ); -}); - - - -// DOCUMENT - - -var _Debugger_document; - -var _Browser_document = _Debugger_document || F4(function(impl, flagDecoder, debugMetadata, args) -{ - return _Platform_initialize( - flagDecoder, - args, - impl.init, - impl.update, - impl.subscriptions, - function(sendToApp, initialModel) { - var divertHrefToApp = impl.setup && impl.setup(sendToApp) - var view = impl.view; - var title = _VirtualDom_doc.title; - var bodyNode = _VirtualDom_doc.body; - var currNode = _VirtualDom_virtualize(bodyNode); - return _Browser_makeAnimator(initialModel, function(model) - { - _VirtualDom_divertHrefToApp = divertHrefToApp; - var doc = view(model); - var nextNode = _VirtualDom_node('body')(_List_Nil)(doc.body); - var patches = _VirtualDom_diff(currNode, nextNode); - bodyNode = _VirtualDom_applyPatches(bodyNode, currNode, patches, sendToApp); - currNode = nextNode; - _VirtualDom_divertHrefToApp = 0; - (title !== doc.title) && (_VirtualDom_doc.title = title = doc.title); - }); - } - ); -}); - - - -// ANIMATION - - -var _Browser_cancelAnimationFrame = - typeof cancelAnimationFrame !== 'undefined' - ? cancelAnimationFrame - : function(id) { clearTimeout(id); }; - -var _Browser_requestAnimationFrame = - typeof requestAnimationFrame !== 'undefined' - ? requestAnimationFrame - : function(callback) { return setTimeout(callback, 1000 / 60); }; - - -function _Browser_makeAnimator(model, draw) -{ - draw(model); - - var state = 0; - - function updateIfNeeded() - { - state = state === 1 - ? 0 - : ( _Browser_requestAnimationFrame(updateIfNeeded), draw(model), 1 ); - } - - return function(nextModel, isSync) - { - model = nextModel; - - isSync - ? ( draw(model), - state === 2 && (state = 1) - ) - : ( state === 0 && _Browser_requestAnimationFrame(updateIfNeeded), - state = 2 - ); - }; -} - - - -// APPLICATION - - -function _Browser_application(impl) -{ - var onUrlChange = impl.onUrlChange; - var onUrlRequest = impl.onUrlRequest; - var key = function() { key.a(onUrlChange(_Browser_getUrl())); }; - - return _Browser_document({ - setup: function(sendToApp) - { - key.a = sendToApp; - _Browser_window.addEventListener('popstate', key); - _Browser_window.navigator.userAgent.indexOf('Trident') < 0 || _Browser_window.addEventListener('hashchange', key); - - return F2(function(domNode, event) - { - if (!event.ctrlKey && !event.metaKey && !event.shiftKey && event.button < 1 && !domNode.target && !domNode.hasAttribute('download')) - { - event.preventDefault(); - var href = domNode.href; - var curr = _Browser_getUrl(); - var next = $elm$url$Url$fromString(href).a; - sendToApp(onUrlRequest( - (next - && curr.protocol === next.protocol - && curr.host === next.host - && curr.port_.a === next.port_.a - ) - ? $elm$browser$Browser$Internal(next) - : $elm$browser$Browser$External(href) - )); - } - }); - }, - init: function(flags) - { - return A3(impl.init, flags, _Browser_getUrl(), key); - }, - view: impl.view, - update: impl.update, - subscriptions: impl.subscriptions - }); -} - -function _Browser_getUrl() -{ - return $elm$url$Url$fromString(_VirtualDom_doc.location.href).a || _Debug_crash(1); -} - -var _Browser_go = F2(function(key, n) -{ - return A2($elm$core$Task$perform, $elm$core$Basics$never, _Scheduler_binding(function() { - n && history.go(n); - key(); - })); -}); - -var _Browser_pushUrl = F2(function(key, url) -{ - return A2($elm$core$Task$perform, $elm$core$Basics$never, _Scheduler_binding(function() { - history.pushState({}, '', url); - key(); - })); -}); - -var _Browser_replaceUrl = F2(function(key, url) -{ - return A2($elm$core$Task$perform, $elm$core$Basics$never, _Scheduler_binding(function() { - history.replaceState({}, '', url); - key(); - })); -}); - - - -// GLOBAL EVENTS - - -var _Browser_fakeNode = { addEventListener: function() {}, removeEventListener: function() {} }; -var _Browser_doc = typeof document !== 'undefined' ? document : _Browser_fakeNode; -var _Browser_window = typeof window !== 'undefined' ? window : _Browser_fakeNode; - -var _Browser_on = F3(function(node, eventName, sendToSelf) -{ - return _Scheduler_spawn(_Scheduler_binding(function(callback) - { - function handler(event) { _Scheduler_rawSpawn(sendToSelf(event)); } - node.addEventListener(eventName, handler, _VirtualDom_passiveSupported && { passive: true }); - return function() { node.removeEventListener(eventName, handler); }; - })); -}); - -var _Browser_decodeEvent = F2(function(decoder, event) -{ - var result = _Json_runHelp(decoder, event); - return $elm$core$Result$isOk(result) ? $elm$core$Maybe$Just(result.a) : $elm$core$Maybe$Nothing; -}); - - - -// PAGE VISIBILITY - - -function _Browser_visibilityInfo() -{ - return (typeof _VirtualDom_doc.hidden !== 'undefined') - ? { hidden: 'hidden', change: 'visibilitychange' } - : - (typeof _VirtualDom_doc.mozHidden !== 'undefined') - ? { hidden: 'mozHidden', change: 'mozvisibilitychange' } - : - (typeof _VirtualDom_doc.msHidden !== 'undefined') - ? { hidden: 'msHidden', change: 'msvisibilitychange' } - : - (typeof _VirtualDom_doc.webkitHidden !== 'undefined') - ? { hidden: 'webkitHidden', change: 'webkitvisibilitychange' } - : { hidden: 'hidden', change: 'visibilitychange' }; -} - - - -// ANIMATION FRAMES - - -function _Browser_rAF() -{ - return _Scheduler_binding(function(callback) - { - var id = _Browser_requestAnimationFrame(function() { - callback(_Scheduler_succeed(Date.now())); - }); - - return function() { - _Browser_cancelAnimationFrame(id); - }; - }); -} - - -function _Browser_now() -{ - return _Scheduler_binding(function(callback) - { - callback(_Scheduler_succeed(Date.now())); - }); -} - - - -// DOM STUFF - - -function _Browser_withNode(id, doStuff) -{ - return _Scheduler_binding(function(callback) - { - _Browser_requestAnimationFrame(function() { - var node = document.getElementById(id); - callback(node - ? _Scheduler_succeed(doStuff(node)) - : _Scheduler_fail($elm$browser$Browser$Dom$NotFound(id)) - ); - }); - }); -} - - -function _Browser_withWindow(doStuff) -{ - return _Scheduler_binding(function(callback) - { - _Browser_requestAnimationFrame(function() { - callback(_Scheduler_succeed(doStuff())); - }); - }); -} - - -// FOCUS and BLUR - - -var _Browser_call = F2(function(functionName, id) -{ - return _Browser_withNode(id, function(node) { - node[functionName](); - return _Utils_Tuple0; - }); -}); - - - -// WINDOW VIEWPORT - - -function _Browser_getViewport() -{ - return { - scene: _Browser_getScene(), - viewport: { - x: _Browser_window.pageXOffset, - y: _Browser_window.pageYOffset, - width: _Browser_doc.documentElement.clientWidth, - height: _Browser_doc.documentElement.clientHeight - } - }; -} - -function _Browser_getScene() -{ - var body = _Browser_doc.body; - var elem = _Browser_doc.documentElement; - return { - width: Math.max(body.scrollWidth, body.offsetWidth, elem.scrollWidth, elem.offsetWidth, elem.clientWidth), - height: Math.max(body.scrollHeight, body.offsetHeight, elem.scrollHeight, elem.offsetHeight, elem.clientHeight) - }; -} - -var _Browser_setViewport = F2(function(x, y) -{ - return _Browser_withWindow(function() - { - _Browser_window.scroll(x, y); - return _Utils_Tuple0; - }); -}); - - - -// ELEMENT VIEWPORT - - -function _Browser_getViewportOf(id) -{ - return _Browser_withNode(id, function(node) - { - return { - scene: { - width: node.scrollWidth, - height: node.scrollHeight - }, - viewport: { - x: node.scrollLeft, - y: node.scrollTop, - width: node.clientWidth, - height: node.clientHeight - } - }; - }); -} - - -var _Browser_setViewportOf = F3(function(id, x, y) -{ - return _Browser_withNode(id, function(node) - { - node.scrollLeft = x; - node.scrollTop = y; - return _Utils_Tuple0; - }); -}); - - - -// ELEMENT - - -function _Browser_getElement(id) -{ - return _Browser_withNode(id, function(node) - { - var rect = node.getBoundingClientRect(); - var x = _Browser_window.pageXOffset; - var y = _Browser_window.pageYOffset; - return { - scene: _Browser_getScene(), - viewport: { - x: x, - y: y, - width: _Browser_doc.documentElement.clientWidth, - height: _Browser_doc.documentElement.clientHeight - }, - element: { - x: x + rect.left, - y: y + rect.top, - width: rect.width, - height: rect.height - } - }; - }); -} - - - -// LOAD and RELOAD - - -function _Browser_reload(skipCache) -{ - return A2($elm$core$Task$perform, $elm$core$Basics$never, _Scheduler_binding(function(callback) - { - _VirtualDom_doc.location.reload(skipCache); - })); -} - -function _Browser_load(url) -{ - return A2($elm$core$Task$perform, $elm$core$Basics$never, _Scheduler_binding(function(callback) - { - try - { - _Browser_window.location = url; - } - catch(err) - { - // Only Firefox can throw a NS_ERROR_MALFORMED_URI exception here. - // Other browsers reload the page, so let's be consistent about that. - _VirtualDom_doc.location.reload(false); - } - })); -} - - - -// SEND REQUEST - -var _Http_toTask = F3(function(router, toTask, request) -{ - return _Scheduler_binding(function(callback) - { - function done(response) { - callback(toTask(request.expect.a(response))); - } - - var xhr = new XMLHttpRequest(); - xhr.addEventListener('error', function() { done($elm$http$Http$NetworkError_); }); - xhr.addEventListener('timeout', function() { done($elm$http$Http$Timeout_); }); - xhr.addEventListener('load', function() { done(_Http_toResponse(request.expect.b, xhr)); }); - $elm$core$Maybe$isJust(request.tracker) && _Http_track(router, xhr, request.tracker.a); - - try { - xhr.open(request.method, request.url, true); - } catch (e) { - return done($elm$http$Http$BadUrl_(request.url)); - } - - _Http_configureRequest(xhr, request); - - request.body.a && xhr.setRequestHeader('Content-Type', request.body.a); - xhr.send(request.body.b); - - return function() { xhr.c = true; xhr.abort(); }; - }); -}); - - -// CONFIGURE - -function _Http_configureRequest(xhr, request) -{ - for (var headers = request.headers; headers.b; headers = headers.b) // WHILE_CONS - { - xhr.setRequestHeader(headers.a.a, headers.a.b); - } - xhr.timeout = request.timeout.a || 0; - xhr.responseType = request.expect.d; - xhr.withCredentials = request.allowCookiesFromOtherDomains; -} - - -// RESPONSES - -function _Http_toResponse(toBody, xhr) -{ - return A2( - 200 <= xhr.status && xhr.status < 300 ? $elm$http$Http$GoodStatus_ : $elm$http$Http$BadStatus_, - _Http_toMetadata(xhr), - toBody(xhr.response) - ); -} - - -// METADATA - -function _Http_toMetadata(xhr) -{ - return { - url: xhr.responseURL, - statusCode: xhr.status, - statusText: xhr.statusText, - headers: _Http_parseHeaders(xhr.getAllResponseHeaders()) - }; -} - - -// HEADERS - -function _Http_parseHeaders(rawHeaders) -{ - if (!rawHeaders) - { - return $elm$core$Dict$empty; - } - - var headers = $elm$core$Dict$empty; - var headerPairs = rawHeaders.split('\r\n'); - for (var i = headerPairs.length; i--; ) - { - var headerPair = headerPairs[i]; - var index = headerPair.indexOf(': '); - if (index > 0) - { - var key = headerPair.substring(0, index); - var value = headerPair.substring(index + 2); - - headers = A3($elm$core$Dict$update, key, function(oldValue) { - return $elm$core$Maybe$Just($elm$core$Maybe$isJust(oldValue) - ? value + ', ' + oldValue.a - : value - ); - }, headers); - } - } - return headers; -} - - -// EXPECT - -var _Http_expect = F3(function(type, toBody, toValue) -{ - return { - $: 0, - d: type, - b: toBody, - a: toValue - }; -}); - -var _Http_mapExpect = F2(function(func, expect) -{ - return { - $: 0, - d: expect.d, - b: expect.b, - a: function(x) { return func(expect.a(x)); } - }; -}); - -function _Http_toDataView(arrayBuffer) -{ - return new DataView(arrayBuffer); -} - - -// BODY and PARTS - -var _Http_emptyBody = { $: 0 }; -var _Http_pair = F2(function(a, b) { return { $: 0, a: a, b: b }; }); - -function _Http_toFormData(parts) -{ - for (var formData = new FormData(); parts.b; parts = parts.b) // WHILE_CONS - { - var part = parts.a; - formData.append(part.a, part.b); - } - return formData; -} - -var _Http_bytesToBlob = F2(function(mime, bytes) -{ - return new Blob([bytes], { type: mime }); -}); - - -// PROGRESS - -function _Http_track(router, xhr, tracker) -{ - // TODO check out lengthComputable on loadstart event - - xhr.upload.addEventListener('progress', function(event) { - if (xhr.c) { return; } - _Scheduler_rawSpawn(A2($elm$core$Platform$sendToSelf, router, _Utils_Tuple2(tracker, $elm$http$Http$Sending({ - sent: event.loaded, - size: event.total - })))); - }); - xhr.addEventListener('progress', function(event) { - if (xhr.c) { return; } - _Scheduler_rawSpawn(A2($elm$core$Platform$sendToSelf, router, _Utils_Tuple2(tracker, $elm$http$Http$Receiving({ - received: event.loaded, - size: event.lengthComputable ? $elm$core$Maybe$Just(event.total) : $elm$core$Maybe$Nothing - })))); - }); -}var $elm$core$List$cons = _List_cons; -var $elm$core$Elm$JsArray$foldr = _JsArray_foldr; -var $elm$core$Array$foldr = F3( - function (func, baseCase, _v0) { - var tree = _v0.c; - var tail = _v0.d; - var helper = F2( - function (node, acc) { - if (node.$ === 'SubTree') { - var subTree = node.a; - return A3($elm$core$Elm$JsArray$foldr, helper, acc, subTree); - } else { - var values = node.a; - return A3($elm$core$Elm$JsArray$foldr, func, acc, values); - } - }); - return A3( - $elm$core$Elm$JsArray$foldr, - helper, - A3($elm$core$Elm$JsArray$foldr, func, baseCase, tail), - tree); - }); -var $elm$core$Array$toList = function (array) { - return A3($elm$core$Array$foldr, $elm$core$List$cons, _List_Nil, array); -}; -var $elm$core$Dict$foldr = F3( - function (func, acc, t) { - foldr: - while (true) { - if (t.$ === 'RBEmpty_elm_builtin') { - return acc; - } else { - var key = t.b; - var value = t.c; - var left = t.d; - var right = t.e; - var $temp$func = func, - $temp$acc = A3( - func, - key, - value, - A3($elm$core$Dict$foldr, func, acc, right)), - $temp$t = left; - func = $temp$func; - acc = $temp$acc; - t = $temp$t; - continue foldr; - } - } - }); -var $elm$core$Dict$toList = function (dict) { - return A3( - $elm$core$Dict$foldr, - F3( - function (key, value, list) { - return A2( - $elm$core$List$cons, - _Utils_Tuple2(key, value), - list); - }), - _List_Nil, - dict); -}; -var $elm$core$Dict$keys = function (dict) { - return A3( - $elm$core$Dict$foldr, - F3( - function (key, value, keyList) { - return A2($elm$core$List$cons, key, keyList); - }), - _List_Nil, - dict); -}; -var $elm$core$Set$toList = function (_v0) { - var dict = _v0.a; - return $elm$core$Dict$keys(dict); -}; -var $elm$core$Basics$EQ = {$: 'EQ'}; -var $elm$core$Basics$GT = {$: 'GT'}; -var $elm$core$Basics$LT = {$: 'LT'}; -var $author$project$Entry$Context = F2( - function (globals, state) { - return {globals: globals, state: state}; - }); -var $author$project$Entry$ItemSearch = function (a) { - return {$: 'ItemSearch', a: a}; -}; -var $elm$core$Result$Err = function (a) { - return {$: 'Err', a: a}; -}; -var $elm$json$Json$Decode$Failure = F2( - function (a, b) { - return {$: 'Failure', a: a, b: b}; - }); -var $elm$json$Json$Decode$Field = F2( - function (a, b) { - return {$: 'Field', a: a, b: b}; - }); -var $elm$json$Json$Decode$Index = F2( - function (a, b) { - return {$: 'Index', a: a, b: b}; - }); -var $elm$core$Result$Ok = function (a) { - return {$: 'Ok', a: a}; -}; -var $elm$json$Json$Decode$OneOf = function (a) { - return {$: 'OneOf', a: a}; -}; -var $elm$core$Basics$False = {$: 'False'}; -var $elm$core$Basics$add = _Basics_add; -var $elm$core$Maybe$Just = function (a) { - return {$: 'Just', a: a}; -}; -var $elm$core$Maybe$Nothing = {$: 'Nothing'}; -var $elm$core$String$all = _String_all; -var $elm$core$Basics$and = _Basics_and; -var $elm$core$Basics$append = _Utils_append; -var $elm$json$Json$Encode$encode = _Json_encode; -var $elm$core$String$fromInt = _String_fromNumber; -var $elm$core$String$join = F2( - function (sep, chunks) { - return A2( - _String_join, - sep, - _List_toArray(chunks)); - }); -var $elm$core$String$split = F2( - function (sep, string) { - return _List_fromArray( - A2(_String_split, sep, string)); - }); -var $elm$json$Json$Decode$indent = function (str) { - return A2( - $elm$core$String$join, - '\n ', - A2($elm$core$String$split, '\n', str)); -}; -var $elm$core$List$foldl = F3( - function (func, acc, list) { - foldl: - while (true) { - if (!list.b) { - return acc; - } else { - var x = list.a; - var xs = list.b; - var $temp$func = func, - $temp$acc = A2(func, x, acc), - $temp$list = xs; - func = $temp$func; - acc = $temp$acc; - list = $temp$list; - continue foldl; - } - } - }); -var $elm$core$List$length = function (xs) { - return A3( - $elm$core$List$foldl, - F2( - function (_v0, i) { - return i + 1; - }), - 0, - xs); -}; -var $elm$core$List$map2 = _List_map2; -var $elm$core$Basics$le = _Utils_le; -var $elm$core$Basics$sub = _Basics_sub; -var $elm$core$List$rangeHelp = F3( - function (lo, hi, list) { - rangeHelp: - while (true) { - if (_Utils_cmp(lo, hi) < 1) { - var $temp$lo = lo, - $temp$hi = hi - 1, - $temp$list = A2($elm$core$List$cons, hi, list); - lo = $temp$lo; - hi = $temp$hi; - list = $temp$list; - continue rangeHelp; - } else { - return list; - } - } - }); -var $elm$core$List$range = F2( - function (lo, hi) { - return A3($elm$core$List$rangeHelp, lo, hi, _List_Nil); - }); -var $elm$core$List$indexedMap = F2( - function (f, xs) { - return A3( - $elm$core$List$map2, - f, - A2( - $elm$core$List$range, - 0, - $elm$core$List$length(xs) - 1), - xs); - }); -var $elm$core$Char$toCode = _Char_toCode; -var $elm$core$Char$isLower = function (_char) { - var code = $elm$core$Char$toCode(_char); - return (97 <= code) && (code <= 122); -}; -var $elm$core$Char$isUpper = function (_char) { - var code = $elm$core$Char$toCode(_char); - return (code <= 90) && (65 <= code); -}; -var $elm$core$Basics$or = _Basics_or; -var $elm$core$Char$isAlpha = function (_char) { - return $elm$core$Char$isLower(_char) || $elm$core$Char$isUpper(_char); -}; -var $elm$core$Char$isDigit = function (_char) { - var code = $elm$core$Char$toCode(_char); - return (code <= 57) && (48 <= code); -}; -var $elm$core$Char$isAlphaNum = function (_char) { - return $elm$core$Char$isLower(_char) || ($elm$core$Char$isUpper(_char) || $elm$core$Char$isDigit(_char)); -}; -var $elm$core$List$reverse = function (list) { - return A3($elm$core$List$foldl, $elm$core$List$cons, _List_Nil, list); -}; -var $elm$core$String$uncons = _String_uncons; -var $elm$json$Json$Decode$errorOneOf = F2( - function (i, error) { - return '\n\n(' + ($elm$core$String$fromInt(i + 1) + (') ' + $elm$json$Json$Decode$indent( - $elm$json$Json$Decode$errorToString(error)))); - }); -var $elm$json$Json$Decode$errorToString = function (error) { - return A2($elm$json$Json$Decode$errorToStringHelp, error, _List_Nil); -}; -var $elm$json$Json$Decode$errorToStringHelp = F2( - function (error, context) { - errorToStringHelp: - while (true) { - switch (error.$) { - case 'Field': - var f = error.a; - var err = error.b; - var isSimple = function () { - var _v1 = $elm$core$String$uncons(f); - if (_v1.$ === 'Nothing') { - return false; - } else { - var _v2 = _v1.a; - var _char = _v2.a; - var rest = _v2.b; - return $elm$core$Char$isAlpha(_char) && A2($elm$core$String$all, $elm$core$Char$isAlphaNum, rest); - } - }(); - var fieldName = isSimple ? ('.' + f) : ('[\'' + (f + '\']')); - var $temp$error = err, - $temp$context = A2($elm$core$List$cons, fieldName, context); - error = $temp$error; - context = $temp$context; - continue errorToStringHelp; - case 'Index': - var i = error.a; - var err = error.b; - var indexName = '[' + ($elm$core$String$fromInt(i) + ']'); - var $temp$error = err, - $temp$context = A2($elm$core$List$cons, indexName, context); - error = $temp$error; - context = $temp$context; - continue errorToStringHelp; - case 'OneOf': - var errors = error.a; - if (!errors.b) { - return 'Ran into a Json.Decode.oneOf with no possibilities' + function () { - if (!context.b) { - return '!'; - } else { - return ' at json' + A2( - $elm$core$String$join, - '', - $elm$core$List$reverse(context)); - } - }(); - } else { - if (!errors.b.b) { - var err = errors.a; - var $temp$error = err, - $temp$context = context; - error = $temp$error; - context = $temp$context; - continue errorToStringHelp; - } else { - var starter = function () { - if (!context.b) { - return 'Json.Decode.oneOf'; - } else { - return 'The Json.Decode.oneOf at json' + A2( - $elm$core$String$join, - '', - $elm$core$List$reverse(context)); - } - }(); - var introduction = starter + (' failed in the following ' + ($elm$core$String$fromInt( - $elm$core$List$length(errors)) + ' ways:')); - return A2( - $elm$core$String$join, - '\n\n', - A2( - $elm$core$List$cons, - introduction, - A2($elm$core$List$indexedMap, $elm$json$Json$Decode$errorOneOf, errors))); - } - } - default: - var msg = error.a; - var json = error.b; - var introduction = function () { - if (!context.b) { - return 'Problem with the given value:\n\n'; - } else { - return 'Problem with the value at json' + (A2( - $elm$core$String$join, - '', - $elm$core$List$reverse(context)) + ':\n\n '); - } - }(); - return introduction + ($elm$json$Json$Decode$indent( - A2($elm$json$Json$Encode$encode, 4, json)) + ('\n\n' + msg)); - } - } - }); -var $elm$core$Array$branchFactor = 32; -var $elm$core$Array$Array_elm_builtin = F4( - function (a, b, c, d) { - return {$: 'Array_elm_builtin', a: a, b: b, c: c, d: d}; - }); -var $elm$core$Elm$JsArray$empty = _JsArray_empty; -var $elm$core$Basics$ceiling = _Basics_ceiling; -var $elm$core$Basics$fdiv = _Basics_fdiv; -var $elm$core$Basics$logBase = F2( - function (base, number) { - return _Basics_log(number) / _Basics_log(base); - }); -var $elm$core$Basics$toFloat = _Basics_toFloat; -var $elm$core$Array$shiftStep = $elm$core$Basics$ceiling( - A2($elm$core$Basics$logBase, 2, $elm$core$Array$branchFactor)); -var $elm$core$Array$empty = A4($elm$core$Array$Array_elm_builtin, 0, $elm$core$Array$shiftStep, $elm$core$Elm$JsArray$empty, $elm$core$Elm$JsArray$empty); -var $elm$core$Elm$JsArray$initialize = _JsArray_initialize; -var $elm$core$Array$Leaf = function (a) { - return {$: 'Leaf', a: a}; -}; -var $elm$core$Basics$apL = F2( - function (f, x) { - return f(x); - }); -var $elm$core$Basics$apR = F2( - function (x, f) { - return f(x); - }); -var $elm$core$Basics$eq = _Utils_equal; -var $elm$core$Basics$floor = _Basics_floor; -var $elm$core$Elm$JsArray$length = _JsArray_length; -var $elm$core$Basics$gt = _Utils_gt; -var $elm$core$Basics$max = F2( - function (x, y) { - return (_Utils_cmp(x, y) > 0) ? x : y; - }); -var $elm$core$Basics$mul = _Basics_mul; -var $elm$core$Array$SubTree = function (a) { - return {$: 'SubTree', a: a}; -}; -var $elm$core$Elm$JsArray$initializeFromList = _JsArray_initializeFromList; -var $elm$core$Array$compressNodes = F2( - function (nodes, acc) { - compressNodes: - while (true) { - var _v0 = A2($elm$core$Elm$JsArray$initializeFromList, $elm$core$Array$branchFactor, nodes); - var node = _v0.a; - var remainingNodes = _v0.b; - var newAcc = A2( - $elm$core$List$cons, - $elm$core$Array$SubTree(node), - acc); - if (!remainingNodes.b) { - return $elm$core$List$reverse(newAcc); - } else { - var $temp$nodes = remainingNodes, - $temp$acc = newAcc; - nodes = $temp$nodes; - acc = $temp$acc; - continue compressNodes; - } - } - }); -var $elm$core$Tuple$first = function (_v0) { - var x = _v0.a; - return x; -}; -var $elm$core$Array$treeFromBuilder = F2( - function (nodeList, nodeListSize) { - treeFromBuilder: - while (true) { - var newNodeSize = $elm$core$Basics$ceiling(nodeListSize / $elm$core$Array$branchFactor); - if (newNodeSize === 1) { - return A2($elm$core$Elm$JsArray$initializeFromList, $elm$core$Array$branchFactor, nodeList).a; - } else { - var $temp$nodeList = A2($elm$core$Array$compressNodes, nodeList, _List_Nil), - $temp$nodeListSize = newNodeSize; - nodeList = $temp$nodeList; - nodeListSize = $temp$nodeListSize; - continue treeFromBuilder; - } - } - }); -var $elm$core$Array$builderToArray = F2( - function (reverseNodeList, builder) { - if (!builder.nodeListSize) { - return A4( - $elm$core$Array$Array_elm_builtin, - $elm$core$Elm$JsArray$length(builder.tail), - $elm$core$Array$shiftStep, - $elm$core$Elm$JsArray$empty, - builder.tail); - } else { - var treeLen = builder.nodeListSize * $elm$core$Array$branchFactor; - var depth = $elm$core$Basics$floor( - A2($elm$core$Basics$logBase, $elm$core$Array$branchFactor, treeLen - 1)); - var correctNodeList = reverseNodeList ? $elm$core$List$reverse(builder.nodeList) : builder.nodeList; - var tree = A2($elm$core$Array$treeFromBuilder, correctNodeList, builder.nodeListSize); - return A4( - $elm$core$Array$Array_elm_builtin, - $elm$core$Elm$JsArray$length(builder.tail) + treeLen, - A2($elm$core$Basics$max, 5, depth * $elm$core$Array$shiftStep), - tree, - builder.tail); - } - }); -var $elm$core$Basics$idiv = _Basics_idiv; -var $elm$core$Basics$lt = _Utils_lt; -var $elm$core$Array$initializeHelp = F5( - function (fn, fromIndex, len, nodeList, tail) { - initializeHelp: - while (true) { - if (fromIndex < 0) { - return A2( - $elm$core$Array$builderToArray, - false, - {nodeList: nodeList, nodeListSize: (len / $elm$core$Array$branchFactor) | 0, tail: tail}); - } else { - var leaf = $elm$core$Array$Leaf( - A3($elm$core$Elm$JsArray$initialize, $elm$core$Array$branchFactor, fromIndex, fn)); - var $temp$fn = fn, - $temp$fromIndex = fromIndex - $elm$core$Array$branchFactor, - $temp$len = len, - $temp$nodeList = A2($elm$core$List$cons, leaf, nodeList), - $temp$tail = tail; - fn = $temp$fn; - fromIndex = $temp$fromIndex; - len = $temp$len; - nodeList = $temp$nodeList; - tail = $temp$tail; - continue initializeHelp; - } - } - }); -var $elm$core$Basics$remainderBy = _Basics_remainderBy; -var $elm$core$Array$initialize = F2( - function (len, fn) { - if (len <= 0) { - return $elm$core$Array$empty; - } else { - var tailLen = len % $elm$core$Array$branchFactor; - var tail = A3($elm$core$Elm$JsArray$initialize, tailLen, len - tailLen, fn); - var initialFromIndex = (len - tailLen) - $elm$core$Array$branchFactor; - return A5($elm$core$Array$initializeHelp, fn, initialFromIndex, len, _List_Nil, tail); - } - }); -var $elm$core$Basics$True = {$: 'True'}; -var $elm$core$Result$isOk = function (result) { - if (result.$ === 'Ok') { - return true; - } else { - return false; - } -}; -var $elm$json$Json$Decode$andThen = _Json_andThen; -var $elm$json$Json$Decode$map = _Json_map1; -var $elm$json$Json$Decode$map2 = _Json_map2; -var $elm$json$Json$Decode$succeed = _Json_succeed; -var $elm$virtual_dom$VirtualDom$toHandlerInt = function (handler) { - switch (handler.$) { - case 'Normal': - return 0; - case 'MayStopPropagation': - return 1; - case 'MayPreventDefault': - return 2; - default: - return 3; - } -}; -var $elm$browser$Debugger$Expando$ArraySeq = {$: 'ArraySeq'}; -var $elm$browser$Debugger$Overlay$BlockMost = {$: 'BlockMost'}; -var $elm$browser$Debugger$Overlay$BlockNone = {$: 'BlockNone'}; -var $elm$browser$Debugger$Expando$Constructor = F3( - function (a, b, c) { - return {$: 'Constructor', a: a, b: b, c: c}; - }); -var $elm$browser$Debugger$Expando$Dictionary = F2( - function (a, b) { - return {$: 'Dictionary', a: a, b: b}; - }); -var $elm$browser$Debugger$Main$Down = {$: 'Down'}; -var $elm$browser$Debugger$Expando$ListSeq = {$: 'ListSeq'}; -var $elm$browser$Debugger$Main$NoOp = {$: 'NoOp'}; -var $elm$browser$Debugger$Expando$Primitive = function (a) { - return {$: 'Primitive', a: a}; -}; -var $elm$browser$Debugger$Expando$Record = F2( - function (a, b) { - return {$: 'Record', a: a, b: b}; - }); -var $elm$browser$Debugger$Expando$S = function (a) { - return {$: 'S', a: a}; -}; -var $elm$browser$Debugger$Expando$Sequence = F3( - function (a, b, c) { - return {$: 'Sequence', a: a, b: b, c: c}; - }); -var $elm$browser$Debugger$Expando$SetSeq = {$: 'SetSeq'}; -var $elm$browser$Debugger$Main$Up = {$: 'Up'}; -var $elm$browser$Debugger$Main$UserMsg = function (a) { - return {$: 'UserMsg', a: a}; -}; -var $elm$browser$Debugger$Main$Export = {$: 'Export'}; -var $elm$browser$Debugger$Main$Import = {$: 'Import'}; -var $elm$browser$Debugger$Main$Open = {$: 'Open'}; -var $elm$browser$Debugger$Main$OverlayMsg = function (a) { - return {$: 'OverlayMsg', a: a}; -}; -var $elm$browser$Debugger$Main$Resume = {$: 'Resume'}; -var $elm$browser$Debugger$Main$isPaused = function (state) { - if (state.$ === 'Running') { - return false; - } else { - return true; - } -}; -var $elm$browser$Debugger$History$size = function (history) { - return history.numMessages; -}; -var $elm$browser$Debugger$Overlay$Accept = function (a) { - return {$: 'Accept', a: a}; -}; -var $elm$browser$Debugger$Overlay$Choose = F2( - function (a, b) { - return {$: 'Choose', a: a, b: b}; - }); -var $elm$html$Html$div = _VirtualDom_node('div'); -var $elm$json$Json$Encode$string = _Json_wrap; -var $elm$html$Html$Attributes$stringProperty = F2( - function (key, string) { - return A2( - _VirtualDom_property, - key, - $elm$json$Json$Encode$string(string)); - }); -var $elm$html$Html$Attributes$id = $elm$html$Html$Attributes$stringProperty('id'); -var $elm$virtual_dom$VirtualDom$Normal = function (a) { - return {$: 'Normal', a: a}; -}; -var $elm$virtual_dom$VirtualDom$on = _VirtualDom_on; -var $elm$html$Html$Events$on = F2( - function (event, decoder) { - return A2( - $elm$virtual_dom$VirtualDom$on, - event, - $elm$virtual_dom$VirtualDom$Normal(decoder)); - }); -var $elm$html$Html$Events$onClick = function (msg) { - return A2( - $elm$html$Html$Events$on, - 'click', - $elm$json$Json$Decode$succeed(msg)); -}; -var $elm$html$Html$span = _VirtualDom_node('span'); -var $elm$virtual_dom$VirtualDom$style = _VirtualDom_style; -var $elm$html$Html$Attributes$style = $elm$virtual_dom$VirtualDom$style; -var $elm$virtual_dom$VirtualDom$text = _VirtualDom_text; -var $elm$html$Html$text = $elm$virtual_dom$VirtualDom$text; -var $elm$html$Html$a = _VirtualDom_node('a'); -var $elm$browser$Debugger$Overlay$goodNews1 = '\nThe good news is that having values like this in your message type is not\nso great in the long run. You are better off using simpler data, like\n'; -var $elm$browser$Debugger$Overlay$goodNews2 = '\nfunction can pattern match on that data and call whatever functions, JSON\ndecoders, etc. you need. This makes the code much more explicit and easy to\nfollow for other readers (or you in a few months!)\n'; -var $elm$html$Html$Attributes$href = function (url) { - return A2( - $elm$html$Html$Attributes$stringProperty, - 'href', - _VirtualDom_noJavaScriptUri(url)); -}; -var $elm$core$List$foldrHelper = F4( - function (fn, acc, ctr, ls) { - if (!ls.b) { - return acc; - } else { - var a = ls.a; - var r1 = ls.b; - if (!r1.b) { - return A2(fn, a, acc); - } else { - var b = r1.a; - var r2 = r1.b; - if (!r2.b) { - return A2( - fn, - a, - A2(fn, b, acc)); - } else { - var c = r2.a; - var r3 = r2.b; - if (!r3.b) { - return A2( - fn, - a, - A2( - fn, - b, - A2(fn, c, acc))); - } else { - var d = r3.a; - var r4 = r3.b; - var res = (ctr > 500) ? A3( - $elm$core$List$foldl, - fn, - acc, - $elm$core$List$reverse(r4)) : A4($elm$core$List$foldrHelper, fn, acc, ctr + 1, r4); - return A2( - fn, - a, - A2( - fn, - b, - A2( - fn, - c, - A2(fn, d, res)))); - } - } - } - } - }); -var $elm$core$List$foldr = F3( - function (fn, acc, ls) { - return A4($elm$core$List$foldrHelper, fn, acc, 0, ls); - }); -var $elm$core$List$map = F2( - function (f, xs) { - return A3( - $elm$core$List$foldr, - F2( - function (x, acc) { - return A2( - $elm$core$List$cons, - f(x), - acc); - }), - _List_Nil, - xs); - }); -var $elm$html$Html$p = _VirtualDom_node('p'); -var $elm$html$Html$ul = _VirtualDom_node('ul'); -var $elm$html$Html$code = _VirtualDom_node('code'); -var $elm$browser$Debugger$Overlay$viewCode = function (name) { - return A2( - $elm$html$Html$code, - _List_Nil, - _List_fromArray( - [ - $elm$html$Html$text(name) - ])); -}; -var $elm$browser$Debugger$Overlay$addCommas = function (items) { - if (!items.b) { - return ''; - } else { - if (!items.b.b) { - var item = items.a; - return item; - } else { - if (!items.b.b.b) { - var item1 = items.a; - var _v1 = items.b; - var item2 = _v1.a; - return item1 + (' and ' + item2); - } else { - var lastItem = items.a; - var otherItems = items.b; - return A2( - $elm$core$String$join, - ', ', - _Utils_ap( - otherItems, - _List_fromArray( - [' and ' + lastItem]))); - } - } - } -}; -var $elm$html$Html$li = _VirtualDom_node('li'); -var $elm$browser$Debugger$Overlay$problemToString = function (problem) { - switch (problem.$) { - case 'Function': - return 'functions'; - case 'Decoder': - return 'JSON decoders'; - case 'Task': - return 'tasks'; - case 'Process': - return 'processes'; - case 'Socket': - return 'web sockets'; - case 'Request': - return 'HTTP requests'; - case 'Program': - return 'programs'; - default: - return 'virtual DOM values'; - } -}; -var $elm$browser$Debugger$Overlay$viewProblemType = function (_v0) { - var name = _v0.name; - var problems = _v0.problems; - return A2( - $elm$html$Html$li, - _List_Nil, - _List_fromArray( - [ - $elm$browser$Debugger$Overlay$viewCode(name), - $elm$html$Html$text( - ' can contain ' + ($elm$browser$Debugger$Overlay$addCommas( - A2($elm$core$List$map, $elm$browser$Debugger$Overlay$problemToString, problems)) + '.')) - ])); -}; -var $elm$browser$Debugger$Overlay$viewBadMetadata = function (_v0) { - var message = _v0.message; - var problems = _v0.problems; - return _List_fromArray( - [ - A2( - $elm$html$Html$p, - _List_Nil, - _List_fromArray( - [ - $elm$html$Html$text('The '), - $elm$browser$Debugger$Overlay$viewCode(message), - $elm$html$Html$text(' type of your program cannot be reliably serialized for history files.') - ])), - A2( - $elm$html$Html$p, - _List_Nil, - _List_fromArray( - [ - $elm$html$Html$text('Functions cannot be serialized, nor can values that contain functions. This is a problem in these places:') - ])), - A2( - $elm$html$Html$ul, - _List_Nil, - A2($elm$core$List$map, $elm$browser$Debugger$Overlay$viewProblemType, problems)), - A2( - $elm$html$Html$p, - _List_Nil, - _List_fromArray( - [ - $elm$html$Html$text($elm$browser$Debugger$Overlay$goodNews1), - A2( - $elm$html$Html$a, - _List_fromArray( - [ - $elm$html$Html$Attributes$href('https://guide.elm-lang.org/types/custom_types.html') - ]), - _List_fromArray( - [ - $elm$html$Html$text('custom types') - ])), - $elm$html$Html$text(', in your messages. From there, your '), - $elm$browser$Debugger$Overlay$viewCode('update'), - $elm$html$Html$text($elm$browser$Debugger$Overlay$goodNews2) - ])) - ]); -}; -var $elm$virtual_dom$VirtualDom$map = _VirtualDom_map; -var $elm$html$Html$map = $elm$virtual_dom$VirtualDom$map; -var $elm$browser$Debugger$Overlay$Cancel = {$: 'Cancel'}; -var $elm$browser$Debugger$Overlay$Proceed = {$: 'Proceed'}; -var $elm$html$Html$button = _VirtualDom_node('button'); -var $elm$browser$Debugger$Overlay$viewButtons = function (buttons) { - var btn = F2( - function (msg, string) { - return A2( - $elm$html$Html$button, - _List_fromArray( - [ - A2($elm$html$Html$Attributes$style, 'margin-right', '20px'), - $elm$html$Html$Events$onClick(msg) - ]), - _List_fromArray( - [ - $elm$html$Html$text(string) - ])); - }); - var buttonNodes = function () { - if (buttons.$ === 'Accept') { - var proceed = buttons.a; - return _List_fromArray( - [ - A2(btn, $elm$browser$Debugger$Overlay$Proceed, proceed) - ]); - } else { - var cancel = buttons.a; - var proceed = buttons.b; - return _List_fromArray( - [ - A2(btn, $elm$browser$Debugger$Overlay$Cancel, cancel), - A2(btn, $elm$browser$Debugger$Overlay$Proceed, proceed) - ]); - } - }(); - return A2( - $elm$html$Html$div, - _List_fromArray( - [ - A2($elm$html$Html$Attributes$style, 'height', '60px'), - A2($elm$html$Html$Attributes$style, 'line-height', '60px'), - A2($elm$html$Html$Attributes$style, 'text-align', 'right'), - A2($elm$html$Html$Attributes$style, 'background-color', 'rgb(50, 50, 50)') - ]), - buttonNodes); -}; -var $elm$browser$Debugger$Overlay$viewMessage = F4( - function (config, title, details, buttons) { - return A2( - $elm$html$Html$div, - _List_fromArray( - [ - $elm$html$Html$Attributes$id('elm-debugger-overlay'), - A2($elm$html$Html$Attributes$style, 'position', 'fixed'), - A2($elm$html$Html$Attributes$style, 'top', '0'), - A2($elm$html$Html$Attributes$style, 'left', '0'), - A2($elm$html$Html$Attributes$style, 'width', '100vw'), - A2($elm$html$Html$Attributes$style, 'height', '100vh'), - A2($elm$html$Html$Attributes$style, 'color', 'white'), - A2($elm$html$Html$Attributes$style, 'pointer-events', 'none'), - A2($elm$html$Html$Attributes$style, 'font-family', '\'Trebuchet MS\', \'Lucida Grande\', \'Bitstream Vera Sans\', \'Helvetica Neue\', sans-serif'), - A2($elm$html$Html$Attributes$style, 'z-index', '2147483647') - ]), - _List_fromArray( - [ - A2( - $elm$html$Html$div, - _List_fromArray( - [ - A2($elm$html$Html$Attributes$style, 'position', 'absolute'), - A2($elm$html$Html$Attributes$style, 'width', '600px'), - A2($elm$html$Html$Attributes$style, 'height', '100vh'), - A2($elm$html$Html$Attributes$style, 'padding-left', 'calc(50% - 300px)'), - A2($elm$html$Html$Attributes$style, 'padding-right', 'calc(50% - 300px)'), - A2($elm$html$Html$Attributes$style, 'background-color', 'rgba(200, 200, 200, 0.7)'), - A2($elm$html$Html$Attributes$style, 'pointer-events', 'auto') - ]), - _List_fromArray( - [ - A2( - $elm$html$Html$div, - _List_fromArray( - [ - A2($elm$html$Html$Attributes$style, 'font-size', '36px'), - A2($elm$html$Html$Attributes$style, 'height', '80px'), - A2($elm$html$Html$Attributes$style, 'background-color', 'rgb(50, 50, 50)'), - A2($elm$html$Html$Attributes$style, 'padding-left', '22px'), - A2($elm$html$Html$Attributes$style, 'vertical-align', 'middle'), - A2($elm$html$Html$Attributes$style, 'line-height', '80px') - ]), - _List_fromArray( - [ - $elm$html$Html$text(title) - ])), - A2( - $elm$html$Html$div, - _List_fromArray( - [ - $elm$html$Html$Attributes$id('elm-debugger-details'), - A2($elm$html$Html$Attributes$style, 'padding', ' 8px 20px'), - A2($elm$html$Html$Attributes$style, 'overflow-y', 'auto'), - A2($elm$html$Html$Attributes$style, 'max-height', 'calc(100vh - 156px)'), - A2($elm$html$Html$Attributes$style, 'background-color', 'rgb(61, 61, 61)') - ]), - details), - A2( - $elm$html$Html$map, - config.wrap, - $elm$browser$Debugger$Overlay$viewButtons(buttons)) - ])) - ])); - }); -var $elm$virtual_dom$VirtualDom$attribute = F2( - function (key, value) { - return A2( - _VirtualDom_attribute, - _VirtualDom_noOnOrFormAction(key), - _VirtualDom_noJavaScriptOrHtmlUri(value)); - }); -var $elm$core$Basics$negate = function (n) { - return -n; -}; -var $elm$virtual_dom$VirtualDom$nodeNS = F2( - function (namespace, tag) { - return A2( - _VirtualDom_nodeNS, - namespace, - _VirtualDom_noScript(tag)); - }); -var $elm$core$String$fromFloat = _String_fromNumber; -var $elm$browser$Debugger$Overlay$viewShape = F4( - function (x, y, angle, coordinates) { - return A4( - $elm$virtual_dom$VirtualDom$nodeNS, - 'http://www.w3.org/2000/svg', - 'polygon', - _List_fromArray( - [ - A2($elm$virtual_dom$VirtualDom$attribute, 'points', coordinates), - A2( - $elm$virtual_dom$VirtualDom$attribute, - 'transform', - 'translate(' + ($elm$core$String$fromFloat(x) + (' ' + ($elm$core$String$fromFloat(y) + (') rotate(' + ($elm$core$String$fromFloat(-angle) + ')')))))) - ]), - _List_Nil); - }); -var $elm$browser$Debugger$Overlay$elmLogo = A4( - $elm$virtual_dom$VirtualDom$nodeNS, - 'http://www.w3.org/2000/svg', - 'svg', - _List_fromArray( - [ - A2($elm$virtual_dom$VirtualDom$attribute, 'viewBox', '-300 -300 600 600'), - A2($elm$virtual_dom$VirtualDom$attribute, 'xmlns', 'http://www.w3.org/2000/svg'), - A2($elm$virtual_dom$VirtualDom$attribute, 'fill', 'currentColor'), - A2($elm$virtual_dom$VirtualDom$attribute, 'width', '24px'), - A2($elm$virtual_dom$VirtualDom$attribute, 'height', '24px') - ]), - _List_fromArray( - [ - A4( - $elm$virtual_dom$VirtualDom$nodeNS, - 'http://www.w3.org/2000/svg', - 'g', - _List_fromArray( - [ - A2($elm$virtual_dom$VirtualDom$attribute, 'transform', 'scale(1 -1)') - ]), - _List_fromArray( - [ - A4($elm$browser$Debugger$Overlay$viewShape, 0, -210, 0, '-280,-90 0,190 280,-90'), - A4($elm$browser$Debugger$Overlay$viewShape, -210, 0, 90, '-280,-90 0,190 280,-90'), - A4($elm$browser$Debugger$Overlay$viewShape, 207, 207, 45, '-198,-66 0,132 198,-66'), - A4($elm$browser$Debugger$Overlay$viewShape, 150, 0, 0, '-130,0 0,-130 130,0 0,130'), - A4($elm$browser$Debugger$Overlay$viewShape, -89, 239, 0, '-191,61 69,61 191,-61 -69,-61'), - A4($elm$browser$Debugger$Overlay$viewShape, 0, 106, 180, '-130,-44 0,86 130,-44'), - A4($elm$browser$Debugger$Overlay$viewShape, 256, -150, 270, '-130,-44 0,86 130,-44') - ])) - ])); -var $elm$core$String$length = _String_length; -var $elm$browser$Debugger$Overlay$viewMiniControls = F2( - function (config, numMsgs) { - var string = $elm$core$String$fromInt(numMsgs); - var width = $elm$core$String$fromInt( - 2 + $elm$core$String$length(string)); - return A2( - $elm$html$Html$div, - _List_fromArray( - [ - A2($elm$html$Html$Attributes$style, 'position', 'fixed'), - A2($elm$html$Html$Attributes$style, 'bottom', '2em'), - A2($elm$html$Html$Attributes$style, 'right', '2em'), - A2($elm$html$Html$Attributes$style, 'width', 'calc(42px + ' + (width + 'ch)')), - A2($elm$html$Html$Attributes$style, 'height', '36px'), - A2($elm$html$Html$Attributes$style, 'background-color', '#1293D8'), - A2($elm$html$Html$Attributes$style, 'color', 'white'), - A2($elm$html$Html$Attributes$style, 'font-family', 'monospace'), - A2($elm$html$Html$Attributes$style, 'pointer-events', 'auto'), - A2($elm$html$Html$Attributes$style, 'z-index', '2147483647'), - A2($elm$html$Html$Attributes$style, 'display', 'flex'), - A2($elm$html$Html$Attributes$style, 'justify-content', 'center'), - A2($elm$html$Html$Attributes$style, 'align-items', 'center'), - A2($elm$html$Html$Attributes$style, 'cursor', 'pointer'), - $elm$html$Html$Events$onClick(config.open) - ]), - _List_fromArray( - [ - $elm$browser$Debugger$Overlay$elmLogo, - A2( - $elm$html$Html$span, - _List_fromArray( - [ - A2($elm$html$Html$Attributes$style, 'padding-left', 'calc(1ch + 6px)'), - A2($elm$html$Html$Attributes$style, 'padding-right', '1ch') - ]), - _List_fromArray( - [ - $elm$html$Html$text(string) - ])) - ])); - }); -var $elm$browser$Debugger$Overlay$explanationBad = '\nThe messages in this history do not match the messages handled by your\nprogram. I noticed changes in the following types:\n'; -var $elm$browser$Debugger$Overlay$explanationRisky = '\nThis history seems old. It will work with this program, but some\nmessages have been added since the history was created:\n'; -var $elm$core$List$intersperse = F2( - function (sep, xs) { - if (!xs.b) { - return _List_Nil; - } else { - var hd = xs.a; - var tl = xs.b; - var step = F2( - function (x, rest) { - return A2( - $elm$core$List$cons, - sep, - A2($elm$core$List$cons, x, rest)); - }); - var spersed = A3($elm$core$List$foldr, step, _List_Nil, tl); - return A2($elm$core$List$cons, hd, spersed); - } - }); -var $elm$browser$Debugger$Overlay$viewMention = F2( - function (tags, verbed) { - var _v0 = A2( - $elm$core$List$map, - $elm$browser$Debugger$Overlay$viewCode, - $elm$core$List$reverse(tags)); - if (!_v0.b) { - return $elm$html$Html$text(''); - } else { - if (!_v0.b.b) { - var tag = _v0.a; - return A2( - $elm$html$Html$li, - _List_Nil, - _List_fromArray( - [ - $elm$html$Html$text(verbed), - tag, - $elm$html$Html$text('.') - ])); - } else { - if (!_v0.b.b.b) { - var tag2 = _v0.a; - var _v1 = _v0.b; - var tag1 = _v1.a; - return A2( - $elm$html$Html$li, - _List_Nil, - _List_fromArray( - [ - $elm$html$Html$text(verbed), - tag1, - $elm$html$Html$text(' and '), - tag2, - $elm$html$Html$text('.') - ])); - } else { - var lastTag = _v0.a; - var otherTags = _v0.b; - return A2( - $elm$html$Html$li, - _List_Nil, - A2( - $elm$core$List$cons, - $elm$html$Html$text(verbed), - _Utils_ap( - A2( - $elm$core$List$intersperse, - $elm$html$Html$text(', '), - $elm$core$List$reverse(otherTags)), - _List_fromArray( - [ - $elm$html$Html$text(', and '), - lastTag, - $elm$html$Html$text('.') - ])))); - } - } - } - }); -var $elm$browser$Debugger$Overlay$viewChange = function (change) { - return A2( - $elm$html$Html$li, - _List_fromArray( - [ - A2($elm$html$Html$Attributes$style, 'margin', '8px 0') - ]), - function () { - if (change.$ === 'AliasChange') { - var name = change.a; - return _List_fromArray( - [ - A2( - $elm$html$Html$span, - _List_fromArray( - [ - A2($elm$html$Html$Attributes$style, 'font-size', '1.5em') - ]), - _List_fromArray( - [ - $elm$browser$Debugger$Overlay$viewCode(name) - ])) - ]); - } else { - var name = change.a; - var removed = change.b.removed; - var changed = change.b.changed; - var added = change.b.added; - var argsMatch = change.b.argsMatch; - return _List_fromArray( - [ - A2( - $elm$html$Html$span, - _List_fromArray( - [ - A2($elm$html$Html$Attributes$style, 'font-size', '1.5em') - ]), - _List_fromArray( - [ - $elm$browser$Debugger$Overlay$viewCode(name) - ])), - A2( - $elm$html$Html$ul, - _List_fromArray( - [ - A2($elm$html$Html$Attributes$style, 'list-style-type', 'disc'), - A2($elm$html$Html$Attributes$style, 'padding-left', '2em') - ]), - _List_fromArray( - [ - A2($elm$browser$Debugger$Overlay$viewMention, removed, 'Removed '), - A2($elm$browser$Debugger$Overlay$viewMention, changed, 'Changed '), - A2($elm$browser$Debugger$Overlay$viewMention, added, 'Added ') - ])), - argsMatch ? $elm$html$Html$text('') : $elm$html$Html$text('This may be due to the fact that the type variable names changed.') - ]); - } - }()); -}; -var $elm$browser$Debugger$Overlay$viewReport = F2( - function (isBad, report) { - switch (report.$) { - case 'CorruptHistory': - return _List_fromArray( - [ - $elm$html$Html$text('Looks like this history file is corrupt. I cannot understand it.') - ]); - case 'VersionChanged': - var old = report.a; - var _new = report.b; - return _List_fromArray( - [ - $elm$html$Html$text('This history was created with Elm ' + (old + (', but you are using Elm ' + (_new + ' right now.')))) - ]); - case 'MessageChanged': - var old = report.a; - var _new = report.b; - return _List_fromArray( - [ - $elm$html$Html$text('To import some other history, the overall message type must' + ' be the same. The old history has '), - $elm$browser$Debugger$Overlay$viewCode(old), - $elm$html$Html$text(' messages, but the new program works with '), - $elm$browser$Debugger$Overlay$viewCode(_new), - $elm$html$Html$text(' messages.') - ]); - default: - var changes = report.a; - return _List_fromArray( - [ - A2( - $elm$html$Html$p, - _List_Nil, - _List_fromArray( - [ - $elm$html$Html$text( - isBad ? $elm$browser$Debugger$Overlay$explanationBad : $elm$browser$Debugger$Overlay$explanationRisky) - ])), - A2( - $elm$html$Html$ul, - _List_fromArray( - [ - A2($elm$html$Html$Attributes$style, 'list-style-type', 'none'), - A2($elm$html$Html$Attributes$style, 'padding-left', '20px') - ]), - A2($elm$core$List$map, $elm$browser$Debugger$Overlay$viewChange, changes)) - ]); - } - }); -var $elm$browser$Debugger$Overlay$view = F5( - function (config, isPaused, isOpen, numMsgs, state) { - switch (state.$) { - case 'None': - return isOpen ? $elm$html$Html$text('') : (isPaused ? A2( - $elm$html$Html$div, - _List_fromArray( - [ - $elm$html$Html$Attributes$id('elm-debugger-overlay'), - A2($elm$html$Html$Attributes$style, 'position', 'fixed'), - A2($elm$html$Html$Attributes$style, 'top', '0'), - A2($elm$html$Html$Attributes$style, 'left', '0'), - A2($elm$html$Html$Attributes$style, 'width', '100vw'), - A2($elm$html$Html$Attributes$style, 'height', '100vh'), - A2($elm$html$Html$Attributes$style, 'cursor', 'pointer'), - A2($elm$html$Html$Attributes$style, 'display', 'flex'), - A2($elm$html$Html$Attributes$style, 'align-items', 'center'), - A2($elm$html$Html$Attributes$style, 'justify-content', 'center'), - A2($elm$html$Html$Attributes$style, 'pointer-events', 'auto'), - A2($elm$html$Html$Attributes$style, 'background-color', 'rgba(200, 200, 200, 0.7)'), - A2($elm$html$Html$Attributes$style, 'color', 'white'), - A2($elm$html$Html$Attributes$style, 'font-family', '\'Trebuchet MS\', \'Lucida Grande\', \'Bitstream Vera Sans\', \'Helvetica Neue\', sans-serif'), - A2($elm$html$Html$Attributes$style, 'z-index', '2147483646'), - $elm$html$Html$Events$onClick(config.resume) - ]), - _List_fromArray( - [ - A2( - $elm$html$Html$span, - _List_fromArray( - [ - A2($elm$html$Html$Attributes$style, 'font-size', '80px') - ]), - _List_fromArray( - [ - $elm$html$Html$text('Click to Resume') - ])), - A2($elm$browser$Debugger$Overlay$viewMiniControls, config, numMsgs) - ])) : A2($elm$browser$Debugger$Overlay$viewMiniControls, config, numMsgs)); - case 'BadMetadata': - var badMetadata_ = state.a; - return A4( - $elm$browser$Debugger$Overlay$viewMessage, - config, - 'Cannot use Import or Export', - $elm$browser$Debugger$Overlay$viewBadMetadata(badMetadata_), - $elm$browser$Debugger$Overlay$Accept('Ok')); - case 'BadImport': - var report = state.a; - return A4( - $elm$browser$Debugger$Overlay$viewMessage, - config, - 'Cannot Import History', - A2($elm$browser$Debugger$Overlay$viewReport, true, report), - $elm$browser$Debugger$Overlay$Accept('Ok')); - default: - var report = state.a; - return A4( - $elm$browser$Debugger$Overlay$viewMessage, - config, - 'Warning', - A2($elm$browser$Debugger$Overlay$viewReport, false, report), - A2($elm$browser$Debugger$Overlay$Choose, 'Cancel', 'Import Anyway')); - } - }); -var $elm$browser$Debugger$Main$cornerView = function (model) { - return A5( - $elm$browser$Debugger$Overlay$view, - {exportHistory: $elm$browser$Debugger$Main$Export, importHistory: $elm$browser$Debugger$Main$Import, open: $elm$browser$Debugger$Main$Open, resume: $elm$browser$Debugger$Main$Resume, wrap: $elm$browser$Debugger$Main$OverlayMsg}, - $elm$browser$Debugger$Main$isPaused(model.state), - _Debugger_isOpen(model.popout), - $elm$browser$Debugger$History$size(model.history), - model.overlay); -}; -var $elm$core$Dict$RBEmpty_elm_builtin = {$: 'RBEmpty_elm_builtin'}; -var $elm$core$Dict$empty = $elm$core$Dict$RBEmpty_elm_builtin; -var $elm$core$Set$foldr = F3( - function (func, initialState, _v0) { - var dict = _v0.a; - return A3( - $elm$core$Dict$foldr, - F3( - function (key, _v1, state) { - return A2(func, key, state); - }), - initialState, - dict); - }); -var $elm$browser$Debugger$Main$getCurrentModel = function (state) { - if (state.$ === 'Running') { - var model = state.a; - return model; - } else { - var model = state.b; - return model; - } -}; -var $elm$browser$Debugger$Main$getUserModel = function (model) { - return $elm$browser$Debugger$Main$getCurrentModel(model.state); -}; -var $elm$browser$Debugger$Main$initialWindowHeight = 420; -var $elm$browser$Debugger$Main$initialWindowWidth = 900; -var $elm$core$Dict$Black = {$: 'Black'}; -var $elm$core$Dict$RBNode_elm_builtin = F5( - function (a, b, c, d, e) { - return {$: 'RBNode_elm_builtin', a: a, b: b, c: c, d: d, e: e}; - }); -var $elm$core$Dict$Red = {$: 'Red'}; -var $elm$core$Dict$balance = F5( - function (color, key, value, left, right) { - if ((right.$ === 'RBNode_elm_builtin') && (right.a.$ === 'Red')) { - var _v1 = right.a; - var rK = right.b; - var rV = right.c; - var rLeft = right.d; - var rRight = right.e; - if ((left.$ === 'RBNode_elm_builtin') && (left.a.$ === 'Red')) { - var _v3 = left.a; - var lK = left.b; - var lV = left.c; - var lLeft = left.d; - var lRight = left.e; - return A5( - $elm$core$Dict$RBNode_elm_builtin, - $elm$core$Dict$Red, - key, - value, - A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Black, lK, lV, lLeft, lRight), - A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Black, rK, rV, rLeft, rRight)); - } else { - return A5( - $elm$core$Dict$RBNode_elm_builtin, - color, - rK, - rV, - A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, key, value, left, rLeft), - rRight); - } - } else { - if ((((left.$ === 'RBNode_elm_builtin') && (left.a.$ === 'Red')) && (left.d.$ === 'RBNode_elm_builtin')) && (left.d.a.$ === 'Red')) { - var _v5 = left.a; - var lK = left.b; - var lV = left.c; - var _v6 = left.d; - var _v7 = _v6.a; - var llK = _v6.b; - var llV = _v6.c; - var llLeft = _v6.d; - var llRight = _v6.e; - var lRight = left.e; - return A5( - $elm$core$Dict$RBNode_elm_builtin, - $elm$core$Dict$Red, - lK, - lV, - A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Black, llK, llV, llLeft, llRight), - A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Black, key, value, lRight, right)); - } else { - return A5($elm$core$Dict$RBNode_elm_builtin, color, key, value, left, right); - } - } - }); -var $elm$core$Basics$compare = _Utils_compare; -var $elm$core$Dict$insertHelp = F3( - function (key, value, dict) { - if (dict.$ === 'RBEmpty_elm_builtin') { - return A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, key, value, $elm$core$Dict$RBEmpty_elm_builtin, $elm$core$Dict$RBEmpty_elm_builtin); - } else { - var nColor = dict.a; - var nKey = dict.b; - var nValue = dict.c; - var nLeft = dict.d; - var nRight = dict.e; - var _v1 = A2($elm$core$Basics$compare, key, nKey); - switch (_v1.$) { - case 'LT': - return A5( - $elm$core$Dict$balance, - nColor, - nKey, - nValue, - A3($elm$core$Dict$insertHelp, key, value, nLeft), - nRight); - case 'EQ': - return A5($elm$core$Dict$RBNode_elm_builtin, nColor, nKey, value, nLeft, nRight); - default: - return A5( - $elm$core$Dict$balance, - nColor, - nKey, - nValue, - nLeft, - A3($elm$core$Dict$insertHelp, key, value, nRight)); - } - } - }); -var $elm$core$Dict$insert = F3( - function (key, value, dict) { - var _v0 = A3($elm$core$Dict$insertHelp, key, value, dict); - if ((_v0.$ === 'RBNode_elm_builtin') && (_v0.a.$ === 'Red')) { - var _v1 = _v0.a; - var k = _v0.b; - var v = _v0.c; - var l = _v0.d; - var r = _v0.e; - return A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Black, k, v, l, r); - } else { - var x = _v0; - return x; - } - }); -var $elm$browser$Debugger$Main$cachedHistory = function (model) { - var _v0 = model.state; - if (_v0.$ === 'Running') { - return model.history; - } else { - var history = _v0.e; - return history; - } -}; -var $elm$virtual_dom$VirtualDom$node = function (tag) { - return _VirtualDom_node( - _VirtualDom_noScript(tag)); -}; -var $elm$html$Html$node = $elm$virtual_dom$VirtualDom$node; -var $elm$browser$Debugger$Main$DragEnd = {$: 'DragEnd'}; -var $elm$browser$Debugger$Main$getDragStatus = function (layout) { - if (layout.$ === 'Horizontal') { - var status = layout.a; - return status; - } else { - var status = layout.a; - return status; - } -}; -var $elm$browser$Debugger$Main$Drag = function (a) { - return {$: 'Drag', a: a}; -}; -var $elm$browser$Debugger$Main$DragInfo = F5( - function (x, y, down, width, height) { - return {down: down, height: height, width: width, x: x, y: y}; - }); -var $elm$json$Json$Decode$field = _Json_decodeField; -var $elm$json$Json$Decode$at = F2( - function (fields, decoder) { - return A3($elm$core$List$foldr, $elm$json$Json$Decode$field, decoder, fields); - }); -var $elm$json$Json$Decode$float = _Json_decodeFloat; -var $elm$browser$Debugger$Main$decodeDimension = function (field) { - return A2( - $elm$json$Json$Decode$at, - _List_fromArray( - ['currentTarget', 'ownerDocument', 'defaultView', field]), - $elm$json$Json$Decode$float); -}; -var $elm$json$Json$Decode$int = _Json_decodeInt; -var $elm$json$Json$Decode$map5 = _Json_map5; -var $elm$browser$Debugger$Main$onMouseMove = A2( - $elm$html$Html$Events$on, - 'mousemove', - A2( - $elm$json$Json$Decode$map, - $elm$browser$Debugger$Main$Drag, - A6( - $elm$json$Json$Decode$map5, - $elm$browser$Debugger$Main$DragInfo, - A2($elm$json$Json$Decode$field, 'pageX', $elm$json$Json$Decode$float), - A2($elm$json$Json$Decode$field, 'pageY', $elm$json$Json$Decode$float), - A2( - $elm$json$Json$Decode$field, - 'buttons', - A2( - $elm$json$Json$Decode$map, - function (v) { - return v === 1; - }, - $elm$json$Json$Decode$int)), - $elm$browser$Debugger$Main$decodeDimension('innerWidth'), - $elm$browser$Debugger$Main$decodeDimension('innerHeight')))); -var $elm$html$Html$Events$onMouseUp = function (msg) { - return A2( - $elm$html$Html$Events$on, - 'mouseup', - $elm$json$Json$Decode$succeed(msg)); -}; -var $elm$browser$Debugger$Main$toDragListeners = function (layout) { - var _v0 = $elm$browser$Debugger$Main$getDragStatus(layout); - if (_v0.$ === 'Static') { - return _List_Nil; - } else { - return _List_fromArray( - [ - $elm$browser$Debugger$Main$onMouseMove, - $elm$html$Html$Events$onMouseUp($elm$browser$Debugger$Main$DragEnd) - ]); - } -}; -var $elm$browser$Debugger$Main$toFlexDirection = function (layout) { - if (layout.$ === 'Horizontal') { - return 'row'; - } else { - return 'column-reverse'; - } -}; -var $elm$browser$Debugger$Main$DragStart = {$: 'DragStart'}; -var $elm$html$Html$Events$onMouseDown = function (msg) { - return A2( - $elm$html$Html$Events$on, - 'mousedown', - $elm$json$Json$Decode$succeed(msg)); -}; -var $elm$browser$Debugger$Main$toPercent = function (fraction) { - return $elm$core$String$fromFloat(100 * fraction) + '%'; -}; -var $elm$browser$Debugger$Main$viewDragZone = function (layout) { - if (layout.$ === 'Horizontal') { - var x = layout.b; - return A2( - $elm$html$Html$div, - _List_fromArray( - [ - A2($elm$html$Html$Attributes$style, 'position', 'absolute'), - A2($elm$html$Html$Attributes$style, 'top', '0'), - A2( - $elm$html$Html$Attributes$style, - 'left', - $elm$browser$Debugger$Main$toPercent(x)), - A2($elm$html$Html$Attributes$style, 'margin-left', '-5px'), - A2($elm$html$Html$Attributes$style, 'width', '10px'), - A2($elm$html$Html$Attributes$style, 'height', '100%'), - A2($elm$html$Html$Attributes$style, 'cursor', 'col-resize'), - $elm$html$Html$Events$onMouseDown($elm$browser$Debugger$Main$DragStart) - ]), - _List_Nil); - } else { - var y = layout.c; - return A2( - $elm$html$Html$div, - _List_fromArray( - [ - A2($elm$html$Html$Attributes$style, 'position', 'absolute'), - A2( - $elm$html$Html$Attributes$style, - 'top', - $elm$browser$Debugger$Main$toPercent(y)), - A2($elm$html$Html$Attributes$style, 'left', '0'), - A2($elm$html$Html$Attributes$style, 'margin-top', '-5px'), - A2($elm$html$Html$Attributes$style, 'width', '100%'), - A2($elm$html$Html$Attributes$style, 'height', '10px'), - A2($elm$html$Html$Attributes$style, 'cursor', 'row-resize'), - $elm$html$Html$Events$onMouseDown($elm$browser$Debugger$Main$DragStart) - ]), - _List_Nil); - } -}; -var $elm$browser$Debugger$Main$TweakExpandoModel = function (a) { - return {$: 'TweakExpandoModel', a: a}; -}; -var $elm$browser$Debugger$Main$TweakExpandoMsg = function (a) { - return {$: 'TweakExpandoMsg', a: a}; -}; -var $elm$browser$Debugger$Main$toExpandoPercents = function (layout) { - if (layout.$ === 'Horizontal') { - var x = layout.b; - return _Utils_Tuple2( - $elm$browser$Debugger$Main$toPercent(1 - x), - '100%'); - } else { - var y = layout.c; - return _Utils_Tuple2( - '100%', - $elm$browser$Debugger$Main$toPercent(y)); - } -}; -var $elm$browser$Debugger$Main$toMouseBlocker = function (layout) { - var _v0 = $elm$browser$Debugger$Main$getDragStatus(layout); - if (_v0.$ === 'Static') { - return 'auto'; - } else { - return 'none'; - } -}; -var $elm$browser$Debugger$Expando$Field = F2( - function (a, b) { - return {$: 'Field', a: a, b: b}; - }); -var $elm$browser$Debugger$Expando$Index = F3( - function (a, b, c) { - return {$: 'Index', a: a, b: b, c: c}; - }); -var $elm$browser$Debugger$Expando$Key = {$: 'Key'}; -var $elm$browser$Debugger$Expando$None = {$: 'None'}; -var $elm$browser$Debugger$Expando$Toggle = {$: 'Toggle'}; -var $elm$browser$Debugger$Expando$Value = {$: 'Value'}; -var $elm$browser$Debugger$Expando$blue = A2($elm$html$Html$Attributes$style, 'color', 'rgb(28, 0, 207)'); -var $elm$core$Basics$composeL = F3( - function (g, f, x) { - return g( - f(x)); - }); -var $elm$browser$Debugger$Expando$leftPad = function (maybeKey) { - if (maybeKey.$ === 'Nothing') { - return _List_Nil; - } else { - return _List_fromArray( - [ - A2($elm$html$Html$Attributes$style, 'padding-left', '4ch') - ]); - } -}; -var $elm$browser$Debugger$Expando$makeArrow = function (arrow) { - return A2( - $elm$html$Html$span, - _List_fromArray( - [ - A2($elm$html$Html$Attributes$style, 'color', '#777'), - A2($elm$html$Html$Attributes$style, 'padding-left', '2ch'), - A2($elm$html$Html$Attributes$style, 'width', '2ch'), - A2($elm$html$Html$Attributes$style, 'display', 'inline-block') - ]), - _List_fromArray( - [ - $elm$html$Html$text(arrow) - ])); -}; -var $elm$browser$Debugger$Expando$purple = A2($elm$html$Html$Attributes$style, 'color', 'rgb(136, 19, 145)'); -var $elm$browser$Debugger$Expando$lineStarter = F3( - function (maybeKey, maybeIsClosed, description) { - var arrow = function () { - if (maybeIsClosed.$ === 'Nothing') { - return $elm$browser$Debugger$Expando$makeArrow(''); - } else { - if (maybeIsClosed.a) { - return $elm$browser$Debugger$Expando$makeArrow('▸'); - } else { - return $elm$browser$Debugger$Expando$makeArrow('▾'); - } - } - }(); - if (maybeKey.$ === 'Nothing') { - return A2($elm$core$List$cons, arrow, description); - } else { - var key = maybeKey.a; - return A2( - $elm$core$List$cons, - arrow, - A2( - $elm$core$List$cons, - A2( - $elm$html$Html$span, - _List_fromArray( - [$elm$browser$Debugger$Expando$purple]), - _List_fromArray( - [ - $elm$html$Html$text(key) - ])), - A2( - $elm$core$List$cons, - $elm$html$Html$text(' = '), - description))); - } - }); -var $elm$browser$Debugger$Expando$red = A2($elm$html$Html$Attributes$style, 'color', 'rgb(196, 26, 22)'); -var $elm$core$Tuple$second = function (_v0) { - var y = _v0.b; - return y; -}; -var $elm$browser$Debugger$Expando$seqTypeToString = F2( - function (n, seqType) { - switch (seqType.$) { - case 'ListSeq': - return 'List(' + ($elm$core$String$fromInt(n) + ')'); - case 'SetSeq': - return 'Set(' + ($elm$core$String$fromInt(n) + ')'); - default: - return 'Array(' + ($elm$core$String$fromInt(n) + ')'); - } - }); -var $elm$core$String$slice = _String_slice; -var $elm$core$String$left = F2( - function (n, string) { - return (n < 1) ? '' : A3($elm$core$String$slice, 0, n, string); - }); -var $elm$core$String$right = F2( - function (n, string) { - return (n < 1) ? '' : A3( - $elm$core$String$slice, - -n, - $elm$core$String$length(string), - string); - }); -var $elm$browser$Debugger$Expando$elideMiddle = function (str) { - return ($elm$core$String$length(str) <= 18) ? str : (A2($elm$core$String$left, 8, str) + ('...' + A2($elm$core$String$right, 8, str))); -}; -var $elm$core$Dict$isEmpty = function (dict) { - if (dict.$ === 'RBEmpty_elm_builtin') { - return true; - } else { - return false; - } -}; -var $elm$browser$Debugger$Expando$viewExtraTinyRecord = F3( - function (length, starter, entries) { - if (!entries.b) { - return _Utils_Tuple2( - length + 1, - _List_fromArray( - [ - $elm$html$Html$text('}') - ])); - } else { - var field = entries.a; - var rest = entries.b; - var nextLength = (length + $elm$core$String$length(field)) + 1; - if (nextLength > 18) { - return _Utils_Tuple2( - length + 2, - _List_fromArray( - [ - $elm$html$Html$text('…}') - ])); - } else { - var _v1 = A3($elm$browser$Debugger$Expando$viewExtraTinyRecord, nextLength, ',', rest); - var finalLength = _v1.a; - var otherHtmls = _v1.b; - return _Utils_Tuple2( - finalLength, - A2( - $elm$core$List$cons, - $elm$html$Html$text(starter), - A2( - $elm$core$List$cons, - A2( - $elm$html$Html$span, - _List_fromArray( - [$elm$browser$Debugger$Expando$purple]), - _List_fromArray( - [ - $elm$html$Html$text(field) - ])), - otherHtmls))); - } - } - }); -var $elm$browser$Debugger$Expando$viewTinyHelp = function (str) { - return _Utils_Tuple2( - $elm$core$String$length(str), - _List_fromArray( - [ - $elm$html$Html$text(str) - ])); -}; -var $elm$core$Maybe$withDefault = F2( - function (_default, maybe) { - if (maybe.$ === 'Just') { - var value = maybe.a; - return value; - } else { - return _default; - } - }); -var $elm$browser$Debugger$Expando$viewExtraTiny = function (value) { - if (value.$ === 'Record') { - var record = value.b; - return A3( - $elm$browser$Debugger$Expando$viewExtraTinyRecord, - 0, - '{', - $elm$core$Dict$keys(record)); - } else { - return $elm$browser$Debugger$Expando$viewTiny(value); - } -}; -var $elm$browser$Debugger$Expando$viewTiny = function (value) { - switch (value.$) { - case 'S': - var stringRep = value.a; - var str = $elm$browser$Debugger$Expando$elideMiddle(stringRep); - return _Utils_Tuple2( - $elm$core$String$length(str), - _List_fromArray( - [ - A2( - $elm$html$Html$span, - _List_fromArray( - [$elm$browser$Debugger$Expando$red]), - _List_fromArray( - [ - $elm$html$Html$text(str) - ])) - ])); - case 'Primitive': - var stringRep = value.a; - return _Utils_Tuple2( - $elm$core$String$length(stringRep), - _List_fromArray( - [ - A2( - $elm$html$Html$span, - _List_fromArray( - [$elm$browser$Debugger$Expando$blue]), - _List_fromArray( - [ - $elm$html$Html$text(stringRep) - ])) - ])); - case 'Sequence': - var seqType = value.a; - var valueList = value.c; - return $elm$browser$Debugger$Expando$viewTinyHelp( - A2( - $elm$browser$Debugger$Expando$seqTypeToString, - $elm$core$List$length(valueList), - seqType)); - case 'Dictionary': - var keyValuePairs = value.b; - return $elm$browser$Debugger$Expando$viewTinyHelp( - 'Dict(' + ($elm$core$String$fromInt( - $elm$core$List$length(keyValuePairs)) + ')')); - case 'Record': - var record = value.b; - return $elm$browser$Debugger$Expando$viewTinyRecord(record); - default: - if (!value.c.b) { - var maybeName = value.a; - return $elm$browser$Debugger$Expando$viewTinyHelp( - A2($elm$core$Maybe$withDefault, 'Unit', maybeName)); - } else { - var maybeName = value.a; - var valueList = value.c; - return $elm$browser$Debugger$Expando$viewTinyHelp( - function () { - if (maybeName.$ === 'Nothing') { - return 'Tuple(' + ($elm$core$String$fromInt( - $elm$core$List$length(valueList)) + ')'); - } else { - var name = maybeName.a; - return name + ' …'; - } - }()); - } - } -}; -var $elm$browser$Debugger$Expando$viewTinyRecord = function (record) { - return $elm$core$Dict$isEmpty(record) ? _Utils_Tuple2( - 2, - _List_fromArray( - [ - $elm$html$Html$text('{}') - ])) : A3( - $elm$browser$Debugger$Expando$viewTinyRecordHelp, - 0, - '{ ', - $elm$core$Dict$toList(record)); -}; -var $elm$browser$Debugger$Expando$viewTinyRecordHelp = F3( - function (length, starter, entries) { - if (!entries.b) { - return _Utils_Tuple2( - length + 2, - _List_fromArray( - [ - $elm$html$Html$text(' }') - ])); - } else { - var _v1 = entries.a; - var field = _v1.a; - var value = _v1.b; - var rest = entries.b; - var fieldLen = $elm$core$String$length(field); - var _v2 = $elm$browser$Debugger$Expando$viewExtraTiny(value); - var valueLen = _v2.a; - var valueHtmls = _v2.b; - var newLength = ((length + fieldLen) + valueLen) + 5; - if (newLength > 60) { - return _Utils_Tuple2( - length + 4, - _List_fromArray( - [ - $elm$html$Html$text(', … }') - ])); - } else { - var _v3 = A3($elm$browser$Debugger$Expando$viewTinyRecordHelp, newLength, ', ', rest); - var finalLength = _v3.a; - var otherHtmls = _v3.b; - return _Utils_Tuple2( - finalLength, - A2( - $elm$core$List$cons, - $elm$html$Html$text(starter), - A2( - $elm$core$List$cons, - A2( - $elm$html$Html$span, - _List_fromArray( - [$elm$browser$Debugger$Expando$purple]), - _List_fromArray( - [ - $elm$html$Html$text(field) - ])), - A2( - $elm$core$List$cons, - $elm$html$Html$text(' = '), - A2( - $elm$core$List$cons, - A2($elm$html$Html$span, _List_Nil, valueHtmls), - otherHtmls))))); - } - } - }); -var $elm$browser$Debugger$Expando$view = F2( - function (maybeKey, expando) { - switch (expando.$) { - case 'S': - var stringRep = expando.a; - return A2( - $elm$html$Html$div, - $elm$browser$Debugger$Expando$leftPad(maybeKey), - A3( - $elm$browser$Debugger$Expando$lineStarter, - maybeKey, - $elm$core$Maybe$Nothing, - _List_fromArray( - [ - A2( - $elm$html$Html$span, - _List_fromArray( - [$elm$browser$Debugger$Expando$red]), - _List_fromArray( - [ - $elm$html$Html$text(stringRep) - ])) - ]))); - case 'Primitive': - var stringRep = expando.a; - return A2( - $elm$html$Html$div, - $elm$browser$Debugger$Expando$leftPad(maybeKey), - A3( - $elm$browser$Debugger$Expando$lineStarter, - maybeKey, - $elm$core$Maybe$Nothing, - _List_fromArray( - [ - A2( - $elm$html$Html$span, - _List_fromArray( - [$elm$browser$Debugger$Expando$blue]), - _List_fromArray( - [ - $elm$html$Html$text(stringRep) - ])) - ]))); - case 'Sequence': - var seqType = expando.a; - var isClosed = expando.b; - var valueList = expando.c; - return A4($elm$browser$Debugger$Expando$viewSequence, maybeKey, seqType, isClosed, valueList); - case 'Dictionary': - var isClosed = expando.a; - var keyValuePairs = expando.b; - return A3($elm$browser$Debugger$Expando$viewDictionary, maybeKey, isClosed, keyValuePairs); - case 'Record': - var isClosed = expando.a; - var valueDict = expando.b; - return A3($elm$browser$Debugger$Expando$viewRecord, maybeKey, isClosed, valueDict); - default: - var maybeName = expando.a; - var isClosed = expando.b; - var valueList = expando.c; - return A4($elm$browser$Debugger$Expando$viewConstructor, maybeKey, maybeName, isClosed, valueList); - } - }); -var $elm$browser$Debugger$Expando$viewConstructor = F4( - function (maybeKey, maybeName, isClosed, valueList) { - var tinyArgs = A2( - $elm$core$List$map, - A2($elm$core$Basics$composeL, $elm$core$Tuple$second, $elm$browser$Debugger$Expando$viewExtraTiny), - valueList); - var description = function () { - var _v7 = _Utils_Tuple2(maybeName, tinyArgs); - if (_v7.a.$ === 'Nothing') { - if (!_v7.b.b) { - var _v8 = _v7.a; - return _List_fromArray( - [ - $elm$html$Html$text('()') - ]); - } else { - var _v9 = _v7.a; - var _v10 = _v7.b; - var x = _v10.a; - var xs = _v10.b; - return A2( - $elm$core$List$cons, - $elm$html$Html$text('( '), - A2( - $elm$core$List$cons, - A2($elm$html$Html$span, _List_Nil, x), - A3( - $elm$core$List$foldr, - F2( - function (args, rest) { - return A2( - $elm$core$List$cons, - $elm$html$Html$text(', '), - A2( - $elm$core$List$cons, - A2($elm$html$Html$span, _List_Nil, args), - rest)); - }), - _List_fromArray( - [ - $elm$html$Html$text(' )') - ]), - xs))); - } - } else { - if (!_v7.b.b) { - var name = _v7.a.a; - return _List_fromArray( - [ - $elm$html$Html$text(name) - ]); - } else { - var name = _v7.a.a; - var _v11 = _v7.b; - var x = _v11.a; - var xs = _v11.b; - return A2( - $elm$core$List$cons, - $elm$html$Html$text(name + ' '), - A2( - $elm$core$List$cons, - A2($elm$html$Html$span, _List_Nil, x), - A3( - $elm$core$List$foldr, - F2( - function (args, rest) { - return A2( - $elm$core$List$cons, - $elm$html$Html$text(' '), - A2( - $elm$core$List$cons, - A2($elm$html$Html$span, _List_Nil, args), - rest)); - }), - _List_Nil, - xs))); - } - } - }(); - var _v4 = function () { - if (!valueList.b) { - return _Utils_Tuple2( - $elm$core$Maybe$Nothing, - A2($elm$html$Html$div, _List_Nil, _List_Nil)); - } else { - if (!valueList.b.b) { - var entry = valueList.a; - switch (entry.$) { - case 'S': - return _Utils_Tuple2( - $elm$core$Maybe$Nothing, - A2($elm$html$Html$div, _List_Nil, _List_Nil)); - case 'Primitive': - return _Utils_Tuple2( - $elm$core$Maybe$Nothing, - A2($elm$html$Html$div, _List_Nil, _List_Nil)); - case 'Sequence': - var subValueList = entry.c; - return _Utils_Tuple2( - $elm$core$Maybe$Just(isClosed), - isClosed ? A2($elm$html$Html$div, _List_Nil, _List_Nil) : A2( - $elm$html$Html$map, - A2($elm$browser$Debugger$Expando$Index, $elm$browser$Debugger$Expando$None, 0), - $elm$browser$Debugger$Expando$viewSequenceOpen(subValueList))); - case 'Dictionary': - var keyValuePairs = entry.b; - return _Utils_Tuple2( - $elm$core$Maybe$Just(isClosed), - isClosed ? A2($elm$html$Html$div, _List_Nil, _List_Nil) : A2( - $elm$html$Html$map, - A2($elm$browser$Debugger$Expando$Index, $elm$browser$Debugger$Expando$None, 0), - $elm$browser$Debugger$Expando$viewDictionaryOpen(keyValuePairs))); - case 'Record': - var record = entry.b; - return _Utils_Tuple2( - $elm$core$Maybe$Just(isClosed), - isClosed ? A2($elm$html$Html$div, _List_Nil, _List_Nil) : A2( - $elm$html$Html$map, - A2($elm$browser$Debugger$Expando$Index, $elm$browser$Debugger$Expando$None, 0), - $elm$browser$Debugger$Expando$viewRecordOpen(record))); - default: - var subValueList = entry.c; - return _Utils_Tuple2( - $elm$core$Maybe$Just(isClosed), - isClosed ? A2($elm$html$Html$div, _List_Nil, _List_Nil) : A2( - $elm$html$Html$map, - A2($elm$browser$Debugger$Expando$Index, $elm$browser$Debugger$Expando$None, 0), - $elm$browser$Debugger$Expando$viewConstructorOpen(subValueList))); - } - } else { - return _Utils_Tuple2( - $elm$core$Maybe$Just(isClosed), - isClosed ? A2($elm$html$Html$div, _List_Nil, _List_Nil) : $elm$browser$Debugger$Expando$viewConstructorOpen(valueList)); - } - } - }(); - var maybeIsClosed = _v4.a; - var openHtml = _v4.b; - return A2( - $elm$html$Html$div, - $elm$browser$Debugger$Expando$leftPad(maybeKey), - _List_fromArray( - [ - A2( - $elm$html$Html$div, - _List_fromArray( - [ - $elm$html$Html$Events$onClick($elm$browser$Debugger$Expando$Toggle) - ]), - A3($elm$browser$Debugger$Expando$lineStarter, maybeKey, maybeIsClosed, description)), - openHtml - ])); - }); -var $elm$browser$Debugger$Expando$viewConstructorEntry = F2( - function (index, value) { - return A2( - $elm$html$Html$map, - A2($elm$browser$Debugger$Expando$Index, $elm$browser$Debugger$Expando$None, index), - A2( - $elm$browser$Debugger$Expando$view, - $elm$core$Maybe$Just( - $elm$core$String$fromInt(index)), - value)); - }); -var $elm$browser$Debugger$Expando$viewConstructorOpen = function (valueList) { - return A2( - $elm$html$Html$div, - _List_Nil, - A2($elm$core$List$indexedMap, $elm$browser$Debugger$Expando$viewConstructorEntry, valueList)); -}; -var $elm$browser$Debugger$Expando$viewDictionary = F3( - function (maybeKey, isClosed, keyValuePairs) { - var starter = 'Dict(' + ($elm$core$String$fromInt( - $elm$core$List$length(keyValuePairs)) + ')'); - return A2( - $elm$html$Html$div, - $elm$browser$Debugger$Expando$leftPad(maybeKey), - _List_fromArray( - [ - A2( - $elm$html$Html$div, - _List_fromArray( - [ - $elm$html$Html$Events$onClick($elm$browser$Debugger$Expando$Toggle) - ]), - A3( - $elm$browser$Debugger$Expando$lineStarter, - maybeKey, - $elm$core$Maybe$Just(isClosed), - _List_fromArray( - [ - $elm$html$Html$text(starter) - ]))), - isClosed ? $elm$html$Html$text('') : $elm$browser$Debugger$Expando$viewDictionaryOpen(keyValuePairs) - ])); - }); -var $elm$browser$Debugger$Expando$viewDictionaryEntry = F2( - function (index, _v2) { - var key = _v2.a; - var value = _v2.b; - switch (key.$) { - case 'S': - var stringRep = key.a; - return A2( - $elm$html$Html$map, - A2($elm$browser$Debugger$Expando$Index, $elm$browser$Debugger$Expando$Value, index), - A2( - $elm$browser$Debugger$Expando$view, - $elm$core$Maybe$Just(stringRep), - value)); - case 'Primitive': - var stringRep = key.a; - return A2( - $elm$html$Html$map, - A2($elm$browser$Debugger$Expando$Index, $elm$browser$Debugger$Expando$Value, index), - A2( - $elm$browser$Debugger$Expando$view, - $elm$core$Maybe$Just(stringRep), - value)); - default: - return A2( - $elm$html$Html$div, - _List_Nil, - _List_fromArray( - [ - A2( - $elm$html$Html$map, - A2($elm$browser$Debugger$Expando$Index, $elm$browser$Debugger$Expando$Key, index), - A2( - $elm$browser$Debugger$Expando$view, - $elm$core$Maybe$Just('key'), - key)), - A2( - $elm$html$Html$map, - A2($elm$browser$Debugger$Expando$Index, $elm$browser$Debugger$Expando$Value, index), - A2( - $elm$browser$Debugger$Expando$view, - $elm$core$Maybe$Just('value'), - value)) - ])); - } - }); -var $elm$browser$Debugger$Expando$viewDictionaryOpen = function (keyValuePairs) { - return A2( - $elm$html$Html$div, - _List_Nil, - A2($elm$core$List$indexedMap, $elm$browser$Debugger$Expando$viewDictionaryEntry, keyValuePairs)); -}; -var $elm$browser$Debugger$Expando$viewRecord = F3( - function (maybeKey, isClosed, record) { - var _v1 = isClosed ? _Utils_Tuple3( - $elm$browser$Debugger$Expando$viewTinyRecord(record).b, - $elm$html$Html$text(''), - $elm$html$Html$text('')) : _Utils_Tuple3( - _List_fromArray( - [ - $elm$html$Html$text('{') - ]), - $elm$browser$Debugger$Expando$viewRecordOpen(record), - A2( - $elm$html$Html$div, - $elm$browser$Debugger$Expando$leftPad( - $elm$core$Maybe$Just(_Utils_Tuple0)), - _List_fromArray( - [ - $elm$html$Html$text('}') - ]))); - var start = _v1.a; - var middle = _v1.b; - var end = _v1.c; - return A2( - $elm$html$Html$div, - $elm$browser$Debugger$Expando$leftPad(maybeKey), - _List_fromArray( - [ - A2( - $elm$html$Html$div, - _List_fromArray( - [ - $elm$html$Html$Events$onClick($elm$browser$Debugger$Expando$Toggle) - ]), - A3( - $elm$browser$Debugger$Expando$lineStarter, - maybeKey, - $elm$core$Maybe$Just(isClosed), - start)), - middle, - end - ])); - }); -var $elm$browser$Debugger$Expando$viewRecordEntry = function (_v0) { - var field = _v0.a; - var value = _v0.b; - return A2( - $elm$html$Html$map, - $elm$browser$Debugger$Expando$Field(field), - A2( - $elm$browser$Debugger$Expando$view, - $elm$core$Maybe$Just(field), - value)); -}; -var $elm$browser$Debugger$Expando$viewRecordOpen = function (record) { - return A2( - $elm$html$Html$div, - _List_Nil, - A2( - $elm$core$List$map, - $elm$browser$Debugger$Expando$viewRecordEntry, - $elm$core$Dict$toList(record))); -}; -var $elm$browser$Debugger$Expando$viewSequence = F4( - function (maybeKey, seqType, isClosed, valueList) { - var starter = A2( - $elm$browser$Debugger$Expando$seqTypeToString, - $elm$core$List$length(valueList), - seqType); - return A2( - $elm$html$Html$div, - $elm$browser$Debugger$Expando$leftPad(maybeKey), - _List_fromArray( - [ - A2( - $elm$html$Html$div, - _List_fromArray( - [ - $elm$html$Html$Events$onClick($elm$browser$Debugger$Expando$Toggle) - ]), - A3( - $elm$browser$Debugger$Expando$lineStarter, - maybeKey, - $elm$core$Maybe$Just(isClosed), - _List_fromArray( - [ - $elm$html$Html$text(starter) - ]))), - isClosed ? $elm$html$Html$text('') : $elm$browser$Debugger$Expando$viewSequenceOpen(valueList) - ])); - }); -var $elm$browser$Debugger$Expando$viewSequenceOpen = function (values) { - return A2( - $elm$html$Html$div, - _List_Nil, - A2($elm$core$List$indexedMap, $elm$browser$Debugger$Expando$viewConstructorEntry, values)); -}; -var $elm$browser$Debugger$Main$viewExpando = F3( - function (expandoMsg, expandoModel, layout) { - var block = $elm$browser$Debugger$Main$toMouseBlocker(layout); - var _v0 = $elm$browser$Debugger$Main$toExpandoPercents(layout); - var w = _v0.a; - var h = _v0.b; - return A2( - $elm$html$Html$div, - _List_fromArray( - [ - A2($elm$html$Html$Attributes$style, 'display', 'block'), - A2($elm$html$Html$Attributes$style, 'width', 'calc(' + (w + ' - 4em)')), - A2($elm$html$Html$Attributes$style, 'height', 'calc(' + (h + ' - 4em)')), - A2($elm$html$Html$Attributes$style, 'padding', '2em'), - A2($elm$html$Html$Attributes$style, 'margin', '0'), - A2($elm$html$Html$Attributes$style, 'overflow', 'auto'), - A2($elm$html$Html$Attributes$style, 'pointer-events', block), - A2($elm$html$Html$Attributes$style, '-webkit-user-select', block), - A2($elm$html$Html$Attributes$style, '-moz-user-select', block), - A2($elm$html$Html$Attributes$style, '-ms-user-select', block), - A2($elm$html$Html$Attributes$style, 'user-select', block) - ]), - _List_fromArray( - [ - A2( - $elm$html$Html$div, - _List_fromArray( - [ - A2($elm$html$Html$Attributes$style, 'color', '#ccc'), - A2($elm$html$Html$Attributes$style, 'padding', '0 0 1em 0') - ]), - _List_fromArray( - [ - $elm$html$Html$text('-- MESSAGE') - ])), - A2( - $elm$html$Html$map, - $elm$browser$Debugger$Main$TweakExpandoMsg, - A2($elm$browser$Debugger$Expando$view, $elm$core$Maybe$Nothing, expandoMsg)), - A2( - $elm$html$Html$div, - _List_fromArray( - [ - A2($elm$html$Html$Attributes$style, 'color', '#ccc'), - A2($elm$html$Html$Attributes$style, 'padding', '1em 0') - ]), - _List_fromArray( - [ - $elm$html$Html$text('-- MODEL') - ])), - A2( - $elm$html$Html$map, - $elm$browser$Debugger$Main$TweakExpandoModel, - A2($elm$browser$Debugger$Expando$view, $elm$core$Maybe$Nothing, expandoModel)) - ])); - }); -var $elm$browser$Debugger$Main$Jump = function (a) { - return {$: 'Jump', a: a}; -}; -var $elm$virtual_dom$VirtualDom$lazy = _VirtualDom_lazy; -var $elm$html$Html$Lazy$lazy = $elm$virtual_dom$VirtualDom$lazy; -var $elm$browser$Debugger$Main$toHistoryPercents = function (layout) { - if (layout.$ === 'Horizontal') { - var x = layout.b; - return _Utils_Tuple2( - $elm$browser$Debugger$Main$toPercent(x), - '100%'); - } else { - var y = layout.c; - return _Utils_Tuple2( - '100%', - $elm$browser$Debugger$Main$toPercent(1 - y)); - } -}; -var $elm$virtual_dom$VirtualDom$lazy3 = _VirtualDom_lazy3; -var $elm$html$Html$Lazy$lazy3 = $elm$virtual_dom$VirtualDom$lazy3; -var $elm$html$Html$Attributes$class = $elm$html$Html$Attributes$stringProperty('className'); -var $elm$browser$Debugger$History$idForMessageIndex = function (index) { - return 'msg-' + $elm$core$String$fromInt(index); -}; -var $elm$html$Html$Attributes$title = $elm$html$Html$Attributes$stringProperty('title'); -var $elm$browser$Debugger$History$viewMessage = F3( - function (currentIndex, index, msg) { - var messageName = _Debugger_messageToString(msg); - var className = _Utils_eq(currentIndex, index) ? 'elm-debugger-entry elm-debugger-entry-selected' : 'elm-debugger-entry'; - return A2( - $elm$html$Html$div, - _List_fromArray( - [ - $elm$html$Html$Attributes$id( - $elm$browser$Debugger$History$idForMessageIndex(index)), - $elm$html$Html$Attributes$class(className), - $elm$html$Html$Events$onClick(index) - ]), - _List_fromArray( - [ - A2( - $elm$html$Html$span, - _List_fromArray( - [ - $elm$html$Html$Attributes$title(messageName), - $elm$html$Html$Attributes$class('elm-debugger-entry-content') - ]), - _List_fromArray( - [ - $elm$html$Html$text(messageName) - ])), - A2( - $elm$html$Html$span, - _List_fromArray( - [ - $elm$html$Html$Attributes$class('elm-debugger-entry-index') - ]), - _List_fromArray( - [ - $elm$html$Html$text( - $elm$core$String$fromInt(index)) - ])) - ])); - }); -var $elm$browser$Debugger$History$consMsg = F3( - function (currentIndex, msg, _v0) { - var index = _v0.a; - var rest = _v0.b; - return _Utils_Tuple2( - index + 1, - A2( - $elm$core$List$cons, - _Utils_Tuple2( - $elm$core$String$fromInt(index), - A4($elm$html$Html$Lazy$lazy3, $elm$browser$Debugger$History$viewMessage, currentIndex, index, msg)), - rest)); - }); -var $elm$core$Array$length = function (_v0) { - var len = _v0.a; - return len; -}; -var $elm$core$Basics$neq = _Utils_notEqual; -var $elm$virtual_dom$VirtualDom$keyedNode = function (tag) { - return _VirtualDom_keyedNode( - _VirtualDom_noScript(tag)); -}; -var $elm$html$Html$Keyed$node = $elm$virtual_dom$VirtualDom$keyedNode; -var $elm$browser$Debugger$History$maxSnapshotSize = 31; -var $elm$browser$Debugger$History$showMoreButton = function (numMessages) { - var nextIndex = (numMessages - 1) - ($elm$browser$Debugger$History$maxSnapshotSize * 2); - var labelText = 'View more messages'; - return A2( - $elm$html$Html$div, - _List_fromArray( - [ - $elm$html$Html$Attributes$class('elm-debugger-entry'), - $elm$html$Html$Events$onClick(nextIndex) - ]), - _List_fromArray( - [ - A2( - $elm$html$Html$span, - _List_fromArray( - [ - $elm$html$Html$Attributes$title(labelText), - $elm$html$Html$Attributes$class('elm-debugger-entry-content') - ]), - _List_fromArray( - [ - $elm$html$Html$text(labelText) - ])), - A2( - $elm$html$Html$span, - _List_fromArray( - [ - $elm$html$Html$Attributes$class('elm-debugger-entry-index') - ]), - _List_Nil) - ])); -}; -var $elm$browser$Debugger$History$styles = A3( - $elm$html$Html$node, - 'style', - _List_Nil, - _List_fromArray( - [ - $elm$html$Html$text('\n\n.elm-debugger-entry {\n cursor: pointer;\n width: 100%;\n box-sizing: border-box;\n padding: 8px;\n}\n\n.elm-debugger-entry:hover {\n background-color: rgb(41, 41, 41);\n}\n\n.elm-debugger-entry-selected, .elm-debugger-entry-selected:hover {\n background-color: rgb(10, 10, 10);\n}\n\n.elm-debugger-entry-content {\n width: calc(100% - 40px);\n padding: 0 5px;\n box-sizing: border-box;\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n display: inline-block;\n}\n\n.elm-debugger-entry-index {\n color: #666;\n width: 40px;\n text-align: right;\n display: block;\n float: right;\n}\n\n') - ])); -var $elm$core$Basics$ge = _Utils_ge; -var $elm$browser$Debugger$History$viewSnapshot = F3( - function (selectedIndex, index, _v0) { - var messages = _v0.messages; - return A3( - $elm$html$Html$Keyed$node, - 'div', - _List_Nil, - A3( - $elm$core$Array$foldr, - $elm$browser$Debugger$History$consMsg(selectedIndex), - _Utils_Tuple2(index, _List_Nil), - messages).b); - }); -var $elm$browser$Debugger$History$consSnapshot = F3( - function (selectedIndex, snapshot, _v0) { - var index = _v0.a; - var rest = _v0.b; - var nextIndex = index + $elm$core$Array$length(snapshot.messages); - var selectedIndexHelp = ((_Utils_cmp(nextIndex, selectedIndex) > 0) && (_Utils_cmp(selectedIndex, index) > -1)) ? selectedIndex : (-1); - return _Utils_Tuple2( - nextIndex, - A2( - $elm$core$List$cons, - A4($elm$html$Html$Lazy$lazy3, $elm$browser$Debugger$History$viewSnapshot, selectedIndexHelp, index, snapshot), - rest)); - }); -var $elm$core$Elm$JsArray$foldl = _JsArray_foldl; -var $elm$core$Array$foldl = F3( - function (func, baseCase, _v0) { - var tree = _v0.c; - var tail = _v0.d; - var helper = F2( - function (node, acc) { - if (node.$ === 'SubTree') { - var subTree = node.a; - return A3($elm$core$Elm$JsArray$foldl, helper, acc, subTree); - } else { - var values = node.a; - return A3($elm$core$Elm$JsArray$foldl, func, acc, values); - } - }); - return A3( - $elm$core$Elm$JsArray$foldl, - func, - A3($elm$core$Elm$JsArray$foldl, helper, baseCase, tree), - tail); - }); -var $elm$browser$Debugger$History$viewAllSnapshots = F3( - function (selectedIndex, startIndex, snapshots) { - return A2( - $elm$html$Html$div, - _List_Nil, - A3( - $elm$core$Array$foldl, - $elm$browser$Debugger$History$consSnapshot(selectedIndex), - _Utils_Tuple2(startIndex, _List_Nil), - snapshots).b); - }); -var $elm$core$Array$fromListHelp = F3( - function (list, nodeList, nodeListSize) { - fromListHelp: - while (true) { - var _v0 = A2($elm$core$Elm$JsArray$initializeFromList, $elm$core$Array$branchFactor, list); - var jsArray = _v0.a; - var remainingItems = _v0.b; - if (_Utils_cmp( - $elm$core$Elm$JsArray$length(jsArray), - $elm$core$Array$branchFactor) < 0) { - return A2( - $elm$core$Array$builderToArray, - true, - {nodeList: nodeList, nodeListSize: nodeListSize, tail: jsArray}); - } else { - var $temp$list = remainingItems, - $temp$nodeList = A2( - $elm$core$List$cons, - $elm$core$Array$Leaf(jsArray), - nodeList), - $temp$nodeListSize = nodeListSize + 1; - list = $temp$list; - nodeList = $temp$nodeList; - nodeListSize = $temp$nodeListSize; - continue fromListHelp; - } - } - }); -var $elm$core$Array$fromList = function (list) { - if (!list.b) { - return $elm$core$Array$empty; - } else { - return A3($elm$core$Array$fromListHelp, list, _List_Nil, 0); - } -}; -var $elm$core$Bitwise$and = _Bitwise_and; -var $elm$core$Bitwise$shiftRightZfBy = _Bitwise_shiftRightZfBy; -var $elm$core$Array$bitMask = 4294967295 >>> (32 - $elm$core$Array$shiftStep); -var $elm$core$Elm$JsArray$unsafeGet = _JsArray_unsafeGet; -var $elm$core$Array$getHelp = F3( - function (shift, index, tree) { - getHelp: - while (true) { - var pos = $elm$core$Array$bitMask & (index >>> shift); - var _v0 = A2($elm$core$Elm$JsArray$unsafeGet, pos, tree); - if (_v0.$ === 'SubTree') { - var subTree = _v0.a; - var $temp$shift = shift - $elm$core$Array$shiftStep, - $temp$index = index, - $temp$tree = subTree; - shift = $temp$shift; - index = $temp$index; - tree = $temp$tree; - continue getHelp; - } else { - var values = _v0.a; - return A2($elm$core$Elm$JsArray$unsafeGet, $elm$core$Array$bitMask & index, values); - } - } - }); -var $elm$core$Bitwise$shiftLeftBy = _Bitwise_shiftLeftBy; -var $elm$core$Array$tailIndex = function (len) { - return (len >>> 5) << 5; -}; -var $elm$core$Array$get = F2( - function (index, _v0) { - var len = _v0.a; - var startShift = _v0.b; - var tree = _v0.c; - var tail = _v0.d; - return ((index < 0) || (_Utils_cmp(index, len) > -1)) ? $elm$core$Maybe$Nothing : ((_Utils_cmp( - index, - $elm$core$Array$tailIndex(len)) > -1) ? $elm$core$Maybe$Just( - A2($elm$core$Elm$JsArray$unsafeGet, $elm$core$Array$bitMask & index, tail)) : $elm$core$Maybe$Just( - A3($elm$core$Array$getHelp, startShift, index, tree))); - }); -var $elm$core$Elm$JsArray$appendN = _JsArray_appendN; -var $elm$core$Elm$JsArray$slice = _JsArray_slice; -var $elm$core$Array$appendHelpBuilder = F2( - function (tail, builder) { - var tailLen = $elm$core$Elm$JsArray$length(tail); - var notAppended = ($elm$core$Array$branchFactor - $elm$core$Elm$JsArray$length(builder.tail)) - tailLen; - var appended = A3($elm$core$Elm$JsArray$appendN, $elm$core$Array$branchFactor, builder.tail, tail); - return (notAppended < 0) ? { - nodeList: A2( - $elm$core$List$cons, - $elm$core$Array$Leaf(appended), - builder.nodeList), - nodeListSize: builder.nodeListSize + 1, - tail: A3($elm$core$Elm$JsArray$slice, notAppended, tailLen, tail) - } : ((!notAppended) ? { - nodeList: A2( - $elm$core$List$cons, - $elm$core$Array$Leaf(appended), - builder.nodeList), - nodeListSize: builder.nodeListSize + 1, - tail: $elm$core$Elm$JsArray$empty - } : {nodeList: builder.nodeList, nodeListSize: builder.nodeListSize, tail: appended}); - }); -var $elm$core$List$drop = F2( - function (n, list) { - drop: - while (true) { - if (n <= 0) { - return list; - } else { - if (!list.b) { - return list; - } else { - var x = list.a; - var xs = list.b; - var $temp$n = n - 1, - $temp$list = xs; - n = $temp$n; - list = $temp$list; - continue drop; - } - } - } - }); -var $elm$core$Array$sliceLeft = F2( - function (from, array) { - var len = array.a; - var tree = array.c; - var tail = array.d; - if (!from) { - return array; - } else { - if (_Utils_cmp( - from, - $elm$core$Array$tailIndex(len)) > -1) { - return A4( - $elm$core$Array$Array_elm_builtin, - len - from, - $elm$core$Array$shiftStep, - $elm$core$Elm$JsArray$empty, - A3( - $elm$core$Elm$JsArray$slice, - from - $elm$core$Array$tailIndex(len), - $elm$core$Elm$JsArray$length(tail), - tail)); - } else { - var skipNodes = (from / $elm$core$Array$branchFactor) | 0; - var helper = F2( - function (node, acc) { - if (node.$ === 'SubTree') { - var subTree = node.a; - return A3($elm$core$Elm$JsArray$foldr, helper, acc, subTree); - } else { - var leaf = node.a; - return A2($elm$core$List$cons, leaf, acc); - } - }); - var leafNodes = A3( - $elm$core$Elm$JsArray$foldr, - helper, - _List_fromArray( - [tail]), - tree); - var nodesToInsert = A2($elm$core$List$drop, skipNodes, leafNodes); - if (!nodesToInsert.b) { - return $elm$core$Array$empty; - } else { - var head = nodesToInsert.a; - var rest = nodesToInsert.b; - var firstSlice = from - (skipNodes * $elm$core$Array$branchFactor); - var initialBuilder = { - nodeList: _List_Nil, - nodeListSize: 0, - tail: A3( - $elm$core$Elm$JsArray$slice, - firstSlice, - $elm$core$Elm$JsArray$length(head), - head) - }; - return A2( - $elm$core$Array$builderToArray, - true, - A3($elm$core$List$foldl, $elm$core$Array$appendHelpBuilder, initialBuilder, rest)); - } - } - } - }); -var $elm$core$Array$fetchNewTail = F4( - function (shift, end, treeEnd, tree) { - fetchNewTail: - while (true) { - var pos = $elm$core$Array$bitMask & (treeEnd >>> shift); - var _v0 = A2($elm$core$Elm$JsArray$unsafeGet, pos, tree); - if (_v0.$ === 'SubTree') { - var sub = _v0.a; - var $temp$shift = shift - $elm$core$Array$shiftStep, - $temp$end = end, - $temp$treeEnd = treeEnd, - $temp$tree = sub; - shift = $temp$shift; - end = $temp$end; - treeEnd = $temp$treeEnd; - tree = $temp$tree; - continue fetchNewTail; - } else { - var values = _v0.a; - return A3($elm$core$Elm$JsArray$slice, 0, $elm$core$Array$bitMask & end, values); - } - } - }); -var $elm$core$Array$hoistTree = F3( - function (oldShift, newShift, tree) { - hoistTree: - while (true) { - if ((_Utils_cmp(oldShift, newShift) < 1) || (!$elm$core$Elm$JsArray$length(tree))) { - return tree; - } else { - var _v0 = A2($elm$core$Elm$JsArray$unsafeGet, 0, tree); - if (_v0.$ === 'SubTree') { - var sub = _v0.a; - var $temp$oldShift = oldShift - $elm$core$Array$shiftStep, - $temp$newShift = newShift, - $temp$tree = sub; - oldShift = $temp$oldShift; - newShift = $temp$newShift; - tree = $temp$tree; - continue hoistTree; - } else { - return tree; - } - } - } - }); -var $elm$core$Elm$JsArray$unsafeSet = _JsArray_unsafeSet; -var $elm$core$Array$sliceTree = F3( - function (shift, endIdx, tree) { - var lastPos = $elm$core$Array$bitMask & (endIdx >>> shift); - var _v0 = A2($elm$core$Elm$JsArray$unsafeGet, lastPos, tree); - if (_v0.$ === 'SubTree') { - var sub = _v0.a; - var newSub = A3($elm$core$Array$sliceTree, shift - $elm$core$Array$shiftStep, endIdx, sub); - return (!$elm$core$Elm$JsArray$length(newSub)) ? A3($elm$core$Elm$JsArray$slice, 0, lastPos, tree) : A3( - $elm$core$Elm$JsArray$unsafeSet, - lastPos, - $elm$core$Array$SubTree(newSub), - A3($elm$core$Elm$JsArray$slice, 0, lastPos + 1, tree)); - } else { - return A3($elm$core$Elm$JsArray$slice, 0, lastPos, tree); - } - }); -var $elm$core$Array$sliceRight = F2( - function (end, array) { - var len = array.a; - var startShift = array.b; - var tree = array.c; - var tail = array.d; - if (_Utils_eq(end, len)) { - return array; - } else { - if (_Utils_cmp( - end, - $elm$core$Array$tailIndex(len)) > -1) { - return A4( - $elm$core$Array$Array_elm_builtin, - end, - startShift, - tree, - A3($elm$core$Elm$JsArray$slice, 0, $elm$core$Array$bitMask & end, tail)); - } else { - var endIdx = $elm$core$Array$tailIndex(end); - var depth = $elm$core$Basics$floor( - A2( - $elm$core$Basics$logBase, - $elm$core$Array$branchFactor, - A2($elm$core$Basics$max, 1, endIdx - 1))); - var newShift = A2($elm$core$Basics$max, 5, depth * $elm$core$Array$shiftStep); - return A4( - $elm$core$Array$Array_elm_builtin, - end, - newShift, - A3( - $elm$core$Array$hoistTree, - startShift, - newShift, - A3($elm$core$Array$sliceTree, startShift, endIdx, tree)), - A4($elm$core$Array$fetchNewTail, startShift, end, endIdx, tree)); - } - } - }); -var $elm$core$Array$translateIndex = F2( - function (index, _v0) { - var len = _v0.a; - var posIndex = (index < 0) ? (len + index) : index; - return (posIndex < 0) ? 0 : ((_Utils_cmp(posIndex, len) > 0) ? len : posIndex); - }); -var $elm$core$Array$slice = F3( - function (from, to, array) { - var correctTo = A2($elm$core$Array$translateIndex, to, array); - var correctFrom = A2($elm$core$Array$translateIndex, from, array); - return (_Utils_cmp(correctFrom, correctTo) > 0) ? $elm$core$Array$empty : A2( - $elm$core$Array$sliceLeft, - correctFrom, - A2($elm$core$Array$sliceRight, correctTo, array)); - }); -var $elm$browser$Debugger$History$viewRecentSnapshots = F3( - function (selectedIndex, recentMessagesNum, snapshots) { - var messagesToFill = $elm$browser$Debugger$History$maxSnapshotSize - recentMessagesNum; - var arrayLength = $elm$core$Array$length(snapshots); - var snapshotsToRender = function () { - var _v0 = _Utils_Tuple2( - A2($elm$core$Array$get, arrayLength - 2, snapshots), - A2($elm$core$Array$get, arrayLength - 1, snapshots)); - if ((_v0.a.$ === 'Just') && (_v0.b.$ === 'Just')) { - var fillerSnapshot = _v0.a.a; - var recentSnapshot = _v0.b.a; - return $elm$core$Array$fromList( - _List_fromArray( - [ - { - messages: A3($elm$core$Array$slice, 0, messagesToFill, fillerSnapshot.messages), - model: fillerSnapshot.model - }, - recentSnapshot - ])); - } else { - return snapshots; - } - }(); - var startingIndex = ((arrayLength * $elm$browser$Debugger$History$maxSnapshotSize) - $elm$browser$Debugger$History$maxSnapshotSize) - messagesToFill; - return A3($elm$browser$Debugger$History$viewAllSnapshots, selectedIndex, startingIndex, snapshotsToRender); - }); -var $elm$browser$Debugger$History$view = F2( - function (maybeIndex, _v0) { - var snapshots = _v0.snapshots; - var recent = _v0.recent; - var numMessages = _v0.numMessages; - var recentMessageStartIndex = numMessages - recent.numMessages; - var index = A2($elm$core$Maybe$withDefault, -1, maybeIndex); - var newStuff = A3( - $elm$html$Html$Keyed$node, - 'div', - _List_Nil, - A3( - $elm$core$List$foldr, - $elm$browser$Debugger$History$consMsg(index), - _Utils_Tuple2(recentMessageStartIndex, _List_Nil), - recent.messages).b); - var onlyRenderRecentMessages = (!_Utils_eq(index, -1)) || ($elm$core$Array$length(snapshots) < 2); - var oldStuff = onlyRenderRecentMessages ? A4($elm$html$Html$Lazy$lazy3, $elm$browser$Debugger$History$viewAllSnapshots, index, 0, snapshots) : A4($elm$html$Html$Lazy$lazy3, $elm$browser$Debugger$History$viewRecentSnapshots, index, recent.numMessages, snapshots); - return A2( - $elm$html$Html$div, - _List_fromArray( - [ - $elm$html$Html$Attributes$id('elm-debugger-sidebar'), - A2($elm$html$Html$Attributes$style, 'width', '100%'), - A2($elm$html$Html$Attributes$style, 'overflow-y', 'auto'), - A2($elm$html$Html$Attributes$style, 'height', 'calc(100% - 72px)') - ]), - A2( - $elm$core$List$cons, - $elm$browser$Debugger$History$styles, - A2( - $elm$core$List$cons, - newStuff, - A2( - $elm$core$List$cons, - oldStuff, - onlyRenderRecentMessages ? _List_Nil : _List_fromArray( - [ - $elm$browser$Debugger$History$showMoreButton(numMessages) - ]))))); - }); -var $elm$browser$Debugger$Main$SwapLayout = {$: 'SwapLayout'}; -var $elm$browser$Debugger$Main$toHistoryIcon = function (layout) { - if (layout.$ === 'Horizontal') { - return 'M13 1a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3h-10a3 3 0 0 1-3-3v-8a3 3 0 0 1 3-3z M13 3h-10a1 1 0 0 0-1 1v5h12v-5a1 1 0 0 0-1-1z M14 10h-12v2a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1z'; - } else { - return 'M0 4a3 3 0 0 1 3-3h10a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3h-10a3 3 0 0 1-3-3z M2 4v8a1 1 0 0 0 1 1h2v-10h-2a1 1 0 0 0-1 1z M6 3v10h7a1 1 0 0 0 1-1v-8a1 1 0 0 0-1-1z'; - } -}; -var $elm$browser$Debugger$Main$icon = function (path) { - return A4( - $elm$virtual_dom$VirtualDom$nodeNS, - 'http://www.w3.org/2000/svg', - 'svg', - _List_fromArray( - [ - A2($elm$virtual_dom$VirtualDom$attribute, 'viewBox', '0 0 16 16'), - A2($elm$virtual_dom$VirtualDom$attribute, 'xmlns', 'http://www.w3.org/2000/svg'), - A2($elm$virtual_dom$VirtualDom$attribute, 'fill', 'currentColor'), - A2($elm$virtual_dom$VirtualDom$attribute, 'width', '16px'), - A2($elm$virtual_dom$VirtualDom$attribute, 'height', '16px') - ]), - _List_fromArray( - [ - A4( - $elm$virtual_dom$VirtualDom$nodeNS, - 'http://www.w3.org/2000/svg', - 'path', - _List_fromArray( - [ - A2($elm$virtual_dom$VirtualDom$attribute, 'd', path) - ]), - _List_Nil) - ])); -}; -var $elm$browser$Debugger$Main$viewHistoryButton = F3( - function (label, msg, path) { - return A2( - $elm$html$Html$button, - _List_fromArray( - [ - A2($elm$html$Html$Attributes$style, 'display', 'flex'), - A2($elm$html$Html$Attributes$style, 'flex-direction', 'row'), - A2($elm$html$Html$Attributes$style, 'align-items', 'center'), - A2($elm$html$Html$Attributes$style, 'background', 'none'), - A2($elm$html$Html$Attributes$style, 'border', 'none'), - A2($elm$html$Html$Attributes$style, 'color', 'inherit'), - A2($elm$html$Html$Attributes$style, 'cursor', 'pointer'), - $elm$html$Html$Events$onClick(msg) - ]), - _List_fromArray( - [ - $elm$browser$Debugger$Main$icon(path), - A2( - $elm$html$Html$span, - _List_fromArray( - [ - A2($elm$html$Html$Attributes$style, 'padding-left', '6px') - ]), - _List_fromArray( - [ - $elm$html$Html$text(label) - ])) - ])); - }); -var $elm$browser$Debugger$Main$viewHistoryOptions = function (layout) { - return A2( - $elm$html$Html$div, - _List_fromArray( - [ - A2($elm$html$Html$Attributes$style, 'width', '100%'), - A2($elm$html$Html$Attributes$style, 'height', '36px'), - A2($elm$html$Html$Attributes$style, 'display', 'flex'), - A2($elm$html$Html$Attributes$style, 'flex-direction', 'row'), - A2($elm$html$Html$Attributes$style, 'align-items', 'center'), - A2($elm$html$Html$Attributes$style, 'justify-content', 'space-between'), - A2($elm$html$Html$Attributes$style, 'background-color', 'rgb(50, 50, 50)') - ]), - _List_fromArray( - [ - A3( - $elm$browser$Debugger$Main$viewHistoryButton, - 'Swap Layout', - $elm$browser$Debugger$Main$SwapLayout, - $elm$browser$Debugger$Main$toHistoryIcon(layout)), - A2( - $elm$html$Html$div, - _List_fromArray( - [ - A2($elm$html$Html$Attributes$style, 'display', 'flex'), - A2($elm$html$Html$Attributes$style, 'flex-direction', 'row'), - A2($elm$html$Html$Attributes$style, 'align-items', 'center'), - A2($elm$html$Html$Attributes$style, 'justify-content', 'space-between') - ]), - _List_fromArray( - [ - A3($elm$browser$Debugger$Main$viewHistoryButton, 'Import', $elm$browser$Debugger$Main$Import, 'M5 1a1 1 0 0 1 0 2h-2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1a1 1 0 0 1 2 0a3 3 0 0 1-3 3h-10a3 3 0 0 1-3-3v-8a3 3 0 0 1 3-3z M10 2a1 1 0 0 0 -2 0v6a1 1 0 0 0 1 1h6a1 1 0 0 0 0-2h-3.586l4.293-4.293a1 1 0 0 0-1.414-1.414l-4.293 4.293z'), - A3($elm$browser$Debugger$Main$viewHistoryButton, 'Export', $elm$browser$Debugger$Main$Export, 'M5 1a1 1 0 0 1 0 2h-2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1 a1 1 0 0 1 2 0a3 3 0 0 1-3 3h-10a3 3 0 0 1-3-3v-8a3 3 0 0 1 3-3z M9 3a1 1 0 1 1 0-2h6a1 1 0 0 1 1 1v6a1 1 0 1 1-2 0v-3.586l-5.293 5.293 a1 1 0 0 1-1.414-1.414l5.293 -5.293z') - ])) - ])); -}; -var $elm$browser$Debugger$Main$SliderJump = function (a) { - return {$: 'SliderJump', a: a}; -}; -var $elm$core$Basics$composeR = F3( - function (f, g, x) { - return g( - f(x)); - }); -var $elm$html$Html$input = _VirtualDom_node('input'); -var $elm$browser$Debugger$Main$isPlaying = function (maybeIndex) { - if (maybeIndex.$ === 'Nothing') { - return true; - } else { - return false; - } -}; -var $elm$html$Html$Attributes$max = $elm$html$Html$Attributes$stringProperty('max'); -var $elm$html$Html$Attributes$min = $elm$html$Html$Attributes$stringProperty('min'); -var $elm$html$Html$Events$alwaysStop = function (x) { - return _Utils_Tuple2(x, true); -}; -var $elm$virtual_dom$VirtualDom$MayStopPropagation = function (a) { - return {$: 'MayStopPropagation', a: a}; -}; -var $elm$html$Html$Events$stopPropagationOn = F2( - function (event, decoder) { - return A2( - $elm$virtual_dom$VirtualDom$on, - event, - $elm$virtual_dom$VirtualDom$MayStopPropagation(decoder)); - }); -var $elm$json$Json$Decode$string = _Json_decodeString; -var $elm$html$Html$Events$targetValue = A2( - $elm$json$Json$Decode$at, - _List_fromArray( - ['target', 'value']), - $elm$json$Json$Decode$string); -var $elm$html$Html$Events$onInput = function (tagger) { - return A2( - $elm$html$Html$Events$stopPropagationOn, - 'input', - A2( - $elm$json$Json$Decode$map, - $elm$html$Html$Events$alwaysStop, - A2($elm$json$Json$Decode$map, tagger, $elm$html$Html$Events$targetValue))); -}; -var $elm$core$String$toInt = _String_toInt; -var $elm$html$Html$Attributes$type_ = $elm$html$Html$Attributes$stringProperty('type'); -var $elm$html$Html$Attributes$value = $elm$html$Html$Attributes$stringProperty('value'); -var $elm$browser$Debugger$Main$viewPlayButton = function (playing) { - return A2( - $elm$html$Html$button, - _List_fromArray( - [ - A2($elm$html$Html$Attributes$style, 'background', '#1293D8'), - A2($elm$html$Html$Attributes$style, 'border', 'none'), - A2($elm$html$Html$Attributes$style, 'color', 'white'), - A2($elm$html$Html$Attributes$style, 'cursor', 'pointer'), - A2($elm$html$Html$Attributes$style, 'width', '36px'), - A2($elm$html$Html$Attributes$style, 'height', '36px'), - $elm$html$Html$Events$onClick($elm$browser$Debugger$Main$Resume) - ]), - _List_fromArray( - [ - playing ? $elm$browser$Debugger$Main$icon('M2 2h4v12h-4v-12z M10 2h4v12h-4v-12z') : $elm$browser$Debugger$Main$icon('M2 2l12 7l-12 7z') - ])); -}; -var $elm$browser$Debugger$Main$viewHistorySlider = F2( - function (history, maybeIndex) { - var lastIndex = $elm$browser$Debugger$History$size(history) - 1; - var selectedIndex = A2($elm$core$Maybe$withDefault, lastIndex, maybeIndex); - return A2( - $elm$html$Html$div, - _List_fromArray( - [ - A2($elm$html$Html$Attributes$style, 'display', 'flex'), - A2($elm$html$Html$Attributes$style, 'flex-direction', 'row'), - A2($elm$html$Html$Attributes$style, 'align-items', 'center'), - A2($elm$html$Html$Attributes$style, 'width', '100%'), - A2($elm$html$Html$Attributes$style, 'height', '36px'), - A2($elm$html$Html$Attributes$style, 'background-color', 'rgb(50, 50, 50)') - ]), - _List_fromArray( - [ - A2( - $elm$html$Html$Lazy$lazy, - $elm$browser$Debugger$Main$viewPlayButton, - $elm$browser$Debugger$Main$isPlaying(maybeIndex)), - A2( - $elm$html$Html$input, - _List_fromArray( - [ - $elm$html$Html$Attributes$type_('range'), - A2($elm$html$Html$Attributes$style, 'width', 'calc(100% - 56px)'), - A2($elm$html$Html$Attributes$style, 'height', '36px'), - A2($elm$html$Html$Attributes$style, 'margin', '0 10px'), - $elm$html$Html$Attributes$min('0'), - $elm$html$Html$Attributes$max( - $elm$core$String$fromInt(lastIndex)), - $elm$html$Html$Attributes$value( - $elm$core$String$fromInt(selectedIndex)), - $elm$html$Html$Events$onInput( - A2( - $elm$core$Basics$composeR, - $elm$core$String$toInt, - A2( - $elm$core$Basics$composeR, - $elm$core$Maybe$withDefault(lastIndex), - $elm$browser$Debugger$Main$SliderJump))) - ]), - _List_Nil) - ])); - }); -var $elm$browser$Debugger$Main$viewHistory = F3( - function (maybeIndex, history, layout) { - var block = $elm$browser$Debugger$Main$toMouseBlocker(layout); - var _v0 = $elm$browser$Debugger$Main$toHistoryPercents(layout); - var w = _v0.a; - var h = _v0.b; - return A2( - $elm$html$Html$div, - _List_fromArray( - [ - A2($elm$html$Html$Attributes$style, 'width', w), - A2($elm$html$Html$Attributes$style, 'height', h), - A2($elm$html$Html$Attributes$style, 'display', 'flex'), - A2($elm$html$Html$Attributes$style, 'flex-direction', 'column'), - A2($elm$html$Html$Attributes$style, 'color', '#DDDDDD'), - A2($elm$html$Html$Attributes$style, 'background-color', 'rgb(61, 61, 61)'), - A2($elm$html$Html$Attributes$style, 'pointer-events', block), - A2($elm$html$Html$Attributes$style, 'user-select', block) - ]), - _List_fromArray( - [ - A2($elm$browser$Debugger$Main$viewHistorySlider, history, maybeIndex), - A2( - $elm$html$Html$map, - $elm$browser$Debugger$Main$Jump, - A2($elm$browser$Debugger$History$view, maybeIndex, history)), - A2($elm$html$Html$Lazy$lazy, $elm$browser$Debugger$Main$viewHistoryOptions, layout) - ])); - }); -var $elm$browser$Debugger$Main$popoutView = function (model) { - var maybeIndex = function () { - var _v0 = model.state; - if (_v0.$ === 'Running') { - return $elm$core$Maybe$Nothing; - } else { - var index = _v0.a; - return $elm$core$Maybe$Just(index); - } - }(); - var historyToRender = $elm$browser$Debugger$Main$cachedHistory(model); - return A3( - $elm$html$Html$node, - 'body', - _Utils_ap( - $elm$browser$Debugger$Main$toDragListeners(model.layout), - _List_fromArray( - [ - A2($elm$html$Html$Attributes$style, 'margin', '0'), - A2($elm$html$Html$Attributes$style, 'padding', '0'), - A2($elm$html$Html$Attributes$style, 'width', '100%'), - A2($elm$html$Html$Attributes$style, 'height', '100%'), - A2($elm$html$Html$Attributes$style, 'font-family', 'monospace'), - A2($elm$html$Html$Attributes$style, 'display', 'flex'), - A2( - $elm$html$Html$Attributes$style, - 'flex-direction', - $elm$browser$Debugger$Main$toFlexDirection(model.layout)) - ])), - _List_fromArray( - [ - A3($elm$browser$Debugger$Main$viewHistory, maybeIndex, historyToRender, model.layout), - $elm$browser$Debugger$Main$viewDragZone(model.layout), - A3($elm$browser$Debugger$Main$viewExpando, model.expandoMsg, model.expandoModel, model.layout) - ])); -}; -var $elm$browser$Debugger$Overlay$BlockAll = {$: 'BlockAll'}; -var $elm$browser$Debugger$Overlay$toBlockerType = F2( - function (isPaused, state) { - switch (state.$) { - case 'None': - return isPaused ? $elm$browser$Debugger$Overlay$BlockAll : $elm$browser$Debugger$Overlay$BlockNone; - case 'BadMetadata': - return $elm$browser$Debugger$Overlay$BlockMost; - case 'BadImport': - return $elm$browser$Debugger$Overlay$BlockMost; - default: - return $elm$browser$Debugger$Overlay$BlockMost; - } - }); -var $elm$browser$Debugger$Main$toBlockerType = function (model) { - return A2( - $elm$browser$Debugger$Overlay$toBlockerType, - $elm$browser$Debugger$Main$isPaused(model.state), - model.overlay); -}; -var $elm$browser$Debugger$Main$Horizontal = F3( - function (a, b, c) { - return {$: 'Horizontal', a: a, b: b, c: c}; - }); -var $elm$browser$Debugger$Main$Running = function (a) { - return {$: 'Running', a: a}; -}; -var $elm$browser$Debugger$Main$Static = {$: 'Static'}; -var $elm$browser$Debugger$Metadata$Error = F2( - function (message, problems) { - return {message: message, problems: problems}; - }); -var $elm$json$Json$Decode$decodeValue = _Json_run; -var $elm$browser$Debugger$Metadata$Metadata = F2( - function (versions, types) { - return {types: types, versions: versions}; - }); -var $elm$browser$Debugger$Metadata$Types = F3( - function (message, aliases, unions) { - return {aliases: aliases, message: message, unions: unions}; - }); -var $elm$browser$Debugger$Metadata$Alias = F2( - function (args, tipe) { - return {args: args, tipe: tipe}; - }); -var $elm$json$Json$Decode$list = _Json_decodeList; -var $elm$browser$Debugger$Metadata$decodeAlias = A3( - $elm$json$Json$Decode$map2, - $elm$browser$Debugger$Metadata$Alias, - A2( - $elm$json$Json$Decode$field, - 'args', - $elm$json$Json$Decode$list($elm$json$Json$Decode$string)), - A2($elm$json$Json$Decode$field, 'type', $elm$json$Json$Decode$string)); -var $elm$browser$Debugger$Metadata$Union = F2( - function (args, tags) { - return {args: args, tags: tags}; - }); -var $elm$core$Dict$fromList = function (assocs) { - return A3( - $elm$core$List$foldl, - F2( - function (_v0, dict) { - var key = _v0.a; - var value = _v0.b; - return A3($elm$core$Dict$insert, key, value, dict); - }), - $elm$core$Dict$empty, - assocs); -}; -var $elm$json$Json$Decode$keyValuePairs = _Json_decodeKeyValuePairs; -var $elm$json$Json$Decode$dict = function (decoder) { - return A2( - $elm$json$Json$Decode$map, - $elm$core$Dict$fromList, - $elm$json$Json$Decode$keyValuePairs(decoder)); -}; -var $elm$browser$Debugger$Metadata$decodeUnion = A3( - $elm$json$Json$Decode$map2, - $elm$browser$Debugger$Metadata$Union, - A2( - $elm$json$Json$Decode$field, - 'args', - $elm$json$Json$Decode$list($elm$json$Json$Decode$string)), - A2( - $elm$json$Json$Decode$field, - 'tags', - $elm$json$Json$Decode$dict( - $elm$json$Json$Decode$list($elm$json$Json$Decode$string)))); -var $elm$json$Json$Decode$map3 = _Json_map3; -var $elm$browser$Debugger$Metadata$decodeTypes = A4( - $elm$json$Json$Decode$map3, - $elm$browser$Debugger$Metadata$Types, - A2($elm$json$Json$Decode$field, 'message', $elm$json$Json$Decode$string), - A2( - $elm$json$Json$Decode$field, - 'aliases', - $elm$json$Json$Decode$dict($elm$browser$Debugger$Metadata$decodeAlias)), - A2( - $elm$json$Json$Decode$field, - 'unions', - $elm$json$Json$Decode$dict($elm$browser$Debugger$Metadata$decodeUnion))); -var $elm$browser$Debugger$Metadata$Versions = function (elm) { - return {elm: elm}; -}; -var $elm$browser$Debugger$Metadata$decodeVersions = A2( - $elm$json$Json$Decode$map, - $elm$browser$Debugger$Metadata$Versions, - A2($elm$json$Json$Decode$field, 'elm', $elm$json$Json$Decode$string)); -var $elm$browser$Debugger$Metadata$decoder = A3( - $elm$json$Json$Decode$map2, - $elm$browser$Debugger$Metadata$Metadata, - A2($elm$json$Json$Decode$field, 'versions', $elm$browser$Debugger$Metadata$decodeVersions), - A2($elm$json$Json$Decode$field, 'types', $elm$browser$Debugger$Metadata$decodeTypes)); -var $elm$browser$Debugger$Metadata$ProblemType = F2( - function (name, problems) { - return {name: name, problems: problems}; - }); -var $elm$core$List$maybeCons = F3( - function (f, mx, xs) { - var _v0 = f(mx); - if (_v0.$ === 'Just') { - var x = _v0.a; - return A2($elm$core$List$cons, x, xs); - } else { - return xs; - } - }); -var $elm$core$List$filterMap = F2( - function (f, xs) { - return A3( - $elm$core$List$foldr, - $elm$core$List$maybeCons(f), - _List_Nil, - xs); - }); -var $elm$core$String$contains = _String_contains; -var $elm$browser$Debugger$Metadata$hasProblem = F2( - function (tipe, _v0) { - var problem = _v0.a; - var token = _v0.b; - return A2($elm$core$String$contains, token, tipe) ? $elm$core$Maybe$Just(problem) : $elm$core$Maybe$Nothing; - }); -var $elm$browser$Debugger$Metadata$Decoder = {$: 'Decoder'}; -var $elm$browser$Debugger$Metadata$Function = {$: 'Function'}; -var $elm$browser$Debugger$Metadata$Process = {$: 'Process'}; -var $elm$browser$Debugger$Metadata$Program = {$: 'Program'}; -var $elm$browser$Debugger$Metadata$Request = {$: 'Request'}; -var $elm$browser$Debugger$Metadata$Socket = {$: 'Socket'}; -var $elm$browser$Debugger$Metadata$Task = {$: 'Task'}; -var $elm$browser$Debugger$Metadata$VirtualDom = {$: 'VirtualDom'}; -var $elm$browser$Debugger$Metadata$problemTable = _List_fromArray( - [ - _Utils_Tuple2($elm$browser$Debugger$Metadata$Function, '->'), - _Utils_Tuple2($elm$browser$Debugger$Metadata$Decoder, 'Json.Decode.Decoder'), - _Utils_Tuple2($elm$browser$Debugger$Metadata$Task, 'Task.Task'), - _Utils_Tuple2($elm$browser$Debugger$Metadata$Process, 'Process.Id'), - _Utils_Tuple2($elm$browser$Debugger$Metadata$Socket, 'WebSocket.LowLevel.WebSocket'), - _Utils_Tuple2($elm$browser$Debugger$Metadata$Request, 'Http.Request'), - _Utils_Tuple2($elm$browser$Debugger$Metadata$Program, 'Platform.Program'), - _Utils_Tuple2($elm$browser$Debugger$Metadata$VirtualDom, 'VirtualDom.Node'), - _Utils_Tuple2($elm$browser$Debugger$Metadata$VirtualDom, 'VirtualDom.Attribute') - ]); -var $elm$browser$Debugger$Metadata$findProblems = function (tipe) { - return A2( - $elm$core$List$filterMap, - $elm$browser$Debugger$Metadata$hasProblem(tipe), - $elm$browser$Debugger$Metadata$problemTable); -}; -var $elm$browser$Debugger$Metadata$collectBadAliases = F3( - function (name, _v0, list) { - var tipe = _v0.tipe; - var _v1 = $elm$browser$Debugger$Metadata$findProblems(tipe); - if (!_v1.b) { - return list; - } else { - var problems = _v1; - return A2( - $elm$core$List$cons, - A2($elm$browser$Debugger$Metadata$ProblemType, name, problems), - list); - } - }); -var $elm$core$List$append = F2( - function (xs, ys) { - if (!ys.b) { - return xs; - } else { - return A3($elm$core$List$foldr, $elm$core$List$cons, ys, xs); - } - }); -var $elm$core$List$concat = function (lists) { - return A3($elm$core$List$foldr, $elm$core$List$append, _List_Nil, lists); -}; -var $elm$core$List$concatMap = F2( - function (f, list) { - return $elm$core$List$concat( - A2($elm$core$List$map, f, list)); - }); -var $elm$core$Dict$values = function (dict) { - return A3( - $elm$core$Dict$foldr, - F3( - function (key, value, valueList) { - return A2($elm$core$List$cons, value, valueList); - }), - _List_Nil, - dict); -}; -var $elm$browser$Debugger$Metadata$collectBadUnions = F3( - function (name, _v0, list) { - var tags = _v0.tags; - var _v1 = A2( - $elm$core$List$concatMap, - $elm$browser$Debugger$Metadata$findProblems, - $elm$core$List$concat( - $elm$core$Dict$values(tags))); - if (!_v1.b) { - return list; - } else { - var problems = _v1; - return A2( - $elm$core$List$cons, - A2($elm$browser$Debugger$Metadata$ProblemType, name, problems), - list); - } - }); -var $elm$core$Dict$foldl = F3( - function (func, acc, dict) { - foldl: - while (true) { - if (dict.$ === 'RBEmpty_elm_builtin') { - return acc; - } else { - var key = dict.b; - var value = dict.c; - var left = dict.d; - var right = dict.e; - var $temp$func = func, - $temp$acc = A3( - func, - key, - value, - A3($elm$core$Dict$foldl, func, acc, left)), - $temp$dict = right; - func = $temp$func; - acc = $temp$acc; - dict = $temp$dict; - continue foldl; - } - } - }); -var $elm$browser$Debugger$Metadata$isPortable = function (_v0) { - var types = _v0.types; - var badAliases = A3($elm$core$Dict$foldl, $elm$browser$Debugger$Metadata$collectBadAliases, _List_Nil, types.aliases); - var _v1 = A3($elm$core$Dict$foldl, $elm$browser$Debugger$Metadata$collectBadUnions, badAliases, types.unions); - if (!_v1.b) { - return $elm$core$Maybe$Nothing; - } else { - var problems = _v1; - return $elm$core$Maybe$Just( - A2($elm$browser$Debugger$Metadata$Error, types.message, problems)); - } -}; -var $elm$browser$Debugger$Metadata$decode = function (value) { - var _v0 = A2($elm$json$Json$Decode$decodeValue, $elm$browser$Debugger$Metadata$decoder, value); - if (_v0.$ === 'Err') { - return $elm$core$Result$Err( - A2($elm$browser$Debugger$Metadata$Error, 'The compiler is generating bad metadata. This is a compiler bug!', _List_Nil)); - } else { - var metadata = _v0.a; - var _v1 = $elm$browser$Debugger$Metadata$isPortable(metadata); - if (_v1.$ === 'Nothing') { - return $elm$core$Result$Ok(metadata); - } else { - var error = _v1.a; - return $elm$core$Result$Err(error); - } - } -}; -var $elm$browser$Debugger$History$History = F3( - function (snapshots, recent, numMessages) { - return {numMessages: numMessages, recent: recent, snapshots: snapshots}; - }); -var $elm$browser$Debugger$History$RecentHistory = F3( - function (model, messages, numMessages) { - return {messages: messages, model: model, numMessages: numMessages}; - }); -var $elm$browser$Debugger$History$empty = function (model) { - return A3( - $elm$browser$Debugger$History$History, - $elm$core$Array$empty, - A3($elm$browser$Debugger$History$RecentHistory, model, _List_Nil, 0), - 0); -}; -var $elm$core$Dict$map = F2( - function (func, dict) { - if (dict.$ === 'RBEmpty_elm_builtin') { - return $elm$core$Dict$RBEmpty_elm_builtin; - } else { - var color = dict.a; - var key = dict.b; - var value = dict.c; - var left = dict.d; - var right = dict.e; - return A5( - $elm$core$Dict$RBNode_elm_builtin, - color, - key, - A2(func, key, value), - A2($elm$core$Dict$map, func, left), - A2($elm$core$Dict$map, func, right)); - } - }); -var $elm$core$Dict$sizeHelp = F2( - function (n, dict) { - sizeHelp: - while (true) { - if (dict.$ === 'RBEmpty_elm_builtin') { - return n; - } else { - var left = dict.d; - var right = dict.e; - var $temp$n = A2($elm$core$Dict$sizeHelp, n + 1, right), - $temp$dict = left; - n = $temp$n; - dict = $temp$dict; - continue sizeHelp; - } - } - }); -var $elm$core$Dict$size = function (dict) { - return A2($elm$core$Dict$sizeHelp, 0, dict); -}; -var $elm$browser$Debugger$Expando$initHelp = F2( - function (isOuter, expando) { - switch (expando.$) { - case 'S': - return expando; - case 'Primitive': - return expando; - case 'Sequence': - var seqType = expando.a; - var isClosed = expando.b; - var items = expando.c; - return isOuter ? A3( - $elm$browser$Debugger$Expando$Sequence, - seqType, - false, - A2( - $elm$core$List$map, - $elm$browser$Debugger$Expando$initHelp(false), - items)) : (($elm$core$List$length(items) <= 8) ? A3($elm$browser$Debugger$Expando$Sequence, seqType, false, items) : expando); - case 'Dictionary': - var isClosed = expando.a; - var keyValuePairs = expando.b; - return isOuter ? A2( - $elm$browser$Debugger$Expando$Dictionary, - false, - A2( - $elm$core$List$map, - function (_v1) { - var k = _v1.a; - var v = _v1.b; - return _Utils_Tuple2( - k, - A2($elm$browser$Debugger$Expando$initHelp, false, v)); - }, - keyValuePairs)) : (($elm$core$List$length(keyValuePairs) <= 8) ? A2($elm$browser$Debugger$Expando$Dictionary, false, keyValuePairs) : expando); - case 'Record': - var isClosed = expando.a; - var entries = expando.b; - return isOuter ? A2( - $elm$browser$Debugger$Expando$Record, - false, - A2( - $elm$core$Dict$map, - F2( - function (_v2, v) { - return A2($elm$browser$Debugger$Expando$initHelp, false, v); - }), - entries)) : (($elm$core$Dict$size(entries) <= 4) ? A2($elm$browser$Debugger$Expando$Record, false, entries) : expando); - default: - var maybeName = expando.a; - var isClosed = expando.b; - var args = expando.c; - return isOuter ? A3( - $elm$browser$Debugger$Expando$Constructor, - maybeName, - false, - A2( - $elm$core$List$map, - $elm$browser$Debugger$Expando$initHelp(false), - args)) : (($elm$core$List$length(args) <= 4) ? A3($elm$browser$Debugger$Expando$Constructor, maybeName, false, args) : expando); - } - }); -var $elm$browser$Debugger$Expando$init = function (value) { - return A2( - $elm$browser$Debugger$Expando$initHelp, - true, - _Debugger_init(value)); -}; -var $elm$core$Platform$Cmd$map = _Platform_map; -var $elm$browser$Debugger$Overlay$None = {$: 'None'}; -var $elm$browser$Debugger$Overlay$none = $elm$browser$Debugger$Overlay$None; -var $elm$browser$Debugger$Main$wrapInit = F4( - function (metadata, popout, init, flags) { - var _v0 = init(flags); - var userModel = _v0.a; - var userCommands = _v0.b; - return _Utils_Tuple2( - { - expandoModel: $elm$browser$Debugger$Expando$init(userModel), - expandoMsg: $elm$browser$Debugger$Expando$init(_Utils_Tuple0), - history: $elm$browser$Debugger$History$empty(userModel), - layout: A3($elm$browser$Debugger$Main$Horizontal, $elm$browser$Debugger$Main$Static, 0.3, 0.5), - metadata: $elm$browser$Debugger$Metadata$decode(metadata), - overlay: $elm$browser$Debugger$Overlay$none, - popout: popout, - state: $elm$browser$Debugger$Main$Running(userModel) - }, - A2($elm$core$Platform$Cmd$map, $elm$browser$Debugger$Main$UserMsg, userCommands)); - }); -var $elm$browser$Debugger$Main$getLatestModel = function (state) { - if (state.$ === 'Running') { - var model = state.a; - return model; - } else { - var model = state.c; - return model; - } -}; -var $elm$core$Platform$Sub$map = _Platform_map; -var $elm$browser$Debugger$Main$wrapSubs = F2( - function (subscriptions, model) { - return A2( - $elm$core$Platform$Sub$map, - $elm$browser$Debugger$Main$UserMsg, - subscriptions( - $elm$browser$Debugger$Main$getLatestModel(model.state))); - }); -var $elm$browser$Debugger$Main$Moving = {$: 'Moving'}; -var $elm$browser$Debugger$Main$Paused = F5( - function (a, b, c, d, e) { - return {$: 'Paused', a: a, b: b, c: c, d: d, e: e}; - }); -var $elm$browser$Debugger$History$Snapshot = F2( - function (model, messages) { - return {messages: messages, model: model}; - }); -var $elm$browser$Debugger$History$addRecent = F3( - function (msg, newModel, _v0) { - var model = _v0.model; - var messages = _v0.messages; - var numMessages = _v0.numMessages; - return _Utils_eq(numMessages, $elm$browser$Debugger$History$maxSnapshotSize) ? _Utils_Tuple2( - $elm$core$Maybe$Just( - A2( - $elm$browser$Debugger$History$Snapshot, - model, - $elm$core$Array$fromList(messages))), - A3( - $elm$browser$Debugger$History$RecentHistory, - newModel, - _List_fromArray( - [msg]), - 1)) : _Utils_Tuple2( - $elm$core$Maybe$Nothing, - A3( - $elm$browser$Debugger$History$RecentHistory, - model, - A2($elm$core$List$cons, msg, messages), - numMessages + 1)); - }); -var $elm$core$Elm$JsArray$push = _JsArray_push; -var $elm$core$Elm$JsArray$singleton = _JsArray_singleton; -var $elm$core$Array$insertTailInTree = F4( - function (shift, index, tail, tree) { - var pos = $elm$core$Array$bitMask & (index >>> shift); - if (_Utils_cmp( - pos, - $elm$core$Elm$JsArray$length(tree)) > -1) { - if (shift === 5) { - return A2( - $elm$core$Elm$JsArray$push, - $elm$core$Array$Leaf(tail), - tree); - } else { - var newSub = $elm$core$Array$SubTree( - A4($elm$core$Array$insertTailInTree, shift - $elm$core$Array$shiftStep, index, tail, $elm$core$Elm$JsArray$empty)); - return A2($elm$core$Elm$JsArray$push, newSub, tree); - } - } else { - var value = A2($elm$core$Elm$JsArray$unsafeGet, pos, tree); - if (value.$ === 'SubTree') { - var subTree = value.a; - var newSub = $elm$core$Array$SubTree( - A4($elm$core$Array$insertTailInTree, shift - $elm$core$Array$shiftStep, index, tail, subTree)); - return A3($elm$core$Elm$JsArray$unsafeSet, pos, newSub, tree); - } else { - var newSub = $elm$core$Array$SubTree( - A4( - $elm$core$Array$insertTailInTree, - shift - $elm$core$Array$shiftStep, - index, - tail, - $elm$core$Elm$JsArray$singleton(value))); - return A3($elm$core$Elm$JsArray$unsafeSet, pos, newSub, tree); - } - } - }); -var $elm$core$Array$unsafeReplaceTail = F2( - function (newTail, _v0) { - var len = _v0.a; - var startShift = _v0.b; - var tree = _v0.c; - var tail = _v0.d; - var originalTailLen = $elm$core$Elm$JsArray$length(tail); - var newTailLen = $elm$core$Elm$JsArray$length(newTail); - var newArrayLen = len + (newTailLen - originalTailLen); - if (_Utils_eq(newTailLen, $elm$core$Array$branchFactor)) { - var overflow = _Utils_cmp(newArrayLen >>> $elm$core$Array$shiftStep, 1 << startShift) > 0; - if (overflow) { - var newShift = startShift + $elm$core$Array$shiftStep; - var newTree = A4( - $elm$core$Array$insertTailInTree, - newShift, - len, - newTail, - $elm$core$Elm$JsArray$singleton( - $elm$core$Array$SubTree(tree))); - return A4($elm$core$Array$Array_elm_builtin, newArrayLen, newShift, newTree, $elm$core$Elm$JsArray$empty); - } else { - return A4( - $elm$core$Array$Array_elm_builtin, - newArrayLen, - startShift, - A4($elm$core$Array$insertTailInTree, startShift, len, newTail, tree), - $elm$core$Elm$JsArray$empty); - } - } else { - return A4($elm$core$Array$Array_elm_builtin, newArrayLen, startShift, tree, newTail); - } - }); -var $elm$core$Array$push = F2( - function (a, array) { - var tail = array.d; - return A2( - $elm$core$Array$unsafeReplaceTail, - A2($elm$core$Elm$JsArray$push, a, tail), - array); - }); -var $elm$browser$Debugger$History$add = F3( - function (msg, model, _v0) { - var snapshots = _v0.snapshots; - var recent = _v0.recent; - var numMessages = _v0.numMessages; - var _v1 = A3($elm$browser$Debugger$History$addRecent, msg, model, recent); - if (_v1.a.$ === 'Just') { - var snapshot = _v1.a.a; - var newRecent = _v1.b; - return A3( - $elm$browser$Debugger$History$History, - A2($elm$core$Array$push, snapshot, snapshots), - newRecent, - numMessages + 1); - } else { - var _v2 = _v1.a; - var newRecent = _v1.b; - return A3($elm$browser$Debugger$History$History, snapshots, newRecent, numMessages + 1); - } - }); -var $elm$core$Basics$always = F2( - function (a, _v0) { - return a; - }); -var $elm$browser$Debugger$Overlay$BadImport = function (a) { - return {$: 'BadImport', a: a}; -}; -var $elm$browser$Debugger$Overlay$RiskyImport = F2( - function (a, b) { - return {$: 'RiskyImport', a: a, b: b}; - }); -var $elm$browser$Debugger$Report$VersionChanged = F2( - function (a, b) { - return {$: 'VersionChanged', a: a, b: b}; - }); -var $elm$browser$Debugger$Report$MessageChanged = F2( - function (a, b) { - return {$: 'MessageChanged', a: a, b: b}; - }); -var $elm$browser$Debugger$Report$SomethingChanged = function (a) { - return {$: 'SomethingChanged', a: a}; -}; -var $elm$browser$Debugger$Report$AliasChange = function (a) { - return {$: 'AliasChange', a: a}; -}; -var $elm$browser$Debugger$Metadata$checkAlias = F4( - function (name, old, _new, changes) { - return (_Utils_eq(old.tipe, _new.tipe) && _Utils_eq(old.args, _new.args)) ? changes : A2( - $elm$core$List$cons, - $elm$browser$Debugger$Report$AliasChange(name), - changes); - }); -var $elm$browser$Debugger$Report$UnionChange = F2( - function (a, b) { - return {$: 'UnionChange', a: a, b: b}; - }); -var $elm$browser$Debugger$Metadata$addTag = F3( - function (tag, _v0, changes) { - return _Utils_update( - changes, - { - added: A2($elm$core$List$cons, tag, changes.added) - }); - }); -var $elm$browser$Debugger$Metadata$checkTag = F4( - function (tag, old, _new, changes) { - return _Utils_eq(old, _new) ? changes : _Utils_update( - changes, - { - changed: A2($elm$core$List$cons, tag, changes.changed) - }); - }); -var $elm$browser$Debugger$Report$TagChanges = F4( - function (removed, changed, added, argsMatch) { - return {added: added, argsMatch: argsMatch, changed: changed, removed: removed}; - }); -var $elm$browser$Debugger$Report$emptyTagChanges = function (argsMatch) { - return A4($elm$browser$Debugger$Report$TagChanges, _List_Nil, _List_Nil, _List_Nil, argsMatch); -}; -var $elm$browser$Debugger$Report$hasTagChanges = function (tagChanges) { - return _Utils_eq( - tagChanges, - A4($elm$browser$Debugger$Report$TagChanges, _List_Nil, _List_Nil, _List_Nil, true)); -}; -var $elm$core$Dict$merge = F6( - function (leftStep, bothStep, rightStep, leftDict, rightDict, initialResult) { - var stepState = F3( - function (rKey, rValue, _v0) { - stepState: - while (true) { - var list = _v0.a; - var result = _v0.b; - if (!list.b) { - return _Utils_Tuple2( - list, - A3(rightStep, rKey, rValue, result)); - } else { - var _v2 = list.a; - var lKey = _v2.a; - var lValue = _v2.b; - var rest = list.b; - if (_Utils_cmp(lKey, rKey) < 0) { - var $temp$rKey = rKey, - $temp$rValue = rValue, - $temp$_v0 = _Utils_Tuple2( - rest, - A3(leftStep, lKey, lValue, result)); - rKey = $temp$rKey; - rValue = $temp$rValue; - _v0 = $temp$_v0; - continue stepState; - } else { - if (_Utils_cmp(lKey, rKey) > 0) { - return _Utils_Tuple2( - list, - A3(rightStep, rKey, rValue, result)); - } else { - return _Utils_Tuple2( - rest, - A4(bothStep, lKey, lValue, rValue, result)); - } - } - } - } - }); - var _v3 = A3( - $elm$core$Dict$foldl, - stepState, - _Utils_Tuple2( - $elm$core$Dict$toList(leftDict), - initialResult), - rightDict); - var leftovers = _v3.a; - var intermediateResult = _v3.b; - return A3( - $elm$core$List$foldl, - F2( - function (_v4, result) { - var k = _v4.a; - var v = _v4.b; - return A3(leftStep, k, v, result); - }), - intermediateResult, - leftovers); - }); -var $elm$browser$Debugger$Metadata$removeTag = F3( - function (tag, _v0, changes) { - return _Utils_update( - changes, - { - removed: A2($elm$core$List$cons, tag, changes.removed) - }); - }); -var $elm$browser$Debugger$Metadata$checkUnion = F4( - function (name, old, _new, changes) { - var tagChanges = A6( - $elm$core$Dict$merge, - $elm$browser$Debugger$Metadata$removeTag, - $elm$browser$Debugger$Metadata$checkTag, - $elm$browser$Debugger$Metadata$addTag, - old.tags, - _new.tags, - $elm$browser$Debugger$Report$emptyTagChanges( - _Utils_eq(old.args, _new.args))); - return $elm$browser$Debugger$Report$hasTagChanges(tagChanges) ? changes : A2( - $elm$core$List$cons, - A2($elm$browser$Debugger$Report$UnionChange, name, tagChanges), - changes); - }); -var $elm$browser$Debugger$Metadata$ignore = F3( - function (key, value, report) { - return report; - }); -var $elm$browser$Debugger$Metadata$checkTypes = F2( - function (old, _new) { - return (!_Utils_eq(old.message, _new.message)) ? A2($elm$browser$Debugger$Report$MessageChanged, old.message, _new.message) : $elm$browser$Debugger$Report$SomethingChanged( - A6( - $elm$core$Dict$merge, - $elm$browser$Debugger$Metadata$ignore, - $elm$browser$Debugger$Metadata$checkUnion, - $elm$browser$Debugger$Metadata$ignore, - old.unions, - _new.unions, - A6($elm$core$Dict$merge, $elm$browser$Debugger$Metadata$ignore, $elm$browser$Debugger$Metadata$checkAlias, $elm$browser$Debugger$Metadata$ignore, old.aliases, _new.aliases, _List_Nil))); - }); -var $elm$browser$Debugger$Metadata$check = F2( - function (old, _new) { - return (!_Utils_eq(old.versions.elm, _new.versions.elm)) ? A2($elm$browser$Debugger$Report$VersionChanged, old.versions.elm, _new.versions.elm) : A2($elm$browser$Debugger$Metadata$checkTypes, old.types, _new.types); - }); -var $elm$browser$Debugger$Report$CorruptHistory = {$: 'CorruptHistory'}; -var $elm$browser$Debugger$Overlay$corruptImport = $elm$browser$Debugger$Overlay$BadImport($elm$browser$Debugger$Report$CorruptHistory); -var $elm$json$Json$Decode$decodeString = _Json_runOnString; -var $elm$browser$Debugger$Report$Fine = {$: 'Fine'}; -var $elm$browser$Debugger$Report$Impossible = {$: 'Impossible'}; -var $elm$browser$Debugger$Report$Risky = {$: 'Risky'}; -var $elm$core$Basics$not = _Basics_not; -var $elm$core$List$isEmpty = function (xs) { - if (!xs.b) { - return true; - } else { - return false; - } -}; -var $elm$browser$Debugger$Report$some = function (list) { - return !$elm$core$List$isEmpty(list); -}; -var $elm$browser$Debugger$Report$evaluateChange = function (change) { - if (change.$ === 'AliasChange') { - return $elm$browser$Debugger$Report$Impossible; - } else { - var removed = change.b.removed; - var changed = change.b.changed; - var added = change.b.added; - var argsMatch = change.b.argsMatch; - return ((!argsMatch) || ($elm$browser$Debugger$Report$some(changed) || $elm$browser$Debugger$Report$some(removed))) ? $elm$browser$Debugger$Report$Impossible : ($elm$browser$Debugger$Report$some(added) ? $elm$browser$Debugger$Report$Risky : $elm$browser$Debugger$Report$Fine); - } -}; -var $elm$browser$Debugger$Report$worstCase = F2( - function (status, statusList) { - worstCase: - while (true) { - if (!statusList.b) { - return status; - } else { - switch (statusList.a.$) { - case 'Impossible': - var _v1 = statusList.a; - return $elm$browser$Debugger$Report$Impossible; - case 'Risky': - var _v2 = statusList.a; - var rest = statusList.b; - var $temp$status = $elm$browser$Debugger$Report$Risky, - $temp$statusList = rest; - status = $temp$status; - statusList = $temp$statusList; - continue worstCase; - default: - var _v3 = statusList.a; - var rest = statusList.b; - var $temp$status = status, - $temp$statusList = rest; - status = $temp$status; - statusList = $temp$statusList; - continue worstCase; - } - } - } - }); -var $elm$browser$Debugger$Report$evaluate = function (report) { - switch (report.$) { - case 'CorruptHistory': - return $elm$browser$Debugger$Report$Impossible; - case 'VersionChanged': - return $elm$browser$Debugger$Report$Impossible; - case 'MessageChanged': - return $elm$browser$Debugger$Report$Impossible; - default: - var changes = report.a; - return A2( - $elm$browser$Debugger$Report$worstCase, - $elm$browser$Debugger$Report$Fine, - A2($elm$core$List$map, $elm$browser$Debugger$Report$evaluateChange, changes)); - } -}; -var $elm$json$Json$Decode$value = _Json_decodeValue; -var $elm$browser$Debugger$Overlay$uploadDecoder = A3( - $elm$json$Json$Decode$map2, - F2( - function (x, y) { - return _Utils_Tuple2(x, y); - }), - A2($elm$json$Json$Decode$field, 'metadata', $elm$browser$Debugger$Metadata$decoder), - A2($elm$json$Json$Decode$field, 'history', $elm$json$Json$Decode$value)); -var $elm$browser$Debugger$Overlay$assessImport = F2( - function (metadata, jsonString) { - var _v0 = A2($elm$json$Json$Decode$decodeString, $elm$browser$Debugger$Overlay$uploadDecoder, jsonString); - if (_v0.$ === 'Err') { - return $elm$core$Result$Err($elm$browser$Debugger$Overlay$corruptImport); - } else { - var _v1 = _v0.a; - var foreignMetadata = _v1.a; - var rawHistory = _v1.b; - var report = A2($elm$browser$Debugger$Metadata$check, foreignMetadata, metadata); - var _v2 = $elm$browser$Debugger$Report$evaluate(report); - switch (_v2.$) { - case 'Impossible': - return $elm$core$Result$Err( - $elm$browser$Debugger$Overlay$BadImport(report)); - case 'Risky': - return $elm$core$Result$Err( - A2($elm$browser$Debugger$Overlay$RiskyImport, report, rawHistory)); - default: - return $elm$core$Result$Ok(rawHistory); - } - } - }); -var $elm$core$Platform$Cmd$batch = _Platform_batch; -var $elm$browser$Debugger$Overlay$close = F2( - function (msg, state) { - switch (state.$) { - case 'None': - return $elm$core$Maybe$Nothing; - case 'BadMetadata': - return $elm$core$Maybe$Nothing; - case 'BadImport': - return $elm$core$Maybe$Nothing; - default: - var rawHistory = state.b; - if (msg.$ === 'Cancel') { - return $elm$core$Maybe$Nothing; - } else { - return $elm$core$Maybe$Just(rawHistory); - } - } - }); -var $elm$browser$Debugger$History$elmToJs = A2($elm$core$Basics$composeR, _Json_wrap, _Debugger_unsafeCoerce); -var $elm$browser$Debugger$History$encodeHelp = F2( - function (snapshot, allMessages) { - return A3($elm$core$Array$foldl, $elm$core$List$cons, allMessages, snapshot.messages); - }); -var $elm$json$Json$Encode$list = F2( - function (func, entries) { - return _Json_wrap( - A3( - $elm$core$List$foldl, - _Json_addEntry(func), - _Json_emptyArray(_Utils_Tuple0), - entries)); - }); -var $elm$browser$Debugger$History$encode = function (_v0) { - var snapshots = _v0.snapshots; - var recent = _v0.recent; - return A2( - $elm$json$Json$Encode$list, - $elm$browser$Debugger$History$elmToJs, - A3( - $elm$core$Array$foldr, - $elm$browser$Debugger$History$encodeHelp, - $elm$core$List$reverse(recent.messages), - snapshots)); -}; -var $elm$json$Json$Encode$object = function (pairs) { - return _Json_wrap( - A3( - $elm$core$List$foldl, - F2( - function (_v0, obj) { - var k = _v0.a; - var v = _v0.b; - return A3(_Json_addField, k, v, obj); - }), - _Json_emptyObject(_Utils_Tuple0), - pairs)); -}; -var $elm$browser$Debugger$Metadata$encodeAlias = function (_v0) { - var args = _v0.args; - var tipe = _v0.tipe; - return $elm$json$Json$Encode$object( - _List_fromArray( - [ - _Utils_Tuple2( - 'args', - A2($elm$json$Json$Encode$list, $elm$json$Json$Encode$string, args)), - _Utils_Tuple2( - 'type', - $elm$json$Json$Encode$string(tipe)) - ])); -}; -var $elm$browser$Debugger$Metadata$encodeDict = F2( - function (f, dict) { - return $elm$json$Json$Encode$object( - $elm$core$Dict$toList( - A2( - $elm$core$Dict$map, - F2( - function (key, value) { - return f(value); - }), - dict))); - }); -var $elm$browser$Debugger$Metadata$encodeUnion = function (_v0) { - var args = _v0.args; - var tags = _v0.tags; - return $elm$json$Json$Encode$object( - _List_fromArray( - [ - _Utils_Tuple2( - 'args', - A2($elm$json$Json$Encode$list, $elm$json$Json$Encode$string, args)), - _Utils_Tuple2( - 'tags', - A2( - $elm$browser$Debugger$Metadata$encodeDict, - $elm$json$Json$Encode$list($elm$json$Json$Encode$string), - tags)) - ])); -}; -var $elm$browser$Debugger$Metadata$encodeTypes = function (_v0) { - var message = _v0.message; - var unions = _v0.unions; - var aliases = _v0.aliases; - return $elm$json$Json$Encode$object( - _List_fromArray( - [ - _Utils_Tuple2( - 'message', - $elm$json$Json$Encode$string(message)), - _Utils_Tuple2( - 'aliases', - A2($elm$browser$Debugger$Metadata$encodeDict, $elm$browser$Debugger$Metadata$encodeAlias, aliases)), - _Utils_Tuple2( - 'unions', - A2($elm$browser$Debugger$Metadata$encodeDict, $elm$browser$Debugger$Metadata$encodeUnion, unions)) - ])); -}; -var $elm$browser$Debugger$Metadata$encodeVersions = function (_v0) { - var elm = _v0.elm; - return $elm$json$Json$Encode$object( - _List_fromArray( - [ - _Utils_Tuple2( - 'elm', - $elm$json$Json$Encode$string(elm)) - ])); -}; -var $elm$browser$Debugger$Metadata$encode = function (_v0) { - var versions = _v0.versions; - var types = _v0.types; - return $elm$json$Json$Encode$object( - _List_fromArray( - [ - _Utils_Tuple2( - 'versions', - $elm$browser$Debugger$Metadata$encodeVersions(versions)), - _Utils_Tuple2( - 'types', - $elm$browser$Debugger$Metadata$encodeTypes(types)) - ])); -}; -var $elm$core$Basics$identity = function (x) { - return x; -}; -var $elm$core$Task$Perform = function (a) { - return {$: 'Perform', a: a}; -}; -var $elm$core$Task$succeed = _Scheduler_succeed; -var $elm$core$Task$init = $elm$core$Task$succeed(_Utils_Tuple0); -var $elm$core$Task$andThen = _Scheduler_andThen; -var $elm$core$Task$map = F2( - function (func, taskA) { - return A2( - $elm$core$Task$andThen, - function (a) { - return $elm$core$Task$succeed( - func(a)); - }, - taskA); - }); -var $elm$core$Task$map2 = F3( - function (func, taskA, taskB) { - return A2( - $elm$core$Task$andThen, - function (a) { - return A2( - $elm$core$Task$andThen, - function (b) { - return $elm$core$Task$succeed( - A2(func, a, b)); - }, - taskB); - }, - taskA); - }); -var $elm$core$Task$sequence = function (tasks) { - return A3( - $elm$core$List$foldr, - $elm$core$Task$map2($elm$core$List$cons), - $elm$core$Task$succeed(_List_Nil), - tasks); -}; -var $elm$core$Platform$sendToApp = _Platform_sendToApp; -var $elm$core$Task$spawnCmd = F2( - function (router, _v0) { - var task = _v0.a; - return _Scheduler_spawn( - A2( - $elm$core$Task$andThen, - $elm$core$Platform$sendToApp(router), - task)); - }); -var $elm$core$Task$onEffects = F3( - function (router, commands, state) { - return A2( - $elm$core$Task$map, - function (_v0) { - return _Utils_Tuple0; - }, - $elm$core$Task$sequence( - A2( - $elm$core$List$map, - $elm$core$Task$spawnCmd(router), - commands))); - }); -var $elm$core$Task$onSelfMsg = F3( - function (_v0, _v1, _v2) { - return $elm$core$Task$succeed(_Utils_Tuple0); - }); -var $elm$core$Task$cmdMap = F2( - function (tagger, _v0) { - var task = _v0.a; - return $elm$core$Task$Perform( - A2($elm$core$Task$map, tagger, task)); - }); -_Platform_effectManagers['Task'] = _Platform_createManager($elm$core$Task$init, $elm$core$Task$onEffects, $elm$core$Task$onSelfMsg, $elm$core$Task$cmdMap); -var $elm$core$Task$command = _Platform_leaf('Task'); -var $elm$core$Task$perform = F2( - function (toMessage, task) { - return $elm$core$Task$command( - $elm$core$Task$Perform( - A2($elm$core$Task$map, toMessage, task))); - }); -var $elm$browser$Debugger$Main$download = F2( - function (metadata, history) { - var historyLength = $elm$browser$Debugger$History$size(history); - return A2( - $elm$core$Task$perform, - function (_v0) { - return $elm$browser$Debugger$Main$NoOp; - }, - A2( - _Debugger_download, - historyLength, - _Json_unwrap( - $elm$json$Json$Encode$object( - _List_fromArray( - [ - _Utils_Tuple2( - 'metadata', - $elm$browser$Debugger$Metadata$encode(metadata)), - _Utils_Tuple2( - 'history', - $elm$browser$Debugger$History$encode(history)) - ]))))); - }); -var $elm$browser$Debugger$Main$Vertical = F3( - function (a, b, c) { - return {$: 'Vertical', a: a, b: b, c: c}; - }); -var $elm$browser$Debugger$Main$drag = F2( - function (info, layout) { - if (layout.$ === 'Horizontal') { - var status = layout.a; - var y = layout.c; - return A3($elm$browser$Debugger$Main$Horizontal, status, info.x / info.width, y); - } else { - var status = layout.a; - var x = layout.b; - return A3($elm$browser$Debugger$Main$Vertical, status, x, info.y / info.height); - } - }); -var $elm$browser$Debugger$History$Stepping = F2( - function (a, b) { - return {$: 'Stepping', a: a, b: b}; - }); -var $elm$browser$Debugger$History$Done = F2( - function (a, b) { - return {$: 'Done', a: a, b: b}; - }); -var $elm$browser$Debugger$History$getHelp = F3( - function (update, msg, getResult) { - if (getResult.$ === 'Done') { - return getResult; - } else { - var n = getResult.a; - var model = getResult.b; - return (!n) ? A2( - $elm$browser$Debugger$History$Done, - msg, - A2(update, msg, model).a) : A2( - $elm$browser$Debugger$History$Stepping, - n - 1, - A2(update, msg, model).a); - } - }); -var $elm$browser$Debugger$History$undone = function (getResult) { - undone: - while (true) { - if (getResult.$ === 'Done') { - var msg = getResult.a; - var model = getResult.b; - return _Utils_Tuple2(model, msg); - } else { - var $temp$getResult = getResult; - getResult = $temp$getResult; - continue undone; - } - } -}; -var $elm$browser$Debugger$History$get = F3( - function (update, index, history) { - get: - while (true) { - var recent = history.recent; - var snapshotMax = history.numMessages - recent.numMessages; - if (_Utils_cmp(index, snapshotMax) > -1) { - return $elm$browser$Debugger$History$undone( - A3( - $elm$core$List$foldr, - $elm$browser$Debugger$History$getHelp(update), - A2($elm$browser$Debugger$History$Stepping, index - snapshotMax, recent.model), - recent.messages)); - } else { - var _v0 = A2($elm$core$Array$get, (index / $elm$browser$Debugger$History$maxSnapshotSize) | 0, history.snapshots); - if (_v0.$ === 'Nothing') { - var $temp$update = update, - $temp$index = index, - $temp$history = history; - update = $temp$update; - index = $temp$index; - history = $temp$history; - continue get; - } else { - var model = _v0.a.model; - var messages = _v0.a.messages; - return $elm$browser$Debugger$History$undone( - A3( - $elm$core$Array$foldr, - $elm$browser$Debugger$History$getHelp(update), - A2($elm$browser$Debugger$History$Stepping, index % $elm$browser$Debugger$History$maxSnapshotSize, model), - messages)); - } - } - } - }); -var $elm$browser$Debugger$History$getRecentMsg = function (history) { - getRecentMsg: - while (true) { - var _v0 = history.recent.messages; - if (!_v0.b) { - var $temp$history = history; - history = $temp$history; - continue getRecentMsg; - } else { - var first = _v0.a; - return first; - } - } -}; -var $elm$core$Dict$get = F2( - function (targetKey, dict) { - get: - while (true) { - if (dict.$ === 'RBEmpty_elm_builtin') { - return $elm$core$Maybe$Nothing; - } else { - var key = dict.b; - var value = dict.c; - var left = dict.d; - var right = dict.e; - var _v1 = A2($elm$core$Basics$compare, targetKey, key); - switch (_v1.$) { - case 'LT': - var $temp$targetKey = targetKey, - $temp$dict = left; - targetKey = $temp$targetKey; - dict = $temp$dict; - continue get; - case 'EQ': - return $elm$core$Maybe$Just(value); - default: - var $temp$targetKey = targetKey, - $temp$dict = right; - targetKey = $temp$targetKey; - dict = $temp$dict; - continue get; - } - } - } - }); -var $elm$browser$Debugger$Expando$mergeDictHelp = F3( - function (oldDict, key, value) { - var _v12 = A2($elm$core$Dict$get, key, oldDict); - if (_v12.$ === 'Nothing') { - return value; - } else { - var oldValue = _v12.a; - return A2($elm$browser$Debugger$Expando$mergeHelp, oldValue, value); - } - }); -var $elm$browser$Debugger$Expando$mergeHelp = F2( - function (old, _new) { - var _v3 = _Utils_Tuple2(old, _new); - _v3$6: - while (true) { - switch (_v3.b.$) { - case 'S': - return _new; - case 'Primitive': - return _new; - case 'Sequence': - if (_v3.a.$ === 'Sequence') { - var _v4 = _v3.a; - var isClosed = _v4.b; - var oldValues = _v4.c; - var _v5 = _v3.b; - var seqType = _v5.a; - var newValues = _v5.c; - return A3( - $elm$browser$Debugger$Expando$Sequence, - seqType, - isClosed, - A2($elm$browser$Debugger$Expando$mergeListHelp, oldValues, newValues)); - } else { - break _v3$6; - } - case 'Dictionary': - if (_v3.a.$ === 'Dictionary') { - var _v6 = _v3.a; - var isClosed = _v6.a; - var _v7 = _v3.b; - var keyValuePairs = _v7.b; - return A2($elm$browser$Debugger$Expando$Dictionary, isClosed, keyValuePairs); - } else { - break _v3$6; - } - case 'Record': - if (_v3.a.$ === 'Record') { - var _v8 = _v3.a; - var isClosed = _v8.a; - var oldDict = _v8.b; - var _v9 = _v3.b; - var newDict = _v9.b; - return A2( - $elm$browser$Debugger$Expando$Record, - isClosed, - A2( - $elm$core$Dict$map, - $elm$browser$Debugger$Expando$mergeDictHelp(oldDict), - newDict)); - } else { - break _v3$6; - } - default: - if (_v3.a.$ === 'Constructor') { - var _v10 = _v3.a; - var isClosed = _v10.b; - var oldValues = _v10.c; - var _v11 = _v3.b; - var maybeName = _v11.a; - var newValues = _v11.c; - return A3( - $elm$browser$Debugger$Expando$Constructor, - maybeName, - isClosed, - A2($elm$browser$Debugger$Expando$mergeListHelp, oldValues, newValues)); - } else { - break _v3$6; - } - } - } - return _new; - }); -var $elm$browser$Debugger$Expando$mergeListHelp = F2( - function (olds, news) { - var _v0 = _Utils_Tuple2(olds, news); - if (!_v0.a.b) { - return news; - } else { - if (!_v0.b.b) { - return news; - } else { - var _v1 = _v0.a; - var x = _v1.a; - var xs = _v1.b; - var _v2 = _v0.b; - var y = _v2.a; - var ys = _v2.b; - return A2( - $elm$core$List$cons, - A2($elm$browser$Debugger$Expando$mergeHelp, x, y), - A2($elm$browser$Debugger$Expando$mergeListHelp, xs, ys)); - } - } - }); -var $elm$browser$Debugger$Expando$merge = F2( - function (value, expando) { - return A2( - $elm$browser$Debugger$Expando$mergeHelp, - expando, - _Debugger_init(value)); - }); -var $elm$browser$Debugger$Main$jumpUpdate = F3( - function (update, index, model) { - var history = $elm$browser$Debugger$Main$cachedHistory(model); - var currentMsg = $elm$browser$Debugger$History$getRecentMsg(history); - var currentModel = $elm$browser$Debugger$Main$getLatestModel(model.state); - var _v0 = A3($elm$browser$Debugger$History$get, update, index, history); - var indexModel = _v0.a; - var indexMsg = _v0.b; - return _Utils_update( - model, - { - expandoModel: A2($elm$browser$Debugger$Expando$merge, indexModel, model.expandoModel), - expandoMsg: A2($elm$browser$Debugger$Expando$merge, indexMsg, model.expandoMsg), - state: A5($elm$browser$Debugger$Main$Paused, index, indexModel, currentModel, currentMsg, history) - }); - }); -var $elm$browser$Debugger$History$jsToElm = A2($elm$core$Basics$composeR, _Json_unwrap, _Debugger_unsafeCoerce); -var $elm$browser$Debugger$History$decoder = F2( - function (initialModel, update) { - var addMessage = F2( - function (rawMsg, _v0) { - var model = _v0.a; - var history = _v0.b; - var msg = $elm$browser$Debugger$History$jsToElm(rawMsg); - return _Utils_Tuple2( - A2(update, msg, model), - A3($elm$browser$Debugger$History$add, msg, model, history)); - }); - var updateModel = function (rawMsgs) { - return A3( - $elm$core$List$foldl, - addMessage, - _Utils_Tuple2( - initialModel, - $elm$browser$Debugger$History$empty(initialModel)), - rawMsgs); - }; - return A2( - $elm$json$Json$Decode$map, - updateModel, - $elm$json$Json$Decode$list($elm$json$Json$Decode$value)); - }); -var $elm$browser$Debugger$History$getInitialModel = function (_v0) { - var snapshots = _v0.snapshots; - var recent = _v0.recent; - var _v1 = A2($elm$core$Array$get, 0, snapshots); - if (_v1.$ === 'Just') { - var model = _v1.a.model; - return model; - } else { - return recent.model; - } -}; -var $elm$core$Platform$Cmd$none = $elm$core$Platform$Cmd$batch(_List_Nil); -var $elm$browser$Debugger$Main$loadNewHistory = F3( - function (rawHistory, update, model) { - var pureUserUpdate = F2( - function (msg, userModel) { - return A2(update, msg, userModel).a; - }); - var initialUserModel = $elm$browser$Debugger$History$getInitialModel(model.history); - var decoder = A2($elm$browser$Debugger$History$decoder, initialUserModel, pureUserUpdate); - var _v0 = A2($elm$json$Json$Decode$decodeValue, decoder, rawHistory); - if (_v0.$ === 'Err') { - return _Utils_Tuple2( - _Utils_update( - model, - {overlay: $elm$browser$Debugger$Overlay$corruptImport}), - $elm$core$Platform$Cmd$none); - } else { - var _v1 = _v0.a; - var latestUserModel = _v1.a; - var newHistory = _v1.b; - return _Utils_Tuple2( - _Utils_update( - model, - { - expandoModel: $elm$browser$Debugger$Expando$init(latestUserModel), - expandoMsg: $elm$browser$Debugger$Expando$init( - $elm$browser$Debugger$History$getRecentMsg(newHistory)), - history: newHistory, - overlay: $elm$browser$Debugger$Overlay$none, - state: $elm$browser$Debugger$Main$Running(latestUserModel) - }), - $elm$core$Platform$Cmd$none); - } - }); -var $elm$browser$Debugger$Main$scroll = function (popout) { - return A2( - $elm$core$Task$perform, - $elm$core$Basics$always($elm$browser$Debugger$Main$NoOp), - _Debugger_scroll(popout)); -}; -var $elm$browser$Debugger$Main$scrollTo = F2( - function (id, popout) { - return A2( - $elm$core$Task$perform, - $elm$core$Basics$always($elm$browser$Debugger$Main$NoOp), - A2(_Debugger_scrollTo, id, popout)); - }); -var $elm$browser$Debugger$Main$setDragStatus = F2( - function (status, layout) { - if (layout.$ === 'Horizontal') { - var x = layout.b; - var y = layout.c; - return A3($elm$browser$Debugger$Main$Horizontal, status, x, y); - } else { - var x = layout.b; - var y = layout.c; - return A3($elm$browser$Debugger$Main$Vertical, status, x, y); - } - }); -var $elm$browser$Debugger$Main$swapLayout = function (layout) { - if (layout.$ === 'Horizontal') { - var s = layout.a; - var x = layout.b; - var y = layout.c; - return A3($elm$browser$Debugger$Main$Vertical, s, x, y); - } else { - var s = layout.a; - var x = layout.b; - var y = layout.c; - return A3($elm$browser$Debugger$Main$Horizontal, s, x, y); - } -}; -var $elm$core$Dict$getMin = function (dict) { - getMin: - while (true) { - if ((dict.$ === 'RBNode_elm_builtin') && (dict.d.$ === 'RBNode_elm_builtin')) { - var left = dict.d; - var $temp$dict = left; - dict = $temp$dict; - continue getMin; - } else { - return dict; - } - } -}; -var $elm$core$Dict$moveRedLeft = function (dict) { - if (((dict.$ === 'RBNode_elm_builtin') && (dict.d.$ === 'RBNode_elm_builtin')) && (dict.e.$ === 'RBNode_elm_builtin')) { - if ((dict.e.d.$ === 'RBNode_elm_builtin') && (dict.e.d.a.$ === 'Red')) { - var clr = dict.a; - var k = dict.b; - var v = dict.c; - var _v1 = dict.d; - var lClr = _v1.a; - var lK = _v1.b; - var lV = _v1.c; - var lLeft = _v1.d; - var lRight = _v1.e; - var _v2 = dict.e; - var rClr = _v2.a; - var rK = _v2.b; - var rV = _v2.c; - var rLeft = _v2.d; - var _v3 = rLeft.a; - var rlK = rLeft.b; - var rlV = rLeft.c; - var rlL = rLeft.d; - var rlR = rLeft.e; - var rRight = _v2.e; - return A5( - $elm$core$Dict$RBNode_elm_builtin, - $elm$core$Dict$Red, - rlK, - rlV, - A5( - $elm$core$Dict$RBNode_elm_builtin, - $elm$core$Dict$Black, - k, - v, - A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, lK, lV, lLeft, lRight), - rlL), - A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Black, rK, rV, rlR, rRight)); - } else { - var clr = dict.a; - var k = dict.b; - var v = dict.c; - var _v4 = dict.d; - var lClr = _v4.a; - var lK = _v4.b; - var lV = _v4.c; - var lLeft = _v4.d; - var lRight = _v4.e; - var _v5 = dict.e; - var rClr = _v5.a; - var rK = _v5.b; - var rV = _v5.c; - var rLeft = _v5.d; - var rRight = _v5.e; - if (clr.$ === 'Black') { - return A5( - $elm$core$Dict$RBNode_elm_builtin, - $elm$core$Dict$Black, - k, - v, - A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, lK, lV, lLeft, lRight), - A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, rK, rV, rLeft, rRight)); - } else { - return A5( - $elm$core$Dict$RBNode_elm_builtin, - $elm$core$Dict$Black, - k, - v, - A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, lK, lV, lLeft, lRight), - A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, rK, rV, rLeft, rRight)); - } - } - } else { - return dict; - } -}; -var $elm$core$Dict$moveRedRight = function (dict) { - if (((dict.$ === 'RBNode_elm_builtin') && (dict.d.$ === 'RBNode_elm_builtin')) && (dict.e.$ === 'RBNode_elm_builtin')) { - if ((dict.d.d.$ === 'RBNode_elm_builtin') && (dict.d.d.a.$ === 'Red')) { - var clr = dict.a; - var k = dict.b; - var v = dict.c; - var _v1 = dict.d; - var lClr = _v1.a; - var lK = _v1.b; - var lV = _v1.c; - var _v2 = _v1.d; - var _v3 = _v2.a; - var llK = _v2.b; - var llV = _v2.c; - var llLeft = _v2.d; - var llRight = _v2.e; - var lRight = _v1.e; - var _v4 = dict.e; - var rClr = _v4.a; - var rK = _v4.b; - var rV = _v4.c; - var rLeft = _v4.d; - var rRight = _v4.e; - return A5( - $elm$core$Dict$RBNode_elm_builtin, - $elm$core$Dict$Red, - lK, - lV, - A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Black, llK, llV, llLeft, llRight), - A5( - $elm$core$Dict$RBNode_elm_builtin, - $elm$core$Dict$Black, - k, - v, - lRight, - A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, rK, rV, rLeft, rRight))); - } else { - var clr = dict.a; - var k = dict.b; - var v = dict.c; - var _v5 = dict.d; - var lClr = _v5.a; - var lK = _v5.b; - var lV = _v5.c; - var lLeft = _v5.d; - var lRight = _v5.e; - var _v6 = dict.e; - var rClr = _v6.a; - var rK = _v6.b; - var rV = _v6.c; - var rLeft = _v6.d; - var rRight = _v6.e; - if (clr.$ === 'Black') { - return A5( - $elm$core$Dict$RBNode_elm_builtin, - $elm$core$Dict$Black, - k, - v, - A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, lK, lV, lLeft, lRight), - A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, rK, rV, rLeft, rRight)); - } else { - return A5( - $elm$core$Dict$RBNode_elm_builtin, - $elm$core$Dict$Black, - k, - v, - A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, lK, lV, lLeft, lRight), - A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, rK, rV, rLeft, rRight)); - } - } - } else { - return dict; - } -}; -var $elm$core$Dict$removeHelpPrepEQGT = F7( - function (targetKey, dict, color, key, value, left, right) { - if ((left.$ === 'RBNode_elm_builtin') && (left.a.$ === 'Red')) { - var _v1 = left.a; - var lK = left.b; - var lV = left.c; - var lLeft = left.d; - var lRight = left.e; - return A5( - $elm$core$Dict$RBNode_elm_builtin, - color, - lK, - lV, - lLeft, - A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, key, value, lRight, right)); - } else { - _v2$2: - while (true) { - if ((right.$ === 'RBNode_elm_builtin') && (right.a.$ === 'Black')) { - if (right.d.$ === 'RBNode_elm_builtin') { - if (right.d.a.$ === 'Black') { - var _v3 = right.a; - var _v4 = right.d; - var _v5 = _v4.a; - return $elm$core$Dict$moveRedRight(dict); - } else { - break _v2$2; - } - } else { - var _v6 = right.a; - var _v7 = right.d; - return $elm$core$Dict$moveRedRight(dict); - } - } else { - break _v2$2; - } - } - return dict; - } - }); -var $elm$core$Dict$removeMin = function (dict) { - if ((dict.$ === 'RBNode_elm_builtin') && (dict.d.$ === 'RBNode_elm_builtin')) { - var color = dict.a; - var key = dict.b; - var value = dict.c; - var left = dict.d; - var lColor = left.a; - var lLeft = left.d; - var right = dict.e; - if (lColor.$ === 'Black') { - if ((lLeft.$ === 'RBNode_elm_builtin') && (lLeft.a.$ === 'Red')) { - var _v3 = lLeft.a; - return A5( - $elm$core$Dict$RBNode_elm_builtin, - color, - key, - value, - $elm$core$Dict$removeMin(left), - right); - } else { - var _v4 = $elm$core$Dict$moveRedLeft(dict); - if (_v4.$ === 'RBNode_elm_builtin') { - var nColor = _v4.a; - var nKey = _v4.b; - var nValue = _v4.c; - var nLeft = _v4.d; - var nRight = _v4.e; - return A5( - $elm$core$Dict$balance, - nColor, - nKey, - nValue, - $elm$core$Dict$removeMin(nLeft), - nRight); - } else { - return $elm$core$Dict$RBEmpty_elm_builtin; - } - } - } else { - return A5( - $elm$core$Dict$RBNode_elm_builtin, - color, - key, - value, - $elm$core$Dict$removeMin(left), - right); - } - } else { - return $elm$core$Dict$RBEmpty_elm_builtin; - } -}; -var $elm$core$Dict$removeHelp = F2( - function (targetKey, dict) { - if (dict.$ === 'RBEmpty_elm_builtin') { - return $elm$core$Dict$RBEmpty_elm_builtin; - } else { - var color = dict.a; - var key = dict.b; - var value = dict.c; - var left = dict.d; - var right = dict.e; - if (_Utils_cmp(targetKey, key) < 0) { - if ((left.$ === 'RBNode_elm_builtin') && (left.a.$ === 'Black')) { - var _v4 = left.a; - var lLeft = left.d; - if ((lLeft.$ === 'RBNode_elm_builtin') && (lLeft.a.$ === 'Red')) { - var _v6 = lLeft.a; - return A5( - $elm$core$Dict$RBNode_elm_builtin, - color, - key, - value, - A2($elm$core$Dict$removeHelp, targetKey, left), - right); - } else { - var _v7 = $elm$core$Dict$moveRedLeft(dict); - if (_v7.$ === 'RBNode_elm_builtin') { - var nColor = _v7.a; - var nKey = _v7.b; - var nValue = _v7.c; - var nLeft = _v7.d; - var nRight = _v7.e; - return A5( - $elm$core$Dict$balance, - nColor, - nKey, - nValue, - A2($elm$core$Dict$removeHelp, targetKey, nLeft), - nRight); - } else { - return $elm$core$Dict$RBEmpty_elm_builtin; - } - } - } else { - return A5( - $elm$core$Dict$RBNode_elm_builtin, - color, - key, - value, - A2($elm$core$Dict$removeHelp, targetKey, left), - right); - } - } else { - return A2( - $elm$core$Dict$removeHelpEQGT, - targetKey, - A7($elm$core$Dict$removeHelpPrepEQGT, targetKey, dict, color, key, value, left, right)); - } - } - }); -var $elm$core$Dict$removeHelpEQGT = F2( - function (targetKey, dict) { - if (dict.$ === 'RBNode_elm_builtin') { - var color = dict.a; - var key = dict.b; - var value = dict.c; - var left = dict.d; - var right = dict.e; - if (_Utils_eq(targetKey, key)) { - var _v1 = $elm$core$Dict$getMin(right); - if (_v1.$ === 'RBNode_elm_builtin') { - var minKey = _v1.b; - var minValue = _v1.c; - return A5( - $elm$core$Dict$balance, - color, - minKey, - minValue, - left, - $elm$core$Dict$removeMin(right)); - } else { - return $elm$core$Dict$RBEmpty_elm_builtin; - } - } else { - return A5( - $elm$core$Dict$balance, - color, - key, - value, - left, - A2($elm$core$Dict$removeHelp, targetKey, right)); - } - } else { - return $elm$core$Dict$RBEmpty_elm_builtin; - } - }); -var $elm$core$Dict$remove = F2( - function (key, dict) { - var _v0 = A2($elm$core$Dict$removeHelp, key, dict); - if ((_v0.$ === 'RBNode_elm_builtin') && (_v0.a.$ === 'Red')) { - var _v1 = _v0.a; - var k = _v0.b; - var v = _v0.c; - var l = _v0.d; - var r = _v0.e; - return A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Black, k, v, l, r); - } else { - var x = _v0; - return x; - } - }); -var $elm$core$Dict$update = F3( - function (targetKey, alter, dictionary) { - var _v0 = alter( - A2($elm$core$Dict$get, targetKey, dictionary)); - if (_v0.$ === 'Just') { - var value = _v0.a; - return A3($elm$core$Dict$insert, targetKey, value, dictionary); - } else { - return A2($elm$core$Dict$remove, targetKey, dictionary); - } - }); -var $elm$browser$Debugger$Expando$updateIndex = F3( - function (n, func, list) { - if (!list.b) { - return _List_Nil; - } else { - var x = list.a; - var xs = list.b; - return (n <= 0) ? A2( - $elm$core$List$cons, - func(x), - xs) : A2( - $elm$core$List$cons, - x, - A3($elm$browser$Debugger$Expando$updateIndex, n - 1, func, xs)); - } - }); -var $elm$browser$Debugger$Expando$update = F2( - function (msg, value) { - switch (value.$) { - case 'S': - return value; - case 'Primitive': - return value; - case 'Sequence': - var seqType = value.a; - var isClosed = value.b; - var valueList = value.c; - switch (msg.$) { - case 'Toggle': - return A3($elm$browser$Debugger$Expando$Sequence, seqType, !isClosed, valueList); - case 'Index': - if (msg.a.$ === 'None') { - var _v3 = msg.a; - var index = msg.b; - var subMsg = msg.c; - return A3( - $elm$browser$Debugger$Expando$Sequence, - seqType, - isClosed, - A3( - $elm$browser$Debugger$Expando$updateIndex, - index, - $elm$browser$Debugger$Expando$update(subMsg), - valueList)); - } else { - return value; - } - default: - return value; - } - case 'Dictionary': - var isClosed = value.a; - var keyValuePairs = value.b; - switch (msg.$) { - case 'Toggle': - return A2($elm$browser$Debugger$Expando$Dictionary, !isClosed, keyValuePairs); - case 'Index': - var redirect = msg.a; - var index = msg.b; - var subMsg = msg.c; - switch (redirect.$) { - case 'None': - return value; - case 'Key': - return A2( - $elm$browser$Debugger$Expando$Dictionary, - isClosed, - A3( - $elm$browser$Debugger$Expando$updateIndex, - index, - function (_v6) { - var k = _v6.a; - var v = _v6.b; - return _Utils_Tuple2( - A2($elm$browser$Debugger$Expando$update, subMsg, k), - v); - }, - keyValuePairs)); - default: - return A2( - $elm$browser$Debugger$Expando$Dictionary, - isClosed, - A3( - $elm$browser$Debugger$Expando$updateIndex, - index, - function (_v7) { - var k = _v7.a; - var v = _v7.b; - return _Utils_Tuple2( - k, - A2($elm$browser$Debugger$Expando$update, subMsg, v)); - }, - keyValuePairs)); - } - default: - return value; - } - case 'Record': - var isClosed = value.a; - var valueDict = value.b; - switch (msg.$) { - case 'Toggle': - return A2($elm$browser$Debugger$Expando$Record, !isClosed, valueDict); - case 'Index': - return value; - default: - var field = msg.a; - var subMsg = msg.b; - return A2( - $elm$browser$Debugger$Expando$Record, - isClosed, - A3( - $elm$core$Dict$update, - field, - $elm$browser$Debugger$Expando$updateField(subMsg), - valueDict)); - } - default: - var maybeName = value.a; - var isClosed = value.b; - var valueList = value.c; - switch (msg.$) { - case 'Toggle': - return A3($elm$browser$Debugger$Expando$Constructor, maybeName, !isClosed, valueList); - case 'Index': - if (msg.a.$ === 'None') { - var _v10 = msg.a; - var index = msg.b; - var subMsg = msg.c; - return A3( - $elm$browser$Debugger$Expando$Constructor, - maybeName, - isClosed, - A3( - $elm$browser$Debugger$Expando$updateIndex, - index, - $elm$browser$Debugger$Expando$update(subMsg), - valueList)); - } else { - return value; - } - default: - return value; - } - } - }); -var $elm$browser$Debugger$Expando$updateField = F2( - function (msg, maybeExpando) { - if (maybeExpando.$ === 'Nothing') { - return maybeExpando; - } else { - var expando = maybeExpando.a; - return $elm$core$Maybe$Just( - A2($elm$browser$Debugger$Expando$update, msg, expando)); - } - }); -var $elm$browser$Debugger$Main$Upload = function (a) { - return {$: 'Upload', a: a}; -}; -var $elm$browser$Debugger$Main$upload = function (popout) { - return A2( - $elm$core$Task$perform, - $elm$browser$Debugger$Main$Upload, - _Debugger_upload(popout)); -}; -var $elm$browser$Debugger$Overlay$BadMetadata = function (a) { - return {$: 'BadMetadata', a: a}; -}; -var $elm$browser$Debugger$Overlay$badMetadata = $elm$browser$Debugger$Overlay$BadMetadata; -var $elm$browser$Debugger$Main$withGoodMetadata = F2( - function (model, func) { - var _v0 = model.metadata; - if (_v0.$ === 'Ok') { - var metadata = _v0.a; - return func(metadata); - } else { - var error = _v0.a; - return _Utils_Tuple2( - _Utils_update( - model, - { - overlay: $elm$browser$Debugger$Overlay$badMetadata(error) - }), - $elm$core$Platform$Cmd$none); - } - }); -var $elm$browser$Debugger$Main$wrapUpdate = F3( - function (update, msg, model) { - wrapUpdate: - while (true) { - switch (msg.$) { - case 'NoOp': - return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none); - case 'UserMsg': - var userMsg = msg.a; - var userModel = $elm$browser$Debugger$Main$getLatestModel(model.state); - var newHistory = A3($elm$browser$Debugger$History$add, userMsg, userModel, model.history); - var _v1 = A2(update, userMsg, userModel); - var newUserModel = _v1.a; - var userCmds = _v1.b; - var commands = A2($elm$core$Platform$Cmd$map, $elm$browser$Debugger$Main$UserMsg, userCmds); - var _v2 = model.state; - if (_v2.$ === 'Running') { - return _Utils_Tuple2( - _Utils_update( - model, - { - expandoModel: A2($elm$browser$Debugger$Expando$merge, newUserModel, model.expandoModel), - expandoMsg: A2($elm$browser$Debugger$Expando$merge, userMsg, model.expandoMsg), - history: newHistory, - state: $elm$browser$Debugger$Main$Running(newUserModel) - }), - $elm$core$Platform$Cmd$batch( - _List_fromArray( - [ - commands, - $elm$browser$Debugger$Main$scroll(model.popout) - ]))); - } else { - var index = _v2.a; - var indexModel = _v2.b; - var history = _v2.e; - return _Utils_Tuple2( - _Utils_update( - model, - { - history: newHistory, - state: A5($elm$browser$Debugger$Main$Paused, index, indexModel, newUserModel, userMsg, history) - }), - commands); - } - case 'TweakExpandoMsg': - var eMsg = msg.a; - return _Utils_Tuple2( - _Utils_update( - model, - { - expandoMsg: A2($elm$browser$Debugger$Expando$update, eMsg, model.expandoMsg) - }), - $elm$core$Platform$Cmd$none); - case 'TweakExpandoModel': - var eMsg = msg.a; - return _Utils_Tuple2( - _Utils_update( - model, - { - expandoModel: A2($elm$browser$Debugger$Expando$update, eMsg, model.expandoModel) - }), - $elm$core$Platform$Cmd$none); - case 'Resume': - var _v3 = model.state; - if (_v3.$ === 'Running') { - return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none); - } else { - var userModel = _v3.c; - var userMsg = _v3.d; - return _Utils_Tuple2( - _Utils_update( - model, - { - expandoModel: A2($elm$browser$Debugger$Expando$merge, userModel, model.expandoModel), - expandoMsg: A2($elm$browser$Debugger$Expando$merge, userMsg, model.expandoMsg), - state: $elm$browser$Debugger$Main$Running(userModel) - }), - $elm$browser$Debugger$Main$scroll(model.popout)); - } - case 'Jump': - var index = msg.a; - return _Utils_Tuple2( - A3($elm$browser$Debugger$Main$jumpUpdate, update, index, model), - $elm$core$Platform$Cmd$none); - case 'SliderJump': - var index = msg.a; - return _Utils_Tuple2( - A3($elm$browser$Debugger$Main$jumpUpdate, update, index, model), - A2( - $elm$browser$Debugger$Main$scrollTo, - $elm$browser$Debugger$History$idForMessageIndex(index), - model.popout)); - case 'Open': - return _Utils_Tuple2( - model, - A2( - $elm$core$Task$perform, - $elm$core$Basics$always($elm$browser$Debugger$Main$NoOp), - _Debugger_open(model.popout))); - case 'Up': - var _v4 = model.state; - if (_v4.$ === 'Running') { - return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none); - } else { - var i = _v4.a; - var history = _v4.e; - var targetIndex = i + 1; - if (_Utils_cmp( - targetIndex, - $elm$browser$Debugger$History$size(history)) < 0) { - var $temp$update = update, - $temp$msg = $elm$browser$Debugger$Main$SliderJump(targetIndex), - $temp$model = model; - update = $temp$update; - msg = $temp$msg; - model = $temp$model; - continue wrapUpdate; - } else { - var $temp$update = update, - $temp$msg = $elm$browser$Debugger$Main$Resume, - $temp$model = model; - update = $temp$update; - msg = $temp$msg; - model = $temp$model; - continue wrapUpdate; - } - } - case 'Down': - var _v5 = model.state; - if (_v5.$ === 'Running') { - var $temp$update = update, - $temp$msg = $elm$browser$Debugger$Main$Jump( - $elm$browser$Debugger$History$size(model.history) - 1), - $temp$model = model; - update = $temp$update; - msg = $temp$msg; - model = $temp$model; - continue wrapUpdate; - } else { - var index = _v5.a; - if (index > 0) { - var $temp$update = update, - $temp$msg = $elm$browser$Debugger$Main$SliderJump(index - 1), - $temp$model = model; - update = $temp$update; - msg = $temp$msg; - model = $temp$model; - continue wrapUpdate; - } else { - return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none); - } - } - case 'Import': - return A2( - $elm$browser$Debugger$Main$withGoodMetadata, - model, - function (_v6) { - return _Utils_Tuple2( - model, - $elm$browser$Debugger$Main$upload(model.popout)); - }); - case 'Export': - return A2( - $elm$browser$Debugger$Main$withGoodMetadata, - model, - function (metadata) { - return _Utils_Tuple2( - model, - A2($elm$browser$Debugger$Main$download, metadata, model.history)); - }); - case 'Upload': - var jsonString = msg.a; - return A2( - $elm$browser$Debugger$Main$withGoodMetadata, - model, - function (metadata) { - var _v7 = A2($elm$browser$Debugger$Overlay$assessImport, metadata, jsonString); - if (_v7.$ === 'Err') { - var newOverlay = _v7.a; - return _Utils_Tuple2( - _Utils_update( - model, - {overlay: newOverlay}), - $elm$core$Platform$Cmd$none); - } else { - var rawHistory = _v7.a; - return A3($elm$browser$Debugger$Main$loadNewHistory, rawHistory, update, model); - } - }); - case 'OverlayMsg': - var overlayMsg = msg.a; - var _v8 = A2($elm$browser$Debugger$Overlay$close, overlayMsg, model.overlay); - if (_v8.$ === 'Nothing') { - return _Utils_Tuple2( - _Utils_update( - model, - {overlay: $elm$browser$Debugger$Overlay$none}), - $elm$core$Platform$Cmd$none); - } else { - var rawHistory = _v8.a; - return A3($elm$browser$Debugger$Main$loadNewHistory, rawHistory, update, model); - } - case 'SwapLayout': - return _Utils_Tuple2( - _Utils_update( - model, - { - layout: $elm$browser$Debugger$Main$swapLayout(model.layout) - }), - $elm$core$Platform$Cmd$none); - case 'DragStart': - return _Utils_Tuple2( - _Utils_update( - model, - { - layout: A2($elm$browser$Debugger$Main$setDragStatus, $elm$browser$Debugger$Main$Moving, model.layout) - }), - $elm$core$Platform$Cmd$none); - case 'Drag': - var info = msg.a; - return _Utils_Tuple2( - _Utils_update( - model, - { - layout: A2($elm$browser$Debugger$Main$drag, info, model.layout) - }), - $elm$core$Platform$Cmd$none); - default: - return _Utils_Tuple2( - _Utils_update( - model, - { - layout: A2($elm$browser$Debugger$Main$setDragStatus, $elm$browser$Debugger$Main$Static, model.layout) - }), - $elm$core$Platform$Cmd$none); - } - } - }); -var $elm$browser$Browser$External = function (a) { - return {$: 'External', a: a}; -}; -var $elm$browser$Browser$Internal = function (a) { - return {$: 'Internal', a: a}; -}; -var $elm$browser$Browser$Dom$NotFound = function (a) { - return {$: 'NotFound', a: a}; -}; -var $elm$url$Url$Http = {$: 'Http'}; -var $elm$url$Url$Https = {$: 'Https'}; -var $elm$url$Url$Url = F6( - function (protocol, host, port_, path, query, fragment) { - return {fragment: fragment, host: host, path: path, port_: port_, protocol: protocol, query: query}; - }); -var $elm$core$String$dropLeft = F2( - function (n, string) { - return (n < 1) ? string : A3( - $elm$core$String$slice, - n, - $elm$core$String$length(string), - string); - }); -var $elm$core$String$indexes = _String_indexes; -var $elm$core$String$isEmpty = function (string) { - return string === ''; -}; -var $elm$url$Url$chompBeforePath = F5( - function (protocol, path, params, frag, str) { - if ($elm$core$String$isEmpty(str) || A2($elm$core$String$contains, '@', str)) { - return $elm$core$Maybe$Nothing; - } else { - var _v0 = A2($elm$core$String$indexes, ':', str); - if (!_v0.b) { - return $elm$core$Maybe$Just( - A6($elm$url$Url$Url, protocol, str, $elm$core$Maybe$Nothing, path, params, frag)); - } else { - if (!_v0.b.b) { - var i = _v0.a; - var _v1 = $elm$core$String$toInt( - A2($elm$core$String$dropLeft, i + 1, str)); - if (_v1.$ === 'Nothing') { - return $elm$core$Maybe$Nothing; - } else { - var port_ = _v1; - return $elm$core$Maybe$Just( - A6( - $elm$url$Url$Url, - protocol, - A2($elm$core$String$left, i, str), - port_, - path, - params, - frag)); - } - } else { - return $elm$core$Maybe$Nothing; - } - } - } - }); -var $elm$url$Url$chompBeforeQuery = F4( - function (protocol, params, frag, str) { - if ($elm$core$String$isEmpty(str)) { - return $elm$core$Maybe$Nothing; - } else { - var _v0 = A2($elm$core$String$indexes, '/', str); - if (!_v0.b) { - return A5($elm$url$Url$chompBeforePath, protocol, '/', params, frag, str); - } else { - var i = _v0.a; - return A5( - $elm$url$Url$chompBeforePath, - protocol, - A2($elm$core$String$dropLeft, i, str), - params, - frag, - A2($elm$core$String$left, i, str)); - } - } - }); -var $elm$url$Url$chompBeforeFragment = F3( - function (protocol, frag, str) { - if ($elm$core$String$isEmpty(str)) { - return $elm$core$Maybe$Nothing; - } else { - var _v0 = A2($elm$core$String$indexes, '?', str); - if (!_v0.b) { - return A4($elm$url$Url$chompBeforeQuery, protocol, $elm$core$Maybe$Nothing, frag, str); - } else { - var i = _v0.a; - return A4( - $elm$url$Url$chompBeforeQuery, - protocol, - $elm$core$Maybe$Just( - A2($elm$core$String$dropLeft, i + 1, str)), - frag, - A2($elm$core$String$left, i, str)); - } - } - }); -var $elm$url$Url$chompAfterProtocol = F2( - function (protocol, str) { - if ($elm$core$String$isEmpty(str)) { - return $elm$core$Maybe$Nothing; - } else { - var _v0 = A2($elm$core$String$indexes, '#', str); - if (!_v0.b) { - return A3($elm$url$Url$chompBeforeFragment, protocol, $elm$core$Maybe$Nothing, str); - } else { - var i = _v0.a; - return A3( - $elm$url$Url$chompBeforeFragment, - protocol, - $elm$core$Maybe$Just( - A2($elm$core$String$dropLeft, i + 1, str)), - A2($elm$core$String$left, i, str)); - } - } - }); -var $elm$core$String$startsWith = _String_startsWith; -var $elm$url$Url$fromString = function (str) { - return A2($elm$core$String$startsWith, 'http://', str) ? A2( - $elm$url$Url$chompAfterProtocol, - $elm$url$Url$Http, - A2($elm$core$String$dropLeft, 7, str)) : (A2($elm$core$String$startsWith, 'https://', str) ? A2( - $elm$url$Url$chompAfterProtocol, - $elm$url$Url$Https, - A2($elm$core$String$dropLeft, 8, str)) : $elm$core$Maybe$Nothing); -}; -var $elm$core$Basics$never = function (_v0) { - never: - while (true) { - var nvr = _v0.a; - var $temp$_v0 = nvr; - _v0 = $temp$_v0; - continue never; - } -}; -var $elm$browser$Browser$element = _Browser_element; -var $elm$core$Platform$Sub$batch = _Platform_batch; -var $elm$core$Platform$Sub$none = $elm$core$Platform$Sub$batch(_List_Nil); -var $author$project$Entry$ItemEditor = function (a) { - return {$: 'ItemEditor', a: a}; -}; -var $author$project$Entry$ReceiveSearchResults = function (a) { - return {$: 'ReceiveSearchResults', a: a}; -}; -var $elm$http$Http$BadStatus_ = F2( - function (a, b) { - return {$: 'BadStatus_', a: a, b: b}; - }); -var $elm$http$Http$BadUrl_ = function (a) { - return {$: 'BadUrl_', a: a}; -}; -var $elm$http$Http$GoodStatus_ = F2( - function (a, b) { - return {$: 'GoodStatus_', a: a, b: b}; - }); -var $elm$http$Http$NetworkError_ = {$: 'NetworkError_'}; -var $elm$http$Http$Receiving = function (a) { - return {$: 'Receiving', a: a}; -}; -var $elm$http$Http$Sending = function (a) { - return {$: 'Sending', a: a}; -}; -var $elm$http$Http$Timeout_ = {$: 'Timeout_'}; -var $elm$core$Maybe$isJust = function (maybe) { - if (maybe.$ === 'Just') { - return true; - } else { - return false; - } -}; -var $elm$core$Platform$sendToSelf = _Platform_sendToSelf; -var $elm$http$Http$expectStringResponse = F2( - function (toMsg, toResult) { - return A3( - _Http_expect, - '', - $elm$core$Basics$identity, - A2($elm$core$Basics$composeR, toResult, toMsg)); - }); -var $elm$core$Result$mapError = F2( - function (f, result) { - if (result.$ === 'Ok') { - var v = result.a; - return $elm$core$Result$Ok(v); - } else { - var e = result.a; - return $elm$core$Result$Err( - f(e)); - } - }); -var $elm$http$Http$BadBody = function (a) { - return {$: 'BadBody', a: a}; -}; -var $elm$http$Http$BadStatus = function (a) { - return {$: 'BadStatus', a: a}; -}; -var $elm$http$Http$BadUrl = function (a) { - return {$: 'BadUrl', a: a}; -}; -var $elm$http$Http$NetworkError = {$: 'NetworkError'}; -var $elm$http$Http$Timeout = {$: 'Timeout'}; -var $elm$http$Http$resolve = F2( - function (toResult, response) { - switch (response.$) { - case 'BadUrl_': - var url = response.a; - return $elm$core$Result$Err( - $elm$http$Http$BadUrl(url)); - case 'Timeout_': - return $elm$core$Result$Err($elm$http$Http$Timeout); - case 'NetworkError_': - return $elm$core$Result$Err($elm$http$Http$NetworkError); - case 'BadStatus_': - var metadata = response.a; - return $elm$core$Result$Err( - $elm$http$Http$BadStatus(metadata.statusCode)); - default: - var body = response.b; - return A2( - $elm$core$Result$mapError, - $elm$http$Http$BadBody, - toResult(body)); - } - }); -var $elm$http$Http$expectJson = F2( - function (toMsg, decoder) { - return A2( - $elm$http$Http$expectStringResponse, - toMsg, - $elm$http$Http$resolve( - function (string) { - return A2( - $elm$core$Result$mapError, - $elm$json$Json$Decode$errorToString, - A2($elm$json$Json$Decode$decodeString, decoder, string)); - })); - }); -var $elm$core$List$filter = F2( - function (isGood, list) { - return A3( - $elm$core$List$foldr, - F2( - function (x, xs) { - return isGood(x) ? A2($elm$core$List$cons, x, xs) : xs; - }), - _List_Nil, - list); - }); -var $elm$core$List$head = function (list) { - if (list.b) { - var x = list.a; - var xs = list.b; - return $elm$core$Maybe$Just(x); - } else { - return $elm$core$Maybe$Nothing; - } -}; -var $author$project$Entry$find = F2( - function (pred, xs) { - return $elm$core$List$head( - A2($elm$core$List$filter, pred, xs)); - }); -var $author$project$NumberInput$Model = F3( - function (value, original, convert) { - return {convert: convert, original: original, value: value}; - }); -var $elm$core$String$toFloat = _String_toFloat; -var $author$project$NumberInput$fromFloat = function (x) { - return A3( - $author$project$NumberInput$Model, - $elm$core$Maybe$Just(x), - $elm$core$String$fromFloat(x), - $elm$core$String$toFloat); -}; -var $author$project$NumberInput$fromInt = function (x) { - return A3( - $author$project$NumberInput$Model, - $elm$core$Maybe$Just(x), - $elm$core$String$fromInt(x), - $elm$core$String$toInt); -}; -var $elm$http$Http$emptyBody = _Http_emptyBody; -var $elm$http$Http$Request = function (a) { - return {$: 'Request', a: a}; -}; -var $elm$http$Http$State = F2( - function (reqs, subs) { - return {reqs: reqs, subs: subs}; - }); -var $elm$http$Http$init = $elm$core$Task$succeed( - A2($elm$http$Http$State, $elm$core$Dict$empty, _List_Nil)); -var $elm$core$Process$kill = _Scheduler_kill; -var $elm$core$Process$spawn = _Scheduler_spawn; -var $elm$http$Http$updateReqs = F3( - function (router, cmds, reqs) { - updateReqs: - while (true) { - if (!cmds.b) { - return $elm$core$Task$succeed(reqs); - } else { - var cmd = cmds.a; - var otherCmds = cmds.b; - if (cmd.$ === 'Cancel') { - var tracker = cmd.a; - var _v2 = A2($elm$core$Dict$get, tracker, reqs); - if (_v2.$ === 'Nothing') { - var $temp$router = router, - $temp$cmds = otherCmds, - $temp$reqs = reqs; - router = $temp$router; - cmds = $temp$cmds; - reqs = $temp$reqs; - continue updateReqs; - } else { - var pid = _v2.a; - return A2( - $elm$core$Task$andThen, - function (_v3) { - return A3( - $elm$http$Http$updateReqs, - router, - otherCmds, - A2($elm$core$Dict$remove, tracker, reqs)); - }, - $elm$core$Process$kill(pid)); - } - } else { - var req = cmd.a; - return A2( - $elm$core$Task$andThen, - function (pid) { - var _v4 = req.tracker; - if (_v4.$ === 'Nothing') { - return A3($elm$http$Http$updateReqs, router, otherCmds, reqs); - } else { - var tracker = _v4.a; - return A3( - $elm$http$Http$updateReqs, - router, - otherCmds, - A3($elm$core$Dict$insert, tracker, pid, reqs)); - } - }, - $elm$core$Process$spawn( - A3( - _Http_toTask, - router, - $elm$core$Platform$sendToApp(router), - req))); - } - } - } - }); -var $elm$http$Http$onEffects = F4( - function (router, cmds, subs, state) { - return A2( - $elm$core$Task$andThen, - function (reqs) { - return $elm$core$Task$succeed( - A2($elm$http$Http$State, reqs, subs)); - }, - A3($elm$http$Http$updateReqs, router, cmds, state.reqs)); - }); -var $elm$http$Http$maybeSend = F4( - function (router, desiredTracker, progress, _v0) { - var actualTracker = _v0.a; - var toMsg = _v0.b; - return _Utils_eq(desiredTracker, actualTracker) ? $elm$core$Maybe$Just( - A2( - $elm$core$Platform$sendToApp, - router, - toMsg(progress))) : $elm$core$Maybe$Nothing; - }); -var $elm$http$Http$onSelfMsg = F3( - function (router, _v0, state) { - var tracker = _v0.a; - var progress = _v0.b; - return A2( - $elm$core$Task$andThen, - function (_v1) { - return $elm$core$Task$succeed(state); - }, - $elm$core$Task$sequence( - A2( - $elm$core$List$filterMap, - A3($elm$http$Http$maybeSend, router, tracker, progress), - state.subs))); - }); -var $elm$http$Http$Cancel = function (a) { - return {$: 'Cancel', a: a}; -}; -var $elm$http$Http$cmdMap = F2( - function (func, cmd) { - if (cmd.$ === 'Cancel') { - var tracker = cmd.a; - return $elm$http$Http$Cancel(tracker); - } else { - var r = cmd.a; - return $elm$http$Http$Request( - { - allowCookiesFromOtherDomains: r.allowCookiesFromOtherDomains, - body: r.body, - expect: A2(_Http_mapExpect, func, r.expect), - headers: r.headers, - method: r.method, - timeout: r.timeout, - tracker: r.tracker, - url: r.url - }); - } - }); -var $elm$http$Http$MySub = F2( - function (a, b) { - return {$: 'MySub', a: a, b: b}; - }); -var $elm$http$Http$subMap = F2( - function (func, _v0) { - var tracker = _v0.a; - var toMsg = _v0.b; - return A2( - $elm$http$Http$MySub, - tracker, - A2($elm$core$Basics$composeR, toMsg, func)); - }); -_Platform_effectManagers['Http'] = _Platform_createManager($elm$http$Http$init, $elm$http$Http$onEffects, $elm$http$Http$onSelfMsg, $elm$http$Http$cmdMap, $elm$http$Http$subMap); -var $elm$http$Http$command = _Platform_leaf('Http'); -var $elm$http$Http$subscription = _Platform_leaf('Http'); -var $elm$http$Http$request = function (r) { - return $elm$http$Http$command( - $elm$http$Http$Request( - {allowCookiesFromOtherDomains: false, body: r.body, expect: r.expect, headers: r.headers, method: r.method, timeout: r.timeout, tracker: r.tracker, url: r.url})); -}; -var $elm$http$Http$get = function (r) { - return $elm$http$Http$request( - {body: $elm$http$Http$emptyBody, expect: r.expect, headers: _List_Nil, method: 'GET', timeout: $elm$core$Maybe$Nothing, tracker: $elm$core$Maybe$Nothing, url: r.url}); -}; -var $author$project$Calculator$Gross = {$: 'Gross'}; -var $author$project$Calculator$Model = F3( - function (tax, bundlePrice, bundleSize) { - return {bundlePrice: bundlePrice, bundleSize: bundleSize, tax: tax}; - }); -var $author$project$Calculator$Net = {$: 'Net'}; -var $author$project$Calculator$ctShow = function (ct) { - if (ct.$ === 'Gross') { - return 'Brutto'; - } else { - return 'Netto'; - } -}; -var $author$project$Select$Model = F4( - function (identify, show, selected, options) { - return {identify: identify, options: options, selected: selected, show: show}; - }); -var $author$project$Select$init = $author$project$Select$Model; -var $author$project$Calculator$init = function (bundlePrice) { - return A3( - $author$project$Calculator$Model, - A4( - $author$project$Select$init, - $author$project$Calculator$ctShow, - $author$project$Calculator$ctShow, - $author$project$Calculator$Net, - _List_fromArray( - [$author$project$Calculator$Net, $author$project$Calculator$Gross])), - $author$project$NumberInput$fromFloat(bundlePrice), - $author$project$NumberInput$fromInt(1)); -}; -var $author$project$Entry$SearchResult = function (barcode) { - return function (name) { - return function (netUnitPrice) { - return function (bought) { - return function (salesUnits) { - return function (available) { - return function (locationName) { - return function (locationId) { - return function (groupName) { - return function (groupId) { - return function (taxGroupId) { - return {available: available, barcode: barcode, bought: bought, groupId: groupId, groupName: groupName, locationId: locationId, locationName: locationName, name: name, netUnitPrice: netUnitPrice, salesUnits: salesUnits, taxGroupId: taxGroupId}; - }; - }; - }; - }; - }; - }; - }; - }; - }; - }; -}; -var $elm$json$Json$Decode$bool = _Json_decodeBool; -var $NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$custom = $elm$json$Json$Decode$map2($elm$core$Basics$apR); -var $NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required = F3( - function (key, valDecoder, decoder) { - return A2( - $NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$custom, - A2($elm$json$Json$Decode$field, key, valDecoder), - decoder); - }); -var $author$project$Entry$searchResultDecoder = A3( - $NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required, - 'tax_group_id', - $elm$json$Json$Decode$int, - A3( - $NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required, - 'group_id', - $elm$json$Json$Decode$int, - A3( - $NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required, - 'group_name', - $elm$json$Json$Decode$string, - A3( - $NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required, - 'location_id', - $elm$json$Json$Decode$int, - A3( - $NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required, - 'location_name', - $elm$json$Json$Decode$string, - A3( - $NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required, - 'available', - $elm$json$Json$Decode$bool, - A3( - $NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required, - 'sales_units', - $elm$json$Json$Decode$int, - A3( - $NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required, - 'bought', - $elm$json$Json$Decode$string, - A3( - $NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required, - 'unit_price', - $elm$json$Json$Decode$float, - A3( - $NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required, - 'name', - $elm$json$Json$Decode$string, - A3( - $NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required, - 'item_barcode', - $elm$json$Json$Decode$string, - $elm$json$Json$Decode$succeed($author$project$Entry$SearchResult)))))))))))); -var $elm$core$Basics$pow = _Basics_pow; -var $elm$core$Basics$round = _Basics_round; -var $author$project$Entry$roundTo = F2( - function (places, x) { - return $elm$core$Basics$round( - x * A2($elm$core$Basics$pow, 10, places)) / A2($elm$core$Basics$pow, 10, places); - }); -var $author$project$Entry$suggestedGrossPrice = F2( - function (netPrice, percentage) { - return A2($author$project$Entry$roundTo, 2, (netPrice * (1 + percentage)) + 0.01); - }); -var $author$project$NumberInput$update = F2( - function (str, model) { - return _Utils_update( - model, - { - original: str, - value: model.convert(str) - }); - }); -var $author$project$Select$find = F2( - function (pred, xs) { - return $elm$core$List$head( - A2($elm$core$List$filter, pred, xs)); - }); -var $author$project$Select$update = F2( - function (key, model) { - var _v0 = A2( - $author$project$Select$find, - function (x) { - return _Utils_eq( - key, - model.identify(x)); - }, - model.options); - if (_v0.$ === 'Nothing') { - return model; - } else { - var x = _v0.a; - return _Utils_update( - model, - {selected: x}); - } - }); -var $author$project$Calculator$update = F2( - function (msg, model) { - switch (msg.$) { - case 'SetTax': - var key = msg.a; - return _Utils_update( - model, - { - tax: A2($author$project$Select$update, key, model.tax) - }); - case 'SetBundlePrice': - var str = msg.a; - return _Utils_update( - model, - { - bundlePrice: A2($author$project$NumberInput$update, str, model.bundlePrice) - }); - default: - var str = msg.a; - return _Utils_update( - model, - { - bundleSize: A2($author$project$NumberInput$update, str, model.bundleSize) - }); - } - }); -var $author$project$Entry$updateState = F3( - function (msg, globals, state) { - if (state.$ === 'ItemSearch') { - var model = state.a; - _v1$4: - while (true) { - switch (msg.$) { - case 'SetSearchTerm': - var searchTerm = msg.a; - return _Utils_Tuple2( - $author$project$Entry$ItemSearch( - _Utils_update( - model, - {searchTerm: searchTerm})), - $elm$core$Platform$Cmd$none); - case 'SubmitSearch': - return _Utils_Tuple2( - state, - $elm$http$Http$get( - { - expect: A2( - $elm$http$Http$expectJson, - $author$project$Entry$ReceiveSearchResults, - $elm$json$Json$Decode$list($author$project$Entry$searchResultDecoder)), - url: '/entry/api/search-items?search-term=' + model.searchTerm - })); - case 'ReceiveSearchResults': - if (msg.a.$ === 'Ok') { - var searchResults = msg.a.a; - return _Utils_Tuple2( - $author$project$Entry$ItemSearch( - _Utils_update( - model, - {searchResults: searchResults})), - $elm$core$Platform$Cmd$none); - } else { - break _v1$4; - } - case 'GotoItemEditor': - var searchResult = msg.a; - var _v2 = A2( - $author$project$Entry$find, - function (tg) { - return _Utils_eq(tg.id, searchResult.taxGroupId); - }, - globals.taxGroups); - if (_v2.$ === 'Nothing') { - return _Utils_Tuple2(state, $elm$core$Platform$Cmd$none); - } else { - var taxGroup = _v2.a; - return _Utils_Tuple2( - $author$project$Entry$ItemEditor( - { - barcode: searchResult.barcode, - calculator: $author$project$Calculator$init(searchResult.netUnitPrice), - grossUnitPrice: $author$project$NumberInput$fromFloat( - A2($author$project$Entry$suggestedGrossPrice, searchResult.netUnitPrice, taxGroup.percentage)), - group: A4( - $author$project$Select$init, - A2( - $elm$core$Basics$composeR, - function ($) { - return $.id; - }, - $elm$core$String$fromInt), - function ($) { - return $.name; - }, - {id: searchResult.groupId, name: searchResult.groupName}, - globals.groups), - location: A4( - $author$project$Select$init, - A2( - $elm$core$Basics$composeR, - function ($) { - return $.id; - }, - $elm$core$String$fromInt), - function ($) { - return $.name; - }, - {id: searchResult.locationId, name: searchResult.locationName}, - globals.locations), - name: searchResult.name, - netUnitPrice: $author$project$NumberInput$fromFloat(searchResult.netUnitPrice), - salesUnits: $author$project$NumberInput$fromInt(searchResult.salesUnits), - taxGroup: A4( - $author$project$Select$init, - A2( - $elm$core$Basics$composeR, - function ($) { - return $.id; - }, - $elm$core$String$fromInt), - function ($) { - return $.description; - }, - taxGroup, - globals.taxGroups) - }), - $elm$core$Platform$Cmd$none); - } - default: - break _v1$4; - } - } - return _Utils_Tuple2(state, $elm$core$Platform$Cmd$none); - } else { - var model = state.a; - switch (msg.$) { - case 'SetBarcode': - var barcode = msg.a; - return _Utils_Tuple2( - $author$project$Entry$ItemEditor( - _Utils_update( - model, - {barcode: barcode})), - $elm$core$Platform$Cmd$none); - case 'SetName': - var name = msg.a; - return _Utils_Tuple2( - $author$project$Entry$ItemEditor( - _Utils_update( - model, - {name: name})), - $elm$core$Platform$Cmd$none); - case 'SetSalesUnits': - var str = msg.a; - return _Utils_Tuple2( - $author$project$Entry$ItemEditor( - _Utils_update( - model, - { - salesUnits: A2($author$project$NumberInput$update, str, model.salesUnits) - })), - $elm$core$Platform$Cmd$none); - case 'CalculatorMsg': - var msg_ = msg.a; - return _Utils_Tuple2( - $author$project$Entry$ItemEditor( - _Utils_update( - model, - { - calculator: A2($author$project$Calculator$update, msg_, model.calculator) - })), - $elm$core$Platform$Cmd$none); - case 'SetNetUnitPrice': - var str = msg.a; - return _Utils_Tuple2( - $author$project$Entry$ItemEditor( - _Utils_update( - model, - { - netUnitPrice: A2($author$project$NumberInput$update, str, model.netUnitPrice) - })), - $elm$core$Platform$Cmd$none); - case 'SetGrossUnitPrice': - var str = msg.a; - return _Utils_Tuple2( - $author$project$Entry$ItemEditor( - _Utils_update( - model, - { - grossUnitPrice: A2($author$project$NumberInput$update, str, model.grossUnitPrice) - })), - $elm$core$Platform$Cmd$none); - case 'SetGroup': - var key = msg.a; - return _Utils_Tuple2( - $author$project$Entry$ItemEditor( - _Utils_update( - model, - { - group: A2($author$project$Select$update, key, model.group) - })), - $elm$core$Platform$Cmd$none); - case 'SetLocation': - var key = msg.a; - return _Utils_Tuple2( - $author$project$Entry$ItemEditor( - _Utils_update( - model, - { - location: A2($author$project$Select$update, key, model.location) - })), - $elm$core$Platform$Cmd$none); - case 'SetTaxGroup': - var key = msg.a; - return _Utils_Tuple2( - $author$project$Entry$ItemEditor( - _Utils_update( - model, - { - taxGroup: A2($author$project$Select$update, key, model.taxGroup) - })), - $elm$core$Platform$Cmd$none); - default: - return _Utils_Tuple2(state, $elm$core$Platform$Cmd$none); - } - } - }); -var $author$project$Entry$update = F2( - function (msg, _v0) { - var globals = _v0.globals; - var state = _v0.state; - var _v1 = A3($author$project$Entry$updateState, msg, globals, state); - var state_ = _v1.a; - var cmd = _v1.b; - return _Utils_Tuple2( - {globals: globals, state: state_}, - cmd); - }); -var $author$project$Entry$CalculatorMsg = function (a) { - return {$: 'CalculatorMsg', a: a}; -}; -var $author$project$Entry$SetBarcode = function (a) { - return {$: 'SetBarcode', a: a}; -}; -var $author$project$Entry$SetGrossUnitPrice = function (a) { - return {$: 'SetGrossUnitPrice', a: a}; -}; -var $author$project$Entry$SetGroup = function (a) { - return {$: 'SetGroup', a: a}; -}; -var $author$project$Entry$SetLocation = function (a) { - return {$: 'SetLocation', a: a}; -}; -var $author$project$Entry$SetName = function (a) { - return {$: 'SetName', a: a}; -}; -var $author$project$Entry$SetNetUnitPrice = function (a) { - return {$: 'SetNetUnitPrice', a: a}; -}; -var $author$project$Entry$SetSalesUnits = function (a) { - return {$: 'SetSalesUnits', a: a}; -}; -var $author$project$Entry$SetSearchTerm = function (a) { - return {$: 'SetSearchTerm', a: a}; -}; -var $author$project$Entry$SetTaxGroup = function (a) { - return {$: 'SetTaxGroup', a: a}; -}; -var $author$project$Entry$SubmitSearch = {$: 'SubmitSearch'}; -var $elm$html$Html$fieldset = _VirtualDom_node('fieldset'); -var $elm$html$Html$Attributes$for = $elm$html$Html$Attributes$stringProperty('htmlFor'); -var $elm$html$Html$form = _VirtualDom_node('form'); -var $author$project$Select$get = function ($) { - return $.selected; -}; -var $elm$html$Html$label = _VirtualDom_node('label'); -var $elm$html$Html$legend = _VirtualDom_node('legend'); -var $elm$html$Html$Attributes$method = $elm$html$Html$Attributes$stringProperty('method'); -var $elm$html$Html$Attributes$name = $elm$html$Html$Attributes$stringProperty('name'); -var $elm$html$Html$Events$alwaysPreventDefault = function (msg) { - return _Utils_Tuple2(msg, true); -}; -var $elm$virtual_dom$VirtualDom$MayPreventDefault = function (a) { - return {$: 'MayPreventDefault', a: a}; -}; -var $elm$html$Html$Events$preventDefaultOn = F2( - function (event, decoder) { - return A2( - $elm$virtual_dom$VirtualDom$on, - event, - $elm$virtual_dom$VirtualDom$MayPreventDefault(decoder)); - }); -var $elm$html$Html$Events$onSubmit = function (msg) { - return A2( - $elm$html$Html$Events$preventDefaultOn, - 'submit', - A2( - $elm$json$Json$Decode$map, - $elm$html$Html$Events$alwaysPreventDefault, - $elm$json$Json$Decode$succeed(msg))); -}; -var $elm$html$Html$th = _VirtualDom_node('th'); -var $elm$html$Html$tr = _VirtualDom_node('tr'); -var $author$project$Entry$searchResultHeaders = A2( - $elm$html$Html$tr, - _List_Nil, - _List_fromArray( - [ - A2( - $elm$html$Html$th, - _List_Nil, - _List_fromArray( - [ - $elm$html$Html$text('Barcode') - ])), - A2( - $elm$html$Html$th, - _List_Nil, - _List_fromArray( - [ - $elm$html$Html$text('Name') - ])), - A2( - $elm$html$Html$th, - _List_Nil, - _List_fromArray( - [ - $elm$html$Html$text('Gruppe') - ])), - A2( - $elm$html$Html$th, - _List_Nil, - _List_fromArray( - [ - $elm$html$Html$text('Stückpreis (Netto)') - ])), - A2( - $elm$html$Html$th, - _List_Nil, - _List_fromArray( - [ - $elm$html$Html$text('Eingekauft') - ])), - A2( - $elm$html$Html$th, - _List_Nil, - _List_fromArray( - [ - $elm$html$Html$text('Kaufdatum') - ])), - A2( - $elm$html$Html$th, - _List_Nil, - _List_fromArray( - [ - $elm$html$Html$text('Raum') - ])), - A2( - $elm$html$Html$th, - _List_Nil, - _List_fromArray( - [ - $elm$html$Html$text('Aktiv?') - ])), - A2($elm$html$Html$th, _List_Nil, _List_Nil) - ])); -var $author$project$NumberInput$show = function ($) { - return $.original; -}; -var $elm$html$Html$Attributes$step = function (n) { - return A2($elm$html$Html$Attributes$stringProperty, 'step', n); -}; -var $elm$html$Html$table = _VirtualDom_node('table'); -var $author$project$Calculator$SetBundlePrice = function (a) { - return {$: 'SetBundlePrice', a: a}; -}; -var $author$project$Calculator$SetBundleSize = function (a) { - return {$: 'SetBundleSize', a: a}; -}; -var $author$project$Calculator$SetTax = function (a) { - return {$: 'SetTax', a: a}; -}; -var $elm$json$Json$Encode$bool = _Json_wrap; -var $elm$html$Html$Attributes$boolProperty = F2( - function (key, bool) { - return A2( - _VirtualDom_property, - key, - $elm$json$Json$Encode$bool(bool)); - }); -var $elm$html$Html$Attributes$disabled = $elm$html$Html$Attributes$boolProperty('disabled'); -var $author$project$NumberInput$get = function ($) { - return $.value; -}; -var $author$project$Calculator$roundTo = F2( - function (places, x) { - return $elm$core$Basics$round( - x * A2($elm$core$Basics$pow, 10, places)) / A2($elm$core$Basics$pow, 10, places); - }); -var $author$project$Calculator$getResult = F2( - function (model, taxGroup) { - var _v0 = _Utils_Tuple2( - $author$project$NumberInput$get(model.bundlePrice), - $author$project$NumberInput$get(model.bundleSize)); - if ((_v0.a.$ === 'Just') && (_v0.b.$ === 'Just')) { - var bundlePrice = _v0.a.a; - var bundleSize = _v0.b.a; - return $elm$core$Maybe$Just( - A2( - $author$project$Calculator$roundTo, - 2, - _Utils_eq( - $author$project$Select$get(model.tax), - $author$project$Calculator$Gross) ? ((bundlePrice / bundleSize) / (1 + taxGroup.percentage)) : (bundlePrice / bundleSize))); - } else { - return $elm$core$Maybe$Nothing; - } - }); -var $elm$core$Maybe$map = F2( - function (f, maybe) { - if (maybe.$ === 'Just') { - var value = maybe.a; - return $elm$core$Maybe$Just( - f(value)); - } else { - return $elm$core$Maybe$Nothing; - } - }); -var $elm$html$Html$Attributes$placeholder = $elm$html$Html$Attributes$stringProperty('placeholder'); -var $elm$html$Html$option = _VirtualDom_node('option'); -var $elm$html$Html$select = _VirtualDom_node('select'); -var $elm$html$Html$Attributes$selected = $elm$html$Html$Attributes$boolProperty('selected'); -var $author$project$Select$view = F3( - function (attributes, msg, model) { - var viewOption = function (x) { - return A2( - $elm$html$Html$option, - _List_fromArray( - [ - $elm$html$Html$Attributes$selected( - _Utils_eq( - model.identify(model.selected), - model.identify(x))), - $elm$html$Html$Attributes$value( - model.identify(x)) - ]), - _List_fromArray( - [ - $elm$html$Html$text( - model.show(x)) - ])); - }; - return A2( - $elm$html$Html$select, - _Utils_ap( - _List_fromArray( - [ - $elm$html$Html$Events$onInput(msg) - ]), - attributes), - A2($elm$core$List$map, viewOption, model.options)); - }); -var $author$project$Calculator$view = F2( - function (model, taxGroup) { - var taxPart = _List_fromArray( - [ - $elm$html$Html$text(' ÷ '), - A2( - $elm$html$Html$div, - _List_fromArray( - [ - $elm$html$Html$Attributes$class('form-input --inline') - ]), - _List_fromArray( - [ - A2( - $elm$html$Html$label, - _List_fromArray( - [ - $elm$html$Html$Attributes$for('tax') - ]), - _List_fromArray( - [ - $elm$html$Html$text('Steuer') - ])), - A2( - $elm$html$Html$input, - _List_fromArray( - [ - $elm$html$Html$Attributes$value( - $elm$core$String$fromFloat(1 + taxGroup.percentage)), - $elm$html$Html$Attributes$id('tax'), - $elm$html$Html$Attributes$type_('number'), - $elm$html$Html$Attributes$step('0.01'), - $elm$html$Html$Attributes$disabled(true) - ]), - _List_Nil) - ])) - ]); - var resultPart = _List_fromArray( - [ - $elm$html$Html$text(' = '), - $elm$html$Html$text( - A2( - $elm$core$Maybe$withDefault, - '?', - A2( - $elm$core$Maybe$map, - $elm$core$String$fromFloat, - A2($author$project$Calculator$getResult, model, taxGroup)))) - ]); - var mainPart = _List_fromArray( - [ - $elm$html$Html$text('('), - A2( - $elm$html$Html$div, - _List_fromArray( - [ - $elm$html$Html$Attributes$class('form-input --inline') - ]), - _List_fromArray( - [ - A2( - $elm$html$Html$label, - _List_fromArray( - [ - $elm$html$Html$Attributes$for('bundle-price') - ]), - _List_fromArray( - [ - $elm$html$Html$text('Gebindepreis') - ])), - A2( - $elm$html$Html$input, - _List_fromArray( - [ - $elm$html$Html$Attributes$placeholder('Gebindepreis'), - $elm$html$Html$Attributes$value( - $author$project$NumberInput$show(model.bundlePrice)), - $elm$html$Html$Events$onInput($author$project$Calculator$SetBundlePrice), - $elm$html$Html$Attributes$id('bundle-price'), - $elm$html$Html$Attributes$type_('number'), - $elm$html$Html$Attributes$step('0.01') - ]), - _List_Nil) - ])), - $elm$html$Html$text(' ÷ '), - A2( - $elm$html$Html$div, - _List_fromArray( - [ - $elm$html$Html$Attributes$class('form-input --inline') - ]), - _List_fromArray( - [ - A2( - $elm$html$Html$label, - _List_fromArray( - [ - $elm$html$Html$Attributes$for('bundle-size') - ]), - _List_fromArray( - [ - $elm$html$Html$text('Gebindegröße') - ])), - A2( - $elm$html$Html$input, - _List_fromArray( - [ - $elm$html$Html$Attributes$placeholder('Gebindegröße'), - $elm$html$Html$Attributes$value( - $author$project$NumberInput$show(model.bundleSize)), - $elm$html$Html$Events$onInput($author$project$Calculator$SetBundleSize), - $elm$html$Html$Attributes$id('bundle-size'), - $elm$html$Html$Attributes$type_('number'), - $elm$html$Html$Attributes$step('1') - ]), - _List_Nil) - ])), - $elm$html$Html$text(') ') - ]); - return A2( - $elm$html$Html$fieldset, - _List_Nil, - _List_fromArray( - [ - A2( - $elm$html$Html$legend, - _List_Nil, - _List_fromArray( - [ - $elm$html$Html$text('Preisrechner') - ])), - A2( - $elm$html$Html$div, - _List_Nil, - $elm$core$List$concat( - A2( - $elm$core$List$filterMap, - $elm$core$Basics$identity, - _List_fromArray( - [ - $elm$core$Maybe$Just(mainPart), - _Utils_eq( - $author$project$Select$get(model.tax), - $author$project$Calculator$Gross) ? $elm$core$Maybe$Just(taxPart) : $elm$core$Maybe$Nothing, - $elm$core$Maybe$Just(resultPart) - ])))), - A2( - $elm$html$Html$div, - _List_fromArray( - [ - $elm$html$Html$Attributes$class('form-input') - ]), - _List_fromArray( - [ - A2( - $elm$html$Html$label, - _List_fromArray( - [ - $elm$html$Html$Attributes$for('calculator-tax') - ]), - _List_fromArray( - [ - $elm$html$Html$text('Gebindepreis ist') - ])), - A3($author$project$Select$view, _List_Nil, $author$project$Calculator$SetTax, model.tax) - ])) - ])); - }); -var $author$project$Entry$GotoItemEditor = function (a) { - return {$: 'GotoItemEditor', a: a}; -}; -var $author$project$Entry$showBool = function (b) { - if (b) { - return '✅'; - } else { - return '❌'; - } -}; -var $elm$html$Html$td = _VirtualDom_node('td'); -var $author$project$Entry$viewSearchResult = function (model) { - return A2( - $elm$html$Html$tr, - _List_Nil, - _List_fromArray( - [ - A2( - $elm$html$Html$td, - _List_Nil, - _List_fromArray( - [ - A2( - $elm$html$Html$code, - _List_Nil, - _List_fromArray( - [ - $elm$html$Html$text(model.barcode) - ])) - ])), - A2( - $elm$html$Html$td, - _List_Nil, - _List_fromArray( - [ - $elm$html$Html$text(model.name) - ])), - A2( - $elm$html$Html$td, - _List_Nil, - _List_fromArray( - [ - $elm$html$Html$text(model.groupName) - ])), - A2( - $elm$html$Html$td, - _List_Nil, - _List_fromArray( - [ - $elm$html$Html$text( - $elm$core$String$fromFloat(model.netUnitPrice)) - ])), - A2( - $elm$html$Html$td, - _List_Nil, - _List_fromArray( - [ - $elm$html$Html$text( - $elm$core$String$fromInt(model.salesUnits)) - ])), - A2( - $elm$html$Html$td, - _List_Nil, - _List_fromArray( - [ - $elm$html$Html$text(model.bought) - ])), - A2( - $elm$html$Html$td, - _List_Nil, - _List_fromArray( - [ - $elm$html$Html$text(model.locationName) - ])), - A2( - $elm$html$Html$td, - _List_Nil, - _List_fromArray( - [ - $elm$html$Html$text( - $author$project$Entry$showBool(model.available)) - ])), - A2( - $elm$html$Html$td, - _List_Nil, - _List_fromArray( - [ - A2( - $elm$html$Html$button, - _List_fromArray( - [ - $elm$html$Html$Events$onClick( - $author$project$Entry$GotoItemEditor(model)) - ]), - _List_fromArray( - [ - $elm$html$Html$text('Als Vorlage verwenden') - ])) - ])) - ])); -}; -var $author$project$Entry$viewSetCalculatedPriceButton = function (model) { - var _v0 = A2( - $author$project$Calculator$getResult, - model.calculator, - $author$project$Select$get(model.taxGroup)); - if (_v0.$ === 'Nothing') { - return A2( - $elm$html$Html$button, - _List_fromArray( - [ - $elm$html$Html$Attributes$disabled(true) - ]), - _List_fromArray( - [ - $elm$html$Html$text('Auf ? setzen') - ])); - } else { - var calculatedPrice = _v0.a; - return A2( - $elm$html$Html$button, - _List_fromArray( - [ - $elm$html$Html$Events$onClick( - $author$project$Entry$SetNetUnitPrice( - $elm$core$String$fromFloat(calculatedPrice))), - $elm$html$Html$Attributes$type_('button') - ]), - _List_fromArray( - [ - $elm$html$Html$text( - 'Auf ' + ($elm$core$String$fromFloat(calculatedPrice) + ' setzen')) - ])); - } -}; -var $author$project$Entry$viewSetSuggestedPriceButton = function (model) { - var _v0 = $author$project$NumberInput$get(model.netUnitPrice); - if (_v0.$ === 'Nothing') { - return A2( - $elm$html$Html$button, - _List_fromArray( - [ - $elm$html$Html$Attributes$disabled(true) - ]), - _List_fromArray( - [ - $elm$html$Html$text('Auf ? setzen') - ])); - } else { - var netUnitPrice = _v0.a; - var grossUnitPrice = A2( - $author$project$Entry$suggestedGrossPrice, - netUnitPrice, - $author$project$Select$get(model.taxGroup).percentage); - return A2( - $elm$html$Html$button, - _List_fromArray( - [ - $elm$html$Html$Events$onClick( - $author$project$Entry$SetGrossUnitPrice( - $elm$core$String$fromFloat(grossUnitPrice))), - $elm$html$Html$Attributes$type_('button') - ]), - _List_fromArray( - [ - $elm$html$Html$text( - 'Auf ' + ($elm$core$String$fromFloat(grossUnitPrice) + ' setzen')) - ])); - } -}; -var $author$project$Entry$view = function (_v0) { - var globals = _v0.globals; - var state = _v0.state; - if (state.$ === 'ItemSearch') { - var model = state.a; - return A2( - $elm$html$Html$fieldset, - _List_Nil, - _List_fromArray( - [ - A2( - $elm$html$Html$legend, - _List_Nil, - _List_fromArray( - [ - $elm$html$Html$text('Vorlage für Auftrag wählen') - ])), - A2( - $elm$html$Html$form, - _List_fromArray( - [ - $elm$html$Html$Events$onSubmit($author$project$Entry$SubmitSearch) - ]), - _List_fromArray( - [ - A2( - $elm$html$Html$div, - _List_fromArray( - [ - $elm$html$Html$Attributes$class('form-input') - ]), - _List_fromArray( - [ - A2( - $elm$html$Html$label, - _List_fromArray( - [ - $elm$html$Html$Attributes$for('search-term'), - $elm$html$Html$Attributes$title('Barcode oder Name') - ]), - _List_fromArray( - [ - $elm$html$Html$text('Suchbegriff') - ])), - A2( - $elm$html$Html$input, - _List_fromArray( - [ - $elm$html$Html$Events$onInput($author$project$Entry$SetSearchTerm), - $elm$html$Html$Attributes$value(model.searchTerm), - $elm$html$Html$Attributes$id('search-term') - ]), - _List_Nil) - ])), - A2( - $elm$html$Html$table, - _List_Nil, - A2( - $elm$core$List$cons, - $author$project$Entry$searchResultHeaders, - A2($elm$core$List$map, $author$project$Entry$viewSearchResult, model.searchResults))) - ])) - ])); - } else { - var model = state.a; - return A2( - $elm$html$Html$form, - _List_fromArray( - [ - $elm$html$Html$Attributes$method('POST') - ]), - _List_fromArray( - [ - A2( - $elm$html$Html$fieldset, - _List_Nil, - _List_fromArray( - [ - A2( - $elm$html$Html$legend, - _List_Nil, - _List_fromArray( - [ - $elm$html$Html$text('Neuer Inventareintrag') - ])), - A2( - $elm$html$Html$div, - _List_fromArray( - [ - $elm$html$Html$Attributes$class('form-input') - ]), - _List_fromArray( - [ - A2( - $elm$html$Html$label, - _List_fromArray( - [ - $elm$html$Html$Attributes$for('barcode') - ]), - _List_fromArray( - [ - $elm$html$Html$text('Barcode') - ])), - A2( - $elm$html$Html$input, - _List_fromArray( - [ - $elm$html$Html$Events$onInput($author$project$Entry$SetBarcode), - $elm$html$Html$Attributes$value(model.barcode), - $elm$html$Html$Attributes$name('barcode'), - $elm$html$Html$Attributes$id('barcode') - ]), - _List_Nil) - ])), - A2( - $elm$html$Html$div, - _List_fromArray( - [ - $elm$html$Html$Attributes$class('form-input') - ]), - _List_fromArray( - [ - A2( - $elm$html$Html$label, - _List_fromArray( - [ - $elm$html$Html$Attributes$for('name') - ]), - _List_fromArray( - [ - $elm$html$Html$text('Name') - ])), - A2( - $elm$html$Html$input, - _List_fromArray( - [ - $elm$html$Html$Events$onInput($author$project$Entry$SetName), - $elm$html$Html$Attributes$value(model.name), - $elm$html$Html$Attributes$name('name'), - $elm$html$Html$Attributes$id('name') - ]), - _List_Nil) - ])), - A2( - $elm$html$Html$div, - _List_fromArray( - [ - $elm$html$Html$Attributes$class('form-input') - ]), - _List_fromArray( - [ - A2( - $elm$html$Html$label, - _List_fromArray( - [ - $elm$html$Html$Attributes$for('sales-units') - ]), - _List_fromArray( - [ - $elm$html$Html$text('Eingekauft') - ])), - A2( - $elm$html$Html$input, - _List_fromArray( - [ - $elm$html$Html$Events$onInput($author$project$Entry$SetSalesUnits), - $elm$html$Html$Attributes$value( - $author$project$NumberInput$show(model.salesUnits)), - $elm$html$Html$Attributes$name('sales-units'), - $elm$html$Html$Attributes$id('sales-units'), - $elm$html$Html$Attributes$type_('number') - ]), - _List_Nil) - ])), - A2( - $elm$html$Html$div, - _List_fromArray( - [ - $elm$html$Html$Attributes$class('form-input') - ]), - _List_fromArray( - [ - A2( - $elm$html$Html$label, - _List_fromArray( - [ - $elm$html$Html$Attributes$for('group') - ]), - _List_fromArray( - [ - $elm$html$Html$text('Gruppe') - ])), - A3( - $author$project$Select$view, - _List_fromArray( - [ - $elm$html$Html$Attributes$name('group'), - $elm$html$Html$Attributes$id('group') - ]), - $author$project$Entry$SetGroup, - model.group) - ])), - A2( - $elm$html$Html$div, - _List_fromArray( - [ - $elm$html$Html$Attributes$class('form-input') - ]), - _List_fromArray( - [ - A2( - $elm$html$Html$label, - _List_fromArray( - [ - $elm$html$Html$Attributes$for('location') - ]), - _List_fromArray( - [ - $elm$html$Html$text('Raum') - ])), - A3( - $author$project$Select$view, - _List_fromArray( - [ - $elm$html$Html$Attributes$name('location'), - $elm$html$Html$Attributes$id('location') - ]), - $author$project$Entry$SetLocation, - model.location) - ])), - A2( - $elm$html$Html$div, - _List_fromArray( - [ - $elm$html$Html$Attributes$class('form-input') - ]), - _List_fromArray( - [ - A2( - $elm$html$Html$label, - _List_fromArray( - [ - $elm$html$Html$Attributes$for('tax-group') - ]), - _List_fromArray( - [ - $elm$html$Html$text('Steuergruppe') - ])), - A3( - $author$project$Select$view, - _List_fromArray( - [ - $elm$html$Html$Attributes$name('tax-group'), - $elm$html$Html$Attributes$id('tax-group') - ]), - $author$project$Entry$SetTaxGroup, - model.taxGroup) - ])), - A2( - $elm$html$Html$map, - $author$project$Entry$CalculatorMsg, - A2( - $author$project$Calculator$view, - model.calculator, - $author$project$Select$get(model.taxGroup))), - A2( - $elm$html$Html$div, - _List_fromArray( - [ - $elm$html$Html$Attributes$class('form-input') - ]), - _List_fromArray( - [ - A2( - $elm$html$Html$label, - _List_fromArray( - [ - $elm$html$Html$Attributes$for('net-unit-price') - ]), - _List_fromArray( - [ - $elm$html$Html$text('Einkaufspreis (Netto)') - ])), - A2( - $elm$html$Html$input, - _List_fromArray( - [ - $elm$html$Html$Attributes$value( - $author$project$NumberInput$show(model.netUnitPrice)), - $elm$html$Html$Events$onInput($author$project$Entry$SetNetUnitPrice), - $elm$html$Html$Attributes$type_('number'), - $elm$html$Html$Attributes$name('net-unit-price'), - $elm$html$Html$Attributes$id('net-unit-price'), - $elm$html$Html$Attributes$step('0.01') - ]), - _List_Nil), - $author$project$Entry$viewSetCalculatedPriceButton(model) - ])), - A2( - $elm$html$Html$div, - _List_fromArray( - [ - $elm$html$Html$Attributes$class('form-input') - ]), - _List_fromArray( - [ - A2( - $elm$html$Html$label, - _List_fromArray( - [ - $elm$html$Html$Attributes$for('gross-unit-price') - ]), - _List_fromArray( - [ - $elm$html$Html$text('Verkaufspreis (Brutto)') - ])), - A2( - $elm$html$Html$input, - _List_fromArray( - [ - $elm$html$Html$Attributes$value( - $author$project$NumberInput$show(model.grossUnitPrice)), - $elm$html$Html$Events$onInput($author$project$Entry$SetGrossUnitPrice), - $elm$html$Html$Attributes$type_('number'), - $elm$html$Html$Attributes$name('gross-unit-price'), - $elm$html$Html$Attributes$id('gross-unit-price'), - $elm$html$Html$Attributes$step('0.01') - ]), - _List_Nil), - $author$project$Entry$viewSetSuggestedPriceButton(model) - ])), - A2( - $elm$html$Html$button, - _List_Nil, - _List_fromArray( - [ - $elm$html$Html$text('Auftrag anlegen') - ])) - ])) - ])); - } -}; -var $author$project$Entry$main = $elm$browser$Browser$element( - { - init: function (globals) { - return _Utils_Tuple2( - A2( - $author$project$Entry$Context, - globals, - $author$project$Entry$ItemSearch( - {searchResults: _List_Nil, searchTerm: ''})), - $elm$core$Platform$Cmd$none); - }, - subscriptions: function (_v0) { - return $elm$core$Platform$Sub$none; - }, - update: $author$project$Entry$update, - view: $author$project$Entry$view - }); -_Platform_export({'Entry':{'init':$author$project$Entry$main( - A2( - $elm$json$Json$Decode$andThen, - function (taxGroups) { - return A2( - $elm$json$Json$Decode$andThen, - function (locations) { - return A2( - $elm$json$Json$Decode$andThen, - function (groups) { - return $elm$json$Json$Decode$succeed( - {groups: groups, locations: locations, taxGroups: taxGroups}); - }, - A2( - $elm$json$Json$Decode$field, - 'groups', - $elm$json$Json$Decode$list( - A2( - $elm$json$Json$Decode$andThen, - function (name) { - return A2( - $elm$json$Json$Decode$andThen, - function (id) { - return $elm$json$Json$Decode$succeed( - {id: id, name: name}); - }, - A2($elm$json$Json$Decode$field, 'id', $elm$json$Json$Decode$int)); - }, - A2($elm$json$Json$Decode$field, 'name', $elm$json$Json$Decode$string))))); - }, - A2( - $elm$json$Json$Decode$field, - 'locations', - $elm$json$Json$Decode$list( - A2( - $elm$json$Json$Decode$andThen, - function (name) { - return A2( - $elm$json$Json$Decode$andThen, - function (id) { - return $elm$json$Json$Decode$succeed( - {id: id, name: name}); - }, - A2($elm$json$Json$Decode$field, 'id', $elm$json$Json$Decode$int)); - }, - A2($elm$json$Json$Decode$field, 'name', $elm$json$Json$Decode$string))))); - }, - A2( - $elm$json$Json$Decode$field, - 'taxGroups', - $elm$json$Json$Decode$list( - A2( - $elm$json$Json$Decode$andThen, - function (percentage) { - return A2( - $elm$json$Json$Decode$andThen, - function (id) { - return A2( - $elm$json$Json$Decode$andThen, - function (description) { - return $elm$json$Json$Decode$succeed( - {description: description, id: id, percentage: percentage}); - }, - A2($elm$json$Json$Decode$field, 'description', $elm$json$Json$Decode$string)); - }, - A2($elm$json$Json$Decode$field, 'id', $elm$json$Json$Decode$int)); - }, - A2($elm$json$Json$Decode$field, 'percentage', $elm$json$Json$Decode$float))))))({"versions":{"elm":"0.19.1"},"types":{"message":"Entry.Msg","aliases":{"Entry.SearchResult":{"args":[],"type":"{ barcode : String.String, name : String.String, netUnitPrice : Basics.Float, bought : String.String, salesUnits : Basics.Int, available : Basics.Bool, locationName : String.String, locationId : Basics.Int, groupName : String.String, groupId : Basics.Int, taxGroupId : Basics.Int }"}},"unions":{"Entry.Msg":{"args":[],"tags":{"SetSearchTerm":["String.String"],"SubmitSearch":[],"ReceiveSearchResults":["Result.Result Http.Error (List.List Entry.SearchResult)"],"GotoItemEditor":["Entry.SearchResult"],"SetBarcode":["String.String"],"SetName":["String.String"],"SetSalesUnits":["String.String"],"CalculatorMsg":["Calculator.Msg"],"SetNetUnitPrice":["String.String"],"SetGrossUnitPrice":["String.String"],"SetGroup":["String.String"],"SetLocation":["String.String"],"SetTaxGroup":["String.String"]}},"Basics.Bool":{"args":[],"tags":{"True":[],"False":[]}},"Http.Error":{"args":[],"tags":{"BadUrl":["String.String"],"Timeout":[],"NetworkError":[],"BadStatus":["Basics.Int"],"BadBody":["String.String"]}},"Basics.Float":{"args":[],"tags":{"Float":[]}},"Basics.Int":{"args":[],"tags":{"Int":[]}},"List.List":{"args":["a"],"tags":{}},"Calculator.Msg":{"args":[],"tags":{"SetTax":["String.String"],"SetBundlePrice":["String.String"],"SetBundleSize":["String.String"]}},"Result.Result":{"args":["error","value"],"tags":{"Ok":["value"],"Err":["error"]}},"String.String":{"args":[],"tags":{"String":[]}}}}})}});}(this)); \ No newline at end of file diff --git a/jon/templates/entry/index.html b/jon/templates/entry/index.html index 6956836..fcb5d1b 100644 --- a/jon/templates/entry/index.html +++ b/jon/templates/entry/index.html @@ -8,9 +8,9 @@ Barcode Name Eingekauft - Gruppen-ID - Raum-ID - Steuergruppen-ID + Gruppe + Raum + Steuergruppe EK-Preis (Netto) VK-Preis (Brutto) Aktionen @@ -20,9 +20,9 @@ {{ cart_item.barcode }} {{ cart_item.name }} {{ cart_item.sales_units }} - {{ cart_item.group_id }} - {{ cart_item.location_id }} - {{ cart_item.tax_group_id }} + {{ cart_item.group_name }} ({{ cart_item.group_id }}) + {{ cart_item.location_name }} ({{ cart_item.location_id }}) + {{ cart_item.tax_group_description }} ({{ cart_item.tax_group_id }}) {{ format_currency(cart_item.net_unit_price) }} {{ format_currency(cart_item.gross_unit_price) }} From 32bcb1b18a86477ea4711a052d22c17c697cff5c Mon Sep 17 00:00:00 2001 From: Paul Brinkmeier Date: Sun, 20 Aug 2023 23:29:22 +0200 Subject: [PATCH 14/18] fixup! Store location name, group name and tax group description in order --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index afdf970..87b557b 100644 --- a/Makefile +++ b/Makefile @@ -2,5 +2,5 @@ frontend: jon/static/entry.js -jon/static/entry.js: $(shell find $(SOURCEDIR) -name '*.c') +jon/static/entry.js: $(shell find frontend -name '*.elm') elm make --optimize frontend/Entry.elm --output $@ From a2d1d423625609ea1be7793631a44d6419caf3e4 Mon Sep 17 00:00:00 2001 From: Paul Brinkmeier Date: Mon, 21 Aug 2023 19:40:44 +0200 Subject: [PATCH 15/18] Implement adding new inventory items --- README.md | 1 + frontend/Entry.elm | 4 +++- jon/db/__init__.py | 2 -- jon/db/entry/add_item_and_snack_entry.sql | 26 ++++++++++++++++++++ jon/entry.py | 29 +++++++++++++++++++++-- jon/templates/entry/index.html | 5 ++++ 6 files changed, 62 insertions(+), 5 deletions(-) create mode 100644 jon/db/entry/add_item_and_snack_entry.sql diff --git a/README.md b/README.md index 729066c..ce708eb 100644 --- a/README.md +++ b/README.md @@ -53,3 +53,4 @@ ssh -nNTvL 5432:fsmi-db.fsmi.org:5432 fsmi-login.fsmi.uni-karlsruhe.de - [ ] Use `flask-login` with a single user stored in memory - [ ] Improve project structure - [ ] Figure out/Add documentation about building `entry.js` +- [ ] Use `flask.flash` for error messages diff --git a/frontend/Entry.elm b/frontend/Entry.elm index 78b73c6..bbd7a93 100644 --- a/frontend/Entry.elm +++ b/frontend/Entry.elm @@ -339,7 +339,9 @@ viewSearchResult model = , td [] [ text model.locationName ] , td [] [ text <| showBool model.available ] , td [] - [ button [ onClick <| GotoItemEditor model ] [ text "Als Vorlage verwenden" ] + [ Html.form [ onSubmit <| GotoItemEditor model ] + [ button [] [ text "Als Vorlage verwenden" ] + ] ] ] diff --git a/jon/db/__init__.py b/jon/db/__init__.py index 4a3a945..19e1c79 100644 --- a/jon/db/__init__.py +++ b/jon/db/__init__.py @@ -7,8 +7,6 @@ from psycopg2.extras import RealDictCursor def get_db(): if "db" not in g: - # TODO: Make this configurable and use a default that works - # on the pool computers. g.db = psycopg2.connect(current_app.config["DB_CONNECTION_STRING"]) run_query_on(g.db, "add_views.sql", None) diff --git a/jon/db/entry/add_item_and_snack_entry.sql b/jon/db/entry/add_item_and_snack_entry.sql new file mode 100644 index 0000000..e973272 --- /dev/null +++ b/jon/db/entry/add_item_and_snack_entry.sql @@ -0,0 +1,26 @@ +DO $$ +DECLARE new_item_id integer; +DECLARE new_snack_id integer; +BEGIN + +-- Create a new inventory line +INSERT INTO garfield.inventory_items +(item_barcode, name, item_group, location, tax_group, sales_units, unit_price) +VALUES +(%(barcode)s, %(name)s, %(group_id)s, %(location_id)s, %(tax_group_id)s, %(sales_units)s, %(net_unit_price)s) +RETURNING item_id INTO new_item_id; + +-- Delete any old snacks with the same barcode in the given location +PERFORM garfield.snack_delete(snack_id) +FROM garfield.snacks +WHERE snack_barcode = %(barcode)s + AND location_id = %(location_id)s; + +-- Create a new snack entry... +SELECT garfield.snack_create(%(name)s, %(barcode)s, %(gross_unit_price)s, %(tax_group_id)s, %(location_id)s) +INTO new_snack_id; + +-- ... and map it to the new inventory line +PERFORM garfield.inventory_map_snack(new_snack_id, new_item_id); + +END$$ diff --git a/jon/entry.py b/jon/entry.py index 9b067f5..7b6c780 100644 --- a/jon/entry.py +++ b/jon/entry.py @@ -1,4 +1,4 @@ -from flask import Blueprint, redirect, render_template, request, session +from flask import Blueprint, flash, redirect, render_template, request, session from . import db @@ -16,12 +16,37 @@ def index(): ) +@bp.post("/add-new-items") +def add_new_entries(): + print(session) + + i_know_what_im_doing = "i-know-what-im-doing" in request.form + if not i_know_what_im_doing: + return "Du weißt nicht was du tust", 400 + + orders = session.get("cart", default=[]) + if not orders: + return "Keine Aufträge", 404 + + # I'm aware of execute_many and extras.execute_values but we don't need to + # optimize here (yet?). This way it's a bit easier to use anyways. + for order in orders: + with db.run_query("entry/add_item_and_snack_entry.sql", order) as cursor: + pass + db.get_db().commit() + + # Reset the cart + session["cart"] = [] + + return redirect(request.referrer) + + @bp.post("/delete-order") def delete_order(): try: order_index = int(request.form["order-index"]) except: - return f"Incomplete or mistyped form", 400 + return "Incomplete or mistyped form", 400 cart = session.get("cart", default=[]) del cart[order_index] diff --git a/jon/templates/entry/index.html b/jon/templates/entry/index.html index fcb5d1b..e08c717 100644 --- a/jon/templates/entry/index.html +++ b/jon/templates/entry/index.html @@ -34,4 +34,9 @@ {% endfor %} +
+ + + +
{% endblock %} From 2108ef24183c6bcb2ab1cc0b927c95e5adee77c7 Mon Sep 17 00:00:00 2001 From: Paul Brinkmeier Date: Tue, 22 Aug 2023 01:58:50 +0200 Subject: [PATCH 16/18] Add unitsLeft field to SearchResult type --- frontend/Entry.elm | 2 ++ jon/db/add_views.sql | 1 + jon/db/search_items.sql | 9 ++++----- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/frontend/Entry.elm b/frontend/Entry.elm index bbd7a93..434f09b 100644 --- a/frontend/Entry.elm +++ b/frontend/Entry.elm @@ -38,6 +38,7 @@ type alias SearchResult = , groupName : String , groupId : Int , taxGroupId : Int + , unitsLeft : Int } searchResultDecoder = @@ -53,6 +54,7 @@ searchResultDecoder = |> P.required "group_name" D.string |> P.required "group_id" D.int |> P.required "tax_group_id" D.int + |> P.required "units_left" D.int type alias Location = { id : Int diff --git a/jon/db/add_views.sql b/jon/db/add_views.sql index 684fde9..a6c0834 100644 --- a/jon/db/add_views.sql +++ b/jon/db/add_views.sql @@ -11,6 +11,7 @@ SELECT inventory_items.available, inventory_items.item_group, inventory_items.location, + inventory_items.tax_group, inventory_item_groups.group_name, COALESCE(b.sales::numeric, 0::numeric) - COALESCE(cancel.count::numeric, 0::numeric) AS sales, inventory_items.sales_units::numeric - COALESCE(b.sales, 0::bigint)::numeric + COALESCE(c.delta, 0::numeric) + COALESCE(cancel.count::numeric, 0::numeric) AS units_left, diff --git a/jon/db/search_items.sql b/jon/db/search_items.sql index 62a8216..58da8d5 100644 --- a/jon/db/search_items.sql +++ b/jon/db/search_items.sql @@ -6,13 +6,12 @@ SELECT sales_units, available, location_name, - location_id, + location as location_id, group_name, item_group AS group_id, - tax_group AS tax_group_id -FROM garfield.inventory_items -LEFT JOIN garfield.locations ON location = location_id -LEFT JOIN garfield.inventory_item_groups ON item_group = group_id + tax_group AS tax_group_id, + units_left :: integer +FROM all_inventory_item_overview WHERE (%(location_id)s IS NULL OR location = %(location_id)s) AND (name ILIKE CONCAT('%%', %(search_term)s, '%%') OR item_barcode = %(search_term)s) ORDER BY bought DESC From d9114d21c7b589a883326742a1f9f83048b39dd3 Mon Sep 17 00:00:00 2001 From: Paul Brinkmeier Date: Tue, 22 Aug 2023 02:03:33 +0200 Subject: [PATCH 17/18] Some doc stuff --- README.md | 7 ++++--- jon/db/entry/add_item_and_snack_entry.sql | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index ce708eb..448c599 100644 --- a/README.md +++ b/README.md @@ -40,8 +40,6 @@ ssh -nNTvL 5432:fsmi-db.fsmi.org:5432 fsmi-login.fsmi.uni-karlsruhe.de ## TODO -- [ ] Implement item and snack entry as Elm application - - [ ] Needs good documentation for maintainability - [ ] Implement and document report generation - [ ] How many days will the item last? - [ ] How many do we need to last X months? @@ -52,5 +50,8 @@ ssh -nNTvL 5432:fsmi-db.fsmi.org:5432 fsmi-login.fsmi.uni-karlsruhe.de - [ ] Use `flask-session` for file-backed sessions - [ ] Use `flask-login` with a single user stored in memory - [ ] Improve project structure -- [ ] Figure out/Add documentation about building `entry.js` - [ ] Use `flask.flash` for error messages +- [x] Implement item and snack entry as Elm application + - [x] Figure out/Add documentation about building `entry.js` + - [ ] Clean up the code a little and add some comments + - [ ] Needs good documentation for maintainability diff --git a/jon/db/entry/add_item_and_snack_entry.sql b/jon/db/entry/add_item_and_snack_entry.sql index e973272..59f8015 100644 --- a/jon/db/entry/add_item_and_snack_entry.sql +++ b/jon/db/entry/add_item_and_snack_entry.sql @@ -10,7 +10,7 @@ VALUES (%(barcode)s, %(name)s, %(group_id)s, %(location_id)s, %(tax_group_id)s, %(sales_units)s, %(net_unit_price)s) RETURNING item_id INTO new_item_id; --- Delete any old snacks with the same barcode in the given location +-- Delete (i.e. mark as inactive) any old snacks with the same barcode in the given location PERFORM garfield.snack_delete(snack_id) FROM garfield.snacks WHERE snack_barcode = %(barcode)s From d57e66c033ab9f5e70267e15b09c1b7e158fa48d Mon Sep 17 00:00:00 2001 From: Paul Brinkmeier Date: Tue, 22 Aug 2023 16:56:04 +0200 Subject: [PATCH 18/18] Add some types and doc to frontend code --- frontend/Calculator.elm | 19 +++++++++++++++--- frontend/Entry.elm | 44 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 3 deletions(-) diff --git a/frontend/Calculator.elm b/frontend/Calculator.elm index 4d6bcbd..7d1e355 100644 --- a/frontend/Calculator.elm +++ b/frontend/Calculator.elm @@ -9,7 +9,15 @@ import Select type Tax = Net | Gross -ctShow ct = case ct of +-- Duplicated from Entry.elm but too lazy to sandwich this out +type alias TaxGroup = + { id : Int + , description : String + , percentage : Float + } + +showTax : Tax -> String +showTax tax = case tax of Gross -> "Brutto" Net -> "Netto" @@ -19,11 +27,13 @@ type alias Model = , bundleSize : NumberInput.Model Int } +init : Float -> Model init bundlePrice = Model - (Select.init ctShow ctShow Net [Net, Gross]) + (Select.init showTax showTax Net [Net, Gross]) (NumberInput.fromFloat bundlePrice) (NumberInput.fromInt 1) +getResult : Model -> TaxGroup -> Maybe Float getResult model taxGroup = case (NumberInput.get model.bundlePrice, NumberInput.get model.bundleSize) of (Just bundlePrice, Just bundleSize) -> @@ -41,6 +51,7 @@ type Msg | SetBundlePrice String | SetBundleSize String +update : Msg -> Model -> Model update msg model = case msg of SetTax key -> { model | tax = Select.update key model.tax } @@ -49,6 +60,7 @@ update msg model = case msg of SetBundleSize str -> { model | bundleSize = NumberInput.update str model.bundleSize } +view : Model -> TaxGroup -> Html Msg view model taxGroup = let mainPart = @@ -112,4 +124,5 @@ view model taxGroup = ] ] -roundTo places x = toFloat (round <| x * 10 ^ places) / 10 ^ places +roundTo : Int -> Float -> Float +roundTo places x = toFloat (round <| x * 10 ^ toFloat places) / 10 ^ toFloat places diff --git a/frontend/Entry.elm b/frontend/Entry.elm index 434f09b..55b7355 100644 --- a/frontend/Entry.elm +++ b/frontend/Entry.elm @@ -14,6 +14,50 @@ import Calculator import NumberInput import Select +{- +Elm forces us to use the Elm architecture: + + ┌──────┐ + ┌─────Model──► view ├──Html───────┐ + │ └──────┘ │ + │ │ +┌┴─────────────────────────────────▼┐ +│ Elm runtime │ +└▲─────────────────────────────────┬┘ + │ │ + │ ┌──────┐ │ + └─Model+Cmd──┤update◄──Msg+Model──┘ + └──────┘ + +This architecture is similar to what React does but its implementation +in Elm is a bit special since it's purely functional and side effects +are isolated into the runtime system. + +An Elm component is usually centered around two types, Model and Msg. +Model contains all data the application is concerned with, including the state +of UI elements. Msg encodes all updates to Model that the application supports. + +In addition to Msg and Model, we have to provide two functions, view and update. + +view : Model -> Html Msg +update : Msg -> Model -> (Model, Cmd Msg) + +view maps a Model to a DOM tree. Events in this DOM tree create Msg values. +update maps a Msg and a Model to a new Model. In addition, update can create +a command. Commands are used to make the runtime do side effects, which in +turn create new Msg values. + +For example, we have a SetSearchTerm message which simply updates the searchTerm +property in the model. This message is triggered every time the search box input +is changed. Submitting the search box form triggers a SubmitSearch event. +This event leaves the model unchanged but issues a command that sends the search +term to a JSON endpoint. When the request successfully resolves, the runtime +triggers a ReceiveSearchResults messages which updates the list of search results +in the model. + +See Calculator.elm for a simpler example of this architecture. +-} + main = Browser.element { init = \globals -> ( Context globals <| ItemSearch { searchTerm = "", searchResults = [] }