@sbb-esta/lyne-elements 1.9.0 → 1.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/accordion/accordion.d.ts +5 -5
- package/accordion/accordion.d.ts.map +1 -1
- package/accordion.js +17 -17
- package/action-group/action-group.d.ts +1 -1
- package/action-group/action-group.d.ts.map +1 -1
- package/action-group.js +3 -3
- package/alert/alert/alert.d.ts +1 -1
- package/alert/alert/alert.d.ts.map +1 -1
- package/alert/alert.js +3 -3
- package/autocomplete/autocomplete-base-element.d.ts +1 -1
- package/autocomplete/autocomplete-base-element.d.ts.map +1 -1
- package/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.d.ts +1 -1
- package/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.d.ts.map +1 -1
- package/autocomplete-grid/autocomplete-grid-option.js +1 -1
- package/autocomplete-grid/autocomplete-grid.js +18 -18
- package/autocomplete.js +9 -9
- package/button/button.js +9 -9
- package/button/common.js +5 -5
- package/button/mini-button/mini-button.d.ts.map +1 -1
- package/button/mini-button.js +17 -15
- package/button/secondary-button.js +6 -6
- package/button/tertiary-button.js +13 -13
- package/button/transparent-button.js +8 -8
- package/calendar/calendar.d.ts +2 -2
- package/calendar/calendar.d.ts.map +1 -1
- package/calendar.js +5 -4
- package/clock/clock.d.ts +2 -2
- package/clock/clock.d.ts.map +1 -1
- package/core/a11y/focus-visible-within-controller.d.ts +1 -1
- package/core/a11y/focus-visible-within-controller.d.ts.map +1 -1
- package/core/a11y/input-modality-detector.d.ts +2 -2
- package/core/a11y/input-modality-detector.d.ts.map +1 -1
- package/core/a11y.js +3 -3
- package/core/base-elements/action-base-element.d.ts +1 -0
- package/core/base-elements/action-base-element.d.ts.map +1 -1
- package/core/base-elements/button-base-element.d.ts +1 -1
- package/core/base-elements/button-base-element.d.ts.map +1 -1
- package/core/base-elements/link-base-element.d.ts.map +1 -1
- package/core/base-elements.js +47 -45
- package/core/controllers/slot-state-controller.d.ts +1 -1
- package/core/controllers/slot-state-controller.d.ts.map +1 -1
- package/core/mixins/disabled-mixin.d.ts +8 -0
- package/core/mixins/disabled-mixin.d.ts.map +1 -1
- package/core/mixins.js +97 -89
- package/core/styles/mixins/panel.scss +0 -2
- package/core/styles/mixins/table.scss +11 -0
- package/core/styles/mixins/typo.scss +0 -30
- package/core/styles/node_modules_@sbb-esta_lyne-design-tokens_dist_scss_sbb-variables.scss +1 -0
- package/core/styles/node_modules_@sbb-esta_lyne-design-tokens_dist_scss_sbb-variables_css--mixin.scss +2 -1
- package/core/styles/table.scss +6 -1
- package/core.css +2 -14
- package/custom-elements.json +370 -298
- package/datepicker/datepicker/datepicker.d.ts.map +1 -1
- package/datepicker/datepicker-toggle/datepicker-toggle.d.ts +2 -0
- package/datepicker/datepicker-toggle/datepicker-toggle.d.ts.map +1 -1
- package/datepicker/datepicker-toggle.js +56 -46
- package/datepicker/datepicker.js +1 -0
- package/development/accordion/accordion.d.ts +5 -5
- package/development/accordion/accordion.d.ts.map +1 -1
- package/development/accordion.js +25 -38
- package/development/action-group/action-group.d.ts +1 -1
- package/development/action-group/action-group.d.ts.map +1 -1
- package/development/action-group.js +8 -21
- package/development/alert/alert/alert.d.ts +1 -1
- package/development/alert/alert/alert.d.ts.map +1 -1
- package/development/alert/alert-group.js +2 -15
- package/development/alert/alert.js +6 -19
- package/development/autocomplete/autocomplete-base-element.d.ts +1 -1
- package/development/autocomplete/autocomplete-base-element.d.ts.map +1 -1
- package/development/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.d.ts +1 -1
- package/development/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.d.ts.map +1 -1
- package/development/autocomplete-grid/autocomplete-grid-button.js +2 -15
- package/development/autocomplete-grid/autocomplete-grid-cell.js +2 -15
- package/development/autocomplete-grid/autocomplete-grid-option.js +4 -17
- package/development/autocomplete-grid/autocomplete-grid-row.js +2 -15
- package/development/autocomplete-grid/autocomplete-grid.js +6 -6
- package/development/autocomplete.js +7 -20
- package/development/breadcrumb/breadcrumb-group.js +2 -15
- package/development/breadcrumb/breadcrumb.js +2 -15
- package/development/button/button.js +3 -3
- package/development/button/common.js +2 -17
- package/development/button/mini-button/mini-button.d.ts.map +1 -1
- package/development/button/mini-button-group.js +2 -15
- package/development/button/mini-button.js +6 -17
- package/development/button/secondary-button.js +3 -3
- package/development/button/tertiary-button.js +3 -3
- package/development/button/transparent-button.js +3 -3
- package/development/calendar/calendar.d.ts +2 -2
- package/development/calendar/calendar.d.ts.map +1 -1
- package/development/calendar.js +7 -19
- package/development/card/card-badge.js +2 -15
- package/development/card/card.js +2 -15
- package/development/card/common.js +2 -15
- package/development/checkbox/checkbox-group.js +2 -15
- package/development/checkbox/checkbox.js +2 -15
- package/development/checkbox/common.js +1 -14
- package/development/chip.js +2 -15
- package/development/clock/clock.d.ts +2 -2
- package/development/clock/clock.d.ts.map +1 -1
- package/development/clock.js +2 -15
- package/development/container/container.js +1 -14
- package/development/container/sticky-bar.js +2 -15
- package/development/core/a11y/focus-visible-within-controller.d.ts +1 -1
- package/development/core/a11y/focus-visible-within-controller.d.ts.map +1 -1
- package/development/core/a11y/input-modality-detector.d.ts +2 -2
- package/development/core/a11y/input-modality-detector.d.ts.map +1 -1
- package/development/core/a11y.js +6 -6
- package/development/core/base-elements/action-base-element.d.ts +1 -0
- package/development/core/base-elements/action-base-element.d.ts.map +1 -1
- package/development/core/base-elements/button-base-element.d.ts +1 -1
- package/development/core/base-elements/button-base-element.d.ts.map +1 -1
- package/development/core/base-elements/link-base-element.d.ts.map +1 -1
- package/development/core/base-elements.js +11 -2
- package/development/core/controllers/slot-state-controller.d.ts +1 -1
- package/development/core/controllers/slot-state-controller.d.ts.map +1 -1
- package/development/core/controllers.js +1 -1
- package/development/core/mixins/disabled-mixin.d.ts +8 -0
- package/development/core/mixins/disabled-mixin.d.ts.map +1 -1
- package/development/core/mixins.js +24 -15
- package/development/datepicker/datepicker/datepicker.d.ts.map +1 -1
- package/development/datepicker/datepicker-next-day.js +2 -15
- package/development/datepicker/datepicker-previous-day.js +2 -15
- package/development/datepicker/datepicker-toggle/datepicker-toggle.d.ts +2 -0
- package/development/datepicker/datepicker-toggle/datepicker-toggle.d.ts.map +1 -1
- package/development/datepicker/datepicker-toggle.js +20 -22
- package/development/datepicker/datepicker.js +3 -15
- package/development/dialog/dialog-actions.js +2 -15
- package/development/dialog/dialog-content.js +2 -15
- package/development/dialog/dialog-title.js +2 -15
- package/development/dialog/dialog.js +3 -16
- package/development/divider.js +2 -15
- package/development/expansion-panel/expansion-panel-content.js +2 -15
- package/development/expansion-panel/expansion-panel-header.js +5 -17
- package/development/expansion-panel/expansion-panel.js +2 -15
- package/development/file-selector/file-selector.d.ts +4 -4
- package/development/file-selector/file-selector.d.ts.map +1 -1
- package/development/file-selector.js +2 -17
- package/development/flip-card/flip-card-details.js +2 -15
- package/development/flip-card/flip-card-summary.js +2 -15
- package/development/flip-card/flip-card.js +2 -15
- package/development/footer.js +2 -15
- package/development/form-error.js +2 -15
- package/development/form-field/form-field-clear.js +2 -15
- package/development/form-field/form-field.js +1 -14
- package/development/header/common.js +2 -15
- package/development/header/header.js +2 -15
- package/development/icon/icon.d.ts +6 -0
- package/development/icon/icon.d.ts.map +1 -1
- package/development/icon.js +10 -15
- package/development/image.js +4 -17
- package/development/journey-header.js +2 -15
- package/development/lead-container.js +2 -15
- package/development/link/block-link-button.js +3 -3
- package/development/link/common.js +4 -43
- package/development/link/link-button.js +3 -3
- package/development/link-list/common.js +2 -15
- package/development/link-list/link-list-anchor.js +2 -15
- package/development/link-list/link-list.js +2 -15
- package/development/loading-indicator.js +2 -15
- package/development/logo.js +2 -15
- package/development/map-container.js +2 -15
- package/development/menu/common.js +2 -15
- package/development/menu/menu/menu.d.ts.map +1 -1
- package/development/menu/menu-button.js +3 -3
- package/development/menu/menu.js +3 -18
- package/development/message.js +2 -15
- package/development/navigation/common.js +2 -17
- package/development/navigation/navigation-list.js +2 -15
- package/development/navigation/navigation-marker.js +2 -17
- package/development/navigation/navigation-section.js +2 -19
- package/development/navigation/navigation.js +2 -15
- package/development/notification.js +2 -15
- package/development/option/optgroup/optgroup-base-element.d.ts +2 -2
- package/development/option/optgroup/optgroup-base-element.d.ts.map +1 -1
- package/development/option/optgroup.js +2 -15
- package/development/option/option/option-base-element.d.ts +14 -4
- package/development/option/option/option-base-element.d.ts.map +1 -1
- package/development/option/option.js +15 -21
- package/development/overlay/overlay-base-element.d.ts +1 -1
- package/development/overlay/overlay-base-element.d.ts.map +1 -1
- package/development/overlay.js +2 -15
- package/development/popover/popover-trigger.js +4 -17
- package/development/popover/popover.js +2 -15
- package/development/radio-button/common.js +2 -15
- package/development/radio-button/radio-button-group/radio-button-group.d.ts +1 -1
- package/development/radio-button/radio-button-group/radio-button-group.d.ts.map +1 -1
- package/development/radio-button/radio-button-group.js +9 -22
- package/development/radio-button/radio-button.js +2 -15
- package/development/screen-reader-only.js +2 -15
- package/development/select/select.d.ts.map +1 -1
- package/development/select.js +30 -43
- package/development/selection-expansion-panel/selection-expansion-panel.d.ts +12 -3
- package/development/selection-expansion-panel/selection-expansion-panel.d.ts.map +1 -1
- package/development/selection-expansion-panel.js +38 -18
- package/development/signet.js +2 -15
- package/development/skiplink-list.js +2 -15
- package/development/slider/slider.d.ts.map +1 -1
- package/development/slider.js +10 -16
- package/development/status.js +2 -15
- package/development/stepper/step-label/step-label.d.ts +6 -6
- package/development/stepper/step-label/step-label.d.ts.map +1 -1
- package/development/stepper/step-label.js +31 -44
- package/development/stepper/step.js +2 -15
- package/development/stepper/stepper/stepper.d.ts +3 -3
- package/development/stepper/stepper/stepper.d.ts.map +1 -1
- package/development/stepper/stepper.js +2 -15
- package/development/table/table-wrapper.js +2 -15
- package/development/tabs/tab-group/tab-group.d.ts +4 -4
- package/development/tabs/tab-group/tab-group.d.ts.map +1 -1
- package/development/tabs/tab-group.js +22 -35
- package/development/tabs/tab-label.js +2 -19
- package/development/tabs/tab.js +1 -14
- package/development/tag/tag-group.js +2 -15
- package/development/tag/tag.js +4 -17
- package/development/teaser-hero.js +3 -23
- package/development/teaser-product/common.js +2 -15
- package/development/teaser-product/teaser-product.js +3 -16
- package/development/teaser.js +2 -15
- package/development/time-input.js +2 -15
- package/development/timetable-occupancy-icon.js +2 -15
- package/development/timetable-occupancy.js +2 -15
- package/development/title.js +3 -41
- package/development/toast.js +2 -17
- package/development/toggle/toggle/toggle.d.ts +2 -2
- package/development/toggle/toggle/toggle.d.ts.map +1 -1
- package/development/toggle/toggle-option.js +2 -15
- package/development/toggle/toggle.js +23 -36
- package/development/toggle-check.js +1 -14
- package/development/train/train-blocked-passage.js +2 -15
- package/development/train/train-formation.js +2 -15
- package/development/train/train-wagon.js +2 -17
- package/development/train/train.js +2 -15
- package/development/visual-checkbox.js +2 -15
- package/dialog/dialog.js +1 -1
- package/expansion-panel/expansion-panel-header.js +5 -5
- package/file-selector/file-selector.d.ts +4 -4
- package/file-selector/file-selector.d.ts.map +1 -1
- package/file-selector.js +1 -1
- package/icon/icon.d.ts +6 -0
- package/icon/icon.d.ts.map +1 -1
- package/icon.js +27 -19
- package/image.js +2 -2
- package/link/block-link-button.js +10 -10
- package/link/link-button.js +4 -4
- package/lists.css +0 -13
- package/menu/menu/menu.d.ts.map +1 -1
- package/menu/menu-button.js +13 -13
- package/menu/menu.js +7 -9
- package/navigation/common.js +1 -1
- package/navigation/navigation-marker.js +1 -1
- package/navigation/navigation-section.js +1 -1
- package/option/optgroup/optgroup-base-element.d.ts +2 -2
- package/option/optgroup/optgroup-base-element.d.ts.map +1 -1
- package/option/option/option-base-element.d.ts +14 -4
- package/option/option/option-base-element.d.ts.map +1 -1
- package/option/option.js +32 -25
- package/overlay/overlay-base-element.d.ts +1 -1
- package/overlay/overlay-base-element.d.ts.map +1 -1
- package/package.json +1 -1
- package/popover/popover-trigger.js +1 -1
- package/radio-button/radio-button-group/radio-button-group.d.ts +1 -1
- package/radio-button/radio-button-group/radio-button-group.d.ts.map +1 -1
- package/radio-button/radio-button-group.js +5 -5
- package/select/select.d.ts.map +1 -1
- package/select.js +23 -23
- package/selection-expansion-panel/selection-expansion-panel.d.ts +12 -3
- package/selection-expansion-panel/selection-expansion-panel.d.ts.map +1 -1
- package/selection-expansion-panel.js +70 -49
- package/slider/slider.d.ts.map +1 -1
- package/slider.js +2 -2
- package/standard-theme.css +35 -23
- package/stepper/step-label/step-label.d.ts +6 -6
- package/stepper/step-label/step-label.d.ts.map +1 -1
- package/stepper/step-label.js +20 -20
- package/stepper/stepper/stepper.d.ts +3 -3
- package/stepper/stepper/stepper.d.ts.map +1 -1
- package/tabs/tab-group/tab-group.d.ts +4 -4
- package/tabs/tab-group/tab-group.d.ts.map +1 -1
- package/tabs/tab-group.js +15 -15
- package/tabs/tab-label.js +12 -12
- package/tag/tag.js +19 -19
- package/teaser-hero.js +13 -13
- package/teaser-product/teaser-product.js +5 -5
- package/teaser.js +15 -15
- package/title.js +23 -23
- package/toast.js +4 -4
- package/toggle/toggle/toggle.d.ts +2 -2
- package/toggle/toggle/toggle.d.ts.map +1 -1
- package/toggle/toggle.js +10 -10
- package/train/train-wagon.js +7 -7
- package/typography.css +0 -13
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { customElement } from "lit/decorators.js";
|
|
2
2
|
import { SbbButtonBaseElement } from "../core/base-elements.js";
|
|
3
|
-
import {
|
|
3
|
+
import { SbbFocusableDisabledActionMixin } from "../core/mixins.js";
|
|
4
4
|
import { SbbButtonCommonElementMixin, buttonCommonStyle, buttonTertiaryStyle } from "./common.js";
|
|
5
5
|
var __defProp = Object.defineProperty;
|
|
6
6
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
@@ -13,7 +13,7 @@ var __decorateClass = (decorators, target, key, kind) => {
|
|
|
13
13
|
return result;
|
|
14
14
|
};
|
|
15
15
|
let SbbTertiaryButtonElement = class extends SbbButtonCommonElementMixin(
|
|
16
|
-
|
|
16
|
+
SbbFocusableDisabledActionMixin(SbbButtonBaseElement)
|
|
17
17
|
) {
|
|
18
18
|
};
|
|
19
19
|
SbbTertiaryButtonElement.styles = [buttonCommonStyle, buttonTertiaryStyle];
|
|
@@ -23,4 +23,4 @@ SbbTertiaryButtonElement = __decorateClass([
|
|
|
23
23
|
export {
|
|
24
24
|
SbbTertiaryButtonElement
|
|
25
25
|
};
|
|
26
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
26
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVydGlhcnktYnV0dG9uLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZWxlbWVudHMvYnV0dG9uL3RlcnRpYXJ5LWJ1dHRvbi90ZXJ0aWFyeS1idXR0b24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDU1NSZXN1bHRHcm91cCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5pbXBvcnQgeyBTYmJCdXR0b25CYXNlRWxlbWVudCB9IGZyb20gJy4uLy4uL2NvcmUvYmFzZS1lbGVtZW50cy5qcyc7XG5pbXBvcnQgeyBTYmJGb2N1c2FibGVEaXNhYmxlZEFjdGlvbk1peGluIH0gZnJvbSAnLi4vLi4vY29yZS9taXhpbnMuanMnO1xuaW1wb3J0IHsgYnV0dG9uQ29tbW9uU3R5bGUsIGJ1dHRvblRlcnRpYXJ5U3R5bGUsIFNiYkJ1dHRvbkNvbW1vbkVsZW1lbnRNaXhpbiB9IGZyb20gJy4uL2NvbW1vbi5qcyc7XG5cbi8qKlxuICogSXQgZGlzcGxheXMgYSBidXR0b24gZW5oYW5jZWQgd2l0aCB0aGUgU0JCIERlc2lnbiBpbiB0aGUgJ3RlcnRpYXJ5JyB2YXJpYW50LlxuICpcbiAqIEBzbG90IC0gVXNlIHRoZSB1bm5hbWVkIHNsb3QgdG8gYWRkIGNvbnRlbnQgdG8gdGhlIHRlcnRpYXJ5LWJ1dHRvbi5cbiAqIEBzbG90IGljb24gLSBTbG90IHVzZWQgdG8gZGlzcGxheSB0aGUgaWNvbiwgaWYgb25lIGlzIHNldFxuICovXG5AY3VzdG9tRWxlbWVudCgnc2JiLXRlcnRpYXJ5LWJ1dHRvbicpXG5leHBvcnQgY2xhc3MgU2JiVGVydGlhcnlCdXR0b25FbGVtZW50IGV4dGVuZHMgU2JiQnV0dG9uQ29tbW9uRWxlbWVudE1peGluKFxuICBTYmJGb2N1c2FibGVEaXNhYmxlZEFjdGlvbk1peGluKFNiYkJ1dHRvbkJhc2VFbGVtZW50KSxcbikge1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHN0eWxlczogQ1NTUmVzdWx0R3JvdXAgPSBbYnV0dG9uQ29tbW9uU3R5bGUsIGJ1dHRvblRlcnRpYXJ5U3R5bGVdO1xufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgICAnc2JiLXRlcnRpYXJ5LWJ1dHRvbic6IFNiYlRlcnRpYXJ5QnV0dG9uRWxlbWVudDtcbiAgfVxufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBY08sSUFBTSwyQkFBTixjQUF1QztBQUFBLEVBQzVDLGdDQUFnQyxvQkFBb0I7QUFDdEQsRUFBRTtBQUVGO0FBSmEseUJBR1ksU0FBeUIsQ0FBQyxtQkFBbUIsbUJBQW1CO0FBSDVFLDJCQUFOLGdCQUFBO0FBQUEsRUFETixjQUFjLHFCQUFxQjtBQUFBLEdBQ3ZCLHdCQUFBOyJ9
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { customElement } from "lit/decorators.js";
|
|
2
2
|
import { SbbButtonBaseElement } from "../core/base-elements.js";
|
|
3
|
-
import {
|
|
3
|
+
import { SbbFocusableDisabledActionMixin } from "../core/mixins.js";
|
|
4
4
|
import { SbbButtonCommonElementMixin, buttonCommonStyle, buttonTransparentStyle } from "./common.js";
|
|
5
5
|
var __defProp = Object.defineProperty;
|
|
6
6
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
@@ -13,7 +13,7 @@ var __decorateClass = (decorators, target, key, kind) => {
|
|
|
13
13
|
return result;
|
|
14
14
|
};
|
|
15
15
|
let SbbTransparentButtonElement = class extends SbbButtonCommonElementMixin(
|
|
16
|
-
|
|
16
|
+
SbbFocusableDisabledActionMixin(SbbButtonBaseElement)
|
|
17
17
|
) {
|
|
18
18
|
};
|
|
19
19
|
SbbTransparentButtonElement.styles = [buttonCommonStyle, buttonTransparentStyle];
|
|
@@ -23,4 +23,4 @@ SbbTransparentButtonElement = __decorateClass([
|
|
|
23
23
|
export {
|
|
24
24
|
SbbTransparentButtonElement
|
|
25
25
|
};
|
|
26
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
26
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNwYXJlbnQtYnV0dG9uLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZWxlbWVudHMvYnV0dG9uL3RyYW5zcGFyZW50LWJ1dHRvbi90cmFuc3BhcmVudC1idXR0b24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDU1NSZXN1bHRHcm91cCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5pbXBvcnQgeyBTYmJCdXR0b25CYXNlRWxlbWVudCB9IGZyb20gJy4uLy4uL2NvcmUvYmFzZS1lbGVtZW50cy5qcyc7XG5pbXBvcnQgeyBTYmJGb2N1c2FibGVEaXNhYmxlZEFjdGlvbk1peGluIH0gZnJvbSAnLi4vLi4vY29yZS9taXhpbnMuanMnO1xuaW1wb3J0IHtcbiAgYnV0dG9uQ29tbW9uU3R5bGUsXG4gIGJ1dHRvblRyYW5zcGFyZW50U3R5bGUsXG4gIFNiYkJ1dHRvbkNvbW1vbkVsZW1lbnRNaXhpbixcbn0gZnJvbSAnLi4vY29tbW9uLmpzJztcblxuLyoqXG4gKiBJdCBkaXNwbGF5cyBhIGJ1dHRvbiBlbmhhbmNlZCB3aXRoIHRoZSBTQkIgRGVzaWduIGluIHRoZSAndHJhbnNwYXJlbnQnIHZhcmlhbnQuXG4gKlxuICogQHNsb3QgLSBVc2UgdGhlIHVubmFtZWQgc2xvdCB0byBhZGQgY29udGVudCB0byB0aGUgdHJhbnNwYXJlbnQtYnV0dG9uLlxuICogQHNsb3QgaWNvbiAtIFNsb3QgdXNlZCB0byBkaXNwbGF5IHRoZSBpY29uLCBpZiBvbmUgaXMgc2V0XG4gKi9cbkBjdXN0b21FbGVtZW50KCdzYmItdHJhbnNwYXJlbnQtYnV0dG9uJylcbmV4cG9ydCBjbGFzcyBTYmJUcmFuc3BhcmVudEJ1dHRvbkVsZW1lbnQgZXh0ZW5kcyBTYmJCdXR0b25Db21tb25FbGVtZW50TWl4aW4oXG4gIFNiYkZvY3VzYWJsZURpc2FibGVkQWN0aW9uTWl4aW4oU2JiQnV0dG9uQmFzZUVsZW1lbnQpLFxuKSB7XG4gIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IFtidXR0b25Db21tb25TdHlsZSwgYnV0dG9uVHJhbnNwYXJlbnRTdHlsZV07XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuICAgICdzYmItdHJhbnNwYXJlbnQtYnV0dG9uJzogU2JiVHJhbnNwYXJlbnRCdXR0b25FbGVtZW50O1xuICB9XG59XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUFrQk8sSUFBTSw4QkFBTixjQUEwQztBQUFBLEVBQy9DLGdDQUFnQyxvQkFBb0I7QUFDdEQsRUFBRTtBQUVGO0FBSmEsNEJBR1ksU0FBeUIsQ0FBQyxtQkFBbUIsc0JBQXNCO0FBSC9FLDhCQUFOLGdCQUFBO0FBQUEsRUFETixjQUFjLHdCQUF3QjtBQUFBLEdBQzFCLDJCQUFBOyJ9
|
|
@@ -87,7 +87,7 @@ export declare class SbbCalendarElement<T = Date> extends SbbCalendarElement_bas
|
|
|
87
87
|
private _abort;
|
|
88
88
|
private _language;
|
|
89
89
|
constructor();
|
|
90
|
-
private
|
|
90
|
+
private _dateFilter;
|
|
91
91
|
/** Resets the active month according to the new state of the calendar. */
|
|
92
92
|
resetPosition(): void;
|
|
93
93
|
connectedCallback(): void;
|
|
@@ -206,7 +206,7 @@ export declare class SbbCalendarElement<T = Date> extends SbbCalendarElement_bas
|
|
|
206
206
|
private _createYearTable;
|
|
207
207
|
/** Select the year and change the view to month selection. */
|
|
208
208
|
private _onYearSelection;
|
|
209
|
-
private
|
|
209
|
+
private _getView;
|
|
210
210
|
private _tableAnimationEnd;
|
|
211
211
|
private _startTableTransition;
|
|
212
212
|
protected render(): TemplateResult;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"calendar.d.ts","sourceRoot":"","sources":["../../../../src/elements/calendar/calendar.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"calendar.d.ts","sourceRoot":"","sources":["../../../../src/elements/calendar/calendar.ts"],"names":[],"mappings":"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"}
|
package/development/calendar.js
CHANGED
|
@@ -12,20 +12,7 @@ import { SbbHydrationMixin } from "./core/mixins.js";
|
|
|
12
12
|
import "./button/secondary-button.js";
|
|
13
13
|
import "./icon.js";
|
|
14
14
|
import "./screen-reader-only.js";
|
|
15
|
-
const style = css`/**
|
|
16
|
-
* Better font rendering (on OS X)
|
|
17
|
-
* http://maximilianhoffmann.com/posts/better-font-rendering-on-osx
|
|
18
|
-
*
|
|
19
|
-
* Usage:
|
|
20
|
-
*
|
|
21
|
-
* .var_dark_on_light {
|
|
22
|
-
* @include font-smoothing;
|
|
23
|
-
* }
|
|
24
|
-
* .var_light_on_dark {
|
|
25
|
-
* @include font-smoothing-reset;
|
|
26
|
-
* }
|
|
27
|
-
*/
|
|
28
|
-
/** This mixin can be used to avoid spacing problems by inserting an invisible space as pseudo element. */
|
|
15
|
+
const style = css`/** This mixin can be used to avoid spacing problems by inserting an invisible space as pseudo element. */
|
|
29
16
|
/*
|
|
30
17
|
* SBB table mixin
|
|
31
18
|
* Notes:
|
|
@@ -420,8 +407,9 @@ let SbbCalendarElement = class extends SbbHydrationMixin(LitElement) {
|
|
|
420
407
|
this.shadowRoot.querySelectorAll(".sbb-calendar__cell") ?? []
|
|
421
408
|
);
|
|
422
409
|
}
|
|
423
|
-
|
|
424
|
-
|
|
410
|
+
_dateFilter(date) {
|
|
411
|
+
var _a;
|
|
412
|
+
return ((_a = this.dateFilter) == null ? void 0 : _a.call(this, date)) ?? true;
|
|
425
413
|
}
|
|
426
414
|
/** Resets the active month according to the new state of the calendar. */
|
|
427
415
|
resetPosition() {
|
|
@@ -1270,7 +1258,7 @@ let SbbCalendarElement = class extends SbbHydrationMixin(LitElement) {
|
|
|
1270
1258
|
);
|
|
1271
1259
|
this._startTableTransition();
|
|
1272
1260
|
}
|
|
1273
|
-
|
|
1261
|
+
_getView() {
|
|
1274
1262
|
if (isServer || this.hydrationRequired) {
|
|
1275
1263
|
return html`${nothing}`;
|
|
1276
1264
|
}
|
|
@@ -1300,7 +1288,7 @@ let SbbCalendarElement = class extends SbbHydrationMixin(LitElement) {
|
|
|
1300
1288
|
(_b = (_a = this.shadowRoot) == null ? void 0 : _a.querySelectorAll("table")) == null ? void 0 : _b.forEach((e) => e.classList.toggle("sbb-calendar__table-hide"));
|
|
1301
1289
|
}
|
|
1302
1290
|
render() {
|
|
1303
|
-
return html`<div class="sbb-calendar__wrapper">${this._getView}</div>`;
|
|
1291
|
+
return html`<div class="sbb-calendar__wrapper">${this._getView()}</div>`;
|
|
1304
1292
|
}
|
|
1305
1293
|
};
|
|
1306
1294
|
SbbCalendarElement.styles = style;
|
|
@@ -1349,4 +1337,4 @@ SbbCalendarElement = __decorateClass([
|
|
|
1349
1337
|
export {
|
|
1350
1338
|
SbbCalendarElement
|
|
1351
1339
|
};
|
|
1352
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lbGVtZW50cy9jYWxlbmRhci9jYWxlbmRhci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICB0eXBlIENTU1Jlc3VsdEdyb3VwLFxuICBodG1sLFxuICBpc1NlcnZlcixcbiAgTGl0RWxlbWVudCxcbiAgbm90aGluZyxcbiAgdHlwZSBQcm9wZXJ0eVZhbHVlcyxcbiAgdHlwZSBUZW1wbGF0ZVJlc3VsdCxcbn0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGNsYXNzTWFwIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvY2xhc3MtbWFwLmpzJztcblxuaW1wb3J0IHsgaXNBcnJvd0tleU9yUGFnZUtleXNQcmVzc2VkLCBzYmJJbnB1dE1vZGFsaXR5RGV0ZWN0b3IgfSBmcm9tICcuLi9jb3JlL2ExMXkuanMnO1xuaW1wb3J0IHsgcmVhZENvbmZpZyB9IGZyb20gJy4uL2NvcmUvY29uZmlnLmpzJztcbmltcG9ydCB7IFNiYkNvbm5lY3RlZEFib3J0Q29udHJvbGxlciwgU2JiTGFuZ3VhZ2VDb250cm9sbGVyIH0gZnJvbSAnLi4vY29yZS9jb250cm9sbGVycy5qcyc7XG5pbXBvcnQgdHlwZSB7IERhdGVBZGFwdGVyIH0gZnJvbSAnLi4vY29yZS9kYXRldGltZS5qcyc7XG5pbXBvcnQge1xuICBEQVlTX1BFUl9ST1csXG4gIGRlZmF1bHREYXRlQWRhcHRlcixcbiAgTU9OVEhTX1BFUl9ST1csXG4gIFlFQVJTX1BFUl9QQUdFLFxuICBZRUFSU19QRVJfUk9XLFxufSBmcm9tICcuLi9jb3JlL2RhdGV0aW1lLmpzJztcbmltcG9ydCB7IGlzQnJlYWtwb2ludCB9IGZyb20gJy4uL2NvcmUvZG9tLmpzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL2NvcmUvZXZlbnRpbmcuanMnO1xuaW1wb3J0IHtcbiAgaTE4bkNhbGVuZGFyRGF0ZVNlbGVjdGlvbixcbiAgaTE4bk5leHRNb250aCxcbiAgaTE4bk5leHRZZWFyLFxuICBpMThuTmV4dFllYXJSYW5nZSxcbiAgaTE4blByZXZpb3VzTW9udGgsXG4gIGkxOG5QcmV2aW91c1llYXIsXG4gIGkxOG5QcmV2aW91c1llYXJSYW5nZSxcbiAgaTE4blllYXJNb250aFNlbGVjdGlvbixcbn0gZnJvbSAnLi4vY29yZS9pMThuLmpzJztcbmltcG9ydCB0eXBlIHsgU2JiRGF0ZUxpa2UgfSBmcm9tICcuLi9jb3JlL2ludGVyZmFjZXMuanMnO1xuaW1wb3J0IHsgU2JiSHlkcmF0aW9uTWl4aW4gfSBmcm9tICcuLi9jb3JlL21peGlucy5qcyc7XG5cbmltcG9ydCBzdHlsZSBmcm9tICcuL2NhbGVuZGFyLnNjc3M/bGl0JmlubGluZSc7XG5cbmltcG9ydCAnLi4vYnV0dG9uL3NlY29uZGFyeS1idXR0b24uanMnO1xuaW1wb3J0ICcuLi9pY29uLmpzJztcbmltcG9ydCAnLi4vc2NyZWVuLXJlYWRlci1vbmx5LmpzJztcblxuLyoqXG4gKiBJbiBrZXlib2FyZCBuYXZpZ2F0aW9uLCB0aGUgY2VsbCdzIGluZGV4IGFuZCB0aGUgZWxlbWVudCdzIGluZGV4IGluIGl0cyBtb250aCAvIHllYXIgYmF0Y2ggbXVzdCBiZSBkaXN0aW5ndWlzaGVkO1xuICogdGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgbmF2aWdhdGlvbiBpbiB0aGUgdmVydGljYWwgZGlyZWN0aW9uIHVzaW5nIHNvbWUga2V5cyBpcyByZXN0cmljdGVkIHRvIGEgc2luZ2xlIG1vbnRoIGZvciBkYXlzLFxuICogYW5kIHRvIGEgc2luZ2xlIHJhbmdlIG9mIDI0IHllYXJzIGZvciB5ZWFycy4gV2hpbGUgdGhlIGxhdHRlciBpcyBlYXN5IHRvIHVuZGVyc3RhbmQsIHRoZSBjZWxsJ3MgaW5kZXggaXMgdGhlIGluZGV4XG4gKiBvZiB0aGUgZWxlbWVudCBpbiB0aGUgYXJyYXkgb2YgYWxsIHRoZSByZW5kZXJlZCBjZWxscy4gSW4gbm9uLXdpZGUgbW9kZSwgdGhlcmUncyBubyBpc3N1ZSBiZWNhdXNlIHRoZSBlbGVtZW50IGluZGV4XG4gKiBpcyBiYXNpY2FsbHkgdGhlIGNlbGwncyBpbmRleCBwbHVzIDEgKGVsZW1lbnQgd2l0aCBpbmRleCAwIGRpc3BsYXlzIHRoZSAxc3Qgb2YgbW9udGgsIGVsZW1lbnQgd2l0aCBpbmRleCAxIGRpc3BsYXlzIHRoZSAybmQgYW5kIHNvIG9uKS5cbiAqIEluIHdpZGUgbW9kZSwgdGhlIGNlbGwncyBpbmRleCBjYW4gZ28gZnJvbSAwIHRvIDQ3IGZvciB5ZWFycyAodHdvIGJhdGNoZXMgb2YgMjQgeWVhcnMpLCBhbmQgZnJvbSAwIHRvIGEgbWF4aW11bSBvZiA2MSBmb3IgZGF5c1xuICogKHR3byBjb25zZWN1dGl2ZSBtb250aHMgb2YgMzEgZGF5cywgYXMgSnVseS1BdWd1c3Qgb3IgRGVjZW1iZXItSmFudWFyeSksIGRlcGVuZGluZyBvbiB0aGUgbGVuZ3RocyBvZiB0aGUgcmVuZGVyZWQgbW9udGhzO1xuICogdGhlIGVsZW1lbnQgaW5kZXggaW5zdGVhZCBnb2VzIGZyb20gMCB0byBhIG1heCB2YWx1ZSBvZiAyNCBmb3IgeWVhcnMgYW5kIDMxIGZvciBkYXlzLlxuICogTW9yZW92ZXIsIGluIGRheSB2aWV3LCB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGRheSBvZiB0aGUgc2Vjb25kIHJlbmRlcmVkIG1vbnRoIGFuZCB0aGUgaW5kZXggb2YgdGhlIGxhc3QgcmVuZGVyZWQgZGF5XG4gKiBjYW4gYWxzbyB2YXJ5IGRlcGVuZGluZyBvbiB3aGljaCBtb250aHMgYXJlIHJlbmRlcmVkOyBmb3IgSnVseS1BdWd1c3QgdGhleSBhcmUgZXF1YWxzIHRvIDMxIGFuZCA2MSwgd2hpbGUgZm9yIEZlYnJ1YXJ5LU1hcmNoIHRoZXkgYXJlIDI4IGFuZCA1OC5cbiAqIFNvLCBzb21lIGFkZGl0aW9uYWwgcGFyYW1ldGVycyBhcmUgbmVlZGVkLCBiZXNpZGUgdGhlIGNlbGwncyBpbmRleCwgdG8gY29ycmVjdGx5IGNhbGN1bGF0ZSB0aGUgZWxlbWVudCB0byBuYXZpZ2F0ZSB0by5cbiAqL1xuaW50ZXJmYWNlIENhbGVuZGFyS2V5Ym9hcmROYXZpZ2F0aW9uUGFyYW1ldGVycyB7XG4gIC8qKiBUaGUgZWxlbWVudCBpbmRleCB3aXRoaW4gaXRzIG1vbnRoIChvciB5ZWFyIHJhbmdlKS4gKi9cbiAgZWxlbWVudEluZGV4Rm9yV2lkZU1vZGU6IG51bWJlcjtcbiAgLyoqIEluIHdpZGUgbW9kZSwgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBzZWNvbmQgcGFuZWwsIG9yLCBhbHRlcm5hdGl2ZWx5LCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBmaXJzdCBwYW5lbC4gKi9cbiAgb2Zmc2V0Rm9yV2lkZU1vZGU6IG51bWJlcjtcbiAgLyoqIFRoZSBpbmRleCBvZiB0aGUgbGFzdCBlbGVtZW50IHdpdGhpbiB0aGUgZWxlbWVudCdzIG1vbnRoIChvciB5ZWFyIHJhbmdlKS4gKi9cbiAgbGFzdEVsZW1lbnRJbmRleEZvcldpZGVNb2RlOiBudW1iZXI7XG4gIC8qKiBUaGUgbnVtYmVyIG9mIGNlbGxzIGRpc3BsYXllZCBpbiBhIHNpbmdsZSByb3csIGRlcGVuZGluZyBvbiB0aGUgcmVuZGVyZWQgdmlldy4gKi9cbiAgdmVydGljYWxPZmZzZXQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEYXkge1xuICB2YWx1ZTogc3RyaW5nO1xuICBkYXlWYWx1ZTogc3RyaW5nO1xuICBtb250aFZhbHVlOiBzdHJpbmc7XG4gIHllYXJWYWx1ZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1vbnRoIHtcbiAgdmFsdWU6IHN0cmluZztcbiAgbG9uZ1ZhbHVlOiBzdHJpbmc7XG4gIG1vbnRoVmFsdWU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXZWVrZGF5IHtcbiAgbG9uZzogc3RyaW5nO1xuICBuYXJyb3c6IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgQ2FsZW5kYXJWaWV3ID0gJ2RheScgfCAnbW9udGgnIHwgJ3llYXInO1xuXG4vKipcbiAqIEl0IGRpc3BsYXlzIGEgY2FsZW5kYXIgd2hpY2ggYWxsb3dzIHRvIGNob29zZSBhIGRhdGUuXG4gKlxuICogQGV2ZW50IHtDdXN0b21FdmVudDxUPn0gZGF0ZVNlbGVjdGVkIC0gRXZlbnQgZW1pdHRlZCBvbiBkYXRlIHNlbGVjdGlvbi5cbiAqL1xuQGN1c3RvbUVsZW1lbnQoJ3NiYi1jYWxlbmRhcicpXG5leHBvcnQgY2xhc3MgU2JiQ2FsZW5kYXJFbGVtZW50PFQgPSBEYXRlPiBleHRlbmRzIFNiYkh5ZHJhdGlvbk1peGluKExpdEVsZW1lbnQpIHtcbiAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBzdHlsZXM6IENTU1Jlc3VsdEdyb3VwID0gc3R5bGU7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZXZlbnRzID0ge1xuICAgIGRhdGVTZWxlY3RlZDogJ2RhdGVTZWxlY3RlZCcsXG4gIH0gYXMgY29uc3Q7XG5cbiAgLyoqIElmIHNldCB0byB0cnVlLCB0d28gbW9udGhzIGFyZSBkaXNwbGF5ZWQgKi9cbiAgQHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KSBwdWJsaWMgd2lkZSA9IGZhbHNlO1xuXG4gIC8qKiBUaGUgaW5pdGlhbCB2aWV3IG9mIHRoZSBjYWxlbmRhciB3aGljaCBzaG91bGQgYmUgZGlzcGxheWVkIG9uIG9wZW5pbmcuICovXG4gIEBwcm9wZXJ0eSgpIHB1YmxpYyB2aWV3OiBDYWxlbmRhclZpZXcgPSAnZGF5JztcblxuICAvKiogVGhlIG1pbmltdW0gdmFsaWQgZGF0ZS4gVGFrZXMgVCBPYmplY3QsIElTT1N0cmluZywgYW5kIFVuaXggVGltZXN0YW1wIChudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSBKYW4gMSwgMTk3MCkuICovXG4gIEBwcm9wZXJ0eSgpXG4gIHB1YmxpYyBzZXQgbWluKHZhbHVlOiBTYmJEYXRlTGlrZTxUPiB8IG51bGwpIHtcbiAgICB0aGlzLl9taW4gPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRWYWxpZERhdGVPck51bGwodGhpcy5fZGF0ZUFkYXB0ZXIuZGVzZXJpYWxpemUodmFsdWUpKTtcbiAgfVxuICBwdWJsaWMgZ2V0IG1pbigpOiBUIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX21pbiA/PyBudWxsO1xuICB9XG4gIHByaXZhdGUgX21pbj86IFQgfCBudWxsO1xuXG4gIC8qKiBUaGUgbWF4aW11bSB2YWxpZCBkYXRlLiBUYWtlcyBUIE9iamVjdCwgSVNPU3RyaW5nLCBhbmQgVW5peCBUaW1lc3RhbXAgKG51bWJlciBvZiBzZWNvbmRzIHNpbmNlIEphbiAxLCAxOTcwKS4gKi9cbiAgQHByb3BlcnR5KClcbiAgcHVibGljIHNldCBtYXgodmFsdWU6IFNiYkRhdGVMaWtlPFQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fbWF4ID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0VmFsaWREYXRlT3JOdWxsKHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKHZhbHVlKSk7XG4gIH1cbiAgcHVibGljIGdldCBtYXgoKTogVCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9tYXggPz8gbnVsbDtcbiAgfVxuICBwcml2YXRlIF9tYXg/OiBUIHwgbnVsbDtcblxuICAvKiogQSBjb25maWd1cmVkIGRhdGUgd2hpY2ggYWN0cyBhcyB0aGUgY3VycmVudCBkYXRlIGluc3RlYWQgb2YgdGhlIHJlYWwgY3VycmVudCBkYXRlLiBSZWNvbW1lbmRlZCBmb3IgdGVzdGluZyBwdXJwb3Nlcy4gKi9cbiAgQHByb3BlcnR5KClcbiAgcHVibGljIHNldCBub3codmFsdWU6IFNiYkRhdGVMaWtlPFQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fbm93ID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0VmFsaWREYXRlT3JOdWxsKHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKHZhbHVlKSk7XG4gIH1cbiAgcHVibGljIGdldCBub3coKTogVCB7XG4gICAgcmV0dXJuIHRoaXMuX25vdyA/PyB0aGlzLl9kYXRlQWRhcHRlci50b2RheSgpO1xuICB9XG4gIHByaXZhdGUgX25vdzogVCB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBUaGUgc2VsZWN0ZWQgZGF0ZS4gVGFrZXMgVCBPYmplY3QsIElTT1N0cmluZywgYW5kIFVuaXggVGltZXN0YW1wIChudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSBKYW4gMSwgMTk3MCkuICovXG4gIEBwcm9wZXJ0eSgpXG4gIHB1YmxpYyBzZXQgc2VsZWN0ZWQodmFsdWU6IFNiYkRhdGVMaWtlPFQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fc2VsZWN0ZWREYXRlID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0VmFsaWREYXRlT3JOdWxsKHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKHZhbHVlKSk7XG4gICAgaWYgKFxuICAgICAgISF0aGlzLl9zZWxlY3RlZERhdGUgJiZcbiAgICAgICghdGhpcy5faXNEYXlJblJhbmdlKHRoaXMuX2RhdGVBZGFwdGVyLnRvSXNvODYwMSh0aGlzLl9zZWxlY3RlZERhdGUpKSB8fFxuICAgICAgICB0aGlzLl9kYXRlRmlsdGVyKHRoaXMuX3NlbGVjdGVkRGF0ZSkpXG4gICAgKSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZCA9IHRoaXMuX2RhdGVBZGFwdGVyLnRvSXNvODYwMSh0aGlzLl9zZWxlY3RlZERhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldCBzZWxlY3RlZCgpOiBUIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkRGF0ZSA/PyBudWxsO1xuICB9XG4gIHByaXZhdGUgX3NlbGVjdGVkRGF0ZT86IFQgfCBudWxsO1xuXG4gIC8qKiBBIGZ1bmN0aW9uIHVzZWQgdG8gZmlsdGVyIG91dCBkYXRlcy4gKi9cbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnZGF0ZS1maWx0ZXInIH0pIHB1YmxpYyBkYXRlRmlsdGVyPzogKGRhdGU6IFQgfCBudWxsKSA9PiBib29sZWFuO1xuXG4gIHByaXZhdGUgX2RhdGVBZGFwdGVyOiBEYXRlQWRhcHRlcjxUPiA9IHJlYWRDb25maWcoKS5kYXRldGltZT8uZGF0ZUFkYXB0ZXIgPz8gZGVmYXVsdERhdGVBZGFwdGVyO1xuXG4gIC8qKiBFdmVudCBlbWl0dGVkIG9uIGRhdGUgc2VsZWN0aW9uLiAqL1xuICBwcml2YXRlIF9kYXRlU2VsZWN0ZWQ6IEV2ZW50RW1pdHRlcjxUPiA9IG5ldyBFdmVudEVtaXR0ZXIoXG4gICAgdGhpcyxcbiAgICBTYmJDYWxlbmRhckVsZW1lbnQuZXZlbnRzLmRhdGVTZWxlY3RlZCxcbiAgKTtcblxuICAvKiogVGhlIGN1cnJlbnRseSBhY3RpdmUgZGF0ZS4gKi9cbiAgQHN0YXRlKCkgcHJpdmF0ZSBfYWN0aXZlRGF0ZTogVCA9IHRoaXMubm93O1xuXG4gIC8qKiBUaGUgc2VsZWN0ZWQgZGF0ZSBhcyBJU09TdHJpbmcuICovXG4gIEBzdGF0ZSgpIHByaXZhdGUgX3NlbGVjdGVkPzogc3RyaW5nO1xuXG4gIC8qKiBUaGUgY3VycmVudCB3aWRlIHByb3BlcnR5IGNvbnNpZGVyaW5nIHByb3BlcnR5IHZhbHVlIGFuZCBicmVha3BvaW50cy4gRnJvbSB6ZXJvIHRvIHNtYWxsIGB3aWRlYCBoYXMgYWx3YXlzIHRvIGJlIGZhbHNlLiAqL1xuICBAc3RhdGUoKVxuICBwcml2YXRlIHNldCBfd2lkZSh3aWRlOiBib29sZWFuKSB7XG4gICAgdGhpcy50b2dnbGVBdHRyaWJ1dGUoJ2RhdGEtd2lkZScsIHdpZGUpO1xuICB9XG4gIHByaXZhdGUgZ2V0IF93aWRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc0F0dHJpYnV0ZSgnZGF0YS13aWRlJyk7XG4gIH1cblxuICBAc3RhdGUoKSBwcml2YXRlIF9jYWxlbmRhclZpZXc6IENhbGVuZGFyVmlldyA9ICdkYXknO1xuXG4gIHByaXZhdGUgX25leHRDYWxlbmRhclZpZXc6IENhbGVuZGFyVmlldyA9ICdkYXknO1xuXG4gIC8qKiBBIGxpc3Qgb2YgZGF5cywgaW4gdHdvIGZvcm1hdHMgKGxvbmcgYW5kIHNpbmdsZSBjaGFyKS4gKi9cbiAgcHJpdmF0ZSBfd2Vla2RheXMhOiBXZWVrZGF5W107XG5cbiAgLyoqIEdyaWQgb2YgY2FsZW5kYXIgY2VsbHMgcmVwcmVzZW50aW5nIHRoZSBkYXRlcyBvZiB0aGUgbW9udGguICovXG4gIHByaXZhdGUgX3dlZWtzOiBEYXlbXVtdID0gW107XG5cbiAgLyoqIEdyaWQgb2YgY2FsZW5kYXIgY2VsbHMgcmVwcmVzZW50aW5nIG1vbnRocy4gKi9cbiAgcHJpdmF0ZSBfbW9udGhzITogTW9udGhbXVtdO1xuXG4gIC8qKiBHcmlkIG9mIGNhbGVuZGFyIGNlbGxzIHJlcHJlc2VudGluZyB5ZWFycy4gKi9cbiAgcHJpdmF0ZSBfeWVhcnMhOiBudW1iZXJbXVtdO1xuXG4gIC8qKiBHcmlkIG9mIGNhbGVuZGFyIGNlbGxzIHJlcHJlc2VudGluZyB5ZWFycyBmb3IgdGhlIHdpZGUgdmlldy4gKi9cbiAgcHJpdmF0ZSBfbmV4dE1vbnRoWWVhcnMhOiBudW1iZXJbXVtdO1xuXG4gIC8qKiBHcmlkIG9mIGNhbGVuZGFyIGNlbGxzIHJlcHJlc2VudGluZyB0aGUgZGF0ZXMgb2YgdGhlIG5leHQgbW9udGguICovXG4gIHByaXZhdGUgX25leHRNb250aFdlZWtzITogRGF5W11bXTtcblxuICAvKiogQW4gYXJyYXkgY29udGFpbmluZyBhbGwgdGhlIG1vbnRoIG5hbWVzIGluIHRoZSBjdXJyZW50IGxhbmd1YWdlLiAqL1xuICBwcml2YXRlIF9tb250aE5hbWVzOiBzdHJpbmdbXSA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoTmFtZXMoJ2xvbmcnKTtcblxuICAvKiogQSBsaXN0IG9mIGJ1dHRvbnMgY29ycmVzcG9uZGluZyB0byBkYXlzLCBtb250aHMgb3IgeWVhcnMgZGVwZW5kaW5nIG9uIHRoZSB2aWV3LiAqL1xuICBwcml2YXRlIGdldCBfY2VsbHMoKTogSFRNTEJ1dHRvbkVsZW1lbnRbXSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oXG4gICAgICB0aGlzLnNoYWRvd1Jvb3QhLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zYmItY2FsZW5kYXJfX2NlbGwnKSA/PyBbXSxcbiAgICApIGFzIEhUTUxCdXR0b25FbGVtZW50W107XG4gIH1cblxuICAvKiogVGhlIGNob3NlbiB5ZWFyIGluIHRoZSB5ZWFyIHNlbGVjdGlvbiB2aWV3LiAqL1xuICBwcml2YXRlIF9jaG9zZW5ZZWFyPzogbnVtYmVyO1xuXG4gIC8qKiBUaGUgY2hvc2VuIG1vbnRoIGluIHRoZSB5ZWFyIHNlbGVjdGlvbiB2aWV3LiAqL1xuICBwcml2YXRlIF9jaG9zZW5Nb250aD86IG51bWJlcjtcblxuICAvKiogV2hldGhlciB0aGUgZm9jdXMgc2hvdWxkIGJlIHJlc2V0IG9uIGZvY3VzQ2VsbC4gKi9cbiAgcHJpdmF0ZSBfcmVzZXRGb2N1cyA9IGZhbHNlO1xuXG4gIEBzdGF0ZSgpXG4gIHByaXZhdGUgX2luaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfYWJvcnQgPSBuZXcgU2JiQ29ubmVjdGVkQWJvcnRDb250cm9sbGVyKHRoaXMpO1xuICBwcml2YXRlIF9sYW5ndWFnZSA9IG5ldyBTYmJMYW5ndWFnZUNvbnRyb2xsZXIodGhpcykud2l0aEhhbmRsZXIoKCkgPT4ge1xuICAgIHRoaXMuX21vbnRoTmFtZXMgPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aE5hbWVzKCdsb25nJyk7XG4gICAgdGhpcy5fY3JlYXRlTW9udGhSb3dzKCk7XG4gIH0pO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2NyZWF0ZU1vbnRoUm93cygpO1xuICAgIHRoaXMuX3NldFdlZWtkYXlzKCk7XG4gIH1cblxuICBwcml2YXRlIGdldCBfZGF0ZUZpbHRlcigpOiAoZGF0ZTogVCkgPT4gYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGF0ZUZpbHRlciA/PyAoKCkgPT4gdHJ1ZSk7XG4gIH1cblxuICAvKiogUmVzZXRzIHRoZSBhY3RpdmUgbW9udGggYWNjb3JkaW5nIHRvIHRoZSBuZXcgc3RhdGUgb2YgdGhlIGNhbGVuZGFyLiAqL1xuICBwdWJsaWMgcmVzZXRQb3NpdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLl9yZXNldENhbGVuZGFyVmlldygpO1xuICAgIHRoaXMuX2luaXQoKTtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMucmVzZXRQb3NpdGlvbigpO1xuICAgIHRoaXMuZm9jdXMgPSAoKSA9PiB7XG4gICAgICB0aGlzLl9yZXNldEZvY3VzID0gdHJ1ZTtcbiAgICAgIHRoaXMuX2ZvY3VzQ2VsbCgpO1xuICAgIH07XG4gICAgZ2xvYmFsVGhpcy53aW5kb3c/LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsICgpID0+IHRoaXMuX2luaXQoKSwge1xuICAgICAgcGFzc2l2ZTogdHJ1ZSxcbiAgICAgIHNpZ25hbDogdGhpcy5fYWJvcnQuc2lnbmFsLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHdpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzPHRoaXM+KTogdm9pZCB7XG4gICAgc3VwZXIud2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcyk7XG5cbiAgICBpZiAoIXRoaXMuX2luaXRpYWxpemVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnd2lkZScpKSB7XG4gICAgICB0aGlzLnJlc2V0UG9zaXRpb24oKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCd2aWV3JykpIHtcbiAgICAgIHRoaXMuX3NldENob3NlblllYXIoKTtcbiAgICAgIHRoaXMuX2Nob3Nlbk1vbnRoID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fbmV4dENhbGVuZGFyVmlldyA9IHRoaXMuX2NhbGVuZGFyVmlldyA9IHRoaXMudmlldztcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdXBkYXRlZChjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXM8dGhpcz4pOiB2b2lkIHtcbiAgICBzdXBlci51cGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKTtcbiAgICAvLyBUaGUgY2FsZW5kYXIgbmVlZHMgdG8gY2FsY3VsYXRlIHRhYi1pbmRleGVzIG9uIGZpcnN0IHJlbmRlcixcbiAgICAvLyBhbmQgZXZlcnkgdGltZSBhIGRhdGUgaXMgc2VsZWN0ZWQgb3IgdGhlIG1vbnRoIHZpZXcgY2hhbmdlcy5cbiAgICB0aGlzLl9zZXRUYWJJbmRleCgpO1xuICAgIC8vIFdoZW4gY2hhbmdpbmcgdmlldyB0byB5ZWFyL21vbnRoLCB0aGUgdGFiaW5kZXggaXMgY2hhbmdlZCwgYnV0IHRoZSBmb2N1c2VkIGVsZW1lbnQgaXMgbm90LFxuICAgIC8vIHNvIGlmIHRoZSBuYXZpZ2F0aW9uIGlzIGRvbmUgdmlhIGtleWJvYXJkLCB0aGVyZSdzIHRoZSBuZWVkXG4gICAgLy8gdG8gY2FsbCB0aGUgYF9mb2N1c0NlbGwoKWAgbWV0aG9kIGV4cGxpY2l0bHkgdG8gY29ycmVjdGx5IHNldCB0aGUgZm9jdXMuXG4gICAgaWYgKHNiYklucHV0TW9kYWxpdHlEZXRlY3Rvci5tb3N0UmVjZW50TW9kYWxpdHkgPT09ICdrZXlib2FyZCcpIHtcbiAgICAgIHRoaXMuX2ZvY3VzQ2VsbCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBJbml0aWFsaXplcyB0aGUgY29tcG9uZW50LiAqL1xuICBwcml2YXRlIF9pbml0KGFjdGl2ZURhdGU/OiBUKTogdm9pZCB7XG4gICAgLy9EdWUgdG8gaXRzIGNvbXBsZXhpdHksIHRoZSBjYWxlZGFyIGlzIG9ubHkgaW5pdGlhbGl6ZWQgb24gY2xpZW50IHNpZGVcbiAgICBpZiAoaXNTZXJ2ZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaHlkcmF0aW9uUmVxdWlyZWQpIHtcbiAgICAgIHRoaXMuaHlkcmF0aW9uQ29tcGxldGUudGhlbigoKSA9PiB0aGlzLl9pbml0KCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChhY3RpdmVEYXRlKSB7XG4gICAgICB0aGlzLl9hc3NpZ25BY3RpdmVEYXRlKGFjdGl2ZURhdGUpO1xuICAgIH1cbiAgICB0aGlzLl93aWRlID0gaXNCcmVha3BvaW50KCdtZWRpdW0nKSAmJiB0aGlzLndpZGU7XG4gICAgdGhpcy5fd2Vla3MgPSB0aGlzLl9jcmVhdGVXZWVrUm93cyh0aGlzLl9hY3RpdmVEYXRlKTtcbiAgICB0aGlzLl95ZWFycyA9IHRoaXMuX2NyZWF0ZVllYXJSb3dzKCk7XG4gICAgdGhpcy5fbmV4dE1vbnRoV2Vla3MgPSBbW11dO1xuICAgIHRoaXMuX25leHRNb250aFllYXJzID0gW1tdXTtcbiAgICBpZiAodGhpcy5fd2lkZSkge1xuICAgICAgY29uc3QgbmV4dE1vbnRoRGF0ZSA9IHRoaXMuX2RhdGVBZGFwdGVyLmFkZENhbGVuZGFyTW9udGhzKHRoaXMuX2FjdGl2ZURhdGUsIDEpO1xuICAgICAgdGhpcy5fbmV4dE1vbnRoV2Vla3MgPSB0aGlzLl9jcmVhdGVXZWVrUm93cyhuZXh0TW9udGhEYXRlKTtcbiAgICAgIHRoaXMuX25leHRNb250aFllYXJzID0gdGhpcy5fY3JlYXRlWWVhclJvd3MoWUVBUlNfUEVSX1BBR0UpO1xuICAgIH1cbiAgICB0aGlzLl9pbml0aWFsaXplZCA9IHRydWU7XG4gIH1cblxuICAvKiogRm9jdXNlcyBvbiBhIGRheSBjZWxsIHByaW9yaXRpemluZyB0aGUgc2VsZWN0ZWQgZGF5LCB0aGUgY3VycmVudCBkYXksIGFuZCBsYXN0bHksIHRoZSBmaXJzdCBzZWxlY3RhYmxlIGRheS4gKi9cbiAgcHJpdmF0ZSBfZm9jdXNDZWxsKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9yZXNldEZvY3VzKSB7XG4gICAgICB0aGlzLl9nZXRGaXJzdEZvY3VzYWJsZSgpPy5mb2N1cygpO1xuICAgICAgdGhpcy5fcmVzZXRGb2N1cyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDcmVhdGVzIHRoZSBhcnJheSBvZiB3ZWVrZGF5cy4gKi9cbiAgcHJpdmF0ZSBfc2V0V2Vla2RheXMoKTogdm9pZCB7XG4gICAgY29uc3QgbmFycm93V2Vla2RheXM6IHN0cmluZ1tdID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0RGF5T2ZXZWVrTmFtZXMoJ25hcnJvdycpO1xuICAgIGNvbnN0IGxvbmdXZWVrZGF5czogc3RyaW5nW10gPSB0aGlzLl9kYXRlQWRhcHRlci5nZXREYXlPZldlZWtOYW1lcygnbG9uZycpO1xuICAgIGNvbnN0IHdlZWtkYXlzOiBXZWVrZGF5W10gPSBsb25nV2Vla2RheXMubWFwKChsb25nOiBzdHJpbmcsIGk6IG51bWJlcikgPT4gKHtcbiAgICAgIGxvbmcsXG4gICAgICBuYXJyb3c6IG5hcnJvd1dlZWtkYXlzW2ldLFxuICAgIH0pKTtcblxuICAgIC8vIFJvdGF0ZXMgdGhlIGxhYmVscyBmb3IgZGF5cyBvZiB0aGUgd2VlayBiYXNlZCBvbiB0aGUgY29uZmlndXJlZCBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgY29uc3QgZmlyc3REYXlPZldlZWs6IG51bWJlciA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldEZpcnN0RGF5T2ZXZWVrKCk7XG4gICAgdGhpcy5fd2Vla2RheXMgPSB3ZWVrZGF5cy5zbGljZShmaXJzdERheU9mV2VlaykuY29uY2F0KHdlZWtkYXlzLnNsaWNlKDAsIGZpcnN0RGF5T2ZXZWVrKSk7XG4gIH1cblxuICAvKiogQ3JlYXRlcyB0aGUgcm93cyBmb3IgZWFjaCB3ZWVrLiAqL1xuICBwcml2YXRlIF9jcmVhdGVXZWVrUm93cyh2YWx1ZTogVCk6IERheVtdW10ge1xuICAgIGNvbnN0IGRheXNJbk1vbnRoOiBudW1iZXIgPSB0aGlzLl9kYXRlQWRhcHRlci5nZXROdW1EYXlzSW5Nb250aCh2YWx1ZSk7XG4gICAgY29uc3QgZGF0ZU5hbWVzOiBzdHJpbmdbXSA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldERhdGVOYW1lcygpO1xuICAgIGNvbnN0IHdlZWtzOiBEYXlbXVtdID0gW1tdXTtcbiAgICBjb25zdCB3ZWVrT2Zmc2V0ID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0Rmlyc3RXZWVrT2Zmc2V0KHZhbHVlKTtcbiAgICBmb3IgKGxldCBpID0gMCwgY2VsbCA9IHdlZWtPZmZzZXQ7IGkgPCBkYXlzSW5Nb250aDsgaSsrLCBjZWxsKyspIHtcbiAgICAgIGlmIChjZWxsID09PSBEQVlTX1BFUl9ST1cpIHtcbiAgICAgICAgd2Vla3MucHVzaChbXSk7XG4gICAgICAgIGNlbGwgPSAwO1xuICAgICAgfVxuICAgICAgY29uc3QgZGF0ZSA9IHRoaXMuX2RhdGVBZGFwdGVyLmNyZWF0ZURhdGUoXG4gICAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIodmFsdWUpLFxuICAgICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aCh2YWx1ZSksXG4gICAgICAgIGkgKyAxLFxuICAgICAgKSE7XG4gICAgICB3ZWVrc1t3ZWVrcy5sZW5ndGggLSAxXS5wdXNoKHtcbiAgICAgICAgdmFsdWU6IHRoaXMuX2RhdGVBZGFwdGVyLnRvSXNvODYwMShkYXRlKSxcbiAgICAgICAgZGF5VmFsdWU6IGRhdGVOYW1lc1tpXSxcbiAgICAgICAgbW9udGhWYWx1ZTogU3RyaW5nKHRoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoKGRhdGUpKSxcbiAgICAgICAgeWVhclZhbHVlOiBTdHJpbmcodGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcihkYXRlKSksXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHdlZWtzO1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgdGhlIHJvd3MgZm9yIHRoZSBtb250aCBzZWxlY3Rpb24gdmlldy4gKi9cbiAgcHJpdmF0ZSBfY3JlYXRlTW9udGhSb3dzKCk6IHZvaWQge1xuICAgIGNvbnN0IHNob3J0TmFtZXM6IHN0cmluZ1tdID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGhOYW1lcygnc2hvcnQnKTtcbiAgICBjb25zdCBtb250aHM6IE1vbnRoW10gPSBuZXcgQXJyYXkoMTIpLmZpbGwobnVsbCkubWFwKFxuICAgICAgKF8sIGk6IG51bWJlcik6IE1vbnRoID0+ICh7XG4gICAgICAgIHZhbHVlOiBzaG9ydE5hbWVzW2ldLFxuICAgICAgICBsb25nVmFsdWU6IHRoaXMuX21vbnRoTmFtZXNbaV0sXG4gICAgICAgIG1vbnRoVmFsdWU6IGkgKyAxLFxuICAgICAgfSksXG4gICAgKTtcbiAgICBjb25zdCByb3dzOiBudW1iZXIgPSAxMiAvIE1PTlRIU19QRVJfUk9XO1xuICAgIGNvbnN0IG1vbnRoQXJyYXk6IE1vbnRoW11bXSA9IFtdO1xuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCByb3dzOyBpKyspIHtcbiAgICAgIG1vbnRoQXJyYXkucHVzaChtb250aHMuc2xpY2UoTU9OVEhTX1BFUl9ST1cgKiBpLCBNT05USFNfUEVSX1JPVyAqIChpICsgMSkpKTtcbiAgICB9XG4gICAgdGhpcy5fbW9udGhzID0gbW9udGhBcnJheTtcbiAgfVxuXG4gIC8qKiBDcmVhdGVzIHRoZSByb3dzIGZvciB0aGUgeWVhciBzZWxlY3Rpb24gdmlldy4gKi9cbiAgcHJpdmF0ZSBfY3JlYXRlWWVhclJvd3Mob2Zmc2V0OiBudW1iZXIgPSAwKTogbnVtYmVyW11bXSB7XG4gICAgY29uc3Qgc3RhcnRWYWx1ZVllYXJWaWV3OiBudW1iZXIgPSB0aGlzLl9nZXRTdGFydFZhbHVlWWVhclZpZXcoKTtcbiAgICBjb25zdCBhbGxZZWFyczogbnVtYmVyW10gPSBuZXcgQXJyYXkoWUVBUlNfUEVSX1BBR0UpXG4gICAgICAuZmlsbCgwKVxuICAgICAgLm1hcCgoXywgaTogbnVtYmVyKSA9PiBzdGFydFZhbHVlWWVhclZpZXcgKyBvZmZzZXQgKyBpKTtcbiAgICBjb25zdCByb3dzOiBudW1iZXIgPSBZRUFSU19QRVJfUEFHRSAvIFlFQVJTX1BFUl9ST1c7XG4gICAgY29uc3QgeWVhckFycmF5OiBudW1iZXJbXVtdID0gW107XG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHJvd3M7IGkrKykge1xuICAgICAgeWVhckFycmF5LnB1c2goYWxsWWVhcnMuc2xpY2UoWUVBUlNfUEVSX1JPVyAqIGksIFlFQVJTX1BFUl9ST1cgKiAoaSArIDEpKSk7XG4gICAgfVxuICAgIHJldHVybiB5ZWFyQXJyYXk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyB0aGUgZmlyc3QgeWVhciB0aGF0IHdpbGwgYmUgc2hvd24gaW4gdGhlIHllYXIgc2VsZWN0aW9uIHBhbmVsLlxuICAgKiBJZiBgbWluRGF0ZWAgYW5kIGBtYXhEYXRlYCBhcmUgYm90aCBudWxsLCB0aGUgc3RhcnRpbmcgeWVhciBpcyBjYWxjdWxhdGVkIGFzXG4gICAqIHRoZSBtdWx0aXBsZSBvZiBZRUFSU19QRVJfUEFHRSBjbG9zZXN0IHRvIGFuZCBsZXNzIHRoYW4gYWN0aXZlRGF0ZSxcbiAgICogZS5nLiwgd2l0aCBgWUVBUlNfUEVSX1BBR0VgID0gMjQgYW5kIGBhY3RpdmVEYXRlYCA9IDIwMjAsIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiAyMDE2ICgyNCAqIDgzKSxcbiAgICogd2hpbGUgd2l0aCBgYWN0aXZlRGF0ZWAgPSAyMDAwLCB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gMTk5MiAoMjQgKiA4MikuXG4gICAqIElmIGBtaW5EYXRlYCBpcyBub3QgbnVsbCwgaXQgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyB5ZWFyOyBpZiBgbWF4RGF0ZWAgaXMgbm90IG51bGwsXG4gICAqIGl0IHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgeWVhciBtaW51cyBgWUVBUlNfUEVSX1BBR0VgLCBzbyB0aGF0IHRoZSBgbWF4RGF0ZWAgaXMgdGhlIGxhc3QgcmVuZGVyZWQgeWVhci5cbiAgICogSWYgYm90aCBhcmUgbm90IG51bGwsIGBtYXhEYXRlYCBoYXMgcHJpb3JpdHkgb3ZlciBgbWluRGF0ZWAuXG4gICAqL1xuICBwcml2YXRlIF9nZXRTdGFydFZhbHVlWWVhclZpZXcoKTogbnVtYmVyIHtcbiAgICBsZXQgc3RhcnRpbmdZZWFyID0gMDtcbiAgICBpZiAodGhpcy5tYXgpIHtcbiAgICAgIHN0YXJ0aW5nWWVhciA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIodGhpcy5tYXgpIC0gWUVBUlNfUEVSX1BBR0UgKyAxO1xuICAgIH0gZWxzZSBpZiAodGhpcy5taW4pIHtcbiAgICAgIHN0YXJ0aW5nWWVhciA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIodGhpcy5taW4pO1xuICAgIH1cbiAgICBjb25zdCBhY3RpdmVZZWFyID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih0aGlzLl9hY3RpdmVEYXRlKTtcbiAgICByZXR1cm4gKFxuICAgICAgYWN0aXZlWWVhciAtXG4gICAgICAoKCgoYWN0aXZlWWVhciAtIHN0YXJ0aW5nWWVhcikgJSBZRUFSU19QRVJfUEFHRSkgKyBZRUFSU19QRVJfUEFHRSkgJSBZRUFSU19QRVJfUEFHRSlcbiAgICApO1xuICB9XG5cbiAgLyoqIENoZWNrcyBpZiBkYXRlIGlzIHdpdGhpbiB0aGUgbWluLW1heCByYW5nZS4gKi9cbiAgcHJpdmF0ZSBfaXNEYXlJblJhbmdlKGRhdGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5fbWluICYmICF0aGlzLl9tYXgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBpc0JlZm9yZU1pbjogYm9vbGVhbiA9XG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5pc1ZhbGlkKHRoaXMuX21pbikgJiZcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmNvbXBhcmVEYXRlKHRoaXMuX21pbiEsIHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKGRhdGUpISkgPiAwO1xuICAgIGNvbnN0IGlzQWZ0ZXJNYXg6IGJvb2xlYW4gPVxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuaXNWYWxpZCh0aGlzLl9tYXgpICYmXG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5jb21wYXJlRGF0ZSh0aGlzLl9tYXghLCB0aGlzLl9kYXRlQWRhcHRlci5kZXNlcmlhbGl6ZShkYXRlKSEpIDwgMDtcbiAgICByZXR1cm4gIShpc0JlZm9yZU1pbiB8fCBpc0FmdGVyTWF4KTtcbiAgfVxuXG4gIHByaXZhdGUgX2lzTW9udGhJblJhbmdlKG1vbnRoOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuX21pbiAmJiAhdGhpcy5fbWF4KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgaXNCZWZvcmVNaW46IGJvb2xlYW4gPVxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuaXNWYWxpZCh0aGlzLl9taW4pICYmXG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKHRoaXMuX21pbiEpID49IHRoaXMuX2Nob3NlblllYXIhICYmXG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aCh0aGlzLl9taW4hKSA+IG1vbnRoO1xuICAgIGNvbnN0IGlzQWZ0ZXJNYXg6IGJvb2xlYW4gPVxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuaXNWYWxpZCh0aGlzLl9tYXgpICYmXG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKHRoaXMuX21heCEpIDw9IHRoaXMuX2Nob3NlblllYXIhICYmXG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aCh0aGlzLl9tYXghKSA8IG1vbnRoO1xuICAgIHJldHVybiAhKGlzQmVmb3JlTWluIHx8IGlzQWZ0ZXJNYXgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNZZWFySW5SYW5nZSh5ZWFyOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuX21pbiAmJiAhdGhpcy5fbWF4KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgaXNCZWZvcmVNaW46IGJvb2xlYW4gPVxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuaXNWYWxpZCh0aGlzLl9taW4pICYmIHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIodGhpcy5fbWluISkgPiB5ZWFyO1xuICAgIGNvbnN0IGlzQWZ0ZXJNYXg6IGJvb2xlYW4gPVxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuaXNWYWxpZCh0aGlzLl9tYXgpICYmIHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIodGhpcy5fbWF4ISkgPCB5ZWFyO1xuICAgIHJldHVybiAhKGlzQmVmb3JlTWluIHx8IGlzQWZ0ZXJNYXgpO1xuICB9XG5cbiAgLy8gSW1wbGVtZW50YXRpb24gYWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2NvbXBvbmVudHMvYmxvYi9tYWluL3NyYy9tYXRlcmlhbC9kYXRlcGlja2VyL3llYXItdmlldy50cyNMMzY2XG4gIHByaXZhdGUgX2lzTW9udGhGaWx0ZXJlZE91dChtb250aDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmRhdGVGaWx0ZXIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGZpcnN0T2ZNb250aCA9IHRoaXMuX2RhdGVBZGFwdGVyLmNyZWF0ZURhdGUodGhpcy5fY2hvc2VuWWVhciEsIG1vbnRoLCAxKSE7XG4gICAgZm9yIChcbiAgICAgIGxldCBkYXRlOiBUID0gZmlyc3RPZk1vbnRoO1xuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGgoZGF0ZSkgPT0gbW9udGg7XG4gICAgICBkYXRlID0gdGhpcy5fZGF0ZUFkYXB0ZXIuYWRkQ2FsZW5kYXJEYXlzKGRhdGUsIDEpXG4gICAgKSB7XG4gICAgICBpZiAodGhpcy5kYXRlRmlsdGVyKGRhdGUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIEltcGxlbWVudGF0aW9uIGFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9jb21wb25lbnRzL2Jsb2IvbWFpbi9zcmMvbWF0ZXJpYWwvZGF0ZXBpY2tlci9tdWx0aS15ZWFyLXZpZXcudHMjTDM1MVxuICBwcml2YXRlIF9pc1llYXJGaWx0ZXJlZE91dCh5ZWFyOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuZGF0ZUZpbHRlcikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgZmlyc3RPZlllYXIgPSB0aGlzLl9kYXRlQWRhcHRlci5jcmVhdGVEYXRlKHllYXIsIDEsIDEpITtcbiAgICBmb3IgKFxuICAgICAgbGV0IGRhdGU6IFQgPSBmaXJzdE9mWWVhcjtcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIoZGF0ZSkgPT0geWVhcjtcbiAgICAgIGRhdGUgPSB0aGlzLl9kYXRlQWRhcHRlci5hZGRDYWxlbmRhckRheXMoZGF0ZSwgMSlcbiAgICApIHtcbiAgICAgIGlmICh0aGlzLmRhdGVGaWx0ZXIoZGF0ZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqIEVtaXRzIHRoZSBzZWxlY3RlZCBkYXRlIGFuZCBzZXRzIGl0IGludGVybmFsbHkuICovXG4gIHByaXZhdGUgX3NlbGVjdERhdGUoZGF5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9jaG9zZW5Nb250aCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9zZXRDaG9zZW5ZZWFyKCk7XG4gICAgaWYgKHRoaXMuX3NlbGVjdGVkICE9PSBkYXkpIHtcbiAgICAgIHRoaXMuX3NlbGVjdGVkID0gZGF5O1xuICAgICAgdGhpcy5fZGF0ZVNlbGVjdGVkLmVtaXQodGhpcy5fZGF0ZUFkYXB0ZXIuZGVzZXJpYWxpemUoZGF5KSEpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3NldENob3NlblllYXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudmlldyA9PT0gJ21vbnRoJykge1xuICAgICAgdGhpcy5fY2hvc2VuWWVhciA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIoXG4gICAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKHRoaXMuX3NlbGVjdGVkKSA/PyB0aGlzLnNlbGVjdGVkID8/IHRoaXMubm93LFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fY2hvc2VuWWVhciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9hc3NpZ25BY3RpdmVEYXRlKGRhdGU6IFQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fbWluICYmIHRoaXMuX2RhdGVBZGFwdGVyLmNvbXBhcmVEYXRlKHRoaXMuX21pbiwgZGF0ZSkgPiAwKSB7XG4gICAgICB0aGlzLl9hY3RpdmVEYXRlID0gdGhpcy5fbWluO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5fbWF4ICYmIHRoaXMuX2RhdGVBZGFwdGVyLmNvbXBhcmVEYXRlKHRoaXMuX21heCwgZGF0ZSkgPCAwKSB7XG4gICAgICB0aGlzLl9hY3RpdmVEYXRlID0gdGhpcy5fbWF4O1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9hY3RpdmVEYXRlID0gZGF0ZTtcbiAgfVxuXG4gIC8qKiBHb2VzIHRvIHRoZSBtb250aCBpZGVudGlmaWVkIGJ5IHRoZSBzaGlmdC4gKi9cbiAgcHJpdmF0ZSBfZ29Ub0RpZmZlcmVudE1vbnRoKG1vbnRoczogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5faW5pdCh0aGlzLl9kYXRlQWRhcHRlci5hZGRDYWxlbmRhck1vbnRocyh0aGlzLl9hY3RpdmVEYXRlLCBtb250aHMpKTtcbiAgfVxuXG4gIHByaXZhdGUgX2dvVG9EaWZmZXJlbnRZZWFyKHllYXJzOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9jaG9zZW5ZZWFyISArPSB5ZWFycztcbiAgICAvLyBDYW4ndCB1c2UgYF9hc3NpZ25BY3RpdmVEYXRlKC4uLilgIGhlcmUsIGJlY2F1c2UgaXQgd2lsbCBzZXQgaXQgdG8gbWluL21heCB2YWx1ZSBpZiBhcmd1bWVudCBpcyBvdXQgb2YgcmFuZ2VcbiAgICB0aGlzLl9hY3RpdmVEYXRlID0gdGhpcy5fZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZShcbiAgICAgIHRoaXMuX2Nob3NlblllYXIhLFxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGgodGhpcy5fYWN0aXZlRGF0ZSksXG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXREYXRlKHRoaXMuX2FjdGl2ZURhdGUpLFxuICAgICk7XG4gICAgdGhpcy5faW5pdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ29Ub0RpZmZlcmVudFllYXJSYW5nZSh5ZWFyczogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5faW5pdCh0aGlzLl9kYXRlQWRhcHRlci5hZGRDYWxlbmRhclllYXJzKHRoaXMuX2FjdGl2ZURhdGUsIHllYXJzKSk7XG4gIH1cblxuICBwcml2YXRlIF9wcmV2RGlzYWJsZWQocHJldkRhdGU6IFQpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuX21pbikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZGF0ZUFkYXB0ZXIuY29tcGFyZURhdGUocHJldkRhdGUsIHRoaXMuX21pbikgPCAwO1xuICB9XG5cbiAgcHJpdmF0ZSBfbmV4dERpc2FibGVkKG5leHREYXRlOiBUKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLl9tYXgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2RhdGVBZGFwdGVyLmNvbXBhcmVEYXRlKG5leHREYXRlLCB0aGlzLl9tYXgpID4gMDtcbiAgfVxuXG4gIC8qKiBDaGVja3MgaWYgdGhlIFwicHJldmlvdXMgbW9udGhcIiBidXR0b24gc2hvdWxkIGJlIGRpc2FibGVkLiAqL1xuICBwcml2YXRlIF9wcmV2aW91c01vbnRoRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcHJldk1vbnRoID0gdGhpcy5fZGF0ZUFkYXB0ZXIuYWRkQ2FsZW5kYXJEYXlzKFxuICAgICAgdGhpcy5fYWN0aXZlRGF0ZSxcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldERhdGUodGhpcy5fYWN0aXZlRGF0ZSkgKiAtMSxcbiAgICApO1xuICAgIHJldHVybiB0aGlzLl9wcmV2RGlzYWJsZWQocHJldk1vbnRoKTtcbiAgfVxuXG4gIC8qKiBDaGVja3MgaWYgdGhlIFwibmV4dCBtb250aFwiIGJ1dHRvbiBzaG91bGQgYmUgZGlzYWJsZWQuICovXG4gIHByaXZhdGUgX25leHRNb250aERpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIGxldCBuZXh0TW9udGggPSB0aGlzLl9kYXRlQWRhcHRlci5hZGRDYWxlbmRhck1vbnRocyh0aGlzLl9hY3RpdmVEYXRlLCB0aGlzLl93aWRlID8gMiA6IDEpO1xuICAgIG5leHRNb250aCA9IHRoaXMuX2RhdGVBZGFwdGVyLmNyZWF0ZURhdGUoXG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKG5leHRNb250aCksXG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aChuZXh0TW9udGgpLFxuICAgICAgMSxcbiAgICApO1xuICAgIHJldHVybiB0aGlzLl9uZXh0RGlzYWJsZWQobmV4dE1vbnRoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3ByZXZpb3VzWWVhckRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHByZXZZZWFyID0gdGhpcy5fZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZShcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIodGhpcy5fYWN0aXZlRGF0ZSkgLSAxLFxuICAgICAgMTIsXG4gICAgICAzMSxcbiAgICApO1xuICAgIHJldHVybiB0aGlzLl9wcmV2RGlzYWJsZWQocHJldlllYXIpO1xuICB9XG5cbiAgcHJpdmF0ZSBfbmV4dFllYXJEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBuZXh0WWVhciA9IHRoaXMuX2RhdGVBZGFwdGVyLmNyZWF0ZURhdGUoXG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKHRoaXMuX2FjdGl2ZURhdGUpICsgMSxcbiAgICAgIDEsXG4gICAgICAxLFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuX25leHREaXNhYmxlZChuZXh0WWVhcik7XG4gIH1cblxuICBwcml2YXRlIF9wcmV2aW91c1llYXJSYW5nZURpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHByZXZZZWFyID0gdGhpcy5fZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZSh0aGlzLl95ZWFyc1swXVswXSAtIDEsIDEyLCAzMSk7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXZEaXNhYmxlZChwcmV2WWVhcik7XG4gIH1cblxuICBwcml2YXRlIF9uZXh0WWVhclJhbmdlRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgeWVhcnMgPSBpc0JyZWFrcG9pbnQoJ21lZGl1bScpICYmIHRoaXMud2lkZSA/IHRoaXMuX25leHRNb250aFllYXJzIDogdGhpcy5feWVhcnM7XG4gICAgY29uc3QgbGFzdFllYXJSYW5nZSA9IHllYXJzW3llYXJzLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IGxhc3RZZWFyID0gbGFzdFllYXJSYW5nZVtsYXN0WWVhclJhbmdlLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IG5leHRZZWFyID0gdGhpcy5fZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZShsYXN0WWVhciArIDEsIDEsIDEpO1xuICAgIHJldHVybiB0aGlzLl9uZXh0RGlzYWJsZWQobmV4dFllYXIpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlVGFibGVCbHVyKGV2ZW50VGFyZ2V0OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGlmIChldmVudFRhcmdldD8ubG9jYWxOYW1lICE9PSAnYnV0dG9uJykge1xuICAgICAgdGhpcy5fc2V0VGFiSW5kZXgoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zZXRUYWJJbmRleCgpOiB2b2lkIHtcbiAgICBBcnJheS5mcm9tKFxuICAgICAgdGhpcy5zaGFkb3dSb290IS5xdWVyeVNlbGVjdG9yQWxsKCcuc2JiLWNhbGVuZGFyX19jZWxsW3RhYmluZGV4PVwiMFwiXScpID8/IFtdLFxuICAgICkuZm9yRWFjaCgoZGF5KSA9PiAoKGRheSBhcyBIVE1MRWxlbWVudCkudGFiSW5kZXggPSAtMSkpO1xuICAgIGNvbnN0IGZpcnN0Rm9jdXNhYmxlID0gdGhpcy5fZ2V0Rmlyc3RGb2N1c2FibGUoKTtcbiAgICBpZiAoZmlyc3RGb2N1c2FibGUpIHtcbiAgICAgIGZpcnN0Rm9jdXNhYmxlLnRhYkluZGV4ID0gMDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9nZXRGaXJzdEZvY3VzYWJsZSgpOiBIVE1MQnV0dG9uRWxlbWVudCB7XG4gICAgY29uc3QgYWN0aXZlID0gdGhpcy5fc2VsZWN0ZWQgPyB0aGlzLl9kYXRlQWRhcHRlci5kZXNlcmlhbGl6ZSh0aGlzLl9zZWxlY3RlZCkhIDogdGhpcy5ub3c7XG4gICAgbGV0IGZpcnN0Rm9jdXNhYmxlID1cbiAgICAgIHRoaXMuc2hhZG93Um9vdCEucXVlcnlTZWxlY3RvcignLnNiYi1jYWxlbmRhcl9fc2VsZWN0ZWQnKSA/P1xuICAgICAgdGhpcy5zaGFkb3dSb290IS5xdWVyeVNlbGVjdG9yKFxuICAgICAgICBgW2RhdGEtZGF5PVwiJHt0aGlzLl9kYXRlQWRhcHRlci5nZXREYXRlKGFjdGl2ZSl9ICR7dGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGgoXG4gICAgICAgICAgYWN0aXZlLFxuICAgICAgICApfSAke3RoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIoYWN0aXZlKX1cIl1gLFxuICAgICAgKSA/P1xuICAgICAgdGhpcy5zaGFkb3dSb290IS5xdWVyeVNlbGVjdG9yKGBbZGF0YS1tb250aD1cIiR7dGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGgoYWN0aXZlKX1cIl1gKSA/P1xuICAgICAgdGhpcy5zaGFkb3dSb290IS5xdWVyeVNlbGVjdG9yKGBbZGF0YS15ZWFyPVwiJHt0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKGFjdGl2ZSl9XCJdYCk7XG4gICAgaWYgKCFmaXJzdEZvY3VzYWJsZSB8fCAoZmlyc3RGb2N1c2FibGUgYXMgSFRNTEJ1dHRvbkVsZW1lbnQpPy5kaXNhYmxlZCkge1xuICAgICAgZmlyc3RGb2N1c2FibGUgPSB0aGlzLnNoYWRvd1Jvb3QhLnF1ZXJ5U2VsZWN0b3IoJy5zYmItY2FsZW5kYXJfX2NlbGw6bm90KFtkaXNhYmxlZF0pJyk7XG4gICAgfVxuICAgIHJldHVybiAoZmlyc3RGb2N1c2FibGUgYXMgSFRNTEJ1dHRvbkVsZW1lbnQpIHx8IG51bGw7XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVLZXlib2FyZEV2ZW50KGV2ZW50OiBLZXlib2FyZEV2ZW50LCBkYXk/OiBEYXkpOiB2b2lkIHtcbiAgICBpZiAoaXNBcnJvd0tleU9yUGFnZUtleXNQcmVzc2VkKGV2ZW50KSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gICAgLy8gR2V0cyB0aGUgY3VycmVudGx5IHJlbmRlcmVkIHRhYmxlJ3MgY2VsbDtcbiAgICAvLyB0aGV5IGNvdWxkIGJlIGRheXMsIG1vbnRocyBvciB5ZWFycyBiYXNlZCBvbiB0aGUgY3VycmVudCBzZWxlY3Rpb24gdmlldy5cbiAgICAvLyBJZiBgd2lkZWAgaXMgdHJ1ZSwgeWVhcnMgYXJlIGRvdWJsZWQgaW4gbnVtYmVyIGFuZCBkYXlzIGFyZSAocm91Z2hseSkgZG91YmxlZCB0b28sIGFmZmVjdGluZyB0aGUgYGluZGV4YCBjYWxjdWxhdGlvbi5cbiAgICBjb25zdCBjZWxsczogSFRNTEJ1dHRvbkVsZW1lbnRbXSA9IHRoaXMuX2NlbGxzO1xuICAgIGNvbnN0IGluZGV4OiBudW1iZXIgPSBjZWxscy5maW5kSW5kZXgoKGU6IEhUTUxCdXR0b25FbGVtZW50KSA9PiBlID09PSBldmVudC50YXJnZXQpO1xuICAgIGNvbnN0IG5leHRFbDogSFRNTEJ1dHRvbkVsZW1lbnQgPSB0aGlzLl9uYXZpZ2F0ZUJ5S2V5Ym9hcmQoZXZlbnQsIGluZGV4LCBjZWxscywgZGF5KTtcbiAgICBjb25zdCBhY3RpdmVFbDogSFRNTEJ1dHRvbkVsZW1lbnQgPSB0aGlzLnNoYWRvd1Jvb3QhLmFjdGl2ZUVsZW1lbnQgYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gICAgaWYgKG5leHRFbCAhPT0gYWN0aXZlRWwpIHtcbiAgICAgIChuZXh0RWwgYXMgSFRNTEJ1dHRvbkVsZW1lbnQpLnRhYkluZGV4ID0gMDtcbiAgICAgIG5leHRFbD8uZm9jdXMoKTtcbiAgICAgIChhY3RpdmVFbCBhcyBIVE1MQnV0dG9uRWxlbWVudCkudGFiSW5kZXggPSAtMTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgdG8gbW92ZSB0bywgYmFzZWQgb24gYSBsaXN0IG9mIGVsZW1lbnRzICh3aGljaCBjYW4gYmUgcG90ZW50aWFsbHkgZGlzYWJsZWQpLFxuICAgKiB0aGUga2V5Ym9hcmQgaW5wdXQgYW5kIHRoZSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBlbGVtZW50IGluIHRoZSBsaXN0LlxuICAgKiBJbiB0aGUgZGF5IHZpZXcsIHRoZSBgZGF5PzogRGF5YCBwYXJhbWV0ZXIgaXMgbWFuZGF0b3J5IGZvciBjYWxjdWxhdGlvbixcbiAgICogd2hpbGUgaW4gbW9udGggYW5kIHllYXIgdmlldyBpdCdzIG5vdCBkdWUgdG8gdGhlIGZpeGVkIGFtb3VudCBvZiByZW5kZXJlZCBjZWxscy5cbiAgICovXG4gIHByaXZhdGUgX25hdmlnYXRlQnlLZXlib2FyZChcbiAgICBldnQ6IEtleWJvYXJkRXZlbnQsXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBjZWxsczogSFRNTEJ1dHRvbkVsZW1lbnRbXSxcbiAgICBkYXk/OiBEYXksXG4gICk6IEhUTUxCdXR0b25FbGVtZW50IHtcbiAgICBjb25zdCB7XG4gICAgICBlbGVtZW50SW5kZXhGb3JXaWRlTW9kZSxcbiAgICAgIG9mZnNldEZvcldpZGVNb2RlLFxuICAgICAgbGFzdEVsZW1lbnRJbmRleEZvcldpZGVNb2RlLFxuICAgICAgdmVydGljYWxPZmZzZXQsXG4gICAgfTogQ2FsZW5kYXJLZXlib2FyZE5hdmlnYXRpb25QYXJhbWV0ZXJzID0gdGhpcy5fY2FsY3VsYXRlUGFyYW1ldGVyc0ZvcktleWJvYXJkTmF2aWdhdGlvbihcbiAgICAgIGNlbGxzLFxuICAgICAgaW5kZXgsXG4gICAgICBkYXksXG4gICAgKTtcblxuICAgIHN3aXRjaCAoZXZ0LmtleSkge1xuICAgICAgY2FzZSAnQXJyb3dVcCc6XG4gICAgICAgIHJldHVybiB0aGlzLl9maW5kTmV4dChjZWxscywgaW5kZXgsIC12ZXJ0aWNhbE9mZnNldCk7XG4gICAgICBjYXNlICdBcnJvd0Rvd24nOlxuICAgICAgICByZXR1cm4gdGhpcy5fZmluZE5leHQoY2VsbHMsIGluZGV4LCB2ZXJ0aWNhbE9mZnNldCk7XG4gICAgICBjYXNlICdBcnJvd0xlZnQnOlxuICAgICAgICByZXR1cm4gdGhpcy5fZmluZE5leHQoY2VsbHMsIGluZGV4LCAtMSk7XG4gICAgICBjYXNlICdBcnJvd1JpZ2h0JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmROZXh0KGNlbGxzLCBpbmRleCwgMSk7XG4gICAgICBjYXNlICdIb21lJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmRGaXJzdChjZWxscywgb2Zmc2V0Rm9yV2lkZU1vZGUpO1xuICAgICAgY2FzZSAnUGFnZVVwJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmRGaXJzdE9uQ29sdW1uKFxuICAgICAgICAgIGNlbGxzLFxuICAgICAgICAgIGVsZW1lbnRJbmRleEZvcldpZGVNb2RlLFxuICAgICAgICAgIG9mZnNldEZvcldpZGVNb2RlLFxuICAgICAgICAgIHZlcnRpY2FsT2Zmc2V0LFxuICAgICAgICApO1xuICAgICAgY2FzZSAnUGFnZURvd24nOlxuICAgICAgICByZXR1cm4gdGhpcy5fZmluZExhc3RPbkNvbHVtbihjZWxscywgaW5kZXgsIGxhc3RFbGVtZW50SW5kZXhGb3JXaWRlTW9kZSwgdmVydGljYWxPZmZzZXQpO1xuICAgICAgY2FzZSAnRW5kJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmRMYXN0KGNlbGxzLCBsYXN0RWxlbWVudEluZGV4Rm9yV2lkZU1vZGUgLSAxKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBjZWxsc1tpbmRleF07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZXMgdGhlIHBhcmFtZXRlciBuZWVkZWQgaW4ga2V5Ym9hcmQgbmF2aWdhdGlvbi5cbiAgICogU2luY2UgdGhyZWUgdmlld3MgYXJlIG5vdyBhdmFpbGFibGUsIHRoZSBmdW5jdGlvbiBjcmVhdGVzIGFuZCByZXR1cm5zIHRoZSBjb3JyZWN0IHBhcmFtZXRlcnMgZm9yIGVhY2ggb2YgdGhlbVxuICAgKiBieSBjb25zaWRlcmluZyB0aGUgbnVtYmVyIG9mIGNlbGxzIHBlciBlYWNoIHJvdyBhbmQgdGhlIGNvcnJlY3Rpb24gZm9yIHRoZSB3aWRlIG1vZGUuXG4gICAqIEBwYXJhbSBjZWxscyBUaGUgYXJyYXkgb2YgcmVuZGVyZWQgdGFibGUgY2VsbHM7IHRoZXkgYXJlIGJ1dHRvbnMgdGhhdCBjYW4gcmVwcmVzZW50IGRheXMsIG1vbnRocyBvciB5ZWFycy5cbiAgICogQHBhcmFtIGluZGV4IFRoZSBzdGFydGluZyBlbGVtZW50J3MgaW5kZXggaW4gdGhlIGNlbGwgYXJyYXkuXG4gICAqIEBwYXJhbSBkYXkgKG9wdGlvbmFsKSBPbmx5IGluIHRoZSBkYXkgdmlldywgdGhlIGRheSByZXByZXNlbnRlZCBieSB0aGUgc3RhcnRpbmcgY2VsbC5cbiAgICovXG4gIHByaXZhdGUgX2NhbGN1bGF0ZVBhcmFtZXRlcnNGb3JLZXlib2FyZE5hdmlnYXRpb24oXG4gICAgY2VsbHM6IEhUTUxCdXR0b25FbGVtZW50W10sXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBkYXk/OiBEYXksXG4gICk6IENhbGVuZGFyS2V5Ym9hcmROYXZpZ2F0aW9uUGFyYW1ldGVycyB7XG4gICAgc3dpdGNoICh0aGlzLl9jYWxlbmRhclZpZXcpIHtcbiAgICAgIGNhc2UgJ2RheSc6IHtcbiAgICAgICAgY29uc3QgaW5kZXhJblZpZXcgPSArZGF5IS5kYXlWYWx1ZSAtIDE7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdmVydGljYWxPZmZzZXQ6IERBWVNfUEVSX1JPVyxcbiAgICAgICAgICBlbGVtZW50SW5kZXhGb3JXaWRlTW9kZTogaW5kZXhJblZpZXcsXG4gICAgICAgICAgb2Zmc2V0Rm9yV2lkZU1vZGU6IGluZGV4IC0gaW5kZXhJblZpZXcsXG4gICAgICAgICAgbGFzdEVsZW1lbnRJbmRleEZvcldpZGVNb2RlOlxuICAgICAgICAgICAgaW5kZXggPT09IGluZGV4SW5WaWV3XG4gICAgICAgICAgICAgID8gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TnVtRGF5c0luTW9udGgoXG4gICAgICAgICAgICAgICAgICB0aGlzLl9kYXRlQWRhcHRlci5hZGRDYWxlbmRhck1vbnRocyhcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZGVzZXJpYWxpemUoZGF5IS52YWx1ZSkhLFxuICAgICAgICAgICAgICAgICAgICAtMSxcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICA6IGNlbGxzLmxlbmd0aCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIC8vIE1vbnRoIHZpZXcgaXMgbm90IGRlcGVuZGVudCBmcm9tIGB3aWRlYCB2YWx1ZSwgc28gc29tZSBwYXJhbWV0ZXJzIGFyZSBmaXhlZC5cbiAgICAgIGNhc2UgJ21vbnRoJzoge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHZlcnRpY2FsT2Zmc2V0OiBNT05USFNfUEVSX1JPVyxcbiAgICAgICAgICBlbGVtZW50SW5kZXhGb3JXaWRlTW9kZTogaW5kZXgsXG4gICAgICAgICAgb2Zmc2V0Rm9yV2lkZU1vZGU6IDAsXG4gICAgICAgICAgbGFzdEVsZW1lbnRJbmRleEZvcldpZGVNb2RlOiAxMixcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3llYXInOiB7XG4gICAgICAgIGNvbnN0IG9mZnNldDogbnVtYmVyID0gTWF0aC50cnVuYyhpbmRleCAvIFlFQVJTX1BFUl9QQUdFKSAqIFlFQVJTX1BFUl9QQUdFO1xuICAgICAgICBjb25zdCBpbmRleEluVmlldzogbnVtYmVyID0gb2Zmc2V0ID09PSAwID8gaW5kZXggOiBpbmRleCAtIFlFQVJTX1BFUl9QQUdFO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHZlcnRpY2FsT2Zmc2V0OiBZRUFSU19QRVJfUk9XLFxuICAgICAgICAgIGVsZW1lbnRJbmRleEZvcldpZGVNb2RlOiBpbmRleEluVmlldyxcbiAgICAgICAgICBvZmZzZXRGb3JXaWRlTW9kZTogaW5kZXggLSBpbmRleEluVmlldyxcbiAgICAgICAgICBsYXN0RWxlbWVudEluZGV4Rm9yV2lkZU1vZGU6IG9mZnNldCA9PT0gMCA/IFlFQVJTX1BFUl9QQUdFIDogWUVBUlNfUEVSX1BBR0UgKiAyLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBuZXh0IGVsZW1lbnQgb2YgdGhlIHByb3ZpZGVkIGFycmF5IHN0YXJ0aW5nIGZyb20gYGluZGV4YCBieSBhZGRpbmcgYGRlbHRhYC5cbiAgICogSWYgdGhlIGZvdW5kIGVsZW1lbnQgaXMgZGlzYWJsZWQsIGl0IGNvbnRpbnVlcyBhZGRpbmcgYGRlbHRhYCB1bnRpbCBpdCBmaW5kcyBhbiBlbmFibGVkIG9uZSBpbiB0aGUgYXJyYXkgYm91bmRzLlxuICAgKi9cbiAgcHJpdmF0ZSBfZmluZE5leHQoZGF5czogSFRNTEJ1dHRvbkVsZW1lbnRbXSwgaW5kZXg6IG51bWJlciwgZGVsdGE6IG51bWJlcik6IEhUTUxCdXR0b25FbGVtZW50IHtcbiAgICBsZXQgbmV4dEluZGV4ID0gaW5kZXggKyBkZWx0YTtcbiAgICB3aGlsZSAobmV4dEluZGV4IDwgZGF5cy5sZW5ndGggJiYgZGF5c1tuZXh0SW5kZXhdPy5kaXNhYmxlZCkge1xuICAgICAgbmV4dEluZGV4ICs9IGRlbHRhO1xuICAgIH1cbiAgICByZXR1cm4gZGF5c1tuZXh0SW5kZXhdID8/IGRheXNbaW5kZXhdO1xuICB9XG5cbiAgLyoqIEZpbmQgdGhlIGZpcnN0IGVuYWJsZWQgZWxlbWVudCBpbiB0aGUgcHJvdmlkZWQgYXJyYXkuICovXG4gIHByaXZhdGUgX2ZpbmRGaXJzdChkYXlzOiBIVE1MQnV0dG9uRWxlbWVudFtdLCBmaXJzdE9mQ3VycmVudE1vbnRoOiBudW1iZXIpOiBIVE1MQnV0dG9uRWxlbWVudCB7XG4gICAgcmV0dXJuICFkYXlzW2ZpcnN0T2ZDdXJyZW50TW9udGhdLmRpc2FibGVkXG4gICAgICA/IGRheXNbZmlyc3RPZkN1cnJlbnRNb250aF1cbiAgICAgIDogdGhpcy5fZmluZE5leHQoZGF5cywgZmlyc3RPZkN1cnJlbnRNb250aCwgMSk7XG4gIH1cblxuICAvKiogRmluZCB0aGUgbGFzdCBlbmFibGVkIGVsZW1lbnQgaW4gdGhlIHByb3ZpZGVkIGFycmF5LiAqL1xuICBwcml2YXRlIF9maW5kTGFzdChkYXlzOiBIVE1MQnV0dG9uRWxlbWVudFtdLCBsYXN0T2ZDdXJyZW50TW9udGg6IG51bWJlcik6IEhUTUxCdXR0b25FbGVtZW50IHtcbiAgICByZXR1cm4gIWRheXNbbGFzdE9mQ3VycmVudE1vbnRoXS5kaXNhYmxlZFxuICAgICAgPyBkYXlzW2xhc3RPZkN1cnJlbnRNb250aF1cbiAgICAgIDogdGhpcy5fZmluZE5leHQoZGF5cywgbGFzdE9mQ3VycmVudE1vbnRoLCAtMSk7XG4gIH1cblxuICAvKiogRmluZCB0aGUgZmlyc3QgZW5hYmxlZCBlbGVtZW50IGluIHRoZSBzYW1lIGNvbHVtbiBvZiB0aGUgcHJvdmlkZWQgYXJyYXkuICovXG4gIHByaXZhdGUgX2ZpbmRGaXJzdE9uQ29sdW1uKFxuICAgIGRheXM6IEhUTUxCdXR0b25FbGVtZW50W10sXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBvZmZzZXQ6IG51bWJlcixcbiAgICB2ZXJ0aWNhbE9mZnNldDogbnVtYmVyLFxuICApOiBIVE1MQnV0dG9uRWxlbWVudCB7XG4gICAgY29uc3QgbmV4dEluZGV4ID0gKGluZGV4ICUgdmVydGljYWxPZmZzZXQpICsgb2Zmc2V0O1xuICAgIHJldHVybiAhZGF5c1tuZXh0SW5kZXhdLmRpc2FibGVkXG4gICAgICA/IGRheXNbbmV4dEluZGV4XVxuICAgICAgOiB0aGlzLl9maW5kTmV4dChkYXlzLCBuZXh0SW5kZXgsIHZlcnRpY2FsT2Zmc2V0KTtcbiAgfVxuXG4gIC8qKiBGaW5kIHRoZSBsYXN0IGVuYWJsZWQgZWxlbWVudCBpbiB0aGUgc2FtZSBjb2x1bW4gb2YgdGhlIHByb3ZpZGVkIGFycmF5LiAqL1xuICBwcml2YXRlIF9maW5kTGFzdE9uQ29sdW1uKFxuICAgIGRheXM6IEhUTUxCdXR0b25FbGVtZW50W10sXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBvZmZzZXQ6IG51bWJlcixcbiAgICB2ZXJ0aWNhbE9mZnNldDogbnVtYmVyLFxuICApOiBIVE1MQnV0dG9uRWxlbWVudCB7XG4gICAgY29uc3QgbmV4dEluZGV4ID0gaW5kZXggKyBNYXRoLnRydW5jKChvZmZzZXQgLSBpbmRleCAtIDEpIC8gdmVydGljYWxPZmZzZXQpICogdmVydGljYWxPZmZzZXQ7XG4gICAgcmV0dXJuICFkYXlzW25leHRJbmRleF0uZGlzYWJsZWRcbiAgICAgID8gZGF5c1tuZXh0SW5kZXhdXG4gICAgICA6IHRoaXMuX2ZpbmROZXh0KGRheXMsIG5leHRJbmRleCwgLXZlcnRpY2FsT2Zmc2V0KTtcbiAgfVxuXG4gIHByaXZhdGUgX3Jlc2V0Q2FsZW5kYXJWaWV3KGluaXRUcmFuc2l0aW9uID0gZmFsc2UpOiB2b2lkIHtcbiAgICB0aGlzLl9yZXNldEZvY3VzID0gdHJ1ZTtcbiAgICB0aGlzLl9hY3RpdmVEYXRlID0gdGhpcy5zZWxlY3RlZCA/PyB0aGlzLm5vdztcbiAgICB0aGlzLl9zZXRDaG9zZW5ZZWFyKCk7XG4gICAgdGhpcy5fY2hvc2VuTW9udGggPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fbmV4dENhbGVuZGFyVmlldyA9IHRoaXMuX2NhbGVuZGFyVmlldyA9IHRoaXMudmlldztcblxuICAgIGlmIChpbml0VHJhbnNpdGlvbikge1xuICAgICAgdGhpcy5fc3RhcnRUYWJsZVRyYW5zaXRpb24oKTtcbiAgICB9XG4gIH1cblxuICAvKiogUmVuZGVyIHRoZSB2aWV3IGZvciB0aGUgZGF5IHNlbGVjdGlvbi4gKi9cbiAgcHJpdmF0ZSBfcmVuZGVyRGF5VmlldygpOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgY29uc3QgbmV4dE1vbnRoQWN0aXZlRGF0ZSA9IHRoaXMuX3dpZGVcbiAgICAgID8gdGhpcy5fZGF0ZUFkYXB0ZXIuYWRkQ2FsZW5kYXJNb250aHModGhpcy5fYWN0aXZlRGF0ZSwgMSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiBodG1sYFxuICAgICAgPGRpdiBjbGFzcz1cInNiYi1jYWxlbmRhcl9fY29udHJvbHNcIj5cbiAgICAgICAgJHt0aGlzLl9nZXRBcnJvdyhcbiAgICAgICAgICAnbGVmdCcsXG4gICAgICAgICAgKCkgPT4gdGhpcy5fZ29Ub0RpZmZlcmVudE1vbnRoKC0xKSxcbiAgICAgICAgICBpMThuUHJldmlvdXNNb250aFt0aGlzLl9sYW5ndWFnZS5jdXJyZW50XSxcbiAgICAgICAgICB0aGlzLl9wcmV2aW91c01vbnRoRGlzYWJsZWQoKSxcbiAgICAgICAgKX1cbiAgICAgICAgPGRpdiBjbGFzcz1cInNiYi1jYWxlbmRhcl9fY29udHJvbHMtbW9udGhcIj5cbiAgICAgICAgICAke3RoaXMuX2NyZWF0ZUxhYmVsRm9yRGF5Vmlldyh0aGlzLl9hY3RpdmVEYXRlKX1cbiAgICAgICAgICAke3RoaXMuX3dpZGUgPyB0aGlzLl9jcmVhdGVMYWJlbEZvckRheVZpZXcobmV4dE1vbnRoQWN0aXZlRGF0ZSEpIDogbm90aGluZ31cbiAgICAgICAgICA8c2JiLXNjcmVlbi1yZWFkZXItb25seSByb2xlPVwic3RhdHVzXCI+XG4gICAgICAgICAgICAke3RoaXMuX2NyZWF0ZUFyaWFMYWJlbEZvckRheVZpZXcodGhpcy5fYWN0aXZlRGF0ZSwgbmV4dE1vbnRoQWN0aXZlRGF0ZSEpfVxuICAgICAgICAgIDwvc2JiLXNjcmVlbi1yZWFkZXItb25seT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgICR7dGhpcy5fZ2V0QXJyb3coXG4gICAgICAgICAgJ3JpZ2h0JyxcbiAgICAgICAgICAoKSA9PiB0aGlzLl9nb1RvRGlmZmVyZW50TW9udGgoMSksXG4gICAgICAgICAgaTE4bk5leHRNb250aFt0aGlzLl9sYW5ndWFnZS5jdXJyZW50XSxcbiAgICAgICAgICB0aGlzLl9uZXh0TW9udGhEaXNhYmxlZCgpLFxuICAgICAgICApfVxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwic2JiLWNhbGVuZGFyX190YWJsZS1jb250YWluZXIgc2JiLWNhbGVuZGFyX190YWJsZS1kYXktdmlld1wiPlxuICAgICAgICAke3RoaXMuX2NyZWF0ZURheVRhYmxlKHRoaXMuX3dlZWtzKX1cbiAgICAgICAgJHt0aGlzLl93aWRlID8gdGhpcy5fY3JlYXRlRGF5VGFibGUodGhpcy5fbmV4dE1vbnRoV2Vla3MpIDogbm90aGluZ31cbiAgICAgIDwvZGl2PlxuICAgIGA7XG4gIH1cblxuICAvKiogQ3JlYXRlcyB0aGUgbGFiZWwgd2l0aCB0aGUgbW9udGggZm9yIHRoZSBkYWlseSB2aWV3LiAqL1xuICBwcml2YXRlIF9jcmVhdGVMYWJlbEZvckRheVZpZXcoZDogVCk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICBjb25zdCBtb250aExhYmVsID0gYCR7XG4gICAgICB0aGlzLl9tb250aE5hbWVzW3RoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoKGQpIC0gMV1cbiAgICB9ICR7dGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcihkKX1gO1xuICAgIHJldHVybiBodG1sYFxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgaWQ9XCJzYmItY2FsZW5kYXJfX2RhdGUtc2VsZWN0aW9uXCJcbiAgICAgICAgY2xhc3M9XCJzYmItY2FsZW5kYXJfX2NvbnRyb2xzLWNoYW5nZS1kYXRlXCJcbiAgICAgICAgYXJpYS1sYWJlbD1cIiR7aTE4blllYXJNb250aFNlbGVjdGlvblt0aGlzLl9sYW5ndWFnZS5jdXJyZW50XX0gJHttb250aExhYmVsfVwiXG4gICAgICAgIEBjbGljaz0keygpID0+IHtcbiAgICAgICAgICB0aGlzLl9yZXNldEZvY3VzID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLl9uZXh0Q2FsZW5kYXJWaWV3ID0gJ3llYXInO1xuICAgICAgICAgIHRoaXMuX3N0YXJ0VGFibGVUcmFuc2l0aW9uKCk7XG4gICAgICAgIH19XG4gICAgICA+XG4gICAgICAgICR7bW9udGhMYWJlbH1cbiAgICAgICAgPHNiYi1pY29uIG5hbWU9XCJjaGV2cm9uLXNtYWxsLWRvd24tc21hbGxcIj48L3NiYi1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgYDtcbiAgfVxuXG4gIC8qKiBDcmVhdGVzIHRoZSBhcmlhLWxhYmVsIGZvciB0aGUgZGFpbHkgdmlldy4gKi9cbiAgcHJpdmF0ZSBfY3JlYXRlQXJpYUxhYmVsRm9yRGF5VmlldyguLi5kYXRlczogVFtdKTogc3RyaW5nIHtcbiAgICBsZXQgbW9udGhMYWJlbCA9ICcnO1xuICAgIGZvciAoY29uc3QgZCBvZiBkYXRlcykge1xuICAgICAgaWYgKGQpIHtcbiAgICAgICAgbW9udGhMYWJlbCArPSBgJHtcbiAgICAgICAgICB0aGlzLl9tb250aE5hbWVzW3RoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoKGQpIC0gMV1cbiAgICAgICAgfSAke3RoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIoZCl9IGA7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtb250aExhYmVsO1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgdGhlIGNhbGVuZGFyIHRhYmxlIGZvciB0aGUgZGFpbHkgdmlldy4gKi9cbiAgcHJpdmF0ZSBfY3JlYXRlRGF5VGFibGUod2Vla3M6IERheVtdW10pOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8dGFibGVcbiAgICAgICAgY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlXCJcbiAgICAgICAgQGZvY3Vzb3V0PSR7KGV2ZW50OiBGb2N1c0V2ZW50KSA9PlxuICAgICAgICAgIHRoaXMuX2hhbmRsZVRhYmxlQmx1cihldmVudC5yZWxhdGVkVGFyZ2V0IGFzIEhUTUxFbGVtZW50KX1cbiAgICAgICAgQGFuaW1hdGlvbmVuZD0keyhlOiBBbmltYXRpb25FdmVudCkgPT4gdGhpcy5fdGFibGVBbmltYXRpb25FbmQoZSl9XG4gICAgICA+XG4gICAgICAgIDx0aGVhZCBjbGFzcz1cInNiYi1jYWxlbmRhcl9fdGFibGUtaGVhZGVyXCI+XG4gICAgICAgICAgPHRyIGNsYXNzPVwic2JiLWNhbGVuZGFyX190YWJsZS1oZWFkZXItcm93XCI+XG4gICAgICAgICAgICAke3RoaXMuX2NyZWF0ZURheVRhYmxlSGVhZGVyKCl9XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC90aGVhZD5cbiAgICAgICAgPHRib2R5IGNsYXNzPVwic2JiLWNhbGVuZGFyX190YWJsZS1ib2R5XCI+XG4gICAgICAgICAgJHt0aGlzLl9jcmVhdGVEYXlUYWJsZUJvZHkod2Vla3MpfVxuICAgICAgICA8L3Rib2R5PlxuICAgICAgPC90YWJsZT5cbiAgICBgO1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgdGhlIHRhYmxlIGhlYWRlciB3aXRoIHRoZSBtb250aCBoZWFkZXIgY2VsbHMuICovXG4gIHByaXZhdGUgX2NyZWF0ZURheVRhYmxlSGVhZGVyKCk6IFRlbXBsYXRlUmVzdWx0W10ge1xuICAgIHJldHVybiB0aGlzLl93ZWVrZGF5cy5tYXAoXG4gICAgICAoZGF5OiBXZWVrZGF5KSA9PiBodG1sYFxuICAgICAgICA8dGggY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlLWhlYWRlclwiPlxuICAgICAgICAgIDxzYmItc2NyZWVuLXJlYWRlci1vbmx5PiR7ZGF5Lmxvbmd9PC9zYmItc2NyZWVuLXJlYWRlci1vbmx5PlxuICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiR7ZGF5Lm5hcnJvd308L3NwYW4+XG4gICAgICAgIDwvdGg+XG4gICAgICBgLFxuICAgICk7XG4gIH1cblxuICAvKiogQ3JlYXRlcyB0aGUgdGFibGUgYm9keSB3aXRoIHRoZSBkYXkgY2VsbHMuIEZvciB0aGUgZmlyc3Qgcm93LCBpdCBhbHNvIGNvbnNpZGVycyB0aGUgcG9zc2libGUgZGF5J3Mgb2Zmc2V0LiAqL1xuICBwcml2YXRlIF9jcmVhdGVEYXlUYWJsZUJvZHkod2Vla3M6IERheVtdW10pOiBUZW1wbGF0ZVJlc3VsdFtdIHtcbiAgICBjb25zdCB0b2RheTogc3RyaW5nID0gdGhpcy5fZGF0ZUFkYXB0ZXIudG9Jc284NjAxKHRoaXMubm93KTtcbiAgICByZXR1cm4gd2Vla3MubWFwKCh3ZWVrOiBEYXlbXSwgcm93SW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3QgZmlyc3RSb3dPZmZzZXQ6IG51bWJlciA9IERBWVNfUEVSX1JPVyAtIHdlZWsubGVuZ3RoO1xuICAgICAgaWYgKHJvd0luZGV4ID09PSAwICYmIGZpcnN0Um93T2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiBodG1sYFxuICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICR7Wy4uLkFycmF5KGZpcnN0Um93T2Zmc2V0KS5rZXlzKCldLm1hcChcbiAgICAgICAgICAgICAgKCkgPT5cbiAgICAgICAgICAgICAgICBodG1sYDx0ZFxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlLWRhdGFcIlxuICAgICAgICAgICAgICAgICAgZGF0YS1kYXk9JHtgMCAke3dlZWtbMF0ubW9udGhWYWx1ZX0gJHt3ZWVrWzBdLnllYXJWYWx1ZX1gfVxuICAgICAgICAgICAgICAgID48L3RkPmAsXG4gICAgICAgICAgICApfVxuICAgICAgICAgICAgJHt0aGlzLl9jcmVhdGVEYXlDZWxscyh3ZWVrLCB0b2RheSl9XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgYDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBodG1sYDx0cj5cbiAgICAgICAgJHt0aGlzLl9jcmVhdGVEYXlDZWxscyh3ZWVrLCB0b2RheSl9XG4gICAgICA8L3RyPmA7XG4gICAgfSk7XG4gIH1cblxuICAvKiogQ3JlYXRlcyB0aGUgY2VsbHMgZm9yIHRoZSBkYWlseSB2aWV3LiAqL1xuICBwcml2YXRlIF9jcmVhdGVEYXlDZWxscyh3ZWVrOiBEYXlbXSwgdG9kYXk6IHN0cmluZyk6IFRlbXBsYXRlUmVzdWx0W10ge1xuICAgIHJldHVybiB3ZWVrLm1hcCgoZGF5OiBEYXkpID0+IHtcbiAgICAgIGNvbnN0IGlzT3V0T2ZSYW5nZSA9ICF0aGlzLl9pc0RheUluUmFuZ2UoZGF5LnZhbHVlKTtcbiAgICAgIGNvbnN0IGlzRmlsdGVyZWRPdXQgPSAhdGhpcy5fZGF0ZUZpbHRlcih0aGlzLl9kYXRlQWRhcHRlci5kZXNlcmlhbGl6ZShkYXkudmFsdWUpISk7XG4gICAgICBjb25zdCBzZWxlY3RlZDogYm9vbGVhbiA9ICEhdGhpcy5fc2VsZWN0ZWQgJiYgZGF5LnZhbHVlID09PSB0aGlzLl9zZWxlY3RlZDtcbiAgICAgIGNvbnN0IGRheVZhbHVlID0gYCR7ZGF5LmRheVZhbHVlfSAke2RheS5tb250aFZhbHVlfSAke2RheS55ZWFyVmFsdWV9YDtcbiAgICAgIGNvbnN0IGlzVG9kYXkgPSBkYXkudmFsdWUgPT09IHRvZGF5O1xuICAgICAgcmV0dXJuIGh0bWxgXG4gICAgICAgIDx0ZFxuICAgICAgICAgIGNsYXNzPSR7Y2xhc3NNYXAoe1xuICAgICAgICAgICAgJ3NiYi1jYWxlbmRhcl9fdGFibGUtZGF0YSc6IHRydWUsXG4gICAgICAgICAgICAnc2JiLWNhbGVuZGFyX190YWJsZS1kYXRhLXNlbGVjdGVkJzogc2VsZWN0ZWQsXG4gICAgICAgICAgfSl9XG4gICAgICAgID5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBjbGFzcz0ke2NsYXNzTWFwKHtcbiAgICAgICAgICAgICAgJ3NiYi1jYWxlbmRhcl9fY2VsbCc6IHRydWUsXG4gICAgICAgICAgICAgICdzYmItY2FsZW5kYXJfX2RheSc6IHRydWUsXG4gICAgICAgICAgICAgICdzYmItY2FsZW5kYXJfX2NlbGwtY3VycmVudCc6IGlzVG9kYXksXG4gICAgICAgICAgICAgICdzYmItY2FsZW5kYXJfX3NlbGVjdGVkJzogc2VsZWN0ZWQsXG4gICAgICAgICAgICAgICdzYmItY2FsZW5kYXJfX2Nyb3NzZWQtb3V0JzogIWlzT3V0T2ZSYW5nZSAmJiBpc0ZpbHRlcmVkT3V0LFxuICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiB0aGlzLl9zZWxlY3REYXRlKGRheS52YWx1ZSl9XG4gICAgICAgICAgICA/ZGlzYWJsZWQ9JHtpc091dE9mUmFuZ2UgfHwgaXNGaWx0ZXJlZE91dH1cbiAgICAgICAgICAgIGFyaWEtbGFiZWw9JHt0aGlzLl9kYXRlQWRhcHRlci5nZXRBY2Nlc3NpYmlsaXR5Rm9ybWF0RGF0ZShkYXkudmFsdWUpfVxuICAgICAgICAgICAgYXJpYS1wcmVzc2VkPSR7c2VsZWN0ZWR9XG4gICAgICAgICAgICBhcmlhLWRpc2FibGVkPSR7aXNPdXRPZlJhbmdlIHx8IGlzRmlsdGVyZWRPdXR9XG4gICAgICAgICAgICBhcmlhLWN1cnJlbnQ9JHtpc1RvZGF5ID8gJ2RhdGUnIDogbm90aGluZ31cbiAgICAgICAgICAgIGRhdGEtZGF5PSR7ZGF5VmFsdWUgfHwgbm90aGluZ31cbiAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgQGtleWRvd249JHsoZXZ0OiBLZXlib2FyZEV2ZW50KSA9PiB0aGlzLl9oYW5kbGVLZXlib2FyZEV2ZW50KGV2dCwgZGF5KX1cbiAgICAgICAgICAgIHNiYi1wb3BvdmVyLWNsb3NlXG4gICAgICAgICAgPlxuICAgICAgICAgICAgJHtkYXkuZGF5VmFsdWV9XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvdGQ+XG4gICAgICBgO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIFJlbmRlciB0aGUgdmlldyBmb3IgdGhlIG1vbnRoIHNlbGVjdGlvbi4gKi9cbiAgcHJpdmF0ZSBfcmVuZGVyTW9udGhWaWV3KCk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxkaXYgY2xhc3M9XCJzYmItY2FsZW5kYXJfX2NvbnRyb2xzXCI+XG4gICAgICAgICR7dGhpcy5fZ2V0QXJyb3coXG4gICAgICAgICAgJ2xlZnQnLFxuICAgICAgICAgICgpID0+IHRoaXMuX2dvVG9EaWZmZXJlbnRZZWFyKC0xKSxcbiAgICAgICAgICBpMThuUHJldmlvdXNZZWFyW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdLFxuICAgICAgICAgIHRoaXMuX3ByZXZpb3VzWWVhckRpc2FibGVkKCksXG4gICAgICAgICl9XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzYmItY2FsZW5kYXJfX2NvbnRyb2xzLW1vbnRoXCI+JHt0aGlzLl9jcmVhdGVMYWJlbEZvck1vbnRoVmlldygpfTwvZGl2PlxuICAgICAgICAke3RoaXMuX2dldEFycm93KFxuICAgICAgICAgICdyaWdodCcsXG4gICAgICAgICAgKCkgPT4gdGhpcy5fZ29Ub0RpZmZlcmVudFllYXIoMSksXG4gICAgICAgICAgaTE4bk5leHRZZWFyW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdLFxuICAgICAgICAgIHRoaXMuX25leHRZZWFyRGlzYWJsZWQoKSxcbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInNiYi1jYWxlbmRhcl9fdGFibGUtY29udGFpbmVyIHNiYi1jYWxlbmRhcl9fdGFibGUtbW9udGgtdmlld1wiPlxuICAgICAgICAke3RoaXMuX2NyZWF0ZU1vbnRoVGFibGUodGhpcy5fbW9udGhzLCB0aGlzLl9jaG9zZW5ZZWFyISl9XG4gICAgICAgICR7dGhpcy5fd2lkZSA/IHRoaXMuX2NyZWF0ZU1vbnRoVGFibGUodGhpcy5fbW9udGhzLCB0aGlzLl9jaG9zZW5ZZWFyISArIDEsIHRydWUpIDogbm90aGluZ31cbiAgICAgIDwvZGl2PlxuICAgIGA7XG4gIH1cblxuICAvKiogQ3JlYXRlcyB0aGUgbGFiZWwgd2l0aCB0aGUgeWVhciBmb3IgdGhlIG1vbnRobHkgdmlldy4gKi9cbiAgcHJpdmF0ZSBfY3JlYXRlTGFiZWxGb3JNb250aFZpZXcoKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIHJldHVybiBodG1sYCA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBpZD1cInNiYi1jYWxlbmRhcl9fbW9udGgtc2VsZWN0aW9uXCJcbiAgICAgICAgY2xhc3M9XCJzYmItY2FsZW5kYXJfX2NvbnRyb2xzLWNoYW5nZS1kYXRlXCJcbiAgICAgICAgYXJpYS1sYWJlbD0ke2Ake2kxOG5DYWxlbmRhckRhdGVTZWxlY3Rpb25bdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF19ICR7dGhpcy5fY2hvc2VuWWVhcn1gfVxuICAgICAgICBAY2xpY2s9JHsoKSA9PiB0aGlzLl9yZXNldENhbGVuZGFyVmlldyh0cnVlKX1cbiAgICAgID5cbiAgICAgICAgJHt0aGlzLl9jaG9zZW5ZZWFyfSAke3RoaXMuX3dpZGUgPyBgIC0gJHt0aGlzLl9jaG9zZW5ZZWFyISArIDF9YCA6IG5vdGhpbmd9XG4gICAgICAgIDxzYmItaWNvbiBuYW1lPVwiY2hldnJvbi1zbWFsbC11cC1zbWFsbFwiPjwvc2JiLWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxzYmItc2NyZWVuLXJlYWRlci1vbmx5IHJvbGU9XCJzdGF0dXNcIj4gJHt0aGlzLl9jaG9zZW5ZZWFyfSA8L3NiYi1zY3JlZW4tcmVhZGVyLW9ubHk+YDtcbiAgfVxuXG4gIC8qKiBDcmVhdGVzIHRoZSB0YWJsZSBmb3IgdGhlIG1vbnRoIHNlbGVjdGlvbiB2aWV3LiAqL1xuICBwcml2YXRlIF9jcmVhdGVNb250aFRhYmxlKG1vbnRoczogTW9udGhbXVtdLCB5ZWFyOiBudW1iZXIsIHNoaWZ0UmlnaHQgPSBmYWxzZSk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDx0YWJsZVxuICAgICAgICBjbGFzcz1cInNiYi1jYWxlbmRhcl9fdGFibGVcIlxuICAgICAgICBAYW5pbWF0aW9uZW5kPSR7KGU6IEFuaW1hdGlvbkV2ZW50KSA9PiB0aGlzLl90YWJsZUFuaW1hdGlvbkVuZChlKX1cbiAgICAgID5cbiAgICAgICAgJHt0aGlzLl93aWRlXG4gICAgICAgICAgPyBodG1sYDx0aGVhZCBjbGFzcz1cInNiYi1jYWxlbmRhcl9fdGFibGUtaGVhZGVyXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgIDx0ciBjbGFzcz1cInNiYi1jYWxlbmRhcl9fdGFibGUtaGVhZGVyLXJvd1wiPlxuICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cInNiYi1jYWxlbmRhcl9fdGFibGUtaGVhZGVyXCIgY29sc3Bhbj0ke01PTlRIU19QRVJfUk9XfT4ke3llYXJ9PC90aD5cbiAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDwvdGhlYWQ+YFxuICAgICAgICAgIDogbm90aGluZ31cbiAgICAgICAgPHRib2R5IGNsYXNzPVwic2JiLWNhbGVuZGFyX190YWJsZS1ib2R5XCI+XG4gICAgICAgICAgJHttb250aHMubWFwKFxuICAgICAgICAgICAgKHJvdzogTW9udGhbXSkgPT4gaHRtbGBcbiAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICR7cm93Lm1hcCgobW9udGg6IE1vbnRoKSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBpc091dE9mUmFuZ2UgPSAhdGhpcy5faXNNb250aEluUmFuZ2UobW9udGgubW9udGhWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBpc0ZpbHRlcmVkT3V0ID0gIXRoaXMuX2lzTW9udGhGaWx0ZXJlZE91dChtb250aC5tb250aFZhbHVlKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkTW9udGggPSB0aGlzLl9zZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoKHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKHRoaXMuX3NlbGVjdGVkKSEpXG4gICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRZZWFyID0gdGhpcy5fc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKHRoaXMuX3NlbGVjdGVkKSEpXG4gICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWQ6IGJvb2xlYW4gPVxuICAgICAgICAgICAgICAgICAgICAhIXRoaXMuX3NlbGVjdGVkICYmIHllYXIgPT09IHNlbGVjdGVkWWVhciAmJiBtb250aC5tb250aFZhbHVlID09PSBzZWxlY3RlZE1vbnRoO1xuXG4gICAgICAgICAgICAgICAgICBjb25zdCBpc0N1cnJlbnRNb250aCA9XG4gICAgICAgICAgICAgICAgICAgIHllYXIgPT09IHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIodGhpcy5ub3cpICYmXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoKHRoaXMubm93KSA9PT0gbW9udGgubW9udGhWYWx1ZTtcblxuICAgICAgICAgICAgICAgICAgcmV0dXJuIGh0bWxgIDx0ZFxuICAgICAgICAgICAgICAgICAgICBjbGFzcz0ke2NsYXNzTWFwKHtcbiAgICAgICAgICAgICAgICAgICAgICAnc2JiLWNhbGVuZGFyX190YWJsZS1kYXRhJzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAnc2JiLWNhbGVuZGFyX190YWJsZS1tb250aCc6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9JHtjbGFzc01hcCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAnc2JiLWNhbGVuZGFyX19jZWxsJzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICdzYmItY2FsZW5kYXJfX3BpbGwnOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3NiYi1jYWxlbmRhcl9fY2VsbC1jdXJyZW50JzogaXNDdXJyZW50TW9udGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAnc2JiLWNhbGVuZGFyX19jcm9zc2VkLW91dCc6ICFpc091dE9mUmFuZ2UgJiYgaXNGaWx0ZXJlZE91dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICdzYmItY2FsZW5kYXJfX3NlbGVjdGVkJzogc2VsZWN0ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy5fb25Nb250aFNlbGVjdGlvbihtb250aC5tb250aFZhbHVlLCB5ZWFyLCBzaGlmdFJpZ2h0KX1cbiAgICAgICAgICAgICAgICAgICAgICA/ZGlzYWJsZWQ9JHtpc091dE9mUmFuZ2UgfHwgaXNGaWx0ZXJlZE91dH1cbiAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPSR7YCR7bW9udGgubG9uZ1ZhbHVlfSAke3RoaXMuX2Nob3NlblllYXJ9YH1cbiAgICAgICAgICAgICAgICAgICAgICBhcmlhLXByZXNzZWQ9JHtzZWxlY3RlZH1cbiAgICAgICAgICAgICAgICAgICAgICBhcmlhLWRpc2FibGVkPSR7U3RyaW5nKGlzT3V0T2ZSYW5nZSB8fCBpc0ZpbHRlcmVkT3V0KX1cbiAgICAgICAgICAgICAgICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICAgICAgICAgICAgICBkYXRhLW1vbnRoPSR7bW9udGgubW9udGhWYWx1ZSB8fCBub3RoaW5nfVxuICAgICAgICAgICAgICAgICAgICAgIEBrZXlkb3duPSR7KGV2dDogS2V5Ym9hcmRFdmVudCkgPT4gdGhpcy5faGFuZGxlS2V5Ym9hcmRFdmVudChldnQpfVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgJHttb250aC52YWx1ZX1cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8L3RkPmA7XG4gICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICBgLFxuICAgICAgICAgICl9XG4gICAgICAgIDwvdGJvZHk+XG4gICAgICA8L3RhYmxlPlxuICAgIGA7XG4gIH1cblxuICAvKiogU2VsZWN0IHRoZSBtb250aCBhbmQgY2hhbmdlIHRoZSB2aWV3IHRvIGRheSBzZWxlY3Rpb24uICovXG4gIHByaXZhdGUgX29uTW9udGhTZWxlY3Rpb24obW9udGg6IG51bWJlciwgeWVhcjogbnVtYmVyLCBzaGlmdFJpZ2h0OiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5fY2hvc2VuTW9udGggPSBzaGlmdFJpZ2h0ID8gbW9udGggKyAxIDogbW9udGg7XG4gICAgdGhpcy5fbmV4dENhbGVuZGFyVmlldyA9ICdkYXknO1xuICAgIHRoaXMuX2luaXQoXG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5jcmVhdGVEYXRlKFxuICAgICAgICB5ZWFyLFxuICAgICAgICB0aGlzLl9jaG9zZW5Nb250aCxcbiAgICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0RGF0ZSh0aGlzLl9hY3RpdmVEYXRlKSxcbiAgICAgICksXG4gICAgKTtcbiAgICB0aGlzLl9zdGFydFRhYmxlVHJhbnNpdGlvbigpO1xuICB9XG5cbiAgLyoqIFJlbmRlciB0aGUgdmlldyBmb3IgdGhlIHllYXIgc2VsZWN0aW9uLiAqL1xuICBwcml2YXRlIF9yZW5kZXJZZWFyVmlldygpOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8ZGl2IGNsYXNzPVwic2JiLWNhbGVuZGFyX19jb250cm9sc1wiPlxuICAgICAgICAke3RoaXMuX2dldEFycm93KFxuICAgICAgICAgICdsZWZ0JyxcbiAgICAgICAgICAoKSA9PiB0aGlzLl9nb1RvRGlmZmVyZW50WWVhclJhbmdlKC1ZRUFSU19QRVJfUEFHRSksXG4gICAgICAgICAgaTE4blByZXZpb3VzWWVhclJhbmdlKFlFQVJTX1BFUl9QQUdFKVt0aGlzLl9sYW5ndWFnZS5jdXJyZW50XSxcbiAgICAgICAgICB0aGlzLl9wcmV2aW91c1llYXJSYW5nZURpc2FibGVkKCksXG4gICAgICAgICl9XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzYmItY2FsZW5kYXJfX2NvbnRyb2xzLW1vbnRoXCI+JHt0aGlzLl9jcmVhdGVMYWJlbEZvclllYXJWaWV3KCl9PC9kaXY+XG4gICAgICAgICR7dGhpcy5fZ2V0QXJyb3coXG4gICAgICAgICAgJ3JpZ2h0JyxcbiAgICAgICAgICAoKSA9PiB0aGlzLl9nb1RvRGlmZmVyZW50WWVhclJhbmdlKFlFQVJTX1BFUl9QQUdFKSxcbiAgICAgICAgICBpMThuTmV4dFllYXJSYW5nZShZRUFSU19QRVJfUEFHRSlbdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF0sXG4gICAgICAgICAgdGhpcy5fbmV4dFllYXJSYW5nZURpc2FibGVkKCksXG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlLWNvbnRhaW5lciBzYmItY2FsZW5kYXJfX3RhYmxlLXllYXItdmlld1wiPlxuICAgICAgICAke3RoaXMuX2NyZWF0ZVllYXJUYWJsZSh0aGlzLl95ZWFycyl9XG4gICAgICAgICR7dGhpcy5fd2lkZSA/IHRoaXMuX2NyZWF0ZVllYXJUYWJsZSh0aGlzLl9uZXh0TW9udGhZZWFycywgdHJ1ZSkgOiBub3RoaW5nfVxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxuXG4gIC8qKiBDcmVhdGVzIHRoZSBidXR0b24gYXJyb3cgZm9yIGFsbCB0aGUgdmlld3MuICovXG4gIHByaXZhdGUgX2dldEFycm93KFxuICAgIGRpcmVjdGlvbjogJ2xlZnQnIHwgJ3JpZ2h0JyxcbiAgICBjbGljazogKCkgPT4gdm9pZCxcbiAgICBhcmlhTGFiZWw6IHN0cmluZyxcbiAgICBkaXNhYmxlZDogYm9vbGVhbixcbiAgKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIHJldHVybiBodG1sYDxzYmItc2Vjb25kYXJ5LWJ1dHRvblxuICAgICAgc2l6ZT1cIm1cIlxuICAgICAgaWNvbi1uYW1lPVwiY2hldnJvbi1zbWFsbC0ke2RpcmVjdGlvbn0tc21hbGxcIlxuICAgICAgYXJpYS1sYWJlbD0ke2FyaWFMYWJlbH1cbiAgICAgIEBjbGljaz0ke2NsaWNrfVxuICAgICAgP2Rpc2FibGVkPSR7ZGlzYWJsZWR9XG4gICAgICBpZD1cInNiYi1jYWxlbmRhcl9fY29udHJvbHMtJHtkaXJlY3Rpb24gPT09ICdsZWZ0JyA/ICdwcmV2aW91cycgOiAnbmV4dCd9XCJcbiAgICA+PC9zYmItc2Vjb25kYXJ5LWJ1dHRvbj5gO1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgdGhlIGxhYmVsIHdpdGggdGhlIHllYXIgcmFuZ2UgZm9yIHRoZSB5ZWFybHkgdmlldy4gKi9cbiAgcHJpdmF0ZSBfY3JlYXRlTGFiZWxGb3JZZWFyVmlldygpOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgY29uc3QgZmlyc3RZZWFyOiBudW1iZXIgPSB0aGlzLl95ZWFycy5mbGF0KClbMF07XG4gICAgY29uc3QgbGFzdFllYXJBcnJheTogbnVtYmVyW10gPSAoXG4gICAgICBpc0JyZWFrcG9pbnQoJ21lZGl1bScpICYmIHRoaXMud2lkZSA/IHRoaXMuX25leHRNb250aFllYXJzIDogdGhpcy5feWVhcnNcbiAgICApLmZsYXQoKTtcbiAgICBjb25zdCBsYXN0WWVhcjogbnVtYmVyID0gbGFzdFllYXJBcnJheVtsYXN0WWVhckFycmF5Lmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IHllYXJMYWJlbCA9IGAke2ZpcnN0WWVhcn0gLSAke2xhc3RZZWFyfWA7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBpZD1cInNiYi1jYWxlbmRhcl9feWVhci1zZWxlY3Rpb25cIlxuICAgICAgICBjbGFzcz1cInNiYi1jYWxlbmRhcl9fY29udHJvbHMtY2hhbmdlLWRhdGVcIlxuICAgICAgICBhcmlhLWxhYmVsPVwiJHtpMThuQ2FsZW5kYXJEYXRlU2VsZWN0aW9uW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdfSAke3llYXJMYWJlbH1cIlxuICAgICAgICBAY2xpY2s9JHsoKSA9PiB0aGlzLl9yZXNldENhbGVuZGFyVmlldyh0cnVlKX1cbiAgICAgID5cbiAgICAgICAgJHt5ZWFyTGFiZWx9XG4gICAgICAgIDxzYmItaWNvbiBuYW1lPVwiY2hldnJvbi1zbWFsbC11cC1zbWFsbFwiPjwvc2JiLWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxzYmItc2NyZWVuLXJlYWRlci1vbmx5IHJvbGU9XCJzdGF0dXNcIj4gJHt5ZWFyTGFiZWx9IDwvc2JiLXNjcmVlbi1yZWFkZXItb25seT5cbiAgICBgO1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgdGhlIHRhYmxlIGZvciB0aGUgeWVhciBzZWxlY3Rpb24gdmlldy4gKi9cbiAgcHJpdmF0ZSBfY3JlYXRlWWVhclRhYmxlKHllYXJzOiBudW1iZXJbXVtdLCBzaGlmdFJpZ2h0ID0gZmFsc2UpOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgY29uc3Qgbm93ID0gdGhpcy5ub3c7XG4gICAgcmV0dXJuIGh0bWxgIDx0YWJsZVxuICAgICAgY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlXCJcbiAgICAgIEBhbmltYXRpb25lbmQ9JHsoZTogQW5pbWF0aW9uRXZlbnQpID0+IHRoaXMuX3RhYmxlQW5pbWF0aW9uRW5kKGUpfVxuICAgID5cbiAgICAgIDx0Ym9keSBjbGFzcz1cInNiYi1jYWxlbmRhcl9fdGFibGUtYm9keVwiPlxuICAgICAgICAke3llYXJzLm1hcChcbiAgICAgICAgICAocm93OiBudW1iZXJbXSkgPT5cbiAgICAgICAgICAgIGh0bWxgIDx0cj5cbiAgICAgICAgICAgICAgJHtyb3cubWFwKCh5ZWFyOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpc091dE9mUmFuZ2UgPSAhdGhpcy5faXNZZWFySW5SYW5nZSh5ZWFyKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpc0ZpbHRlcmVkT3V0ID0gIXRoaXMuX2lzWWVhckZpbHRlcmVkT3V0KHllYXIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkWWVhciA9IHRoaXMuX3NlbGVjdGVkXG4gICAgICAgICAgICAgICAgICA/IHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIodGhpcy5fZGF0ZUFkYXB0ZXIuZGVzZXJpYWxpemUodGhpcy5fc2VsZWN0ZWQpISlcbiAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkOiBib29sZWFuID0gISF0aGlzLl9zZWxlY3RlZCAmJiB5ZWFyID09PSBzZWxlY3RlZFllYXI7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNDdXJyZW50WWVhciA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIobm93KSA9PT0geWVhcjtcbiAgICAgICAgICAgICAgICByZXR1cm4gaHRtbGAgPHRkIGNsYXNzPVwic2JiLWNhbGVuZGFyX190YWJsZS1kYXRhIHNiYi1jYWxlbmRhcl9fdGFibGUteWVhclwiPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBjbGFzcz0ke2NsYXNzTWFwKHtcbiAgICAgICAgICAgICAgICAgICAgICAnc2JiLWNhbGVuZGFyX19jZWxsJzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAnc2JiLWNhbGVuZGFyX19waWxsJzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAnc2JiLWNhbGVuZGFyX19jZWxsLWN1cnJlbnQnOiBpc0N1cnJlbnRZZWFyLFxuICAgICAgICAgICAgICAgICAgICAgICdzYmItY2FsZW5kYXJfX2Nyb3NzZWQtb3V0JzogIWlzT3V0T2ZSYW5nZSAmJiBpc0ZpbHRlcmVkT3V0LFxuICAgICAgICAgICAgICAgICAgICAgICdzYmItY2FsZW5kYXJfX3NlbGVjdGVkJzogc2VsZWN0ZWQsXG4gICAgICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiB0aGlzLl9vblllYXJTZWxlY3Rpb24oeWVhciwgc2hpZnRSaWdodCl9XG4gICAgICAgICAgICAgICAgICAgID9kaXNhYmxlZD0ke2lzT3V0T2ZSYW5nZSB8fCBpc0ZpbHRlcmVkT3V0fVxuICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPSR7eWVhcn1cbiAgICAgICAgICAgICAgICAgICAgYXJpYS1wcmVzc2VkPSR7c2VsZWN0ZWR9XG4gICAgICAgICAgICAgICAgICAgIGFyaWEtZGlzYWJsZWQ9JHtTdHJpbmcoaXNPdXRPZlJhbmdlIHx8IGlzRmlsdGVyZWRPdXQpfVxuICAgICAgICAgICAgICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS15ZWFyPSR7eWVhciB8fCBub3RoaW5nfVxuICAgICAgICAgICAgICAgICAgICBAa2V5ZG93bj0keyhldnQ6IEtleWJvYXJkRXZlbnQpID0+IHRoaXMuX2hhbmRsZUtleWJvYXJkRXZlbnQoZXZ0KX1cbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgJHt5ZWFyfVxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC90ZD5gO1xuICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgIDwvdHI+YCxcbiAgICAgICAgKX1cbiAgICAgIDwvdGJvZHk+XG4gICAgPC90YWJsZT5gO1xuICB9XG5cbiAgLyoqIFNlbGVjdCB0aGUgeWVhciBhbmQgY2hhbmdlIHRoZSB2aWV3IHRvIG1vbnRoIHNlbGVjdGlvbi4gKi9cbiAgcHJpdmF0ZSBfb25ZZWFyU2VsZWN0aW9uKHllYXI6IG51bWJlciwgcmlnaHRTaWRlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5fY2hvc2VuWWVhciA9IHJpZ2h0U2lkZSA/IHllYXIgLSAxIDogeWVhcjtcbiAgICB0aGlzLl9uZXh0Q2FsZW5kYXJWaWV3ID0gJ21vbnRoJztcbiAgICB0aGlzLl9hc3NpZ25BY3RpdmVEYXRlKFxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZShcbiAgICAgICAgdGhpcy5fY2hvc2VuWWVhcixcbiAgICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGgodGhpcy5fYWN0aXZlRGF0ZSksXG4gICAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldERhdGUodGhpcy5fYWN0aXZlRGF0ZSksXG4gICAgICApLFxuICAgICk7XG4gICAgdGhpcy5fc3RhcnRUYWJsZVRyYW5zaXRpb24oKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IF9nZXRWaWV3KCk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICBpZiAoaXNTZXJ2ZXIgfHwgdGhpcy5oeWRyYXRpb25SZXF1aXJlZCkge1xuICAgICAgLy8gVE9ETzogV2UgZGlzYWJsZSBTU1IgZm9yIGNhbGVuZGFyIGZvciBub3cuIEZpZ3VyZSBvdXIsIGlmIHRoZXJlIGlzIGEgd2F5XG4gICAgICAvLyB0byBlbmFibGUgaXQsIHdoaWxlIGNvbnNpZGVyaW5nIGkxOG4gYW5kIGRhdGUgaW5mb3JtYXRpb24uXG4gICAgICByZXR1cm4gaHRtbGAke25vdGhpbmd9YDtcbiAgICB9XG4gICAgc3dpdGNoICh0aGlzLl9jYWxlbmRhclZpZXcpIHtcbiAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICByZXR1cm4gdGhpcy5fcmVuZGVyWWVhclZpZXcoKTtcbiAgICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlbmRlck1vbnRoVmlldygpO1xuICAgICAgY2FzZSAnZGF5JzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJEYXlWaWV3KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfdGFibGVBbmltYXRpb25FbmQoZXZlbnQ6IEFuaW1hdGlvbkV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGFibGUgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKGV2ZW50LmFuaW1hdGlvbk5hbWUgPT09ICdoaWRlJykge1xuICAgICAgdGFibGUuY2xhc3NMaXN0LnJlbW92ZSgnc2JiLWNhbGVuZGFyX190YWJsZS1oaWRlJyk7XG4gICAgICB0aGlzLl9yZXNldEZvY3VzID0gdHJ1ZTtcbiAgICAgIHRoaXMuX2NhbGVuZGFyVmlldyA9IHRoaXMuX25leHRDYWxlbmRhclZpZXc7XG4gICAgfSBlbHNlIGlmIChldmVudC5hbmltYXRpb25OYW1lID09PSAnc2hvdycpIHtcbiAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXRyYW5zaXRpb24nKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zdGFydFRhYmxlVHJhbnNpdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLnRvZ2dsZUF0dHJpYnV0ZSgnZGF0YS10cmFuc2l0aW9uJywgdHJ1ZSk7XG4gICAgdGhpcy5zaGFkb3dSb290XG4gICAgICA/LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RhYmxlJylcbiAgICAgID8uZm9yRWFjaCgoZSkgPT4gZS5jbGFzc0xpc3QudG9nZ2xlKCdzYmItY2FsZW5kYXJfX3RhYmxlLWhpZGUnKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcmVuZGVyKCk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICByZXR1cm4gaHRtbGA8ZGl2IGNsYXNzPVwic2JiLWNhbGVuZGFyX193cmFwcGVyXCI+JHt0aGlzLl9nZXRWaWV3fTwvZGl2PmA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG4gICAgJ3NiYi1jYWxlbmRhcic6IFNiYkNhbGVuZGFyRWxlbWVudDtcbiAgfVxufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQThGTyxJQUFNLHFCQUFOLGNBQTJDLGtCQUFrQixVQUFVLEVBQUU7QUFBQSxFQXlJdkUsY0FBYzs7QUFDYjtBQW5JcUIsU0FBTyxPQUFPO0FBRy9CLFNBQU8sT0FBcUI7QUE4QnhDLFNBQVEsT0FBaUI7QUF3QnpCLFNBQVEsaUJBQStCLGdCQUFBLEVBQWEsYUFBYixtQkFBdUIsZ0JBQWU7QUFHN0UsU0FBUSxnQkFBaUMsSUFBSTtBQUFBLE1BQzNDO0FBQUEsTUFDQSxtQkFBbUIs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
|
|
1340
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lbGVtZW50cy9jYWxlbmRhci9jYWxlbmRhci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICB0eXBlIENTU1Jlc3VsdEdyb3VwLFxuICBodG1sLFxuICBpc1NlcnZlcixcbiAgTGl0RWxlbWVudCxcbiAgbm90aGluZyxcbiAgdHlwZSBQcm9wZXJ0eVZhbHVlcyxcbiAgdHlwZSBUZW1wbGF0ZVJlc3VsdCxcbn0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGNsYXNzTWFwIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvY2xhc3MtbWFwLmpzJztcblxuaW1wb3J0IHsgaXNBcnJvd0tleU9yUGFnZUtleXNQcmVzc2VkLCBzYmJJbnB1dE1vZGFsaXR5RGV0ZWN0b3IgfSBmcm9tICcuLi9jb3JlL2ExMXkuanMnO1xuaW1wb3J0IHsgcmVhZENvbmZpZyB9IGZyb20gJy4uL2NvcmUvY29uZmlnLmpzJztcbmltcG9ydCB7IFNiYkNvbm5lY3RlZEFib3J0Q29udHJvbGxlciwgU2JiTGFuZ3VhZ2VDb250cm9sbGVyIH0gZnJvbSAnLi4vY29yZS9jb250cm9sbGVycy5qcyc7XG5pbXBvcnQgdHlwZSB7IERhdGVBZGFwdGVyIH0gZnJvbSAnLi4vY29yZS9kYXRldGltZS5qcyc7XG5pbXBvcnQge1xuICBEQVlTX1BFUl9ST1csXG4gIGRlZmF1bHREYXRlQWRhcHRlcixcbiAgTU9OVEhTX1BFUl9ST1csXG4gIFlFQVJTX1BFUl9QQUdFLFxuICBZRUFSU19QRVJfUk9XLFxufSBmcm9tICcuLi9jb3JlL2RhdGV0aW1lLmpzJztcbmltcG9ydCB7IGlzQnJlYWtwb2ludCB9IGZyb20gJy4uL2NvcmUvZG9tLmpzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL2NvcmUvZXZlbnRpbmcuanMnO1xuaW1wb3J0IHtcbiAgaTE4bkNhbGVuZGFyRGF0ZVNlbGVjdGlvbixcbiAgaTE4bk5leHRNb250aCxcbiAgaTE4bk5leHRZZWFyLFxuICBpMThuTmV4dFllYXJSYW5nZSxcbiAgaTE4blByZXZpb3VzTW9udGgsXG4gIGkxOG5QcmV2aW91c1llYXIsXG4gIGkxOG5QcmV2aW91c1llYXJSYW5nZSxcbiAgaTE4blllYXJNb250aFNlbGVjdGlvbixcbn0gZnJvbSAnLi4vY29yZS9pMThuLmpzJztcbmltcG9ydCB0eXBlIHsgU2JiRGF0ZUxpa2UgfSBmcm9tICcuLi9jb3JlL2ludGVyZmFjZXMuanMnO1xuaW1wb3J0IHsgU2JiSHlkcmF0aW9uTWl4aW4gfSBmcm9tICcuLi9jb3JlL21peGlucy5qcyc7XG5cbmltcG9ydCBzdHlsZSBmcm9tICcuL2NhbGVuZGFyLnNjc3M/bGl0JmlubGluZSc7XG5cbmltcG9ydCAnLi4vYnV0dG9uL3NlY29uZGFyeS1idXR0b24uanMnO1xuaW1wb3J0ICcuLi9pY29uLmpzJztcbmltcG9ydCAnLi4vc2NyZWVuLXJlYWRlci1vbmx5LmpzJztcblxuLyoqXG4gKiBJbiBrZXlib2FyZCBuYXZpZ2F0aW9uLCB0aGUgY2VsbCdzIGluZGV4IGFuZCB0aGUgZWxlbWVudCdzIGluZGV4IGluIGl0cyBtb250aCAvIHllYXIgYmF0Y2ggbXVzdCBiZSBkaXN0aW5ndWlzaGVkO1xuICogdGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgbmF2aWdhdGlvbiBpbiB0aGUgdmVydGljYWwgZGlyZWN0aW9uIHVzaW5nIHNvbWUga2V5cyBpcyByZXN0cmljdGVkIHRvIGEgc2luZ2xlIG1vbnRoIGZvciBkYXlzLFxuICogYW5kIHRvIGEgc2luZ2xlIHJhbmdlIG9mIDI0IHllYXJzIGZvciB5ZWFycy4gV2hpbGUgdGhlIGxhdHRlciBpcyBlYXN5IHRvIHVuZGVyc3RhbmQsIHRoZSBjZWxsJ3MgaW5kZXggaXMgdGhlIGluZGV4XG4gKiBvZiB0aGUgZWxlbWVudCBpbiB0aGUgYXJyYXkgb2YgYWxsIHRoZSByZW5kZXJlZCBjZWxscy4gSW4gbm9uLXdpZGUgbW9kZSwgdGhlcmUncyBubyBpc3N1ZSBiZWNhdXNlIHRoZSBlbGVtZW50IGluZGV4XG4gKiBpcyBiYXNpY2FsbHkgdGhlIGNlbGwncyBpbmRleCBwbHVzIDEgKGVsZW1lbnQgd2l0aCBpbmRleCAwIGRpc3BsYXlzIHRoZSAxc3Qgb2YgbW9udGgsIGVsZW1lbnQgd2l0aCBpbmRleCAxIGRpc3BsYXlzIHRoZSAybmQgYW5kIHNvIG9uKS5cbiAqIEluIHdpZGUgbW9kZSwgdGhlIGNlbGwncyBpbmRleCBjYW4gZ28gZnJvbSAwIHRvIDQ3IGZvciB5ZWFycyAodHdvIGJhdGNoZXMgb2YgMjQgeWVhcnMpLCBhbmQgZnJvbSAwIHRvIGEgbWF4aW11bSBvZiA2MSBmb3IgZGF5c1xuICogKHR3byBjb25zZWN1dGl2ZSBtb250aHMgb2YgMzEgZGF5cywgYXMgSnVseS1BdWd1c3Qgb3IgRGVjZW1iZXItSmFudWFyeSksIGRlcGVuZGluZyBvbiB0aGUgbGVuZ3RocyBvZiB0aGUgcmVuZGVyZWQgbW9udGhzO1xuICogdGhlIGVsZW1lbnQgaW5kZXggaW5zdGVhZCBnb2VzIGZyb20gMCB0byBhIG1heCB2YWx1ZSBvZiAyNCBmb3IgeWVhcnMgYW5kIDMxIGZvciBkYXlzLlxuICogTW9yZW92ZXIsIGluIGRheSB2aWV3LCB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGRheSBvZiB0aGUgc2Vjb25kIHJlbmRlcmVkIG1vbnRoIGFuZCB0aGUgaW5kZXggb2YgdGhlIGxhc3QgcmVuZGVyZWQgZGF5XG4gKiBjYW4gYWxzbyB2YXJ5IGRlcGVuZGluZyBvbiB3aGljaCBtb250aHMgYXJlIHJlbmRlcmVkOyBmb3IgSnVseS1BdWd1c3QgdGhleSBhcmUgZXF1YWxzIHRvIDMxIGFuZCA2MSwgd2hpbGUgZm9yIEZlYnJ1YXJ5LU1hcmNoIHRoZXkgYXJlIDI4IGFuZCA1OC5cbiAqIFNvLCBzb21lIGFkZGl0aW9uYWwgcGFyYW1ldGVycyBhcmUgbmVlZGVkLCBiZXNpZGUgdGhlIGNlbGwncyBpbmRleCwgdG8gY29ycmVjdGx5IGNhbGN1bGF0ZSB0aGUgZWxlbWVudCB0byBuYXZpZ2F0ZSB0by5cbiAqL1xuaW50ZXJmYWNlIENhbGVuZGFyS2V5Ym9hcmROYXZpZ2F0aW9uUGFyYW1ldGVycyB7XG4gIC8qKiBUaGUgZWxlbWVudCBpbmRleCB3aXRoaW4gaXRzIG1vbnRoIChvciB5ZWFyIHJhbmdlKS4gKi9cbiAgZWxlbWVudEluZGV4Rm9yV2lkZU1vZGU6IG51bWJlcjtcbiAgLyoqIEluIHdpZGUgbW9kZSwgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBzZWNvbmQgcGFuZWwsIG9yLCBhbHRlcm5hdGl2ZWx5LCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBmaXJzdCBwYW5lbC4gKi9cbiAgb2Zmc2V0Rm9yV2lkZU1vZGU6IG51bWJlcjtcbiAgLyoqIFRoZSBpbmRleCBvZiB0aGUgbGFzdCBlbGVtZW50IHdpdGhpbiB0aGUgZWxlbWVudCdzIG1vbnRoIChvciB5ZWFyIHJhbmdlKS4gKi9cbiAgbGFzdEVsZW1lbnRJbmRleEZvcldpZGVNb2RlOiBudW1iZXI7XG4gIC8qKiBUaGUgbnVtYmVyIG9mIGNlbGxzIGRpc3BsYXllZCBpbiBhIHNpbmdsZSByb3csIGRlcGVuZGluZyBvbiB0aGUgcmVuZGVyZWQgdmlldy4gKi9cbiAgdmVydGljYWxPZmZzZXQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEYXkge1xuICB2YWx1ZTogc3RyaW5nO1xuICBkYXlWYWx1ZTogc3RyaW5nO1xuICBtb250aFZhbHVlOiBzdHJpbmc7XG4gIHllYXJWYWx1ZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1vbnRoIHtcbiAgdmFsdWU6IHN0cmluZztcbiAgbG9uZ1ZhbHVlOiBzdHJpbmc7XG4gIG1vbnRoVmFsdWU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXZWVrZGF5IHtcbiAgbG9uZzogc3RyaW5nO1xuICBuYXJyb3c6IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgQ2FsZW5kYXJWaWV3ID0gJ2RheScgfCAnbW9udGgnIHwgJ3llYXInO1xuXG4vKipcbiAqIEl0IGRpc3BsYXlzIGEgY2FsZW5kYXIgd2hpY2ggYWxsb3dzIHRvIGNob29zZSBhIGRhdGUuXG4gKlxuICogQGV2ZW50IHtDdXN0b21FdmVudDxUPn0gZGF0ZVNlbGVjdGVkIC0gRXZlbnQgZW1pdHRlZCBvbiBkYXRlIHNlbGVjdGlvbi5cbiAqL1xuQGN1c3RvbUVsZW1lbnQoJ3NiYi1jYWxlbmRhcicpXG5leHBvcnQgY2xhc3MgU2JiQ2FsZW5kYXJFbGVtZW50PFQgPSBEYXRlPiBleHRlbmRzIFNiYkh5ZHJhdGlvbk1peGluKExpdEVsZW1lbnQpIHtcbiAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBzdHlsZXM6IENTU1Jlc3VsdEdyb3VwID0gc3R5bGU7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZXZlbnRzID0ge1xuICAgIGRhdGVTZWxlY3RlZDogJ2RhdGVTZWxlY3RlZCcsXG4gIH0gYXMgY29uc3Q7XG5cbiAgLyoqIElmIHNldCB0byB0cnVlLCB0d28gbW9udGhzIGFyZSBkaXNwbGF5ZWQgKi9cbiAgQHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KSBwdWJsaWMgd2lkZSA9IGZhbHNlO1xuXG4gIC8qKiBUaGUgaW5pdGlhbCB2aWV3IG9mIHRoZSBjYWxlbmRhciB3aGljaCBzaG91bGQgYmUgZGlzcGxheWVkIG9uIG9wZW5pbmcuICovXG4gIEBwcm9wZXJ0eSgpIHB1YmxpYyB2aWV3OiBDYWxlbmRhclZpZXcgPSAnZGF5JztcblxuICAvKiogVGhlIG1pbmltdW0gdmFsaWQgZGF0ZS4gVGFrZXMgVCBPYmplY3QsIElTT1N0cmluZywgYW5kIFVuaXggVGltZXN0YW1wIChudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSBKYW4gMSwgMTk3MCkuICovXG4gIEBwcm9wZXJ0eSgpXG4gIHB1YmxpYyBzZXQgbWluKHZhbHVlOiBTYmJEYXRlTGlrZTxUPiB8IG51bGwpIHtcbiAgICB0aGlzLl9taW4gPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRWYWxpZERhdGVPck51bGwodGhpcy5fZGF0ZUFkYXB0ZXIuZGVzZXJpYWxpemUodmFsdWUpKTtcbiAgfVxuICBwdWJsaWMgZ2V0IG1pbigpOiBUIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX21pbiA/PyBudWxsO1xuICB9XG4gIHByaXZhdGUgX21pbj86IFQgfCBudWxsO1xuXG4gIC8qKiBUaGUgbWF4aW11bSB2YWxpZCBkYXRlLiBUYWtlcyBUIE9iamVjdCwgSVNPU3RyaW5nLCBhbmQgVW5peCBUaW1lc3RhbXAgKG51bWJlciBvZiBzZWNvbmRzIHNpbmNlIEphbiAxLCAxOTcwKS4gKi9cbiAgQHByb3BlcnR5KClcbiAgcHVibGljIHNldCBtYXgodmFsdWU6IFNiYkRhdGVMaWtlPFQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fbWF4ID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0VmFsaWREYXRlT3JOdWxsKHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKHZhbHVlKSk7XG4gIH1cbiAgcHVibGljIGdldCBtYXgoKTogVCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9tYXggPz8gbnVsbDtcbiAgfVxuICBwcml2YXRlIF9tYXg/OiBUIHwgbnVsbDtcblxuICAvKiogQSBjb25maWd1cmVkIGRhdGUgd2hpY2ggYWN0cyBhcyB0aGUgY3VycmVudCBkYXRlIGluc3RlYWQgb2YgdGhlIHJlYWwgY3VycmVudCBkYXRlLiBSZWNvbW1lbmRlZCBmb3IgdGVzdGluZyBwdXJwb3Nlcy4gKi9cbiAgQHByb3BlcnR5KClcbiAgcHVibGljIHNldCBub3codmFsdWU6IFNiYkRhdGVMaWtlPFQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fbm93ID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0VmFsaWREYXRlT3JOdWxsKHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKHZhbHVlKSk7XG4gIH1cbiAgcHVibGljIGdldCBub3coKTogVCB7XG4gICAgcmV0dXJuIHRoaXMuX25vdyA/PyB0aGlzLl9kYXRlQWRhcHRlci50b2RheSgpO1xuICB9XG4gIHByaXZhdGUgX25vdzogVCB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBUaGUgc2VsZWN0ZWQgZGF0ZS4gVGFrZXMgVCBPYmplY3QsIElTT1N0cmluZywgYW5kIFVuaXggVGltZXN0YW1wIChudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSBKYW4gMSwgMTk3MCkuICovXG4gIEBwcm9wZXJ0eSgpXG4gIHB1YmxpYyBzZXQgc2VsZWN0ZWQodmFsdWU6IFNiYkRhdGVMaWtlPFQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fc2VsZWN0ZWREYXRlID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0VmFsaWREYXRlT3JOdWxsKHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKHZhbHVlKSk7XG4gICAgaWYgKFxuICAgICAgISF0aGlzLl9zZWxlY3RlZERhdGUgJiZcbiAgICAgICghdGhpcy5faXNEYXlJblJhbmdlKHRoaXMuX2RhdGVBZGFwdGVyLnRvSXNvODYwMSh0aGlzLl9zZWxlY3RlZERhdGUpKSB8fFxuICAgICAgICB0aGlzLl9kYXRlRmlsdGVyKHRoaXMuX3NlbGVjdGVkRGF0ZSkpXG4gICAgKSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZCA9IHRoaXMuX2RhdGVBZGFwdGVyLnRvSXNvODYwMSh0aGlzLl9zZWxlY3RlZERhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldCBzZWxlY3RlZCgpOiBUIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkRGF0ZSA/PyBudWxsO1xuICB9XG4gIHByaXZhdGUgX3NlbGVjdGVkRGF0ZT86IFQgfCBudWxsO1xuXG4gIC8qKiBBIGZ1bmN0aW9uIHVzZWQgdG8gZmlsdGVyIG91dCBkYXRlcy4gKi9cbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnZGF0ZS1maWx0ZXInIH0pIHB1YmxpYyBkYXRlRmlsdGVyPzogKGRhdGU6IFQgfCBudWxsKSA9PiBib29sZWFuO1xuXG4gIHByaXZhdGUgX2RhdGVBZGFwdGVyOiBEYXRlQWRhcHRlcjxUPiA9IHJlYWRDb25maWcoKS5kYXRldGltZT8uZGF0ZUFkYXB0ZXIgPz8gZGVmYXVsdERhdGVBZGFwdGVyO1xuXG4gIC8qKiBFdmVudCBlbWl0dGVkIG9uIGRhdGUgc2VsZWN0aW9uLiAqL1xuICBwcml2YXRlIF9kYXRlU2VsZWN0ZWQ6IEV2ZW50RW1pdHRlcjxUPiA9IG5ldyBFdmVudEVtaXR0ZXIoXG4gICAgdGhpcyxcbiAgICBTYmJDYWxlbmRhckVsZW1lbnQuZXZlbnRzLmRhdGVTZWxlY3RlZCxcbiAgKTtcblxuICAvKiogVGhlIGN1cnJlbnRseSBhY3RpdmUgZGF0ZS4gKi9cbiAgQHN0YXRlKCkgcHJpdmF0ZSBfYWN0aXZlRGF0ZTogVCA9IHRoaXMubm93O1xuXG4gIC8qKiBUaGUgc2VsZWN0ZWQgZGF0ZSBhcyBJU09TdHJpbmcuICovXG4gIEBzdGF0ZSgpIHByaXZhdGUgX3NlbGVjdGVkPzogc3RyaW5nO1xuXG4gIC8qKiBUaGUgY3VycmVudCB3aWRlIHByb3BlcnR5IGNvbnNpZGVyaW5nIHByb3BlcnR5IHZhbHVlIGFuZCBicmVha3BvaW50cy4gRnJvbSB6ZXJvIHRvIHNtYWxsIGB3aWRlYCBoYXMgYWx3YXlzIHRvIGJlIGZhbHNlLiAqL1xuICBAc3RhdGUoKVxuICBwcml2YXRlIHNldCBfd2lkZSh3aWRlOiBib29sZWFuKSB7XG4gICAgdGhpcy50b2dnbGVBdHRyaWJ1dGUoJ2RhdGEtd2lkZScsIHdpZGUpO1xuICB9XG4gIHByaXZhdGUgZ2V0IF93aWRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc0F0dHJpYnV0ZSgnZGF0YS13aWRlJyk7XG4gIH1cblxuICBAc3RhdGUoKSBwcml2YXRlIF9jYWxlbmRhclZpZXc6IENhbGVuZGFyVmlldyA9ICdkYXknO1xuXG4gIHByaXZhdGUgX25leHRDYWxlbmRhclZpZXc6IENhbGVuZGFyVmlldyA9ICdkYXknO1xuXG4gIC8qKiBBIGxpc3Qgb2YgZGF5cywgaW4gdHdvIGZvcm1hdHMgKGxvbmcgYW5kIHNpbmdsZSBjaGFyKS4gKi9cbiAgcHJpdmF0ZSBfd2Vla2RheXMhOiBXZWVrZGF5W107XG5cbiAgLyoqIEdyaWQgb2YgY2FsZW5kYXIgY2VsbHMgcmVwcmVzZW50aW5nIHRoZSBkYXRlcyBvZiB0aGUgbW9udGguICovXG4gIHByaXZhdGUgX3dlZWtzOiBEYXlbXVtdID0gW107XG5cbiAgLyoqIEdyaWQgb2YgY2FsZW5kYXIgY2VsbHMgcmVwcmVzZW50aW5nIG1vbnRocy4gKi9cbiAgcHJpdmF0ZSBfbW9udGhzITogTW9udGhbXVtdO1xuXG4gIC8qKiBHcmlkIG9mIGNhbGVuZGFyIGNlbGxzIHJlcHJlc2VudGluZyB5ZWFycy4gKi9cbiAgcHJpdmF0ZSBfeWVhcnMhOiBudW1iZXJbXVtdO1xuXG4gIC8qKiBHcmlkIG9mIGNhbGVuZGFyIGNlbGxzIHJlcHJlc2VudGluZyB5ZWFycyBmb3IgdGhlIHdpZGUgdmlldy4gKi9cbiAgcHJpdmF0ZSBfbmV4dE1vbnRoWWVhcnMhOiBudW1iZXJbXVtdO1xuXG4gIC8qKiBHcmlkIG9mIGNhbGVuZGFyIGNlbGxzIHJlcHJlc2VudGluZyB0aGUgZGF0ZXMgb2YgdGhlIG5leHQgbW9udGguICovXG4gIHByaXZhdGUgX25leHRNb250aFdlZWtzITogRGF5W11bXTtcblxuICAvKiogQW4gYXJyYXkgY29udGFpbmluZyBhbGwgdGhlIG1vbnRoIG5hbWVzIGluIHRoZSBjdXJyZW50IGxhbmd1YWdlLiAqL1xuICBwcml2YXRlIF9tb250aE5hbWVzOiBzdHJpbmdbXSA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoTmFtZXMoJ2xvbmcnKTtcblxuICAvKiogQSBsaXN0IG9mIGJ1dHRvbnMgY29ycmVzcG9uZGluZyB0byBkYXlzLCBtb250aHMgb3IgeWVhcnMgZGVwZW5kaW5nIG9uIHRoZSB2aWV3LiAqL1xuICBwcml2YXRlIGdldCBfY2VsbHMoKTogSFRNTEJ1dHRvbkVsZW1lbnRbXSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oXG4gICAgICB0aGlzLnNoYWRvd1Jvb3QhLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zYmItY2FsZW5kYXJfX2NlbGwnKSA/PyBbXSxcbiAgICApIGFzIEhUTUxCdXR0b25FbGVtZW50W107XG4gIH1cblxuICAvKiogVGhlIGNob3NlbiB5ZWFyIGluIHRoZSB5ZWFyIHNlbGVjdGlvbiB2aWV3LiAqL1xuICBwcml2YXRlIF9jaG9zZW5ZZWFyPzogbnVtYmVyO1xuXG4gIC8qKiBUaGUgY2hvc2VuIG1vbnRoIGluIHRoZSB5ZWFyIHNlbGVjdGlvbiB2aWV3LiAqL1xuICBwcml2YXRlIF9jaG9zZW5Nb250aD86IG51bWJlcjtcblxuICAvKiogV2hldGhlciB0aGUgZm9jdXMgc2hvdWxkIGJlIHJlc2V0IG9uIGZvY3VzQ2VsbC4gKi9cbiAgcHJpdmF0ZSBfcmVzZXRGb2N1cyA9IGZhbHNlO1xuXG4gIEBzdGF0ZSgpXG4gIHByaXZhdGUgX2luaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfYWJvcnQgPSBuZXcgU2JiQ29ubmVjdGVkQWJvcnRDb250cm9sbGVyKHRoaXMpO1xuICBwcml2YXRlIF9sYW5ndWFnZSA9IG5ldyBTYmJMYW5ndWFnZUNvbnRyb2xsZXIodGhpcykud2l0aEhhbmRsZXIoKCkgPT4ge1xuICAgIHRoaXMuX21vbnRoTmFtZXMgPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aE5hbWVzKCdsb25nJyk7XG4gICAgdGhpcy5fY3JlYXRlTW9udGhSb3dzKCk7XG4gIH0pO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2NyZWF0ZU1vbnRoUm93cygpO1xuICAgIHRoaXMuX3NldFdlZWtkYXlzKCk7XG4gIH1cblxuICBwcml2YXRlIF9kYXRlRmlsdGVyKGRhdGU6IFQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kYXRlRmlsdGVyPy4oZGF0ZSkgPz8gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBSZXNldHMgdGhlIGFjdGl2ZSBtb250aCBhY2NvcmRpbmcgdG8gdGhlIG5ldyBzdGF0ZSBvZiB0aGUgY2FsZW5kYXIuICovXG4gIHB1YmxpYyByZXNldFBvc2l0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuX3Jlc2V0Q2FsZW5kYXJWaWV3KCk7XG4gICAgdGhpcy5faW5pdCgpO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5yZXNldFBvc2l0aW9uKCk7XG4gICAgdGhpcy5mb2N1cyA9ICgpID0+IHtcbiAgICAgIHRoaXMuX3Jlc2V0Rm9jdXMgPSB0cnVlO1xuICAgICAgdGhpcy5fZm9jdXNDZWxsKCk7XG4gICAgfTtcbiAgICBnbG9iYWxUaGlzLndpbmRvdz8uYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgKCkgPT4gdGhpcy5faW5pdCgpLCB7XG4gICAgICBwYXNzaXZlOiB0cnVlLFxuICAgICAgc2lnbmFsOiB0aGlzLl9hYm9ydC5zaWduYWwsXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgd2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXM8dGhpcz4pOiB2b2lkIHtcbiAgICBzdXBlci53aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKTtcblxuICAgIGlmICghdGhpcy5faW5pdGlhbGl6ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCd3aWRlJykpIHtcbiAgICAgIHRoaXMucmVzZXRQb3NpdGlvbigpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ3ZpZXcnKSkge1xuICAgICAgdGhpcy5fc2V0Q2hvc2VuWWVhcigpO1xuICAgICAgdGhpcy5fY2hvc2VuTW9udGggPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9uZXh0Q2FsZW5kYXJWaWV3ID0gdGhpcy5fY2FsZW5kYXJWaWV3ID0gdGhpcy52aWV3O1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSB1cGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczx0aGlzPik6IHZvaWQge1xuICAgIHN1cGVyLnVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpO1xuICAgIC8vIFRoZSBjYWxlbmRhciBuZWVkcyB0byBjYWxjdWxhdGUgdGFiLWluZGV4ZXMgb24gZmlyc3QgcmVuZGVyLFxuICAgIC8vIGFuZCBldmVyeSB0aW1lIGEgZGF0ZSBpcyBzZWxlY3RlZCBvciB0aGUgbW9udGggdmlldyBjaGFuZ2VzLlxuICAgIHRoaXMuX3NldFRhYkluZGV4KCk7XG4gICAgLy8gV2hlbiBjaGFuZ2luZyB2aWV3IHRvIHllYXIvbW9udGgsIHRoZSB0YWJpbmRleCBpcyBjaGFuZ2VkLCBidXQgdGhlIGZvY3VzZWQgZWxlbWVudCBpcyBub3QsXG4gICAgLy8gc28gaWYgdGhlIG5hdmlnYXRpb24gaXMgZG9uZSB2aWEga2V5Ym9hcmQsIHRoZXJlJ3MgdGhlIG5lZWRcbiAgICAvLyB0byBjYWxsIHRoZSBgX2ZvY3VzQ2VsbCgpYCBtZXRob2QgZXhwbGljaXRseSB0byBjb3JyZWN0bHkgc2V0IHRoZSBmb2N1cy5cbiAgICBpZiAoc2JiSW5wdXRNb2RhbGl0eURldGVjdG9yLm1vc3RSZWNlbnRNb2RhbGl0eSA9PT0gJ2tleWJvYXJkJykge1xuICAgICAgdGhpcy5fZm9jdXNDZWxsKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEluaXRpYWxpemVzIHRoZSBjb21wb25lbnQuICovXG4gIHByaXZhdGUgX2luaXQoYWN0aXZlRGF0ZT86IFQpOiB2b2lkIHtcbiAgICAvL0R1ZSB0byBpdHMgY29tcGxleGl0eSwgdGhlIGNhbGVkYXIgaXMgb25seSBpbml0aWFsaXplZCBvbiBjbGllbnQgc2lkZVxuICAgIGlmIChpc1NlcnZlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAodGhpcy5oeWRyYXRpb25SZXF1aXJlZCkge1xuICAgICAgdGhpcy5oeWRyYXRpb25Db21wbGV0ZS50aGVuKCgpID0+IHRoaXMuX2luaXQoKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGFjdGl2ZURhdGUpIHtcbiAgICAgIHRoaXMuX2Fzc2lnbkFjdGl2ZURhdGUoYWN0aXZlRGF0ZSk7XG4gICAgfVxuICAgIHRoaXMuX3dpZGUgPSBpc0JyZWFrcG9pbnQoJ21lZGl1bScpICYmIHRoaXMud2lkZTtcbiAgICB0aGlzLl93ZWVrcyA9IHRoaXMuX2NyZWF0ZVdlZWtSb3dzKHRoaXMuX2FjdGl2ZURhdGUpO1xuICAgIHRoaXMuX3llYXJzID0gdGhpcy5fY3JlYXRlWWVhclJvd3MoKTtcbiAgICB0aGlzLl9uZXh0TW9udGhXZWVrcyA9IFtbXV07XG4gICAgdGhpcy5fbmV4dE1vbnRoWWVhcnMgPSBbW11dO1xuICAgIGlmICh0aGlzLl93aWRlKSB7XG4gICAgICBjb25zdCBuZXh0TW9udGhEYXRlID0gdGhpcy5fZGF0ZUFkYXB0ZXIuYWRkQ2FsZW5kYXJNb250aHModGhpcy5fYWN0aXZlRGF0ZSwgMSk7XG4gICAgICB0aGlzLl9uZXh0TW9udGhXZWVrcyA9IHRoaXMuX2NyZWF0ZVdlZWtSb3dzKG5leHRNb250aERhdGUpO1xuICAgICAgdGhpcy5fbmV4dE1vbnRoWWVhcnMgPSB0aGlzLl9jcmVhdGVZZWFyUm93cyhZRUFSU19QRVJfUEFHRSk7XG4gICAgfVxuICAgIHRoaXMuX2luaXRpYWxpemVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBGb2N1c2VzIG9uIGEgZGF5IGNlbGwgcHJpb3JpdGl6aW5nIHRoZSBzZWxlY3RlZCBkYXksIHRoZSBjdXJyZW50IGRheSwgYW5kIGxhc3RseSwgdGhlIGZpcnN0IHNlbGVjdGFibGUgZGF5LiAqL1xuICBwcml2YXRlIF9mb2N1c0NlbGwoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3Jlc2V0Rm9jdXMpIHtcbiAgICAgIHRoaXMuX2dldEZpcnN0Rm9jdXNhYmxlKCk/LmZvY3VzKCk7XG4gICAgICB0aGlzLl9yZXNldEZvY3VzID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqIENyZWF0ZXMgdGhlIGFycmF5IG9mIHdlZWtkYXlzLiAqL1xuICBwcml2YXRlIF9zZXRXZWVrZGF5cygpOiB2b2lkIHtcbiAgICBjb25zdCBuYXJyb3dXZWVrZGF5czogc3RyaW5nW10gPSB0aGlzLl9kYXRlQWRhcHRlci5nZXREYXlPZldlZWtOYW1lcygnbmFycm93Jyk7XG4gICAgY29uc3QgbG9uZ1dlZWtkYXlzOiBzdHJpbmdbXSA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldERheU9mV2Vla05hbWVzKCdsb25nJyk7XG4gICAgY29uc3Qgd2Vla2RheXM6IFdlZWtkYXlbXSA9IGxvbmdXZWVrZGF5cy5tYXAoKGxvbmc6IHN0cmluZywgaTogbnVtYmVyKSA9PiAoe1xuICAgICAgbG9uZyxcbiAgICAgIG5hcnJvdzogbmFycm93V2Vla2RheXNbaV0sXG4gICAgfSkpO1xuXG4gICAgLy8gUm90YXRlcyB0aGUgbGFiZWxzIGZvciBkYXlzIG9mIHRoZSB3ZWVrIGJhc2VkIG9uIHRoZSBjb25maWd1cmVkIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICBjb25zdCBmaXJzdERheU9mV2VlazogbnVtYmVyID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0Rmlyc3REYXlPZldlZWsoKTtcbiAgICB0aGlzLl93ZWVrZGF5cyA9IHdlZWtkYXlzLnNsaWNlKGZpcnN0RGF5T2ZXZWVrKS5jb25jYXQod2Vla2RheXMuc2xpY2UoMCwgZmlyc3REYXlPZldlZWspKTtcbiAgfVxuXG4gIC8qKiBDcmVhdGVzIHRoZSByb3dzIGZvciBlYWNoIHdlZWsuICovXG4gIHByaXZhdGUgX2NyZWF0ZVdlZWtSb3dzKHZhbHVlOiBUKTogRGF5W11bXSB7XG4gICAgY29uc3QgZGF5c0luTW9udGg6IG51bWJlciA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldE51bURheXNJbk1vbnRoKHZhbHVlKTtcbiAgICBjb25zdCBkYXRlTmFtZXM6IHN0cmluZ1tdID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0RGF0ZU5hbWVzKCk7XG4gICAgY29uc3Qgd2Vla3M6IERheVtdW10gPSBbW11dO1xuICAgIGNvbnN0IHdlZWtPZmZzZXQgPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRGaXJzdFdlZWtPZmZzZXQodmFsdWUpO1xuICAgIGZvciAobGV0IGkgPSAwLCBjZWxsID0gd2Vla09mZnNldDsgaSA8IGRheXNJbk1vbnRoOyBpKyssIGNlbGwrKykge1xuICAgICAgaWYgKGNlbGwgPT09IERBWVNfUEVSX1JPVykge1xuICAgICAgICB3ZWVrcy5wdXNoKFtdKTtcbiAgICAgICAgY2VsbCA9IDA7XG4gICAgICB9XG4gICAgICBjb25zdCBkYXRlID0gdGhpcy5fZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZShcbiAgICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih2YWx1ZSksXG4gICAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoKHZhbHVlKSxcbiAgICAgICAgaSArIDEsXG4gICAgICApITtcbiAgICAgIHdlZWtzW3dlZWtzLmxlbmd0aCAtIDFdLnB1c2goe1xuICAgICAgICB2YWx1ZTogdGhpcy5fZGF0ZUFkYXB0ZXIudG9Jc284NjAxKGRhdGUpLFxuICAgICAgICBkYXlWYWx1ZTogZGF0ZU5hbWVzW2ldLFxuICAgICAgICBtb250aFZhbHVlOiBTdHJpbmcodGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGgoZGF0ZSkpLFxuICAgICAgICB5ZWFyVmFsdWU6IFN0cmluZyh0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKGRhdGUpKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gd2Vla3M7XG4gIH1cblxuICAvKiogQ3JlYXRlcyB0aGUgcm93cyBmb3IgdGhlIG1vbnRoIHNlbGVjdGlvbiB2aWV3LiAqL1xuICBwcml2YXRlIF9jcmVhdGVNb250aFJvd3MoKTogdm9pZCB7XG4gICAgY29uc3Qgc2hvcnROYW1lczogc3RyaW5nW10gPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aE5hbWVzKCdzaG9ydCcpO1xuICAgIGNvbnN0IG1vbnRoczogTW9udGhbXSA9IG5ldyBBcnJheSgxMikuZmlsbChudWxsKS5tYXAoXG4gICAgICAoXywgaTogbnVtYmVyKTogTW9udGggPT4gKHtcbiAgICAgICAgdmFsdWU6IHNob3J0TmFtZXNbaV0sXG4gICAgICAgIGxvbmdWYWx1ZTogdGhpcy5fbW9udGhOYW1lc1tpXSxcbiAgICAgICAgbW9udGhWYWx1ZTogaSArIDEsXG4gICAgICB9KSxcbiAgICApO1xuICAgIGNvbnN0IHJvd3M6IG51bWJlciA9IDEyIC8gTU9OVEhTX1BFUl9ST1c7XG4gICAgY29uc3QgbW9udGhBcnJheTogTW9udGhbXVtdID0gW107XG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHJvd3M7IGkrKykge1xuICAgICAgbW9udGhBcnJheS5wdXNoKG1vbnRocy5zbGljZShNT05USFNfUEVSX1JPVyAqIGksIE1PTlRIU19QRVJfUk9XICogKGkgKyAxKSkpO1xuICAgIH1cbiAgICB0aGlzLl9tb250aHMgPSBtb250aEFycmF5O1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgdGhlIHJvd3MgZm9yIHRoZSB5ZWFyIHNlbGVjdGlvbiB2aWV3LiAqL1xuICBwcml2YXRlIF9jcmVhdGVZZWFyUm93cyhvZmZzZXQ6IG51bWJlciA9IDApOiBudW1iZXJbXVtdIHtcbiAgICBjb25zdCBzdGFydFZhbHVlWWVhclZpZXc6IG51bWJlciA9IHRoaXMuX2dldFN0YXJ0VmFsdWVZZWFyVmlldygpO1xuICAgIGNvbnN0IGFsbFllYXJzOiBudW1iZXJbXSA9IG5ldyBBcnJheShZRUFSU19QRVJfUEFHRSlcbiAgICAgIC5maWxsKDApXG4gICAgICAubWFwKChfLCBpOiBudW1iZXIpID0+IHN0YXJ0VmFsdWVZZWFyVmlldyArIG9mZnNldCArIGkpO1xuICAgIGNvbnN0IHJvd3M6IG51bWJlciA9IFlFQVJTX1BFUl9QQUdFIC8gWUVBUlNfUEVSX1JPVztcbiAgICBjb25zdCB5ZWFyQXJyYXk6IG51bWJlcltdW10gPSBbXTtcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgcm93czsgaSsrKSB7XG4gICAgICB5ZWFyQXJyYXkucHVzaChhbGxZZWFycy5zbGljZShZRUFSU19QRVJfUk9XICogaSwgWUVBUlNfUEVSX1JPVyAqIChpICsgMSkpKTtcbiAgICB9XG4gICAgcmV0dXJuIHllYXJBcnJheTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIHRoZSBmaXJzdCB5ZWFyIHRoYXQgd2lsbCBiZSBzaG93biBpbiB0aGUgeWVhciBzZWxlY3Rpb24gcGFuZWwuXG4gICAqIElmIGBtaW5EYXRlYCBhbmQgYG1heERhdGVgIGFyZSBib3RoIG51bGwsIHRoZSBzdGFydGluZyB5ZWFyIGlzIGNhbGN1bGF0ZWQgYXNcbiAgICogdGhlIG11bHRpcGxlIG9mIFlFQVJTX1BFUl9QQUdFIGNsb3Nlc3QgdG8gYW5kIGxlc3MgdGhhbiBhY3RpdmVEYXRlLFxuICAgKiBlLmcuLCB3aXRoIGBZRUFSU19QRVJfUEFHRWAgPSAyNCBhbmQgYGFjdGl2ZURhdGVgID0gMjAyMCwgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIDIwMTYgKDI0ICogODMpLFxuICAgKiB3aGlsZSB3aXRoIGBhY3RpdmVEYXRlYCA9IDIwMDAsIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiAxOTkyICgyNCAqIDgyKS5cbiAgICogSWYgYG1pbkRhdGVgIGlzIG5vdCBudWxsLCBpdCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHllYXI7IGlmIGBtYXhEYXRlYCBpcyBub3QgbnVsbCxcbiAgICogaXQgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyB5ZWFyIG1pbnVzIGBZRUFSU19QRVJfUEFHRWAsIHNvIHRoYXQgdGhlIGBtYXhEYXRlYCBpcyB0aGUgbGFzdCByZW5kZXJlZCB5ZWFyLlxuICAgKiBJZiBib3RoIGFyZSBub3QgbnVsbCwgYG1heERhdGVgIGhhcyBwcmlvcml0eSBvdmVyIGBtaW5EYXRlYC5cbiAgICovXG4gIHByaXZhdGUgX2dldFN0YXJ0VmFsdWVZZWFyVmlldygpOiBudW1iZXIge1xuICAgIGxldCBzdGFydGluZ1llYXIgPSAwO1xuICAgIGlmICh0aGlzLm1heCkge1xuICAgICAgc3RhcnRpbmdZZWFyID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih0aGlzLm1heCkgLSBZRUFSU19QRVJfUEFHRSArIDE7XG4gICAgfSBlbHNlIGlmICh0aGlzLm1pbikge1xuICAgICAgc3RhcnRpbmdZZWFyID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih0aGlzLm1pbik7XG4gICAgfVxuICAgIGNvbnN0IGFjdGl2ZVllYXIgPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKHRoaXMuX2FjdGl2ZURhdGUpO1xuICAgIHJldHVybiAoXG4gICAgICBhY3RpdmVZZWFyIC1cbiAgICAgICgoKChhY3RpdmVZZWFyIC0gc3RhcnRpbmdZZWFyKSAlIFlFQVJTX1BFUl9QQUdFKSArIFlFQVJTX1BFUl9QQUdFKSAlIFlFQVJTX1BFUl9QQUdFKVxuICAgICk7XG4gIH1cblxuICAvKiogQ2hlY2tzIGlmIGRhdGUgaXMgd2l0aGluIHRoZSBtaW4tbWF4IHJhbmdlLiAqL1xuICBwcml2YXRlIF9pc0RheUluUmFuZ2UoZGF0ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLl9taW4gJiYgIXRoaXMuX21heCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IGlzQmVmb3JlTWluOiBib29sZWFuID1cbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmlzVmFsaWQodGhpcy5fbWluKSAmJlxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuY29tcGFyZURhdGUodGhpcy5fbWluISwgdGhpcy5fZGF0ZUFkYXB0ZXIuZGVzZXJpYWxpemUoZGF0ZSkhKSA+IDA7XG4gICAgY29uc3QgaXNBZnRlck1heDogYm9vbGVhbiA9XG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5pc1ZhbGlkKHRoaXMuX21heCkgJiZcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmNvbXBhcmVEYXRlKHRoaXMuX21heCEsIHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKGRhdGUpISkgPCAwO1xuICAgIHJldHVybiAhKGlzQmVmb3JlTWluIHx8IGlzQWZ0ZXJNYXgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNNb250aEluUmFuZ2UobW9udGg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5fbWluICYmICF0aGlzLl9tYXgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBpc0JlZm9yZU1pbjogYm9vbGVhbiA9XG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5pc1ZhbGlkKHRoaXMuX21pbikgJiZcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIodGhpcy5fbWluISkgPj0gdGhpcy5fY2hvc2VuWWVhciEgJiZcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoKHRoaXMuX21pbiEpID4gbW9udGg7XG4gICAgY29uc3QgaXNBZnRlck1heDogYm9vbGVhbiA9XG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5pc1ZhbGlkKHRoaXMuX21heCkgJiZcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIodGhpcy5fbWF4ISkgPD0gdGhpcy5fY2hvc2VuWWVhciEgJiZcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoKHRoaXMuX21heCEpIDwgbW9udGg7XG4gICAgcmV0dXJuICEoaXNCZWZvcmVNaW4gfHwgaXNBZnRlck1heCk7XG4gIH1cblxuICBwcml2YXRlIF9pc1llYXJJblJhbmdlKHllYXI6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5fbWluICYmICF0aGlzLl9tYXgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBpc0JlZm9yZU1pbjogYm9vbGVhbiA9XG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5pc1ZhbGlkKHRoaXMuX21pbikgJiYgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih0aGlzLl9taW4hKSA+IHllYXI7XG4gICAgY29uc3QgaXNBZnRlck1heDogYm9vbGVhbiA9XG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5pc1ZhbGlkKHRoaXMuX21heCkgJiYgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih0aGlzLl9tYXghKSA8IHllYXI7XG4gICAgcmV0dXJuICEoaXNCZWZvcmVNaW4gfHwgaXNBZnRlck1heCk7XG4gIH1cblxuICAvLyBJbXBsZW1lbnRhdGlvbiBhZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvY29tcG9uZW50cy9ibG9iL21haW4vc3JjL21hdGVyaWFsL2RhdGVwaWNrZXIveWVhci12aWV3LnRzI0wzNjZcbiAgcHJpdmF0ZSBfaXNNb250aEZpbHRlcmVkT3V0KG1vbnRoOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuZGF0ZUZpbHRlcikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgZmlyc3RPZk1vbnRoID0gdGhpcy5fZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZSh0aGlzLl9jaG9zZW5ZZWFyISwgbW9udGgsIDEpITtcbiAgICBmb3IgKFxuICAgICAgbGV0IGRhdGU6IFQgPSBmaXJzdE9mTW9udGg7XG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aChkYXRlKSA9PSBtb250aDtcbiAgICAgIGRhdGUgPSB0aGlzLl9kYXRlQWRhcHRlci5hZGRDYWxlbmRhckRheXMoZGF0ZSwgMSlcbiAgICApIHtcbiAgICAgIGlmICh0aGlzLmRhdGVGaWx0ZXIoZGF0ZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gSW1wbGVtZW50YXRpb24gYWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2NvbXBvbmVudHMvYmxvYi9tYWluL3NyYy9tYXRlcmlhbC9kYXRlcGlja2VyL211bHRpLXllYXItdmlldy50cyNMMzUxXG4gIHByaXZhdGUgX2lzWWVhckZpbHRlcmVkT3V0KHllYXI6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5kYXRlRmlsdGVyKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBmaXJzdE9mWWVhciA9IHRoaXMuX2RhdGVBZGFwdGVyLmNyZWF0ZURhdGUoeWVhciwgMSwgMSkhO1xuICAgIGZvciAoXG4gICAgICBsZXQgZGF0ZTogVCA9IGZpcnN0T2ZZZWFyO1xuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcihkYXRlKSA9PSB5ZWFyO1xuICAgICAgZGF0ZSA9IHRoaXMuX2RhdGVBZGFwdGVyLmFkZENhbGVuZGFyRGF5cyhkYXRlLCAxKVxuICAgICkge1xuICAgICAgaWYgKHRoaXMuZGF0ZUZpbHRlcihkYXRlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKiogRW1pdHMgdGhlIHNlbGVjdGVkIGRhdGUgYW5kIHNldHMgaXQgaW50ZXJuYWxseS4gKi9cbiAgcHJpdmF0ZSBfc2VsZWN0RGF0ZShkYXk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX2Nob3Nlbk1vbnRoID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3NldENob3NlblllYXIoKTtcbiAgICBpZiAodGhpcy5fc2VsZWN0ZWQgIT09IGRheSkge1xuICAgICAgdGhpcy5fc2VsZWN0ZWQgPSBkYXk7XG4gICAgICB0aGlzLl9kYXRlU2VsZWN0ZWQuZW1pdCh0aGlzLl9kYXRlQWRhcHRlci5kZXNlcmlhbGl6ZShkYXkpISk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc2V0Q2hvc2VuWWVhcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy52aWV3ID09PSAnbW9udGgnKSB7XG4gICAgICB0aGlzLl9jaG9zZW5ZZWFyID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcihcbiAgICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZGVzZXJpYWxpemUodGhpcy5fc2VsZWN0ZWQpID8/IHRoaXMuc2VsZWN0ZWQgPz8gdGhpcy5ub3csXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9jaG9zZW5ZZWFyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2Fzc2lnbkFjdGl2ZURhdGUoZGF0ZTogVCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9taW4gJiYgdGhpcy5fZGF0ZUFkYXB0ZXIuY29tcGFyZURhdGUodGhpcy5fbWluLCBkYXRlKSA+IDApIHtcbiAgICAgIHRoaXMuX2FjdGl2ZURhdGUgPSB0aGlzLl9taW47XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9tYXggJiYgdGhpcy5fZGF0ZUFkYXB0ZXIuY29tcGFyZURhdGUodGhpcy5fbWF4LCBkYXRlKSA8IDApIHtcbiAgICAgIHRoaXMuX2FjdGl2ZURhdGUgPSB0aGlzLl9tYXg7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2FjdGl2ZURhdGUgPSBkYXRlO1xuICB9XG5cbiAgLyoqIEdvZXMgdG8gdGhlIG1vbnRoIGlkZW50aWZpZWQgYnkgdGhlIHNoaWZ0LiAqL1xuICBwcml2YXRlIF9nb1RvRGlmZmVyZW50TW9udGgobW9udGhzOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9pbml0KHRoaXMuX2RhdGVBZGFwdGVyLmFkZENhbGVuZGFyTW9udGhzKHRoaXMuX2FjdGl2ZURhdGUsIG1vbnRocykpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ29Ub0RpZmZlcmVudFllYXIoeWVhcnM6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2Nob3NlblllYXIhICs9IHllYXJzO1xuICAgIC8vIENhbid0IHVzZSBgX2Fzc2lnbkFjdGl2ZURhdGUoLi4uKWAgaGVyZSwgYmVjYXVzZSBpdCB3aWxsIHNldCBpdCB0byBtaW4vbWF4IHZhbHVlIGlmIGFyZ3VtZW50IGlzIG91dCBvZiByYW5nZVxuICAgIHRoaXMuX2FjdGl2ZURhdGUgPSB0aGlzLl9kYXRlQWRhcHRlci5jcmVhdGVEYXRlKFxuICAgICAgdGhpcy5fY2hvc2VuWWVhciEsXG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aCh0aGlzLl9hY3RpdmVEYXRlKSxcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldERhdGUodGhpcy5fYWN0aXZlRGF0ZSksXG4gICAgKTtcbiAgICB0aGlzLl9pbml0KCk7XG4gIH1cblxuICBwcml2YXRlIF9nb1RvRGlmZmVyZW50WWVhclJhbmdlKHllYXJzOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9pbml0KHRoaXMuX2RhdGVBZGFwdGVyLmFkZENhbGVuZGFyWWVhcnModGhpcy5fYWN0aXZlRGF0ZSwgeWVhcnMpKTtcbiAgfVxuXG4gIHByaXZhdGUgX3ByZXZEaXNhYmxlZChwcmV2RGF0ZTogVCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5fbWluKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9kYXRlQWRhcHRlci5jb21wYXJlRGF0ZShwcmV2RGF0ZSwgdGhpcy5fbWluKSA8IDA7XG4gIH1cblxuICBwcml2YXRlIF9uZXh0RGlzYWJsZWQobmV4dERhdGU6IFQpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuX21heCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZGF0ZUFkYXB0ZXIuY29tcGFyZURhdGUobmV4dERhdGUsIHRoaXMuX21heCkgPiAwO1xuICB9XG5cbiAgLyoqIENoZWNrcyBpZiB0aGUgXCJwcmV2aW91cyBtb250aFwiIGJ1dHRvbiBzaG91bGQgYmUgZGlzYWJsZWQuICovXG4gIHByaXZhdGUgX3ByZXZpb3VzTW9udGhEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBwcmV2TW9udGggPSB0aGlzLl9kYXRlQWRhcHRlci5hZGRDYWxlbmRhckRheXMoXG4gICAgICB0aGlzLl9hY3RpdmVEYXRlLFxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0RGF0ZSh0aGlzLl9hY3RpdmVEYXRlKSAqIC0xLFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXZEaXNhYmxlZChwcmV2TW9udGgpO1xuICB9XG5cbiAgLyoqIENoZWNrcyBpZiB0aGUgXCJuZXh0IG1vbnRoXCIgYnV0dG9uIHNob3VsZCBiZSBkaXNhYmxlZC4gKi9cbiAgcHJpdmF0ZSBfbmV4dE1vbnRoRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgbGV0IG5leHRNb250aCA9IHRoaXMuX2RhdGVBZGFwdGVyLmFkZENhbGVuZGFyTW9udGhzKHRoaXMuX2FjdGl2ZURhdGUsIHRoaXMuX3dpZGUgPyAyIDogMSk7XG4gICAgbmV4dE1vbnRoID0gdGhpcy5fZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZShcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIobmV4dE1vbnRoKSxcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoKG5leHRNb250aCksXG4gICAgICAxLFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuX25leHREaXNhYmxlZChuZXh0TW9udGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcHJldmlvdXNZZWFyRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcHJldlllYXIgPSB0aGlzLl9kYXRlQWRhcHRlci5jcmVhdGVEYXRlKFxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih0aGlzLl9hY3RpdmVEYXRlKSAtIDEsXG4gICAgICAxMixcbiAgICAgIDMxLFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXZEaXNhYmxlZChwcmV2WWVhcik7XG4gIH1cblxuICBwcml2YXRlIF9uZXh0WWVhckRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG5leHRZZWFyID0gdGhpcy5fZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZShcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIodGhpcy5fYWN0aXZlRGF0ZSkgKyAxLFxuICAgICAgMSxcbiAgICAgIDEsXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5fbmV4dERpc2FibGVkKG5leHRZZWFyKTtcbiAgfVxuXG4gIHByaXZhdGUgX3ByZXZpb3VzWWVhclJhbmdlRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcHJldlllYXIgPSB0aGlzLl9kYXRlQWRhcHRlci5jcmVhdGVEYXRlKHRoaXMuX3llYXJzWzBdWzBdIC0gMSwgMTIsIDMxKTtcbiAgICByZXR1cm4gdGhpcy5fcHJldkRpc2FibGVkKHByZXZZZWFyKTtcbiAgfVxuXG4gIHByaXZhdGUgX25leHRZZWFyUmFuZ2VEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCB5ZWFycyA9IGlzQnJlYWtwb2ludCgnbWVkaXVtJykgJiYgdGhpcy53aWRlID8gdGhpcy5fbmV4dE1vbnRoWWVhcnMgOiB0aGlzLl95ZWFycztcbiAgICBjb25zdCBsYXN0WWVhclJhbmdlID0geWVhcnNbeWVhcnMubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgbGFzdFllYXIgPSBsYXN0WWVhclJhbmdlW2xhc3RZZWFyUmFuZ2UubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgbmV4dFllYXIgPSB0aGlzLl9kYXRlQWRhcHRlci5jcmVhdGVEYXRlKGxhc3RZZWFyICsgMSwgMSwgMSk7XG4gICAgcmV0dXJuIHRoaXMuX25leHREaXNhYmxlZChuZXh0WWVhcik7XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVUYWJsZUJsdXIoZXZlbnRUYXJnZXQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50VGFyZ2V0Py5sb2NhbE5hbWUgIT09ICdidXR0b24nKSB7XG4gICAgICB0aGlzLl9zZXRUYWJJbmRleCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3NldFRhYkluZGV4KCk6IHZvaWQge1xuICAgIEFycmF5LmZyb20oXG4gICAgICB0aGlzLnNoYWRvd1Jvb3QhLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zYmItY2FsZW5kYXJfX2NlbGxbdGFiaW5kZXg9XCIwXCJdJykgPz8gW10sXG4gICAgKS5mb3JFYWNoKChkYXkpID0+ICgoZGF5IGFzIEhUTUxFbGVtZW50KS50YWJJbmRleCA9IC0xKSk7XG4gICAgY29uc3QgZmlyc3RGb2N1c2FibGUgPSB0aGlzLl9nZXRGaXJzdEZvY3VzYWJsZSgpO1xuICAgIGlmIChmaXJzdEZvY3VzYWJsZSkge1xuICAgICAgZmlyc3RGb2N1c2FibGUudGFiSW5kZXggPSAwO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2dldEZpcnN0Rm9jdXNhYmxlKCk6IEhUTUxCdXR0b25FbGVtZW50IHtcbiAgICBjb25zdCBhY3RpdmUgPSB0aGlzLl9zZWxlY3RlZCA/IHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKHRoaXMuX3NlbGVjdGVkKSEgOiB0aGlzLm5vdztcbiAgICBsZXQgZmlyc3RGb2N1c2FibGUgPVxuICAgICAgdGhpcy5zaGFkb3dSb290IS5xdWVyeVNlbGVjdG9yKCcuc2JiLWNhbGVuZGFyX19zZWxlY3RlZCcpID8/XG4gICAgICB0aGlzLnNoYWRvd1Jvb3QhLnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgIGBbZGF0YS1kYXk9XCIke3RoaXMuX2RhdGVBZGFwdGVyLmdldERhdGUoYWN0aXZlKX0gJHt0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aChcbiAgICAgICAgICBhY3RpdmUsXG4gICAgICAgICl9ICR7dGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcihhY3RpdmUpfVwiXWAsXG4gICAgICApID8/XG4gICAgICB0aGlzLnNoYWRvd1Jvb3QhLnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLW1vbnRoPVwiJHt0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aChhY3RpdmUpfVwiXWApID8/XG4gICAgICB0aGlzLnNoYWRvd1Jvb3QhLnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLXllYXI9XCIke3RoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIoYWN0aXZlKX1cIl1gKTtcbiAgICBpZiAoIWZpcnN0Rm9jdXNhYmxlIHx8IChmaXJzdEZvY3VzYWJsZSBhcyBIVE1MQnV0dG9uRWxlbWVudCk/LmRpc2FibGVkKSB7XG4gICAgICBmaXJzdEZvY3VzYWJsZSA9IHRoaXMuc2hhZG93Um9vdCEucXVlcnlTZWxlY3RvcignLnNiYi1jYWxlbmRhcl9fY2VsbDpub3QoW2Rpc2FibGVkXSknKTtcbiAgICB9XG4gICAgcmV0dXJuIChmaXJzdEZvY3VzYWJsZSBhcyBIVE1MQnV0dG9uRWxlbWVudCkgfHwgbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZUtleWJvYXJkRXZlbnQoZXZlbnQ6IEtleWJvYXJkRXZlbnQsIGRheT86IERheSk6IHZvaWQge1xuICAgIGlmIChpc0Fycm93S2V5T3JQYWdlS2V5c1ByZXNzZWQoZXZlbnQpKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICAvLyBHZXRzIHRoZSBjdXJyZW50bHkgcmVuZGVyZWQgdGFibGUncyBjZWxsO1xuICAgIC8vIHRoZXkgY291bGQgYmUgZGF5cywgbW9udGhzIG9yIHllYXJzIGJhc2VkIG9uIHRoZSBjdXJyZW50IHNlbGVjdGlvbiB2aWV3LlxuICAgIC8vIElmIGB3aWRlYCBpcyB0cnVlLCB5ZWFycyBhcmUgZG91YmxlZCBpbiBudW1iZXIgYW5kIGRheXMgYXJlIChyb3VnaGx5KSBkb3VibGVkIHRvbywgYWZmZWN0aW5nIHRoZSBgaW5kZXhgIGNhbGN1bGF0aW9uLlxuICAgIGNvbnN0IGNlbGxzOiBIVE1MQnV0dG9uRWxlbWVudFtdID0gdGhpcy5fY2VsbHM7XG4gICAgY29uc3QgaW5kZXg6IG51bWJlciA9IGNlbGxzLmZpbmRJbmRleCgoZTogSFRNTEJ1dHRvbkVsZW1lbnQpID0+IGUgPT09IGV2ZW50LnRhcmdldCk7XG4gICAgY29uc3QgbmV4dEVsOiBIVE1MQnV0dG9uRWxlbWVudCA9IHRoaXMuX25hdmlnYXRlQnlLZXlib2FyZChldmVudCwgaW5kZXgsIGNlbGxzLCBkYXkpO1xuICAgIGNvbnN0IGFjdGl2ZUVsOiBIVE1MQnV0dG9uRWxlbWVudCA9IHRoaXMuc2hhZG93Um9vdCEuYWN0aXZlRWxlbWVudCBhcyBIVE1MQnV0dG9uRWxlbWVudDtcbiAgICBpZiAobmV4dEVsICE9PSBhY3RpdmVFbCkge1xuICAgICAgKG5leHRFbCBhcyBIVE1MQnV0dG9uRWxlbWVudCkudGFiSW5kZXggPSAwO1xuICAgICAgbmV4dEVsPy5mb2N1cygpO1xuICAgICAgKGFjdGl2ZUVsIGFzIEhUTUxCdXR0b25FbGVtZW50KS50YWJJbmRleCA9IC0xO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCB0byBtb3ZlIHRvLCBiYXNlZCBvbiBhIGxpc3Qgb2YgZWxlbWVudHMgKHdoaWNoIGNhbiBiZSBwb3RlbnRpYWxseSBkaXNhYmxlZCksXG4gICAqIHRoZSBrZXlib2FyZCBpbnB1dCBhbmQgdGhlIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IGVsZW1lbnQgaW4gdGhlIGxpc3QuXG4gICAqIEluIHRoZSBkYXkgdmlldywgdGhlIGBkYXk/OiBEYXlgIHBhcmFtZXRlciBpcyBtYW5kYXRvcnkgZm9yIGNhbGN1bGF0aW9uLFxuICAgKiB3aGlsZSBpbiBtb250aCBhbmQgeWVhciB2aWV3IGl0J3Mgbm90IGR1ZSB0byB0aGUgZml4ZWQgYW1vdW50IG9mIHJlbmRlcmVkIGNlbGxzLlxuICAgKi9cbiAgcHJpdmF0ZSBfbmF2aWdhdGVCeUtleWJvYXJkKFxuICAgIGV2dDogS2V5Ym9hcmRFdmVudCxcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIGNlbGxzOiBIVE1MQnV0dG9uRWxlbWVudFtdLFxuICAgIGRheT86IERheSxcbiAgKTogSFRNTEJ1dHRvbkVsZW1lbnQge1xuICAgIGNvbnN0IHtcbiAgICAgIGVsZW1lbnRJbmRleEZvcldpZGVNb2RlLFxuICAgICAgb2Zmc2V0Rm9yV2lkZU1vZGUsXG4gICAgICBsYXN0RWxlbWVudEluZGV4Rm9yV2lkZU1vZGUsXG4gICAgICB2ZXJ0aWNhbE9mZnNldCxcbiAgICB9OiBDYWxlbmRhcktleWJvYXJkTmF2aWdhdGlvblBhcmFtZXRlcnMgPSB0aGlzLl9jYWxjdWxhdGVQYXJhbWV0ZXJzRm9yS2V5Ym9hcmROYXZpZ2F0aW9uKFxuICAgICAgY2VsbHMsXG4gICAgICBpbmRleCxcbiAgICAgIGRheSxcbiAgICApO1xuXG4gICAgc3dpdGNoIChldnQua2V5KSB7XG4gICAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmROZXh0KGNlbGxzLCBpbmRleCwgLXZlcnRpY2FsT2Zmc2V0KTtcbiAgICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICAgIHJldHVybiB0aGlzLl9maW5kTmV4dChjZWxscywgaW5kZXgsIHZlcnRpY2FsT2Zmc2V0KTtcbiAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XG4gICAgICAgIHJldHVybiB0aGlzLl9maW5kTmV4dChjZWxscywgaW5kZXgsIC0xKTtcbiAgICAgIGNhc2UgJ0Fycm93UmlnaHQnOlxuICAgICAgICByZXR1cm4gdGhpcy5fZmluZE5leHQoY2VsbHMsIGluZGV4LCAxKTtcbiAgICAgIGNhc2UgJ0hvbWUnOlxuICAgICAgICByZXR1cm4gdGhpcy5fZmluZEZpcnN0KGNlbGxzLCBvZmZzZXRGb3JXaWRlTW9kZSk7XG4gICAgICBjYXNlICdQYWdlVXAnOlxuICAgICAgICByZXR1cm4gdGhpcy5fZmluZEZpcnN0T25Db2x1bW4oXG4gICAgICAgICAgY2VsbHMsXG4gICAgICAgICAgZWxlbWVudEluZGV4Rm9yV2lkZU1vZGUsXG4gICAgICAgICAgb2Zmc2V0Rm9yV2lkZU1vZGUsXG4gICAgICAgICAgdmVydGljYWxPZmZzZXQsXG4gICAgICAgICk7XG4gICAgICBjYXNlICdQYWdlRG93bic6XG4gICAgICAgIHJldHVybiB0aGlzLl9maW5kTGFzdE9uQ29sdW1uKGNlbGxzLCBpbmRleCwgbGFzdEVsZW1lbnRJbmRleEZvcldpZGVNb2RlLCB2ZXJ0aWNhbE9mZnNldCk7XG4gICAgICBjYXNlICdFbmQnOlxuICAgICAgICByZXR1cm4gdGhpcy5fZmluZExhc3QoY2VsbHMsIGxhc3RFbGVtZW50SW5kZXhGb3JXaWRlTW9kZSAtIDEpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGNlbGxzW2luZGV4XTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyB0aGUgcGFyYW1ldGVyIG5lZWRlZCBpbiBrZXlib2FyZCBuYXZpZ2F0aW9uLlxuICAgKiBTaW5jZSB0aHJlZSB2aWV3cyBhcmUgbm93IGF2YWlsYWJsZSwgdGhlIGZ1bmN0aW9uIGNyZWF0ZXMgYW5kIHJldHVybnMgdGhlIGNvcnJlY3QgcGFyYW1ldGVycyBmb3IgZWFjaCBvZiB0aGVtXG4gICAqIGJ5IGNvbnNpZGVyaW5nIHRoZSBudW1iZXIgb2YgY2VsbHMgcGVyIGVhY2ggcm93IGFuZCB0aGUgY29ycmVjdGlvbiBmb3IgdGhlIHdpZGUgbW9kZS5cbiAgICogQHBhcmFtIGNlbGxzIFRoZSBhcnJheSBvZiByZW5kZXJlZCB0YWJsZSBjZWxsczsgdGhleSBhcmUgYnV0dG9ucyB0aGF0IGNhbiByZXByZXNlbnQgZGF5cywgbW9udGhzIG9yIHllYXJzLlxuICAgKiBAcGFyYW0gaW5kZXggVGhlIHN0YXJ0aW5nIGVsZW1lbnQncyBpbmRleCBpbiB0aGUgY2VsbCBhcnJheS5cbiAgICogQHBhcmFtIGRheSAob3B0aW9uYWwpIE9ubHkgaW4gdGhlIGRheSB2aWV3LCB0aGUgZGF5IHJlcHJlc2VudGVkIGJ5IHRoZSBzdGFydGluZyBjZWxsLlxuICAgKi9cbiAgcHJpdmF0ZSBfY2FsY3VsYXRlUGFyYW1ldGVyc0ZvcktleWJvYXJkTmF2aWdhdGlvbihcbiAgICBjZWxsczogSFRNTEJ1dHRvbkVsZW1lbnRbXSxcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIGRheT86IERheSxcbiAgKTogQ2FsZW5kYXJLZXlib2FyZE5hdmlnYXRpb25QYXJhbWV0ZXJzIHtcbiAgICBzd2l0Y2ggKHRoaXMuX2NhbGVuZGFyVmlldykge1xuICAgICAgY2FzZSAnZGF5Jzoge1xuICAgICAgICBjb25zdCBpbmRleEluVmlldyA9ICtkYXkhLmRheVZhbHVlIC0gMTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB2ZXJ0aWNhbE9mZnNldDogREFZU19QRVJfUk9XLFxuICAgICAgICAgIGVsZW1lbnRJbmRleEZvcldpZGVNb2RlOiBpbmRleEluVmlldyxcbiAgICAgICAgICBvZmZzZXRGb3JXaWRlTW9kZTogaW5kZXggLSBpbmRleEluVmlldyxcbiAgICAgICAgICBsYXN0RWxlbWVudEluZGV4Rm9yV2lkZU1vZGU6XG4gICAgICAgICAgICBpbmRleCA9PT0gaW5kZXhJblZpZXdcbiAgICAgICAgICAgICAgPyB0aGlzLl9kYXRlQWRhcHRlci5nZXROdW1EYXlzSW5Nb250aChcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmFkZENhbGVuZGFyTW9udGhzKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9kYXRlQWRhcHRlci5kZXNlcmlhbGl6ZShkYXkhLnZhbHVlKSEsXG4gICAgICAgICAgICAgICAgICAgIC0xLFxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIDogY2VsbHMubGVuZ3RoLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgLy8gTW9udGggdmlldyBpcyBub3QgZGVwZW5kZW50IGZyb20gYHdpZGVgIHZhbHVlLCBzbyBzb21lIHBhcmFtZXRlcnMgYXJlIGZpeGVkLlxuICAgICAgY2FzZSAnbW9udGgnOiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdmVydGljYWxPZmZzZXQ6IE1PTlRIU19QRVJfUk9XLFxuICAgICAgICAgIGVsZW1lbnRJbmRleEZvcldpZGVNb2RlOiBpbmRleCxcbiAgICAgICAgICBvZmZzZXRGb3JXaWRlTW9kZTogMCxcbiAgICAgICAgICBsYXN0RWxlbWVudEluZGV4Rm9yV2lkZU1vZGU6IDEyLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY2FzZSAneWVhcic6IHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0OiBudW1iZXIgPSBNYXRoLnRydW5jKGluZGV4IC8gWUVBUlNfUEVSX1BBR0UpICogWUVBUlNfUEVSX1BBR0U7XG4gICAgICAgIGNvbnN0IGluZGV4SW5WaWV3OiBudW1iZXIgPSBvZmZzZXQgPT09IDAgPyBpbmRleCA6IGluZGV4IC0gWUVBUlNfUEVSX1BBR0U7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdmVydGljYWxPZmZzZXQ6IFlFQVJTX1BFUl9ST1csXG4gICAgICAgICAgZWxlbWVudEluZGV4Rm9yV2lkZU1vZGU6IGluZGV4SW5WaWV3LFxuICAgICAgICAgIG9mZnNldEZvcldpZGVNb2RlOiBpbmRleCAtIGluZGV4SW5WaWV3LFxuICAgICAgICAgIGxhc3RFbGVtZW50SW5kZXhGb3JXaWRlTW9kZTogb2Zmc2V0ID09PSAwID8gWUVBUlNfUEVSX1BBR0UgOiBZRUFSU19QRVJfUEFHRSAqIDIsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIG5leHQgZWxlbWVudCBvZiB0aGUgcHJvdmlkZWQgYXJyYXkgc3RhcnRpbmcgZnJvbSBgaW5kZXhgIGJ5IGFkZGluZyBgZGVsdGFgLlxuICAgKiBJZiB0aGUgZm91bmQgZWxlbWVudCBpcyBkaXNhYmxlZCwgaXQgY29udGludWVzIGFkZGluZyBgZGVsdGFgIHVudGlsIGl0IGZpbmRzIGFuIGVuYWJsZWQgb25lIGluIHRoZSBhcnJheSBib3VuZHMuXG4gICAqL1xuICBwcml2YXRlIF9maW5kTmV4dChkYXlzOiBIVE1MQnV0dG9uRWxlbWVudFtdLCBpbmRleDogbnVtYmVyLCBkZWx0YTogbnVtYmVyKTogSFRNTEJ1dHRvbkVsZW1lbnQge1xuICAgIGxldCBuZXh0SW5kZXggPSBpbmRleCArIGRlbHRhO1xuICAgIHdoaWxlIChuZXh0SW5kZXggPCBkYXlzLmxlbmd0aCAmJiBkYXlzW25leHRJbmRleF0/LmRpc2FibGVkKSB7XG4gICAgICBuZXh0SW5kZXggKz0gZGVsdGE7XG4gICAgfVxuICAgIHJldHVybiBkYXlzW25leHRJbmRleF0gPz8gZGF5c1tpbmRleF07XG4gIH1cblxuICAvKiogRmluZCB0aGUgZmlyc3QgZW5hYmxlZCBlbGVtZW50IGluIHRoZSBwcm92aWRlZCBhcnJheS4gKi9cbiAgcHJpdmF0ZSBfZmluZEZpcnN0KGRheXM6IEhUTUxCdXR0b25FbGVtZW50W10sIGZpcnN0T2ZDdXJyZW50TW9udGg6IG51bWJlcik6IEhUTUxCdXR0b25FbGVtZW50IHtcbiAgICByZXR1cm4gIWRheXNbZmlyc3RPZkN1cnJlbnRNb250aF0uZGlzYWJsZWRcbiAgICAgID8gZGF5c1tmaXJzdE9mQ3VycmVudE1vbnRoXVxuICAgICAgOiB0aGlzLl9maW5kTmV4dChkYXlzLCBmaXJzdE9mQ3VycmVudE1vbnRoLCAxKTtcbiAgfVxuXG4gIC8qKiBGaW5kIHRoZSBsYXN0IGVuYWJsZWQgZWxlbWVudCBpbiB0aGUgcHJvdmlkZWQgYXJyYXkuICovXG4gIHByaXZhdGUgX2ZpbmRMYXN0KGRheXM6IEhUTUxCdXR0b25FbGVtZW50W10sIGxhc3RPZkN1cnJlbnRNb250aDogbnVtYmVyKTogSFRNTEJ1dHRvbkVsZW1lbnQge1xuICAgIHJldHVybiAhZGF5c1tsYXN0T2ZDdXJyZW50TW9udGhdLmRpc2FibGVkXG4gICAgICA/IGRheXNbbGFzdE9mQ3VycmVudE1vbnRoXVxuICAgICAgOiB0aGlzLl9maW5kTmV4dChkYXlzLCBsYXN0T2ZDdXJyZW50TW9udGgsIC0xKTtcbiAgfVxuXG4gIC8qKiBGaW5kIHRoZSBmaXJzdCBlbmFibGVkIGVsZW1lbnQgaW4gdGhlIHNhbWUgY29sdW1uIG9mIHRoZSBwcm92aWRlZCBhcnJheS4gKi9cbiAgcHJpdmF0ZSBfZmluZEZpcnN0T25Db2x1bW4oXG4gICAgZGF5czogSFRNTEJ1dHRvbkVsZW1lbnRbXSxcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIG9mZnNldDogbnVtYmVyLFxuICAgIHZlcnRpY2FsT2Zmc2V0OiBudW1iZXIsXG4gICk6IEhUTUxCdXR0b25FbGVtZW50IHtcbiAgICBjb25zdCBuZXh0SW5kZXggPSAoaW5kZXggJSB2ZXJ0aWNhbE9mZnNldCkgKyBvZmZzZXQ7XG4gICAgcmV0dXJuICFkYXlzW25leHRJbmRleF0uZGlzYWJsZWRcbiAgICAgID8gZGF5c1tuZXh0SW5kZXhdXG4gICAgICA6IHRoaXMuX2ZpbmROZXh0KGRheXMsIG5leHRJbmRleCwgdmVydGljYWxPZmZzZXQpO1xuICB9XG5cbiAgLyoqIEZpbmQgdGhlIGxhc3QgZW5hYmxlZCBlbGVtZW50IGluIHRoZSBzYW1lIGNvbHVtbiBvZiB0aGUgcHJvdmlkZWQgYXJyYXkuICovXG4gIHByaXZhdGUgX2ZpbmRMYXN0T25Db2x1bW4oXG4gICAgZGF5czogSFRNTEJ1dHRvbkVsZW1lbnRbXSxcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIG9mZnNldDogbnVtYmVyLFxuICAgIHZlcnRpY2FsT2Zmc2V0OiBudW1iZXIsXG4gICk6IEhUTUxCdXR0b25FbGVtZW50IHtcbiAgICBjb25zdCBuZXh0SW5kZXggPSBpbmRleCArIE1hdGgudHJ1bmMoKG9mZnNldCAtIGluZGV4IC0gMSkgLyB2ZXJ0aWNhbE9mZnNldCkgKiB2ZXJ0aWNhbE9mZnNldDtcbiAgICByZXR1cm4gIWRheXNbbmV4dEluZGV4XS5kaXNhYmxlZFxuICAgICAgPyBkYXlzW25leHRJbmRleF1cbiAgICAgIDogdGhpcy5fZmluZE5leHQoZGF5cywgbmV4dEluZGV4LCAtdmVydGljYWxPZmZzZXQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVzZXRDYWxlbmRhclZpZXcoaW5pdFRyYW5zaXRpb24gPSBmYWxzZSk6IHZvaWQge1xuICAgIHRoaXMuX3Jlc2V0Rm9jdXMgPSB0cnVlO1xuICAgIHRoaXMuX2FjdGl2ZURhdGUgPSB0aGlzLnNlbGVjdGVkID8/IHRoaXMubm93O1xuICAgIHRoaXMuX3NldENob3NlblllYXIoKTtcbiAgICB0aGlzLl9jaG9zZW5Nb250aCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9uZXh0Q2FsZW5kYXJWaWV3ID0gdGhpcy5fY2FsZW5kYXJWaWV3ID0gdGhpcy52aWV3O1xuXG4gICAgaWYgKGluaXRUcmFuc2l0aW9uKSB7XG4gICAgICB0aGlzLl9zdGFydFRhYmxlVHJhbnNpdGlvbigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBSZW5kZXIgdGhlIHZpZXcgZm9yIHRoZSBkYXkgc2VsZWN0aW9uLiAqL1xuICBwcml2YXRlIF9yZW5kZXJEYXlWaWV3KCk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICBjb25zdCBuZXh0TW9udGhBY3RpdmVEYXRlID0gdGhpcy5fd2lkZVxuICAgICAgPyB0aGlzLl9kYXRlQWRhcHRlci5hZGRDYWxlbmRhck1vbnRocyh0aGlzLl9hY3RpdmVEYXRlLCAxKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8ZGl2IGNsYXNzPVwic2JiLWNhbGVuZGFyX19jb250cm9sc1wiPlxuICAgICAgICAke3RoaXMuX2dldEFycm93KFxuICAgICAgICAgICdsZWZ0JyxcbiAgICAgICAgICAoKSA9PiB0aGlzLl9nb1RvRGlmZmVyZW50TW9udGgoLTEpLFxuICAgICAgICAgIGkxOG5QcmV2aW91c01vbnRoW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdLFxuICAgICAgICAgIHRoaXMuX3ByZXZpb3VzTW9udGhEaXNhYmxlZCgpLFxuICAgICAgICApfVxuICAgICAgICA8ZGl2IGNsYXNzPVwic2JiLWNhbGVuZGFyX19jb250cm9scy1tb250aFwiPlxuICAgICAgICAgICR7dGhpcy5fY3JlYXRlTGFiZWxGb3JEYXlWaWV3KHRoaXMuX2FjdGl2ZURhdGUpfVxuICAgICAgICAgICR7dGhpcy5fd2lkZSA/IHRoaXMuX2NyZWF0ZUxhYmVsRm9yRGF5VmlldyhuZXh0TW9udGhBY3RpdmVEYXRlISkgOiBub3RoaW5nfVxuICAgICAgICAgIDxzYmItc2NyZWVuLXJlYWRlci1vbmx5IHJvbGU9XCJzdGF0dXNcIj5cbiAgICAgICAgICAgICR7dGhpcy5fY3JlYXRlQXJpYUxhYmVsRm9yRGF5Vmlldyh0aGlzLl9hY3RpdmVEYXRlLCBuZXh0TW9udGhBY3RpdmVEYXRlISl9XG4gICAgICAgICAgPC9zYmItc2NyZWVuLXJlYWRlci1vbmx5PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgJHt0aGlzLl9nZXRBcnJvdyhcbiAgICAgICAgICAncmlnaHQnLFxuICAgICAgICAgICgpID0+IHRoaXMuX2dvVG9EaWZmZXJlbnRNb250aCgxKSxcbiAgICAgICAgICBpMThuTmV4dE1vbnRoW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdLFxuICAgICAgICAgIHRoaXMuX25leHRNb250aERpc2FibGVkKCksXG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlLWNvbnRhaW5lciBzYmItY2FsZW5kYXJfX3RhYmxlLWRheS12aWV3XCI+XG4gICAgICAgICR7dGhpcy5fY3JlYXRlRGF5VGFibGUodGhpcy5fd2Vla3MpfVxuICAgICAgICAke3RoaXMuX3dpZGUgPyB0aGlzLl9jcmVhdGVEYXlUYWJsZSh0aGlzLl9uZXh0TW9udGhXZWVrcykgOiBub3RoaW5nfVxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxuXG4gIC8qKiBDcmVhdGVzIHRoZSBsYWJlbCB3aXRoIHRoZSBtb250aCBmb3IgdGhlIGRhaWx5IHZpZXcuICovXG4gIHByaXZhdGUgX2NyZWF0ZUxhYmVsRm9yRGF5VmlldyhkOiBUKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIGNvbnN0IG1vbnRoTGFiZWwgPSBgJHtcbiAgICAgIHRoaXMuX21vbnRoTmFtZXNbdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGgoZCkgLSAxXVxuICAgIH0gJHt0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKGQpfWA7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBpZD1cInNiYi1jYWxlbmRhcl9fZGF0ZS1zZWxlY3Rpb25cIlxuICAgICAgICBjbGFzcz1cInNiYi1jYWxlbmRhcl9fY29udHJvbHMtY2hhbmdlLWRhdGVcIlxuICAgICAgICBhcmlhLWxhYmVsPVwiJHtpMThuWWVhck1vbnRoU2VsZWN0aW9uW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdfSAke21vbnRoTGFiZWx9XCJcbiAgICAgICAgQGNsaWNrPSR7KCkgPT4ge1xuICAgICAgICAgIHRoaXMuX3Jlc2V0Rm9jdXMgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuX25leHRDYWxlbmRhclZpZXcgPSAneWVhcic7XG4gICAgICAgICAgdGhpcy5fc3RhcnRUYWJsZVRyYW5zaXRpb24oKTtcbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAgJHttb250aExhYmVsfVxuICAgICAgICA8c2JiLWljb24gbmFtZT1cImNoZXZyb24tc21hbGwtZG93bi1zbWFsbFwiPjwvc2JiLWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICBgO1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgdGhlIGFyaWEtbGFiZWwgZm9yIHRoZSBkYWlseSB2aWV3LiAqL1xuICBwcml2YXRlIF9jcmVhdGVBcmlhTGFiZWxGb3JEYXlWaWV3KC4uLmRhdGVzOiBUW10pOiBzdHJpbmcge1xuICAgIGxldCBtb250aExhYmVsID0gJyc7XG4gICAgZm9yIChjb25zdCBkIG9mIGRhdGVzKSB7XG4gICAgICBpZiAoZCkge1xuICAgICAgICBtb250aExhYmVsICs9IGAke1xuICAgICAgICAgIHRoaXMuX21vbnRoTmFtZXNbdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGgoZCkgLSAxXVxuICAgICAgICB9ICR7dGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcihkKX0gYDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1vbnRoTGFiZWw7XG4gIH1cblxuICAvKiogQ3JlYXRlcyB0aGUgY2FsZW5kYXIgdGFibGUgZm9yIHRoZSBkYWlseSB2aWV3LiAqL1xuICBwcml2YXRlIF9jcmVhdGVEYXlUYWJsZSh3ZWVrczogRGF5W11bXSk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDx0YWJsZVxuICAgICAgICBjbGFzcz1cInNiYi1jYWxlbmRhcl9fdGFibGVcIlxuICAgICAgICBAZm9jdXNvdXQ9JHsoZXZlbnQ6IEZvY3VzRXZlbnQpID0+XG4gICAgICAgICAgdGhpcy5faGFuZGxlVGFibGVCbHVyKGV2ZW50LnJlbGF0ZWRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpfVxuICAgICAgICBAYW5pbWF0aW9uZW5kPSR7KGU6IEFuaW1hdGlvbkV2ZW50KSA9PiB0aGlzLl90YWJsZUFuaW1hdGlvbkVuZChlKX1cbiAgICAgID5cbiAgICAgICAgPHRoZWFkIGNsYXNzPVwic2JiLWNhbGVuZGFyX190YWJsZS1oZWFkZXJcIj5cbiAgICAgICAgICA8dHIgY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlLWhlYWRlci1yb3dcIj5cbiAgICAgICAgICAgICR7dGhpcy5fY3JlYXRlRGF5VGFibGVIZWFkZXIoKX1cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L3RoZWFkPlxuICAgICAgICA8dGJvZHkgY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlLWJvZHlcIj5cbiAgICAgICAgICAke3RoaXMuX2NyZWF0ZURheVRhYmxlQm9keSh3ZWVrcyl9XG4gICAgICAgIDwvdGJvZHk+XG4gICAgICA8L3RhYmxlPlxuICAgIGA7XG4gIH1cblxuICAvKiogQ3JlYXRlcyB0aGUgdGFibGUgaGVhZGVyIHdpdGggdGhlIG1vbnRoIGhlYWRlciBjZWxscy4gKi9cbiAgcHJpdmF0ZSBfY3JlYXRlRGF5VGFibGVIZWFkZXIoKTogVGVtcGxhdGVSZXN1bHRbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzLm1hcChcbiAgICAgIChkYXk6IFdlZWtkYXkpID0+IGh0bWxgXG4gICAgICAgIDx0aCBjbGFzcz1cInNiYi1jYWxlbmRhcl9fdGFibGUtaGVhZGVyXCI+XG4gICAgICAgICAgPHNiYi1zY3JlZW4tcmVhZGVyLW9ubHk+JHtkYXkubG9uZ308L3NiYi1zY3JlZW4tcmVhZGVyLW9ubHk+XG4gICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JHtkYXkubmFycm93fTwvc3Bhbj5cbiAgICAgICAgPC90aD5cbiAgICAgIGAsXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBDcmVhdGVzIHRoZSB0YWJsZSBib2R5IHdpdGggdGhlIGRheSBjZWxscy4gRm9yIHRoZSBmaXJzdCByb3csIGl0IGFsc28gY29uc2lkZXJzIHRoZSBwb3NzaWJsZSBkYXkncyBvZmZzZXQuICovXG4gIHByaXZhdGUgX2NyZWF0ZURheVRhYmxlQm9keSh3ZWVrczogRGF5W11bXSk6IFRlbXBsYXRlUmVzdWx0W10ge1xuICAgIGNvbnN0IHRvZGF5OiBzdHJpbmcgPSB0aGlzLl9kYXRlQWRhcHRlci50b0lzbzg2MDEodGhpcy5ub3cpO1xuICAgIHJldHVybiB3ZWVrcy5tYXAoKHdlZWs6IERheVtdLCByb3dJbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICBjb25zdCBmaXJzdFJvd09mZnNldDogbnVtYmVyID0gREFZU19QRVJfUk9XIC0gd2Vlay5sZW5ndGg7XG4gICAgICBpZiAocm93SW5kZXggPT09IDAgJiYgZmlyc3RSb3dPZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIGh0bWxgXG4gICAgICAgICAgPHRyPlxuICAgICAgICAgICAgJHtbLi4uQXJyYXkoZmlyc3RSb3dPZmZzZXQpLmtleXMoKV0ubWFwKFxuICAgICAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgICAgIGh0bWxgPHRkXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInNiYi1jYWxlbmRhcl9fdGFibGUtZGF0YVwiXG4gICAgICAgICAgICAgICAgICBkYXRhLWRheT0ke2AwICR7d2Vla1swXS5tb250aFZhbHVlfSAke3dlZWtbMF0ueWVhclZhbHVlfWB9XG4gICAgICAgICAgICAgICAgPjwvdGQ+YCxcbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICAke3RoaXMuX2NyZWF0ZURheUNlbGxzKHdlZWssIHRvZGF5KX1cbiAgICAgICAgICA8L3RyPlxuICAgICAgICBgO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGh0bWxgPHRyPlxuICAgICAgICAke3RoaXMuX2NyZWF0ZURheUNlbGxzKHdlZWssIHRvZGF5KX1cbiAgICAgIDwvdHI+YDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBDcmVhdGVzIHRoZSBjZWxscyBmb3IgdGhlIGRhaWx5IHZpZXcuICovXG4gIHByaXZhdGUgX2NyZWF0ZURheUNlbGxzKHdlZWs6IERheVtdLCB0b2RheTogc3RyaW5nKTogVGVtcGxhdGVSZXN1bHRbXSB7XG4gICAgcmV0dXJuIHdlZWsubWFwKChkYXk6IERheSkgPT4ge1xuICAgICAgY29uc3QgaXNPdXRPZlJhbmdlID0gIXRoaXMuX2lzRGF5SW5SYW5nZShkYXkudmFsdWUpO1xuICAgICAgY29uc3QgaXNGaWx0ZXJlZE91dCA9ICF0aGlzLl9kYXRlRmlsdGVyKHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKGRheS52YWx1ZSkhKTtcbiAgICAgIGNvbnN0IHNlbGVjdGVkOiBib29sZWFuID0gISF0aGlzLl9zZWxlY3RlZCAmJiBkYXkudmFsdWUgPT09IHRoaXMuX3NlbGVjdGVkO1xuICAgICAgY29uc3QgZGF5VmFsdWUgPSBgJHtkYXkuZGF5VmFsdWV9ICR7ZGF5Lm1vbnRoVmFsdWV9ICR7ZGF5LnllYXJWYWx1ZX1gO1xuICAgICAgY29uc3QgaXNUb2RheSA9IGRheS52YWx1ZSA9PT0gdG9kYXk7XG4gICAgICByZXR1cm4gaHRtbGBcbiAgICAgICAgPHRkXG4gICAgICAgICAgY2xhc3M9JHtjbGFzc01hcCh7XG4gICAgICAgICAgICAnc2JiLWNhbGVuZGFyX190YWJsZS1kYXRhJzogdHJ1ZSxcbiAgICAgICAgICAgICdzYmItY2FsZW5kYXJfX3RhYmxlLWRhdGEtc2VsZWN0ZWQnOiBzZWxlY3RlZCxcbiAgICAgICAgICB9KX1cbiAgICAgICAgPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzPSR7Y2xhc3NNYXAoe1xuICAgICAgICAgICAgICAnc2JiLWNhbGVuZGFyX19jZWxsJzogdHJ1ZSxcbiAgICAgICAgICAgICAgJ3NiYi1jYWxlbmRhcl9fZGF5JzogdHJ1ZSxcbiAgICAgICAgICAgICAgJ3NiYi1jYWxlbmRhcl9fY2VsbC1jdXJyZW50JzogaXNUb2RheSxcbiAgICAgICAgICAgICAgJ3NiYi1jYWxlbmRhcl9fc2VsZWN0ZWQnOiBzZWxlY3RlZCxcbiAgICAgICAgICAgICAgJ3NiYi1jYWxlbmRhcl9fY3Jvc3NlZC1vdXQnOiAhaXNPdXRPZlJhbmdlICYmIGlzRmlsdGVyZWRPdXQsXG4gICAgICAgICAgICB9KX1cbiAgICAgICAgICAgIEBjbGljaz0keygpID0+IHRoaXMuX3NlbGVjdERhdGUoZGF5LnZhbHVlKX1cbiAgICAgICAgICAgID9kaXNhYmxlZD0ke2lzT3V0T2ZSYW5nZSB8fCBpc0ZpbHRlcmVkT3V0fVxuICAgICAgICAgICAgYXJpYS1sYWJlbD0ke3RoaXMuX2RhdGVBZGFwdGVyLmdldEFjY2Vzc2liaWxpdHlGb3JtYXREYXRlKGRheS52YWx1ZSl9XG4gICAgICAgICAgICBhcmlhLXByZXNzZWQ9JHtzZWxlY3RlZH1cbiAgICAgICAgICAgIGFyaWEtZGlzYWJsZWQ9JHtpc091dE9mUmFuZ2UgfHwgaXNGaWx0ZXJlZE91dH1cbiAgICAgICAgICAgIGFyaWEtY3VycmVudD0ke2lzVG9kYXkgPyAnZGF0ZScgOiBub3RoaW5nfVxuICAgICAgICAgICAgZGF0YS1kYXk9JHtkYXlWYWx1ZSB8fCBub3RoaW5nfVxuICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICBAa2V5ZG93bj0keyhldnQ6IEtleWJvYXJkRXZlbnQpID0+IHRoaXMuX2hhbmRsZUtleWJvYXJkRXZlbnQoZXZ0LCBkYXkpfVxuICAgICAgICAgICAgc2JiLXBvcG92ZXItY2xvc2VcbiAgICAgICAgICA+XG4gICAgICAgICAgICAke2RheS5kYXlWYWx1ZX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC90ZD5cbiAgICAgIGA7XG4gICAgfSk7XG4gIH1cblxuICAvKiogUmVuZGVyIHRoZSB2aWV3IGZvciB0aGUgbW9udGggc2VsZWN0aW9uLiAqL1xuICBwcml2YXRlIF9yZW5kZXJNb250aFZpZXcoKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIHJldHVybiBodG1sYFxuICAgICAgPGRpdiBjbGFzcz1cInNiYi1jYWxlbmRhcl9fY29udHJvbHNcIj5cbiAgICAgICAgJHt0aGlzLl9nZXRBcnJvdyhcbiAgICAgICAgICAnbGVmdCcsXG4gICAgICAgICAgKCkgPT4gdGhpcy5fZ29Ub0RpZmZlcmVudFllYXIoLTEpLFxuICAgICAgICAgIGkxOG5QcmV2aW91c1llYXJbdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF0sXG4gICAgICAgICAgdGhpcy5fcHJldmlvdXNZZWFyRGlzYWJsZWQoKSxcbiAgICAgICAgKX1cbiAgICAgICAgPGRpdiBjbGFzcz1cInNiYi1jYWxlbmRhcl9fY29udHJvbHMtbW9udGhcIj4ke3RoaXMuX2NyZWF0ZUxhYmVsRm9yTW9udGhWaWV3KCl9PC9kaXY+XG4gICAgICAgICR7dGhpcy5fZ2V0QXJyb3coXG4gICAgICAgICAgJ3JpZ2h0JyxcbiAgICAgICAgICAoKSA9PiB0aGlzLl9nb1RvRGlmZmVyZW50WWVhcigxKSxcbiAgICAgICAgICBpMThuTmV4dFllYXJbdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF0sXG4gICAgICAgICAgdGhpcy5fbmV4dFllYXJEaXNhYmxlZCgpLFxuICAgICAgICApfVxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwic2JiLWNhbGVuZGFyX190YWJsZS1jb250YWluZXIgc2JiLWNhbGVuZGFyX190YWJsZS1tb250aC12aWV3XCI+XG4gICAgICAgICR7dGhpcy5fY3JlYXRlTW9udGhUYWJsZSh0aGlzLl9tb250aHMsIHRoaXMuX2Nob3NlblllYXIhKX1cbiAgICAgICAgJHt0aGlzLl93aWRlID8gdGhpcy5fY3JlYXRlTW9udGhUYWJsZSh0aGlzLl9tb250aHMsIHRoaXMuX2Nob3NlblllYXIhICsgMSwgdHJ1ZSkgOiBub3RoaW5nfVxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxuXG4gIC8qKiBDcmVhdGVzIHRoZSBsYWJlbCB3aXRoIHRoZSB5ZWFyIGZvciB0aGUgbW9udGhseSB2aWV3LiAqL1xuICBwcml2YXRlIF9jcmVhdGVMYWJlbEZvck1vbnRoVmlldygpOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIGh0bWxgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGlkPVwic2JiLWNhbGVuZGFyX19tb250aC1zZWxlY3Rpb25cIlxuICAgICAgICBjbGFzcz1cInNiYi1jYWxlbmRhcl9fY29udHJvbHMtY2hhbmdlLWRhdGVcIlxuICAgICAgICBhcmlhLWxhYmVsPSR7YCR7aTE4bkNhbGVuZGFyRGF0ZVNlbGVjdGlvblt0aGlzLl9sYW5ndWFnZS5jdXJyZW50XX0gJHt0aGlzLl9jaG9zZW5ZZWFyfWB9XG4gICAgICAgIEBjbGljaz0keygpID0+IHRoaXMuX3Jlc2V0Q2FsZW5kYXJWaWV3KHRydWUpfVxuICAgICAgPlxuICAgICAgICAke3RoaXMuX2Nob3NlblllYXJ9ICR7dGhpcy5fd2lkZSA/IGAgLSAke3RoaXMuX2Nob3NlblllYXIhICsgMX1gIDogbm90aGluZ31cbiAgICAgICAgPHNiYi1pY29uIG5hbWU9XCJjaGV2cm9uLXNtYWxsLXVwLXNtYWxsXCI+PC9zYmItaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPHNiYi1zY3JlZW4tcmVhZGVyLW9ubHkgcm9sZT1cInN0YXR1c1wiPiAke3RoaXMuX2Nob3NlblllYXJ9IDwvc2JiLXNjcmVlbi1yZWFkZXItb25seT5gO1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgdGhlIHRhYmxlIGZvciB0aGUgbW9udGggc2VsZWN0aW9uIHZpZXcuICovXG4gIHByaXZhdGUgX2NyZWF0ZU1vbnRoVGFibGUobW9udGhzOiBNb250aFtdW10sIHllYXI6IG51bWJlciwgc2hpZnRSaWdodCA9IGZhbHNlKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIHJldHVybiBodG1sYFxuICAgICAgPHRhYmxlXG4gICAgICAgIGNsYXNzPVwic2JiLWNhbGVuZGFyX190YWJsZVwiXG4gICAgICAgIEBhbmltYXRpb25lbmQ9JHsoZTogQW5pbWF0aW9uRXZlbnQpID0+IHRoaXMuX3RhYmxlQW5pbWF0aW9uRW5kKGUpfVxuICAgICAgPlxuICAgICAgICAke3RoaXMuX3dpZGVcbiAgICAgICAgICA/IGh0bWxgPHRoZWFkIGNsYXNzPVwic2JiLWNhbGVuZGFyX190YWJsZS1oZWFkZXJcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgPHRyIGNsYXNzPVwic2JiLWNhbGVuZGFyX190YWJsZS1oZWFkZXItcm93XCI+XG4gICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwic2JiLWNhbGVuZGFyX190YWJsZS1oZWFkZXJcIiBjb2xzcGFuPSR7TU9OVEhTX1BFUl9ST1d9PiR7eWVhcn08L3RoPlxuICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5gXG4gICAgICAgICAgOiBub3RoaW5nfVxuICAgICAgICA8dGJvZHkgY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlLWJvZHlcIj5cbiAgICAgICAgICAke21vbnRocy5tYXAoXG4gICAgICAgICAgICAocm93OiBNb250aFtdKSA9PiBodG1sYFxuICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgJHtyb3cubWFwKChtb250aDogTW9udGgpID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGlzT3V0T2ZSYW5nZSA9ICF0aGlzLl9pc01vbnRoSW5SYW5nZShtb250aC5tb250aFZhbHVlKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGlzRmlsdGVyZWRPdXQgPSAhdGhpcy5faXNNb250aEZpbHRlcmVkT3V0KG1vbnRoLm1vbnRoVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRNb250aCA9IHRoaXMuX3NlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGgodGhpcy5fZGF0ZUFkYXB0ZXIuZGVzZXJpYWxpemUodGhpcy5fc2VsZWN0ZWQpISlcbiAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZFllYXIgPSB0aGlzLl9zZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIodGhpcy5fZGF0ZUFkYXB0ZXIuZGVzZXJpYWxpemUodGhpcy5fc2VsZWN0ZWQpISlcbiAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZDogYm9vbGVhbiA9XG4gICAgICAgICAgICAgICAgICAgICEhdGhpcy5fc2VsZWN0ZWQgJiYgeWVhciA9PT0gc2VsZWN0ZWRZZWFyICYmIG1vbnRoLm1vbnRoVmFsdWUgPT09IHNlbGVjdGVkTW9udGg7XG5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGlzQ3VycmVudE1vbnRoID1cbiAgICAgICAgICAgICAgICAgICAgeWVhciA9PT0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih0aGlzLm5vdykgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGgodGhpcy5ub3cpID09PSBtb250aC5tb250aFZhbHVlO1xuXG4gICAgICAgICAgICAgICAgICByZXR1cm4gaHRtbGAgPHRkXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPSR7Y2xhc3NNYXAoe1xuICAgICAgICAgICAgICAgICAgICAgICdzYmItY2FsZW5kYXJfX3RhYmxlLWRhdGEnOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICdzYmItY2FsZW5kYXJfX3RhYmxlLW1vbnRoJzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ke2NsYXNzTWFwKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICdzYmItY2FsZW5kYXJfX2NlbGwnOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3NiYi1jYWxlbmRhcl9fcGlsbCc6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAnc2JiLWNhbGVuZGFyX19jZWxsLWN1cnJlbnQnOiBpc0N1cnJlbnRNb250aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICdzYmItY2FsZW5kYXJfX2Nyb3NzZWQtb3V0JzogIWlzT3V0T2ZSYW5nZSAmJiBpc0ZpbHRlcmVkT3V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3NiYi1jYWxlbmRhcl9fc2VsZWN0ZWQnOiBzZWxlY3RlZCxcbiAgICAgICAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiB0aGlzLl9vbk1vbnRoU2VsZWN0aW9uKG1vbnRoLm1vbnRoVmFsdWUsIHllYXIsIHNoaWZ0UmlnaHQpfVxuICAgICAgICAgICAgICAgICAgICAgID9kaXNhYmxlZD0ke2lzT3V0T2ZSYW5nZSB8fCBpc0ZpbHRlcmVkT3V0fVxuICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9JHtgJHttb250aC5sb25nVmFsdWV9ICR7dGhpcy5fY2hvc2VuWWVhcn1gfVxuICAgICAgICAgICAgICAgICAgICAgIGFyaWEtcHJlc3NlZD0ke3NlbGVjdGVkfVxuICAgICAgICAgICAgICAgICAgICAgIGFyaWEtZGlzYWJsZWQ9JHtTdHJpbmcoaXNPdXRPZlJhbmdlIHx8IGlzRmlsdGVyZWRPdXQpfVxuICAgICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbW9udGg9JHttb250aC5tb250aFZhbHVlIHx8IG5vdGhpbmd9XG4gICAgICAgICAgICAgICAgICAgICAgQGtleWRvd249JHsoZXZ0OiBLZXlib2FyZEV2ZW50KSA9PiB0aGlzLl9oYW5kbGVLZXlib2FyZEV2ZW50KGV2dCl9XG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAke21vbnRoLnZhbHVlfVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDwvdGQ+YDtcbiAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIGAsXG4gICAgICAgICAgKX1cbiAgICAgICAgPC90Ym9keT5cbiAgICAgIDwvdGFibGU+XG4gICAgYDtcbiAgfVxuXG4gIC8qKiBTZWxlY3QgdGhlIG1vbnRoIGFuZCBjaGFuZ2UgdGhlIHZpZXcgdG8gZGF5IHNlbGVjdGlvbi4gKi9cbiAgcHJpdmF0ZSBfb25Nb250aFNlbGVjdGlvbihtb250aDogbnVtYmVyLCB5ZWFyOiBudW1iZXIsIHNoaWZ0UmlnaHQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl9jaG9zZW5Nb250aCA9IHNoaWZ0UmlnaHQgPyBtb250aCArIDEgOiBtb250aDtcbiAgICB0aGlzLl9uZXh0Q2FsZW5kYXJWaWV3ID0gJ2RheSc7XG4gICAgdGhpcy5faW5pdChcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmNyZWF0ZURhdGUoXG4gICAgICAgIHllYXIsXG4gICAgICAgIHRoaXMuX2Nob3Nlbk1vbnRoLFxuICAgICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXREYXRlKHRoaXMuX2FjdGl2ZURhdGUpLFxuICAgICAgKSxcbiAgICApO1xuICAgIHRoaXMuX3N0YXJ0VGFibGVUcmFuc2l0aW9uKCk7XG4gIH1cblxuICAvKiogUmVuZGVyIHRoZSB2aWV3IGZvciB0aGUgeWVhciBzZWxlY3Rpb24uICovXG4gIHByaXZhdGUgX3JlbmRlclllYXJWaWV3KCk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxkaXYgY2xhc3M9XCJzYmItY2FsZW5kYXJfX2NvbnRyb2xzXCI+XG4gICAgICAgICR7dGhpcy5fZ2V0QXJyb3coXG4gICAgICAgICAgJ2xlZnQnLFxuICAgICAgICAgICgpID0+IHRoaXMuX2dvVG9EaWZmZXJlbnRZZWFyUmFuZ2UoLVlFQVJTX1BFUl9QQUdFKSxcbiAgICAgICAgICBpMThuUHJldmlvdXNZZWFyUmFuZ2UoWUVBUlNfUEVSX1BBR0UpW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdLFxuICAgICAgICAgIHRoaXMuX3ByZXZpb3VzWWVhclJhbmdlRGlzYWJsZWQoKSxcbiAgICAgICAgKX1cbiAgICAgICAgPGRpdiBjbGFzcz1cInNiYi1jYWxlbmRhcl9fY29udHJvbHMtbW9udGhcIj4ke3RoaXMuX2NyZWF0ZUxhYmVsRm9yWWVhclZpZXcoKX08L2Rpdj5cbiAgICAgICAgJHt0aGlzLl9nZXRBcnJvdyhcbiAgICAgICAgICAncmlnaHQnLFxuICAgICAgICAgICgpID0+IHRoaXMuX2dvVG9EaWZmZXJlbnRZZWFyUmFuZ2UoWUVBUlNfUEVSX1BBR0UpLFxuICAgICAgICAgIGkxOG5OZXh0WWVhclJhbmdlKFlFQVJTX1BFUl9QQUdFKVt0aGlzLl9sYW5ndWFnZS5jdXJyZW50XSxcbiAgICAgICAgICB0aGlzLl9uZXh0WWVhclJhbmdlRGlzYWJsZWQoKSxcbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInNiYi1jYWxlbmRhcl9fdGFibGUtY29udGFpbmVyIHNiYi1jYWxlbmRhcl9fdGFibGUteWVhci12aWV3XCI+XG4gICAgICAgICR7dGhpcy5fY3JlYXRlWWVhclRhYmxlKHRoaXMuX3llYXJzKX1cbiAgICAgICAgJHt0aGlzLl93aWRlID8gdGhpcy5fY3JlYXRlWWVhclRhYmxlKHRoaXMuX25leHRNb250aFllYXJzLCB0cnVlKSA6IG5vdGhpbmd9XG4gICAgICA8L2Rpdj5cbiAgICBgO1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgdGhlIGJ1dHRvbiBhcnJvdyBmb3IgYWxsIHRoZSB2aWV3cy4gKi9cbiAgcHJpdmF0ZSBfZ2V0QXJyb3coXG4gICAgZGlyZWN0aW9uOiAnbGVmdCcgfCAncmlnaHQnLFxuICAgIGNsaWNrOiAoKSA9PiB2b2lkLFxuICAgIGFyaWFMYWJlbDogc3RyaW5nLFxuICAgIGRpc2FibGVkOiBib29sZWFuLFxuICApOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIGh0bWxgPHNiYi1zZWNvbmRhcnktYnV0dG9uXG4gICAgICBzaXplPVwibVwiXG4gICAgICBpY29uLW5hbWU9XCJjaGV2cm9uLXNtYWxsLSR7ZGlyZWN0aW9ufS1zbWFsbFwiXG4gICAgICBhcmlhLWxhYmVsPSR7YXJpYUxhYmVsfVxuICAgICAgQGNsaWNrPSR7Y2xpY2t9XG4gICAgICA/ZGlzYWJsZWQ9JHtkaXNhYmxlZH1cbiAgICAgIGlkPVwic2JiLWNhbGVuZGFyX19jb250cm9scy0ke2RpcmVjdGlvbiA9PT0gJ2xlZnQnID8gJ3ByZXZpb3VzJyA6ICduZXh0J31cIlxuICAgID48L3NiYi1zZWNvbmRhcnktYnV0dG9uPmA7XG4gIH1cblxuICAvKiogQ3JlYXRlcyB0aGUgbGFiZWwgd2l0aCB0aGUgeWVhciByYW5nZSBmb3IgdGhlIHllYXJseSB2aWV3LiAqL1xuICBwcml2YXRlIF9jcmVhdGVMYWJlbEZvclllYXJWaWV3KCk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICBjb25zdCBmaXJzdFllYXI6IG51bWJlciA9IHRoaXMuX3llYXJzLmZsYXQoKVswXTtcbiAgICBjb25zdCBsYXN0WWVhckFycmF5OiBudW1iZXJbXSA9IChcbiAgICAgIGlzQnJlYWtwb2ludCgnbWVkaXVtJykgJiYgdGhpcy53aWRlID8gdGhpcy5fbmV4dE1vbnRoWWVhcnMgOiB0aGlzLl95ZWFyc1xuICAgICkuZmxhdCgpO1xuICAgIGNvbnN0IGxhc3RZZWFyOiBudW1iZXIgPSBsYXN0WWVhckFycmF5W2xhc3RZZWFyQXJyYXkubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgeWVhckxhYmVsID0gYCR7Zmlyc3RZZWFyfSAtICR7bGFzdFllYXJ9YDtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGlkPVwic2JiLWNhbGVuZGFyX195ZWFyLXNlbGVjdGlvblwiXG4gICAgICAgIGNsYXNzPVwic2JiLWNhbGVuZGFyX19jb250cm9scy1jaGFuZ2UtZGF0ZVwiXG4gICAgICAgIGFyaWEtbGFiZWw9XCIke2kxOG5DYWxlbmRhckRhdGVTZWxlY3Rpb25bdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF19ICR7eWVhckxhYmVsfVwiXG4gICAgICAgIEBjbGljaz0keygpID0+IHRoaXMuX3Jlc2V0Q2FsZW5kYXJWaWV3KHRydWUpfVxuICAgICAgPlxuICAgICAgICAke3llYXJMYWJlbH1cbiAgICAgICAgPHNiYi1pY29uIG5hbWU9XCJjaGV2cm9uLXNtYWxsLXVwLXNtYWxsXCI+PC9zYmItaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPHNiYi1zY3JlZW4tcmVhZGVyLW9ubHkgcm9sZT1cInN0YXR1c1wiPiAke3llYXJMYWJlbH0gPC9zYmItc2NyZWVuLXJlYWRlci1vbmx5PlxuICAgIGA7XG4gIH1cblxuICAvKiogQ3JlYXRlcyB0aGUgdGFibGUgZm9yIHRoZSB5ZWFyIHNlbGVjdGlvbiB2aWV3LiAqL1xuICBwcml2YXRlIF9jcmVhdGVZZWFyVGFibGUoeWVhcnM6IG51bWJlcltdW10sIHNoaWZ0UmlnaHQgPSBmYWxzZSk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICBjb25zdCBub3cgPSB0aGlzLm5vdztcbiAgICByZXR1cm4gaHRtbGAgPHRhYmxlXG4gICAgICBjbGFzcz1cInNiYi1jYWxlbmRhcl9fdGFibGVcIlxuICAgICAgQGFuaW1hdGlvbmVuZD0keyhlOiBBbmltYXRpb25FdmVudCkgPT4gdGhpcy5fdGFibGVBbmltYXRpb25FbmQoZSl9XG4gICAgPlxuICAgICAgPHRib2R5IGNsYXNzPVwic2JiLWNhbGVuZGFyX190YWJsZS1ib2R5XCI+XG4gICAgICAgICR7eWVhcnMubWFwKFxuICAgICAgICAgIChyb3c6IG51bWJlcltdKSA9PlxuICAgICAgICAgICAgaHRtbGAgPHRyPlxuICAgICAgICAgICAgICAke3Jvdy5tYXAoKHllYXI6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzT3V0T2ZSYW5nZSA9ICF0aGlzLl9pc1llYXJJblJhbmdlKHllYXIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzRmlsdGVyZWRPdXQgPSAhdGhpcy5faXNZZWFyRmlsdGVyZWRPdXQoeWVhcik7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRZZWFyID0gdGhpcy5fc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgID8gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih0aGlzLl9kYXRlQWRhcHRlci5kZXNlcmlhbGl6ZSh0aGlzLl9zZWxlY3RlZCkhKVxuICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWQ6IGJvb2xlYW4gPSAhIXRoaXMuX3NlbGVjdGVkICYmIHllYXIgPT09IHNlbGVjdGVkWWVhcjtcbiAgICAgICAgICAgICAgICBjb25zdCBpc0N1cnJlbnRZZWFyID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcihub3cpID09PSB5ZWFyO1xuICAgICAgICAgICAgICAgIHJldHVybiBodG1sYCA8dGQgY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlLWRhdGEgc2JiLWNhbGVuZGFyX190YWJsZS15ZWFyXCI+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPSR7Y2xhc3NNYXAoe1xuICAgICAgICAgICAgICAgICAgICAgICdzYmItY2FsZW5kYXJfX2NlbGwnOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICdzYmItY2FsZW5kYXJfX3BpbGwnOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICdzYmItY2FsZW5kYXJfX2NlbGwtY3VycmVudCc6IGlzQ3VycmVudFllYXIsXG4gICAgICAgICAgICAgICAgICAgICAgJ3NiYi1jYWxlbmRhcl9fY3Jvc3NlZC1vdXQnOiAhaXNPdXRPZlJhbmdlICYmIGlzRmlsdGVyZWRPdXQsXG4gICAgICAgICAgICAgICAgICAgICAgJ3NiYi1jYWxlbmRhcl9fc2VsZWN0ZWQnOiBzZWxlY3RlZCxcbiAgICAgICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgICAgIEBjbGljaz0keygpID0+IHRoaXMuX29uWWVhclNlbGVjdGlvbih5ZWFyLCBzaGlmdFJpZ2h0KX1cbiAgICAgICAgICAgICAgICAgICAgP2Rpc2FibGVkPSR7aXNPdXRPZlJhbmdlIHx8IGlzRmlsdGVyZWRPdXR9XG4gICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9JHt5ZWFyfVxuICAgICAgICAgICAgICAgICAgICBhcmlhLXByZXNzZWQ9JHtzZWxlY3RlZH1cbiAgICAgICAgICAgICAgICAgICAgYXJpYS1kaXNhYmxlZD0ke1N0cmluZyhpc091dE9mUmFuZ2UgfHwgaXNGaWx0ZXJlZE91dCl9XG4gICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICAgICAgICBkYXRhLXllYXI9JHt5ZWFyIHx8IG5vdGhpbmd9XG4gICAgICAgICAgICAgICAgICAgIEBrZXlkb3duPSR7KGV2dDogS2V5Ym9hcmRFdmVudCkgPT4gdGhpcy5faGFuZGxlS2V5Ym9hcmRFdmVudChldnQpfVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAke3llYXJ9XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L3RkPmA7XG4gICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgPC90cj5gLFxuICAgICAgICApfVxuICAgICAgPC90Ym9keT5cbiAgICA8L3RhYmxlPmA7XG4gIH1cblxuICAvKiogU2VsZWN0IHRoZSB5ZWFyIGFuZCBjaGFuZ2UgdGhlIHZpZXcgdG8gbW9udGggc2VsZWN0aW9uLiAqL1xuICBwcml2YXRlIF9vblllYXJTZWxlY3Rpb24oeWVhcjogbnVtYmVyLCByaWdodFNpZGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl9jaG9zZW5ZZWFyID0gcmlnaHRTaWRlID8geWVhciAtIDEgOiB5ZWFyO1xuICAgIHRoaXMuX25leHRDYWxlbmRhclZpZXcgPSAnbW9udGgnO1xuICAgIHRoaXMuX2Fzc2lnbkFjdGl2ZURhdGUoXG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5jcmVhdGVEYXRlKFxuICAgICAgICB0aGlzLl9jaG9zZW5ZZWFyLFxuICAgICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aCh0aGlzLl9hY3RpdmVEYXRlKSxcbiAgICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0RGF0ZSh0aGlzLl9hY3RpdmVEYXRlKSxcbiAgICAgICksXG4gICAgKTtcbiAgICB0aGlzLl9zdGFydFRhYmxlVHJhbnNpdGlvbigpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0VmlldygpOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgaWYgKGlzU2VydmVyIHx8IHRoaXMuaHlkcmF0aW9uUmVxdWlyZWQpIHtcbiAgICAgIC8vIFRPRE86IFdlIGRpc2FibGUgU1NSIGZvciBjYWxlbmRhciBmb3Igbm93LiBGaWd1cmUgb3VyLCBpZiB0aGVyZSBpcyBhIHdheVxuICAgICAgLy8gdG8gZW5hYmxlIGl0LCB3aGlsZSBjb25zaWRlcmluZyBpMThuIGFuZCBkYXRlIGluZm9ybWF0aW9uLlxuICAgICAgcmV0dXJuIGh0bWxgJHtub3RoaW5nfWA7XG4gICAgfVxuICAgIHN3aXRjaCAodGhpcy5fY2FsZW5kYXJWaWV3KSB7XG4gICAgICBjYXNlICd5ZWFyJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlbmRlclllYXJWaWV3KCk7XG4gICAgICBjYXNlICdtb250aCc6XG4gICAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJNb250aFZpZXcoKTtcbiAgICAgIGNhc2UgJ2RheSc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdGhpcy5fcmVuZGVyRGF5VmlldygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3RhYmxlQW5pbWF0aW9uRW5kKGV2ZW50OiBBbmltYXRpb25FdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRhYmxlID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIGlmIChldmVudC5hbmltYXRpb25OYW1lID09PSAnaGlkZScpIHtcbiAgICAgIHRhYmxlLmNsYXNzTGlzdC5yZW1vdmUoJ3NiYi1jYWxlbmRhcl9fdGFibGUtaGlkZScpO1xuICAgICAgdGhpcy5fcmVzZXRGb2N1cyA9IHRydWU7XG4gICAgICB0aGlzLl9jYWxlbmRhclZpZXcgPSB0aGlzLl9uZXh0Q2FsZW5kYXJWaWV3O1xuICAgIH0gZWxzZSBpZiAoZXZlbnQuYW5pbWF0aW9uTmFtZSA9PT0gJ3Nob3cnKSB7XG4gICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS10cmFuc2l0aW9uJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc3RhcnRUYWJsZVRyYW5zaXRpb24oKTogdm9pZCB7XG4gICAgdGhpcy50b2dnbGVBdHRyaWJ1dGUoJ2RhdGEtdHJhbnNpdGlvbicsIHRydWUpO1xuICAgIHRoaXMuc2hhZG93Um9vdFxuICAgICAgPy5xdWVyeVNlbGVjdG9yQWxsKCd0YWJsZScpXG4gICAgICA/LmZvckVhY2goKGUpID0+IGUuY2xhc3NMaXN0LnRvZ2dsZSgnc2JiLWNhbGVuZGFyX190YWJsZS1oaWRlJykpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHJlbmRlcigpOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIGh0bWxgPGRpdiBjbGFzcz1cInNiYi1jYWxlbmRhcl9fd3JhcHBlclwiPiR7dGhpcy5fZ2V0VmlldygpfTwvZGl2PmA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG4gICAgJ3NiYi1jYWxlbmRhcic6IFNiYkNhbGVuZGFyRWxlbWVudDtcbiAgfVxufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBOEZPLElBQU0scUJBQU4sY0FBMkMsa0JBQWtCLFVBQVUsRUFBRTtBQUFBLEVBeUl2RSxjQUFjOztBQUNiO0FBbklxQixTQUFPLE9BQU87QUFHL0IsU0FBTyxPQUFxQjtBQThCeEMsU0FBUSxPQUFpQjtBQXdCekIsU0FBUSxpQkFBK0IsZ0JBQUEsRUFBYSxhQUFiLG1CQUF1QixnQkFBZTtBQUc3RSxTQUFRLGdCQUFpQyxJQUFJO0FBQUEsTUFDM0M7QUFBQSxNQUNBLG1CQUFtQixPQUFPO0FBQUEsSUFBQTtBQUluQixTQUFR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
|