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
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
import { template as _$template } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
import { delegateEvents as _$delegateEvents } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
import { className as _$className } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
import { setAttribute as _$setAttribute } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
import { use as _$use } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
import { effect as _$effect } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
import { insert as _$insert } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
import { createComponent as _$createComponent } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
const _tmpl$ = /*#__PURE__*/_$template(`<div class=relative>`),
  _tmpl$2 = /*#__PURE__*/_$template(`<div class="flex h-full flex-col gap-2"><div class="flex items-center gap-2"><div class="tabs-boxed tabs gap-2"></div></div><input class="input input-bordered input-primary"><div class="flex-1 overflow-y-auto">`),
  _tmpl$3 = /*#__PURE__*/_$template(`<button><span></span><div class="badge badge-sm">`),
  _tmpl$4 = /*#__PURE__*/_$template(`<div class="badge badge-sm">`),
  _tmpl$5 = /*#__PURE__*/_$template(`<div class="absolute inset-x-0 top-0 pb-2 last:pb-0"><div class="card card-bordered card-compact bg-base-200 p-4"><div class="flex items-center gap-2"><span class=break-all></span></div><div class="text-xs text-slate-500"> :: `),
  _tmpl$6 = /*#__PURE__*/_$template(`<div class="absolute inset-x-0 top-0 pb-2 last:pb-0"><div class="card card-bordered card-compact bg-base-200 p-4"><div class="flex items-center gap-2 pr-8"><span class=break-all></span><div class="badge badge-sm"></div></div><div class="text-xs text-slate-500"> / <!> /<!> `);
import { IconReload } from "/node_modules/.vite/deps/@tabler_icons-solidjs.js?v=000c47cd";
import { createVirtualizer } from "/node_modules/.vite/deps/@tanstack_solid-virtual.js?v=2e86f7bc";
import { matchSorter } from "/node_modules/.vite/deps/match-sorter.js?v=3a293f43";
import { For, Show, createMemo, createSignal, onMount } from "/node_modules/.vite/deps/solid-js.js?v=93754656";
import { twMerge } from "/node_modules/.vite/deps/tailwind-merge.js?v=d1b42b68";
import { Button } from "/src/components/index.ts";
import { useStringBooleanMap } from "/src/helpers/index.ts";
import { useI18n } from "/src/i18n/index.tsx";
import { formatTimeFromNow, useRules } from "/src/signals/index.ts";
var ActiveTab = /*#__PURE__*/function (ActiveTab) {
  ActiveTab["ruleProviders"] = "ruleProviders";
  ActiveTab["rules"] = "rules";
  return ActiveTab;
}(ActiveTab || {});
export default (() => {
  const [t] = useI18n();
  const {
    rules,
    ruleProviders,
    updateRules,
    updateAllRuleProvider,
    updateRuleProviderByName
  } = useRules();
  onMount(updateRules);
  const {
    map: updatingMap,
    setWithCallback: setUpdatingMap
  } = useStringBooleanMap();
  const [allProviderIsUpdating, setAllProviderIsUpdating] = createSignal(false);
  const onUpdateProviderClick = (e, name) => {
    e.stopPropagation();
    void setUpdatingMap(name, () => updateRuleProviderByName(name));
  };
  const onUpdateAllProviderClick = async e => {
    e.stopPropagation();
    setAllProviderIsUpdating(true);
    try {
      await updateAllRuleProvider();
    } catch {}
    setAllProviderIsUpdating(false);
  };
  const [activeTab, setActiveTab] = createSignal(ActiveTab.rules);
  const tabs = () => [{
    type: ActiveTab.rules,
    name: t('rules'),
    count: rules().length
  }, {
    type: ActiveTab.ruleProviders,
    name: t('ruleProviders'),
    count: ruleProviders().length
  }];
  const [globalFilter, setGlobalFilter] = createSignal('');
  const filteredRules = createMemo(() => globalFilter() ? matchSorter(rules(), globalFilter(), {
    keys: ['type', 'payload', 'type']
  }) : rules());
  const filteredRuleProviders = createMemo(() => globalFilter() ? matchSorter(ruleProviders(), globalFilter(), {
    keys: ['name', 'vehicleType', 'behavior']
  }) : ruleProviders());
  let scrollElementRef;
  const getRuleItemKey = ({
    type,
    payload,
    proxy
  }) => `${type}-${payload}-${proxy}`;
  const ruleVirtualizer = createVirtualizer({
    get count() {
      return filteredRules().length;
    },
    getItemKey: index => getRuleItemKey(filteredRules()[index]),
    getScrollElement: () => scrollElementRef,
    estimateSize: () => 82,
    overscan: 5
  });
  const ruleVirtualizerItems = ruleVirtualizer.getVirtualItems();
  const getRuleProviderItemKey = ({
    type,
    name,
    vehicleType,
    behavior
  }) => `${type}-${name}-${vehicleType}-${behavior}`;
  const ruleProviderVirtualizer = createVirtualizer({
    get count() {
      return filteredRuleProviders().length;
    },
    getItemKey: index => getRuleProviderItemKey(filteredRuleProviders()[index]),
    getScrollElement: () => scrollElementRef,
    estimateSize: () => 82,
    overscan: 5
  });
  const ruleProviderVirtualizerItems = ruleProviderVirtualizer.getVirtualItems();
  return (() => {
    const _el$ = _tmpl$2(),
      _el$2 = _el$.firstChild,
      _el$3 = _el$2.firstChild,
      _el$4 = _el$2.nextSibling,
      _el$5 = _el$4.nextSibling;
    _$insert(_el$3, _$createComponent(For, {
      get each() {
        return tabs();
      },
      children: tab => (() => {
        const _el$8 = _tmpl$3(),
          _el$9 = _el$8.firstChild,
          _el$10 = _el$9.nextSibling;
        _el$8.$$click = () => setActiveTab(tab.type);
        _$insert(_el$9, () => tab.name);
        _$insert(_el$10, () => tab.count);
        _$effect(() => _$className(_el$8, twMerge(activeTab() === tab.type && 'tab-active', 'tab tab-sm gap-2 px-2 md:tab-md')));
        return _el$8;
      })()
    }));
    _$insert(_el$2, _$createComponent(Show, {
      get when() {
        return activeTab() === ActiveTab.ruleProviders;
      },
      get children() {
        return _$createComponent(Button, {
          "class": "btn btn-circle btn-sm",
          get disabled() {
            return allProviderIsUpdating();
          },
          onClick: e => onUpdateAllProviderClick(e),
          get icon() {
            return _$createComponent(IconReload, {
              get ["class"]() {
                return twMerge(allProviderIsUpdating() && 'animate-spin text-success');
              }
            });
          }
        });
      }
    }), null);
    _el$4.$$input = e => setGlobalFilter(e.currentTarget.value);
    _$use(ref => scrollElementRef = ref, _el$5);
    _$insert(_el$5, _$createComponent(Show, {
      get when() {
        return activeTab() === ActiveTab.rules;
      },
      get children() {
        const _el$6 = _tmpl$();
        _$insert(_el$6, () => ruleVirtualizerItems.map(virtualizerItem => {
          const rule = filteredRules().find(rule => getRuleItemKey(rule) === virtualizerItem.key);
          return (() => {
            const _el$11 = _tmpl$5(),
              _el$12 = _el$11.firstChild,
              _el$13 = _el$12.firstChild,
              _el$14 = _el$13.firstChild,
              _el$16 = _el$13.nextSibling,
              _el$17 = _el$16.firstChild;
            _$use(el => onMount(() => ruleVirtualizer.measureElement(el)), _el$11);
            _$insert(_el$14, () => rule.payload);
            _$insert(_el$13, _$createComponent(Show, {
              get when() {
                return rule.size !== -1;
              },
              get children() {
                const _el$15 = _tmpl$4();
                _$insert(_el$15, () => rule.size);
                return _el$15;
              }
            }), null);
            _$insert(_el$16, () => rule.type, _el$17);
            _$insert(_el$16, () => rule.proxy, null);
            _$effect(_p$ => {
              const _v$ = virtualizerItem.index,
                _v$2 = `translateY(${virtualizerItem.start}px)`;
              _v$ !== _p$._v$ && _$setAttribute(_el$11, "data-index", _p$._v$ = _v$);
              _v$2 !== _p$._v$2 && ((_p$._v$2 = _v$2) != null ? _el$11.style.setProperty("transform", _v$2) : _el$11.style.removeProperty("transform"));
              return _p$;
            }, {
              _v$: undefined,
              _v$2: undefined
            });
            return _el$11;
          })();
        }));
        _$effect(() => `${ruleVirtualizer.getTotalSize()}px` != null ? _el$6.style.setProperty("height", `${ruleVirtualizer.getTotalSize()}px`) : _el$6.style.removeProperty("height"));
        return _el$6;
      }
    }), null);
    _$insert(_el$5, _$createComponent(Show, {
      get when() {
        return activeTab() === ActiveTab.ruleProviders;
      },
      get children() {
        const _el$7 = _tmpl$();
        _$insert(_el$7, () => ruleProviderVirtualizerItems.map(virtualizerItem => {
          const ruleProvider = ruleProviders().find(ruleProvider => getRuleProviderItemKey(ruleProvider) === virtualizerItem.key);
          return (() => {
            const _el$18 = _tmpl$6(),
              _el$19 = _el$18.firstChild,
              _el$20 = _el$19.firstChild,
              _el$21 = _el$20.firstChild,
              _el$22 = _el$21.nextSibling,
              _el$23 = _el$20.nextSibling,
              _el$24 = _el$23.firstChild,
              _el$27 = _el$24.nextSibling,
              _el$25 = _el$27.nextSibling,
              _el$28 = _el$25.nextSibling,
              _el$26 = _el$28.nextSibling;
            _$use(el => onMount(() => ruleProviderVirtualizer.measureElement(el)), _el$18);
            _$insert(_el$21, () => ruleProvider.name);
            _$insert(_el$22, () => ruleProvider.ruleCount);
            _$insert(_el$23, () => ruleProvider.vehicleType, _el$24);
            _$insert(_el$23, () => ruleProvider.behavior, _el$27);
            _$insert(_el$23, () => t('updated'), _el$28);
            _$insert(_el$23, () => formatTimeFromNow(ruleProvider.updatedAt), null);
            _$insert(_el$19, _$createComponent(Button, {
              "class": "btn-circle btn-sm absolute right-2 top-2 mr-2 h-4",
              get disabled() {
                return updatingMap()[ruleProvider.name];
              },
              onClick: e => onUpdateProviderClick(e, ruleProvider.name),
              get icon() {
                return _$createComponent(IconReload, {
                  get ["class"]() {
                    return twMerge(updatingMap()[ruleProvider.name] && 'animate-spin text-success');
                  }
                });
              }
            }), null);
            _$effect(_p$ => {
              const _v$3 = virtualizerItem.index,
                _v$4 = `translateY(${virtualizerItem.start}px)`;
              _v$3 !== _p$._v$3 && _$setAttribute(_el$18, "data-index", _p$._v$3 = _v$3);
              _v$4 !== _p$._v$4 && ((_p$._v$4 = _v$4) != null ? _el$18.style.setProperty("transform", _v$4) : _el$18.style.removeProperty("transform"));
              return _p$;
            }, {
              _v$3: undefined,
              _v$4: undefined
            });
            return _el$18;
          })();
        }));
        _$effect(() => `${ruleProviderVirtualizer.getTotalSize()}px` != null ? _el$7.style.setProperty("height", `${ruleProviderVirtualizer.getTotalSize()}px`) : _el$7.style.removeProperty("height"));
        return _el$7;
      }
    }), null);
    _$effect(() => _$setAttribute(_el$4, "placeholder", t('search')));
    _$effect(() => _el$4.value = globalFilter());
    return _el$;
  })();
});
_$delegateEvents(["input", "click"]);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJY29uUmVsb2FkIiwiY3JlYXRlVmlydHVhbGl6ZXIiLCJtYXRjaFNvcnRlciIsIkZvciIsIlNob3ciLCJjcmVhdGVNZW1vIiwiY3JlYXRlU2lnbmFsIiwib25Nb3VudCIsInR3TWVyZ2UiLCJCdXR0b24iLCJ1c2VTdHJpbmdCb29sZWFuTWFwIiwidXNlSTE4biIsImZvcm1hdFRpbWVGcm9tTm93IiwidXNlUnVsZXMiLCJBY3RpdmVUYWIiLCJ0IiwicnVsZXMiLCJydWxlUHJvdmlkZXJzIiwidXBkYXRlUnVsZXMiLCJ1cGRhdGVBbGxSdWxlUHJvdmlkZXIiLCJ1cGRhdGVSdWxlUHJvdmlkZXJCeU5hbWUiLCJtYXAiLCJ1cGRhdGluZ01hcCIsInNldFdpdGhDYWxsYmFjayIsInNldFVwZGF0aW5nTWFwIiwiYWxsUHJvdmlkZXJJc1VwZGF0aW5nIiwic2V0QWxsUHJvdmlkZXJJc1VwZGF0aW5nIiwib25VcGRhdGVQcm92aWRlckNsaWNrIiwiZSIsIm5hbWUiLCJzdG9wUHJvcGFnYXRpb24iLCJvblVwZGF0ZUFsbFByb3ZpZGVyQ2xpY2siLCJhY3RpdmVUYWIiLCJzZXRBY3RpdmVUYWIiLCJ0YWJzIiwidHlwZSIsImNvdW50IiwibGVuZ3RoIiwiZ2xvYmFsRmlsdGVyIiwic2V0R2xvYmFsRmlsdGVyIiwiZmlsdGVyZWRSdWxlcyIsImtleXMiLCJmaWx0ZXJlZFJ1bGVQcm92aWRlcnMiLCJzY3JvbGxFbGVtZW50UmVmIiwiZ2V0UnVsZUl0ZW1LZXkiLCJwYXlsb2FkIiwicHJveHkiLCJydWxlVmlydHVhbGl6ZXIiLCJnZXRJdGVtS2V5IiwiaW5kZXgiLCJnZXRTY3JvbGxFbGVtZW50IiwiZXN0aW1hdGVTaXplIiwib3ZlcnNjYW4iLCJydWxlVmlydHVhbGl6ZXJJdGVtcyIsImdldFZpcnR1YWxJdGVtcyIsImdldFJ1bGVQcm92aWRlckl0ZW1LZXkiLCJ2ZWhpY2xlVHlwZSIsImJlaGF2aW9yIiwicnVsZVByb3ZpZGVyVmlydHVhbGl6ZXIiLCJydWxlUHJvdmlkZXJWaXJ0dWFsaXplckl0ZW1zIiwiX2VsJCIsIl90bXBsJDIiLCJfZWwkMiIsImZpcnN0Q2hpbGQiLCJfZWwkMyIsIl9lbCQ0IiwibmV4dFNpYmxpbmciLCJfZWwkNSIsIl8kaW5zZXJ0IiwiXyRjcmVhdGVDb21wb25lbnQiLCJlYWNoIiwiY2hpbGRyZW4iLCJ0YWIiLCJfZWwkOCIsIl90bXBsJDMiLCJfZWwkOSIsIl9lbCQxMCIsIiQkY2xpY2siLCJfJGVmZmVjdCIsIl8kY2xhc3NOYW1lIiwid2hlbiIsImRpc2FibGVkIiwib25DbGljayIsImljb24iLCJjbGFzcyIsIiQkaW5wdXQiLCJjdXJyZW50VGFyZ2V0IiwidmFsdWUiLCJfJHVzZSIsInJlZiIsIl9lbCQ2IiwiX3RtcGwkIiwidmlydHVhbGl6ZXJJdGVtIiwicnVsZSIsImZpbmQiLCJrZXkiLCJfZWwkMTEiLCJfdG1wbCQ1IiwiX2VsJDEyIiwiX2VsJDEzIiwiX2VsJDE0IiwiX2VsJDE2IiwiX2VsJDE3IiwiZWwiLCJtZWFzdXJlRWxlbWVudCIsInNpemUiLCJfZWwkMTUiLCJfdG1wbCQ0IiwiX3AkIiwiX3YkIiwiX3YkMiIsInN0YXJ0IiwiXyRzZXRBdHRyaWJ1dGUiLCJzdHlsZSIsInNldFByb3BlcnR5IiwicmVtb3ZlUHJvcGVydHkiLCJ1bmRlZmluZWQiLCJnZXRUb3RhbFNpemUiLCJfZWwkNyIsInJ1bGVQcm92aWRlciIsIl9lbCQxOCIsIl90bXBsJDYiLCJfZWwkMTkiLCJfZWwkMjAiLCJfZWwkMjEiLCJfZWwkMjIiLCJfZWwkMjMiLCJfZWwkMjQiLCJfZWwkMjciLCJfZWwkMjUiLCJfZWwkMjgiLCJfZWwkMjYiLCJydWxlQ291bnQiLCJ1cGRhdGVkQXQiLCJfdiQzIiwiX3YkNCIsIl8kZGVsZWdhdGVFdmVudHMiXSwic291cmNlcyI6WyJSdWxlcy50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSWNvblJlbG9hZCB9IGZyb20gJ0B0YWJsZXIvaWNvbnMtc29saWRqcydcclxuaW1wb3J0IHsgY3JlYXRlVmlydHVhbGl6ZXIgfSBmcm9tICdAdGFuc3RhY2svc29saWQtdmlydHVhbCdcclxuaW1wb3J0IHsgbWF0Y2hTb3J0ZXIgfSBmcm9tICdtYXRjaC1zb3J0ZXInXHJcbmltcG9ydCB7IEZvciwgU2hvdywgY3JlYXRlTWVtbywgY3JlYXRlU2lnbmFsLCBvbk1vdW50IH0gZnJvbSAnc29saWQtanMnXHJcbmltcG9ydCB7IHR3TWVyZ2UgfSBmcm9tICd0YWlsd2luZC1tZXJnZSdcclxuaW1wb3J0IHsgQnV0dG9uIH0gZnJvbSAnfi9jb21wb25lbnRzJ1xyXG5pbXBvcnQgeyB1c2VTdHJpbmdCb29sZWFuTWFwIH0gZnJvbSAnfi9oZWxwZXJzJ1xyXG5pbXBvcnQgeyB1c2VJMThuIH0gZnJvbSAnfi9pMThuJ1xyXG5pbXBvcnQgeyBmb3JtYXRUaW1lRnJvbU5vdywgdXNlUnVsZXMgfSBmcm9tICd+L3NpZ25hbHMnXHJcbmltcG9ydCB7IFJ1bGUsIFJ1bGVQcm92aWRlciB9IGZyb20gJ34vdHlwZXMnXHJcblxyXG5lbnVtIEFjdGl2ZVRhYiB7XHJcbiAgcnVsZVByb3ZpZGVycyA9ICdydWxlUHJvdmlkZXJzJyxcclxuICBydWxlcyA9ICdydWxlcycsXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0ICgpID0+IHtcclxuICBjb25zdCBbdF0gPSB1c2VJMThuKClcclxuICBjb25zdCB7XHJcbiAgICBydWxlcyxcclxuICAgIHJ1bGVQcm92aWRlcnMsXHJcbiAgICB1cGRhdGVSdWxlcyxcclxuICAgIHVwZGF0ZUFsbFJ1bGVQcm92aWRlcixcclxuICAgIHVwZGF0ZVJ1bGVQcm92aWRlckJ5TmFtZSxcclxuICB9ID0gdXNlUnVsZXMoKVxyXG5cclxuICBvbk1vdW50KHVwZGF0ZVJ1bGVzKVxyXG5cclxuICBjb25zdCB7IG1hcDogdXBkYXRpbmdNYXAsIHNldFdpdGhDYWxsYmFjazogc2V0VXBkYXRpbmdNYXAgfSA9XHJcbiAgICB1c2VTdHJpbmdCb29sZWFuTWFwKClcclxuICBjb25zdCBbYWxsUHJvdmlkZXJJc1VwZGF0aW5nLCBzZXRBbGxQcm92aWRlcklzVXBkYXRpbmddID0gY3JlYXRlU2lnbmFsKGZhbHNlKVxyXG5cclxuICBjb25zdCBvblVwZGF0ZVByb3ZpZGVyQ2xpY2sgPSAoZTogTW91c2VFdmVudCwgbmFtZTogc3RyaW5nKSA9PiB7XHJcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpXHJcbiAgICB2b2lkIHNldFVwZGF0aW5nTWFwKG5hbWUsICgpID0+IHVwZGF0ZVJ1bGVQcm92aWRlckJ5TmFtZShuYW1lKSlcclxuICB9XHJcblxyXG4gIGNvbnN0IG9uVXBkYXRlQWxsUHJvdmlkZXJDbGljayA9IGFzeW5jIChlOiBNb3VzZUV2ZW50KSA9PiB7XHJcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpXHJcbiAgICBzZXRBbGxQcm92aWRlcklzVXBkYXRpbmcodHJ1ZSlcclxuICAgIHRyeSB7XHJcbiAgICAgIGF3YWl0IHVwZGF0ZUFsbFJ1bGVQcm92aWRlcigpXHJcbiAgICB9IGNhdGNoIHt9XHJcbiAgICBzZXRBbGxQcm92aWRlcklzVXBkYXRpbmcoZmFsc2UpXHJcbiAgfVxyXG5cclxuICBjb25zdCBbYWN0aXZlVGFiLCBzZXRBY3RpdmVUYWJdID0gY3JlYXRlU2lnbmFsKEFjdGl2ZVRhYi5ydWxlcylcclxuXHJcbiAgY29uc3QgdGFicyA9ICgpID0+IFtcclxuICAgIHtcclxuICAgICAgdHlwZTogQWN0aXZlVGFiLnJ1bGVzLFxyXG4gICAgICBuYW1lOiB0KCdydWxlcycpLFxyXG4gICAgICBjb3VudDogcnVsZXMoKS5sZW5ndGgsXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICB0eXBlOiBBY3RpdmVUYWIucnVsZVByb3ZpZGVycyxcclxuICAgICAgbmFtZTogdCgncnVsZVByb3ZpZGVycycpLFxyXG4gICAgICBjb3VudDogcnVsZVByb3ZpZGVycygpLmxlbmd0aCxcclxuICAgIH0sXHJcbiAgXVxyXG5cclxuICBjb25zdCBbZ2xvYmFsRmlsdGVyLCBzZXRHbG9iYWxGaWx0ZXJdID0gY3JlYXRlU2lnbmFsKCcnKVxyXG5cclxuICBjb25zdCBmaWx0ZXJlZFJ1bGVzID0gY3JlYXRlTWVtbygoKSA9PlxyXG4gICAgZ2xvYmFsRmlsdGVyKClcclxuICAgICAgPyBtYXRjaFNvcnRlcihydWxlcygpLCBnbG9iYWxGaWx0ZXIoKSwge1xyXG4gICAgICAgICAga2V5czogWyd0eXBlJywgJ3BheWxvYWQnLCAndHlwZSddIGFzIChrZXlvZiBSdWxlKVtdLFxyXG4gICAgICAgIH0pXHJcbiAgICAgIDogcnVsZXMoKSxcclxuICApXHJcblxyXG4gIGNvbnN0IGZpbHRlcmVkUnVsZVByb3ZpZGVycyA9IGNyZWF0ZU1lbW8oKCkgPT5cclxuICAgIGdsb2JhbEZpbHRlcigpXHJcbiAgICAgID8gbWF0Y2hTb3J0ZXIocnVsZVByb3ZpZGVycygpLCBnbG9iYWxGaWx0ZXIoKSwge1xyXG4gICAgICAgICAga2V5czogWyduYW1lJywgJ3ZlaGljbGVUeXBlJywgJ2JlaGF2aW9yJ10gYXMgKGtleW9mIFJ1bGVQcm92aWRlcilbXSxcclxuICAgICAgICB9KVxyXG4gICAgICA6IHJ1bGVQcm92aWRlcnMoKSxcclxuICApXHJcblxyXG4gIGxldCBzY3JvbGxFbGVtZW50UmVmOiBIVE1MRGl2RWxlbWVudCB8IHVuZGVmaW5lZFxyXG5cclxuICBjb25zdCBnZXRSdWxlSXRlbUtleSA9ICh7IHR5cGUsIHBheWxvYWQsIHByb3h5IH06IFJ1bGUpID0+XHJcbiAgICBgJHt0eXBlfS0ke3BheWxvYWR9LSR7cHJveHl9YFxyXG5cclxuICBjb25zdCBydWxlVmlydHVhbGl6ZXIgPSBjcmVhdGVWaXJ0dWFsaXplcih7XHJcbiAgICBnZXQgY291bnQoKSB7XHJcbiAgICAgIHJldHVybiBmaWx0ZXJlZFJ1bGVzKCkubGVuZ3RoXHJcbiAgICB9LFxyXG4gICAgZ2V0SXRlbUtleTogKGluZGV4KSA9PiBnZXRSdWxlSXRlbUtleShmaWx0ZXJlZFJ1bGVzKClbaW5kZXhdKSxcclxuICAgIGdldFNjcm9sbEVsZW1lbnQ6ICgpID0+IHNjcm9sbEVsZW1lbnRSZWYhLFxyXG4gICAgZXN0aW1hdGVTaXplOiAoKSA9PiA4MixcclxuICAgIG92ZXJzY2FuOiA1LFxyXG4gIH0pXHJcblxyXG4gIGNvbnN0IHJ1bGVWaXJ0dWFsaXplckl0ZW1zID0gcnVsZVZpcnR1YWxpemVyLmdldFZpcnR1YWxJdGVtcygpXHJcblxyXG4gIGNvbnN0IGdldFJ1bGVQcm92aWRlckl0ZW1LZXkgPSAoe1xyXG4gICAgdHlwZSxcclxuICAgIG5hbWUsXHJcbiAgICB2ZWhpY2xlVHlwZSxcclxuICAgIGJlaGF2aW9yLFxyXG4gIH06IFJ1bGVQcm92aWRlcikgPT4gYCR7dHlwZX0tJHtuYW1lfS0ke3ZlaGljbGVUeXBlfS0ke2JlaGF2aW9yfWBcclxuXHJcbiAgY29uc3QgcnVsZVByb3ZpZGVyVmlydHVhbGl6ZXIgPSBjcmVhdGVWaXJ0dWFsaXplcih7XHJcbiAgICBnZXQgY291bnQoKSB7XHJcbiAgICAgIHJldHVybiBmaWx0ZXJlZFJ1bGVQcm92aWRlcnMoKS5sZW5ndGhcclxuICAgIH0sXHJcbiAgICBnZXRJdGVtS2V5OiAoaW5kZXgpID0+XHJcbiAgICAgIGdldFJ1bGVQcm92aWRlckl0ZW1LZXkoZmlsdGVyZWRSdWxlUHJvdmlkZXJzKClbaW5kZXhdKSxcclxuICAgIGdldFNjcm9sbEVsZW1lbnQ6ICgpID0+IHNjcm9sbEVsZW1lbnRSZWYhLFxyXG4gICAgZXN0aW1hdGVTaXplOiAoKSA9PiA4MixcclxuICAgIG92ZXJzY2FuOiA1LFxyXG4gIH0pXHJcblxyXG4gIGNvbnN0IHJ1bGVQcm92aWRlclZpcnR1YWxpemVySXRlbXMgPSBydWxlUHJvdmlkZXJWaXJ0dWFsaXplci5nZXRWaXJ0dWFsSXRlbXMoKVxyXG5cclxuICByZXR1cm4gKFxyXG4gICAgPGRpdiBjbGFzcz1cImZsZXggaC1mdWxsIGZsZXgtY29sIGdhcC0yXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJzLWJveGVkIHRhYnMgZ2FwLTJcIj5cclxuICAgICAgICAgIDxGb3IgZWFjaD17dGFicygpfT5cclxuICAgICAgICAgICAgeyh0YWIpID0+IChcclxuICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICBjbGFzcz17dHdNZXJnZShcclxuICAgICAgICAgICAgICAgICAgYWN0aXZlVGFiKCkgPT09IHRhYi50eXBlICYmICd0YWItYWN0aXZlJyxcclxuICAgICAgICAgICAgICAgICAgJ3RhYiB0YWItc20gZ2FwLTIgcHgtMiBtZDp0YWItbWQnLFxyXG4gICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldEFjdGl2ZVRhYih0YWIudHlwZSl9XHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4+e3RhYi5uYW1lfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYWRnZSBiYWRnZS1zbVwiPnt0YWIuY291bnR9PC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICl9XHJcbiAgICAgICAgICA8L0Zvcj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPFNob3cgd2hlbj17YWN0aXZlVGFiKCkgPT09IEFjdGl2ZVRhYi5ydWxlUHJvdmlkZXJzfT5cclxuICAgICAgICAgIDxCdXR0b25cclxuICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWNpcmNsZSBidG4tc21cIlxyXG4gICAgICAgICAgICBkaXNhYmxlZD17YWxsUHJvdmlkZXJJc1VwZGF0aW5nKCl9XHJcbiAgICAgICAgICAgIG9uQ2xpY2s9eyhlKSA9PiBvblVwZGF0ZUFsbFByb3ZpZGVyQ2xpY2soZSl9XHJcbiAgICAgICAgICAgIGljb249e1xyXG4gICAgICAgICAgICAgIDxJY29uUmVsb2FkXHJcbiAgICAgICAgICAgICAgICBjbGFzcz17dHdNZXJnZShcclxuICAgICAgICAgICAgICAgICAgYWxsUHJvdmlkZXJJc1VwZGF0aW5nKCkgJiYgJ2FuaW1hdGUtc3BpbiB0ZXh0LXN1Y2Nlc3MnLFxyXG4gICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIDwvU2hvdz5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8aW5wdXRcclxuICAgICAgICBjbGFzcz1cImlucHV0IGlucHV0LWJvcmRlcmVkIGlucHV0LXByaW1hcnlcIlxyXG4gICAgICAgIHBsYWNlaG9sZGVyPXt0KCdzZWFyY2gnKX1cclxuICAgICAgICB2YWx1ZT17Z2xvYmFsRmlsdGVyKCl9XHJcbiAgICAgICAgb25JbnB1dD17KGUpID0+IHNldEdsb2JhbEZpbHRlcihlLmN1cnJlbnRUYXJnZXQudmFsdWUpfVxyXG4gICAgICAvPlxyXG5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIHJlZj17KHJlZikgPT4gKHNjcm9sbEVsZW1lbnRSZWYgPSByZWYpfVxyXG4gICAgICAgIGNsYXNzPVwiZmxleC0xIG92ZXJmbG93LXktYXV0b1wiXHJcbiAgICAgID5cclxuICAgICAgICA8U2hvdyB3aGVuPXthY3RpdmVUYWIoKSA9PT0gQWN0aXZlVGFiLnJ1bGVzfT5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgY2xhc3M9XCJyZWxhdGl2ZVwiXHJcbiAgICAgICAgICAgIHN0eWxlPXt7IGhlaWdodDogYCR7cnVsZVZpcnR1YWxpemVyLmdldFRvdGFsU2l6ZSgpfXB4YCB9fVxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICB7cnVsZVZpcnR1YWxpemVySXRlbXMubWFwKCh2aXJ0dWFsaXplckl0ZW0pID0+IHtcclxuICAgICAgICAgICAgICBjb25zdCBydWxlID0gZmlsdGVyZWRSdWxlcygpLmZpbmQoXHJcbiAgICAgICAgICAgICAgICAocnVsZSkgPT4gZ2V0UnVsZUl0ZW1LZXkocnVsZSkgPT09IHZpcnR1YWxpemVySXRlbS5rZXksXHJcbiAgICAgICAgICAgICAgKSFcclxuXHJcbiAgICAgICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgcmVmPXsoZWwpID0+XHJcbiAgICAgICAgICAgICAgICAgICAgb25Nb3VudCgoKSA9PiBydWxlVmlydHVhbGl6ZXIubWVhc3VyZUVsZW1lbnQoZWwpKVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGRhdGEtaW5kZXg9e3ZpcnR1YWxpemVySXRlbS5pbmRleH1cclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhYnNvbHV0ZSBpbnNldC14LTAgdG9wLTAgcGItMiBsYXN0OnBiLTBcIlxyXG4gICAgICAgICAgICAgICAgICBzdHlsZT17e1xyXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogYHRyYW5zbGF0ZVkoJHt2aXJ0dWFsaXplckl0ZW0uc3RhcnR9cHgpYCxcclxuICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgY2FyZC1ib3JkZXJlZCBjYXJkLWNvbXBhY3QgYmctYmFzZS0yMDAgcC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJyZWFrLWFsbFwiPntydWxlLnBheWxvYWR9PC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgIDxTaG93IHdoZW49e3J1bGUuc2l6ZSAhPT0gLTF9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmFkZ2UgYmFkZ2Utc21cIj57cnVsZS5zaXplfTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9TaG93PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC14cyB0ZXh0LXNsYXRlLTUwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3J1bGUudHlwZX0gOjoge3J1bGUucHJveHl9XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICB9KX1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvU2hvdz5cclxuXHJcbiAgICAgICAgPFNob3cgd2hlbj17YWN0aXZlVGFiKCkgPT09IEFjdGl2ZVRhYi5ydWxlUHJvdmlkZXJzfT5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgY2xhc3M9XCJyZWxhdGl2ZVwiXHJcbiAgICAgICAgICAgIHN0eWxlPXt7IGhlaWdodDogYCR7cnVsZVByb3ZpZGVyVmlydHVhbGl6ZXIuZ2V0VG90YWxTaXplKCl9cHhgIH19XHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIHtydWxlUHJvdmlkZXJWaXJ0dWFsaXplckl0ZW1zLm1hcCgodmlydHVhbGl6ZXJJdGVtKSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3QgcnVsZVByb3ZpZGVyID0gcnVsZVByb3ZpZGVycygpLmZpbmQoXHJcbiAgICAgICAgICAgICAgICAocnVsZVByb3ZpZGVyKSA9PlxyXG4gICAgICAgICAgICAgICAgICBnZXRSdWxlUHJvdmlkZXJJdGVtS2V5KHJ1bGVQcm92aWRlcikgPT09IHZpcnR1YWxpemVySXRlbS5rZXksXHJcbiAgICAgICAgICAgICAgKSFcclxuXHJcbiAgICAgICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgcmVmPXsoZWwpID0+XHJcbiAgICAgICAgICAgICAgICAgICAgb25Nb3VudCgoKSA9PiBydWxlUHJvdmlkZXJWaXJ0dWFsaXplci5tZWFzdXJlRWxlbWVudChlbCkpXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgZGF0YS1pbmRleD17dmlydHVhbGl6ZXJJdGVtLmluZGV4fVxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImFic29sdXRlIGluc2V0LXgtMCB0b3AtMCBwYi0yIGxhc3Q6cGItMFwiXHJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPXt7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBgdHJhbnNsYXRlWSgke3ZpcnR1YWxpemVySXRlbS5zdGFydH1weClgLFxyXG4gICAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBjYXJkLWJvcmRlcmVkIGNhcmQtY29tcGFjdCBiZy1iYXNlLTIwMCBwLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgcHItOFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJicmVhay1hbGxcIj57cnVsZVByb3ZpZGVyLm5hbWV9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJhZGdlIGJhZGdlLXNtXCI+e3J1bGVQcm92aWRlci5ydWxlQ291bnR9PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhzIHRleHQtc2xhdGUtNTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7cnVsZVByb3ZpZGVyLnZlaGljbGVUeXBlfSAvIHtydWxlUHJvdmlkZXIuYmVoYXZpb3J9IC9cclxuICAgICAgICAgICAgICAgICAgICAgIHt0KCd1cGRhdGVkJyl9IHtmb3JtYXRUaW1lRnJvbU5vdyhydWxlUHJvdmlkZXIudXBkYXRlZEF0KX1cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPEJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4tY2lyY2xlIGJ0bi1zbSBhYnNvbHV0ZSByaWdodC0yIHRvcC0yIG1yLTIgaC00XCJcclxuICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXt1cGRhdGluZ01hcCgpW3J1bGVQcm92aWRlci5uYW1lXX1cclxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eyhlKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvblVwZGF0ZVByb3ZpZGVyQ2xpY2soZSwgcnVsZVByb3ZpZGVyLm5hbWUpXHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICBpY29uPXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgPEljb25SZWxvYWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz17dHdNZXJnZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0aW5nTWFwKClbcnVsZVByb3ZpZGVyLm5hbWVdICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhbmltYXRlLXNwaW4gdGV4dC1zdWNjZXNzJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICB9KX1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvU2hvdz5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICApXHJcbn1cclxuIl0s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