PageSourceSearch

https://hyti.com.br/assets/QFile-DttDAI4q.js

js hyti.com.br collected 2026-09-24 14:09:59 UTC 71,242 bytes, 624 lines download raw bytes

1import { f as createComponent, ag as useAlignProps, J as h, M as hSlot, y as computed, ah as useAlign, q as ref, ai as useFormProps, aj as useSizeProps, X as useDarkProps, k as getCurrentInstance, ak as useFormInject, al as useSize, am as hMergeSlot, Y as useDark, N as stopAndPrevent, an as toRaw, W as QIcon, ao as stop, ap as client, aq as useFieldEmits, ar as useNonInputFieldProps, as as useFieldState, at as fieldValueIsFilled, au as injectProp, av as useField, aw as humanStorageSize, ax as prevent, ay as QChip, az as useFormInputNameAttr } from "./index-vSBdh2XK.js";
2import { u as useFileFormDomProps } from "./QInput-DntAcNzv.js";
3const QCardActions = createComponent({
4  name: "QCardActions",
5  props: {
6    ...useAlignProps,
7    vertical: Boolean
8  },
9  setup(props, { slots }) {
10    const alignClass = useAlign(props);
11    const classes = computed(
12      () => `q-card__actions ${alignClass.value} q-card__actions--${props.vertical === true ? "vert column" : "horiz row"}`
13    );
14    return () => h("div", { class: classes.value }, hSlot(slots.default));
15  }
16});
17function useRefocusTarget(props, rootRef) {
18  const refocusRef = ref(null);
19  const refocusTargetEl = computed(() => {
20    if (props.disable === true) {
21      return null;
22    }
23    return h("span", {
24      ref: refocusRef,
25      class: "no-outline",
26      tabindex: -1
27    });
28  });
29  function refocusTarget(e) {
30    const root = rootRef.value;
31    if (e?.qAvoidFocus === true) return;
32    if (e?.type.indexOf("key") === 0) {
33      if (document.activeElement !== root && root?.contains(document.activeElement) === true) {
34        root.focus();
35      }
36    } else if (refocusRef.value !== null && (e === void 0 || root?.contains(e.target) === true)) {
37      refocusRef.value.focus();
38    }
39  }
40  return {
41    refocusTargetEl,
42    refocusTarget
43  };
44}
45const optionSizes = {
46  xs: 30,
47  sm: 35,
48  md: 40,
49  lg: 50,
50  xl: 60
51};
52const useCheckboxProps = {
53  ...useDarkProps,
54  ...useSizeProps,
55  ...useFormProps,
56  modelValue: {
57    required: true,
58    default: null
59  },
60  val: {},
61  trueValue: { default: true },
62  falseValue: { default: false },
63  indeterminateValue: { default: null },
64  checkedIcon: String,
65  uncheckedIcon: String,
66  indeterminateIcon: String,
67  toggleOrder: {
68    type: String,
69    validator: (v) => v === "tf" || v === "ft"
70  },
71  toggleIndeterminate: Boolean,
72  label: String,
73  leftLabel: Boolean,
74  color: String,
75  keepColor: Boolean,
76  dense: Boolean,
77  disable: Boolean,
78  tabindex: [String, Number]
79};
80const useCheckboxEmits = ["update:modelValue"];
81function useCheckbox(type, getInner) {
82  const { props, slots, emit, proxy } = getCurrentInstance();
83  const { $q } = proxy;
84  const isDark = useDark(props, $q);
85  const rootRef = ref(null);
86  const { refocusTargetEl, refocusTarget } = useRefocusTarget(props, rootRef);
87  const sizeStyle = useSize(props, optionSizes);
88  const modelIsArray = computed(
89    () => props.val !== void 0 && Array.isArray(props.modelValue)
90  );
91  const index = computed(() => {
92    const val = toRaw(props.val);
93    return modelIsArray.value === true ? props.modelValue.findIndex((opt) => toRaw(opt) === val) : -1;
94  });
95  const isTrue = computed(() => modelIsArray.value === true ? index.value !== -1 : toRaw(props.modelValue) === toRaw(props.trueValue));
96  const isFalse = computed(() => modelIsArray.value === true ? index.value === -1 : toRaw(props.modelValue) === toRaw(props.falseValue));
97  const isIndeterminate = computed(
98    () => isTrue.value === false && isFalse.value === false
99  );
100  const tabindex = computed(() => props.disable === true ? -1 : props.tabindex || 0);
101  const classes = computed(
102    () => `q-${type} cursor-pointer no-outline row inline no-wrap items-center` + (props.disable === true ? " disabled" : "") + (isDark.value === true ? ` q-${type}--dark` : "") + (props.dense === true ? ` q-${type}--dense` : "") + (props.leftLabel === true ? " reverse" : "")
103  );
104  const innerClass = computed(() => {
105    const state = isTrue.value === true ? "truthy" : isFalse.value === true ? "falsy" : "
105indet";
106    const color = props.color !== void 0 && (props.keepColor === true || isTrue.value === true) ? ` text-${props.color}` : "";
107    return `q-${type}__inner relative-position non-selectable q-${type}__inner--${state}${color}`;
108  });
109  const formAttrs = computed(() => {
110    const prop = { type: "checkbox" };
111    props.name !== void 0 && Object.assign(prop, {
112      // see https://vuejs.org/guide/extras/render-function.html#creating-vnodes (.prop)
113      ".checked": isTrue.value,
114      "^checked": isTrue.value === true ? "checked" : void 0,
115      name: props.name,
116      value: modelIsArray.value === true ? props.val : props.trueValue
117    });
118    return prop;
119  });
120  const injectFormInput = useFormInject(formAttrs);
121  const attributes = computed(() => {
122    const attrs = {
123      tabindex: tabindex.value,
124      role: "switch",
125      "aria-label": props.label,
126      "aria-checked": isIndeterminate.value === true ? "mixed" : isTrue.value === true ? "true" : "false"
127    };
128    if (props.disable === true) {
129      attrs["aria-disabled"] = "true";
130    }
131    return attrs;
132  });
133  function onClick(e) {
134    if (e !== void 0) {
135      stopAndPrevent(e);
136      refocusTarget(e);
137    }
138    if (props.disable !== true) {
139      emit("update:modelValue", getNextValue(), e);
140    }
141  }
142  function getNextValue() {
143    if (modelIsArray.value === true) {
144      if (isTrue.value === true) {
145        const val = props.modelValue.slice();
146        val.splice(index.value, 1);
147        return val;
148      }
149      return props.modelValue.concat([props.val]);
150    }
151    if (isTrue.value === true) {
152      if (props.toggleOrder !== "ft" || props.toggleIndeterminate === false) {
153        return props.falseValue;
154      }
155    } else if (isFalse.value === true) {
156      if (props.toggleOrder === "ft" || props.toggleIndeterminate === false) {
157        return props.trueValue;
158      }
159    } else {
160      return props.toggleOrder !== "ft" ? props.trueValue : props.falseValue;
161    }
162    return props.indeterminateValue;
163  }
164  function onKeydown(e) {
165    if (e.keyCode === 13 || e.keyCode === 32) {
166      stopAndPrevent(e);
167    }
168  }
169  function onKeyup(e) {
170    if (e.keyCode === 13 || e.keyCode === 32) {
171      onClick(e);
172    }
173  }
174  const getInnerContent = getInner(isTrue, isIndeterminate);
175  Object.assign(proxy, { toggle: onClick });
176  return () => {
177    const inner = getInnerContent();
178    props.disable !== true && injectFormInput(
179      inner,
180      "unshift",
181      ` q-${type}__native absolute q-ma-none q-pa-none`
182    );
183    const child = [
184      h("div", {
185        class: innerClass.value,
186        style: sizeStyle.value,
187        "aria-hidden": "true"
188      }, inner)
189    ];
190    if (refocusTargetEl.value !== null) {
191      child.push(refocusTargetEl.value);
192    }
193    const label = props.label !== void 0 ? hMergeSlot(slots.default, [props.label]) : hSlot(slots.default);
194    label !== void 0 && child.push(
195      h("div", {
196        class: `q-${type}__label q-anchor--skip`
197      }, label)
198    );
199    return h("div", {
200      ref: rootRef,
201      class: classes.value,
202      ...attributes.value,
203      onClick,
204      onKeydown,
205      onKeyup
206    }, child);
207  };
208}
209const QToggle = createComponent({
210  name: "QToggle",
211  props: {
212    ...useCheckboxProps,
213    icon: String,
214    iconColor: String
215  },
216  emits: useCheckboxEmits,
217  setup(props) {
218    function getInner(isTrue, isIndeterminate) {
219      const icon = computed(
220        () => (isTrue.value === true ? props.checkedIcon : isIndeterminate.value === true ? props.indeterminateIcon : props.uncheckedIcon) || props.icon
221      );
222      const color = computed(() => isTrue.value === true ? props.iconColor : null);
223      return () => [
224        h("div", { class: "q-toggle__track" }),
225        h(
226          "div",
227          {
228            class: "q-toggle__thumb absolute flex flex-center no-wrap"
229          },
230          icon.value !== void 0 ? [
231            h(QIcon, {
232              name: icon.value,
233              color: color.value
234            })
235          ] : void 0
236        )
237      ];
238    }
239    return useCheckbox("toggle", getInner);
240  }
241});
242function filterFiles(files, rejectedFiles, failedPropValidation, filterFn) {
243  const acceptedFiles = [];
244  files.forEach((file) => {
245    if (filterFn(file) === true) {
246      acceptedFiles.push(file);
247    } else {
248      rejectedFiles.push({ failedPropValidation, file });
249    }
250  });
251  return acceptedFiles;
252}
253function stopAndPreventDrag(e) {
254  if (e?.dataTransfer) {
255    e.dataTransfer.dropEffect = "copy";
256  }
257  stopAndPrevent(e);
258}
259const useFileProps = {
260  multiple: Boolean,
261  accept: String,
262  capture: String,
263  maxFileSize: [Number, String],
264  maxTotalSize: [Number, String],
265  maxFiles: [Number, String],
266  filter: Function
267};
268const useFileEmits = ["rejected"];
269function useFile({
270  editable,
271  dnd,
272  getFileInput,
273  addFilesToQueue
274}) {
275  const { props, emit, proxy } = getCurrentInstance();
276  const dndRef = ref(null);
277  const extensions = computed(() => props.accept !== void 0 ? props.accept.split(",").map((ext) => {
278    ext = ext.trim();
279    if (ext === "*") {
280      return "*/";
281    } else if (ext.endsWith("/*")) {
282      ext = ext.slice(0, ext.length - 1);
283    }
284    return ext.toUpperCase();
285  }) : null);
286  const maxFilesNumber = computed(() => parseInt(props.maxFiles, 10));
287  const maxTotalSizeNumber = computed(() => parseInt(props.maxTotalSize, 10));
288  function pickFiles(e) {
289    if (editable.value) {
290      if (e !== Object(e)) {
291        e = { target: null };
292      }
293      if (e.target?.matches('input[type="file"]') === true) {
294        e.clientX === 0 && e.clientY === 0 && stop(e);
295      } else {
296        const input = getFileInput();
297        if (input !== e.target) input?.click(e);
298      }
299    }
300  }
301  function addFiles(files) {
302    if (editable.value && files) {
303      addFilesToQueue(null, files);
304    }
305  }
306  function processFiles(e, filesToProcess, currentFileList, append) {
307    let files = Array.from(filesToProcess || e.target.files);
308    const rejectedFiles = [];
309    const done = () => {
310      if (rejectedFiles.length !== 0) {
311        emit("rejected", rejectedFiles);
312      }
313    };
314    if (props.accept !== void 0 && extensions.value.indexOf("*/") === -1) {
315      files = filterFiles(files, rejectedFiles, "accept", (file) => {
316        return extensions.value.some((ext) => file.type.toUpperCase().startsWith(ext) || file.name.toUpperCase().endsWith(ext));
317      });
318      if (files.length === 0) {
319        return done();
320      }
321    }
322    if (props.maxFileSize !== void 0) {
323      const maxFileSize = parseInt(props.maxFileSize, 10);
324      files = filterFiles(files, rejectedFiles, "max-file-size", (file) => {
325        return file.size <= maxFileSize;
326      });
327      if (files.length === 0) {
328        return done();
329      }
330    }
331    if (props.multiple !== true && files.length !== 0) {
332      files = [files[0]];
333    }
334    files.forEach((file) => {
335      file.__key = file.webkitRelativePath + file.lastModified + file.name + file.size;
336    });
337    if (append === true) {
338      const filenameMap = currentFileList.map((entry) => entry.__key);
339      files = filterFiles(files, rejectedFiles, "duplicate", (file) => {
340        return filenameMap.includes(file.__key) === false;
341      });
342    }
343    if (files.length === 0) {
344      return done();
345    }
346    if (props.maxTotalSize !== void 0) {
347      let size = append === true ? currentFileList.reduce((total, file) => total + file.size, 0) : 0;
348      files = filterFiles(files, rejectedFiles, "max-total-size", (file) => {
349        size += file.size;
350        return size <= maxTotalSizeNumber.value;
351      });
352      if (files.length === 0) {
353        return done();
354      }
355    }
356    if (typeof props.filter === "function") {
357      const filteredFiles = props.filter(files);
358      files = filterFiles(files, rejectedFiles, "filter", (file) => {
359        return filteredFiles.includes(file);
360      });
361    }
362    if (props.maxFiles !== void 0) {
363      let filesNumber = append === true ? currentFileList.length : 0;
364      files = filterFiles(files, rejectedFiles, "max-files", () => {
365        filesNumber++;
366        return filesNumber <= maxFilesNumber.value;
367      });
368      if (files.length === 0) {
369        return done();
370      }
371    }
372    done();
373    if (files.length !== 0) {
374      return files;
375    }
376  }
377  function onDragover(e) {
378    stopAndPreventDrag(e);
379    dnd.value !== true && (dnd.value = true);
380  }
381  function onDragleave(e) {
382    stopAndPrevent(e);
383    const gone = e.relatedTarget !== null || client.is.safari !== true ? e.relatedTarget !== dndRef.value : document.elementsFromPoint(e.clientX, e.clientY).includes(dndRef.value) === false;
384    gone === true && (dnd.value = false);
385  }
386  function onDrop(e) {
387    stopAndPreventDrag(e);
388    const files = e.dataTransfer.files;
389    if (files.length !== 0) {
390      addFilesToQueue(null, files);
391    }
392    dnd.value = false;
393  }
394  function getDndNode(type) {
395    if (dnd.value === true) {
396      return h("div", {
397        ref: dndRef,
398        class: `q-${type}__dnd absolute-full`,
399        onDragenter: stopAndPreventDrag,
400        onDragover: stopAndPreventDrag,
401        onDragleave,
402        onDrop
403      });
404    }
405  }
406  Object.assign(proxy, { pickFiles, addFiles });
407  return {
408    pickFiles,
409    addFiles,
410    onDragover,
411    onDragleave,
412    processFiles,
413    getDndNode,
414    maxFilesNumber,
415    maxTotalSizeNumber
416  };
417}
418const QFile = createComponent({
419  name: "QFile",
420  inheritAttrs: false,
421  props: {
422    ...useNonInputFieldProps,
423    ...useFormProps,
424    ...useFileProps,
425    /* SSR does not know about File & FileList */
426    modelValue: [File, FileList, Array],
427    append: Boolean,
428    useChips: Boolean,
429    displayValue: [String, Number],
430    tabindex: {
431      type: [String, Number],
432      default: 0
433    },
434    counterLabel: Function,
435    inputClass: [Array, String, Object],
436    inputStyle: [Array, String, Object]
437  },
438  emits: [
439    ...useFieldEmits,
440    ...useFileEmits
441  ],
442  setup(props, { slots, emit, attrs }) {
443    const { proxy } = getCurrentInstance();
444    const state = useFieldState();
445    const inputRef = ref(null);
446    const dnd = ref(false);
447    const nameProp = useFormInputNameAttr(props);
448    const {
449      pickFiles,
450      onDragover,
451      onDragleave,
452      processFiles,
453      getDndNode
454    } = useFile({ editable: state.editable, dnd, getFileInput, addFilesToQueue });
455    const formDomProps = useFileFormDomProps(props);
456    const innerValue = computed(() => Object(props.modelValue) === props.modelValue ? "length" in props.modelValue ? Array.from(props.modelValue) : [props.modelValue] : []);
457    const hasValue = computed(() => fieldValueIsFilled(innerValue.value));
458    const selectedString = computed(
459      () => innerValue.value.map((file) => file.name).join(", ")
460    );
461    const totalSize = computed(
462      () => humanStorageSize(
463        innerValue.value.reduce((acc, file) => acc + file.size, 0)
464      )
465    );
466    const counterProps = computed(() => ({
467      totalSize: totalSize.value,
468      filesNumber: innerValue.value.length,
469      maxFiles: props.maxFiles
470    }));
471    const inputAttrs = computed(() => ({
472      tabindex: -1,
473      type: "file",
474      title: "",
475      // try to remove default tooltip,
476      accept: props.accept,
477      capture: props.capture,
478      name: nameProp.value,
479      ...attrs,
480      id: state.targetUid.value,
481      disabled: state.editable.value !== true
482    }));
483    const fieldClass = computed(
484      () => "q-file q-field--auto-height" + (dnd.value === true ? " q-file--dnd" : "")
485    );
486    const isAppending = computed(
487      () => props.multiple === true && props.append === true
488    );
489    function removeAtIndex(index) {
490      const files = innerValue.value.slice();
491      files.splice(index, 1);
492      emitValue(files);
493    }
494    function removeFile(file) {
495      const index = innerValue.value.indexOf(file);
496      if (index !== -1) {
497        removeAtIndex(index);
498      }
499    }
500    function emitValue(files) {
501      emit("update:modelValue", props.multiple === true ? files : files[0]);
502    }
503    function onKeydown(e) {
504      e.keyCode === 13 && prevent(e);
505    }
506    function onKeyup(e) {
507      if (e.keyCode === 13 || e.keyCode === 32) {
508        pickFiles(e);
509      }
510    }
511    function getFileInput() {
512      return inputRef.value;
513    }
514    function addFilesToQueue(e, fileList) {
515      const files = processFiles(e, fileList, innerValue.value, isAppending.value);
516      const fileInput = getFileInput();
517      if (fileInput !== void 0 && fileInput !== null) {
518        fileInput.value = "";
519      }
520      if (files === void 0) return;
521      if (props.multiple === true ? props.modelValue && files.every((f) => innerValue.value.includes(f)) : props.modelValue === files[0]) return;
522      emitValue(
523        isAppending.value === true ? innerValue.value.concat(files) : files
524      );
525    }
526    function getFiller() {
527      return [
528        h("input", {
529          class: [props.inputClass, "q-file__filler"],
530          style: props.inputStyle
531        })
532      ];
533    }
534    function getSelection() {
535      if (slots.file !== void 0) {
536        return innerValue.value.length === 0 ? getFiller() : innerValue.value.map(
537          (file, index) => slots.file({ index, file, ref: this })
538        );
539      }
540      if (slots.selected !== void 0) {
541        return innerValue.value.length === 0 ? getFiller() : slots.selected({ files: innerValue.value, ref: this });
542      }
543      if (props.useChips === true) {
544        return innerValue.value.length === 0 ? getFiller() : innerValue.value.map((file, i) => h(QChip, {
545          key: "file-" + i,
546          removable: state.editable.value,
547          dense: true,
548          textColor: props.color,
549          tabindex: props.tabindex,
550          onRemove: () => {
551            removeAtIndex(i);
552          }
553        }, () => h("span", {
554          class: "ellipsis",
555          textContent: file.name
556        })));
557      }
558      const textContent = props.displayValue !== void 0 ? props.displayValue : selectedString.value;
559      return textContent.length !== 0 ? [
560        h("div", {
561          class: props.inputClass,
562          style: props.inputStyle,
563          textContent
564        })
565      ] : getFiller();
566    }
567    function getInput() {
568      const data = {
569        ref: inputRef,
570        ...inputAttrs.value,
571        ...formDomProps.value,
572        class: "q-field__input fit absolute-full cursor-pointer",
573        onChange: addFilesToQueue
574      };
575      if (props.multiple === true) {
576        data.multiple = true;
577      }
578      return h("input", data);
579    }
580    Object.assign(state, {
581      fieldClass,
582      emitValue,
583      hasValue,
584      inputRef,
585      innerValue,
586      floatingLabel: computed(
587        () => hasValue.value === true || fieldValueIsFilled(props.displayValue)
588      ),
589      computedCounter: computed(() => {
590        if (props.counterLabel !== void 0) {
591          return props.counterLabel(counterProps.value);
592        }
593        const max = props.maxFiles;
594        return `${innerValue.value.length}${max !== void 0 ? " / " + max : ""} (${totalSize.value})`;
595      }),
596      getControlChild: () => getDndNode("file"),
597      getControl: () => {
598        const data = {
599          ref: state.targetRef,
600          class: "q-field__native row items-center cursor-pointer",
601          tabindex: props.tabindex
602        };
603        if (state.editable.value === true) {
604          Object.assign(data, { onDragover, onDragleave, onKeydown, onKeyup });
605        }
606        return h("div", data, [getInput()].concat(getSelection()));
607      }
608    });
609    Object.assign(proxy, {
610      removeAtIndex,
611      removeFile,
612      getNativeElement: () => inputRef.value
613      // deprecated
614    });
615    injectProp(proxy, "nativeEl", () => inputRef.value);
616    return useField(state);
617  }
618});
619export {
620  QToggle as Q,
621  QFile as a,
622  QCardActions as b
623};
624//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUUZpbGUtRHR0REFJNHEuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9xdWFzYXIvc3JjL2NvbXBvbmVudHMvY2FyZC9RQ2FyZEFjdGlvbnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvcXVhc2FyL3NyYy9jb21wb3NhYmxlcy9wcml2YXRlLnVzZS1yZWZvY3VzLXRhcmdldC91c2UtcmVmb2N1cy10YXJnZXQuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvcXVhc2FyL3NyYy91dGlscy9wcml2YXRlLm9wdGlvbi1zaXplcy9vcHRpb24tc2l6ZXMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvcXVhc2FyL3NyYy9jb21wb25lbnRzL2NoZWNrYm94L3VzZS1jaGVja2JveC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9xdWFzYXIvc3JjL2NvbXBvbmVudHMvdG9nZ2xlL1FUb2dnbGUuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvcXVhc2FyL3NyYy9jb21wb3NhYmxlcy9wcml2YXRlLnVzZS1maWxlL3VzZS1maWxlLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3F1YXNhci9zcmMvY29tcG9uZW50cy9maWxlL1FGaWxlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGgsIGNvbXB1dGVkIH0gZnJvbSAndnVlJ1xuXG5pbXBvcnQgdXNlQWxpZ24sIHsgdXNlQWxpZ25Qcm9wcyB9IGZyb20gJy4uLy4uL2NvbXBvc2FibGVzL3ByaXZhdGUudXNlLWFsaWduL3VzZS1hbGlnbi5qcydcblxuaW1wb3J0IHsgY3JlYXRlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vdXRpbHMvcHJpdmF0ZS5jcmVhdGUvY3JlYXRlLmpzJ1xuaW1wb3J0IHsgaFNsb3QgfSBmcm9tICcuLi8uLi91dGlscy9wcml2YXRlLnJlbmRlci9yZW5kZXIuanMnXG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZUNvbXBvbmVudCh7XG4gIG5hbWU6ICdRQ2FyZEFjdGlvbnMnLFxuXG4gIHByb3BzOiB7XG4gICAgLi4udXNlQWxpZ25Qcm9wcyxcbiAgICB2ZXJ0aWNhbDogQm9vbGVhblxuICB9LFxuXG4gIHNldHVwIChwcm9wcywgeyBzbG90cyB9KSB7XG4gICAgY29uc3QgYWxpZ25DbGFzcyA9IHVzZUFsaWduKHByb3BzKVxuXG4gICAgY29uc3QgY2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+XG4gICAgICBgcS1jYXJkX19hY3Rpb25zICR7IGFsaWduQ2xhc3MudmFsdWUgfWBcbiAgICAgICsgYCBxLWNhcmRfX2FjdGlvbnMtLSR7IHByb3BzLnZlcnRpY2FsID09PSB0cnVlID8gJ3ZlcnQgY29sdW1uJyA6ICdob3JpeiByb3cnIH1gXG4gICAgKVxuXG4gICAgcmV0dXJuICgpID0+IGgoJ2RpdicsIHsgY2xhc3M6IGNsYXNzZXMudmFsdWUgfSwgaFNsb3Qoc2xvdHMuZGVmYXVsdCkpXG4gIH1cbn0pXG4iLCJpbXBvcnQgeyBoLCBjb21wdXRlZCwgcmVmIH0gZnJvbSAndnVlJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAocHJvcHMsIHJvb3RSZWYpIHtcbiAgY29uc3QgcmVmb2N1c1JlZiA9IHJlZihudWxsKVxuXG4gIGNvbnN0IHJlZm9jdXNUYXJnZXRFbCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBpZiAocHJvcHMuZGlzYWJsZSA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICByZXR1cm4gaCgnc3BhbicsIHtcbiAgICAgIHJlZjogcmVmb2N1c1JlZixcbiAgICAgIGNsYXNzOiAnbm8tb3V0bGluZScsXG4gICAgICB0YWJpbmRleDogLTFcbiAgICB9KVxuICB9KVxuXG4gIGZ1bmN0aW9uIHJlZm9jdXNUYXJnZXQgKGUpIHtcbiAgICBjb25zdCByb290ID0gcm9vdFJlZi52YWx1ZVxuXG4gICAgaWYgKGU/LnFBdm9pZEZvY3VzID09PSB0cnVlKSByZXR1cm5cblxuICAgIGlmIChlPy50eXBlLmluZGV4T2YoJ2tleScpID09PSAwKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT09IHJvb3RcbiAgICAgICAgJiYgcm9vdD8uY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkgPT09IHRydWVcbiAgICAgICkge1xuICAgICAgICByb290LmZvY3VzKClcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoXG4gICAgICByZWZvY3VzUmVmLnZhbHVlICE9PSBudWxsXG4gICAgICAmJiAoKGUgPT09IHZvaWQgMCkgfHwgKHJvb3Q/LmNvbnRhaW5zKGUudGFyZ2V0KSA9PT0gdHJ1ZSkpXG4gICAgKSB7XG4gICAgICByZWZvY3VzUmVmLnZhbHVlLmZvY3VzKClcbiAgICB9XG4gI
624H1cblxuICByZXR1cm4ge1xuICAgIHJlZm9jdXNUYXJnZXRFbCxcbiAgICByZWZvY3VzVGFyZ2V0XG4gIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IHtcbiAgeHM6IDMwLFxuICBzbTogMzUsXG4gIG1kOiA0MCxcbiAgbGc6IDUwLFxuICB4bDogNjBcbn1cbiIsImltcG9ydCB7IGgsIHJlZiwgY29tcHV0ZWQsIGdldEN1cnJlbnRJbnN0YW5jZSwgdG9SYXcgfSBmcm9tICd2dWUnXG5cbmltcG9ydCB1c2VEYXJrLCB7IHVzZURhcmtQcm9wcyB9IGZyb20gJy4uLy4uL2NvbXBvc2FibGVzL3ByaXZhdGUudXNlLWRhcmsvdXNlLWRhcmsuanMnXG5pbXBvcnQgdXNlU2l6ZSwgeyB1c2VTaXplUHJvcHMgfSBmcm9tICcuLi8uLi9jb21wb3NhYmxlcy9wcml2YXRlLnVzZS1zaXplL3VzZS1zaXplLmpzJ1xuaW1wb3J0IHVzZVJlZm9jdXNUYXJnZXQgZnJvbSAnLi4vLi4vY29tcG9zYWJsZXMvcHJpdmF0ZS51c2UtcmVmb2N1cy10YXJnZXQvdXNlLXJlZm9jdXMtdGFyZ2V0LmpzJ1xuaW1wb3J0IHsgdXNlRm9ybUluamVjdCwgdXNlRm9ybVByb3BzIH0gZnJvbSAnLi4vLi4vY29tcG9zYWJsZXMvdXNlLWZvcm0vcHJpdmF0ZS51c2UtZm9ybS5qcydcblxuaW1wb3J0IG9wdGlvblNpemVzIGZyb20gJy4uLy4uL3V0aWxzL3ByaXZhdGUub3B0aW9uLXNpemVzL29wdGlvbi1zaXplcy5qcydcbmltcG9ydCB7IHN0b3BBbmRQcmV2ZW50IH0gZnJvbSAnLi4vLi4vdXRpbHMvZXZlbnQvZXZlbnQuanMnXG5pbXBvcnQgeyBoU2xvdCwgaE1lcmdlU2xvdCB9IGZyb20gJy4uLy4uL3V0aWxzL3ByaXZhdGUucmVuZGVyL3JlbmRlci5qcydcblxuZXhwb3J0IGNvbnN0IHVzZUNoZWNrYm94UHJvcHMgPSB7XG4gIC4uLnVzZURhcmtQcm9wcyxcbiAgLi4udXNlU2l6ZVByb3BzLFxuICAuLi51c2VGb3JtUHJvcHMsXG5cbiAgbW9kZWxWYWx1ZToge1xuICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIGRlZmF1bHQ6IG51bGxcbiAgfSxcbiAgdmFsOiB7fSxcblxuICB0cnVlVmFsdWU6IHsgZGVmYXVsdDogdHJ1ZSB9LFxuICBmYWxzZVZhbHVlOiB7IGRlZmF1bHQ6IGZhbHNlIH0sXG4gIGluZGV0ZXJtaW5hdGVWYWx1ZTogeyBkZWZhdWx0OiBudWxsIH0sXG5cbiAgY2hlY2tlZEljb246IFN0cmluZyxcbiAgdW5jaGVja2VkSWNvbjogU3RyaW5nLFxuICBpbmRldGVybWluYXRlSWNvbjogU3RyaW5nLFxuXG4gIHRvZ2dsZU9yZGVyOiB7XG4gICAgdHlwZTogU3RyaW5nLFxuICAgIHZhbGlkYXRvcjogdiA9PiB2ID09PSAndGYnIHx8IHYgPT09ICdmdCdcbiAgfSxcbiAgdG9nZ2xlSW5kZXRlcm1pbmF0ZTogQm9vbGVhbixcblxuICBsYWJlbDogU3RyaW5nLFxuICBsZWZ0TGFiZWw6IEJvb2xlYW4sXG5cbiAgY29sb3I6IFN0cmluZyxcbiAga2VlcENvbG9yOiBCb29sZWFuLFxuICBkZW5zZTogQm9vbGVhbixcblxuICBkaXNhYmxlOiBCb29sZWFuLFxuICB0YWJpbmRleDogWyBTdHJpbmcsIE51bWJlciBdXG59XG5cbmV4cG9ydCBjb25zdCB1c2VDaGVja2JveEVtaXRzID0gWyAndXBkYXRlOm1vZGVsVmFsdWUnIF1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKHR5cGUsIGdldElubmVyKSB7XG4gIGNvbnN0IHsgcHJvcHMsIHNsb3RzLCBlbWl0LCBwcm94eSB9ID0gZ2V0Q3VycmVudEluc3RhbmNlKClcbiAgY29uc3QgeyAkcSB9ID0gcHJveHlcblxuICBjb25zdCBpc0RhcmsgPSB1c2VEYXJrKHByb3BzLCAkcSlcblxuICBjb25zdCByb290UmVmID0gcmVmKG51bGwpXG4gIGNvbnN0IHsgcmVmb2N1c1RhcmdldEVsLCByZWZvY3VzVGFyZ2V0IH0gPSB1c2VSZWZvY3VzVGFyZ2V0KHByb3BzLCByb290UmVmKVxuICBjb25zdCBzaXplU3R5bGUgPSB1c2VTaXplKHByb3BzLCBvcHRpb25TaXplcylcblxuICBjb25zdCBtb2RlbElzQXJyYXkgPSBjb21wdXRlZCgoKSA9PlxuICAgIHByb3BzLnZhbCAhPT0gdm9pZCAwICYmIEFycmF5LmlzQXJyYXkocHJvcHMubW9kZWxWYWx1ZSlcbiAgKVxuXG4gIGNvbnN0IGluZGV4ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IHZhbCA9IHRvUmF3KHByb3BzLnZhbClcbiAgICByZXR1cm4gbW9kZWxJc0FycmF5LnZhbHVlID09PSB0cnVlXG4gICAgICA/IHByb3BzLm1vZGVsVmFsdWUuZmluZEluZGV4KG9wdCA9PiB0b1JhdyhvcHQpID09PSB2YWwpXG4gICAgICA6IC0xXG4gIH0pXG5cbiAgY29uc3QgaXNUcnVlID0gY29tcHV0ZWQoKCkgPT4gKFxuICAgIG1vZGVsSXNBcnJheS52YWx1ZSA9PT0gdHJ1ZVxuICAgICAgPyBpbmRleC52YWx1ZSAhPT0gLTFcbiAgICAgIDogdG9SYXcocHJvcHMubW9kZWxWYWx1ZSkgPT09IHRvUmF3KHByb3BzLnRydWVWYWx1ZSlcbiAgKSlcblxuICBjb25zdCBpc0ZhbHNlID0gY29tcHV0ZWQoKCkgPT4gKFxuICAgIG1vZGVsSXNBcnJheS52YWx1ZSA9PT0gdHJ1ZVxuICAgICAgPyBpbmRleC52YWx1ZSA9PT0gLTFcbiAgICAgIDogdG9SYXcocHJvcHMubW9kZWxWYWx1ZSkgPT09IHRvUmF3KHByb3BzLmZhbHNlVmFsdWUpXG4gICkpXG5cbiAgY29uc3QgaXNJbmRldGVybWluYXRlID0gY29tcHV0ZWQoKCkgPT5cbiAgICBpc1RydWUudmFsdWUgPT09IGZhbHNlICYmIGlzRmFsc2UudmFsdWUgPT09IGZhbHNlXG4gIClcblxuICBjb25zdCB0YWJpbmRleCA9IGNvbXB1dGVkKCgpID0+IChcbiAgICBwcm9wcy5kaXNhYmxlID09PSB0cnVlID8gLTEgOiBwcm9wcy50YWJpbmRleCB8fCAwXG4gICkpXG5cbiAgY29uc3QgY2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+XG4gICAgYHEtJHsgdHlwZSB9IGN1cnNvci1wb2ludGVyIG5vLW91dGxpbmUgcm93IGlubGluZSBuby13cmFwIGl0ZW1zLWNlbnRlcmBcbiAgICArIChwcm9wcy5kaXNhYmxlID09PSB0cnVlID8gJyBkaXNhYmxlZCcgOiAnJylcbiAgICArIChpc0RhcmsudmFsdWUgPT09IHRydWUgPyBgIHEtJHsgdHlwZSB9LS1kYXJrYCA6ICcnKVxuICAgICsgKHByb3BzLmRlbnNlID09PSB0cnVlID8gYCBxLSR7IHR5cGUgfS0tZGVuc2VgIDogJycpXG4gICAgKyAocHJvcHMubGVmdExhYmVsID09PSB0cnVlID8gJyByZXZlcnNlJyA6ICcnKVxuICApXG5cbiAgY29uc3QgaW5uZXJDbGFzcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBzdGF0ZSA9IGlzVHJ1ZS52YWx1ZSA9PT0gdHJ1ZSA/ICd0cnV0aHknIDogKGlzRmFsc2UudmFsdWUgPT09IHRydWUgPyAnZmFsc3knIDogJ2luZGV0JylcbiAgICBjb25zdCBjb2xvciA9IHByb3BzLmNvbG9yICE9PSB2b2lkIDAgJiYgKFxuICAgICAgcHJvcHMua2VlcENvbG9yID09PSB0cnVlXG4gICAgICB8fCAodHlwZSA9PT0gJ3RvZ2dsZScgPyBpc1RydWUudmFsdWUgPT09IHRydWUgOiBpc0ZhbHNlLnZhbHVlICE9PSB0cnVlKVxuICAgIClcbiAgICAgID8gYCB0ZXh0LSR7IHByb3BzLmNvbG9yIH1gXG4gICAgICA6ICcnXG5cbiAgICByZXR1cm4gYHEtJHsgdHlwZSB9X19pbm5lciByZWxhdGl2ZS1wb3NpdGlvbiBub24tc2VsZWN0YWJsZSBxLSR7IHR5cGUgfV9faW5uZXItLSR7IHN0YXRlIH0keyBjb2xvciB9YFxuICB9KVxuXG4gIGNvbnN0IGZvcm1BdHRycyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBwcm9wID0geyB0eXBlOiAnY2hlY2tib3gnIH1cblxuICAgI
624HByb3BzLm5hbWUgIT09IHZvaWQgMCAmJiBPYmplY3QuYXNzaWduKHByb3AsIHtcbiAgICAgIC8vIHNlZSBodHRwczovL3Z1ZWpzLm9yZy9ndWlkZS9leHRyYXMvcmVuZGVyLWZ1bmN0aW9uLmh0bWwjY3JlYXRpbmctdm5vZGVzICgucHJvcClcbiAgICAgICcuY2hlY2tlZCc6IGlzVHJ1ZS52YWx1ZSxcbiAgICAgICdeY2hlY2tlZCc6IGlzVHJ1ZS52YWx1ZSA9PT0gdHJ1ZSA/ICdjaGVja2VkJyA6IHZvaWQgMCxcbiAgICAgIG5hbWU6IHByb3BzLm5hbWUsXG4gICAgICB2YWx1ZTogbW9kZWxJc0FycmF5LnZhbHVlID09PSB0cnVlXG4gICAgICAgID8gcHJvcHMudmFsXG4gICAgICAgIDogcHJvcHMudHJ1ZVZhbHVlXG4gICAgfSlcblxuICAgIHJldHVybiBwcm9wXG4gIH0pXG5cbiAgY29uc3QgaW5qZWN0Rm9ybUlucHV0ID0gdXNlRm9ybUluamVjdChmb3JtQXR0cnMpXG5cbiAgY29uc3QgYXR0cmlidXRlcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBhdHRycyA9IHtcbiAgICAgIHRhYmluZGV4OiB0YWJpbmRleC52YWx1ZSxcbiAgICAgIHJvbGU6IHR5cGUgPT09ICd0b2dnbGUnID8gJ3N3aXRjaCcgOiAnY2hlY2tib3gnLFxuICAgICAgJ2FyaWEtbGFiZWwnOiBwcm9wcy5sYWJlbCxcbiAgICAgICdhcmlhLWNoZWNrZWQnOiBpc0luZGV0ZXJtaW5hdGUudmFsdWUgPT09IHRydWVcbiAgICAgICAgPyAnbWl4ZWQnXG4gICAgICAgIDogKGlzVHJ1ZS52YWx1ZSA9PT0gdHJ1ZSA/ICd0cnVlJyA6ICdmYWxzZScpXG4gICAgfVxuXG4gICAgaWYgKHByb3BzLmRpc2FibGUgPT09IHRydWUpIHtcbiAgICAgIGF0dHJzWyAnYXJpYS1kaXNhYmxlZCcgXSA9ICd0cnVlJ1xuICAgIH1cblxuICAgIHJldHVybiBhdHRyc1xuICB9KVxuXG4gIGZ1bmN0aW9uIG9uQ2xpY2sgKGUpIHtcbiAgICBpZiAoZSAhPT0gdm9pZCAwKSB7XG4gICAgICBzdG9wQW5kUHJldmVudChlKVxuICAgICAgcmVmb2N1c1RhcmdldChlKVxuICAgIH1cblxuICAgIGlmIChwcm9wcy5kaXNhYmxlICE9PSB0cnVlKSB7XG4gICAgICBlbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScsIGdldE5leHRWYWx1ZSgpLCBlKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGdldE5leHRWYWx1ZSAoKSB7XG4gICAgaWYgKG1vZGVsSXNBcnJheS52YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgaWYgKGlzVHJ1ZS52YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgICBjb25zdCB2YWwgPSBwcm9wcy5tb2RlbFZhbHVlLnNsaWNlKClcbiAgICAgICAgdmFsLnNwbGljZShpbmRleC52YWx1ZSwgMSlcbiAgICAgICAgcmV0dXJuIHZhbFxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJvcHMubW9kZWxWYWx1ZS5jb25jYXQoWyBwcm9wcy52YWwgXSlcbiAgICB9XG5cbiAgICBpZiAoaXNUcnVlLnZhbHVlID09PSB0cnVlKSB7XG4gICAgICBpZiAocHJvcHMudG9nZ2xlT3JkZXIgIT09ICdmdCcgfHwgcHJvcHMudG9nZ2xlSW5kZXRlcm1pbmF0ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIHByb3BzLmZhbHNlVmFsdWVcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoaXNGYWxzZS52YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgaWYgKHByb3BzLnRvZ2dsZU9yZGVyID09PSAnZnQnIHx8IHByb3BzLnRvZ2dsZUluZGV0ZXJtaW5hdGUgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBwcm9wcy50cnVlVmFsdWVcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICByZXR1cm4gcHJvcHMudG9nZ2xlT3JkZXIgIT09ICdmdCdcbiAgICAgICAgPyBwcm9wcy50cnVlVmFsdWVcbiAgICAgICAgOiBwcm9wcy5mYWxzZVZhbHVlXG4gICAgfVxuXG4gICAgcmV0dXJuIHByb3BzLmluZGV0ZXJtaW5hdGVWYWx1ZVxuICB9XG5cbiAgZnVuY3Rpb24gb25LZXlkb3duIChlKSB7XG4gICAgaWYgKGUua2V5Q29kZSA9PT0gMTMgfHwgZS5rZXlDb2RlID09PSAzMikge1xuICAgICAgc3RvcEFuZFByZXZlbnQoZSlcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbktleXVwIChlKSB7XG4gICAgaWYgKGUua2V5Q29kZSA9PT0gMTMgfHwgZS5rZXlDb2RlID09PSAzMikge1xuICAgICAgb25DbGljayhlKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGdldElubmVyQ29udGVudCA9IGdldElubmVyKGlzVHJ1ZSwgaXNJbmRldGVybWluYXRlKVxuXG4gIC8vIGV4cG9zZSBwdWJsaWMgbWV0aG9kc1xuICBPYmplY3QuYXNzaWduKHByb3h5LCB7IHRvZ2dsZTogb25DbGljayB9KVxuXG4gIHJldHVybiAoKSA9PiB7XG4gICAgY29uc3QgaW5uZXIgPSBnZXRJbm5lckNvbnRlbnQoKVxuXG4gICAgcHJvcHMuZGlzYWJsZSAhPT0gdHJ1ZSAmJiBpbmplY3RGb3JtSW5wdXQoXG4gICAgICBpbm5lcixcbiAgICAgICd1bnNoaWZ0JyxcbiAgICAgIGAgcS0keyB0eXBlIH1fX25hdGl2ZSBhYnNvbHV0ZSBxLW1hLW5vbmUgcS1wYS1ub25lYFxuICAgIClcblxuICAgIGNvbnN0IGNoaWxkID0gW1xuICAgICAgaCgnZGl2Jywge1xuICAgICAgICBjbGFzczogaW5uZXJDbGFzcy52YWx1ZSxcbiAgICAgICAgc3R5bGU6IHNpemVTdHlsZS52YWx1ZSxcbiAgICAgICAgJ2FyaWEtaGlkZGVuJzogJ3RydWUnXG4gICAgICB9LCBpbm5lcilcbiAgICBdXG5cbiAgICBpZiAocmVmb2N1c1RhcmdldEVsLnZhbHVlICE9PSBudWxsKSB7XG4gICAgICBjaGlsZC5wdXNoKHJlZm9jdXNUYXJnZXRFbC52YWx1ZSlcbiAgICB9XG5cbiAgICBjb25zdCBsYWJlbCA9IHByb3BzLmxhYmVsICE9PSB2b2lkIDBcbiAgICAgID8gaE1lcmdlU2xvdChzbG90cy5kZWZh
624dWx0LCBbIHByb3BzLmxhYmVsIF0pXG4gICAgICA6IGhTbG90KHNsb3RzLmRlZmF1bHQpXG5cbiAgICBsYWJlbCAhPT0gdm9pZCAwICYmIGNoaWxkLnB1c2goXG4gICAgICBoKCdkaXYnLCB7XG4gICAgICAgIGNsYXNzOiBgcS0keyB0eXBlIH1fX2xhYmVsIHEtYW5jaG9yLS1za2lwYFxuICAgICAgfSwgbGFiZWwpXG4gICAgKVxuXG4gICAgcmV0dXJuIGgoJ2RpdicsIHtcbiAgICAgIHJlZjogcm9vdFJlZixcbiAgICAgIGNsYXNzOiBjbGFzc2VzLnZhbHVlLFxuICAgICAgLi4uYXR0cmlidXRlcy52YWx1ZSxcbiAgICAgIG9uQ2xpY2ssXG4gICAgICBvbktleWRvd24sXG4gICAgICBvbktleXVwXG4gICAgfSwgY2hpbGQpXG4gIH1cbn1cbiIsImltcG9ydCB7IGgsIGNvbXB1dGVkIH0gZnJvbSAndnVlJ1xuXG5pbXBvcnQgUUljb24gZnJvbSAnLi4vaWNvbi9RSWNvbi5qcydcblxuaW1wb3J0IHVzZUNoZWNrYm94LCB7IHVzZUNoZWNrYm94UHJvcHMsIHVzZUNoZWNrYm94RW1pdHMgfSBmcm9tICcuLi9jaGVja2JveC91c2UtY2hlY2tib3guanMnXG5cbmltcG9ydCB7IGNyZWF0ZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL3V0aWxzL3ByaXZhdGUuY3JlYXRlL2NyZWF0ZS5qcydcblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlQ29tcG9uZW50KHtcbiAgbmFtZTogJ1FUb2dnbGUnLFxuXG4gIHByb3BzOiB7XG4gICAgLi4udXNlQ2hlY2tib3hQcm9wcyxcblxuICAgIGljb246IFN0cmluZyxcbiAgICBpY29uQ29sb3I6IFN0cmluZ1xuICB9LFxuXG4gIGVtaXRzOiB1c2VDaGVja2JveEVtaXRzLFxuXG4gIHNldHVwIChwcm9wcykge1xuICAgIGZ1bmN0aW9uIGdldElubmVyIChpc1RydWUsIGlzSW5kZXRlcm1pbmF0ZSkge1xuICAgICAgY29uc3QgaWNvbiA9IGNvbXB1dGVkKCgpID0+XG4gICAgICAgIChpc1RydWUudmFsdWUgPT09IHRydWVcbiAgICAgICAgICA/IHByb3BzLmNoZWNrZWRJY29uXG4gICAgICAgICAgOiAoaXNJbmRldGVybWluYXRlLnZhbHVlID09PSB0cnVlID8gcHJvcHMuaW5kZXRlcm1pbmF0ZUljb24gOiBwcm9wcy51bmNoZWNrZWRJY29uKVxuICAgICAgICApIHx8IHByb3BzLmljb25cbiAgICAgIClcblxuICAgICAgY29uc3QgY29sb3IgPSBjb21wdXRlZCgoKSA9PiAoaXNUcnVlLnZhbHVlID09PSB0cnVlID8gcHJvcHMuaWNvbkNvbG9yIDogbnVsbCkpXG5cbiAgICAgIHJldHVybiAoKSA9PiBbXG4gICAgICAgIGgoJ2RpdicsIHsgY2xhc3M6ICdxLXRvZ2dsZV9fdHJhY2snIH0pLFxuXG4gICAgICAgIGgoJ2RpdicsIHtcbiAgICAgICAgICBjbGFzczogJ3EtdG9nZ2xlX190aHVtYiBhYnNvbHV0ZSBmbGV4IGZsZXgtY2VudGVyIG5vLXdyYXAnXG4gICAgICAgIH0sIGljb24udmFsdWUgIT09IHZvaWQgMFxuICAgICAgICAgID8gW1xuICAgICAgICAgICAgICBoKFFJY29uLCB7XG4gICAgICAgICAgICAgICAgbmFtZTogaWNvbi52YWx1ZSxcbiAgICAgICAgICAgICAgICBjb2xvcjogY29sb3IudmFsdWVcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIF1cbiAgICAgICAgICA6IHZvaWQgMFxuICAgICAgICApXG4gICAgICBdXG4gICAgfVxuXG4gICAgcmV0dXJuIHVzZUNoZWNrYm94KCd0b2dnbGUnLCBnZXRJbm5lcilcbiAgfVxufSlcbiIsImltcG9ydCB7IGgsIHJlZiwgY29tcHV0ZWQsIGdldEN1cnJlbnRJbnN0YW5jZSB9IGZyb20gJ3Z1ZSdcblxuaW1wb3J0IHsgY2xpZW50IH0gZnJvbSAnLi4vLi4vcGx1Z2lucy9wbGF0Zm9ybS9QbGF0Zm9ybS5qcydcbmltcG9ydCB7IHN0b3AsIHN0b3BBbmRQcmV2ZW50IH0gZnJvbSAnLi4vLi4vdXRpbHMvZXZlbnQvZXZlbnQuanMnXG5cbmZ1bmN0aW9uIGZpbHRlckZpbGVzIChmaWxlcywgcmVqZWN0ZWRGaWxlcywgZmFpbGVkUHJvcFZhbGlkYXRpb24sIGZpbHRlckZuKSB7XG4gIGNvbnN0IGFjY2VwdGVkRmlsZXMgPSBbXVxuXG4gIGZpbGVzLmZvckVhY2goZmlsZSA9PiB7XG4gICAgaWYgKGZpbHRlckZuKGZpbGUpID09PSB0cnVlKSB7XG4gICAgICBhY2NlcHRlZEZpbGVzLnB1c2goZmlsZSlcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICByZWplY3RlZEZpbGVzLnB1c2goeyBmYWlsZWRQcm9wVmFsaWRhdGlvbiwgZmlsZSB9KVxuICAgIH1cbiAgfSlcblxuICByZXR1cm4gYWNjZXB0ZWRGaWxlc1xufVxuXG5mdW5jdGlvbiBzdG9wQW5kUHJldmVudERyYWcgKGUpIHtcbiAgaWYgKGU/LmRhdGFUcmFuc2Zlcikge1xuICAgIGUuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnY29weSdcbiAgfVxuXG4gIHN0b3BBbmRQcmV2ZW50KGUpXG59XG5cbmV4cG9ydCBjb25zdCB1c2VGaWxlUHJvcHMgPSB7XG4gIG11bHRpcGxlOiBCb29sZWFuLFxuICBhY2NlcHQ6IFN0cmluZyxcbiAgY2FwdHVyZTogU3RyaW5nLFxuICBtYXhGaWxlU2l6ZTogWyBOdW1iZXIsIFN0cmluZyBdLFxuICBtYXhUb3RhbFNpemU6IFsgTnVtYmVyLCBTdHJpbmcgXSxcbiAgbWF4RmlsZXM6IFsgTnVtYmVyLCBTdHJpbmcgXSxcbiAgZmlsdGVyOiBGdW5jdGlvblxufVxuXG5leHBvcnQgY29uc3QgdXNlRmlsZUVtaXRzID0gWyAncmVqZWN0ZWQnIF1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKHtcbiAgZWRpdGFibGUsXG4gIGRuZCxcbiAgZ2V0RmlsZUlucHV0LFxuICBhZGRGaWxlc1RvUXVldWVcbn0pIHtcbiAgY29uc3QgeyBwcm9wcywgZW1pdCwgcHJveHkgfSA9IGdldEN1cnJlbnRJbnN0YW5jZSgpXG5cbiAgY29uc3QgZG5kUmVmID0gcmVmKG51bGwpXG5cbiAgY29uc3QgZXh0ZW5zaW9ucyA9IGNvbXB1dGVkKCgpID0+IChcbiAgICBwcm9wcy5hY2NlcHQgIT09IHZvaWQgMFxuICAgICAgPyBwcm9wcy5hY2NlcHQuc3BsaXQoJywnKS5tYXAoZXh0ID0+IHtcbiAgICAgICAgZXh0ID0gZXh0LnRyaW0oKVxuICAgICAgICBpZiAoZXh0ID09PSAnKicpIHsgLy8gc3VwcG9ydCBcIipcIlxuICAgICAgICAgIHJldHVybiAnKi8nXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXh0LmVuZHNXaXRoKCcvKicpKSB7IC8vIHN1cHBvcnQgXCJpbWFnZS8qXCIgb3IgXCIqLypcIlxuICAgICAgICAgIGV4dCA9IGV4dC5zbGljZSgwLCBleHQubGVuZ3RoIC0gMSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXh0LnRvVXBwZXJDYXNlKClcbiAgICAgIH0pXG4gICAgICA6IG51bGxcbiAgKSlcblxuICBjb25zdCBtYXhGaWxlc051bWJlciA9IGNvbXB1dGVkKCgpID0+IHBhcnNlSW50KHByb3BzLm1heEZpbGVzLCAxMCkpXG4gIGNvbnN0IG1heFRvdGFsU2l6ZU51bWJlciA9IGNvbXB1dGVkKCgpID0+IHBhcnNlSW50KHByb3BzLm1heFRvdGFsU2l6ZSwgMTApKVxuXG4gIGZ1bmN0aW9uIHBpY2tGaWxlcyAoZSkge1xuICAgIGlmIChlZGl0YWJsZS52YWx1ZSkge1xuICAgICAgaWYgKGUgIT09IE9iamVjdChlKSkge1xuICAgICAgICBlID0geyB0YXJnZXQ6IG51bGwgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZS50YXJnZXQ/Lm1hdGNoZXMoJ2lucHV0W3R5cGU9XCJmaWxlXCJdJykgPT09IHRydWUpIHtcbiAgICAgICAgLy8gc3RvcCBwcm9wYWdhdGlvbiBpZiBpdCdzIG5vdCBhIHJlYWwgcG9pbnRlciBldmVudFxuICAgICAgICBlLmNsaWVudFggPT09IDAgJiYgZS5jbGllbnRZID09PSAwICYmIHN0b3AoZSlcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBpbnB1dCA9IGdldEZpbGVJbnB1dCgpXG4gICAgICAgIGlmIChpbnB1dCAhPT0gZS50YXJnZXQpIGlucHV0Py5jbGljayhlKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGFkZEZpbGVzIChmaWxlcykge1xuICAgIGlmIChlZGl0YWJsZS52YWx1ZSAmJiBmaWxlcykge1xuICAgICAgYWRkRmlsZXNUb1F1ZXVlKG51bGwsIGZpbGVzKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHByb2Nlc3NGaWxlcyAoZSwgZmlsZXNUb1Byb2Nlc3MsIGN1cnJlbnRGaWxlTGlzdCwgYXBwZW5kKSB7XG4gICAgbGV0IGZpbGVzID0gQXJyYXkuZnJvbShmaWxlc1RvUHJvY2VzcyB8fCBlLnRhcmdldC5maWxlcylcbiAgICBjb25zdCByZWplY3RlZEZpbGVzID0gW11cblxuICAgIGNvbnN0IGRvbmUgPSAoKSA9PiB7XG4gICAgICBpZiAocmVqZWN0ZWRGaWxlcy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgZW1pdCgncmVqZWN0ZWQnLCByZWplY3RlZEZpbGVzKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGZpbHRlciBmaWxlIHR5cGVzXG4gICAgaWYgKHByb3BzLmFjY2VwdCAhPT0gdm9pZCAwICYmIGV4dGVuc2lvbnMudmFsdWUuaW5kZXhPZignKi8nKSA9PT0gLTEpIHtcbiAgICAgIGZpbGVzID0gZmlsdGVyRmlsZXMoZmlsZXMsIHJlamVjdGVkRmlsZXMsICdhY2NlcHQnLCBmaWxlID0+IHtcbiAgICAgICAgcmV0dXJuIGV4dGVuc2lvbnMudmFsdWUuc29tZShleHQgPT4gKFxuICAgICAgICAgIGZpbGUudHlwZS50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoZXh0KVxuICAgICAgICAgI
624Hx8IGZpbGUubmFtZS50b1VwcGVyQ2FzZSgpLmVuZHNXaXRoKGV4dClcbiAgICAgICAgKSlcbiAgICAgIH0pXG5cbiAgICAgIGlmIChmaWxlcy5sZW5ndGggPT09IDApIHsgcmV0dXJuIGRvbmUoKSB9XG4gICAgfVxuXG4gICAgLy8gZmlsdGVyIG1heCBmaWxlIHNpemVcbiAgICBpZiAocHJvcHMubWF4RmlsZVNpemUgIT09IHZvaWQgMCkge1xuICAgICAgY29uc3QgbWF4RmlsZVNpemUgPSBwYXJzZUludChwcm9wcy5tYXhGaWxlU2l6ZSwgMTApXG4gICAgICBmaWxlcyA9IGZpbHRlckZpbGVzKGZpbGVzLCByZWplY3RlZEZpbGVzLCAnbWF4LWZpbGUtc2l6ZScsIGZpbGUgPT4ge1xuICAgICAgICByZXR1cm4gZmlsZS5zaXplIDw9IG1heEZpbGVTaXplXG4gICAgICB9KVxuXG4gICAgICBpZiAoZmlsZXMubGVuZ3RoID09PSAwKSB7IHJldHVybiBkb25lKCkgfVxuICAgIH1cblxuICAgIC8vIENvcmRvdmEvaU9TIGFsbG93cyBzZWxlY3RpbmcgbXVsdGlwbGUgZmlsZXMgZXZlbiB3aGVuIHRoZVxuICAgIC8vIG11bHRpcGxlIGF0dHJpYnV0ZSBpcyBub3Qgc3BlY2lmaWVkLiBXZSBhbHNvIG5vcm1hbGl6ZSBkcmFnJ24nZHJvcHBlZFxuICAgIC8vIGZpbGVzIGhlcmU6XG4gICAgaWYgKHByb3BzLm11bHRpcGxlICE9PSB0cnVlICYmIGZpbGVzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgZmlsZXMgPSBbIGZpbGVzWyAwIF0gXVxuICAgIH1cblxuICAgIC8vIENvbXB1dGUga2V5IHRvIHVzZSBmb3IgZWFjaCBmaWxlXG4gICAgZmlsZXMuZm9yRWFjaChmaWxlID0+IHtcbiAgICAgIGZpbGUuX19rZXkgPSBmaWxlLndlYmtpdFJlbGF0aXZlUGF0aCArIGZpbGUubGFzdE1vZGlmaWVkICsgZmlsZS5uYW1lICsgZmlsZS5zaXplXG4gICAgfSlcblxuICAgIGlmIChhcHBlbmQgPT09IHRydWUpIHtcbiAgICAgIC8vIEF2b2lkIGR1cGxpY2F0ZSBmaWxlc1xuICAgICAgY29uc3QgZmlsZW5hbWVNYXAgPSBjdXJyZW50RmlsZUxpc3QubWFwKGVudHJ5ID0+IGVudHJ5Ll9fa2V5KVxuICAgICAgZmlsZXMgPSBmaWx0ZXJGaWxlcyhmaWxlcywgcmVqZWN0ZWRGaWxlcywgJ2R1cGxpY2F0ZScsIGZpbGUgPT4ge1xuICAgICAgICByZXR1cm4gZmlsZW5hbWVNYXAuaW5jbHVkZXMoZmlsZS5fX2tleSkgPT09IGZhbHNlXG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmIChmaWxlcy5sZW5ndGggPT09IDApIHsgcmV0dXJuIGRvbmUoKSB9XG5cbiAgICBpZiAocHJvcHMubWF4VG90YWxTaXplICE9PSB2b2lkIDApIHtcbiAgICAgIGxldCBzaXplID0gYXBwZW5kID09PSB0cnVlXG4gICAgICAgID8gY3VycmVudEZpbGVMaXN0LnJlZHVjZSgodG90YWwsIGZpbGUpID0+IHRvdGFsICsgZmlsZS5zaXplLCAwKVxuICAgICAgICA6IDBcblxuICAgICAgZmlsZXMgPSBmaWx0ZXJGaWxlcyhmaWxlcywgcmVqZWN0ZWRGaWxlcywgJ21heC10b3RhbC1zaXplJywgZmlsZSA9PiB7XG4gICAgICAgIHNpemUgKz0gZmlsZS5zaXplXG4gICAgICAgIHJldHVybiBzaXplIDw9IG1heFRvdGFsU2l6ZU51bWJlci52YWx1ZVxuICAgICAgfSlcblxuICAgICAgaWYgKGZpbGVzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gZG9uZSgpIH1cbiAgICB9XG5cbiAgICAvLyBkbyB3ZSBoYXZlIGN1c3RvbSBmaWx0ZXIgZnVuY3Rpb24/XG4gICAgaWYgKHR5cGVvZiBwcm9wcy5maWx0ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbnN0IGZpbHRlcmVkRmlsZXMgPSBwcm9wcy5maWx0ZXIoZmlsZXMpXG4gICAgICBmaWxlcyA9IGZpbHRlckZpbGVzKGZpbGVzLCByZWplY3RlZEZpbGVzLCAnZmlsdGVyJywgZmlsZSA9PiB7XG4gICAgICAgIHJldHVybiBmaWx0ZXJlZEZpbGVzLmluY2x1ZGVzKGZpbGUpXG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmIChwcm9wcy5tYXhGaWxlcyAhPT0gdm9pZCAwKSB7XG4gICAgICBsZXQgZmlsZXNOdW1iZXIgPSBhcHBlbmQgPT09IHRydWVcbiAgICAgICAgPyBjdXJyZW50RmlsZUxpc3QubGVuZ3RoXG4gICAgICAgIDogMFxuXG4gICAgICBmaWxlcyA9IGZpbHRlckZpbGVzKGZpbGVzLCByZWplY3RlZEZpbGVzLCAnbWF4LWZpbGVzJywgKCkgPT4ge1xuICAgICAgICBmaWxlc051bWJlcisrXG4gICAgICAgIHJldHVybiBmaWxlc051bWJlciA8PSBtYXhGaWxlc051bWJlci52YWx1ZVxuICAgICAgfSlcblxuICAgICAgaWYgKGZpbGVzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gZG9uZSgpIH1cbiAgICB9XG5cbiAgICBkb25lKClcblxuICAgIGlmIChmaWxlcy5sZW5ndGggIT09IDApIHtcbiAgICAgIHJldHVybiBmaWxlc1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uRHJhZ292ZXIgKGUpIHtcbiAgICBzdG9wQW5kUHJldmVudERyYWcoZSlcbiAgICBkbmQudmFsdWUgIT09IHRydWUgJiYgKGRuZC52YWx1ZSA9IHRydWUpXG4gIH1cblxuICBmdW5jdGlvbiBvbkRyYWdsZWF2ZSAoZSkge1xuICAgIHN0b3BBbmRQcmV2ZW50KGUpXG5cbiAgICAvLyBTYWZhcmkgYnVnOiByZWxhdGVkVGFyZ2V0IGlzIG51bGwgZm9yIG92ZXIgMTAgeWVhcnNcbiAgICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjY1NDdcbiAgICBjb25zdCBnb25lID0gZS5yZWxhdGVkVGFyZ2V0ICE9PSBudWxsIHx8IGNsaWVudC5pcy5zYWZhcmkgIT09IHRydWVcbiAgICAgID8gZS5yZWxhdGVkVGFyZ2V0ICE9PSBkbmRSZWYudmFsdWVcbiAgICAgIDogZG9jdW1lbnQuZWxlbWVudHNGcm9tUG9pbnQoZS5jbGllbnRYLCBlLmNsaWVudFkpLmluY2x1ZGVzKGRuZFJlZi52YWx1ZSkgPT09IGZhbHNlXG5cbiAgICBnb25lID09PSB0cnVlICYmIChkbmQudmFsdWUgPSBmYWxzZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uRHJvcCAoZSkge1xuICAgIHN0b3BBbmRQcmV2ZW50RHJhZyhlKVxuICAgIGNvbnN0IGZpbGVzID0gZS5kYXRhVHJhbnNmZXIuZmlsZXNcblxuICAgIGlmIChmaWxlcy5sZW5ndGggIT09IDApIHtcbiAgICAgIGFkZEZpbGVzVG9RdWV1ZShudWxsLCBmaWxlcylcbiAgICB9XG5cbiAgICBkbmQudmFsdWUgPSBmYWxzZVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0RG5kTm9kZSAodHlwZSkge1xuICAgIGlmIChkbmQudmFsdWUgPT09IHRydWUpIHtcbiAgICAgIHJldHVybi
624BoKCdkaXYnLCB7XG4gICAgICAgIHJlZjogZG5kUmVmLFxuICAgICAgICBjbGFzczogYHEtJHsgdHlwZSB9X19kbmQgYWJzb2x1dGUtZnVsbGAsXG4gICAgICAgIG9uRHJhZ2VudGVyOiBzdG9wQW5kUHJldmVudERyYWcsXG4gICAgICAgIG9uRHJhZ292ZXI6IHN0b3BBbmRQcmV2ZW50RHJhZyxcbiAgICAgICAgb25EcmFnbGVhdmUsXG4gICAgICAgIG9uRHJvcFxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvLyBleHBvc2UgcHVibGljIG1ldGhvZHNcbiAgT2JqZWN0LmFzc2lnbihwcm94eSwgeyBwaWNrRmlsZXMsIGFkZEZpbGVzIH0pXG5cbiAgcmV0dXJuIHtcbiAgICBwaWNrRmlsZXMsXG4gICAgYWRkRmlsZXMsXG4gICAgb25EcmFnb3ZlcixcbiAgICBvbkRyYWdsZWF2ZSxcbiAgICBwcm9jZXNzRmlsZXMsXG4gICAgZ2V0RG5kTm9kZSxcblxuICAgIG1heEZpbGVzTnVtYmVyLFxuICAgIG1heFRvdGFsU2l6ZU51bWJlclxuICB9XG59XG4iLCJpbXBvcnQgeyBoLCByZWYsIGNvbXB1dGVkLCBnZXRDdXJyZW50SW5zdGFuY2UgfSBmcm9tICd2dWUnXG5cbmltcG9ydCBRQ2hpcCBmcm9tICcuLi9jaGlwL1FDaGlwLmpzJ1xuXG5pbXBvcnQgdXNlRmllbGQsIHsgdXNlRmllbGRTdGF0ZSwgdXNlTm9uSW5wdXRGaWVsZFByb3BzLCB1c2VGaWVsZEVtaXRzLCBmaWVsZFZhbHVlSXNGaWxsZWQgfSBmcm9tICcuLi8uLi9jb21wb3NhYmxlcy9wcml2YXRlLnVzZS1maWVsZC91c2UtZmllbGQuanMnXG5pbXBvcnQgeyB1c2VGb3JtUHJvcHMsIHVzZUZvcm1JbnB1dE5hbWVBdHRyIH0gZnJvbSAnLi4vLi4vY29tcG9zYWJsZXMvdXNlLWZvcm0vcHJpdmF0ZS51c2UtZm9ybS5qcydcbmltcG9ydCB1c2VGaWxlLCB7IHVzZUZpbGVQcm9wcywgdXNlRmlsZUVtaXRzIH0gZnJvbSAnLi4vLi4vY29tcG9zYWJsZXMvcHJpdmF0ZS51c2UtZmlsZS91c2UtZmlsZS5qcydcbmltcG9ydCB1c2VGaWxlRm9ybURvbVByb3BzIGZyb20gJy4uLy4uL2NvbXBvc2FibGVzL3ByaXZhdGUudXNlLWZpbGUvdXNlLWZpbGUtZG9tLXByb3BzLmpzJ1xuXG5pbXBvcnQgeyBjcmVhdGVDb21wb25lbnQgfSBmcm9tICcuLi8uLi91dGlscy9wcml2YXRlLmNyZWF0ZS9jcmVhdGUuanMnXG5pbXBvcnQgeyBodW1hblN0b3JhZ2VTaXplIH0gZnJvbSAnLi4vLi4vdXRpbHMvZm9ybWF0L2Zvcm1hdC5qcydcbmltcG9ydCB7IHByZXZlbnQgfSBmcm9tICcuLi8uLi91dGlscy9ldmVudC9ldmVudC5qcydcbmltcG9ydCB7IGluamVjdFByb3AgfSBmcm9tICcuLi8uLi91dGlscy9wcml2YXRlLmluamVjdC1vYmotcHJvcC9pbmplY3Qtb2JqLXByb3AuanMnXG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZUNvbXBvbmVudCh7XG4gIG5hbWU6ICdRRmlsZScsXG5cbiAgaW5oZXJpdEF0dHJzOiBmYWxzZSxcblxuICBwcm9wczoge1xuICAgIC4uLnVzZU5vbklucHV0RmllbGRQcm9wcyxcbiAgICAuLi51c2VGb3JtUHJvcHMsXG4gICAgLi4udXNlRmlsZVByb3BzLFxuXG4gICAgLyogU1NSIGRvZXMgbm90IGtub3cgYWJvdXQgRmlsZSAmIEZpbGVMaXN0ICovXG4gICAgbW9kZWxWYWx1ZTogX19RVUFTQVJfU1NSX1NFUlZFUl9fXG4gICAgICA/IHt9XG4gICAgICA6IFsgRmlsZSwgRmlsZUxpc3QsIEFycmF5IF0sXG5cbiAgICBhcHBlbmQ6IEJvb2xlYW4sXG4gICAgdXNlQ2hpcHM6IEJvb2xlYW4sXG4gICAgZGlzcGxheVZhbHVlOiBbIFN0cmluZywgTnVtYmVyIF0sXG5cbiAgICB0YWJpbmRleDoge1xuICAgICAgdHlwZTogWyBTdHJpbmcsIE51bWJlciBdLFxuICAgICAgZGVmYXVsdDogMFxuICAgIH0sXG5cbiAgICBjb3VudGVyTGFiZWw6IEZ1bmN0aW9uLFxuXG4gICAgaW5wdXRDbGFzczogWyBBcnJheSwgU3RyaW5nLCBPYmplY3QgXSxcbiAgICBpbnB1dFN0eWxlOiBbIEFycmF5LCBTdHJpbmcsIE9iamVjdCBdXG4gIH0sXG5cbiAgZW1pdHM6IFtcbiAgICAuLi51c2VGaWVsZEVtaXRzLFxuICAgIC4uLnVzZUZpbGVFbWl0c1xuICBdLFxuXG4gIHNldHVwIChwcm9wcywgeyBzbG90cywgZW1pdCwgYXR0cnMgfSkge1xuICAgIGNvbnN0IHsgcHJveHkgfSA9IGdldEN1cnJlbnRJbnN0YW5jZSgpXG5cbiAgICBjb25zdCBzdGF0ZSA9IHVzZUZpZWxkU3RhdGUoKVxuXG4gICAgY29uc3QgaW5wdXRSZWYgPSByZWYobnVsbClcbiAgICBjb25zdCBkbmQgPSByZWYoZmFsc2UpXG4gICAgY29uc3QgbmFtZVByb3AgPSB1c2VGb3JtSW5wdXROYW1lQXR0cihwcm9wcylcblxuICAgIGNvbnN0IHtcbiAgICAgIHBpY2tGaWxlcyxcbiAgICAgIG9uRHJhZ292ZXIsXG4gICAgICBvbkRyYWdsZWF2ZSxcbiAgICAgIHByb2Nlc3NGaWxlcyxcbiAgICAgIGdldERuZE5vZGVcbiAgICB9ID0gdXNlRmlsZSh7IGVkaXRhYmxlOiBzdGF0ZS5lZGl0YWJsZSwgZG5kLCBnZXRGaWxlSW5wdXQsIGFkZEZpbGVzVG9RdWV1ZSB9KVxuXG4gICAgY29uc3QgZm9ybURvbVByb3BzID0gdXNlRmlsZUZvcm1Eb21Qcm9wcyhwcm9wcylcblxuICAgIGNvbnN0IGlubmVyVmFsdWUgPSBjb21wdXRlZCgoKSA9PiAoXG4gICAgICBPYmplY3QocHJvcHMubW9kZWxWYWx1ZSkgPT09IHByb3BzLm1vZGVsVmFsdWVcbiAgICAgICAgPyAoJ2xlbmd0aCcgaW4gcHJvcHMubW9kZWxWYWx1ZSA/IEFycmF5LmZyb20ocHJvcHMubW9kZWxWYWx1ZSkgOiBbIHByb3BzLm1vZGVsVmFsdWUgXSlcbiAgICAgICAgOiBbXVxuICAgICkpXG5cbiAgICBjb25zdCBoYXNWYWx1ZSA9IGNvbXB1dGVkKCgpID0+IGZpZWxkVmFsdWVJc0ZpbGxlZChpbm5lclZhbHVlLnZhbHVlKSlcblxuICAgIGNvbnN0IHNlbGVjdGVkU3RyaW5nID0gY29tcHV0ZWQoKCkgPT5cbiAgICAgIGlubmVyVmFsdWUudmFsdWVcbiAgICAgICAgLm1hcChmaWxlID0+IGZpbGUubmFtZSlcbiAgICAgICAgLmpvaW4oJywgJylcbiAgICApXG5cbiAgICBjb25zdCB0b3RhbFNpemUgPSBjb21wdXRlZCgoKSA9PlxuICAgICAgaHVtYW5TdG9yYWdlU2l6ZShcbiAgICAgICAgaW5uZXJWYWx1ZS52YWx1ZS5yZWR1Y2UoKGFjYywgZmlsZSkgPT4gYWNjICsgZmlsZS5zaXplLCAwKVxuICAgICAgKVxuICAgIClcblxuICAgIGNvbnN0IGNvdW50ZXJQcm9wcyA9IGNvbXB1dGVkKCgpID0+ICh7XG4gICAgICB0b3RhbFNpemU6IHRvdGFsU2l6ZS52YWx1ZSxcbiAgICAgIGZpbGVzTnVtYmVyOiBpbm5lclZhbHVlLnZhbHVlLmxlbmd0aCxcbiAgICAgIG1heEZpbGVzOiBwcm9wcy5tYXhGaWxlc1xuICAgIH0pKVxuXG4gICAgY29uc3QgaW5wdXRBdHRycyA9IGNvbXB1dGVkKCgpID0+ICh7XG4gICAgICB0YWJpbmRleDogLTEsXG4gICAgICB0eX
624BlOiAnZmlsZScsXG4gICAgICB0aXRsZTogJycsIC8vIHRyeSB0byByZW1vdmUgZGVmYXVsdCB0b29sdGlwLFxuICAgICAgYWNjZXB0OiBwcm9wcy5hY2NlcHQsXG4gICAgICBjYXB0dXJlOiBwcm9wcy5jYXB0dXJlLFxuICAgICAgbmFtZTogbmFtZVByb3AudmFsdWUsXG4gICAgICAuLi5hdHRycyxcbiAgICAgIGlkOiBzdGF0ZS50YXJnZXRVaWQudmFsdWUsXG4gICAgICBkaXNhYmxlZDogc3RhdGUuZWRpdGFibGUudmFsdWUgIT09IHRydWVcbiAgICB9KSlcblxuICAgIGNvbnN0IGZpZWxkQ2xhc3MgPSBjb21wdXRlZCgoKSA9PlxuICAgICAgJ3EtZmlsZSBxLWZpZWxkLS1hdXRvLWhlaWdodCdcbiAgICAgICsgKGRuZC52YWx1ZSA9PT0gdHJ1ZSA/ICcgcS1maWxlLS1kbmQnIDogJycpXG4gICAgKVxuXG4gICAgY29uc3QgaXNBcHBlbmRpbmcgPSBjb21wdXRlZCgoKSA9PlxuICAgICAgcHJvcHMubXVsdGlwbGUgPT09IHRydWUgJiYgcHJvcHMuYXBwZW5kID09PSB0cnVlXG4gICAgKVxuXG4gICAgZnVuY3Rpb24gcmVtb3ZlQXRJbmRleCAoaW5kZXgpIHtcbiAgICAgIGNvbnN0IGZpbGVzID0gaW5uZXJWYWx1ZS52YWx1ZS5zbGljZSgpXG4gICAgICBmaWxlcy5zcGxpY2UoaW5kZXgsIDEpXG4gICAgICBlbWl0VmFsdWUoZmlsZXMpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVtb3ZlRmlsZSAoZmlsZSkge1xuICAgICAgY29uc3QgaW5kZXggPSBpbm5lclZhbHVlLnZhbHVlLmluZGV4T2YoZmlsZSlcbiAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgcmVtb3ZlQXRJbmRleChpbmRleClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlbWl0VmFsdWUgKGZpbGVzKSB7XG4gICAgICBlbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScsIHByb3BzLm11bHRpcGxlID09PSB0cnVlID8gZmlsZXMgOiBmaWxlc1sgMCBdKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uS2V5ZG93biAoZSkge1xuICAgICAgLy8gcHJldmVudCBmb3JtIHN1Ym1pdCBpZiBFTlRFUiBpcyBwcmVzc2VkXG4gICAgICBlLmtleUNvZGUgPT09IDEzICYmIHByZXZlbnQoZSlcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbktleXVwIChlKSB7XG4gICAgICAvLyBvbmx5IG9uIEVOVEVSIGFuZCBTUEFDRSB0byBtYXRjaCBuYXRpdmUgaW5wdXQgZmllbGRcbiAgICAgIGlmIChlLmtleUNvZGUgPT09IDEzIHx8IGUua2V5Q29kZSA9PT0gMzIpIHtcbiAgICAgICAgcGlja0ZpbGVzKGUpXG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0RmlsZUlucHV0ICgpIHtcbiAgICAgIHJldHVybiBpbnB1dFJlZi52YWx1ZVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZEZpbGVzVG9RdWV1ZSAoZSwgZmlsZUxpc3QpIHtcbiAgICAgIGNvbnN0IGZpbGVzID0gcHJvY2Vzc0ZpbGVzKGUsIGZpbGVMaXN0LCBpbm5lclZhbHVlLnZhbHVlLCBpc0FwcGVuZGluZy52YWx1ZSlcbiAgICAgIGNvbnN0IGZpbGVJbnB1dCA9IGdldEZpbGVJbnB1dCgpXG5cbiAgICAgIGlmIChmaWxlSW5wdXQgIT09IHZvaWQgMCAmJiBmaWxlSW5wdXQgIT09IG51bGwpIHtcbiAgICAgICAgZmlsZUlucHV0LnZhbHVlID0gJydcbiAgICAgIH1cblxuICAgICAgLy8gaWYgbm90aGluZyB0byBkby4uLlxuICAgICAgaWYgKGZpbGVzID09PSB2b2lkIDApIHJldHVyblxuXG4gICAgICAvLyBwcm90ZWN0IGFnYWluc3QgaW5wdXQgQGNoYW5nZSBiZWluZyBjYWxsZWQgaW4gYSBsb29wXG4gICAgICAvLyBsaWtlIGl0IGhhcHBlbnMgb24gU2FmYXJpLCBzbyBkb24ndCBlbWl0IHNhbWUgdGhpbmc6XG4gICAgICBpZiAoXG4gICAgICAgIHByb3BzLm11bHRpcGxlID09PSB0cnVlXG4gICAgICAgICAgPyBwcm9wcy5tb2RlbFZhbHVlICYmIGZpbGVzLmV2ZXJ5KGYgPT4gaW5uZXJWYWx1ZS52YWx1ZS5pbmNsdWRlcyhmKSlcbiAgICAgICAgICA6IHByb3BzLm1vZGVsVmFsdWUgPT09IGZpbGVzWyAwIF1cbiAgICAgICkgcmV0dXJuXG5cbiAgICAgIGVtaXRWYWx1ZShcbiAgICAgICAgaXNBcHBlbmRpbmcudmFsdWUgPT09IHRydWVcbiAgICAgICAgICA/IGlubmVyVmFsdWUudmFsdWUuY29uY2F0KGZpbGVzKVxuICAgICAgICAgIDogZmlsZXNcbiAgICAgIClcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRGaWxsZXIgKCkge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgaCgnaW5wdXQnLCB7XG4gICAgICAgICAgY2xhc3M6IFsgcHJvcHMuaW5wdXRDbGFzcywgJ3EtZmlsZV9fZmlsbGVyJyBdLFxuICAgICAgICAgIHN0eWxlOiBwcm9wcy5pbnB1dFN0eWxlXG4gICAgICAgIH0pXG4gICAgICBdXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2VsZWN0aW9uICgpIHtcbiAgICAgIGlmIChzbG90cy5maWxlICE9PSB2b2lkIDApIHtcbiAgICAgICAgcmV0dXJuIGlubmVyVmFsdWUudmFsdWUubGVuZ3RoID09PSAwXG4gICAgICAgICAgPyBnZXRGaWxsZXIoKVxuICAgICAgICAgIDogaW5uZXJWYWx1ZS52YWx1ZS5tYXAoXG4gICAgICAgICAgICAoZmlsZSwgaW5kZXgpID0+IHNsb3RzLmZpbGUoeyBpbmRleCwgZmlsZSwgcmVmOiB0aGlzIH0pXG4gICAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICBpZiAoc2xvdHMuc2VsZWN0ZWQgIT09IHZvaWQgMCkge1xuICAgICAgICByZXR1cm4gaW5uZXJWYWx1ZS52YWx1ZS5sZW5ndGggPT09IDBcbiAgICAgICAgICA/IGdldEZpbGxlcigpXG4gICAgICAgICAgOiBzbG90cy5zZWxlY3RlZCh7IGZpbGVzOiBpbm5lclZhbHVlLnZhbHVlLCByZWY6IHRoaXMgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BzLnVzZUNoaXBzID09PSB0cnVlKSB7XG4gICAgICAgIHJldHVybiBpbm5lclZhbHVlLnZhbHVlLmxlbmd0aCA9PT0gMFxuICAgICAgICAgID8gZ2V0RmlsbGVyKClcbiAgICAgICAgICA6IGlubmVyVmFsdWUudmFsdWUubWFwKChmaWxlLCBpKSA9PiBoKFFDaGlwLCB7XG4gICAgICAgICAgICBrZXk6ICdmaWxlLScgKyBpLFxuICAgICAgICAgICAgcmVtb3ZhYmxlOiBzdGF0ZS5lZGl0YWJsZS52YWx1ZSxcbiAgICAgICAgICAgIGRlbnNlOiB0cnVlLFxuICAgICAgICAgICAgdGV4dENvbG9yOiBwcm9wcy5jb2xvcixcbiAgICAgICAgICAgIHRhYmluZGV4OiBwcm9wcy50YWJpbmRleCxcbiAgICAgICAgICAgIG9uUmVtb3ZlOiAoKSA9PiB7IHJlbW92ZUF0SW5kZXgoaSkgfVxuICAgICAgICAgI
624H0sICgpID0+IGgoJ3NwYW4nLCB7XG4gICAgICAgICAgICBjbGFzczogJ2VsbGlwc2lzJyxcbiAgICAgICAgICAgIHRleHRDb250ZW50OiBmaWxlLm5hbWVcbiAgICAgICAgICB9KSkpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRleHRDb250ZW50ID0gcHJvcHMuZGlzcGxheVZhbHVlICE9PSB2b2lkIDBcbiAgICAgICAgPyBwcm9wcy5kaXNwbGF5VmFsdWVcbiAgICAgICAgOiBzZWxlY3RlZFN0cmluZy52YWx1ZVxuXG4gICAgICByZXR1cm4gdGV4dENvbnRlbnQubGVuZ3RoICE9PSAwXG4gICAgICAgID8gW1xuICAgICAgICAgICAgaCgnZGl2Jywge1xuICAgICAgICAgICAgICBjbGFzczogcHJvcHMuaW5wdXRDbGFzcyxcbiAgICAgICAgICAgICAgc3R5bGU6IHByb3BzLmlucHV0U3R5bGUsXG4gICAgICAgICAgICAgIHRleHRDb250ZW50XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIF1cbiAgICAgICAgOiBnZXRGaWxsZXIoKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldElucHV0ICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgIHJlZjogaW5wdXRSZWYsXG4gICAgICAgIC4uLmlucHV0QXR0cnMudmFsdWUsXG4gICAgICAgIC4uLmZvcm1Eb21Qcm9wcy52YWx1ZSxcbiAgICAgICAgY2xhc3M6ICdxLWZpZWxkX19pbnB1dCBmaXQgYWJzb2x1dGUtZnVsbCBjdXJzb3ItcG9pbnRlcicsXG4gICAgICAgIG9uQ2hhbmdlOiBhZGRGaWxlc1RvUXVldWVcbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BzLm11bHRpcGxlID09PSB0cnVlKSB7XG4gICAgICAgIGRhdGEubXVsdGlwbGUgPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBoKCdpbnB1dCcsIGRhdGEpXG4gICAgfVxuXG4gICAgT2JqZWN0LmFzc2lnbihzdGF0ZSwge1xuICAgICAgZmllbGRDbGFzcyxcbiAgICAgIGVtaXRWYWx1ZSxcbiAgICAgIGhhc1ZhbHVlLFxuICAgICAgaW5wdXRSZWYsXG4gICAgICBpbm5lclZhbHVlLFxuXG4gICAgICBmbG9hdGluZ0xhYmVsOiBjb21wdXRlZCgoKSA9PlxuICAgICAgICBoYXNWYWx1ZS52YWx1ZSA9PT0gdHJ1ZVxuICAgICAgICB8fCBmaWVsZFZhbHVlSXNGaWxsZWQocHJvcHMuZGlzcGxheVZhbHVlKVxuICAgICAgKSxcblxuICAgICAgY29tcHV0ZWRDb3VudGVyOiBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGlmIChwcm9wcy5jb3VudGVyTGFiZWwgIT09IHZvaWQgMCkge1xuICAgICAgICAgIHJldHVybiBwcm9wcy5jb3VudGVyTGFiZWwoY291bnRlclByb3BzLnZhbHVlKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWF4ID0gcHJvcHMubWF4RmlsZXNcbiAgICAgICAgcmV0dXJuIGAkeyBpbm5lclZhbHVlLnZhbHVlLmxlbmd0aCB9JHsgbWF4ICE9PSB2b2lkIDAgPyAnIC8gJyArIG1heCA6ICcnIH0gKCR7IHRvdGFsU2l6ZS52YWx1ZSB9KWBcbiAgICAgIH0pLFxuXG4gICAgICBnZXRDb250cm9sQ2hpbGQ6ICgpID0+IGdldERuZE5vZGUoJ2ZpbGUnKSxcbiAgICAgIGdldENvbnRyb2w6ICgpID0+IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgICByZWY6IHN0YXRlLnRhcmdldFJlZixcbiAgICAgICAgICBjbGFzczogJ3EtZmllbGRfX25hdGl2ZSByb3cgaXRlbXMtY2VudGVyIGN1cnNvci1wb2ludGVyJyxcbiAgICAgICAgICB0YWJpbmRleDogcHJvcHMudGFiaW5kZXhcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGF0ZS5lZGl0YWJsZS52YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgIE9iamVjdC5hc3NpZ24oZGF0YSwgeyBvbkRyYWdvdmVyLCBvbkRyYWdsZWF2ZSwgb25LZXlkb3duLCBvbktleXVwIH0pXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaCgnZGl2JywgZGF0YSwgWyBnZXRJbnB1dCgpIF0uY29uY2F0KGdldFNlbGVjdGlvbigpKSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgLy8gZXhwb3NlIHB1YmxpYyBtZXRob2RzXG4gICAgT2JqZWN0LmFzc2lnbihwcm94eSwge1xuICAgICAgcmVtb3ZlQXRJbmRleCxcbiAgICAgIHJlbW92ZUZpbGUsXG4gICAgICBnZXROYXRpdmVFbGVtZW50OiAoKSA9PiBpbnB1dFJlZi52YWx1ZSAvLyBkZXByZWNhdGVkXG4gICAgfSlcblxuICAgIGluamVjdFByb3AocHJveHksICduYXRpdmVFbCcsICgpID0+IGlucHV0UmVmLnZhbHVlKVxuXG4gICAgcmV0dXJuIHVzZUZpZWxkKHN0YXRlKVxuICB9XG59KVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBT0EsTUFBQSxlQUFlLGdCQUFnQjtBQUFBLEVBQzdCLE1BQU07QUFBQSxFQUVOLE9BQU87QUFBQSxJQUNMLEdBQUc7QUFBQSxJQUNILFVBQVU7QUFBQSxFQUNkO0FBQUEsRUFFRSxNQUFPLE9BQU8sRUFBRSxTQUFTO0FBQ3ZCLFVBQU0sYUFBYSxTQUFTLEtBQUs7QUFFakMsVUFBTSxVQUFVO0FBQUEsTUFBUyxNQUN2QixtQkFBb0IsV0FBVyxLQUFLLHFCQUNaLE1BQU0sYUFBYSxPQUFPLGdCQUFnQixXQUFXO0FBQUEsSUFDbkY7QUFFSSxXQUFPLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxRQUFRLFNBQVMsTUFBTSxNQUFNLE9BQU8sQ0FBQztBQUFBLEVBQ3RFO0FBQ0YsQ0FBQztBQ3ZCYyxTQUFBLGlCQUFVLE9BQU8sU0FBUztBQUN2QyxRQUFNLGFBQWEsSUFBSSxJQUFJO0FBRTNCLFFBQU0sa0JBQWtCLFNBQVMsTUFBTTtBQUNyQyxRQUFJLE1BQU0sWUFBWSxNQUFNO0FBQzFCLGFBQU87QUFBQSxJQUNUO0FBRUEsV0FBTyxFQUFFLFFBQVE7QUFBQSxNQUNmLEtBQUs7QUFBQSxNQUNMLE9BQU87QUFBQSxNQUNQLFVBQVU7QUFBQSxJQUNoQixDQUFLO0FBQUEsRUFDSCxDQUFDO0FBRUQsV0FBUyxjQUFlLEdBQUc7QUFDekIsVUFBTSxPQUFPLFFBQVE7QUFFckIsUUFBSSxHQUFHLGdCQUFnQixLQUFNO0FBRTdCLFFBQUksR0FBRyxLQUFLLFFBQVEsS0FBSyxNQUFNLEdBQUc7QUFDaEMsVUFDRSxTQUFTLGtCQUFrQixRQUN4QixNQUFNLFNBQVMsU0FBUyxhQUFhLE1BQU0sTUFDOUM7QUFDQSxhQUFLLE1BQUs7QUFBQSxNQUNaO0FBQUEsSUFDRixXQUVFLFdBQVcsVUFBVSxTQUNoQixNQUFNLFVBQVksTUFBTSxTQUFTLEVBQUUsTUFBTSxNQUFNLE9BQ3BEO0FBQ0EsaUJBQVcsTUFBTSxNQUFLO0FBQUEsSUFDeEI7QUFBQSxFQUNGO0FBRUEsU0FBTztBQUFBLElBQ0w7QUFBQSxJQUNBO0FBQUEsRUFDSjtBQUNBO0FDMUNBLE1BQUEsY0FBZTtBQUFBLEVBQ2IsSUFBSTtBQUFBLEVBQ0osSUFBSTtBQUFBLEVBQ0osSUFBSTtBQUFBLEVBQ0osSUFBSTtBQUFBLEVBQ0osSUFBSTtBQUNOO0FDS08sTUFBTSxtQkFBbUI7QUFBQSxFQUM5QixHQUFHO0FBQUEsRUFDSCxHQU
624FHO0FBQUEsRUFDSCxHQUFHO0FBQUEsRUFFSCxZQUFZO0FBQUEsSUFDVixVQUFVO0FBQUEsSUFDVixTQUFTO0FBQUEsRUFDYjtBQUFBLEVBQ0UsS0FBSyxDQUFBO0FBQUEsRUFFTCxXQUFXLEVBQUUsU0FBUyxLQUFJO0FBQUEsRUFDMUIsWUFBWSxFQUFFLFNBQVMsTUFBSztBQUFBLEVBQzVCLG9CQUFvQixFQUFFLFNBQVMsS0FBSTtBQUFBLEVBRW5DLGFBQWE7QUFBQSxFQUNiLGVBQWU7QUFBQSxFQUNmLG1CQUFtQjtBQUFBLEVBRW5CLGFBQWE7QUFBQSxJQUNYLE1BQU07QUFBQSxJQUNOLFdBQVcsT0FBSyxNQUFNLFFBQVEsTUFBTTtBQUFBLEVBQ3hDO0FBQUEsRUFDRSxxQkFBcUI7QUFBQSxFQUVyQixPQUFPO0FBQUEsRUFDUCxXQUFXO0FBQUEsRUFFWCxPQUFPO0FBQUEsRUFDUCxXQUFXO0FBQUEsRUFDWCxPQUFPO0FBQUEsRUFFUCxTQUFTO0FBQUEsRUFDVCxVQUFVLENBQUUsUUFBUSxNQUFNO0FBQzVCO0FBRU8sTUFBTSxtQkFBbUIsQ0FBRSxtQkFBbUI7QUFFdEMsU0FBQSxZQUFVLE1BQU0sVUFBVTtBQUN2QyxRQUFNLEVBQUUsT0FBTyxPQUFPLE1BQU0sTUFBSyxJQUFLLG1CQUFrQjtBQUN4RCxRQUFNLEVBQUUsR0FBRSxJQUFLO0FBRWYsUUFBTSxTQUFTLFFBQVEsT0FBTyxFQUFFO0FBRWhDLFFBQU0sVUFBVSxJQUFJLElBQUk7QUFDeEIsUUFBTSxFQUFFLGlCQUFpQixjQUFhLElBQUssaUJBQWlCLE9BQU8sT0FBTztBQUMxRSxRQUFNLFlBQVksUUFBUSxPQUFPLFdBQVc7QUFFNUMsUUFBTSxlQUFlO0FBQUEsSUFBUyxNQUM1QixNQUFNLFFBQVEsVUFBVSxNQUFNLFFBQVEsTUFBTSxVQUFVO0FBQUEsRUFDMUQ7QUFFRSxRQUFNLFFBQVEsU0FBUyxNQUFNO0FBQzNCLFVBQU0sTUFBTSxNQUFNLE1BQU0sR0FBRztBQUMzQixXQUFPLGFBQWEsVUFBVSxPQUMxQixNQUFNLFdBQVcsVUFBVSxTQUFPLE1BQU0sR0FBRyxNQUFNLEdBQUcsSUFDcEQ7QUFBQSxFQUNOLENBQUM7QUFFRCxRQUFNLFNBQVMsU0FBUyxNQUN0QixhQUFhLFVBQVUsT0FDbkIsTUFBTSxVQUFVLEtBQ2hCLE1BQU0sTUFBTSxVQUFVLE1BQU0sTUFBTSxNQUFNLFNBQVMsQ0FDdEQ7QUFFRCxRQUFNLFVBQVUsU0FBUyxNQUN2QixhQUFhLFVBQVUsT0FDbkIsTUFBTSxVQUFVLEtBQ2hCLE1BQU0sTUFBTSxVQUFVLE1BQU0sTUFBTSxNQUFNLFVBQVUsQ0FDdkQ7QUFFRCxRQUFNLGtCQUFrQjtBQUFBLElBQVMsTUFDL0IsT0FBTyxVQUFVLFNBQVMsUUFBUSxVQUFVO0FBQUEsRUFDaEQ7QUFFRSxRQUFNLFdBQVcsU0FBUyxNQUN4QixNQUFNLFlBQVksT0FBTyxLQUFLLE1BQU0sWUFBWSxDQUNqRDtBQUVELFFBQU0sVUFBVTtBQUFBLElBQVMsTUFDdkIsS0FBTSxvRUFDSCxNQUFNLFlBQVksT0FBTyxjQUFjLE9BQ3ZDLE9BQU8sVUFBVSxPQUFPLE1BQU8sSUFBSSxXQUFZLE9BQy9DLE1BQU0sVUFBVSxPQUFPLE1BQU8sSUFBSSxZQUFhLE9BQy9DLE1BQU0sY0FBYyxPQUFPLGFBQWE7QUFBQSxFQUMvQztBQUVFLFFBQU0sYUFBYSxTQUFTLE1BQU07QUFDaEMsVUFBTSxRQUFRLE9BQU8sVUFBVSxPQUFPLFdBQVksUUFBUSxVQUFVLE9BQU8sVUFBVTtBQUNyRixVQUFNLFFBQVEsTUFBTSxVQUFVLFdBQzVCLE1BQU0sY0FBYyxRQUNJLE9BQU8sVUFBVSxRQUV2QyxTQUFVLE1BQU0sS0FBSyxLQUNyQjtBQUVKLFdBQU8sS0FBTSxrREFBb0QsSUFBSSxZQUFjLEtBQUssR0FBSyxLQUFLO0FBQUEsRUFDcEcsQ0FBQztBQUVELFFBQU0sWUFBWSxTQUFTLE1BQU07QUFDL0IsVUFBTSxPQUFPLEVBQUUsTUFBTSxXQUFVO0FBRS9CLFVBQU0sU0FBUyxVQUFVLE9BQU8sT0FBTyxNQUFNO0FBQUE7QUFBQSxNQUUzQyxZQUFZLE9BQU87QUFBQSxNQUNuQixZQUFZLE9BQU8sVUFBVSxPQUFPLFlBQVk7QUFBQSxNQUNoRCxNQUFNLE1BQU07QUFBQSxNQUNaLE9BQU8sYUFBYSxVQUFVLE9BQzFCLE1BQU0sTUFDTixNQUFNO0FBQUEsSUFDaEIsQ0FBSztBQUVELFdBQU87QUFBQSxFQUNULENBQUM7QUFFRCxRQUFNLGtCQUFrQixjQUFjLFNBQVM7QUFFL0MsUUFBTSxhQUFhLFNBQVMsTUFBTTtBQUNoQyxVQUFNLFFBQVE7QUFBQSxNQUNaLFVBQVUsU0FBUztBQUFBLE1BQ25CLE1BQTBCO0FBQUEsTUFDMUIsY0FBYyxNQUFNO0FBQUEsTUFDcEIsZ0JBQWdCLGdCQUFnQixVQUFVLE9BQ3RDLFVBQ0MsT0FBTyxVQUFVLE9BQU8sU0FBUztBQUFBLElBQzVDO0FBRUksUUFBSSxNQUFNLFlBQVksTUFBTTtBQUMxQixZQUFPLGVBQWUsSUFBSztBQUFBLElBQzdCO0FBRUEsV0FBTztBQUFBLEVBQ1QsQ0FBQztBQUVELFdBQVMsUUFBUyxHQUFHO0FBQ25CLFFBQUksTUFBTSxRQUFRO0FBQ2hCLHFCQUFlLENBQUM7QUFDaEIsb0JBQWMsQ0FBQztBQUFBLElBQ2pCO0FBRUEsUUFBSSxNQUFNLFlBQVksTUFBTTtBQUMxQixXQUFLLHFCQUFxQixhQUFZLEdBQUksQ0FBQztBQUFBLElBQzdDO0FBQUEsRUFDRjtBQUVBLFdBQVMsZUFBZ0I7QUFDdkIsUUFBSSxhQUFhLFVBQVUsTUFBTTtBQUMvQixVQUFJLE9BQU8sVUFBVSxNQUFNO0FBQ3pCLGNBQU0sTUFBTSxNQUFNLFdBQVcsTUFBSztBQUNsQyxZQUFJLE9BQU8sTUFBTSxPQUFPLENBQUM7QUFDekIsZUFBTztBQUFBLE1BQ1Q7QUFFQSxhQUFPLE1BQU0sV0FBVyxPQUFPLENBQUUsTUFBTSxHQUFHLENBQUU7QUFBQSxJQUM5QztBQUVBLFFBQUksT0FBTyxVQUFVLE1BQU07QUFDekIsVUFBSSxNQUFNLGdCQUFnQixRQUFRLE1BQU0sd0JBQXdCLE9BQU87QUFDckUsZUFBTyxNQUFNO0FBQUEsTUFDZjtBQUFBLElBQ0YsV0FDUyxRQUFRLFVBQVUsTUFBTTtBQUMvQixVQUFJLE1BQU0sZ0JBQWdCLFFBQVEsTUFBTSx3QkFBd0IsT0FBTztBQUNyRSxlQUFPLE1BQU07QUFBQSxNQUNmO0FBQUEsSUFDRixPQUNLO0FBQ0gsYUFBTyxNQUFNLGdCQUFnQixPQUN6QixNQUFNLFlBQ04sTUFBTTtBQUFBLElBQ1o7QUFFQSxXQUFPLE1BQU07QUFBQSxFQUNmO0FBRUEsV0FBUyxVQUFXLEdBQUc7QUFDckIsUUFBSSxFQUFFLFlBQVksTUFBTSxFQUFFLFlBQVksSUFBSTtBQUN4QyxxQkFBZSxDQUFDO0FBQUEsSUFDbEI7QUFBQSxFQUNGO0FBRUEsV0FBUyxRQUFTLEdBQUc7QUFDbkIsUUFBSSxFQUFFLFlBQVksTUFBTSxFQUFFLFlBQVksSUFBSTtBQUN4QyxjQUFRLENBQUM7QUFBQSxJQUNYO0FBQUEsRUFDRjtBQUVBLFFBQU0sa0JBQWtCLFNBQVMsUUFBUSxlQUFlO0FBR3hELFNBQU8sT0FBTyxPQUFPLEVBQUUsUUFBUSxRQUFPLENBQUU7QUFFeEMsU0FBT
624yxNQUFNO0FBQ1gsVUFBTSxRQUFRLGdCQUFlO0FBRTdCLFVBQU0sWUFBWSxRQUFRO0FBQUEsTUFDeEI7QUFBQSxNQUNBO0FBQUEsTUFDQSxNQUFPO0lBQ2I7QUFFSSxVQUFNLFFBQVE7QUFBQSxNQUNaLEVBQUUsT0FBTztBQUFBLFFBQ1AsT0FBTyxXQUFXO0FBQUEsUUFDbEIsT0FBTyxVQUFVO0FBQUEsUUFDakIsZUFBZTtBQUFBLE1BQ3ZCLEdBQVMsS0FBSztBQUFBLElBQ2Q7QUFFSSxRQUFJLGdCQUFnQixVQUFVLE1BQU07QUFDbEMsWUFBTSxLQUFLLGdCQUFnQixLQUFLO0FBQUEsSUFDbEM7QUFFQSxVQUFNLFFBQVEsTUFBTSxVQUFVLFNBQzFCLFdBQVcsTUFBTSxTQUFTLENBQUUsTUFBTSxLQUFLLENBQUUsSUFDekMsTUFBTSxNQUFNLE9BQU87QUFFdkIsY0FBVSxVQUFVLE1BQU07QUFBQSxNQUN4QixFQUFFLE9BQU87QUFBQSxRQUNQLE9BQU8sS0FBTTtNQUNyQixHQUFTLEtBQUs7QUFBQSxJQUNkO0FBRUksV0FBTyxFQUFFLE9BQU87QUFBQSxNQUNkLEtBQUs7QUFBQSxNQUNMLE9BQU8sUUFBUTtBQUFBLE1BQ2YsR0FBRyxXQUFXO0FBQUEsTUFDZDtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFDTixHQUFPLEtBQUs7QUFBQSxFQUNWO0FBQ0Y7QUMzT0EsTUFBQSxVQUFlLGdCQUFnQjtBQUFBLEVBQzdCLE1BQU07QUFBQSxFQUVOLE9BQU87QUFBQSxJQUNMLEdBQUc7QUFBQSxJQUVILE1BQU07QUFBQSxJQUNOLFdBQVc7QUFBQSxFQUNmO0FBQUEsRUFFRSxPQUFPO0FBQUEsRUFFUCxNQUFPLE9BQU87QUFDWixhQUFTLFNBQVUsUUFBUSxpQkFBaUI7QUFDMUMsWUFBTSxPQUFPO0FBQUEsUUFBUyxPQUNuQixPQUFPLFVBQVUsT0FDZCxNQUFNLGNBQ0wsZ0JBQWdCLFVBQVUsT0FBTyxNQUFNLG9CQUFvQixNQUFNLGtCQUNqRSxNQUFNO0FBQUEsTUFDbkI7QUFFTSxZQUFNLFFBQVEsU0FBUyxNQUFPLE9BQU8sVUFBVSxPQUFPLE1BQU0sWUFBWSxJQUFLO0FBRTdFLGFBQU8sTUFBTTtBQUFBLFFBQ1gsRUFBRSxPQUFPLEVBQUUsT0FBTyxrQkFBaUIsQ0FBRTtBQUFBLFFBRXJDO0FBQUEsVUFBRTtBQUFBLFVBQU87QUFBQSxZQUNQLE9BQU87QUFBQSxVQUNqQjtBQUFBLFVBQVcsS0FBSyxVQUFVLFNBQ2Q7QUFBQSxZQUNFLEVBQUUsT0FBTztBQUFBLGNBQ1AsTUFBTSxLQUFLO0FBQUEsY0FDWCxPQUFPLE1BQU07QUFBQSxZQUM3QixDQUFlO0FBQUEsVUFDZixJQUNZO0FBQUEsUUFDWjtBQUFBLE1BQ0E7QUFBQSxJQUNJO0FBRUEsV0FBTyxZQUFZLFVBQVUsUUFBUTtBQUFBLEVBQ3ZDO0FBQ0YsQ0FBQztBQzdDRCxTQUFTLFlBQWEsT0FBTyxlQUFlLHNCQUFzQixVQUFVO0FBQzFFLFFBQU0sZ0JBQWdCLENBQUE7QUFFdEIsUUFBTSxRQUFRLFVBQVE7QUFDcEIsUUFBSSxTQUFTLElBQUksTUFBTSxNQUFNO0FBQzNCLG9CQUFjLEtBQUssSUFBSTtBQUFBLElBQ3pCLE9BQ0s7QUFDSCxvQkFBYyxLQUFLLEVBQUUsc0JBQXNCLEtBQUksQ0FBRTtBQUFBLElBQ25EO0FBQUEsRUFDRixDQUFDO0FBRUQsU0FBTztBQUNUO0FBRUEsU0FBUyxtQkFBb0IsR0FBRztBQUM5QixNQUFJLEdBQUcsY0FBYztBQUNuQixNQUFFLGFBQWEsYUFBYTtBQUFBLEVBQzlCO0FBRUEsaUJBQWUsQ0FBQztBQUNsQjtBQUVPLE1BQU0sZUFBZTtBQUFBLEVBQzFCLFVBQVU7QUFBQSxFQUNWLFFBQVE7QUFBQSxFQUNSLFNBQVM7QUFBQSxFQUNULGFBQWEsQ0FBRSxRQUFRLE1BQU07QUFBQSxFQUM3QixjQUFjLENBQUUsUUFBUSxNQUFNO0FBQUEsRUFDOUIsVUFBVSxDQUFFLFFBQVEsTUFBTTtBQUFBLEVBQzFCLFFBQVE7QUFDVjtBQUVPLE1BQU0sZUFBZSxDQUFFLFVBQVU7QUFFekIsU0FBQSxRQUFVO0FBQUEsRUFDdkI7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRixHQUFHO0FBQ0QsUUFBTSxFQUFFLE9BQU8sTUFBTSxNQUFLLElBQUssbUJBQWtCO0FBRWpELFFBQU0sU0FBUyxJQUFJLElBQUk7QUFFdkIsUUFBTSxhQUFhLFNBQVMsTUFDMUIsTUFBTSxXQUFXLFNBQ2IsTUFBTSxPQUFPLE1BQU0sR0FBRyxFQUFFLElBQUksU0FBTztBQUNuQyxVQUFNLElBQUksS0FBSTtBQUNkLFFBQUksUUFBUSxLQUFLO0FBQ2YsYUFBTztBQUFBLElBQ1QsV0FDUyxJQUFJLFNBQVMsSUFBSSxHQUFHO0FBQzNCLFlBQU0sSUFBSSxNQUFNLEdBQUcsSUFBSSxTQUFTLENBQUM7QUFBQSxJQUNuQztBQUNBLF
624dBQU8sSUFBSSxZQUFXO0FBQUEsRUFDeEIsQ0FBQyxJQUNDLElBQ0w7QUFFRCxRQUFNLGlCQUFpQixTQUFTLE1BQU0sU0FBUyxNQUFNLFVBQVUsRUFBRSxDQUFDO0FBQ2xFLFFBQU0scUJBQXFCLFNBQVMsTUFBTSxTQUFTLE1BQU0sY0FBYyxFQUFFLENBQUM7QUFFMUUsV0FBUyxVQUFXLEdBQUc7QUFDckIsUUFBSSxTQUFTLE9BQU87QUFDbEIsVUFBSSxNQUFNLE9BQU8sQ0FBQyxHQUFHO0FBQ25CLFlBQUksRUFBRSxRQUFRLEtBQUk7QUFBQSxNQUNwQjtBQUVBLFVBQUksRUFBRSxRQUFRLFFBQVEsb0JBQW9CLE1BQU0sTUFBTTtBQUVwRCxVQUFFLFlBQVksS0FBSyxFQUFFLFlBQVksS0FBSyxLQUFLLENBQUM7QUFBQSxNQUM5QyxPQUNLO0FBQ0gsY0FBTSxRQUFRLGFBQVk7QUFDMUIsWUFBSSxVQUFVLEVBQUUsT0FBUSxRQUFPLE1BQU0sQ0FBQztBQUFBLE1BQ3hDO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFFQSxXQUFTLFNBQVUsT0FBTztBQUN4QixRQUFJLFNBQVMsU0FBUyxPQUFPO0FBQzNCLHNCQUFnQixNQUFNLEtBQUs7QUFBQSxJQUM3QjtBQUFBLEVBQ0Y7QUFFQSxXQUFTLGFBQWMsR0FBRyxnQkFBZ0IsaUJBQWlCLFFBQVE7QUFDakUsUUFBSSxRQUFRLE1BQU0sS0FBSyxrQkFBa0IsRUFBRSxPQUFPLEtBQUs7QUFDdkQsVUFBTSxnQkFBZ0IsQ0FBQTtBQUV0QixVQUFNLE9BQU8sTUFBTTtBQUNqQixVQUFJLGNBQWMsV0FBVyxHQUFHO0FBQzlCLGFBQUssWUFBWSxhQUFhO0FBQUEsTUFDaEM7QUFBQSxJQUNGO0FBR0EsUUFBSSxNQUFNLFdBQVcsVUFBVSxXQUFXLE1BQU0sUUFBUSxJQUFJLE1BQU0sSUFBSTtBQUNwRSxjQUFRLFlBQVksT0FBTyxlQUFlLFVBQVUsVUFBUTtBQUMxRCxlQUFPLFdBQVcsTUFBTSxLQUFLLFNBQzNCLEtBQUssS0FBSyxZQUFXLEVBQUcsV0FBVyxHQUFHLEtBQ25DLEtBQUssS0FBSyxZQUFXLEVBQUcsU0FBUyxHQUFHLENBQ3hDO0FBQUEsTUFDSCxDQUFDO0FBRUQsVUFBSSxNQUFNLFdBQVcsR0FBRztBQUFFLGVBQU8sS0FBSTtBQUFBLE1BQUc7QUFBQSxJQUMxQztBQUdBLFFBQUksTUFBTSxnQkFBZ0IsUUFBUTtBQUNoQyxZQUFNLGNBQWMsU0FBUyxNQUFNLGFBQWEsRUFBRTtBQUNsRCxjQUFRLFlBQVksT0FBTyxlQUFlLGlCQUFpQixVQUFRO0FBQ2pFLGVBQU8sS0FBSyxRQUFRO0FBQUEsTUFDdEIsQ0FBQztBQUVELFVBQUksTUFBTSxXQUFXLEdBQUc7QUFBRSxlQUFPLEtBQUk7QUFBQSxNQUFHO0FBQUEsSUFDMUM7QUFLQSxRQUFJLE1BQU0sYUFBYSxRQUFRLE1BQU0sV0FBVyxHQUFHO0FBQ2pELGNBQVEsQ0FBRSxNQUFPLENBQUMsQ0FBRTtBQUFBLElBQ3RCO0FBR0EsVUFBTSxRQUFRLFVBQVE7QUFDcEIsV0FBSyxRQUFRLEtBQUsscUJBQXFCLEtBQUssZUFBZSxLQUFLLE9BQU8sS0FBSztBQUFBLElBQzlFLENBQUM7QUFFRCxRQUFJLFdBQVcsTUFBTTtBQUVuQixZQUFNLGNBQWMsZ0JBQWdCLElBQUksV0FBUyxNQUFNLEtBQUs7QUFDNUQsY0FBUSxZQUFZLE9BQU8sZUFBZSxhQUFhLFVBQVE7QUFDN0QsZUFBTyxZQUFZLFNBQVMsS0FBSyxLQUFLLE1BQU07QUFBQSxNQUM5QyxDQUFDO0FBQUEsSUFDSDtBQUVBLFFBQUksTUFBTSxXQUFXLEdBQUc7QUFBRSxhQUFPLEtBQUk7QUFBQSxJQUFHO0FBRXhDLFFBQUksTUFBTSxpQkFBaUIsUUFBUTtBQUNqQyxVQUFJLE9BQU8sV0FBVyxPQUNsQixnQkFBZ0IsT0FBTyxDQUFDLE9BQU8sU0FBUyxRQUFRLEtBQUssTUFBTSxDQUFDLElBQzVEO0FBRUosY0FBUSxZQUFZLE9BQU8sZUFBZSxrQkFBa0IsVUFBUTtBQUNsRSxnQkFBUSxLQUFLO0FBQ2IsZUFBTyxRQUFRLG1CQUFtQjtBQUFBLE1BQ3BDLENBQUM7QUFFRCxVQUFJLE1BQU0sV0FBVyxHQUFHO0FBQUUsZUFBTyxLQUFJO0FBQUEsTUFBRztBQUFBLElBQzFDO0FBR0EsUUFBSSxPQUFPLE1BQU0sV0FBVyxZQUFZO0FBQ3RDLFlBQU0sZ0JBQWdCLE1BQU0sT0FBTyxLQUFLO0FBQ3hDLGNBQVEsWUFBWSxPQUFPLGVBQWUsVUFBVSxVQUFRO0FBQzFELGVBQU8sY0FBYyxTQUFTLElBQUk7QUFBQSxNQUNwQyxDQUFDO0FBQUEsSUFDSDtBQUVBLFFBQUksTUFBTSxhQUFhLFFBQVE7QUFDN0IsVUFBSSxjQUFjLFdBQVcsT0FDekIsZ0JBQWdCLFNBQ2hCO0FBRUosY0FBUSxZQUFZLE9BQU8sZUFBZSxhQUFhLE1BQU07QUFDM0Q7QUFDQSxlQUFPLGVBQWUsZUFBZTtBQUFBLE1BQ3ZDLENBQUM7QUFFRCxVQUFJLE1BQU0sV0FBVyxHQUFHO0FBQUUsZUFBTyxLQUFJO0FBQUEsTUFBRztBQUFBLElBQzFDO0FBRUEsU0FBSTtBQUVKLFFBQUksTUFBTSxXQUFXLEdBQUc7QUFDdEIsYUFBTztBQUFBLElBQ1Q7QUFBQSxFQUNGO0FBRUEsV0FBUyxXQUFZLEdBQUc7QUFDdEIsdUJBQW1CLENBQUM7QUFDcEIsUUFBSSxVQUFVLFNBQVMsSUFBSSxRQUFRO0FBQUEsRUFDckM7QUFFQSxXQUFTLFlBQWEsR0FBRztBQUN2QixtQkFBZSxDQUFDO0FBSWhCLFVBQU0sT0FBTyxFQUFFLGtCQUFrQixRQUFRLE9BQU8sR0FBRyxXQUFXLE9BQzFELEVBQUUsa0JBQWtCLE9BQU8sUUFDM0IsU0FBUyxrQkFBa0IsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFNBQVMsT0FBTyxLQUFLLE1BQU07QUFFaEYsYUFBUyxTQUFTLElBQUksUUFBUTtBQUFBLEVBQ2hDO0FBRUEsV0FBUyxPQUFRLEdBQUc7QUFDbEIsdUJBQW1CLENBQUM7QUFDcEIsVUFBTSxRQUFRLEVBQUUsYUFBYTtBQUU3QixRQUFJLE1BQU0sV0FBVyxHQUFHO0FBQ3RCLHNCQUFnQixNQUFNLEtBQUs7QUFBQSxJQUM3QjtBQUVBLFFBQUksUUFBUTtBQUFBLEVBQ2Q7QUFFQSxXQUFTLFdBQVksTUFBTTtBQUN6QixRQUFJLElBQUksVUFBVSxNQUFNO0FBQ3RCLGFBQU8sRUFBRSxPQUFPO0FBQUEsUUFDZCxLQUFLO0FBQUEsUUFDTCxPQUFPLEtBQU0sSUFBSTtBQUFBLFFBQ2pCLGFBQWE7QUFBQSxRQUNiLFlBQVk7QUFBQSxRQUNaO0FBQUEsUUFDQTtBQUFBLE1BQ1IsQ0FBTztBQUFBLElBQ0g7QUFBQSxFQUNGO0FBR0EsU0FBTyxPQUFPLE9BQU8sRUFBRSxXQUFXLFNBQVEsQ0FBRTtBQUU1QyxTQUFPO0FBQUEsSUFDTDtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFFQTtBQUFBLElBQ0E7QUFBQSxFQUNKO0FBQ0E7QUNuT0EsTUFBQSxRQUFlLGdCQUFnQjtBQUFBLEVBQzdCLE1BQU07QUFBQSxFQUVOLGNBQWM7QUFBQSxFQUVkLE9BQU87QUFBQSxJQUNMLEdBQUc7QUFBQSxJQUNILEdBQUc7QUFBQSxJQUNILEdBQUc7QUFBQTtBQUFBLElBR0gsWUFFSSxDQUFFLE1BQU0sVUFBVSxLQUFNO0FBQUEsSUFFNUIsUUFBUTtBQUFBLElBQ1IsVUFBVTtBQUFBLElBQ1YsY0FBYyxDQUFFLFFBQVEsTUFBTztBQUFBLElBRS9CLFVBQVU7QUFBQSxNQUNSLE1BQU0sQ0FBRSxRQUFRLE1BQU87QUFBQSxNQUN2QixTQUFTO0FBQUEsSUFBQTtBQUFBLElBR1gsY0FBYztBQUFBLElBRWQsWUFBWSxDQUFFLE9BQU8sUUFBUSxNQUFPO0FBQUEsSUFDcEMsWUFBWSxDQUFFLE9BQU8sUUFBUSxNQUFPO0FBQUEsRUFBQTtBQUFBLEVBR3RDLE9BQU87QUFBQSxJQUNMLEdBQUc7QUFBQSxJQUNILEdBQUc7QUFBQSxFQUFBO0FBQUEsRUFHTCxNQUFPLE9BQU8sRUFBRSxPQUFPLE1BQU0sU0FBUztBQUNwQyxVQUFNLEVBQUUsTUFBQSxJQUFVLG1CQUFBO0FBRWxCLFVBQU0sUUFBUSxjQUFBO0FBRWQsVUFBTSxXQUFXLElBQUksSUFBSTtBQUN6QixVQUFNLE1BQU0sSUFBSSxLQUFLO0FBQ3JCLFVBQU0sV0FBVyxxQkFBcUIsS0FBSztBQUUzQyxVQUFNO0FBQUEsTUFDSjtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUFBLElBQ0UsUUFBUSxFQUFFLFVBQVUsTUFBTSxVQUFVLEtBQUssY0FBYyxpQkFBaUI7QUFFNUUsVUFBTSxlQUFlLG9CQUFvQixLQUFLO0FBRTlDLFVBQU0sYUFBYSxTQUFTLE1BQzFCLE9BQU8sTUFBTSxVQUFVLE1BQU0sTUFBTSxhQUM5QixZQUFZLE1BQU0sYUFBYSxNQUFNLEtBQUssTUFBTSxVQUFVLElBQUksQ0FBRSxNQUFNLFVBQVcsSUFDbEYsRUFDTDtBQUVELFVBQU0sV0FBVyxTQUFTLE1BQU0sbUJBQW1CLFdBQVcsS0FBSyxDQUFDO0FBRXBFLFVBQU0saUJBQWlCO0FBQUEsTUFBUyxNQUM5QixXQUFXLE1BQ1IsSUFBSSxVQUFRLEtBQUssSUFBSSxFQUNyQixLQUFLLElBQUk7QUFBQSxJQUFBO0FBR2QsVUFBTSxZQUFZO0FBQUEsTUFBUyxNQUN6QjtBQUFBLFFBQ0UsV0FBVyxNQUFNLE9BQU8sQ0FBQyxLQUFLLFNBQVMsTUFBTSxLQUFLLE1BQU0sQ0FBQztBQUFBLE1BQUE7QUFBQSxJQUMzRDtBQUdGLFVBQU0sZUFBZSxTQUFTLE9BQU87QUFBQSxNQUNuQyxXQUFXLFVBQVU7QUFBQSxNQUNyQixhQUFhLFdBQVcsTUFBTTtBQUFBLE1BQzlCLFVBQVUsTUFBTTtBQUFBLElBQUEsRUFDaEI7QUFFRixVQUFNLGFBQWEsU0FBUyxPQUFPO0FBQUEsTUFDakMsVUFBVTtBQUFBLE1BQ1YsTUFBTTtBQUFBLE1BQ04sT0FBTztBQUFBO0FBQUEsTUFDUCxRQUFRLE1BQU07QUFBQSxNQUNkLFNBQVMsTUFBTTtBQUFBLE1BQ2YsTUFBTSxTQUFTO0FBQUEsTUFDZixHQUFHO0FBQUEsTUFDSCxJQUFJLE1BQU0sVUFBVTtBQUFBLE1BQ3BCLFVBQVUsTUFBTSxTQUFTLFVBQVU7QUFBQSxJQUFBLEVBQ25DO0FBRUYsVUFBTSxhQUFhO0FBQUEsTUFBUyxNQUMxQixpQ0FDRyxJQUFJLFVBQVUsT0FBTyxpQkFBaUI7QUFBQSxJQUFBO0FBRzNDLFVBQU0sY0FBYztBQUFBLE1BQVMsTUFDM0IsTUFBTSxhQUFhLFFBQVEsTUFBTSxXQUFXO0FBQUEsSUFBQTtBQUc5QyxhQUFTLGNBQWUsT0FBTztBQUM3QixZQUFNLFFBQVEsV0FBVyxNQUFNLE1BQUE7QUFDL0IsWUFBTSxPQUFPLE9BQU8sQ0FBQztBQUNyQixnQkFBVSxLQUFLO0FBQUEsSUFDakI7QU
624FFQSxhQUFTLFdBQVksTUFBTTtBQUN6QixZQUFNLFFBQVEsV0FBVyxNQUFNLFFBQVEsSUFBSTtBQUMzQyxVQUFJLFVBQVUsSUFBSTtBQUNoQixzQkFBYyxLQUFLO0FBQUEsTUFDckI7QUFBQSxJQUNGO0FBRUEsYUFBUyxVQUFXLE9BQU87QUFDekIsV0FBSyxxQkFBcUIsTUFBTSxhQUFhLE9BQU8sUUFBUSxNQUFPLENBQUUsQ0FBQztBQUFBLElBQ3hFO0FBRUEsYUFBUyxVQUFXLEdBQUc7QUFFckIsUUFBRSxZQUFZLE1BQU0sUUFBUSxDQUFDO0FBQUEsSUFDL0I7QUFFQSxhQUFTLFFBQVMsR0FBRztBQUVuQixVQUFJLEVBQUUsWUFBWSxNQUFNLEVBQUUsWUFBWSxJQUFJO0FBQ3hDLGtCQUFVLENBQUM7QUFBQSxNQUNiO0FBQUEsSUFDRjtBQUVBLGFBQVMsZUFBZ0I7QUFDdkIsYUFBTyxTQUFTO0FBQUEsSUFDbEI7QUFFQSxhQUFTLGdCQUFpQixHQUFHLFVBQVU7QUFDckMsWUFBTSxRQUFRLGFBQWEsR0FBRyxVQUFVLFdBQVcsT0FBTyxZQUFZLEtBQUs7QUFDM0UsWUFBTSxZQUFZLGFBQUE7QUFFbEIsVUFBSSxjQUFjLFVBQVUsY0FBYyxNQUFNO0FBQzlDLGtCQUFVLFFBQVE7QUFBQSxNQUNwQjtBQUdBLFVBQUksVUFBVSxPQUFRO0FBSXRCLFVBQ0UsTUFBTSxhQUFhLE9BQ2YsTUFBTSxjQUFjLE1BQU0sTUFBTSxDQUFBLE1BQUssV0FBVyxNQUFNLFNBQVMsQ0FBQyxDQUFDLElBQ2pFLE1BQU0sZUFBZSxNQUFPLENBQUUsRUFDbEM7QUFFRjtBQUFBLFFBQ0UsWUFBWSxVQUFVLE9BQ2xCLFdBQVcsTUFBTSxPQUFPLEtBQUssSUFDN0I7QUFBQSxNQUFBO0FBQUEsSUFFUjtBQUVBLGFBQVMsWUFBYTtBQUNwQixhQUFPO0FBQUEsUUFDTCxFQUFFLFNBQVM7QUFBQSxVQUNULE9BQU8sQ0FBRSxNQUFNLFlBQVksZ0JBQWlCO0FBQUEsVUFDNUMsT0FBTyxNQUFNO0FBQUEsUUFBQSxDQUNkO0FBQUEsTUFBQTtBQUFBLElBRUw7QUFFQSxhQUFTLGVBQWdCO0FBQ3ZCLFVBQUksTUFBTSxTQUFTLFFBQVE7QUFDekIsZUFBTyxXQUFXLE1BQU0sV0FBVyxJQUMvQixjQUNBLFdBQVcsTUFBTTtBQUFBLFVBQ2pCLENBQUMsTUFBTSxVQUFVLE1BQU0sS0FBSyxFQUFFLE9BQU8sTUFBTSxLQUFLLEtBQUEsQ0FBTTtBQUFBLFFBQUE7QUFBQSxNQUU1RDtBQUVBLFVBQUksTUFBTSxhQUFhLFFBQVE7QUFDN0IsZUFBTyxXQUFXLE1BQU0sV0FBVyxJQUMvQixjQUNBLE1BQU0sU0FBUyxFQUFFLE9BQU8sV0FBVyxPQUFPLEtBQUssTUFBTTtBQUFBLE1BQzNEO0FBRUEsVUFBSSxNQUFNLGFBQWEsTUFBTTtBQUMzQixlQUFPLFdBQVcsTUFBTSxXQUFXLElBQy9CLFVBQUEsSUFDQSxXQUFXLE1BQU0sSUFBSSxDQUFDLE1BQU0sTUFBTSxFQUFFLE9BQU87QUFBQSxVQUMzQyxLQUFLLFVBQVU7QUFBQSxVQUNmLFdBQVcsTUFBTSxTQUFTO0FBQUEsVUFDMUIsT0FBTztBQUFBLFVBQ1AsV0FBVyxNQUFNO0FBQUEsVUFDakIsVUFBVSxNQUFNO0FBQUEsVUFDaEIsVUFBVSxNQUFNO0FBQUUsMEJBQWMsQ0FBQztBQUFBLFVBQUU7QUFBQSxRQUFBLEdBQ2xDLE1BQU0sRUFBRSxRQUFRO0FBQUEsVUFDakIsT0FBTztBQUFBLFVBQ1AsYUFBYSxLQUFLO0FBQUEsUUFBQSxDQUNuQixDQUFDLENBQUM7QUFBQSxNQUNQO0FBRUEsWUFBTSxjQUFjLE1BQU0saUJBQWlCLFNBQ3ZDLE1BQU0sZUFDTixlQUFlO0FBRW5CLGFBQU8sWUFBWSxXQUFXLElBQzFCO0FBQUEsUUFDRSxFQUFFLE9BQU87QUFBQSxVQUNQLE9BQU8sTUFBTTtBQUFBLFVBQ2IsT0FBTyxNQUFNO0FBQUEsVUFDYjtBQUFBLFFBQUEsQ0FDRDtBQUFBLE1BQUEsSUFFSCxVQUFBO0FBQUEsSUFDTjtBQUVBLGFBQVMsV0FBWTtBQUNuQixZQUFNLE9BQU87QUFBQSxRQUNYLEtBQUs7QUFBQSxRQUNMLEdBQUcsV0FBVztBQUFBLFFBQ2QsR0FBRyxhQUFhO0FBQUEsUUFDaEIsT0FBTztBQUFBLFFBQ1AsVUFBVTtBQUFBLE1BQUE7QUFHWixVQUFJLE1BQU0sYUFBYSxNQUFNO0FBQzNCLGFBQUssV0FBVztBQUFBLE1BQ2xCO0FBRUEsYUFBTyxFQUFFLFNBQVMsSUFBSTtBQUFBLElBQ3hCO0FBRUEsV0FBTyxPQUFPLE9BQU87QUFBQSxNQUNuQjtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUVBLGVBQWU7QUFBQSxRQUFTLE1BQ3RCLFNBQVMsVUFBVSxRQUNoQixtQkFBbUIsTUFBTSxZQUFZO0FBQUEsTUFBQTtBQUFBLE1BRzFDLGlCQUFpQixTQUFTLE1BQU07QUFDOUIsWUFBSSxNQUFNLGlCQUFpQixRQUFRO0FBQ2pDLGlCQUFPLE1BQU0sYUFBYSxhQUFhLEtBQUs7QUFBQSxRQUM5QztBQUVBLGNBQU0sTUFBTSxNQUFNO0FBQ2xCLGVBQU8sR0FBSSxXQUFXLE1BQU0sTUFBTyxHQUFJLFFBQVEsU0FBUyxRQUFRLE1BQU0sRUFBRyxLQUFNLFVBQVUsS0FBTTtBQUFBLE1BQ2pHLENBQUM7QUFBQSxNQUVELGlCQUFpQixNQUFNLFdBQVcsTUFBTTtBQUFBLE1BQ3hDLFlBQVksTUFBTTtBQUNoQixjQUFNLE9BQU87QUFBQSxVQUNYLEtBQUssTUFBTTtBQUFBLFVBQ1gsT0FBTztBQUFBLFVBQ1AsVUFBVSxNQUFNO0FBQUEsUUFBQTtBQUdsQixZQUFJLE1BQU0sU0FBUyxVQUFVLE1BQU07QUFDakMsaUJBQU8sT0FBTyxNQUFNLEVBQUUsWUFBWSxhQUFhLFdBQVcsU0FBUztBQUFBLFFBQ3JFO0FBRUEsZUFBTyxFQUFFLE9BQU8sTUFBTSxDQUFFLFNBQUEsQ0FBVyxFQUFFLE9BQU8sYUFBQSxDQUFjLENBQUM7QUFBQSxNQUM3RDtBQUFBLElBQUEsQ0FDRDtBQUdELFdBQU8sT0FBTyxPQUFPO0FBQUEsTUFDbkI7QUFBQSxNQUNBO0FBQUEsTUFDQSxrQkFBa0IsTUFBTSxTQUFTO0FBQUE7QUFBQSxJQUFBLENBQ2xDO0FBRUQsZUFBVyxPQUFPLFlBQVksTUFBTSxTQUFTLEtBQUs7QUFFbEQsV0FBTyxTQUFTLEtBQUs7QUFBQSxFQUN2QjtBQUNGLENBQUM7IiwieF9nb29nbGVfaWdub3JlTGlzdCI6WzAsMSwyLDMsNCw1LDZdfQ==

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.