wangzhibo
2023-10-31 86070cd00485c47a2c5c3ffa4a9bae6648dd05c6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
import { template as _$template } from "/node_modules/.vite/deps/solid-js_web.js?v=5eac7255";
import { delegateEvents as _$delegateEvents } from "/node_modules/.vite/deps/solid-js_web.js?v=5eac7255";
import { createComponent as _$createComponent } from "/node_modules/.vite/deps/solid-js_web.js?v=5eac7255";
import { insert as _$insert } from "/node_modules/.vite/deps/solid-js_web.js?v=5eac7255";
import { use as _$use } from "/node_modules/.vite/deps/solid-js_web.js?v=5eac7255";
const _tmpl$ = /*#__PURE__*/_$template(`<div class="mx-auto flex max-w-screen-sm flex-col items-center gap-4 py-10"><form class=contents><div class="flex w-full flex-col gap-4"><div class=flex-1><label class=label><span class=label-text></span></label><input name=url type=url class="input input-bordered w-full"placeholder=http://127.0.0.1:9090 list=defaultEndpoints><datalist id=defaultEndpoints><option value=http://127.0.0.1:9090></option></datalist></div><div class=flex-1><label class=label><span class=label-text></span></label><input name=secret type=password class="input input-bordered w-full"placeholder=secret></div></div></form><div class="grid w-full grid-cols-2 gap-4">`),
  _tmpl$2 = /*#__PURE__*/_$template(`<div class="badge badge-info flex w-full cursor-pointer items-center justify-between gap-4 py-4"><span class=truncate>`);
import { createForm } from "/node_modules/.vite/deps/@felte_solid.js?v=593c8e6e";
import { validator } from "/node_modules/.vite/deps/@felte_validator-zod.js?v=269fdde0";
import { useLocation, useNavigate } from "/node_modules/@solidjs/router/dist/index.jsx";
import { IconX } from "/node_modules/.vite/deps/@tabler_icons-solidjs.js?v=2a3f5507";
import ky from "/node_modules/.vite/deps/ky.js?v=f53503d9";
import { For, onMount } from "/node_modules/.vite/deps/solid-js.js?v=5eac7255";
import { toast } from "/node_modules/solid-toast/dist/source/index.jsx";
import { v4 as uuid } from "/node_modules/.vite/deps/uuid.js?v=ba7e536e";
import { z } from "/node_modules/.vite/deps/zod.js?v=1cda075c";
import { Button } from "/src/components/index.ts";
import { transformEndpointURL } from "/src/helpers/index.ts";
import { useI18n } from "/src/i18n/index.tsx";
import { endpointList, selectedEndpoint, setEndpointList, setSelectedEndpoint } from "/src/signals/index.ts";
const schema = z.object({
  url: z.string().min(1),
  secret: z.string()
});
export default (() => {
  const [t] = useI18n();
  const location = useLocation();
  const navigate = useNavigate();
  const onSetupSuccess = id => {
    setSelectedEndpoint(id);
    navigate('/overview');
  };
  const checkEndpoint = (url, secret) => ky.get(url, {
    headers: secret ? {
      Authorization: `Bearer ${secret}`
    } : {}
  }).then(({
    ok
  }) => ok).catch(err => {
    const {
      message
    } = err;
    toast.error(message);
  });
  const onEndpointSelect = async id => {
    const endpoint = endpointList().find(e => e.id === id);
    if (!endpoint) {
      return;
    }
    if (!(await checkEndpoint(endpoint.url, endpoint.secret))) {
      return;
    }
    onSetupSuccess(id);
  };
  const onSubmit = async ({
    url,
    secret
  }) => {
    const transformedURL = transformEndpointURL(url);
    if (!(await checkEndpoint(transformedURL, secret))) {
      return;
    }
    const id = uuid();
    const list = endpointList().slice();
    const point = list.find(history => history.url === transformedURL);
    if (!point) {
      // new host and secret
      setEndpointList([{
        id,
        url: transformedURL,
        secret
      }, ...list]);
      onSetupSuccess(id);
      return;
    }
 
    // exist host we update secret and id no matter if secret is equal or not
    point.secret = secret;
    point.id = id;
    setEndpointList(list);
    onSetupSuccess(id);
  };
  const onError = err => {
    const {
      message
    } = err;
    toast.error(message);
  };
  const {
    form
  } = createForm({
    extend: validator({
      schema
    }),
    onSubmit,
    onError
  });
  const onRemove = id => {
    if (selectedEndpoint() === id) {
      setSelectedEndpoint('');
    }
    setEndpointList(endpointList().filter(e => e.id !== id));
  };
  onMount(() => {
    const query = new URLSearchParams(location.search);
    if (query.has('hostname')) {
      void onSubmit({
        url: `${window.location.protocol}//${query.get('hostname')}${query.get('port') ? `:${query.get('port')}` : ''}`,
        secret: query.get('secret') ?? ''
      });
    } else if (endpointList().length === 0) {
      /**
        we only try auto login when there is nothing in endpoint list
        or user who is using default config won't be able to switch to another endpoint ever
      */
      void onSubmit({
        url: 'http://127.0.0.1:9090',
        secret: ''
      });
    }
  });
  return (() => {
    const _el$ = _tmpl$(),
      _el$2 = _el$.firstChild,
      _el$3 = _el$2.firstChild,
      _el$4 = _el$3.firstChild,
      _el$5 = _el$4.firstChild,
      _el$6 = _el$5.firstChild,
      _el$7 = _el$4.nextSibling,
      _el$8 = _el$7.firstChild,
      _el$9 = _el$8.firstChild,
      _el$10 = _el$2.nextSibling;
    _$use(form, _el$2, () => form);
    _$insert(_el$6, () => t('endpointURL'));
    _$insert(_el$9, () => t('secret'));
    _$insert(_el$3, _$createComponent(Button, {
      type: "submit",
      "class": "btn-primary uppercase",
      get children() {
        return t('add');
      }
    }), null);
    _$insert(_el$10, _$createComponent(For, {
      get each() {
        return endpointList();
      },
      children: ({
        id,
        url
      }) => (() => {
        const _el$11 = _tmpl$2(),
          _el$12 = _el$11.firstChild;
        _el$11.$$click = () => onEndpointSelect(id);
        _$insert(_el$12, url);
        _$insert(_el$11, _$createComponent(Button, {
          "class": "btn-circle btn-ghost btn-xs text-white",
          onClick: e => {
            e.stopPropagation();
            onRemove(id);
          },
          get children() {
            return _$createComponent(IconX, {});
          }
        }), null);
        return _el$11;
      })()
    }));
    return _el$;
  })();
});
_$delegateEvents(["click"]);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjcmVhdGVGb3JtIiwidmFsaWRhdG9yIiwidXNlTG9jYXRpb24iLCJ1c2VOYXZpZ2F0ZSIsIkljb25YIiwia3kiLCJGb3IiLCJvbk1vdW50IiwidG9hc3QiLCJ2NCIsInV1aWQiLCJ6IiwiQnV0dG9uIiwidHJhbnNmb3JtRW5kcG9pbnRVUkwiLCJ1c2VJMThuIiwiZW5kcG9pbnRMaXN0Iiwic2VsZWN0ZWRFbmRwb2ludCIsInNldEVuZHBvaW50TGlzdCIsInNldFNlbGVjdGVkRW5kcG9pbnQiLCJzY2hlbWEiLCJvYmplY3QiLCJ1cmwiLCJzdHJpbmciLCJtaW4iLCJzZWNyZXQiLCJ0IiwibG9jYXRpb24iLCJuYXZpZ2F0ZSIsIm9uU2V0dXBTdWNjZXNzIiwiaWQiLCJjaGVja0VuZHBvaW50IiwiZ2V0IiwiaGVhZGVycyIsIkF1dGhvcml6YXRpb24iLCJ0aGVuIiwib2siLCJjYXRjaCIsImVyciIsIm1lc3NhZ2UiLCJlcnJvciIsIm9uRW5kcG9pbnRTZWxlY3QiLCJlbmRwb2ludCIsImZpbmQiLCJlIiwib25TdWJtaXQiLCJ0cmFuc2Zvcm1lZFVSTCIsImxpc3QiLCJzbGljZSIsInBvaW50IiwiaGlzdG9yeSIsIm9uRXJyb3IiLCJmb3JtIiwiZXh0ZW5kIiwib25SZW1vdmUiLCJmaWx0ZXIiLCJxdWVyeSIsIlVSTFNlYXJjaFBhcmFtcyIsInNlYXJjaCIsImhhcyIsIndpbmRvdyIsInByb3RvY29sIiwibGVuZ3RoIiwiX2VsJCIsIl90bXBsJCIsIl9lbCQyIiwiZmlyc3RDaGlsZCIsIl9lbCQzIiwiX2VsJDQiLCJfZWwkNSIsIl9lbCQ2IiwiX2VsJDciLCJuZXh0U2libGluZyIsIl9lbCQ4IiwiX2VsJDkiLCJfZWwkMTAiLCJfJHVzZSIsIl8kaW5zZXJ0IiwiXyRjcmVhdGVDb21wb25lbnQiLCJ0eXBlIiwiY2hpbGRyZW4iLCJlYWNoIiwiX2VsJDExIiwiX3RtcGwkMiIsIl9lbCQxMiIsIiQkY2xpY2siLCJvbkNsaWNrIiwic3RvcFByb3BhZ2F0aW9uIiwiXyRkZWxlZ2F0ZUV2ZW50cyJdLCJzb3VyY2VzIjpbIlNldHVwLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVGb3JtIH0gZnJvbSAnQGZlbHRlL3NvbGlkJ1xyXG5pbXBvcnQgeyB2YWxpZGF0b3IgfSBmcm9tICdAZmVsdGUvdmFsaWRhdG9yLXpvZCdcclxuaW1wb3J0IHsgdXNlTG9jYXRpb24sIHVzZU5hdmlnYXRlIH0gZnJvbSAnQHNvbGlkanMvcm91dGVyJ1xyXG5pbXBvcnQgeyBJY29uWCB9IGZyb20gJ0B0YWJsZXIvaWNvbnMtc29saWRqcydcclxuaW1wb3J0IGt5IGZyb20gJ2t5J1xyXG5pbXBvcnQgeyBGb3IsIG9uTW91bnQgfSBmcm9tICdzb2xpZC1qcydcclxuaW1wb3J0IHsgdG9hc3QgfSBmcm9tICdzb2xpZC10b2FzdCdcclxuaW1wb3J0IHsgdjQgYXMgdXVpZCB9IGZyb20gJ3V1aWQnXHJcbmltcG9ydCB7IHogfSBmcm9tICd6b2QnXHJcbmltcG9ydCB7IEJ1dHRvbiB9IGZyb20gJ34vY29tcG9uZW50cydcclxuaW1wb3J0IHsgdHJhbnNmb3JtRW5kcG9pbnRVUkwgfSBmcm9tICd+L2hlbHBlcnMnXHJcbmltcG9ydCB7IHVzZUkxOG4gfSBmcm9tICd+L2kxOG4nXHJcbmltcG9ydCB7XHJcbiAgZW5kcG9pbnRMaXN0LFxyXG4gIHNlbGVjdGVkRW5kcG9pbnQsXHJcbiAgc2V0RW5kcG9pbnRMaXN0LFxyXG4gIHNldFNlbGVjdGVkRW5kcG9pbnQsXHJcbn0gZnJvbSAnfi9zaWduYWxzJ1xyXG5cclxuY29uc3Qgc2NoZW1hID0gei5vYmplY3Qoe1xyXG4gIHVybDogei5zdHJpbmcoKS5taW4oMSksXHJcbiAgc2VjcmV0OiB6LnN0cmluZygpLFxyXG59KVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgKCkgPT4ge1xyXG4gIGNvbnN0IFt0XSA9IHVzZUkxOG4oKVxyXG4gIGNvbnN0IGxvY2F0aW9uID0gdXNlTG9jYXRpb24oKVxyXG4gIGNvbnN0IG5hdmlnYXRlID0gdXNlTmF2aWdhdGUoKVxyXG5cclxuICBjb25zdCBvblNldHVwU3VjY2VzcyA9IChpZDogc3RyaW5nKSA9PiB7XHJcbiAgICBzZXRTZWxlY3RlZEVuZHBvaW50KGlkKVxyXG4gICAgbmF2aWdhdGUoJy9vdmVydmlldycpXHJcbiAgfVxyXG5cclxuICBjb25zdCBjaGVja0VuZHBvaW50ID0gKHVybDogc3RyaW5nLCBzZWNyZXQ6IHN0cmluZykgPT5cclxuICAgIGt5XHJcbiAgICAgIC5nZXQodXJsLCB7XHJcbiAgICAgICAgaGVhZGVyczogc2VjcmV0XHJcbiAgICAgICAgICA/IHtcclxuICAgICAgICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7c2VjcmV0fWAsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIDoge30sXHJcbiAgICAgIH0pXHJcbiAgICAgIC50aGVuKCh7IG9rIH0pID0+IG9rKVxyXG4gICAgICAuY2F0Y2goKGVycikgPT4ge1xyXG4gICAgICAgIGNvbnN0IHsgbWVzc2FnZSB9ID0gZXJyIGFzIEVycm9yXHJcblxyXG4gICAgICAgIHRvYXN0LmVycm9yKG1lc3NhZ2UpXHJcbiAgICAgIH0pXHJcblxyXG4gIGNvbnN0IG9uRW5kcG9pbnRTZWxlY3QgPSBhc3luYyAoaWQ6IHN0cmluZykgPT4ge1xyXG4gICAgY29uc3QgZW5kcG9pbnQgPSBlbmRwb2ludExpc3QoKS5maW5kKChlKSA9PiBlLmlkID09PSBpZClcclxuXHJcbiAgICBpZiAoIWVuZHBvaW50KSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG5cclxuICAgIGlmICghKGF3YWl0IGNoZWNrRW5kcG9pbnQoZW5kcG9pbnQudXJsLCBlbmRwb2ludC5zZWNyZXQpKSkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBvblNldHVwU3VjY2VzcyhpZClcclxuICB9XHJcblxyXG4gIGNvbnN0IG9uU3VibWl0ID0gYXN5bmMgKHsgdXJsLCBzZWNyZXQgfTogeyB1cmw6IHN0cmluZzsgc2VjcmV0OiBzdHJpbmcgfSkgPT4ge1xyXG4gICAgY29uc3QgdHJhbnNmb3JtZWRVUkwgPSB0cmFuc2Zvcm1FbmRwb2ludFVSTCh1cmwpXHJcblxyXG4gICAgaWYgKCEoYXdhaXQgY2hlY2tFbmRwb2ludCh0cmFuc2Zvcm1lZFVSTCwgc2VjcmV0KSkpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaWQgPSB1dWlkKClcclxuICAgIGNvbnN0IGxpc3QgPSBlbmRwb2ludExpc3QoKS5zbGljZSgpXHJcbiAgICBjb25zdCBwb2ludCA9IGxpc3QuZmluZCgoaGlzdG9yeSkgPT4gaGlzdG9yeS51cmwgPT09IHRyYW5zZm9ybWVkVVJMKVxyXG5cclxuICAgIGlmICghcG9pbnQpIHtcclxuICAgICAgLy8gbmV3IGhvc3QgYW5kIHNlY3JldFxyXG4gICAgICBzZXRFbmRwb2ludExpc3QoW3sgaWQsIHVybDogdHJhbnNmb3JtZWRVUkwsIHNlY3JldCB9LCAuLi5saXN0XSlcclxuICAgICAgb25TZXR1cFN1Y2Nlc3MoaWQpXHJcblxyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICAvLyBleGlzdCBob3N0IHdlIHVwZGF0ZSBzZWNyZXQgYW5kIGlkIG5vIG1hdHRlciBpZiBzZWNyZXQgaXMgZXF1YWwgb3Igbm90XHJcbiAgICBwb2ludC5zZWNyZXQgPSBzZWNyZXRcclxuICAgIHBvaW50LmlkID0gaWRcclxuXHJcbiAgICBzZXRFbmRwb2ludExpc3QobGlzdClcclxuICAgIG9uU2V0dXBTdWNjZXNzKGlkKVxyXG4gIH1cclxuXHJcbiAgY29uc3Qgb25FcnJvciA9IChlcnI6IHVua25vd24pID0+IHtcclxuICAgIGNvbnN0IHsgbWVzc2FnZSB9ID0gZXJyIGFzIEVycm9yXHJcblxyXG4gICAgdG9hc3QuZXJyb3IobWVzc2FnZSlcclxuICB9XHJcblxyXG4gIGNvbnN0IHsgZm9ybSB9ID0gY3JlYXRlRm9ybTx6LmluZmVyPHR5cGVvZiBzY2hlbWE+Pih7XHJcbiAgICBleHRlbmQ6IHZhbGlkYXRvcih7IHNjaGVtYSB9KSxcclxuICAgIG9uU3VibWl0LFxyXG4gICAgb25FcnJvcixcclxuICB9KVxyXG5cclxuICBjb25zdCBvblJlbW92ZSA9IChpZDogc3RyaW5nKSA9PiB7XHJcbiAgICBpZiAoc2VsZWN0ZWRFbmRwb2ludCgpID09PSBpZCkge1xyXG4gICAgICBzZXRTZWxlY3RlZEVuZHBvaW50KCcnKVxyXG4gICAgfVxyXG5cclxuICAgIHNldEVuZHBvaW50TGlzdChlbmRwb2ludExpc3QoKS5maWx0ZXIoKGUpID0+IGUuaWQgIT09IGlkKSlcclxuICB9XHJcblxyXG4gIG9uTW91bnQoKCkgPT4ge1xyXG4gICAgY29uc3QgcXVlcnkgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKGxvY2F0aW9uLnNlYXJjaClcclxuXHJcbiAgICBpZiAocXVlcnkuaGFzKCdob3N0bmFtZScpKSB7XHJcbiAgICAgIHZvaWQgb25TdWJtaXQoe1xyXG4gICAgICAgIHVybDogYCR7d2luZG93LmxvY2F0aW9uLnByb3RvY29sfS8vJHtxdWVyeS5nZXQoJ2hvc3RuYW1lJyl9JHtcclxuICAgICAgICAgIHF1ZXJ5LmdldCgncG9ydCcpID8gYDoke3F1ZXJ5LmdldCgncG9ydCcpfWAgOiAnJ1xyXG4gICAgICAgIH1gLFxyXG4gICAgICAgIHNlY3JldDogcXVlcnkuZ2V0KCdzZWNyZXQnKSA/PyAnJyxcclxuICAgICAgfSlcclxuICAgIH0gZWxzZSBpZiAoZW5kcG9pbnRMaXN0KCkubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIC8qKlxyXG4gICAgICAgIHdlIG9ubHkgdHJ5IGF1dG8gbG9naW4gd2hlbiB0aGVyZSBpcyBub3RoaW5nIGluIGVuZHBvaW50IGxpc3RcclxuICAgICAgICBvciB1c2VyIHdobyBpcyB1c2luZyBkZWZhdWx0IGNvbmZpZyB3b24ndCBiZSBhYmxlIHRvIHN3aXRjaCB0byBhbm90aGVyIGVuZHBvaW50IGV2ZXJcclxuICAgICAgKi9cclxuICAgICAgdm9pZCBvblN1Ym1pdCh7XHJcbiAgICAgICAgdXJsOiAnaHR0cDovLzEyNy4wLjAuMTo5MDkwJyxcclxuICAgICAgICBzZWNyZXQ6ICcnLFxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH0pXHJcblxyXG4gIHJldHVybiAoXHJcbiAgICA8ZGl2IGNsYXNzPVwibXgtYXV0byBmbGV4IG1heC13LXNjcmVlbi1zbSBmbGV4LWNvbCBpdGVtcy1jZW50ZXIgZ2FwLTQgcHktMTBcIj5cclxuICAgICAgPGZvcm0gY2xhc3M9XCJjb250ZW50c1wiIHVzZTpmb3JtPXtmb3JtfT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCB3LWZ1bGwgZmxleC1jb2wgZ2FwLTRcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LTFcIj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWxcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsLXRleHRcIj57dCgnZW5kcG9pbnRVUkwnKX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvbGFiZWw+XHJcblxyXG4gICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICBuYW1lPVwidXJsXCJcclxuICAgICAgICAgICAgICB0eXBlPVwidXJsXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cImlucHV0IGlucHV0LWJvcmRlcmVkIHctZnVsbFwiXHJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJodHRwOi8vMTI3LjAuMC4xOjkwOTBcIlxyXG4gICAgICAgICAgICAgIGxpc3Q9XCJkZWZhdWx0RW5kcG9pbnRzXCJcclxuICAgICAgICAgICAgLz5cclxuXHJcbiAgICAgICAgICAgIDxkYXRhbGlzdCBpZD1cImRlZmF1bHRFbmRwb2ludHNcIj5cclxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiaHR0cDovLzEyNy4wLjAuMTo5MDkwXCIgLz5cclxuICAgICAgICAgICAgPC9kYXRhbGlzdD5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LTFcIj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWxcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsLXRleHRcIj57dCgnc2VjcmV0Jyl9PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG5cclxuICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgbmFtZT1cInNlY3JldFwiXHJcbiAgICAgICAgICAgICAgdHlwZT1cInBhc3N3b3JkXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cImlucHV0IGlucHV0LWJvcmRlcmVkIHctZnVsbFwiXHJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJzZWNyZXRcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPEJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3M9XCJidG4tcHJpbWFyeSB1cHBlcmNhc2VcIj5cclxuICAgICAgICAgICAge3QoJ2FkZCcpfVxyXG4gICAgICAgICAgPC9CdXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZm9ybT5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJncmlkIHctZnVsbCBncmlkLWNvbHMtMiBnYXAtNFwiPlxyXG4gICAgICAgIDxGb3IgZWFjaD17ZW5kcG9pbnRMaXN0KCl9PlxyXG4gICAgICAgICAgeyh7IGlkLCB1cmwgfSkgPT4gKFxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJiYWRnZSBiYWRnZS1pbmZvIGZsZXggdy1mdWxsIGN1cnNvci1wb2ludGVyIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gZ2FwLTQgcHktNFwiXHJcbiAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gb25FbmRwb2ludFNlbGVjdChpZCl9XHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRydW5jYXRlXCI+e3VybH08L3NwYW4+XHJcblxyXG4gICAgICAgICAgICAgIDxCdXR0b25cclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWNpcmNsZSBidG4tZ2hvc3QgYnRuLXhzIHRleHQtd2hpdGVcIlxyXG4gICAgICAgICAgICAgICAgb25DbGljaz17KGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKVxyXG4gICAgICAgICAgICAgICAgICBvblJlbW92ZShpZClcclxuICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPEljb25YIC8+XHJcbiAgICAgICAgICAgICAgPC9CdXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgKX1cclxuICAgICAgICA8L0Zvcj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICApXHJcbn1cclxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUEsU0FBU0EsVUFBVSxRQUFRLGNBQWM7QUFDekMsU0FBU0MsU0FBUyxRQUFRLHNCQUFzQjtBQUNoRCxTQUFTQyxXQUFXLEVBQUVDLFdBQVcsUUFBUSxpQkFBaUI7QUFDMUQsU0FBU0MsS0FBSyxRQUFRLHVCQUF1QjtBQUM3QyxPQUFPQyxFQUFFLE1BQU0sSUFBSTtBQUNuQixTQUFTQyxHQUFHLEVBQUVDLE9BQU8sUUFBUSxVQUFVO0FBQ3ZDLFNBQVNDLEtBQUssUUFBUSxhQUFhO0FBQ25DLFNBQVNDLEVBQUUsSUFBSUMsSUFBSSxRQUFRLE1BQU07QUFDakMsU0FBU0MsQ0FBQyxRQUFRLEtBQUs7QUFDdkIsU0FBU0MsTUFBTSxRQUFRLGNBQWM7QUFDckMsU0FBU0Msb0JBQW9CLFFBQVEsV0FBVztBQUNoRCxTQUFTQyxPQUFPLFFBQVEsUUFBUTtBQUNoQyxTQUNFQyxZQUFZLEVBQ1pDLGdCQUFnQixFQUNoQkMsZUFBZSxFQUNmQyxtQkFBbUIsUUFDZCxXQUFXO0FBRWxCLE1BQU1DLE1BQU0sR0FBR1IsQ0FBQyxDQUFDUyxNQUFNLENBQUM7RUFDdEJDLEdBQUcsRUFBRVYsQ0FBQyxDQUFDVyxNQUFNLENBQUMsQ0FBQyxDQUFDQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQ3RCQyxNQUFNLEVBQUViLENBQUMsQ0FBQ1csTUFBTSxDQUFDO0FBQ25CLENBQUMsQ0FBQztBQUVGLGdCQUFlLE1BQU07RUFDbkIsTUFBTSxDQUFDRyxDQUFDLENBQUMsR0FBR1gsT0FBTyxDQUFDLENBQUM7RUFDckIsTUFBTVksUUFBUSxHQUFHeEIsV0FBVyxDQUFDLENBQUM7RUFDOUIsTUFBTXlCLFFBQVEsR0FBR3hCLFdBQVcsQ0FBQyxDQUFDO0VBRTlCLE1BQU15QixjQUFjLEdBQUlDLEVBQVUsSUFBSztJQUNyQ1gsbUJBQW1CLENBQUNXLEVBQUUsQ0FBQztJQUN2QkYsUUFBUSxDQUFDLFdBQVcsQ0FBQztFQUN2QixDQUFDO0VBRUQsTUFBTUcsYUFBYSxHQUFHQSxDQUFDVCxHQUFXLEVBQUVHLE1BQWMsS0FDaERuQixFQUFFLENBQ0MwQixHQUFHLENBQUNWLEdBQUcsRUFBRTtJQUNSVyxPQUFPLEVBQUVSLE1BQU0sR0FDWDtNQUNFUyxhQUFhLEVBQUcsVUFBU1QsTUFBTztJQUNsQyxDQUFDLEdBQ0QsQ0FBQztFQUNQLENBQUMsQ0FBQyxDQUNEVSxJQUFJLENBQUMsQ0FBQztJQUFFQztFQUFHLENBQUMsS0FBS0EsRUFBRSxDQUFDLENBQ3BCQyxLQUFLLENBQUVDLEdBQUcsSUFBSztJQUNkLE1BQU07TUFBRUM7SUFBUSxDQUFDLEdBQUdELEdBQVk7SUFFaEM3QixLQUFLLENBQUMrQixLQUFLLENBQUNELE9BQU8sQ0FBQztFQUN0QixDQUFDLENBQUM7RUFFTixNQUFNRSxnQkFBZ0IsR0FBRyxNQUFPWCxFQUFVLElBQUs7SUFDN0MsTUFBTVksUUFBUSxHQUFHMUIsWUFBWSxDQUFDLENBQUMsQ0FBQzJCLElBQUksQ0FBRUMsQ0FBQyxJQUFLQSxDQUFDLENBQUNkLEVBQUUsS0FBS0EsRUFBRSxDQUFDO0lBRXhELElBQUksQ0FBQ1ksUUFBUSxFQUFFO01BQ2I7SUFDRjtJQUVBLElBQUksRUFBRSxNQUFNWCxhQUFhLENBQUNXLFFBQVEsQ0FBQ3BCLEdBQUcsRUFBRW9CLFFBQVEsQ0FBQ2pCLE1BQU0sQ0FBQyxDQUFDLEVBQUU7TUFDekQ7SUFDRjtJQUVBSSxjQUFjLENBQUNDLEVBQUUsQ0FBQztFQUNwQixDQUFDO0VBRUQsTUFBTWUsUUFBUSxHQUFHLE1BQUFBLENBQU87SUFBRXZCLEdBQUc7SUFBRUc7RUFBd0MsQ0FBQyxLQUFLO0lBQzNFLE1BQU1xQixjQUFjLEdBQUdoQyxvQkFBb0IsQ0FBQ1EsR0FBRyxDQUFDO0lBRWhELElBQUksRUFBRSxNQUFNUyxhQUFhLENBQUNlLGNBQWMsRUFBRXJCLE1BQU0sQ0FBQyxDQUFDLEVBQUU7TUFDbEQ7SUFDRjtJQUVBLE1BQU1LLEVBQUUsR0FBR25CLElBQUksQ0FBQyxDQUFDO0lBQ2pCLE1BQU1vQyxJQUFJLEdBQUcvQixZQUFZLENBQUMsQ0FBQyxDQUFDZ0MsS0FBSyxDQUFDLENBQUM7SUFDbkMsTUFBTUMsS0FBSyxHQUFHRixJQUFJLENBQUNKLElBQUksQ0FBRU8sT0FBTyxJQUFLQSxPQUFPLENBQUM1QixHQUFHLEtBQUt3QixjQUFjLENBQUM7SUFFcEUsSUFBSSxDQUFDRyxLQUFLLEVBQUU7TUFDVjtNQUNBL0IsZUFBZSxDQUFDLENBQUM7UUFBRVksRUFBRTtRQUFFUixHQUFHLEVBQUV3QixjQUFjO1FBQUVyQjtNQUFPLENBQUMsRUFBRSxHQUFHc0IsSUFBSSxDQUFDLENBQUM7TUFDL0RsQixjQUFjLENBQUNDLEVBQUUsQ0FBQztNQUVsQjtJQUNGOztJQUVBO0lBQ0FtQixLQUFLLENBQUN4QixNQUFNLEdBQUdBLE1BQU07SUFDckJ3QixLQUFLLENBQUNuQixFQUFFLEdBQUdBLEVBQUU7SUFFYlosZUFBZSxDQUFDNkIsSUFBSSxDQUFDO0lBQ3JCbEIsY0FBYyxDQUFDQyxFQUFFLENBQUM7RUFDcEIsQ0FBQztFQUVELE1BQU1xQixPQUFPLEdBQUliLEdBQVksSUFBSztJQUNoQyxNQUFNO01BQUVDO0lBQVEsQ0FBQyxHQUFHRCxHQUFZO0lBRWhDN0IsS0FBSyxDQUFDK0IsS0FBSyxDQUFDRCxPQUFPLENBQUM7RUFDdEIsQ0FBQztFQUVELE1BQU07SUFBRWE7RUFBSyxDQUFDLEdBQUduRCxVQUFVLENBQXlCO0lBQ2xEb0QsTUFBTSxFQUFFbkQsU0FBUyxDQUFDO01BQUVrQjtJQUFPLENBQUMsQ0FBQztJQUM3QnlCLFFBQVE7SUFDUk07RUFDRixDQUFDLENBQUM7RUFFRixNQUFNRyxRQUFRLEdBQUl4QixFQUFVLElBQUs7SUFDL0IsSUFBSWIsZ0JBQWdCLENBQUMsQ0FBQyxLQUFLYSxFQUFFLEVBQUU7TUFDN0JYLG1CQUFtQixDQUFDLEVBQUUsQ0FBQztJQUN6QjtJQUVBRCxlQUFlLENBQUNGLFlBQVksQ0FBQyxDQUFDLENBQUN1QyxNQUFNLENBQUVYLENBQUMsSUFBS0EsQ0FBQyxDQUFDZCxFQUFFLEtBQUtBLEVBQUUsQ0FBQyxDQUFDO0VBQzVELENBQUM7RUFFRHRCLE9BQU8sQ0FBQyxNQUFNO0lBQ1osTUFBTWdELEtBQUssR0FBRyxJQUFJQyxlQUFlLENBQUM5QixRQUFRLENBQUMrQixNQUFNLENBQUM7SUFFbEQsSUFBSUYsS0FBSyxDQUFDRyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUU7TUFDekIsS0FBS2QsUUFBUSxDQUFDO1FBQ1p2QixHQUFHLEVBQUcsR0FBRXNDLE1BQU0sQ0FBQ2pDLFFBQVEsQ0FBQ2tDLFFBQVMsS0FBSUwsS0FBSyxDQUFDeEIsR0FBRyxDQUFDLFVBQVUsQ0FBRSxHQUN6RHdCLEtBQUssQ0FBQ3hCLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBSSxJQUFHd0IsS0FBSyxDQUFDeEIsR0FBRyxDQUFDLE1BQU0sQ0FBRSxFQUFDLEdBQUcsRUFDL0MsRUFBQztRQUNGUCxNQUFNLEVBQUUrQixLQUFLLENBQUN4QixHQUFHLENBQUMsUUFBUSxDQUFDLElBQUk7TUFDakMsQ0FBQyxDQUFDO0lBQ0osQ0FBQyxNQUFNLElBQUloQixZQUFZLENBQUMsQ0FBQyxDQUFDOEMsTUFBTSxLQUFLLENBQUMsRUFBRTtNQUN0QztBQUNOO0FBQ0E7QUFDQTtNQUNNLEtBQUtqQixRQUFRLENBQUM7UUFDWnZCLEdBQUcsRUFBRSx1QkFBdUI7UUFDNUJHLE1BQU0sRUFBRTtNQUNWLENBQUMsQ0FBQztJQUNKO0VBQ0YsQ0FBQyxDQUFDO0VBRUY7SUFBQSxNQUFBc0MsSUFBQSxHQUFBQyxNQUFBO01BQUFDLEtBQUEsR0FBQUYsSUFBQSxDQUFBRyxVQUFBO01BQUFDLEtBQUEsR0FBQUYsS0FBQSxDQUFBQyxVQUFBO01BQUFFLEtBQUEsR0FBQUQsS0FBQSxDQUFBRCxVQUFBO01BQUFHLEtBQUEsR0FBQUQsS0FBQSxDQUFBRixVQUFBO01BQUFJLEtBQUEsR0FBQUQsS0FBQSxDQUFBSCxVQUFBO01BQUFLLEtBQUEsR0FBQUgsS0FBQSxDQUFBSSxXQUFBO01BQUFDLEtBQUEsR0FBQUYsS0FBQSxDQUFBTCxVQUFBO01BQUFRLEtBQUEsR0FBQUQsS0FBQSxDQUFBUCxVQUFBO01BQUFTLE1BQUEsR0FBQVYsS0FBQSxDQUFBTyxXQUFBO0lBQUFJLEtBQUEsQ0FFK0J4QixJQUFJLEVBQUFhLEtBQUEsUUFBRWIsSUFBSTtJQUFBeUIsUUFBQSxDQUFBUCxLQUFBLFFBSUg1QyxDQUFDLENBQUMsYUFBYSxDQUFDO0lBQUFtRCxRQUFBLENBQUFILEtBQUEsUUFrQmhCaEQsQ0FBQyxDQUFDLFFBQVEsQ0FBQztJQUFBbUQsUUFBQSxDQUFBVixLQUFBLEVBQUFXLGlCQUFBLENBV3hDakUsTUFBTTtNQUFDa0UsSUFBSTtNQUFBO01BQUEsSUFBQUMsU0FBQTtRQUFBLE9BQ1R0RCxDQUFDLENBQUMsS0FBSyxDQUFDO01BQUE7SUFBQTtJQUFBbUQsUUFBQSxDQUFBRixNQUFBLEVBQUFHLGlCQUFBLENBTVp2RSxHQUFHO01BQUEsSUFBQzBFLElBQUlBLENBQUE7UUFBQSxPQUFFakUsWUFBWSxDQUFDLENBQUM7TUFBQTtNQUFBZ0UsUUFBQSxFQUN0QkEsQ0FBQztRQUFFbEQsRUFBRTtRQUFFUjtNQUFJLENBQUM7UUFBQSxNQUFBNEQsTUFBQSxHQUFBQyxPQUFBO1VBQUFDLE1BQUEsR0FBQUYsTUFBQSxDQUFBaEIsVUFBQTtRQUFBZ0IsTUFBQSxDQUFBRyxPQUFBLEdBR0EsTUFBTTVDLGdCQUFnQixDQUFDWCxFQUFFLENBQUM7UUFBQStDLFFBQUEsQ0FBQU8sTUFBQSxFQUVYOUQsR0FBRztRQUFBdUQsUUFBQSxDQUFBSyxNQUFBLEVBQUFKLGlCQUFBLENBRTFCakUsTUFBTTtVQUFBO1VBRUx5RSxPQUFPLEVBQUcxQyxDQUFDLElBQUs7WUFDZEEsQ0FBQyxDQUFDMkMsZUFBZSxDQUFDLENBQUM7WUFDbkJqQyxRQUFRLENBQUN4QixFQUFFLENBQUM7VUFDZCxDQUFDO1VBQUEsSUFBQWtELFNBQUE7WUFBQSxPQUFBRixpQkFBQSxDQUVBekUsS0FBSztVQUFBO1FBQUE7UUFBQSxPQUFBNkUsTUFBQTtNQUFBO0lBR1g7SUFBQSxPQUFBbkIsSUFBQTtFQUFBO0FBS1gsQ0FBQztBQUFBeUIsZ0JBQUEifQ==